#asm (main)test.asm _DKDRV EQU $6049 _DKOPC EQU $6048 _DKTRK EQU $604B _DKVAL EQU $6052 _DKSEC EQU $604C _DKERR EQU $604E ORG $8000 | debut de l'impementation en 9000 ORCC #$50 | Gel des interruptions TFR S,Y | store old S STY $62FE LDA #$60 | Fixe le TFR A,DP | DP a $60 LDS #$6600-_GLOBALS | share 6300-6400 for stack and globals TFR S,Y | Y is GLOBAL pointer CLR $6019 | Plus dinterruptions CLRB STB _DKDRV | drive 0 LDX #$6300 STX $604F | sector buffer #endasm /* le main doit ĂȘtre en premier */ int main() { int ii,i,j,k; char *longname; int longOff; int longIdx; int nfic; int dirEnd; int t; int piste; char *p; char *buf; char *buf2; /* big dir buffer in A000 enough for 127 entries */ int ret; char c; char s2; int cfgnum; /* LBA, MBR and all (V)FAT stuff */ unsigned int lbaBeg_h; unsigned int lbaBeg_l; unsigned int f_clusz; unsigned int f_shift; unsigned int f_res; unsigned int f_nbfat; unsigned int f_fatsh; unsigned int f_fatsl; unsigned int f_rooth; unsigned int f_rootl; unsigned int f_firsth; unsigned int f_firstl; unsigned int f_tmph; unsigned int f_tmpl; unsigned int f_cfgh; unsigned int f_cfgl; int page,select,maxpage; border(0); cls(); cfgnum=-1; i=0x6300;buf=i; i=0xA000;buf2=i; i=(0xAFFF-17);longname=i; i=0x604E;p=i;*p=0; /* clear error */ ret=go_trk255(); border(1); /* dump16b(1,16,ret); */ border(2); ret=rd_lba(0,0); lbaBeg_l=mk_16(buf[446+9],buf[446+8]); lbaBeg_h=mk_16(buf[446+11],buf[446+10]); /* dump16b(0,17,lbaBeg_h); dump16b(4,17,lbaBeg_l); */ rd_lba(lbaBeg_h,lbaBeg_l); /* get all fat stuf */ f_clusz=buf[0x0D]; f_shift=siz2shif(f_clusz); f_res=mk_16(buf[0x0F],buf[0x0E]); f_nbfat=buf[0x10]; f_fatsl=mk_16(buf[0x25],buf[0x24]); f_fatsh=mk_16(buf[0x27],buf[0x26]); f_rootl=mk_16(buf[0x2D],buf[0x2C]); f_rooth=mk_16(buf[0x2F],buf[0x2E]); /* dump16b(0,18,f_rooth); dump16b(4,18,f_rootl); */ /* (unsigned long)cluster_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors + (Number_of_FATs * Sectors_Per_FAT); */ add_32(lbaBeg_h,lbaBeg_l,0,f_res,&f_firsth,&f_firstl); for (i=0;i126) { dirEnd=1; break; } } else { longname[0]='\0'; longname[13]='\0'; } } add_32(f_tmph,f_tmpl,0x0000,0x0001,&f_tmph,&f_tmpl); /* increment LBA */ } border(0); banner(); for (i=0;i>4); fic_list(select,page,nfic); hi_line(select+4,0xC7); irq(); while (1) { i=getc(); dump16b(0,24,i); if ((i==0x08) && (page>0)) { page--; hi_line(select+4,0xF8); select=0; fic_list(select,page,nfic); hi_line(select+4,0xC7); } if ((i==0x09) && (page0)) { hi_line(select+4,0xF8); select--; hi_line(select+4,0xC7); } else if ((i==0x0B) && (page>0)) { page--; hi_line(select+4,0xF8); select=15; fic_list(select,page,nfic); hi_line(select+4,0xC7); } if ((i==0x0A) && (select<15)) { hi_line(select+4,0xF8); if ((page<<4)+select+1=nfic) { string(1,line+4," ",39); line++; continue; } string(1,line+4,&buf2[i<<5],8); charxy(9,line+4,'.'); string(10,line+4,&buf2[(i<<5)+8],3); string(14,line+4,&buf2[(i<<5)+11],17); dump16b(32,line+4,mk_16(buf2[(i<<5)+28],buf2[(i<<5)+29])); dump16b(36,line+4,mk_16(buf2[(i<<5)+30],buf2[(i<<5)+31])); line++; } return 0; } /* cfg is * struct ShortDirectoryEntry { unsigned char name[12]; unsigned char attributes; unsigned long firstCluster; unsigned long size; unsigned char longName[17]; // boolean }; extern struct DirectoryEntry directoryEntry; typedef struct disk_in_drive_ { struct ShortDirectoryEntry DirEnt; unsigned char numberoftrack; unsigned char numberofside; unsigned short rpm; unsigned short bitrate; unsigned short tracklistoffset; }disk_in_drive; at 0x100 (in first LBA sector) * */ string(x,y,s,sz) int x; int y; char *s; int sz; { int i; int ii; for (i=0;i>12; ii=hexchar(jj); charxy(x,y,ii); jj=(v&0xF00)>>8; ii=hexchar(jj); charxy(x+1,y,ii); jj=(v&0xF0)>>4; ii=hexchar(jj); charxy(x+2,y,ii); jj=v&0xF; ii=hexchar(jj); charxy(x+3,y,ii); return 0; } go_trk255() { { #asm LDA #$01 | reset lecteur STA _DKOPC JSR $E004 LDA #$20 | rech piste 0 STA _DKOPC JSR $E004 CLR _DKVAL LDA #$02 | read a sector to start motor STA _DKTRK LDA #$01 | read a sector to start motor STB _DKSEC LDA #$02 STA _DKOPC LDA #127 | goto 127 STA _DKTRK LDA #$40 STA _DKOPC JSR $E004 CLR _DKVAL LDA #127 | 127 more... STA _DKTRK LDA #$40 STA _DKOPC JSR $E004 CLR _DKVAL LDA #1 | 1 more... STA _DKTRK LDA #$40 STA _DKOPC JSR $E004 LDA #$FF STA _DKVAL | make monitor think we are in track 255 STA _DKTRK LDA #$00 LDB _DKERR TFR D,X | return in X #endasm } return 0; } go_track(track) char track; { { #asm LDA #$20 | rech piste 0 STA _DKOPC JSR $E004 CLR _DKVAL LDB 5,U STB _DKTRK LDA #$40 STA _DKOPC JSR $E004 LDA #$00 LDB _DKERR TFR D,X | return in X #endasm } } rd_lba(high,low) unsigned int high,low; { int i; char *p; for (i=0x6300;i<0x6500;i++) { p=i; *p=0x00; } i=0x6300;p=i; p[0]='H'; p[1]='x'; p[2]='C'; p[3]='F'; p[4]='E'; p[5]='D'; p[6]='A'; p[7]=0; p[8]=0x01; p[9]=(low & 0xFF); p[10]=((low >> 8) & 0xFF); p[11]=(high & 0xFF); p[12]=((high >> 8) & 0xFF); p[13]=0xA5; p[14]=0x08; /* init fields with a read */ wt_sec(0); i=rd_sec(1); return i; } mk_16(c1,c2) char c1; char c2; { { #asm LDA 5,U | read from stack LDB 7,U | read from stack TFR D,X | return in X #endasm } } add_32(h1,l1,h2,l2,rh,rl) unsigned int h1,l1; unsigned int h2,l2; unsigned int *rh,*rl; { { #asm LEAX 4,U | h1 LEAY 8,U | h2 ANDCC #$FE LDA 3,X ADCA 3,Y STA 3,Y LDA 2,X ADCA 2,Y STA 2,Y LDA 1,X ADCA 1,Y STA 1,Y LDA ,X ADCA ,Y STA ,Y LDX 8,U STX [12,U] | rh LDX 10,U STX [14,U] | rl #endasm } } sub_32(h1,l1,h2,l2,rh,rl) unsigned int h1,l1; unsigned int h2,l2; unsigned int *rh,*rl; { { #asm LEAX 4,U | h1 LEAY 8,U | h2 ANDCC #$FE LDA 3,X SBCA 3,Y STA 3,Y LDA 2,X SBCA 2,Y STA 2,Y LDA 1,X SBCA 1,Y STA 1,Y LDA ,X SBCA ,Y STA ,Y LDX 8,U STX [12,U] | rh LDX 10,U STX [14,U] | rl #endasm } } siz2shif(sz) int sz; { int i; switch (sz) { case 1 : i=0; break; case 2 : i=1; break; case 4 : i=2; break; case 8 : i=3; break; case 16 : i=4; break; case 32 : i=5; break; case 64 : i=6; break; case 128 : i=7; break; default : i=0; } return i; } clu2lba(h,l,shift,rh,rl) unsigned int h,l; unsigned int shift; unsigned int *rh,*rl; { { #asm LEAX 4,U | h (+l) LDB 9,U | shift L_CLU2LBA CMPB #$00 BEQ L_CLU2END ANDCC #$FE LDA 3,X LSLA STA 3,X LDA 2,X ROLA STA 2,X LDA 1,X ROLA STA 1,X LDA ,X ROLA STA ,X DECB BRA L_CLU2LBA L_CLU2END LDX 4,U STX [10,U] | rh LDX 6,U STX [12,U] | rl #endasm } } rd_sec(sect) char sect; { { #asm LDB 5,U | read from stack LDA #$02 | read sector (monitor) STA _DKOPC STB _DKSEC PSHS U,DP LDX #$6300 STX $604F | sector buffer JSR $789D JSR $78A7 PSHS A | JSR $7C5A | activate drive... JSR $7965 | wait some time JSR $7CA8 LDA #$FF STA 6,X | force track FF in THFMC reg JSR $7BAE PULS A | E0EE JSR $78B9 | motor off PULS DP,U LDA #$00 LDB _DKERR TFR D,X | return in X #endasm } } wt_sec(sect) char sect; { { #asm LDB 5,U | read from stack LDA #$08 | read sector (monitor) STA _DKOPC STB _DKSEC PSHS U,DP LDX #$6300 STX $604F | sector buffer JSR $789D JSR $78A7 PSHS A | JSR $7C5A | activate drive... JSR $7965 | wait some time JSR $7CA8 LDA #$FF STA 6,X | force track FF in THFMC reg JSR $797A PULS A | E0EE JSR $78B9 | motor off PULS DP,U LDA #$00 LDB _DKERR TFR D,X | return in X #endasm } } irq() { { #asm #endasm } } noirq() { { #asm #endasm } } getc() { { #asm TFR S,Y STY $62FC LDY $62FE TFR Y,S ANDCC #$EF L_GETC JSR $E806 | call monitor BCC L_GETC ORCC #$50 TFR S,Y STY $62FE LDY $62FC TFR Y,S LDA #$00 TFR D,X | return in X #endasm } } fill(v) char v; { { #asm LDB 5,U LDX #$4000 FILL_L STB ,X+ CMPX #$5F40 BNE FILL_L #endasm } } set_resolution(res) char res; { { #asm LDB 5,U STB $E7DC #endasm } } set_pt() { { #asm LDB #$01 ORB $E7C3 STB $E7C3 #endasm } } set_col() { { #asm LDB #$FE ANDB $E7C3 STB $E7C3 #endasm } } border(idx) int idx; { { #asm LDB #$F0 ANDB $E7E4 ORB 5,U STB $E7DD #endasm } } hi_line(l,c) int l; int c; { set_col(); { #asm * screen base address is x+y*40*8 -> Y LDB 5,U LSLB LDX #BASE_TXT_ADR LEAX [B,X] LDB 7,U LDY #320 L_HILINE STB ,X+ LEAY -1,Y CMPY #$0000 BNE L_HILINE #endasm } set_pt(); } charxy(x,y,c) char x; char y; char c; { { #asm * screen base address is x+y*40*8 -> Y LDB 7,U LSLB LDX #BASE_TXT_ADR LEAX [B,X] LDB 5,U ABX TFR X,Y * font base is font adress + 8*c -> X LDB 9,U ANDB #$7F LDX #FONT8 LDA #8 MUL LEAX D,X * put a byte every 40 screen byte LDB #40 LDA ,X+ STA ,Y LEAY B,Y LDA ,X+ STA ,Y LEAY B,Y LDA ,X+ STA ,Y LEAY B,Y LDA ,X+ STA ,Y LEAY B,Y LDA ,X+ STA ,Y LEAY B,Y LDA ,X+ STA ,Y LEAY B,Y LDA ,X+ STA ,Y LEAY B,Y LDA ,X+ STA ,Y PULS U,PC ; retour de fonction compatible mini C BASE_TXT_ADR FDB 0+$4000 FDB 1*40*8+$4000 FDB 2*40*8+$4000 FDB 3*40*8+$4000 FDB 4*40*8+$4000 FDB 5*40*8+$4000 FDB 6*40*8+$4000 FDB 7*40*8+$4000 FDB 8*40*8+$4000 FDB 9*40*8+$4000 FDB 10*40*8+$4000 FDB 11*40*8+$4000 FDB 12*40*8+$4000 FDB 13*40*8+$4000 FDB 14*40*8+$4000 FDB 15*40*8+$4000 FDB 16*40*8+$4000 FDB 17*40*8+$4000 FDB 18*40*8+$4000 FDB 19*40*8+$4000 FDB 20*40*8+$4000 FDB 21*40*8+$4000 FDB 22*40*8+$4000 FDB 23*40*8+$4000 FDB 24*40*8+$4000 FONT8 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$FE,$0,$0 FCB $0,$0,$0,$0,$0,$0,$0,$0 * ! FCB $18,$18,$18,$18,$0,$18,$0,$0 * " FCB $66,$66,$0,$0,$0,$0,$0,$0 * # FCB $0,$24,$7E,$24,$7E,$24,$0,$0 * $%& FCB $0,$0,$0,$0,$0,$0,$0,$0 FCB $0,$0,$0,$0,$0,$0,$0,$0 FCB $0,$0,$0,$0,$0,$0,$0,$0 * ' FCB $18,$18,$0,$0,$0,$0,$0,$0 * ( FCB $C,$18,$30,$30,$30,$18,$C,$0 * ) FCB $30,$18,$C,$C,$C,$18,$30,$0 * * FCB $0,$18,$5A,$3C,$5A,$18,$0,$0 * + FCB $0,$0,$0,$0,$0,$0,$0,$0 * , FCB $0,$0,$0,$0,$0,$18,$30,$0 * - FCB $0,$0,$0,$7C,$0,$0,$0,$0 * . FCB $0,$0,$0,$0,$0,$18,$0,$0 * / FCB $6,$C,$18,$30,$60,$C0,$0,$0 * 0-9 FCB $7C,$C6,$C6,$C6,$FE,$7C,$0,$0 FCB $38,$18,$18,$18,$18,$18,$0,$0 FCB $FC,$E,$7C,$C0,$FE,$FE,$0,$0 FCB $FC,$6,$FE,$6,$FE,$FC,$0,$0 FCB $C6,$C6,$C6,$7E,$6,$6,$0,$0 FCB $FE,$E0,$FC,$6,$FE,$FC,$0,$0 FCB $7E,$E0,$FC,$C6,$FE,$7C,$0,$0 FCB $FE,$6,$6,$6,$6,$6,$0,$0 FCB $7C,$C6,$7C,$C6,$FE,$7C,$0,$0 FCB $7C,$C6,$FE,$6,$FE,$FC,$0,$0 * : FCB $0,$0,$18,$0,$0,$18,$0,$0 * ; FCB $0,$0,$0,$18,$0,$18,$30,$0 * < FCB $0,$0,$0,$0,$0,$0,$0,$0 * = FCB $0,$0,$0,$0,$0,$0,$0,$0 * > FCB $0,$0,$0,$0,$0,$0,$0,$0 * ? FCB $FC,$E,$3C,$30,$0,$30,$0,$0 * @ FCB $7C,$82,$9A,$BE,$80,$7C,$0,$0 * A-Z FCB $7C,$C6,$C6,$FE,$C6,$C6,$0,$0 FCB $FC,$C6,$FC,$C6,$FE,$FC,$0,$0 FCB $7C,$C6,$C0,$C6,$FE,$7C,$0,$0 FCB $FC,$C6,$C6,$C6,$FE,$FC,$0,$0 FCB $7E,$C0,$FE,$C0,$FE,$7E,$0,$0 FCB $7E,$C0,$FE,$C0,$C0,$C0,$0,$0 FCB $7E,$C0,$C6,$C6,$FE,$7E,$0,$0 FCB $C6,$C6,$FE,$C6,$C6,$C6,$0,$0 FCB $18,$18,$18,$18,$18,$18,$0,$0 FCB $E,$6,$C6,$C6,$FE,$7C,$0,$0 FCB $C6,$C6,$FC,$C6,$C6,$C6,$0,$0 FCB $C0,$C0,$C0,$C0,$FE,$7E,$0,$0 FCB $FC,$D6,$D6,$D6,$D6,$D6,$0,$0 FCB $FC,$C6,$C6,$C6,$C6,$C6,$0,$0 FCB $7C,$C6,$C6,$C6,$FE,$7C,$0,$0 FCB $FC,$C6,$C6,$FC,$C0,$C0,$0,$0 FCB $7C,$C6,$C6,$D6,$FE,$7C,$18,$18 FCB $FC,$C6,$C6,$FC,$C6,$C6,$0,$0 FCB $7E,$E0,$7C,$6,$FE,$FC,$0,$0 FCB $FC,$30,$30,$30,$30,$30,$0,$0 FCB $C6,$C6,$C6,$C6,$FE,$7C,$0,$0 FCB $C6,$C6,$C6,$EE,$7C,$38,$0,$0 FCB $D6,$D6,$D6,$D6,$FC,$F8,$0,$0 FCB $C6,$C6,$7C,$C6,$C6,$C6,$0,$0 FCB $C6,$C6,$7E,$6,$FE,$FC,$0,$0 FCB $FE,$E,$38,$E0,$FE,$FE,$0,$0 * [ FCB $3C,$30,$30,$30,$30,$30,$3C,$00 * \ FCB $C0,$60,$30,$18,$C,$6,$0,$0 * ] FCB $3C,$0C,$0C,$0C,$0C,$0C,$3C,$00 * ^ FCB $0,$0,$0,$0,$0,$0,$0,$0 * _ FCB $0,$0,$0,$0,$0,$FE,$0,$0 * ` FCB $18,$18,$0,$0,$0,$0,$0,$0 * a-z FCB $0,$7E,$C6,$C6,$FE,$7E,$0,$0 FCB $C0,$C0,$FC,$C6,$FE,$FC,$0,$0 FCB $0,$7E,$C0,$C0,$FE,$7E,$0,$0 FCB $6,$6,$7E,$C6,$FE,$7E,$0,$0 FCB $0,$7C,$C6,$FE,$E0,$7C,$0,$0 FCB $1E,$30,$7E,$30,$30,$30,$0,$0 FCB $0,$7E,$C6,$C6,$7E,$6,$6,$7C FCB $C0,$C0,$FC,$C6,$C6,$C6,$0,$0 FCB $18,$0,$18,$18,$18,$18,$0,$0 FCB $18,$0,$18,$18,$18,$18,$18,$70 FCB $C0,$C6,$C6,$FC,$C6,$C6,$0,$0 FCB $18,$18,$18,$18,$18,$18,$0,$0 FCB $0,$FC,$D6,$D6,$D6,$D6,$0,$0 FCB $0,$FC,$C6,$C6,$C6,$C6,$0,$0 FCB $0,$7C,$C6,$C6,$FE,$7C,$0,$0 FCB $0,$FC,$C6,$C6,$FE,$FC,$C0,$C0 FCB $0,$7E,$C6,$C6,$FE,$7E,$6,$6 FCB $0,$7E,$C0,$C0,$C0,$C0,$0,$0 FCB $0,$7E,$E0,$7C,$E,$FC,$0,$0 FCB $60,$60,$FE,$60,$60,$3E,$0,$0 FCB $0,$C6,$C6,$C6,$FE,$7E,$0,$0 FCB $0,$C6,$C6,$C6,$7C,$38,$0,$0 FCB $0,$D6,$D6,$D6,$FC,$F8,$0,$0 FCB $0,$C6,$C6,$7C,$C6,$C6,$0,$0 FCB $0,$C6,$C6,$C6,$7E,$6,$6,$7C FCB $0,$FE,$E,$38,$E0,$FE,$0,$0 * FCB $0,$0,$0,$0,$0,$0,$0,$0 * | as a block FCB $FE,$FE,$FE,$FE,$FE,$FE,$0,$0 * FCB $0,$0,$0,$0,$0,$0,$0,$0 FCB $00,$60,$F2,$9E,$0C,$00,$0,$0 * MC09 internal functions/lib _00001 PSHS D,X,Y multiply LDA ,S LDB 3,S MUL STB 4,S LDD 1,S MUL STB 5,S LDA 1,S LDB 3,S MUL ADDA 4,S ADDA 5,S LEAS 6,S RTS _00006 CMPX #0 signed left shift BMI _06001 _06000 BEQ _06009 LSLB ROLA LEAX -1,X BRA _06000 _06001 BEQ _06009 ASRA RORB LEAX 1,X BRA _06001 _06009 RTS _00008 CMPX #0 sined right shift BMI _08001 _08000 BEQ _08009 ASRA RORB LEAX -1,X BRA _08000 _08001 BEQ _08009 LSLB ROLA LEAX 1,X BRA _08001 _08009 RTS _00009 CMPX #0 unsined right shift BMI _09001 _09000 BEQ _09009 LSRA RORB LEAX -1,X BRA _09000 _09001 BEQ _09009 LSLB ROLA LEAX 1,X BRA _09001 _09009 RTS #endasm } }