/**************************************************\ * C S 9 1 2 8 0 * * (c) 2013 - 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 un controleur de disquette * Thomson accedant a une image au format .sd par * l'intermediaire des interfaces SDMOTO ou SDMO * Il est destine a etre charge dans l'eprom du * controleur nanoreseau, dans les banques 0 et 1. * La banque 0 accede a l'interface SDMOTO * La banque 1 accede a l'interface SDMO * Auteur : Daniel Coulom, d'après la rom CD90-640 * Calcul du LBA avec le code de Samuel Devulder * Optimisation lecture octet par Samuel Devulder /**************************************************\ * Version 2013.12.07 * \**************************************************/ * Historique * 2013.12.07 adresse fichier .sd lue sans buffer en ram * 2013.12.07 suppression des retries lors du boot * 2013.12.05 ajout fonctions $04 & $10 (selection densite) * 2013.12.01 retablissement configuration port joysticks * 2013.10.30 deroulement boucle ecriture octet dans SWRITE * 2013.10.30 deroulement boucle lecture octet dans SREAD * 2013.10.29 gain de 2 cycles dans RBYTE version SDMO * 2013.10.21 suppression initialisation du CNA en sortie * 2013.10.20 correction initialisation PIA musique et jeu * 2013.10.19 indirection vers EXCMD en $A028-$E028 * 2013.10.18 banque 0 ou 1 choisie par parametre -dBANK * 2013.10.17 suppression des retries fonctions standard * 2013.10.17 retour erreur unite / piste / secteur * 2013.10.10 formatage rapide pistes 0 et 20 seulement * 2013.10.08 correction detection SDHC (BLS -> BPL) * 2013.08.26 SB_LB0 decale de 2 octets (evite ecrasement) * 2013.08.14 améliorations mineures * 2013.08.11 procedure de reset pour TO8/TO8D/TO9/TO9+ * 2013.08.10 procedure de reset pour TO8D * 2013.08.08 zones de travail en debut de pile systeme * 2013.08.07 copie routine RBYTE dans SREAD evite BSR * 2013.08.07 copie routine WBYTE dans SWRITE evite BSR * 2013.08.07 test position switches pour choix SD_LB0 * 2013.08.06 buffer en $6300 pour lecture secteur 1 * 2013.08.06 routine CLOCK envoie 8 x A tops horloge * 2013.08.06 attente carte prete avant envoi commande * 2013.08.05 test OK en configuration reelle sur MO6 * 2013.08.05 temporisation entre ecritures secteurs * 2013.08.05 correction erreur dans RECFI * 2013.07.28 ecriture secteur et formatage OK dans dcmoto * 2013.07.25 boot, chargement DOS, lecture secteur OK * 2013.07.24 ajout du calcul LBA ecrit par sam * 2013.07.23 debut du projet *------------------------------------------------------ * VECTEURS EN RAM *------------------------------------------------------ DK_OPC EQU $6048 code commande controleur disquette DK_DRV EQU $6049 numero du lecteur de disquette DK_TRK EQU $604a n° piste (2 octets) DK_SEC EQU $604c n° secteur DK_NUM EQU $604d entrelacement DK_STA EQU $604e etat courant controleur disquette DK_BUF EQU $604f adresse buffer secteur (2 octets) * position tetes n° piste + n° secteur (2 octets) TRACK0 EQU $6051 position tete lecteur 0 TRACK1 EQU $6053 position tete lecteur 1 TRACK2 EQU $6055 position tete lecteur 2 TRACK3 EQU $6057 position tete lecteur 3 ROTAT EQU $6058 indicateur de rotation du moteur DKFLG EQU $6080 indicateur presence controleur disque * Zones de travail en pile systeme pour le driver de la carte SD SD_LB0 EQU $608E adresse du debut du fichier .sd dans la carte SD SD_TYP EQU $6092 type de carte SD=0 SDHC=1 CMDXX EQU $6093 definition de la commande CMD17 ou CMD24 SD_LBA EQU $6094 adresse du secteur courant dans la carte SD DKWE5 EQU $60e5 ???? DKWE7 EQU $60e7 pointeur sur nom de fichier DKWE9 EQU $60e9 pointeur sur buffer DKWEB EQU $60eb type de fichier DKWEC EQU $60ec flag de fichier DKWED EQU $60ed bloc libre dans la FAT DKWF0 EQU $60f0 code operation logique DKWF5 EQU $60f5 numero de secteur DKWF6 EQU $60f6 numero de bloc DKWF7 EQU $60f7 nombre d'octets dans le dernier secteur du fichier DKWF9 EQU $60f9 numero de bloc alloue DKWFA EQU $60fa numero du premier secteur du bloc DKWFB EQU $60fb numero de piste du bloc courant BUFFER EQU $6200 buffer de lecture/ecriture secteur *------------------------------------------------------ * ROM DU CONTROLEUR *------------------------------------------------------ ORG $E000 E000 53 FCB $53 S controleur carte SD E001 54 FCB $54 T fat de 160 octets E002 44 FCB $44 D double densite E003 40 FCB $40 7 checksum 53+54+44+55=140 OPTABL E004 16006E LBRA DKCONT fonctions standard E007 160028 LBRA DKBOOT lancement du boot E00A 1603D0 LBRA DKFMT formatage E00D 160484 LBRA LECFA chargement de la fat E010 1604AE LBRA RECFI ouverture d'un fichier E013 1605A9 LBRA RECUP effacement d'un fichier E016 16049B LBRA ECRSE ecriture d'un secteur E019 160503 LBRA ALLOD creation d'un fichier E01C 16055A LBRA ALLOB allocation d'un bloc E01F 1605BC LBRA MAJCL mise a jour cluster E022 160432 LBRA FINTR cloture d'ecriture E025 16009F LBRA RESETO reset special TO8/TO8D/TO9/TO9+ E028 16015B LBRA EXCMD execution commande pour carte SD *------------------------------------------------------ * Initialisation des registres *------------------------------------------------------ INIREG E02B 1F50 TFR PC,D adresse courante E02D 8470 ANDA #$70 calcul valeur DP E02F 1F8B TFR A,DP DP = $20 ou $60 E031 39 RTS *------------------------------------------------------ * DKBOOT = Lancement du boot *------------------------------------------------------ DKBOOT E032 8DF7 BSR INIREG initialisation DP E034 0F49 CLR RESET,PCR Reset controleur E08D 8501 BITA #$01 Bit reset E08F 2630 BNE STDOP2 Execution reset E091 318D01A0 LEAY >SREAD,PCR Lecture secteur logique E095 8502 BITA #$02 Bit lecture secteur E097 2628 BNE STDOP2 Execute lecture secteur E099 318D024D LEAY >SWRITE,PCR Ecriture secteur logique E09D 8508 BITA #$08 Bit ecriture secteur E09F 2620 BNE STDOP2 Execute lecture secteur E0A1 318D0336 LEAY >FIND0,PCR Recherche piste 0 E0A5 8520 BITA #$20 Bit recherche piste 0 E0A7 2618 BNE STDOP2 Execute recherche piste 0 E0A9 318D032A LEAY >FINDT,PCR Recherche piste E0AD 8540 BITA #$40 Bit recherche piste x E0AF 2610 BNE STDOP2 Execute recherche piste x E0B1 318D0023 LEAY >SIMPLE,PCR Passage simple densite E0B5 8504 BITA #$04 Bit passage simple densite E0B7 2608 BNE STDOP2 Execute passage simple densite E0B9 318D001F LEAY >DOUBLE,PCR Passage double densite E0BD 8510 BITA #$10 Bit passage double densite E0BF 2704 BEQ STDOP8 Erreur fonction inconnue STDOP2 E0C1 ADA4 JSR ,Y Execution de la fonction E0C3 2401 BCC STDOP9 Retour sans erreur STDOP8 E0C5 53 COMB Erreur dans CC STDOP9 E0C6 39 RTS *------------------------------------------------------ * RESET SPECIAL POUR TO8/TO8D/TO9/TO9+ *------------------------------------------------------ RESETO E0C7 39 RTS *------------------------------------------------------ * CONFIGURATION PIA 6821 POUR ACCES A LA CARTE SD *------------------------------------------------------ SCONF E0C8 1A50 ORCC #$50 desactive les interruptions E0CA 1FB8 TFR DP,A lecture de DP E0CC 8B87 ADDA #$87 ajout de $87 E0CE 1F8B TFR A,DP modifie DP pour acces carte SD E0D0 39 RTS *------------------------------------------------------ * RESTAURATION PIA 6821 EN CONFIGURATION STANDARD *------------------------------------------------------ RCONF E0D1 1FB8 TFR DP,A valeur actuelle DP E0D3 8087 SUBA #$87 soustraction de $87 E0D5 1F8B TFR A,DP retablir valeur initiale DP E0D7 39 RTS *-------------------------------- * Passage en simple densite *-------------------------------- SIMPLE E0D8 8680 LDA #$80 E0DA 2001 BRA DOUBLE+1 *-------------------------------- * Passage en double densite *-------------------------------- DOUBLE E0DC 4F CLRA E0DD 39 RTS *------------------------------------------------------ * RESET CARTE SD POUR INTERFACE SDMOTO OU SDMO *------------------------------------------------------ RESET * LDA #$44 code double densite * STA initialiser CMDXX et SD_LB0 E130 4F CLRA code retour a zero E131 39 RTS retour RLBA1 E132 CC0000 LDD #$0000 debut adresse secteur 1 E135 DD94 STD SD_LB0 stocker E16A 8D67 BSR RBYTE lire premier octet adresse E16C B7608F STA >SD_LB0+1 stocker E16F 8D62 BSR RBYTE lire premier octet adresse E171 B76090 STA >SD_LB0+2 stocker E174 8D5D BSR RBYTE lire premier octet adresse E176 B76091 STA >SD_LB0+3 stocker E179 4F CLRA compteur pour 256 octets E17A 170142 LBSR CLOCK lire 256 octets de plus E17D 4F CLRA compteur pour 256 octets E17E 17013E LBSR CLOCK lire 256 octets de plus E181 17FF4D LBSR RCONF retablissement configuration E184 4F CLRA 0 dans code condition E185 39 RTS retour *------------------------------------------------------ * EXECUTION D'UNE COMMANDE POUR LA CARTE SD * Le registre B n'est pas preserve. * le code retour est dans le registre A *------------------------------------------------------ EXCMD E186 8D4B BSR RBYTE lecture d'un octet E188 4C INCA ajout de 1 ($FF --> $00) E189 26FB BNE EXCMD attente carte prete E18B 8E0006 LDX #$0006 nombre d'octets de commande EXCMD1 E18E A6C0 LDA ,U+ chargement octet de commande E190 8D0C BSR WBYTE ecriture de l'octet E192 301F LEAX -1,X decrementation compteur E194 26F8 BNE EXCMD1 il reste des octets a envoyer EXCMD2 E196 8D27 BSR ALIGN lecture d'un octet aligne E198 A1C0 CMPA ,U+ test code de retour E19A 2701 BEQ EXCMD3 code bon E19C 53 COMB carry set en erreur EXCMD3 E19D 39 RTS retour *------------------------------------------------------ * ECRITURE D'UN OCTET POUR SDMO * Le registre B n'est pas préservé * Valeur de l'octet dans le registre A en entree *------------------------------------------------------ WBYTE E19E C608 LDB #$08 compteur de boucles = 8 E1A0 3404 PSHS B empilage compteur de boucles WBYTE1 E1A2 D6C0 LDB <$C0 lecture port A E1A4 CA40 ORB #$40 b6=1 set DIN E1A6 6AE4 DEC ,S decremente compteur boucles E1A8 2B11 BMI WBYTE3 fin de la boucle E1AA 48 ASLA store bit to C E1AB 2502 BCS WBYTE2 bit=1 E1AD C4BF ANDB #$BF b6=0 clear DIN WBYTE2 E1AF D7C0 STB <$C0 DIN E1B1 C63E LDB #$3E set bit 3 E1B3 D7C2 STB <$C2 clock high E1B5 C636 LDB #$36 clear bit 3 E1B7 D7C2 STB <$C2 clock low E1B9 20E7 BRA WBYTE1 nouvelle boucle WBYTE3 E1BB D7C0 STB <$C0 keep the DIN high E1BD 3584 PULS B,PC retour *------------------------------------------------------ * LECTURE D'UN OCTET AVEC ALIGNEMENT SUR BIT 0 (SDMO) * Le registre B n'est pas préservé * Valeur de l'octet dans le registre A en sortie * Optimisation transfert b7 avec CMPB par Daniel *------------------------------------------------------ ALIGN E1BF 4F CLRA compteur pour 256 boucles ALIGN1 E1C0 C67F LDB #$7F set bit 3 E1C2 D1C0 CMPB <$C0 read bit (PA bit 7) dans CC E1C4 D7C2 STB <$C2 clock high E1C6 C636 LDB #$36 clear bit 3 E1C8 D7C2 STB <$C2 clock low E1CA 2504 BCS ALIGN2 si bit 1, continuer a lire E1CC 86FC LDA #$FC stocker le bit 0 E1CE 2005 BRA RBYTE1 lire les 7 autres bits ALIGN2 E1D0 4A DECA decrementer compteur E1D1 26ED BNE ALIGN1 nouvelle lecture *------------------------------------------------------ * LECTURE D'UN OCTET (SDMO) * Le registre B n'est pas préservé * Valeur de l'octet dans le registre A en sortie * Optimisation du compteur de boucle par Samuel * Optimisation transfert b7 avec CMPB par Daniel *------------------------------------------------------ RBYTE E1D3 86FE LDA #$FE b0 marqueur fin de boucle (2) RBYTE1 E1D5 C67F LDB #$7F set bit 3 E1D7 D1C0 CMPB <$C0 read bit (PA bit 7) dans CC E1D9 D7C2 STB <$C2 clock high E1DB C636 LDB #$36 clear bit 3 E1DD D7C2 STB <$C2 clock low E1DF 49 ROLA C (bit lu) -> b0 reg A (2) E1E0 25F3 BCS RBYTE1 suite de la boucle (3) E1E2 39 RTS retour (octet dans A) (5) *------------------------------------------------------ * Calcul du LBA carte SD : SD_LBA = * SD_LBA0+(512-511*SD_TYP)*(1280*DK_DRV+16*DK_TRK+DK_SEC-1 ) * DK_DRV n° lecteur de disquette * DK_TRK n° piste (2 octets) * DK_SEC n° secteur * SD_TYP type SD/SDHC * Routine écrite par Samuel *------------------------------------------------------ SETLBA E1E3 3456 PSHS U,X,B,A E1E5 338D7EAB LEAU SD_LBA,PCR E1E9 D64B LDB carry E259 D7C2 STB <$C2 clock high E25B C636 LDB #$36 clear bit 3 E25D D7C2 STB <$C2 clock low E25F 49 ROLA C (bit lu) -> b0 reg A (2) * deuxieme bit E260 C67F LDB #$7F set bit 3 E262 D1C0 CMPB <$C0 PA b7 (bit lu) -> carry E264 D7C2 STB <$C2 clock high E266 C636 LDB #$36 clear bit 3 E268 D7C2 STB <$C2 clock low E26A 49 ROLA C (bit lu) -> b0 reg A (2) * troisieme bit E26B C67F LDB #$7F set bit 3 E26D D1C0 CMPB <$C0 PA b7 (bit lu) -> carry E26F D7C2 STB <$C2 clock high E271 C636 LDB #$36 clear bit 3 E273 D7C2 STB <$C2 clock low E275 49 ROLA C (bit lu) -> b0 reg A (2) * quatrieme bit E276 C67F LDB #$7F set bit 3 E278 D1C0 CMPB <$C0 PA b7 (bit lu) -> carry E27A D7C2 STB <$C2 clock high E27C C636 LDB #$36 clear bit 3 E27E D7C2 STB <$C2 clock low E280 49 ROLA C (bit lu) -> b0 reg A (2) * cinquieme bit E281 C67F LDB #$7F set bit 3 E283 D1C0 CMPB <$C0 PA b7 (bit lu) -> carry E285 D7C2 STB <$C2 clock high E287 C636 LDB #$36 clear bit 3 E289 D7C2 STB <$C2 clock low E28B 49 ROLA C (bit lu) -> b0 reg A (2) * sixieme bit E28C C67F LDB #$7F set bit 3 E28E D1C0 CMPB <$C0 PA b7 (bit lu) -> carry E290 D7C2 STB <$C2 clock high E292 C636 LDB #$36 clear bit 3 E294 D7C2 STB <$C2 clock low E296 49 ROLA C (bit lu) -> b0 reg A (2) * septieme bit E297 C67F LDB #$7F set bit 3 E299 D1C0 CMPB <$C0 PA b7 (bit lu) -> carry E29B D7C2 STB <$C2 clock high E29D C636 LDB #$36 clear bit 3 E29F D7C2 STB <$C2 clock low E2A1 49 ROLA C (bit lu) -> b0 reg A (2) * huitieme bit E2A2 C67F LDB #$7F set bit 3 E2A4 D1C0 CMPB <$C0 PA b7 (bit lu) -> carry E2A6 D7C2 STB <$C2 clock high E2A8 C636 LDB #$36 clear bit 3 E2AA D7C2 STB <$C2 clock low E2AC 49 ROLA C (bit lu) -> b0 reg A (2) ******************************************************** E2AD A7A0 STA ,Y+ stockage dans le buffer E2AF 6AE4 DEC ,S decrementation compteur E2B1 26A2 BNE SREAD3 nouvelle lecture E2B3 3502 PULS A depilage compteur * ignorer 256 octets E2B5 8D08 BSR CLOCK envoi de 256 * 8 tops * ignorer 2 octets de CRC E2B7 8602 LDA #$02 pour 2 octets E2B9 8D04 BSR CLOCK ignorer 2 octets E2BB 17FE13 LBSR RCONF retablissement configuration SREAD9 E2BE 39 RTS retour *------------------------------------------------------ * ENVOI DE TOPS HORLOGE (8 fois reg A) (SDMO) *------------------------------------------------------ CLOCK E2BF 3402 PSHS A E2C1 CC3E36 LDD #$3E36 CLOCK1 E2C4 97C2 STA <$C2 clock high, di high E2C6 D7C2 STB <$C2 clock low, di high E2C8 97C2 STA <$C2 clock high, di high E2CA D7C2 STB <$C2 clock low, di high E2CC 97C2 STA <$C2 clock high, di high E2CE D7C2 STB <$C2 clock low, di high E2D0 97C2 STA <$C2 clock high, di high E2D2 D7C2 STB <$C2 clock low, di high E2D4 97C2 STA <$C2 clock high, di high E2D6 D7C2 STB <$C2 clock low, di high E2D8 97C2 STA <$C2 clock high, di high E2DA D7C2 STB <$C2 clock low, di high E2DC 97C2 STA <$C2 clock high, di high E2DE D7C2 STB <$C2 clock low, di high E2E0 97C2 STA <$C2 clock high, di high E2E2 D7C2 STB <$C2 clock low, di high E2E4 6AE4 DEC ,S E2E6 26DC BNE CLOCK1 E2E8 3582 PULS A,PC *------------------------------------------------------ * Ecriture d'un secteur disquette * dans secteur SD complete a 512 *------------------------------------------------------ SWRITE E2EA 1700D8 LBSR WPROT test protection ecriture E2ED 102500D3 LBLO SWRIT9 branchement si protection E2F1 17FEEF LBSR SETLBA calcul SD_LBA E2F4 102500CC LBCS SWRIT9 erreur unite/piste/secteur E2F8 8658 LDA #$58 code CMD24 E2FA 9793 STA