[Thomson] Extension mémoire 512K pour MO5, MO6, PC128
Modérateurs : Papy.G, fneck, Carl
Re: [Thomson] Extension mémoire 512K pour MO5
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
Re: [Thomson] Extension mémoire 512K pour MO5
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.
Dans l'état l'intérêt est limité, car il faut charger le DOS avec une cassette :
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.
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 :
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.
L'obstacle augmente mon ardeur.
- FabriceFABS
- Messages : 341
- Inscription : 14 sept. 2010 09:21
- Localisation : LA TOUR DU PIN (38)
- Contact :
Re: [Thomson] Extension mémoire 512K pour MO5
Bravo Daniel...
Ça devient un MO8 qui prend sa revanche sur son cousin
Ça devient un MO8 qui prend sa revanche sur son cousin
Et... Qu'est-ce qu'on fait maintenant ?
Re: [Thomson] Extension mémoire 512K pour MO5
Je dirais un MO9++, car il a plus de RAM que le TO9+
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.
-
- Messages : 2366
- Inscription : 06 avr. 2009 12:07
Re: [Thomson] Extension mémoire 512K pour MO5
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 ?
Quelle est la suite d'étapes (config des registres) que tu suis pour utiliser l'extension sur MO6 ?
Re: [Thomson] Extension mémoire 512K pour MO5
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
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
Dernière modification par Daniel le 30 août 2023 20:28, modifié 1 fois.
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.
-
- Messages : 2366
- Inscription : 06 avr. 2009 12:07
Re: [Thomson] Extension mémoire 512K pour MO5
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.
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.
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.On ne trouve aucune information sur internet
Re: [Thomson] Extension mémoire 512K pour MO5
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.FoolDupleX a écrit :sauf à me prouver le contraire, cette dernière fonctionne sur MO6.
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.
L'obstacle augmente mon ardeur.
-
- Messages : 2366
- Inscription : 06 avr. 2009 12:07
Re: [Thomson] Extension mémoire 512K pour MO5
A l'évidence ...Mais si tu l'enlèves, tous ces programmes fonctionnent encore.
Toi, t'as oublié d'activer la cartouche MEMO5.
Re: [Thomson] Extension mémoire 512K pour MO5
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.
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.
L'obstacle augmente mon ardeur.
-
- Messages : 2366
- Inscription : 06 avr. 2009 12:07
Re: [Thomson] Extension mémoire 512K pour MO5
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.
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.
Re: [Thomson] Extension mémoire 512K pour MO5
Code : Tout sélectionner
POKE &HA7E7, PEEK(&H2081) AND &HBF
POKE &HA7DD, &H06
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.
L'obstacle augmente mon ardeur.
-
- Messages : 2366
- Inscription : 06 avr. 2009 12:07
Re: [Thomson] Extension mémoire 512K pour MO5
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 ?
Re: [Thomson] Extension mémoire 512K pour MO5
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...
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.
L'obstacle augmente mon ardeur.
-
- Messages : 2366
- Inscription : 06 avr. 2009 12:07
Re: [Thomson] Extension mémoire 512K pour MO5
Non, c'est sans rapport.Il est possible qu'en l'absence de +5V sur PRCART le bit 6 de $A7DD soit sans effet ?
Tu as essayé avec une MEMO5 standard, genre LOGO ?