Rev 8 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download
;startupTRUE = 0xffFALSE = 0TRDBUF = 0x50000000STKBUF = 0x201001feDOSBUF = 0x20100000FCB1 = 0x20100200;фы Keil эрфю ъюэёЄрэЄє фы DCD юяЁхфхы Є№ т√°х DCD; IF :LNOT: :DEF: _STRLEN_STRLEN = 80; ENDIF; IF :LNOT: :DEF: _STRMAX_STRMAX = (_STRLEN-1); ENDIF; IF :LNOT: :DEF: DOSBUFfreesectorsDOSBUFfreesectors = (DOSBUF+0x00e5); ENDIF; IF :LNOT: :DEF: DOSBUFfilesDOSBUFfiles = (DOSBUF+0x00e4); ENDIF; IF :LNOT: :DEF: DOSBUFfreesectorDOSBUFfreesector = (DOSBUF+0x00e1); ENDIF; IF :LNOT: :DEF: DOSBUFENDDOSBUFEND = (DOSBUF+0x0100); ENDIF; AREA RESET, CODE, READWRITE ;READONLY; THUMBorg 0x20000000 ;эр 1986┬┼1 юЄё■фр эхы№ч шёяюыэ Є№ ъюфLDR R0,__STKBUF__MOV SP,R0MOVS R7,#0xffMOVS R0,#0x00MOV R8,R0LDR R1,__fnbuf__LDR R0,__tokenize__fnSTR R1,[R0]BL tokinitBL tokenizeBL tokenize_endB $;{PC}ALIGN 4__fnbuf__DCD fnbuf____tokenize__fnDCD tokenize__fn__STKBUF__DCD STKBUF_JPHL__BX R1;R1 >> R2;out: R1_SHR___SHRB__PUSH {LR}ASRS R1,R2POP {PC};R1 << R2;out: R1_SHL__PUSH {LR}LSLS R1,R2POP {PC};R1 << R2;out: R1_SHLB__PUSH {LR}LSLS R1,R2ANDS R1,R7 ;0xffPOP {PC};AREA LIB, CODE, READWRITE;length 0 while reading means either absence of files of zero length file (any sector length)readfEXPORT readfPUSH {LR}LDR R1,readf__A__ ;poi to FCBB fread1__ ;R1=data ;keeps R3readfinEXPORT readfinPUSH {LR}LDR R0,readfin__fin__LDR R1,[R0] ;poi to FCBB fread1__ ;R1=data ;keeps R3fread1pp__PUSH {LR}fread1__;returns R1=data;keeps R3MOVS R6,R1 ;poi to FCBMOVS R0,#FCB__remain ;0xff = no data, 0xfe = 1 byte, ... 0x00 = 255 bytesORRS R1,R0LDRB R2,[R1] ;remainADDS R2,#1STRB R2,[R1] ;remain++;LDR R0,readf__A__ ;poi to FCB ;эхы№ч , Є.ъ. readfin Єюцх ЄєЄMOVS R0,R6 ;poi to FCBADDS R0,#0xffADDS R0,#1 ;poi to databufADDS R2,R0 ;poi to dataLDRB R0,[R1] ;remainCMP R0,#0BNE fread1OK__PUSH {R3}PUSH {R1};LDR R1,readf__A__ ;poi to FCB ;эхы№ч , Є.ъ. readfin Єюцх ЄєЄ;ORRS R1,R7 ;0xff;SUBS R1,#0xff ;poi to FCBMOVS R1,R6 ;poi to FCBLDR R0,readf__readnewbuf__A__STR R1,[R0] ;FCBBL readnewbufCMP R1,#0 ;no new bufBEQ fread1EOF__POP {R1}POP {R3};R1 = poi to remainLDRB R2,[R1] ;remainORRS R1,R7 ;0xffADDS R1,#1 ;poi to databufADDS R2,R1 ;poi to datafread1OK__LDRB R1,[R2] ;resultPOP {PC};EOF - next block doesn't existfread1EOF__POP {R1}POP {R3}MOVS R1,#TRUELDR R0,readf__waseof__STRB R1,[R0]MOVS R1,#'\n' ;EOF returns '\n';set vars as they were (next time EOF again)STRB R7,[R1] ;remain = 0xffPOP {PC}freadEXPORT freadPUSH {LR}LDR R1,fread__A__ ;poi to dataLDR R3,fread__C__ ;countfread0__PUSH {R3}LDR R3,fread__B__ ;sizefread00__PUSH {R1}LDR R1,fread__D__ ;poi to FCBBL fread1pp__ ;R1=data ;keeps bcMOVS R0,R1POP {R1}STRB R0,[R1]LDR R0,readf__waseof__LDRB R0,[R0]CMP R0,#FALSEBNE freadpopret__ADDS R1,#1SUBS R3,#1BNE fread00__POP {R3}SUBS R3,#1BNE fread0__POP {PC}freadpopret__POP {R3}POP {PC}ALIGN 4readf__A__EXPORT readf__A__DCD 0fread__A__EXPORT fread__A__DCD 0fread__B__EXPORT fread__B__DCD 0fread__C__EXPORT fread__C__DCD 0fread__D__EXPORT fread__D__DCD 0readfin__fin__DCD _finreadf__waseof__DCD _waseofreadf__readnewbuf__A__DCD readnewbuf__A__writebyteEXPORT writebytePUSH {LR}LDR R1,writebyte__A__ ;fileLDR R0,writebyte__B__ ;data ;LDRBB fwrite1__writefoutEXPORT writefoutPUSH {LR}LDR R0,writefout__fout__LDR R1,[R0] ;poi to FCBLDR R0,writefout__A__ ;data ;LDRBB fwrite1__fwrite1pp__PUSH {LR}fwrite1__;R1 = poi to FCB;R0=data;keeps R3MOVS R6,R1 ;poi to FCBMOVS R5,#FCB__lastlenORRS R1,R5LDRB R5,[R1]MOVS R2,R5 ;lastlen (LSB)ADDS R2,#1STRB R2,[R1] ;lastlen++ADDS R2,R6 ;poi to FCBADDS R2,#0xff ;poi to dataSTRB R0,[R2]CMP R5,#0xffBNE fwrite1OK__;end of bufADDS R1,#1 ;lastlen (HSB)LDRB R2,[R1]ADDS R2,#1STRB R2,[R1] ;lastlen (HSB) ++PUSH {R3}ORRS R1,R7 ;0xffSUBS R1,#0xff ;poi to FCBLDR R0,fwrite__flush___A__STR R1,[R0] ;FCBBL flush_POP {R3}fwrite1OK__POP {PC}fwriteEXPORT fwritePUSH {LR}LDR R1,fwrite__A__ ;poi to dataLDR R3,fwrite__C__ ;countfwrite0__PUSH {R3}LDR R3,fwrite__B__ ;sizefwrite00__LDRB R0,[R1]PUSH {R1}LDR R1,fwrite__D__ ;poi to FCBBL fwrite1pp__ ;R0=data ;keeps bcPOP {R1}ADDS R1,#1SUBS R3,#1BNE fwrite00__POP {R3}SUBS R3,#1BNE fwrite0__POP {PC}ALIGN 4writebyte__A__EXPORT writebyte__A__DCD 0writebyte__B__EXPORT writebyte__B__DCD 0 ;DCBfwrite__A__EXPORT fwrite__A__DCD 0fwrite__B__EXPORT fwrite__B__DCD 0fwrite__C__EXPORT fwrite__C__DCD 0fwrite__D__EXPORT fwrite__D__DCD 0writefout__A__EXPORT writefout__A__DCD 0 ;DCBfwrite__flush___A__DCD flush___A__writefout__fout__DCD _fout;FUNC UINT readsectors FORWARD(PBYTE buf, UINT trsec, BYTE count);readsectorsPUSH {LR}LDR R1,readsectors__A__ ;bufLDR R2,readsectors__B__ ;trsecLDR R3,readsectors__C__ ;countPUSH {R2,R3} ;trsec, countLSLS R6,R7,#8 ;LDR R6,=0xff00ANDS R6,R2 ;track<<8ASRS R6,R6,#4 ;track<<4ANDS R2,R7 ;sectorADDS R2,R6 ;(track<<4) + sectorLSLS R2,R2,#8LDR R0,readsectors__TRDBUF__ADDS R2,R0LSLS R3,R3,#6;R2=trdbufaddr;R3=words countwordsR2toR1__LDR R0,[R2]ADDS R2,#4STR R0,[R1]ADDS R1,#4SUBS R3,#1BNE wordsR2toR1__B readwritesectorsq__ ;return R1=next sector;FUNC UINT writesectors FORWARD(PBYTE buf, UINT trsec, BYTE count);writesectorsPUSH {LR}LDR R1,writesectors__A__ ;bufLDR R2,writesectors__B__ ;trsecLDR R3,writesectors__C__ ;count;B {PC}PUSH {R2,R3} ;trsec, countLSLS R6,R7,#8 ;LDR R6,=0xff00ANDS R6,R2 ;track<<8ASRS R6,R6,#4 ;track<<4ANDS R2,R7 ;sectorADDS R2,R6 ;(track<<4) + sectorLSLS R2,R2,#8LDR R0,readsectors__TRDBUF__ADDS R2,R0LSLS R3,R3,#6;R2=trdbufaddr;R3=words countwordsR1toR2__LDR R0,[R1]ADDS R1,#4STR R0,[R2]ADDS R2,#4SUBS R3,#1BNE wordsR1toR2__readwritesectorsq__POP {R3,R2} ;count, trsecLSLS R6,R7,#8 ;LDR R6,=0xff00ANDS R6,R2 ;track<<8ASRS R6,R6,#4 ;track<<4ANDS R2,R7 ;sectorADDS R2,R6 ;(track<<4) + sectorADDS R2,R3 ;+countLSLS R6,R7,#4 ;LDR R6,=0x0ff0ANDS R6,R2 ;track<<4LSLS R6,R6,#4 ;track<<8MOVS R1,#0x0fANDS R1,R2 ;sectorADDS R1,R6 ;(track<<4) + sector;return R1=next sectorPOP {PC}ALIGN 4readsectors__A__DCD 0readsectors__B__DCD 0readsectors__C__DCD 0 ;DCBwritesectors__A__DCD 0writesectors__B__DCD 0writesectors__C__DCD 0 ;DCBreadsectors__TRDBUF__DCD TRDBUFinclude "../_sdk/read.asm"include "token.asm"include "tokenz80.asm";include "../_sdk/lib.i";include "../_sdk/io.i"include "../_sdk/str.asm"include "../_sdk/io.asm";AREA HEAP, DATA, READWRITEinclude "../_sdk/io.var"include "../_sdk/read.var"include "../_sdk/fmttg.var"include "../_sdk/str.var"include "token.var"include "tokenz80.var"fnbuf__DCB "str.i"DCB 0END