[Thomson] Extension mémoire 512K pour MO5, MO6, PC128

Placez ici vos trucs et astuces, étalez sans retenue votre savoir-faire et votre science qui va nous permettre de redonner une apparence neuve et fonctionnelle à nos bouzes.

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [Thomson] Extension mémoire 512K pour MO5

Message par 6502man »

La seule solution que je voie c'est d'utiliser une adresse spécifique pour paginer cette extension de 512Ko sur MO6, mais dans ce cas ca oblige à changer le décodage d''adresse dans l'extension :roll:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Daniel »

Parmi les utilisations possibles de l'extension mémoire 512K pour MO5, il y a le RAMDISK.
Pour une face de disquette 3"1/2 il faut 320K, mais on peut aussi simuler une disquette avec 128 pistes pour remplir toute l'extension.
Je viens de terminer un prototype de contrôleur de disque virtuel qui fonctionne bien. Il est intégré à la version de développement de dcmoto.

Code : Tout sélectionner

 PRAGMA 6809,operandsizewarning
 OPT c
;**************************************************;
;             M O 5 _ R A M D I S K                ; 
;           (c) 2023 - Daniel Coulom               ;  
;           http://dcmoto.free.fr/                 ;
;           http://forum.system-cfg.com/           ;
;--------------------------------------------------;
; Ce code est distribue gratuitement dans l'espoir ;
; qu'il sera utile, mais sans aucune  garantie  et ;
; sans  engager  la  responsabilité  de  l'auteur. ;
; Vous  pouvez  l' utiliser,  le  modifier  et  le ;
; diffuser librement, en conservant cette  licence ;
; et les références de l'auteur dans   toutes  les ;
; copies. L'exploitation commerciale est interdite.;
;**************************************************;

; Ce programme emule une unite de disquette dans
; l'extension memoire 512K du MO5
; Selection de la banque de l'extension memoire
; par le registre $A7CB (en écriture seule)

;**************************************************;
;                Version 2023.07.17                ;
;     (reporter la version en fin de programme)    ;
;**************************************************;
; Historique
; 2023.07.17 Première version operationnelle    
; 2023.07.14 Version originale adaptee de SDDRIVE    

;------------------------------------------------------
; VECTEURS EN RAM
;------------------------------------------------------
STATUS  EQU $2019      ; STATUS (pour masquer le curseur)
DKOPC   EQU $2048      ; code commande controleur disquette
DKDRV   EQU $2049      ; numero du lecteur de disquette
DKTRK   EQU $204a      ; n° piste (2 octets)
DKSEC   EQU $204c      ; n° secteur
DKNUM   EQU $204d      ; entrelacement
DKSTA   EQU $204e      ; etat courant controleur disquette
DKBUF   EQU $204f      ; adresse buffer secteur  (2 octets)
DKDEN   EQU $2058      ; densite (0=double, autre=simple)
DKFLG   EQU $2080      ; indicateur presence controleur disque

; Zones de travail du controleur de disquette
DK_ERR  EQU $20e5      ; code erreur
DK_NAM  EQU $20e7      ; pointeur sur nom de fichier
DK_CAT  EQU $20e9      ; pointeur sur buffer
DK_TYP  EQU $20eb      ; type de fichier
DK_FLG  EQU $20ec      ; flag de fichier 
DK_FAT  EQU $20ed      ; adresse de la FAT
DK_MOD  EQU $20f0      ; code operation logique
DK_FIN  EQU $20f3      ; dernier bloc
DK_SCT  EQU $20f5      ; numero de secteur
DK_BLK  EQU $20f6      ; numero de bloc  
DK_TDS  EQU $20f7      ; nbre d'octets du dernier secteur du fichier
DK_IFA  EQU $20f9      ; numero de bloc alloue
DK_PSB  EQU $20fa      ; numero du premier secteur du bloc
DK_PBC  EQU $20fb      ; numero de piste du bloc courant
DK_BFR  EQU $2200      ; buffer de lecture/ecriture secteur

;------------------------------------------------------
; ROM DU CONTROLEUR
;------------------------------------------------------
  ORG $A000
  FCB $52              ; R controleur RAMDISK     
  FCB $54              ; T fat de 160 octets     
  FCB $44              ; D double densite    
  FCB $3F              ; @ checksum $52+$54+$44+$55=$13F

OPTABL
  LBRA  DKCONT         ; $A004 fonctions standard      
  LBRA  DKBOOT         ; $A007 lancement du boot       
  LBRA  DKFMT          ; $A00A formatage               
  LBRA  LECFA          ; $A00D chargement de la fat    
  LBRA  RECFI          ; $A010 ouverture d'un fichier  
  LBRA  RECUP          ; $A013 effacement d'un fichier 
  LBRA  ECRSE          ; $A016 ecriture d'un secteur   
  LBRA  ALLOD          ; $A019 creation d'un fichier   
  LBRA  ALLOB          ; $A01C allocation d'un bloc    
  LBRA  MAJCL          ; $A01F mise a jour cluster     
  LBRA  FINTR          ; $A022 cloture d'ecriture      

;------------------------------------------------------
; INITIALISATION DU CONTROLEUR
;------------------------------------------------------
DKINI
  CLR   <DKDEN         ; initialise la double densite
  LDA   #$44           ; code densite
  STA   <DKSTA         ; retour code densite dans DKSTA
  RTS                  ; Retour       

;------------------------------------------------------
; INITIALISATION DP
;------------------------------------------------------
DPINIT 
  LDA   #$20           ; toujours $20 pour MO5            
  TFR   A,DP           ; DP = $20
  RTS                  ; retour

;------------------------------------------------------
; DKCONT = Fonctions standard
; Le code erreur en <$4E est initialise a zero
; Il doit être obligatoirement different de zero quand 
; le bit carry est positionne au retour de la fonction
; Notez la methode astucieuse pour garder le contenu
; du registre CC en remplacant l'ancien bit carry par
; le carry de retour de la fonction executee.
;------------------------------------------------------
DKCONT
  PSHS  U,Y,X,DP,B,A,CC ; empilage des registres                  
  BSR   DPINIT         ; initialisation DP $20 ou $60
  CLR   <DKSTA         ; raz du code erreur
  BSR   STDOP          ; execution de l'operation
  PULS  A              ; depile ancien CC dans A 
  EXG   A,CC           ; restaure le CC empile 
  LSRA                 ; remplace le bit carry de CC
  PULS  A,B,DP,X,Y,U,PC ; retour

;------------------------------------------------------
; Execution fonction standard
;------------------------------------------------------
STDOP
  LDA   <DKOPC         ; Code operation  
  LDY   #DKINI         ; Reset controleur
  BITA  #$01           ; Bit reset
  BNE   STDOP2         ; Execute reset controleur          
  LDY   #RSECT         ; Lecture secteur logique
  BITA  #$02           ; Bit lecture secteur
  BNE   STDOP2         ; Execute lecture secteur   
  LDY   #WSECT         ; Ecriture secteur logique
  BITA  #$08           ; Bit ecriture secteur
  BNE   STDOP2         ; Execute ecriture secteur 
  BITA  #$20           ; Bit recherche piste 0
  BNE   STDOP9         ; Ne rien faire
  BITA  #$40           ; Bit recherche piste x
  BNE   STDOP9         ; Ne rien faire
  BITA  #$04           ; Bit passage simple densite
  BNE   STDOP9         ; Ne rien faire
  BITA  #$10           ; Bit passage double densite
  BNE   STDOP9         ; Ne rien faire           
  LBRA  ERR10          ; Fonction inconnue 
STDOP2
  JMP   ,Y             ; Execution de la fonction
STDOP9
  CLRA                 ; Clear carry
  RTS                  ; Retour       
  
;------------------------------------------------------
; DKBOOT = Lancement du boot
; - Initialisation de la carte pour verifier qu'elle
;   est presente (ajoute le 03/02/2019).
; - Lecture du secteur de boot, avec au prealable la
;   selection du fichier .sd s'il n'est pas defini. 
; - Decryptage du secteur de boot et controle de la
;    checksum des 128 premiers octets.  
; - Si le secteur de boot est valide, lancement du 
;   boot, sinon reinitialisation du Basic. 
;------------------------------------------------------
DKBOOT
  BSR   DPINIT         ; initialisation DP ($20 ou $60)
;  TFR   DP,A           ; A=valeur de DP
;  LDB   #$CC           ; D=adresse haute pile systeme
;  TFR   D,S            ; initialisation registre S
  LDA   <STATUS        ; status
  ANDA  #$FB           ; raz bit 2
  STA   <STATUS        ; curseur invisible       
; lecture secteur de boot
  LDA   #$02           ; code lecture secteur
  STA   <DKOPC         ; stockage code operation 
  CLR   <DKDRV         ; 0 dans le numero de lecteur
  CLR   <DKTRK         ; toujours zero
  CLR   <DKTRK+1       ; selection piste 0
  LDA   #$01           ; valeur pour secteur 1
  STA   <DKSEC         ; selection secteur 1
  LDU   #DK_BFR        ; adresse du buffer secteur
  STU   <DKBUF         ; stockage adresse buffer
  BSR   DKCONT         ; appel fonction standard
  BCS   DKB9           ; erreur de lecture
; decryptage 128 octets et controle checksum
  LDU   #DK_BFR        ; adresse debut de buffer      
  LEAY  $7F,U          ; adresse de fin des 128 octets
  PSHS  Y              ; empilage adresse de fin
  LDA   #$55           ; pour calcul checksum de boot
DKB4
  DEC   ,U             ; octet - 1
  COM   ,U             ; complement
  ADDA  ,U+            ; ajout checksum
  CMPU  ,S             ; test fin de buffer
  BNE   DKB4           ; octet suivant
  PULS  Y              ; pour retablir le pointeur de pile
  CMPA  ,U             ; test checksum boot
  BNE   DKB9           ; checksum fausse
; execution du boot
  JMP   DK_BFR         ; execute le boot
; sortie en erreur
DKB9
  CLR   <DKFLG         ; indicateur de presence controleur
  JMP   [$EFFE]        ; lancement application a froid

;------------------------------------------------------
; Initialisation $A7CB et adresse U en ram
; $A7CB est en ecriture seule et ne peut pas être lu
; banque = piste / 4
; adresse = $B000 + $1000 * (piste & 3)
;           + $100 * (secteur - 1)
;------------------------------------------------------
SETA7CB
  LDA   <DKTRK+1       ; numero de piste   
  TFR   A,B            ; copier dans B 
  ANDB  #$70           ; 3 bits de poids fort
  PSHS  B              ; sauvegarder l'octet dans la pile
  PULS  B              ; retablir le pointeur de pile
  LSRA                 ; Division par 2
  LSRA                 ; Division par 2
  ANDA  #$03           ; 2 bits de poids faible
  ORA   #$0C           ; selection cartouche en ecriture
  ORA   -1,S           ; ajout 3 bits de poids fort
  STA   $A7CB          ; initialiser $A7CB
  LDA   <DKTRK+1       ; Numero de piste
  ANDA  #$03           ; 2 bits de poids faible
  LSLA                 ; multiplier par 2
  LSLA                 ; multiplier par 2
  LSLA                 ; multiplier par 2
  LSLA                 ; multiplier par 2
  DECA                 ; retrancher 1
  ADDA  <DKSEC         ; ajout numero de secteur 
  ADDA  #$B0           ; ajout de $B0
  CLRB                 ; 4 bits de poids faible a 0
  TFR   D,U            ; initialisation adresse U
  RTS

;------------------------------------------------------
; Lecture d'un secteur disquette dans buffer 256 octets 
; Adresse du buffer dans DKBUF
;------------------------------------------------------
RSECT
  BSR   SETA7CB        ; initialisation $A7CB et U 
  LDY   <DKBUF         ; adresse du buffer
  LDX   #$0080         ; compteur pour 128 boucles
RSECT1
  LDD   ,U++           ; lecture 2 octets en ram  
  STD   ,Y++           ; ecriture dans le buffer
  LEAX  -1,X           ; decrementation compteur
  BNE   RSECT1         ; nouvelle lecture
  CLR   $A7CB          ; deselectionne la cartouche
  RTS                  ; retour

;------------------------------------------------------
; Ecriture d'un secteur disquette
; Adresse du buffer dans DKBUF
;------------------------------------------------------
WSECT
  BSR   SETA7CB        ; initialisation $A7CB et U 
  LDY   <DKBUF         ; adresse du buffer
  LDX   #$0080         ; compteur pour 128 boucles
WSECT1
  LDD   ,Y++           ; lecture 2 octets du buffer
  STD   ,U++           ; ecriture en ram
  LEAX  -1,X           ; decrementation compteur
  BNE   WSECT1         ; nouvelle ecriture
  CLR   $A7CB          ; deselectionne la cartouche
  RTS

;------------------------------------------------------
; Erreur unite ou lecteur non pret
;------------------------------------------------------
ERR10
  LDA   #$10           ; code erreur unite

;------------------------------------------------------
; Retour d'un code erreur transmis par le registre A
; $00 = pas d'erreur
; $01 = disquette protegee
; $02 = erreur de piste
; $04 = Erreur de secteur
; $08 = Erreur de donnees
; $10 = Erreur unite ou lecteur non pret
; $20 = Erreur de verification
;------------------------------------------------------
ERRSET
  STA   <DKSTA         ; stocke le code erreur
  BEQ   ERREND         ; pas d'erreur
  COMA                 ; set carry
ERREND  
  RTS                  ; retour

;------------------------------------------------------
; Initialisation piste A avec la valeur B
;------------------------------------------------------
TRKINI
  STA   <DKTRK+1       ; numero de piste
  CLR   <DKSEC         ; numero de secteur
  BSR   SETA7CB        ; initialisation $A7CB et U 
  LDA   #$10           ; A=16
  PSHS  A              ; compteur pour 16 secteurs
  PULS  A              ; retablissement pointeur pile      
  CLRA                 ; compteur pour 256 boucles
TRKIN1  
  STB   ,U+            ; ecriture de la valeur B
  DECA                 ; decrementation compteur d'octets
  BNE   TRKIN1         ; octet suivant 
  DEC   -1,S           ; decrementation compteur de secteurs
  BNE   TRKIN1         ; secteur suivant
  CLR   $A7CB          ; deselectionne la cartouche
  RTS

;------------------------------------------------------
; DKFMT = formatage de la disquette
;------------------------------------------------------
DKFMT
  PSHS  U,Y,X,DP,B,A,CC ; empilage des registres  
  ORCC  #$50           ; desactive les interruptions 
  LBSR  DPINIT         ; initialisation DP $20
; Initialisation des pistes 0 et 20
  CLR   <DKTRK         ; 0 dans piste poids fort
  LDD   #$00E5         ; piste 0 valeur $E5   
  BSR   TRKINI         ; initialisation de la piste    
  LDD   #$14FF         ; piste 20 valeur $FF   
  BSR   TRKINI         ; initialisation de la piste    
; Initialisation de la FAT (secteur 2)
  LDX   <DKBUF         ; adresse du buffer
  CLR   ,X             ; premier octet FAT = 0
  LDD   #$FEFE         ; blocs reserves
  STD   $29,X          ; pour piste 20
  LDA   #$02           ; secteur 2
  STA   <DKSEC         ; numero de secteur
  BSR   WSECT          ; ecriture d'un secteur
DKFMT9
  PULS  CC,A,B,DP,X,Y,U,PC ; retour

;------------------------------------------------------
; SCRATCH DOS
;------------------------------------------------------
SCRDOS
  FCC   "SCRATCH "
  FCC   "DOS"

;------------------------------------------------------
; FINTR = cloture d'ecriture
;------------------------------------------------------
FINTR
  LDB   <DK_MOD        ; code operation logique   
  CMPB  #$02
  BEQ   ECRFA          ; ecriture de la FAT
  DEC   <DK_MOD        ; code operation logique
  LBSR  RECFI          ; ouverture fichier
  BCS   ECRFA9         ; erreur d'ouverture
  TSTB  
  BEQ   FINTR1
  LBSR  RECUP          ; effacement d'un fichier
  BCS   ECRFA9         ; erreur d'effacement
FINTR1
  INC   <DK_MOD        ; code operation logique
  LBSR  RECFI          ; ouverture d'un fichier
  BCS   ECRFA9         ; erreur d'ouverture
  LDB   #$0A           ; boucle pour 11 octets
  LDX   <DK_NAM        ; pointeur sur nom+ext fichier
FINTR2
  LDA   B,X            ; octet du nom+extension 
  STA   B,Y            ; copie dans le repertoire
  DECB                 ; decremente indice
  BGE   FINTR2         ; octet suivant
  BSR   ECRSE          ; ecriture secteur
  BCS   ECRFA9         ; erreur d'ecriture

;------------------------------------------------------
; Ecriture de la FAT
;------------------------------------------------------
ECRFA
  LDX   <DK_FAT        ; adresse de la FAT
  BSR   INVFA          ; inversion de la FAT
  LDA   #$02           ; n° secteur de la FAT (sect 2)
  STA   <DKSEC         ; stocke le numero de secteur
  LDB   #$14           ; piste de la FAT (piste 20)
  CLRA                 ; poids fort du numero de piste 
  STD   <DKTRK         ; stocke le numero de piste
  STX   <DKBUF         ; adresse du buffer secteur
  BSR   ECRSE          ; ecriture secteur
  BCS   ECRFA9         ; erreur ecriture
  CLR   <DK_MOD        ; indicateur cloture fichier
ECRFA9
  RTS   

;------------------------------------------------------
; LECFA = Chargement de la FAT
;------------------------------------------------------
LECFA
  LDU   #$2055         ; adresse pointeur FAT (MO)
  TFR   DP,A           ; DP dans A
  CMPA  #$20           ; test MO/TO
  BEQ   LECFA0         ; si MO continuer
  LDU   #$6025         ; adresse pointeur FAT (TO)
LECFA0
  LDD   <DK_FAT        ; adresse actuelle de la FAT
  SUBD  ,U             ; adresse sauvegardee de la FAT
  CMPB  #$80           ; test de la difference 
  BEQ   LECFA1         ; $80 ==> adresse déjà sauvegardee 
  LDX   <DK_FAT        ; sinon lire l'adresse        
  STX   ,U             ; et la sauvegarder
LECFA1
  LDX   ,U             ; lire l'adresse sauvegardee  
  STX   <DKBUF         ; adresse du buffer secteur
  LDA   #$02           ; numero secteur a lire
  BSR   LSEC20         ; lecture secteur piste 20
  LEAX  128,X          ; ajout de $80
  STX   <DK_FAT        ; stocker le nouveau pointeur

;------------------------------------------------------
; INVFA = Inversion des deux moities de la FAT
; En entree X pointe au milieu du buffer de la FAT
; En sortie X pointe sur le buffer de la FAT 
;------------------------------------------------------
INVFA
  LDY   #$80           ; nombre de boucles
INVFA1    
  LDA   -128,X         ; octet premiere moitie 
  LDB   ,X             ; octet deuxieme moitie
  STB   -128,X         ; 2ere moitie dans 1ere
  STA   ,X+            ; 1ere moitie dans 2eme
  LEAY  -1,Y           ; decrementation compteur 
  BNE   INVFA1         ; nouvelle boucle
  LEAX  -$0100,X       ; X pointe sur le buffer de la FAT
  RTS                  ; retour

;------------------------------------------------------
; Sortie en erreur
;------------------------------------------------------
RETERR
  STA   <DK_ERR        ; code erreur
  COMA                 ; set carry
  COMA                 ; restaure valeur de A
  RTS   

;------------------------------------------------------
; Chargement 1er secteur catalogue
;------------------------------------------------------
LDIR0
  LDA   #$03           ; numero de secteur catalogue
  LDX   <DK_CAT        ; pointeur sur buffer
  STX   <DKBUF         ; adresse buffer

;------------------------------------------------------
; Chargement secteur piste 20
;------------------------------------------------------
LSEC20
  STA   <DKSEC         ; numero de secteur
  LDB   #$14           ; piste 20
  CLRA                 ; zero dans poids fort
  STD   <DKTRK         ; numero de piste
  LDA   #$02           ; code operation lecture secteur
  BRA   SECTIO         ; operation sur secteur

;------------------------------------------------------
; ECRSE = Ecriture d'un secteur
;------------------------------------------------------
ECRSE
  LDA   #$08           ; code operation ecriture secteur

;------------------------------------------------------
; Operation sur secteur (code operation dans A)
;------------------------------------------------------
SECTIO
  STA   <DKOPC         ; code operation
  LDY   <DK_CAT        ; pointeur sur buffer
  LBSR  OPTABL         ; execution fonction standard
  LDA   #$03           ; A=$03
  RTS   

;------------------------------------------------------
; RECFI = Ouverture d'un fichier
;------------------------------------------------------
RECFI
  BSR   LDIR0          ; charge 1er secteur catalogue 
RECFI1
  BCS   RETERR         ; sort si erreur
  LDX   #$0008         ; compteur de noms dans X
  LDY   <DK_CAT        ; pointeur sur buffer
RECFI2
  LDU   <DK_NAM        ; pointeur sur nom de fichier
  LDB   <DK_MOD        ; code operation logique
  CMPB  #$03
  BNE   RECFI3
  LEAU  SCRDOS,PCR     ; adresse du nom de fichier
RECFI3
  CLRB  
RECFI4
  CMPB  #$0B
  BCC   RECFI8
  LDA   B,Y            ; octet de la FAT
  CMPA  #$FF          
  BEQ   RECFI7
  INCB  
  CMPA  ,U+
  BEQ   RECFI4
  LEAY  $20,Y          ; adresse fichier suivant
  LEAX  -$01,X         ; decrementation indice 
  BNE   RECFI2         ; lecture entree suivante 
  INC   <DKSEC         ; secteur suivant
  LDA   <DKSEC         ; A = n° secteur
  CMPA  #$10           ; comparaison a 16
  BHI   RECFI7         ; superieur a 16
  LBSR  OPTABL         ; lecture secteur
  LDA   #$03           ; erreur I/O
  BRA   RECFI1         ; secteur suivant
RECFI7
  CLRB                 ; raz n° secteur
  BRA   RECFI9         ; sortie
RECFI8
  LDB   $0B,Y          ; type de fichier (catalogue)
  CMPB  <DK_TYP        ; type de fichier
  BNE   RECFI7
  LDB   $0C,Y          ; flag de fichier (catalogue)
  CMPB  <DK_FLG        ; flag de fichier
  BNE   RECFI7
  LDB   <DKSEC         ; numero de secteur
  LDA   $0D,Y          ; numero de bloc (catalogue)
  STA   <DK_BLK        ; numero de bloc
  CLR   <DK_SCT        ; numero de secteur
  LDX   $0E,Y          ; taille dernier secteur (catalogue)
  STX   <DK_TDS        ; nbre d'octets du dernier secteur du fichier
  STY   <DK_PSB        ; numero du premier secteur du bloc
RECFI9
  STB   <DK_IFA        ; numero de bloc alloue
  CLRA                 ; clear carry
  RTS

;------------------------------------------------------
; ALLOD = allocation d'un fichier
;------------------------------------------------------
ALLOD
  LDY   <DK_FAT        ; adresse de la FAT
; BSR   ALLOB4         ; test place libre version CD90-640
  BSR   ALLOB          ; test place libre version carte SD
ALLOD1
  BCS   RECFI1         ; erreur plus de place
  STB   <DK_BLK        ; numero de bloc
  LBSR  LDIR0          ; charge debut directory
ALLOD2  
  BCS   ALLOD1         ; sortie en erreur
  LDY   <DK_CAT        ; pointeur sur buffer
  LDX   #$0008         ; compteur de noms dans X
ALLOD3
  LDB   ,Y             ; premier octet du nom 
  BEQ   ALLOD6         ; $00=fichier efface --> OK
  LDA   #$05
  CMPB  #$FF           ; test fin de repertoire
  BEQ   ALLOD6         ; $FF=fin de repertoire --> OK
  LEAY  $20,Y          ; entree suivante dans le repertoire 
  LEAX  -$01,X         ; decrementation compteur
  BNE   ALLOD3         ; traitement entree suivante
  INC   <DKSEC         ; secteur suivant du repertoire
  LDA   <DKSEC         ; A=numero de secteur
  CMPA  #$10           ; test 16
  BHI   ALLOD4         ; plus de place dans le repertoire
  LBSR  OPTABL         ; charge le secteur suivant 
  LDA   #$03           ; code erreur 3
  BRA   ALLOD2         ; sortie en erreur
ALLOD4
  LDA   #$05           ; code "disque plein"
ALLOD5
  BRA   ALLOD1         ; sort avec erreur
ALLOD6
  LDX   <DK_NAM        ; pointeur sur nom de fichier
  LDB   <DK_MOD        ; code operation logique
  CMPB  #$03
  BNE   ALLOD7
  LEAX  SCRDOS,PCR     ; adresse nom de fichier
ALLOD7
  LDB   #$0A           ; pour 11 octets (nom+extension)
ALLOD8
  LDA   B,X            ; recopie le nom et l'extension
  STA   B,Y            ; dans le catalogue
  DECB                 ; decrementation compteur
  BGE   ALLOD8         ; caractere suivant
  LDA   <DK_TYP        ; type de fichier 
  STA   $0B,Y          ; stocke en 12e position
  LDA   <DK_FLG        ; flag de fichier
  LDB   <DK_BLK        ; numero de bloc
  STD   $0C,Y          ; stocke en 13e position
  LBRA  ECRSE          ; ecriture du repertoire

;------------------------------------------------------
; ALLOB = allocation d'un bloc (version carte SD)
; Remarque : la FAT commence par un octet $00
; Il y a un décalage de 1 entre le numero de bloc
; et son indice dans la FAT (bloc 0 = indice 1)  
;------------------------------------------------------
ALLOB
  LDD   #$FF00          ; A=255 B=0
ALLOB1
  INCB                  ; bloc suivant
  CMPA  B,Y             ; bloc B libre ?
  BEQ   ALLOB2          ; oui ==> trouvé
  CMPB  #$A0            ; test dernier bloc  
  BNE   ALLOB1          ; bloc suivant 
  LDA   #$05            ; erreur pas de d'entrée trouvées
  LBRA  RETERR          ; sortie en erreur
ALLOB2
  CLR   B,Y             ; on marque le bloc comme occupé
  DECB                  ; mise a jour du
  STB   <DK_IFA         ; numero de bloc alloue
ALLOB9
  CLRA                  ; clear carry
  RTS

;------------------------------------------------------
; RECUP = effacement d'un fichier
;------------------------------------------------------
RECUP
  LDA   $0D,Y          ; numero du 1er bloc a liberer
  STA   <DK_BLK        ; numero de bloc
  CLR   ,Y             ; raz 1er caractere du nom de fichier
  LBSR  ECRSE          ; ecriture du repertoire 
  BCS   ALLOD5         ; erreur d'ecriture
  LDY   <DK_FAT        ; adresse de la FAT
  LDB   <DK_BLK        ; numero de bloc
RECUP1
  INCB                 ; bloc+1
  LDA   B,Y            ; A = octet de la FAT
  CLR   B,Y            ; octet FAT = $00
  DEC   B,Y            ; octet FAT = $FF (bloc libre)
  TFR   A,B            ; B = ancien octet de la FAT
  CMPA  #$C0           ; bloc de fin du fichier ?
  BCS   RECUP1         ; sinon bloc suivant
  BRA   ALLOB9         ; retour

;------------------------------------------------------
; MAJCL = Mise a jour cluster
;------------------------------------------------------
MAJCL
  LDB   <DK_BLK          ; numero du bloc                              
  CLRA                   ; A=0 
  LSRB                   ; divise par 2 (carry = b0) 
  STD   <DK_PBC          ; numero piste (carry inchange)
  INCA                   ; A=1          (carry inchange)
  STA   <DK_SCT          ; secteur=1    (carry inchange) 
  BCC   MAJCL9           ; branchement si n° de bloc pair
  LDA   #$09             ; secteur=9 pour les blocs impairs
MAJCL9
  STA   <DK_PSB          ; numero du premier secteur du bloc
  RTS   

;------------------------------------------------------
; Signature DC
;------------------------------------------------------
; ORG   $A6FF
  ZMB   $A6FF-*
  FCB   $DC              ; signature DC  
 
;------------------------------------------------------
; Commentaires
;------------------------------------------------------
  FCC   'RAMDISK 20230717'
  FCC   'Controleur de   '
  FCC   'RAMDISK pour MO5'
  FCC   'Unite 4:        '
  FCC   '80 pistes de    '
  FCC   '16 secteurs de  '
  FCC   '256 octets      '
  FCC   '                '
  FCC   '                '
  FCC   '                '
  FCC   '                '
  FCC   '                '
  FCC   '================'
  FCC   'Daniel Coulom   '
  FCC   'dcmoto.free.fr  '
  FCC   'Vers. 2023.07.17'
 
  END

Dans l'état l'intérêt est limité, car il faut charger le DOS avec une cassette :
cassette_dos_20230717.zip
(16.1 Kio) Téléchargé 18 fois

Par contre il serait intéressant d'ajouter la fonction de disque virtuel MO5 au contrôleur SDDRIVE. On aurait accès au RAMDISK avec l'unité 4: tout en conservant les unités 0: 1: 2: 3: pour les images de disquettes sur carte SD.

En copiant le contenu d'une disquette dans le RAMDISK l'accès est beaucoup plus rapide. Je n'ai pas fait de mesure précise, mais puisqu'on lit des octets au lieu de lire des bits on peut aller (en théorie) huit fois plus vite que SDDRIVE. C'est aussi vite que SDSTREAM, mais au lieu d'être en accès séquentiel c'est de l'accès direct, pas trop utile pour du streaming mais bien adapté à la réalisation de jeux rapides.
Dernière modification par Daniel le 17 juil. 2023 21:08, modifié 1 fois.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
FabriceFABS
Messages : 341
Inscription : 14 sept. 2010 09:21
Localisation : LA TOUR DU PIN (38)
Contact :

Re: [Thomson] Extension mémoire 512K pour MO5

Message par FabriceFABS »

Bravo Daniel... :)
Ça devient un MO8 qui prend sa revanche sur son cousin 8)
Et... Qu'est-ce qu'on fait maintenant ?
Image
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Daniel »

Je dirais un MO9++, car il a plus de RAM que le TO9+ :wink:
Daniel
L'obstacle augmente mon ardeur.
Fool-DupleX
Messages : 2284
Inscription : 06 avr. 2009 12:07

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Fool-DupleX »

Je ne comprends pas très bien ce que tu dis Daniel concernant le MO6/MO5NR. Nous avons Jacques et moi porté OS-9 dessus et pour autant que je m'en souvienne, le ROMDisk fonctionne. Jacques a même découvert lors des tests initiaux qu'il avait un défaut sur le connecteur MEMO5. Je m'en souviens parce qu'on croyait aussi que tout était perdu et on ne comprenait pas pourquoi.

Quelle est la suite d'étapes (config des registres) que tu suis pour utiliser l'extension sur MO6 ?
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Daniel »

Je ne parle pas de l'extension mémoire que vous avez développée avec Jacques. On ne trouve aucune information sur internet. Pour les membres du forum c'est comme si elle n'existait pas : ils ne l'ont jamais vue (même en photo), il n'y a pas de documentation.

Ce sujet est consacré à l'extension mémoire 512K développée par 6502addict en janvier 2021. J'ai publié un nouveau circuit imprimé en mai 2023 pour remplacer les CMS par des composants traversants. Pour que cette extension mémoire soit utile il faut lui trouver des applications, c'est ce que je cherche à faire. Pour commencer j'ai écrit un contrôleur de disque virtuel permettant de l'utiliser comme RAMDISK. Pour faciliter d'éventuels développements de jeux (ou d'autres applications) l'émulation de l'extension mémoire et du contrôleur de disque virtuel a été ajoutée à la dernière version en cours de développement de dcmoto.

Cette extension ne fonctionne pas sur MO6 et MO5NR, car le vecteur $A7CB est utilisé par le moniteur pour commuter des banques de mémoire de la RAM paginée. Je n'ai pas trouvé de moyen d'accéder à la RAM du port cartouche sans changer la ROM de l'ordinateur.

[EDIT] Cette extension fonctionne aussi sur MO5NR, MO6 et PC128. Voir plus loin les essais, ils ont été laborieux mais se sont bien terminés.

Rappel de la description : http://dcmoto.free.fr/bricolage/extensi ... index.html

ext512k_01.jpg
ext512k_01.jpg (61.55 Kio) Consulté 933 fois
Dernière modification par Daniel le 30 août 2023 20:28, modifié 1 fois.
Daniel
L'obstacle augmente mon ardeur.
Fool-DupleX
Messages : 2284
Inscription : 06 avr. 2009 12:07

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Fool-DupleX »

J'avais bien compris, Daniel, que tu ne parlais pas du ROMDisk NG. Sauf qu'il fonctionne exactement sur le même principe et qu'il est depuis toujours 100% rétro-compatible extension 64 K NR. Et que sauf à me prouver le contraire, cette dernière fonctionne sur MO6.

Et je ne vois pas bien ce que la ROM vient faire la-dedans, à moins de vouloir une hypothétique compatibilité avec le moniteur, ce qui n'a aucun sens.
On ne trouve aucune information sur internet
Pas de mauvaise foi. Quand je t'ai demandé de l'implémenter à l'époque dans dcmoto pour os-9, tu m'as envoyé sur les roses. Il y a une doc technique détaillée sur demande, comme pour la Mégarom T.2. Les gens savent où me trouver.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Daniel »

FoolDupleX a écrit :sauf à me prouver le contraire, cette dernière fonctionne sur MO6.
Eh bien non, elle ne fonctionne pas, c'est ce que j'explique un peu plus haut. Je croyais comme toi qu'elle fonctionnait, mais j'ai prouvé que non.

Si tu mets l'extension mémoire 64K sur un MO6, tu crois qu'elle fonctionne car tous les programmes qui l'utilisent fonctionnent, y compris le nanoréseau. Mais si tu l'enlèves, tous ces programmes fonctionnent encore.

Pourquoi ? Parce que l'écriture en $A7CB est interceptée par le MO6, qui détourne alors les accès en $B000-$EFFF vers la RAM commutée du MO6.
Daniel
L'obstacle augmente mon ardeur.
Fool-DupleX
Messages : 2284
Inscription : 06 avr. 2009 12:07

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Fool-DupleX »

Mais si tu l'enlèves, tous ces programmes fonctionnent encore.
A l'évidence ... :roll:

Toi, t'as oublié d'activer la cartouche MEMO5.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Daniel »

Tu veux dire modifier l'extension mémoire 64K pour mettre au +5V le signal PRCART ?
Non, je ne l'ai pas fait, car dans ce cas elle empêche le MO5 de démarrer.
Pour vérifier, je vais essayer de faire une modification provisoire. Je donnerai le résultat ici.
Daniel
L'obstacle augmente mon ardeur.
Fool-DupleX
Messages : 2284
Inscription : 06 avr. 2009 12:07

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Fool-DupleX »

Non, je veux dire, configurer la MEMO5 externe sur le gate-array du MO6. Sinon elle reste invisible et c'est la map interne qui est décodée. Bit 5 de $A7DD si je ne m'abuse. De mémoire, si tu fais :

1. Désactiver l'émulation $A7CB (bit 6 de $A7E7)
2. Activer la cartouche MEMO5 (bit 5 de $A7DD)

Ca fonctionne très bien. Le registre $A7CB de la cartouche prend le relais et tout bon.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Daniel »

Code : Tout sélectionner

POKE &HA7E7, PEEK(&H2081) AND &HBF
POKE &HA7DD, &H06
J'ai essayé, sans succès.
J'ai aussi essayé toutes les combinaisons des deux bits indiqués (0-0, 0-1, 1-0 et 1-1), sans succès.
Daniel
L'obstacle augmente mon ardeur.
Fool-DupleX
Messages : 2284
Inscription : 06 avr. 2009 12:07

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Fool-DupleX »

Lorsque tu fais ton POKE &HA7DD, le BASIC va planter, puisqu'il est remplacé par la MEMO5, donc comment tu as pu tester sous BASIC ?
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Daniel »

Ah oui, c'est bête de l'avoir fait en BASIC. Toutefois il n'y a pas eu de plantage, et le LOADM"xxxx",,R du programme de test de l'extension 512K a fonctionné. C'est incroyable mais vrai.

J'ai vérifié sans l'extension mémoire, en lançant le BASIC 1.0 et en tapant POKE&HA7DD,&H06 le MO6 ne plante pas, on a le message OK et le curseur clignotant. De même, en BASIC 128, POKE&HA7DD,&H16 ne plante pas.

J'ai essayé aussi de mettre à 1 le bit 6 : POKE&HA7DD,&H26 en BASIC 1.0 et POKE&HA7DD,&H36 en BASIC 128 --> pas de plantage.

Il est possible qu'en l'absence de +5V sur PRCART le bit 6 de $A7DD soit sans effet ? Dans ce cas il faudrait mettre à 1 le bit 2 de $A7CB avant de modifier $A7DD. Je vais essayer.

C'est très mystérieux mais je n'abandonne pas, je vais le refaire en langage machine...
Daniel
L'obstacle augmente mon ardeur.
Fool-DupleX
Messages : 2284
Inscription : 06 avr. 2009 12:07

Re: [Thomson] Extension mémoire 512K pour MO5

Message par Fool-DupleX »

Il est possible qu'en l'absence de +5V sur PRCART le bit 6 de $A7DD soit sans effet ?
Non, c'est sans rapport.

Tu as essayé avec une MEMO5 standard, genre LOGO ?
Répondre