diff --git a/applecorn.po b/applecorn.po index cb7022d..0991ccb 100644 Binary files a/applecorn.po and b/applecorn.po differ diff --git a/applecorn.s b/applecorn.s index 3631307..85eed73 100644 --- a/applecorn.s +++ b/applecorn.s @@ -229,6 +229,8 @@ MAINZP MAC + + diff --git a/auxmem.bytwrd.s b/auxmem.bytwrd.s index 5a6c107..2e67ed1 100644 --- a/auxmem.bytwrd.s +++ b/auxmem.bytwrd.s @@ -495,6 +495,8 @@ OSBM2 ASC ').' + + diff --git a/auxmem.chario.s b/auxmem.chario.s index ad83b06..216d19c 100644 --- a/auxmem.chario.s +++ b/auxmem.chario.s @@ -467,6 +467,8 @@ BYTE76 LDX #$00 ; Update LEDs and return X=SHIFT + + diff --git a/auxmem.gfx.s b/auxmem.gfx.s index 5ec1b80..983d177 100644 --- a/auxmem.gfx.s +++ b/auxmem.gfx.s @@ -327,3 +327,5 @@ RELCOORD CLC + + diff --git a/auxmem.hostfs.s b/auxmem.hostfs.s index 07b1b06..61eccbf 100644 --- a/auxmem.hostfs.s +++ b/auxmem.hostfs.s @@ -34,23 +34,23 @@ FSCMDLINE EQU $CE FINDHND PHX PHY PHA - CMP #$00 ; A=$00 = close + CMP #$00 ; A=$00 = close BEQ :CLOSE PHA - JSR PARSNAME ; Copy filename->MOSFILE - PLA ; Recover options + JSR PARSNAME ; Copy filename->MOSFILE + PLA ; Recover options >>> XF2MAIN,OFILE :CLOSE * >>> WRTMAIN * STY MOSFILE ; Write file number * >>> WRTAUX - >>> XF2MAIN,CFILE ; Pass A,Y to main code + >>> XF2MAIN,CFILE ; Pass A,Y to main code OSFINDRET >>> ENTAUX - JSR CHKERROR ; Check if error returned - PLY ; Value of A on entry - BNE :S1 ; It wasn't close - TYA ; Preserve A for close + JSR CHKERROR ; Check if error returned + PLY ; Value of A on entry + BNE :S1 ; It wasn't close + TYA ; Preserve A for close :S1 PLY PLX RTS @@ -65,14 +65,14 @@ OSGBPBM ASC 'OSGBPB.' * OSBPUT - write one byte to an open file BPUTHND PHX PHY - PHA ; Stash char to write + PHA ; Stash char to write * >>> WRTMAIN * STY MOSFILE ; File reference number * >>> WRTAUX - >>> XF2MAIN,FILEPUT ; Pass A,Y to main code + >>> XF2MAIN,FILEPUT ; Pass A,Y to main code OSBPUTRET >>> ENTAUX JSR CHKERROR - CLC ; Means no error + CLC ; Means no error PLA PLY PLX @@ -84,13 +84,13 @@ BGETHND PHX * >>> WRTMAIN * STY MOSFILE ; File ref number * >>> WRTAUX - >>> XF2MAIN,FILEGET ; Pass A,Y to main code + >>> XF2MAIN,FILEGET ; Pass A,Y to main code OSBGETRET >>> ENTAUX CPY #$01 - BCC :EXIT ; If no error, return CC + BCC :EXIT ; If no error, return CC LDA #$FE CPY #$4C - BEQ :EXIT ; If at EOF, return CS + BEQ :EXIT ; If at EOF, return CS TYA JSR CHKERROR :EXIT PLY @@ -120,15 +120,15 @@ ARGSHND PHX PHA CPY #$00 BNE :HASFILE - CMP #$00 ; Y=0,A=0 => current file sys + CMP #$00 ; Y=0,A=0 => current file sys BNE :S1 PLA - LDA #105 ; 105=AppleFS filing system + LDA #105 ; 105=AppleFS filing system PLY PLX RTS -:S1 CMP #$01 ; Y=0,A=1 => addr of CLI +:S1 CMP #$01 ; Y=0,A=1 => addr of CLI BNE :S2 LDA FSCMDLINE+0 STA $00,X @@ -137,33 +137,33 @@ ARGSHND PHX LDA #$FF STA $02,X STA $03,X - JMP OSARGSDONE ; Implemented + JMP OSARGSDONE ; Implemented -:S2 CMP #$FF ; Y=0,A=FF => flush all files +:S2 CMP #$FF ; Y=0,A=FF => flush all files BNE :IEXIT * >>> WRTMAIN * STZ MOSFILE ; Zero means flush all * >>> WRTAUX JMP :FLUSH -:IEXIT JMP :EXIT ; Exit preserved +:IEXIT JMP :EXIT ; Exit preserved :HASFILE * >>> WRTMAIN * STY MOSFILE ; File ref num * STX MOSFILE+1 ; Pointer to ZP control block * >>> WRTAUX - CMP #$00 ; Y!=0,A=0 => read seq ptr + CMP #$00 ; Y!=0,A=0 => read seq ptr BNE :S3 * >>> WRTMAIN * STZ MOSFILE+2 ; 0 means get pos * >>> WRTAUX TXA - >>> XF2MAIN,TELL ; A=ZP, Y=channel + >>> XF2MAIN,TELL ; A=ZP, Y=channel -:S3 CMP #$01 ; Y!=0,A=1 => write seq ptr +:S3 CMP #$01 ; Y!=0,A=1 => write seq ptr BNE :S4 >>> WRTMAIN - STY GMARKPL+1 ; Write to MLI control block + STY GMARKPL+1 ; Write to MLI control block LDA $00,X STA GMARKPL+2 LDA $01,X @@ -171,21 +171,21 @@ ARGSHND PHX LDA $02,X STA GMARKPL+4 >>> WRTAUX - >>> XF2MAIN,SEEK ; A=???, Y=channel + >>> XF2MAIN,SEEK ; A=???, Y=channel -:S4 CMP #$02 ; Y!=0,A=2 => read file len +:S4 CMP #$02 ; Y!=0,A=2 => read file len BNE :S5 * >>> WRTMAIN * STA MOSFILE+2 ; Non-zero means get len * >>> WRTAUX TXA - >>> XF2MAIN,SIZE ; A=ZP, Y=channel + >>> XF2MAIN,SIZE ; A=ZP, Y=channel -:S5 CMP #$FF ; Y!=0,A=FF => flush file +:S5 CMP #$FF ; Y!=0,A=FF => flush file BNE :EXIT :FLUSH >>> XF2MAIN,FLUSH -:EXIT PLA ; Unimplemented +:EXIT PLA ; Unimplemented PLY PLX RTS @@ -193,7 +193,7 @@ ARGSHND PHX OSARGSRET >>> ENTAUX JSR CHKERROR OSARGSDONE PLA - LDA #0 ; Implemented + LDA #0 ; Implemented PLY PLX RTS @@ -208,8 +208,8 @@ OSARGSDONE PLA * A=2 directory found * XY preserved * control block updated -OSFILEMIN EQU $FF ; $FF=LOAD -OSFILEMAX EQU $08 ; $08=MKDIR +OSFILEMIN EQU $FF ; $FF=LOAD +OSFILEMAX EQU $08 ; $08=MKDIR FILEHND PHX PHY @@ -219,23 +219,23 @@ FILEHND PHX CMP #OSFILEMAX+257-OSFILEMIN ; NB: LTR evaluation BCS FILEIGNORE - STX FSCTRL+0 ; FSCTRL=>control block + STX FSCTRL+0 ; FSCTRL=>control block STY FSCTRL+1 - LDA (FSCTRL) ; XY=>filename + LDA (FSCTRL) ; XY=>filename TAX LDY #$01 LDA (FSCTRL),Y TAY - JSR PARSNAME ; Copy filename->MOSFILE + JSR PARSNAME ; Copy filename->MOSFILE LDY #$11 >>> WRTMAIN -:L1 LDA (FSCTRL),Y ; Copy control block to auxmem +:L1 LDA (FSCTRL),Y ; Copy control block to auxmem STA FILEBLK,Y DEY BPL :L1 >>> WRTAUX - PLA ; Get action back + PLA ; Get action back >>> XF2MAIN,CALLFILE * BEQ :SAVE ; A=00 -> SAVE @@ -260,18 +260,18 @@ FILEHND PHX * On return here, A<$20 return to caller, A>$1F ProDOS error OSFILERET >>> ENTAUX - JSR CHKERROR ; Check if error returned + JSR CHKERROR ; Check if error returned PHA - LDY #$11 ; Copy updated control block back + LDY #$11 ; Copy updated control block back :L3 * LDA AUXBLK,Y ; Mainmem left it in AUXBLK - LDA OSFILECB,Y ; Mainmem left it in OSFILECB + LDA OSFILECB,Y ; Mainmem left it in OSFILECB STA (FSCTRL),Y DEY BPL :L3 -FILEIGNORE PLA ; Returned object type - PLY ; No error, return to caller +FILEIGNORE PLA ; Returned object type + PLY ; No error, return to caller PLX RTS @@ -286,34 +286,34 @@ OSFSCM ASC 'OSFSC.' * FSCCOMMAND ASC 'CHDIR' DB $C0 - DW FSCCHDIR-1 ; Change directory, XY=>params + DW FSCCHDIR-1 ; Change directory, XY=>params ASC 'CD' DB $C0 - DW FSCCHDIR-1 ; Change directory, XY=>params + DW FSCCHDIR-1 ; Change directory, XY=>params ASC 'DIR' DB $C0 - DW FSCCHDIR-1 ; Change directory, XY=>params + DW FSCCHDIR-1 ; Change directory, XY=>params * TO DO, CHDIR should be $80 for LPTR=>params ASC 'DRIVE' DB $80 - DW FSCDRIVE-1 ; Select drive, LPTR=>params + DW FSCDRIVE-1 ; Select drive, LPTR=>params ASC 'FREE' DB $80 - DW FSCFREE-1 ; FREE , LPTR=>params + DW FSCFREE-1 ; FREE , LPTR=>params ASC 'ACCESS' DB $80 - DW FSCACCESS-1 ; ACCESS , LPTR=>params + DW FSCACCESS-1 ; ACCESS , LPTR=>params ASC 'TITLE' DB $80 - DW FSCTITLE-1 ; TITLE () , LPTR=>params + DW FSCTITLE-1 ; TITLE (<drive>) <title>, LPTR=>params ASC 'DESTROY' DB $80 - DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params + DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params ASC 'COPY' DB $C0 - DW COPY-1 ; COPY <source> <dest>, XY=>params + DW COPY-1 ; COPY <source> <dest>, XY=>params * - DB $FF ; Terminator + DB $FF ; Terminator * OSFSC - miscellanous file system calls @@ -326,26 +326,26 @@ FSCCOMMAND ASC 'CHDIR' * FSCHND CMP #$00 - BEQ FSOPT ; A=0 - *OPT + BEQ FSOPT ; A=0 - *OPT CMP #$01 - BEQ CHKEOF ; A=1 - Read EOF + BEQ CHKEOF ; A=1 - Read EOF CMP #$02 - BEQ FSCRUN ; A=2 - */filename + BEQ FSCRUN ; A=2 - */filename CMP #$03 - BEQ FSC03 ; A=3 - *command + BEQ FSC03 ; A=3 - *command CMP #$04 - BEQ FSCRUN ; A=4 - *RUN + BEQ FSCRUN ; A=4 - *RUN CMP #$05 - BEQ JMPCAT ; A=5 - *CAT + BEQ JMPCAT ; A=5 - *CAT CMP #$09 - BEQ JMPCAT ; A=9 - *EX + BEQ JMPCAT ; A=9 - *EX CMP #$0A - BEQ JMPCAT ; A=10 - *INFO + BEQ JMPCAT ; A=10 - *INFO CMP #$0C - BEQ FSCREN ; A=12 - *RENAME + BEQ FSCREN ; A=12 - *RENAME * Performs OSFSC *OPT function -FSOPT RTS ; No FS options for now +FSOPT RTS ; No FS options for now FSCDRIVE JMP DRIVE @@ -373,29 +373,29 @@ FSC03 JSR XYtoLPTR BEQ FSCNULL JSR LPTRtoXY * -FSCRUN STX OSFILECB ; Pointer to filename +FSCRUN STX OSFILECB ; Pointer to filename STY OSFILECB+1 JSR XYtoLPTR -FSCRUNLP LDA (OSLPTR),Y ; Look for command line +FSCRUNLP LDA (OSLPTR),Y ; Look for command line INY CMP #'!' BCS FSCRUNLP DEY JSR SKIPSPC JSR LPTRtoXY - STX FSCMDLINE+0 ; Set CMDLINE=>command line - STY FSCMDLINE+1 ; Collected by OSARGS 1,0 - LDA #$FF ; OSFILE load flag - STA OSFILECB+6 ; Use file's address - LDX #<OSFILECB ; Pointer to control block + STX FSCMDLINE+0 ; Set CMDLINE=>command line + STY FSCMDLINE+1 ; Collected by OSARGS 1,0 + LDA #$FF ; OSFILE load flag + STA OSFILECB+6 ; Use file's address + LDX #<OSFILECB ; Pointer to control block LDY #>OSFILECB JSR OSFILE JSR :CALL - LDA #$00 ; A=0 on return + LDA #$00 ; A=0 on return RTS -:CALL LDA #$01 ; A=1 - entering code - SEC ; Not from RESET - JMP (OSFILECB+6) ; Jump to EXEC addr +:CALL LDA #$01 ; A=1 - entering code + SEC ; Not from RESET + JMP (OSFILECB+6) ; Jump to EXEC addr FSCREN JMP RENAME @@ -407,11 +407,11 @@ CHKEOF * >>> WRTMAIN * STX MOSFILE ; File reference number * >>> WRTAUX - TXA ; A=channel + TXA ; A=channel >>> XF2MAIN,FILEEOF CHKEOFRET >>> ENTAUX - TAX ; Return code -> X - TYA ; Y=any ProDOS error + TAX ; Return code -> X + TYA ; Y=any ProDOS error JMP CHKERROR @@ -419,28 +419,28 @@ CHKEOFRET >>> ENTAUX * A=5 *CAT, A=9 *EX, A=10 *INFO FSCCAT EOR #$06 CLC - ROR A ; 01100000=*CAT - ROR A ; 11100000=*EX - ROR A ; 10000000=*INFO - ROR A ; b7=long info - STA FSAREG ; b6=multiple items - JSR PARSNAME ; Copy filename->MOSFILE - LDA FSAREG ; Get ARG back + ROR A ; 01100000=*CAT + ROR A ; 11100000=*EX + ROR A ; 10000000=*INFO + ROR A ; b7=long info + STA FSAREG ; b6=multiple items + JSR PARSNAME ; Copy filename->MOSFILE + LDA FSAREG ; Get ARG back >>> XF2MAIN,CATALOG STARCATRET >>> ENTAUX - JSR CHKERROR ; See if error occurred + JSR CHKERROR ; See if error occurred JSR FORCENL * CATDONE - LDA #0 ; 0=OK + LDA #0 ; 0=OK RTS * Print one block of a catalog. Called by CATALOG * Block is in AUXBLK PRONEBLK >>> ENTAUX - LDA AUXBLK+4 ; Get storage type - AND #$E0 ; Mask 3 MSBs + LDA AUXBLK+4 ; Get storage type + AND #$E0 ; Mask 3 MSBs CMP #$E0 - BNE :NOTKEY ; Not a key block + BNE :NOTKEY ; Not a key block LDA #<:DIRM LDY #>:DIRM JSR PRSTR @@ -454,7 +454,7 @@ PRONEBLK >>> ENTAUX JSR OSNEWL :L1X PLA INC - CMP #13 ; Number of dirents in block + CMP #13 ; Number of dirents in block CLC BNE :L1 >>> XF2MAIN,CATALOGRET @@ -465,14 +465,14 @@ PRONEBLK >>> ENTAUX * On entry: A = dirent index in AUXBLK PRONEENT PHP TAX - LDA #<AUXBLK+4 ; Skip pointers + LDA #<AUXBLK+4 ; Skip pointers STA ZP3 LDA #>AUXBLK+4 STA ZP3+1 :L1 CPX #$00 BEQ :S1 CLC - LDA #$27 ; Size of dirent + LDA #$27 ; Size of dirent ADC ZP3 STA ZP3 LDA #$00 @@ -482,8 +482,8 @@ PRONEENT PHP BRA :L1 :S1 LDY #$00 LDA (ZP3),Y - BEQ :EXIT1 ; Inactive entry - AND #$0F ; Len of filename + BEQ :EXIT1 ; Inactive entry + AND #$0F ; Len of filename TAX LDY #$01 :L2 CPX #$00 @@ -566,11 +566,11 @@ PRSPACE LDA #' ' * Perform FSCV $0C RENAME function * Parameter string in XY -RENAME JSR PARSNAME ; Copy Arg1->MOSFILE - CMP #$00 ; Length of arg1 +RENAME JSR PARSNAME ; Copy Arg1->MOSFILE + CMP #$00 ; Length of arg1 BEQ :SYNTAX - JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 - CMP #$00 ; Length of arg2 + JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 + CMP #$00 ; Length of arg2 BEQ :SYNTAX >>> XF2MAIN,RENFILE :SYNTAX BRK @@ -585,11 +585,11 @@ RENRET * Perform *COPY function * Parameter string in XY -COPY JSR PARSNAME ; Copy Arg1->MOSFILE - CMP #$00 ; Length of arg1 +COPY JSR PARSNAME ; Copy Arg1->MOSFILE + CMP #$00 ; Length of arg1 BEQ :SYNTAX - JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 - CMP #$00 ; Length of arg2 + JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 + CMP #$00 ; Length of arg2 BEQ :SYNTAX >>> XF2MAIN,COPYFILE :SYNTAX BRK @@ -604,8 +604,8 @@ COPYRET * Handle *DIR (directory change) command * On entry, XY points to command line -CHDIR JSR PARSNAME ; Copy filename->MOSFILE - CMP #$00 ; Filename length +CHDIR JSR PARSNAME ; Copy filename->MOSFILE + CMP #$00 ; Filename length BNE :HASPARM BRK DB $DC @@ -615,11 +615,11 @@ CHDIR JSR PARSNAME ; Copy filename->MOSFILE * Handle *DRIVE command, which is similar * On entry, (OSLPTR),Y points to command line -DRIVE LDA (OSLPTR),Y ; First char - CMP #$3A ; Colon +DRIVE LDA (OSLPTR),Y ; First char + CMP #$3A ; Colon BNE :ERR - JSR PARSLPTR ; Copy arg->MOSFILE - CMP #$03 ; Check 3 char arg + JSR PARSLPTR ; Copy arg->MOSFILE + CMP #$03 ; Check 3 char arg BEQ :HASPARM :ERR BRK DB $DC @@ -633,17 +633,17 @@ CHDIRRET CMP #$00 BEQ :EXIT BRK - DB $CE ; Bad directory + DB $CE ; Bad directory ASC 'Bad dir' BRK :EXIT RTS * Handle *FREE command -FREE LDA (OSLPTR),Y ; First char - CMP #$3A ; Colon +FREE LDA (OSLPTR),Y ; First char + CMP #$3A ; Colon BNE :ERR - JSR PARSLPTR ; Copy arg->MOSFILE - CMP #$03 ; Check 3 char arg + JSR PARSLPTR ; Copy arg->MOSFILE + CMP #$03 ; Check 3 char arg BEQ :HASPARM :ERR BRK DB $DC @@ -657,29 +657,29 @@ FREERET CMP #$00 BEQ :NOERR BRK - DB $CE ; Bad directory + DB $CE ; Bad directory ASC 'Bad dir' BRK :NOERR SEC - LDA AUXBLK+2 ; LSB of total blks - SBC AUXBLK+0 ; LSB of blocks used + LDA AUXBLK+2 ; LSB of total blks + SBC AUXBLK+0 ; LSB of blocks used TAX - LDA AUXBLK+3 ; MSB of total blks - SBC AUXBLK+1 ; MSB of blocks used + LDA AUXBLK+3 ; MSB of total blks + SBC AUXBLK+1 ; MSB of blocks used TAY - LDA #$00 ; *TO DO* b16-b23 of free + LDA #$00 ; *TO DO* b16-b23 of free * NEW - JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes ' + JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes ' LDX #<:FREE LDY #>:FREE - JSR OUTSTR ; Print 'free'<nl> - LDX AUXBLK+0 ; Blocks used + JSR OUTSTR ; Print 'free'<nl> + LDX AUXBLK+0 ; Blocks used LDY AUXBLK+1 - LDA #$00 ; *TO DO* b16-b23 of used - JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes ' + LDA #$00 ; *TO DO* b16-b23 of used + JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes ' LDX #<:USED LDY #>:USED - JMP OUTSTR ; Print 'used'<nl> + JMP OUTSTR ; Print 'used'<nl> * OLD * JSR PRDECXY ; Print in decimal @@ -702,20 +702,20 @@ FREERET STA FSNUM+3 * What's the maximum number of blocks? * JSR PRHEX ; Blocks b16-b23 in hex - JSR PR2HEX ; Blocks b0-b15 in hex + JSR PR2HEX ; Blocks b0-b15 in hex LDX #<:BLOCKS LDY #>:BLOCKS - JSR OUTSTR ; ' blocks ' - STZ FSNUM+0 ; FSNUM=blocks*512 + JSR OUTSTR ; ' blocks ' + STZ FSNUM+0 ; FSNUM=blocks*512 ASL FSNUM+1 ROL FSNUM+2 ROL FSNUM+3 - LDX #FSNUM ; X=>number to print - LDY #8 ; Y=pad up to 8 digits - JSR PRINTDEC ; Print it in decimal + LDX #FSNUM ; X=>number to print + LDY #8 ; Y=pad up to 8 digits + JSR PRINTDEC ; Print it in decimal LDX #<:BYTES LDY #>:BYTES - JMP OUTSTR ; ' bytes ' + JMP OUTSTR ; ' bytes ' :BLOCKS ASC ' blocks ' DB 0 :BYTES ASC ' bytes ' @@ -731,10 +731,10 @@ FREERET *:USEDM ASC ' 512-byte Blocks Used' * DB $00 -ACCESS JSR PARSLPTR ; Copy filename->MOSFILE - CMP #$00 ; Filename length +ACCESS JSR PARSLPTR ; Copy filename->MOSFILE + CMP #$00 ; Filename length BEQ :SYNTAX - JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 + JSR PARSLPTR2 ; Copy Arg2->MOSFILE2 >>> XF2MAIN,SETPERM :SYNTAX BRK DB $DC @@ -746,8 +746,8 @@ ACCRET >>> ENTAUX LDA #$00 RTS -DESTROY JSR PARSLPTR ; Copy filename->MOSFILE - CMP #$00 ; Filename length +DESTROY JSR PARSLPTR ; Copy filename->MOSFILE + CMP #$00 ; Filename length BEQ :SYNTAX >>> XF2MAIN,MULTIDEL :SYNTAX BRK @@ -764,46 +764,46 @@ DESTRET >>> ENTAUX * Write filename to MOSFILE in main memory * Returns length in A PARSNAME JSR XYtoLPTR -PARSLPTR CLC ; Means parsing a filename - JSR GSINIT ; Init gen string handling +PARSLPTR CLC ; Means parsing a filename + JSR GSINIT ; Init gen string handling PHP - SEI ; Disable IRQs - LDX #$00 ; Length -:L1 JSR GSREAD ; Handle next char + SEI ; Disable IRQs + LDX #$00 ; Length +:L1 JSR GSREAD ; Handle next char BCS :DONE - STA $C004 ; Write to main mem + STA $C004 ; Write to main mem STA MOSFILE+1,X - STA $C005 ; Write to aux mem + STA $C005 ; Write to aux mem INX BNE :L1 -:DONE STA $C004 ; Write to main mem - STX MOSFILE ; Length byte (Pascal) - STA $C005 ; Back to aux - PLP ; IRQs back as they were - TXA ; Return len in A +:DONE STA $C004 ; Write to main mem + STX MOSFILE ; Length byte (Pascal) + STA $C005 ; Back to aux + PLP ; IRQs back as they were + TXA ; Return len in A RTS * Parse filename pointed to by (OSLPTR),Y * Write filename to MOSFILE2 in main memory * Returns length in A PARSNAME2 JSR XYtoLPTR -PARSLPTR2 CLC ; Means parsing a filename - JSR GSINIT ; Init gen string handling +PARSLPTR2 CLC ; Means parsing a filename + JSR GSINIT ; Init gen string handling PHP - SEI ; Disable IRQs - LDX #$00 ; Length -:L1 JSR GSREAD ; Handle next char + SEI ; Disable IRQs + LDX #$00 ; Length +:L1 JSR GSREAD ; Handle next char BCS :DONE - STA $C004 ; Write to main mem + STA $C004 ; Write to main mem STA MOSFILE2+1,X - STA $C005 ; Write to aux mem + STA $C005 ; Write to aux mem INX BNE :L1 -:DONE STA $C004 ; Write to main mem - STX MOSFILE2 ; Length byte (Pascal) - STA $C005 ; Back to aux - PLP ; IRQs back as they were - TXA ; Return len in A +:DONE STA $C004 ; Write to main mem + STX MOSFILE2 ; Length byte (Pascal) + STA $C005 ; Back to aux + PLP ; IRQs back as they were + TXA ; Return len in A RTS * Move this somewhere @@ -812,11 +812,11 @@ CHKERROR CMP #$20 RTS *ERREXISTS LDA #$47 ; File exists -ERRNOTFND LDA #$46 ; File not found +ERRNOTFND LDA #$46 ; File not found MKERROR BIT $E0 - BPL MKERROR1 ; *TEST* + BPL MKERROR1 ; *TEST* PHA LDX #15 MKERRLP @@ -852,13 +852,13 @@ ERRMSG MKERROR1 CMP #$40 BCS MKERROR2 - ORA #$30 ; <$40 -> $30-$3F + ORA #$30 ; <$40 -> $30-$3F MKERROR2 SEC SBC #$37 CMP #$28 BCC MKERROR3 - LDA #$00 ; I/O error + LDA #$00 ; I/O error MKERROR3 ASL A TAX @@ -922,67 +922,68 @@ MKERROR4 DW ERROR27 * AcornOS ProDOS ERROR40 DW $CC00 - ASC 'Bad filename' ; $40 - Invalid pathname syntax + ASC 'Bad filename' ; $40 - Invalid pathname syntax ERROR41 DW $C400 - ASC 'Is a directory' ; $41 - Duplicate filename (split from $47) + ASC 'Is a directory' ; $41 - Duplicate filename (split from $47) ERROR42 DW $C000 - ASC 'Too many open' ; $42 - File Control Block table full + ASC 'Too many open' ; $42 - File Control Block table full ERROR43 DW $DE00 - ASC 'Channel not open' ; $43 - Invalid reference number -ERROR44 ; $44 - Path not found + ASC 'Channel not open' ; $43 - Invalid reference number +ERROR44 ; $44 - Path not found ERROR46 DW $D600 - ASC 'File not found' ; $46 - File not found + ASC 'File not found' ; $46 - File not found ERROR45 DW $D600 - ASC 'Disk not found' ; $45 - Volume directory not found + ASC 'Disk not found' ; $45 - Volume directory not found ERROR47 DW $C400 - ASC 'File exists' ; $47 - Duplicate filename (see also $41) + ASC 'File exists' ; $47 - Duplicate filename (see also $41) ERROR48 DW $C600 - ASC 'Disk full' ; $48 - Overrun error + ASC 'Disk full' ; $48 - Overrun error ERROR49 DW $B300 - ASC 'Directory full' ; $49 - Volume directory full -ERROR4A ; $4A - Incompatible file format -ERROR4B ; $4B - Unsupported storage_type + ASC 'Directory full' ; $49 - Volume directory full +ERROR4A ; $4A - Incompatible file format +ERROR4B ; $4B - Unsupported storage_type ERROR52 DW $C800 - ASC 'Disk not recognised' ; $52 - Not a ProDOS disk + ASC 'Disk not recognised' ; $52 - Not a ProDOS disk ERROR4C DW $DF00 - ASC 'End of file' ; $4C - End of file has been encountered + ASC 'End of file' ; $4C - End of file has been encountered ERROR4D DW $C100 - ASC 'Not open for update' ; $4D - Position out of range + ASC 'Not open for update' ; $4D - Position out of range ERROR4E DW $BD00 - ASC 'Insufficient access' ; $4E - Access error (see also $4F) + ASC 'Insufficient access' ; $4E - Access error (see also $4F) ERROR4F DW $C300 - ASC 'Entry locked' ; $4F - Access error (split from $4E) + ASC 'Entry locked' ; $4F - Access error (split from $4E) ERROR50 DW $C200 ASC 'Can' DB $27 - ASC 't - file open' ; $50 - File is open + ASC 't - file open' ; $50 - File is open ERROR51 DW $A800 - ASC 'Broken directory' ; $51 - Directory count error + ASC 'Broken directory' ; $51 - Directory count error ERROR53 DW $DC00 - ASC 'Invalid parameter' ; $53 - Invalid parameter + ASC 'Invalid parameter' ; $53 - Invalid parameter ERROR54 DW $D400 - ASC 'Directory not empty' ; $54 - Directory not empty + ASC 'Directory not empty' ; $54 - Directory not empty ERROR55 DW $FF00 - ASC 'ProDOS: VCB full' ; $55 - Volume Control Block table full + ASC 'ProDOS: VCB full' ; $55 - Volume Control Block table full ERROR56 DW $FF00 - ASC 'ProDOS: Bad addr' ; $56 - Bad buffer address + ASC 'ProDOS: Bad addr' ; $56 - Bad buffer address ERROR57 DW $FF00 - ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume -ERROR5B ; spare + ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume +ERROR5B ; spare ERROR27 DW $FF00 - ASC 'I/O error' ; $27 - I/O error + ASC 'I/O error' ; $27 - I/O error ERROR28 DW $D200 - ASC 'Disk not present' ; $28 - No device detected/connected + ASC 'Disk not present' ; $28 - No device detected/connected ERROR5A DW $FF00 - ASC 'Sector not found' ; $5A - Bit map disk address is impossible + ASC 'Sector not found' ; $5A - Bit map disk address is impossible ERROR2B DW $C900 - ASC 'Disk write protected'; $2B - Disk write protected + ASC 'Disk write protected' ; $2B - Disk write protected ERROR5D DW $CA00 - ASC 'Data lost' ; $5D - EOF during LOAD or SAVE + ASC 'Data lost' ; $5D - EOF during LOAD or SAVE ERROR5E DW $C000 ASC 'Can' DB $27 - ASC 't save' ; $5E - Couldn't open for save + ASC 't save' ; $5E - Couldn't open for save ERROR2E DW $C800 - ASC 'Disk changed' ; $2E - Disk switched + ASC 'Disk changed' ; $2E - Disk switched DB $00 + diff --git a/auxmem.init.s b/auxmem.init.s index d09f77c..9206228 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -138,8 +138,8 @@ MOSHIGH SEI * X=ROM number to select * BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET - JSR ROMSELECT ; Bring ROM X into memory - STX BYTEVARBASE+$FC ; Set current language ROM + JSR ROMSELECT ; Bring ROM X into memory + STX BYTEVARBASE+$FC ; Set current language ROM LDA #$00 STA FAULT+0 LDA #$80 @@ -156,27 +156,27 @@ BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET * OSBYTE $8F - Issue service call * X=service call, Y=parameter * -SERVICE TAX ; Enter here with A=Service Num +SERVICE TAX ; Enter here with A=Service Num BYTE8F SERVICEX LDA $F4 - PHA ; Save current ROM + PHA ; Save current ROM TXA - LDX MAXROM ; Start at highest ROM -:SERVLP JSR ROMSELECT ; Bring it into memory + LDX MAXROM ; Start at highest ROM +:SERVLP JSR ROMSELECT ; Bring it into memory BIT $8006 - BPL :SERVSKIP ; No service entry - JSR $8003 ; Call service entry + BPL :SERVSKIP ; No service entry + JSR $8003 ; Call service entry TAX BEQ :SERVDONE -:SERVSKIP LDX $F4 ; Restore X=current ROM - DEX ; Step down to next - BPL :SERVLP ; Loop until ROM 0 done -:SERVDONE PLA ; Get caller's ROM back - PHX ; Save return from service call +:SERVSKIP LDX $F4 ; Restore X=current ROM + DEX ; Step down to next + BPL :SERVLP ; Loop until ROM 0 done +:SERVDONE PLA ; Get caller's ROM back + PHX ; Save return from service call TAX - JSR ROMSELECT ; Restore caller's ROM - PLX ; Get return value back - TXA ; Return in A and X and set EQ/NE + JSR ROMSELECT ; Restore caller's ROM + PLX ; Get return value back + TXA ; Return in A and X and set EQ/NE RTS @@ -195,3 +195,5 @@ HELLO ASC 'Applecorn MOS 2021-10-24' DB $00 ; Unify MOS messages + + diff --git a/auxmem.misc.s b/auxmem.misc.s index 2dc4d8b..cb053e0 100644 --- a/auxmem.misc.s +++ b/auxmem.misc.s @@ -11,28 +11,28 @@ ************************************ * Read input device or buffer status -BYTE80 LDY #$00 ; Prepare return=&00xx - TXA ; X<0 - info about buffers - BMI ADVALBUF ; X>=0 - read input devices +BYTE80 LDY #$00 ; Prepare return=&00xx + TXA ; X<0 - info about buffers + BMI ADVALBUF ; X>=0 - read input devices CPX #$7F BNE ADVALNONE ADVALWAIT JSR KBDREAD BCS ADVALWAIT TAX - BPL ADVALOK1 ; &00xx for normal keys - INY ; &01xx for function/edit keys + BPL ADVALOK1 ; &00xx for normal keys + INY ; &01xx for function/edit keys ADVALOK1 RTS -ADVALNONE LDX #$00 ; Input, just return 0 +ADVALNONE LDX #$00 ; Input, just return 0 RTS ADVALBUF INX - BEQ :ADVALKBD ; Fake keyboard buffer + BEQ :ADVALKBD ; Fake keyboard buffer INX - BEQ :ADVALOK ; Serial input, return 0 - LDX #$01 ; For outputs, return 1 char free + BEQ :ADVALOK ; Serial input, return 0 + LDX #$01 ; For outputs, return 1 char free RTS -:ADVALKBD BIT $C000 ; Test keyboard data/strobe - BPL :ADVALOK ; No Strobe, return 0 - INX ; Strobe, return 1 +:ADVALKBD BIT $C000 ; Test keyboard data/strobe + BPL :ADVALOK ; No Strobe, return 0 + INX ; Strobe, return 1 :ADVALOK RTS @@ -57,21 +57,21 @@ ADVALBUF INX * (8 * frequency ) * BEEPX EQU #57 ; note=C5 -BEEPX EQU #116 ; note=C4 +BEEPX EQU #116 ; note=C4 BEEP PHA PHX PHY - LDY #$00 ; duration -:L1 LDX #BEEPX ; 2cy pitch 2cy + LDY #$00 ; duration +:L1 LDX #BEEPX ; 2cy pitch 2cy *------------------------------------------------------ -:L2 DEX ; 2cy BEEPX * 2cy - BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy +:L2 DEX ; 2cy BEEPX * 2cy + BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy *------------------------------------------------------ * BEEPX*5-1cy - LDA $C030 ; 4cy BEEPX*5+5 - DEY ; 2cy BEEPX*5+7 - BNE :L1 ; 3cy/2cy BEEPX*5+10 - PLY ; + LDA $C030 ; 4cy BEEPX*5+5 + DEY ; 2cy BEEPX*5+7 + BNE :L1 ; 3cy/2cy BEEPX*5+10 + PLY ; PLX PLA RTS @@ -81,9 +81,9 @@ BEEP PHA OUTSTR TXA * Print string pointed to by A,Y to the screen -PRSTR STA OSTEXT+0 ; String in A,Y +PRSTR STA OSTEXT+0 ; String in A,Y STY OSTEXT+1 -:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT +:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT BEQ PRSTROK JSR OSASCI INC OSTEXT @@ -102,7 +102,7 @@ FORCENL LDA #$86 * Print XY in hex OUT2HEX TYA JSR OUTHEX - TXA ; Continue into OUTHEX + TXA ; Continue into OUTHEX * Print hex byte in A OUTHEX PHA @@ -113,16 +113,16 @@ OUTHEX PHA AND #$0F JSR PRNIB PLA - AND #$0F ; Continue into PRNIB + AND #$0F ; Continue into PRNIB * Print hex nibble in A PRNIB CMP #$0A BCC :S1 - CLC ; >= $0A + CLC ; >= $0A ADC #'A'-$0A JSR OSWRCH RTS -:S1 ADC #'0' ; < $0A +:S1 ADC #'0' ; < $0A JMP OSWRCH * TEMP ENTRY * @@ -144,35 +144,35 @@ OSPAD EQU OSTEXT+4 * X=>four byte zero page locations * Y= number of digits to pad to, 0 for no padding * -PRINTDEC sty OSPAD ; Number of padding+digits - ldy #0 ; Digit counter -PRDECDIGIT lda #32 ; 32-bit divide +PRINTDEC sty OSPAD ; Number of padding+digits + ldy #0 ; Digit counter +PRDECDIGIT lda #32 ; 32-bit divide sta OSTEMP - lda #0 ; Remainder=0 - clv ; V=0 means div result = 0 -PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10 + lda #0 ; Remainder=0 + clv ; V=0 means div result = 0 +PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10 bcc PRDEC10 - sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0 - sec ; Shift 1 into div result -PRDEC10 rol 0,x ; Shift /10 result into OSNUM + sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0 + sec ; Shift 1 into div result +PRDEC10 rol 0,x ; Shift /10 result into OSNUM rol 1,x rol 2,x rol 3,x - rol a ; Shift bits of input into acc (input mod 10) + rol a ; Shift bits of input into acc (input mod 10) dec OSTEMP - bne PRDECDIV10 ; Continue 32-bit divide + bne PRDECDIV10 ; Continue 32-bit divide ora #48 - pha ; Push low digit 0-9 to print + pha ; Push low digit 0-9 to print iny - bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit + bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit lda #32 PRDECLP1 cpy OSPAD - bcs PRDECLP2 ; Enough padding pushed - pha ; Push leading space characters + bcs PRDECLP2 ; Enough padding pushed + pha ; Push leading space characters iny bne PRDECLP1 -PRDECLP2 pla ; Pop character left to right - jsr OSWRCH ; Print it +PRDECLP2 pla ; Pop character left to right + jsr OSWRCH ; Print it dey bne PRDECLP2 rts @@ -193,16 +193,16 @@ PRDECLP2 pla ; Pop character left to right * Very difficult to write this without it being a direct clone * from the BBC MOS. ;) * -GSINTGO ROR GSFLAG ; CY initially into bit 7 - JSR SKIPSPC ; Skip any spaces - INY ; Step past in case it's a quote - CMP #$22 ; Is it a quote? +GSINTGO ROR GSFLAG ; CY initially into bit 7 + JSR SKIPSPC ; Skip any spaces + INY ; Step past in case it's a quote + CMP #$22 ; Is it a quote? BEQ GSINTGO1 - DEY ; Wasn't a quote, step back - CLC ; Prepare CC=no leading quote -GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags + DEY ; Wasn't a quote, step back + CLC ; Prepare CC=no leading quote +GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags CMP #$0D - RTS ; Return EQ if end of line + RTS ; Return EQ if end of line * GSFLAG set to: * bit7: leading quote found * bit6: CC=filename CS=*KEY @@ -245,13 +245,13 @@ GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags * INX:BNE loop * done * -GSRDGO LDA #$00 ; Prepare to clear accumulator -GSREADLP STA GSCHAR ; Update accumulator - LDA (OSLPTR),Y ; Get current character - CMP #$0D ; End of line? - BNE GSREAD2 ; No, check character +GSRDGO LDA #$00 ; Prepare to clear accumulator +GSREADLP STA GSCHAR ; Update accumulator + LDA (OSLPTR),Y ; Get current character + CMP #$0D ; End of line? + BNE GSREAD2 ; No, check character BIT GSFLAG - BPL GSREADEND ; We aren't waiting for a closing quote + BPL GSREADEND ; We aren't waiting for a closing quote * ; End of line before closing quote ERRBADSTR BRK DB $FD @@ -259,54 +259,54 @@ ERRBADSTR BRK BRK GSREAD2 CMP #' ' - BCC ERRBADSTR ; Embedded control char - BNE GSREAD3 ; Not a space, process it - BIT GSFLAG ; Can space terminate string? - BMI GSREADCHAR ; We're waiting for a terminating quote + BCC ERRBADSTR ; Embedded control char + BNE GSREAD3 ; Not a space, process it + BIT GSFLAG ; Can space terminate string? + BMI GSREADCHAR ; We're waiting for a terminating quote * ; so return the space character - BVC GSREADEND ; Space is a terminator, finish -GSREAD3 CMP #$22 ; Is it a quote? - BNE GSREADESC ; Not quote, check for escapes - BIT GSFLAG ; Was there an opening quote? - BPL GSREADCHAR ; Not waiting for a closing quote - INY ; Waiting for quote, check next character + BVC GSREADEND ; Space is a terminator, finish +GSREAD3 CMP #$22 ; Is it a quote? + BNE GSREADESC ; Not quote, check for escapes + BIT GSFLAG ; Was there an opening quote? + BPL GSREADCHAR ; Not waiting for a closing quote + INY ; Waiting for quote, check next character LDA (OSLPTR),Y - CMP #$22 ; Is it another quote? - BEQ GSREADCHAR ; Quote-Quote, expand to single quote + CMP #$22 ; Is it another quote? + BEQ GSREADCHAR ; Quote-Quote, expand to single quote * End of string * Either closing quote, or a space seperator, or end of line -GSREADEND JSR SKIPSPC ; Skip any spaces to next word - SEC ; SEC=end of string - RTS ; and (OSLPTR),Y=>next word or end of line +GSREADEND JSR SKIPSPC ; Skip any spaces to next word + SEC ; SEC=end of string + RTS ; and (OSLPTR),Y=>next word or end of line * CS=end of string * EQ=end of line * NE=not end of line, more words follow -GSREADESC CMP #$7C ; Is it '|' escape character - BNE GSREADCHAR ; No, return as character - INY ; Step to next character +GSREADESC CMP #$7C ; Is it '|' escape character + BNE GSREADCHAR ; No, return as character + INY ; Step to next character LDA (OSLPTR),Y CMP #$7C - BEQ GSREADCHAR ; bar-bar expands to bar + BEQ GSREADCHAR ; bar-bar expands to bar CMP #$22 - BEQ GSREADCHAR ; bar-quote expands to quote - CMP #'!' ; Is it bar-pling? - BNE GSREAD5 ; No, check for bar-letter - INY ; Step past it - LDA #$80 ; Set bit 7 in accumulator - BNE GSREADLP ; Loop back to check next character(s) + BEQ GSREADCHAR ; bar-quote expands to quote + CMP #'!' ; Is it bar-pling? + BNE GSREAD5 ; No, check for bar-letter + INY ; Step past it + LDA #$80 ; Set bit 7 in accumulator + BNE GSREADLP ; Loop back to check next character(s) -GSREAD5 CMP #'?' ; Check for '?' - BCC ERRBADSTR ; <'?', bad character - BEQ GSREADDEL ; bar-query -> DEL - AND #$1F ; Convert bar-letter to control code - BIT SETV ; SEV=control character +GSREAD5 CMP #'?' ; Check for '?' + BCC ERRBADSTR ; <'?', bad character + BEQ GSREADDEL ; bar-query -> DEL + AND #$1F ; Convert bar-letter to control code + BIT SETV ; SEV=control character BVS GSREADOK GSREADDEL LDA #$7F -GSREADCHAR CLV ; CLV=not control character -GSREADOK INY ; Step to next character - ORA GSCHAR ; Add in any bit 7 from |! prefix - CLC ; CLC=not end of string +GSREADCHAR CLV ; CLV=not control character +GSREADOK INY ; Step to next character + ORA GSCHAR ; Add in any bit 7 from |! prefix + CLC ; CLC=not end of string RTS * CC=not end of string * VS=control character @@ -318,16 +318,16 @@ GSREADOK INY ; Step to next character * On exit, A=byte read, X=current ROM, Y=$00 RDROM LDA $F4 PHA - JSR ROMSELECT ; Page in the required ROM + JSR ROMSELECT ; Page in the required ROM LDY #$00 - LDA ($F6),Y ; Read the byte + LDA ($F6),Y ; Read the byte PLX * Select a sideways ROM * X=ROM to select * All registers must be preserved ROMSELECT CPX $F4 - BEQ :ROMSELOK ; Already selected + BEQ :ROMSELOK ; Already selected * Insert code here for faking sideways ROMs by loading or otherwise * fetching code to $8000. All registers must be preserved. @@ -337,21 +337,21 @@ ROMSELECT CPX $F4 TXA ASL A TAX - LDA ROMTAB,X ; LSB of pointer to name + LDA ROMTAB,X ; LSB of pointer to name STA OSFILECB+0 - LDA ROMTAB+1,X ; MSB of pointer to name + LDA ROMTAB+1,X ; MSB of pointer to name STA OSFILECB+1 - STZ OSFILECB+2 ; Dest address $8000 + STZ OSFILECB+2 ; Dest address $8000 LDA #$80 STA OSFILECB+3 LDX #<OSFILECB LDY #>OSFILECB - LDA #$FF ; Means 'LOAD' + LDA #$FF ; Means 'LOAD' JSR OSFILE PLY PLX PLA - STX $F4 ; Set Current ROM number + STX $F4 ; Set Current ROM number :ROMSELOK EVENT RTS @@ -379,14 +379,14 @@ PASCROM1 ASC 'PASC.1.10.1.ROM' PASCROM2 ASC 'PASC.1.10.2.ROM' DB $0D,$00 -MAXROM DB $00 ; Index of highest sideways ROM +MAXROM DB $00 ; Index of highest sideways ROM * Initialize ROMTAB according to user selection in menu -INITROMS STZ MAXROM ; One sideways ROM only - STA $C002 ; Read main mem +INITROMS STZ MAXROM ; One sideways ROM only + STA $C002 ; Read main mem LDA USERSEL - STA $C003 ; Read aux mem - ASL ; x2 + STA $C003 ; Read aux mem + ASL ; x2 CLC ADC #<ROMS STA OSLPTR+0 @@ -399,18 +399,18 @@ INITROMS STZ MAXROM ; One sideways ROM only INY LDA (OSLPTR),Y STA ROMTAB+1 - STA $C002 ; Read main mem + STA $C002 ; Read main mem LDA USERSEL - STA $C003 ; Read aux mem - CMP #6 ; Menu entry 7 has two ROMs + STA $C003 ; Read aux mem + CMP #6 ; Menu entry 7 has two ROMs BNE :S1 LDA #<PASCROM2 STA ROMTAB+2 LDA #>PASCROM2 STA ROMTAB+3 - INC MAXROM ; Two ROMs + INC MAXROM ; Two ROMs BRA :DONE -:S1 CMP #7 ; Menu entry 8 +:S1 CMP #7 ; Menu entry 8 BNE :DONE LDA #<PASCROM1 STA ROMTAB+0 @@ -444,29 +444,29 @@ INITROMS STZ MAXROM ; One sideways ROM only STA ROMTAB+14 LDA #>BASICROM STA ROMTAB+15 - LDA #7 ; 8 sideways ROMs + LDA #7 ; 8 sideways ROMs STA MAXROM :DONE LDA #$FF - STA $F4 ; Force ROM to load + STA $F4 ; Force ROM to load RTS * Active sideways ROMs -ROMTAB DW $0000 ; ROM0 - DW $0000 ; ROM1 - DW $0000 ; ROM2 - DW $0000 ; ROM3 - DW $0000 ; ROM4 - DW $0000 ; ROM5 - DW $0000 ; ROM6 - DW $0000 ; ROM7 - DW $0000 ; ROM8 - DW $0000 ; ROM9 - DW $0000 ; ROMA - DW $0000 ; ROMB - DW $0000 ; ROMC - DW $0000 ; ROMD - DW $0000 ; ROME - DW $0000 ; ROMF +ROMTAB DW $0000 ; ROM0 + DW $0000 ; ROM1 + DW $0000 ; ROM2 + DW $0000 ; ROM3 + DW $0000 ; ROM4 + DW $0000 ; ROM5 + DW $0000 ; ROM6 + DW $0000 ; ROM7 + DW $0000 ; ROM8 + DW $0000 ; ROM9 + DW $0000 ; ROMA + DW $0000 ; ROMB + DW $0000 ; ROMC + DW $0000 ; ROMD + DW $0000 ; ROME + DW $0000 ; ROMF * ROM filenames in same order as in the menu * ROMMENU copies these to ROMTAB upon user selection @@ -491,7 +491,7 @@ ROMS DW BASICROM ********************************************************** * Invoked from GSBRK in main memory. On IIgs only. -GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI +GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI * Continue into IRQBRKHDLR * TO DO: Check, IENTAUX modifies X @@ -499,43 +499,43 @@ GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI IRQBRKHDLR PHA * Mustn't enable IRQs within the IRQ handler * Do not use WRTMAIN/WRTAUX macros - STA $C004 ; Write to main memory - STA $45 ; $45=A for ProDOS IRQ handlers - STA $C005 ; Write to aux memory + STA $C004 ; Write to main memory + STA $45 ; $45=A for ProDOS IRQ handlers + STA $C005 ; Write to aux memory TXA PHA CLD TSX - LDA $103,X ; Get PSW from stack + LDA $103,X ; Get PSW from stack AND #$10 - BEQ :IRQ ; IRQ + BEQ :IRQ ; IRQ SEC LDA $0104,X SBC #$01 - STA FAULT+0 ; FAULT=>error block after BRK + STA FAULT+0 ; FAULT=>error block after BRK LDA $0105,X SBC #$00 STA FAULT+1 - LDA $F4 ; Get current ROM - STA BYTEVARBASE+$BA ; Set ROM at last BRK - STX OSXREG ; Pass stack pointer - LDA #$06 ; Service Call 6 = BRK occured + LDA $F4 ; Get current ROM + STA BYTEVARBASE+$BA ; Set ROM at last BRK + STX OSXREG ; Pass stack pointer + LDA #$06 ; Service Call 6 = BRK occured JSR SERVICE - LDX BYTEVARBASE+$FC ; Get current language - JSR ROMSELECT ; Bring it into memory + LDX BYTEVARBASE+$FC ; Get current language + JSR ROMSELECT ; Bring it into memory PLA TAX PLA CLI - JMP (BRKV) ; Pass on to BRK handler + JMP (BRKV) ; Pass on to BRK handler -:IRQ >>> XF2MAIN,A2IRQ ; Bounce to Apple IRQ handler +:IRQ >>> XF2MAIN,A2IRQ ; Bounce to Apple IRQ handler IRQBRKRET - >>> IENTAUX ; IENTAUX does not do CLI - PLA ; TODO: Pass on to IRQ1V + >>> IENTAUX ; IENTAUX does not do CLI + PLA ; TODO: Pass on to IRQ1V TAX PLA NULLRTI RTI @@ -555,7 +555,7 @@ MOSBRKHDLR LDA #<MSGBRK JSR PRERR JSR OSNEWL JSR OSNEWL -STOP JMP STOP ; Cannot return from a BRK +STOP JMP STOP ; Cannot return from a BRK MSGBRK DB $0D ASC 'ERROR: ' @@ -563,33 +563,33 @@ MSGBRK DB $0D * Default page 2 contents -DEFVEC DW NULLRTS ; $200 USERV - DW MOSBRKHDLR ; $202 BRKV - DW NULLRTI ; $204 IRQ1V - DW NULLRTI ; $206 IRQ2V - DW CLIHND ; $208 CLIV - DW BYTEHND ; $20A BYTEV - DW WORDHND ; $20C WORDV - DW WRCHHND ; $20E WRCHV - DW RDCHHND ; $210 RDCHV - DW FILEHND ; $212 FILEV - DW ARGSHND ; $214 ARGSV - DW BGETHND ; $216 BGETV - DW BPUTHND ; $218 BPUTV - DW GBPBHND ; $21A GBPBV - DW FINDHND ; $21C FINDV - DW FSCHND ; $21E FSCV - DW NULLRTS ; $220 EVENTV - DW NULLRTS ; $222 - DW NULLRTS ; $224 - DW NULLRTS ; $226 - DW NULLRTS ; $228 - DW NULLRTS ; $22A - DW NULLRTS ; $22C - DW NULLRTS ; $22E - DW NULLRTS ; $230 SPARE1V - DW NULLRTS ; $232 SPARE2V - DW NULLRTS ; $234 SPARE3V +DEFVEC DW NULLRTS ; $200 USERV + DW MOSBRKHDLR ; $202 BRKV + DW NULLRTI ; $204 IRQ1V + DW NULLRTI ; $206 IRQ2V + DW CLIHND ; $208 CLIV + DW BYTEHND ; $20A BYTEV + DW WORDHND ; $20C WORDV + DW WRCHHND ; $20E WRCHV + DW RDCHHND ; $210 RDCHV + DW FILEHND ; $212 FILEV + DW ARGSHND ; $214 ARGSV + DW BGETHND ; $216 BGETV + DW BPUTHND ; $218 BPUTV + DW GBPBHND ; $21A GBPBV + DW FINDHND ; $21C FINDV + DW FSCHND ; $21E FSCV + DW NULLRTS ; $220 EVENTV + DW NULLRTS ; $222 + DW NULLRTS ; $224 + DW NULLRTS ; $226 + DW NULLRTS ; $228 + DW NULLRTS ; $22A + DW NULLRTS ; $22C + DW NULLRTS ; $22E + DW NULLRTS ; $230 SPARE1V + DW NULLRTS ; $232 SPARE2V + DW NULLRTS ; $234 SPARE3V ENDVEC * @@ -605,56 +605,58 @@ MOSAPI EQU $FF95 * OPTIONAL ENTRIES * ---------------- -OSSERV JMP SERVICE ; FF95 OSSERV -OSCOLD JMP NULLRTS ; FF98 OSCOLD -OSPRSTR JMP OUTSTR ; FF9B OSPRSTR -OSSCANDEC JMP SCANDEC ; FF9E SCANDEC -OSSCANHEX JMP SCANHEX ; FFA1 SCANHEX -OSFFA4 JMP NULLRTS ; FFA4 (DISKACC) -OSFFA7 JMP NULLRTS ; FFA7 (DISKCCP) -PRHEX JMP OUTHEX ; FFAA PRHEX -PR2HEX JMP OUT2HEX ; FFAD PR2HEX -OSFFB0 JMP PRINTDEC ; FFB0 (USERINT) -OSWRRM JMP NULLRTS ; FFB3 OSWRRM +OSSERV JMP SERVICE ; FF95 OSSERV +OSCOLD JMP NULLRTS ; FF98 OSCOLD +OSPRSTR JMP OUTSTR ; FF9B OSPRSTR +OSSCANDEC JMP SCANDEC ; FF9E SCANDEC +OSSCANHEX JMP SCANHEX ; FFA1 SCANHEX +OSFFA4 JMP NULLRTS ; FFA4 (DISKACC) +OSFFA7 JMP NULLRTS ; FFA7 (DISKCCP) +PRHEX JMP OUTHEX ; FFAA PRHEX +PR2HEX JMP OUT2HEX ; FFAD PR2HEX +OSFFB0 JMP PRINTDEC ; FFB0 (USERINT) +OSWRRM JMP NULLRTS ; FFB3 OSWRRM * COMPULSARY ENTRIES * ------------------ -VECSIZE DB ENDVEC-DEFVEC ; FFB6 VECSIZE Size of vectors -VECBASE DW DEFVEC ; FFB7 VECBASE Base of default vectors -OSRDRM JMP RDROM ; FFB9 OSRDRM Read byte from paged ROM -OSCHROUT JMP OUTCHAR ; FFBC CHROUT Send char to VDU driver -OSEVEN JMP EVENT ; FFBF OSEVEN Signal an event -GSINIT JMP GSINTGO ; FFC2 GSINIT Init string reading -GSREAD JMP GSRDGO ; FFC5 GSREAD Parse general string -NVWRCH JMP WRCHHND ; FFC8 NVWRCH Nonvectored WRCH -NVRDCH JMP RDCHHND ; FFCB NVRDCH Nonvectored RDCH -OSFIND JMP (FINDV) ; FFCE OSFIND -OSGBPB JMP (GBPBV) ; FFD1 OSGBPB -OSBPUT JMP (BPUTV) ; FFD4 OSBPUT -OSBGET JMP (BGETV) ; FFD7 OSBGET -OSARGS JMP (ARGSV) ; FFDA OSARGS -OSFILE JMP (FILEV) ; FFDD OSFILE -OSRDCH JMP (RDCHV) ; FFE0 OSRDCH -OSASCI CMP #$0D ; FFE3 OSASCI +VECSIZE DB ENDVEC-DEFVEC ; FFB6 VECSIZE Size of vectors +VECBASE DW DEFVEC ; FFB7 VECBASE Base of default vectors +OSRDRM JMP RDROM ; FFB9 OSRDRM Read byte from paged ROM +OSCHROUT JMP OUTCHAR ; FFBC CHROUT Send char to VDU driver +OSEVEN JMP EVENT ; FFBF OSEVEN Signal an event +GSINIT JMP GSINTGO ; FFC2 GSINIT Init string reading +GSREAD JMP GSRDGO ; FFC5 GSREAD Parse general string +NVWRCH JMP WRCHHND ; FFC8 NVWRCH Nonvectored WRCH +NVRDCH JMP RDCHHND ; FFCB NVRDCH Nonvectored RDCH +OSFIND JMP (FINDV) ; FFCE OSFIND +OSGBPB JMP (GBPBV) ; FFD1 OSGBPB +OSBPUT JMP (BPUTV) ; FFD4 OSBPUT +OSBGET JMP (BGETV) ; FFD7 OSBGET +OSARGS JMP (ARGSV) ; FFDA OSARGS +OSFILE JMP (FILEV) ; FFDD OSFILE +OSRDCH JMP (RDCHV) ; FFE0 OSRDCH +OSASCI CMP #$0D ; FFE3 OSASCI BNE OSWRCH -OSNEWL LDA #$0A ; FFE7 OSNEWL +OSNEWL LDA #$0A ; FFE7 OSNEWL JSR OSWRCH -OSWRCR LDA #$0D ; FFEC OSWRCR -OSWRCH JMP (WRCHV) ; FFEE OSWRCH -OSWORD JMP (WORDV) ; FFF1 OSWORD -OSBYTE JMP (BYTEV) ; FFF4 OSBYTE -OSCLI JMP (CLIV) ; FFF7 OSCLI -NMIVEC DW NULLRTI ; FFFA NMIVEC -RSTVEC DW STOP ; FFFC RSTVEC +OSWRCR LDA #$0D ; FFEC OSWRCR +OSWRCH JMP (WRCHV) ; FFEE OSWRCH +OSWORD JMP (WORDV) ; FFF1 OSWORD +OSBYTE JMP (BYTEV) ; FFF4 OSBYTE +OSCLI JMP (CLIV) ; FFF7 OSCLI +NMIVEC DW NULLRTI ; FFFA NMIVEC +RSTVEC DW STOP ; FFFC RSTVEC IRQVEC * Assembler doesn't like running up to $FFFF, so we bodge a bit MOSEND ORG MOSEND-MOSAPI+MOSVEC - DW IRQBRKHDLR ; FFFE IRQVEC + DW IRQBRKHDLR ; FFFE IRQVEC MOSVEND * Buffer for one 512 byte disk block in aux mem AUXBLK ASC '**ENDOFCODE**' DS $200-13 + + diff --git a/auxmem.mosequ.s b/auxmem.mosequ.s index 8532a5e..723d1d5 100644 --- a/auxmem.mosequ.s +++ b/auxmem.mosequ.s @@ -1,70 +1,72 @@ -* AUXMEM.MOSEQU.S -* (c) Bobbi 2021 GPLv3 -* - -******************************* -* BBC MOS WORKSPACE LOCATIONS * -******************************* - -* $00-$8F Language workspace -* $90-$9F Network workspace -* $A0-$A7 NMI workspace -* $A8-$AF Non-MOS *command workspace -* $B0-$BF Temporary filing system workspace -* $C0-$CF Persistant filing system workspace -* $D0-$DF VDU driver workspace -* $E0-$EE Internal MOS workspace -* $EF-$FF MOS API workspace - -FSFLAG1 EQU $E2 -FSFLAG2 EQU $E3 -GSFLAG EQU $E4 ; $E4 GSREAD processing flags -GSCHAR EQU $E5 ; $E5 GSREAD accumulator -OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0 -MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2 -MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3 -MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD -OSTEMP EQU $EB ; $EB $EB OSTEMP -OSKBD1 EQU $EC ; $EC kbd ws -OSKBD2 EQU OSKBD1+1 ; $ED kbd ws -OSKBD3 EQU OSKBD1+2 ; $EE kbd ws -OSAREG EQU $EF ; $EF A register -OSXREG EQU OSAREG+1 ; $F0 X register -OSYREG EQU OSXREG+1 ; $F1 Y register -OSCTRL EQU OSXREG ; $F0 (XY)=>control block -OSLPTR EQU $F2 ; $F2 => command line -OSROMNUM EQU $F4 ; $F4 current ROM -* -OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off -OSINTA EQU $FC ; $FC IRQ register A store -FAULT EQU $FD ; $FD Error message pointer -ESCFLAG EQU $FF ; $FF Escape status - - -* $0200-$0235 Vectors -* $0236-$028F OSBYTE variables ($190+BYTENUM) -* $0290-$02ED -* $02EE-$02FF MOS control block - -USERV EQU $200 ; USER vector -BRKV EQU $202 ; BRK vector -CLIV EQU $208 ; OSCLI vector -BYTEV EQU $20A ; OSBYTE vector -WORDV EQU $20C ; OSWORD vector -WRCHV EQU $20E ; OSWRCH vector -RDCHV EQU $210 ; OSRDCH vector -FILEV EQU $212 ; OSFILE vector -ARGSV EQU $214 ; OSARGS vector -BGETV EQU $216 ; OSBGET vector -BPUTV EQU $218 ; OSBPUT vector -GBPBV EQU $21A ; OSGBPB vector -FINDV EQU $21C ; OSFIND vector -FSCV EQU $21E ; FSCV misc file ops - -BYTEVARBASE EQU $190 ; Base of OSBYTE variables -OSFILECB EQU $2EE ; OSFILE control block -OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block - - -* $0300-$03DF -* $03E0-$03FF Used for interfacing with ProDOS XFER +* AUXMEM.MOSEQU.S +* (c) Bobbi 2021 GPLv3 +* + +******************************* +* BBC MOS WORKSPACE LOCATIONS * +******************************* + +* $00-$8F Language workspace +* $90-$9F Network workspace +* $A0-$A7 NMI workspace +* $A8-$AF Non-MOS *command workspace +* $B0-$BF Temporary filing system workspace +* $C0-$CF Persistant filing system workspace +* $D0-$DF VDU driver workspace +* $E0-$EE Internal MOS workspace +* $EF-$FF MOS API workspace + +FSFLAG1 EQU $E2 +FSFLAG2 EQU $E3 +GSFLAG EQU $E4 ; $E4 GSREAD processing flags +GSCHAR EQU $E5 ; $E5 GSREAD accumulator +OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0 +MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2 +MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3 +MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD +OSTEMP EQU $EB ; $EB $EB OSTEMP +OSKBD1 EQU $EC ; $EC kbd ws +OSKBD2 EQU OSKBD1+1 ; $ED kbd ws +OSKBD3 EQU OSKBD1+2 ; $EE kbd ws +OSAREG EQU $EF ; $EF A register +OSXREG EQU OSAREG+1 ; $F0 X register +OSYREG EQU OSXREG+1 ; $F1 Y register +OSCTRL EQU OSXREG ; $F0 (XY)=>control block +OSLPTR EQU $F2 ; $F2 => command line +OSROMNUM EQU $F4 ; $F4 current ROM +* +OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off +OSINTA EQU $FC ; $FC IRQ register A store +FAULT EQU $FD ; $FD Error message pointer +ESCFLAG EQU $FF ; $FF Escape status + + +* $0200-$0235 Vectors +* $0236-$028F OSBYTE variables ($190+BYTENUM) +* $0290-$02ED +* $02EE-$02FF MOS control block + +USERV EQU $200 ; USER vector +BRKV EQU $202 ; BRK vector +CLIV EQU $208 ; OSCLI vector +BYTEV EQU $20A ; OSBYTE vector +WORDV EQU $20C ; OSWORD vector +WRCHV EQU $20E ; OSWRCH vector +RDCHV EQU $210 ; OSRDCH vector +FILEV EQU $212 ; OSFILE vector +ARGSV EQU $214 ; OSARGS vector +BGETV EQU $216 ; OSBGET vector +BPUTV EQU $218 ; OSBPUT vector +GBPBV EQU $21A ; OSGBPB vector +FINDV EQU $21C ; OSFIND vector +FSCV EQU $21E ; FSCV misc file ops + +BYTEVARBASE EQU $190 ; Base of OSBYTE variables +OSFILECB EQU $2EE ; OSFILE control block +OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block + + +* $0300-$03DF +* $03E0-$03FF Used for interfacing with ProDOS XFER + + diff --git a/auxmem.oscli.s b/auxmem.oscli.s index e0f1a5f..b4ec12c 100644 --- a/auxmem.oscli.s +++ b/auxmem.oscli.s @@ -520,6 +520,8 @@ ECHOLP1 JSR GSREAD + + diff --git a/auxmem.vdu.s b/auxmem.vdu.s index d487103..f5bcfe3 100644 --- a/auxmem.vdu.s +++ b/auxmem.vdu.s @@ -1004,3 +1004,5 @@ VDU01 RTS + + diff --git a/mainmem.fsequ.s b/mainmem.fsequ.s index ad8a2c4..8edab46 100644 --- a/mainmem.fsequ.s +++ b/mainmem.fsequ.s @@ -85,6 +85,8 @@ GEOFCMD EQU $D1 + + diff --git a/mainmem.gfx.s b/mainmem.gfx.s index 9843bdf..faf6383 100644 --- a/mainmem.gfx.s +++ b/mainmem.gfx.s @@ -227,3 +227,5 @@ MHGRTAB DW $2000,$2080,$2100,$2180,$2200,$2280,$2300,$2380 + + diff --git a/mainmem.init.s b/mainmem.init.s index e0aac96..12f2b5c 100644 --- a/mainmem.init.s +++ b/mainmem.init.s @@ -131,6 +131,8 @@ RESET TSX + + diff --git a/mainmem.ldr.s b/mainmem.ldr.s index 49fd71f..1b899b5 100644 --- a/mainmem.ldr.s +++ b/mainmem.ldr.s @@ -173,3 +173,5 @@ LOADCODE PHP ; Save carry flag + + diff --git a/mainmem.lists.s b/mainmem.lists.s index 0a643f1..247def9 100644 --- a/mainmem.lists.s +++ b/mainmem.lists.s @@ -127,6 +127,8 @@ QUITPL HEX 04 ; Number of parameters + + diff --git a/mainmem.menu.s b/mainmem.menu.s index f8f9543..140bc9d 100644 --- a/mainmem.menu.s +++ b/mainmem.menu.s @@ -99,3 +99,5 @@ MSG8 ASC " 8. Everything! (8 ROMs)" USERSEL DB $00 + + diff --git a/mainmem.misc.s b/mainmem.misc.s index f64423b..b6327c0 100644 --- a/mainmem.misc.s +++ b/mainmem.misc.s @@ -7,194 +7,196 @@ * A1L/A1H: Start address * A2L/A2H: End address * A4L/A4H: Destination start address -MEMCPY LDA (A1L) - STA (A4L) - LDA A1H - CMP A2H - BNE :S1 - LDA A1L - CMP A2L - BNE :S1 - BRA :DONE -:S1 INC A1L - BNE :S2 - INC A1H -:S2 INC A4L - BNE :S3 - INC A4H -:S3 BRA MEMCPY -:DONE RTS +MEMCPY LDA (A1L) + STA (A4L) + LDA A1H + CMP A2H + BNE :S1 + LDA A1L + CMP A2L + BNE :S1 + BRA :DONE +:S1 INC A1L + BNE :S2 + INC A1H +:S2 INC A4L + BNE :S3 + INC A4H +:S3 BRA MEMCPY +:DONE RTS * Copy 512 bytes from BLKBUF to AUXBLK in aux LC -COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on - LDY #$00 -:L1 LDA BLKBUF,Y - STA $C005 ; Write aux mem - STA AUXBLK,Y - STA $C004 ; Write main mem - CPY #$FF - BEQ :S1 - INY - BRA :L1 -:S1 LDY #$00 -:L2 LDA BLKBUF+$100,Y - STA $C005 ; Write aux mem - STA AUXBLK+$100,Y - STA $C004 ; Write main mem - CPY #$FF - BEQ :S2 - INY - BRA :L2 -:S2 >>> MAINZP ; Alt ZP off, ROM back in - RTS +COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on + LDY #$00 +:L1 LDA BLKBUF,Y + STA $C005 ; Write aux mem + STA AUXBLK,Y + STA $C004 ; Write main mem + CPY #$FF + BEQ :S1 + INY + BRA :L1 +:S1 LDY #$00 +:L2 LDA BLKBUF+$100,Y + STA $C005 ; Write aux mem + STA AUXBLK+$100,Y + STA $C004 ; Write main mem + CPY #$FF + BEQ :S2 + INY + BRA :L2 +:S2 >>> MAINZP ; Alt ZP off, ROM back in + RTS * Search FILEREFS for value in A * On return, buffer number is in X (or $FF if no bufs) -FINDBUF LDX #$00 -:L1 CMP FILEREFS,X - BEQ :END - INX - CPX #$04 - BNE :L1 - LDX #$FF ; $FF for not found -:END RTS +FINDBUF LDX #$00 +:L1 CMP FILEREFS,X + BEQ :END + INX + CPX #$04 + BNE :L1 + LDX #$FF ; $FF for not found +:END RTS * Obtain I/O buffer address * On entry: buffer number in X * On exit: buffer address in AY * Carry set if no bufs, clear otherwise -BUFADDR CPX #$00 - BNE :S1 - LDA #<IOBUF1 - LDY #>IOBUF1 - BRA :EXIT -:S1 CPX #$01 - BNE :S2 - LDA #<IOBUF2 - LDY #>IOBUF2 - BRA :EXIT -:S2 CPX #$02 - BNE :S3 - LDA #<IOBUF3 - LDY #>IOBUF3 - BRA :EXIT -:S3 CPX #$03 - BNE :NOBUFS - LDA #<IOBUF4 - LDY #>IOBUF4 -:EXIT CLC - RTS -:NOBUFS SEC - RTS +BUFADDR CPX #$00 + BNE :S1 + LDA #<IOBUF1 + LDY #>IOBUF1 + BRA :EXIT +:S1 CPX #$01 + BNE :S2 + LDA #<IOBUF2 + LDY #>IOBUF2 + BRA :EXIT +:S2 CPX #$02 + BNE :S3 + LDA #<IOBUF3 + LDY #>IOBUF3 + BRA :EXIT +:S3 CPX #$03 + BNE :NOBUFS + LDA #<IOBUF4 + LDY #>IOBUF4 +:EXIT CLC + RTS +:NOBUFS SEC + RTS * Check if file exists * Return A=0 if doesn't exist, A=1 file, A=2 dir -EXISTS LDA #<MOSFILE - STA GINFOPL+1 - LDA #>MOSFILE - STA GINFOPL+2 - JSR GETINFO ; GET_FILE_INFO - BCS :NOEXIST - LDA GINFOPL+7 ; Storage type - CMP #$0D - BCS :DIR ; >= $0D - LDA #$01 ; File - RTS -:DIR LDA #$02 - RTS -:NOEXIST LDA #$00 - RTS +EXISTS LDA #<MOSFILE + STA GINFOPL+1 + LDA #>MOSFILE + STA GINFOPL+2 + JSR GETINFO ; GET_FILE_INFO + BCS :NOEXIST + LDA GINFOPL+7 ; Storage type + CMP #$0D + BCS :DIR ; >= $0D + LDA #$01 ; File + RTS +:DIR LDA #$02 + RTS +:NOEXIST LDA #$00 + RTS * Copy FILEBLK to OSFILECB in aux memory * Preserves A -COPYFB PHA - LDX #$11 ; 18 bytes in FILEBLK +COPYFB PHA + LDX #$11 ; 18 bytes in FILEBLK * >>> WRTAUX ; Alt ZP and LC - >>> WRTAUX ; Write to Aux mem -:L1 LDA FILEBLK,X + >>> WRTAUX ; Write to Aux mem +:L1 LDA FILEBLK,X * STA AUXBLK,X - STA OSFILECB,X - DEX - BPL :L1 + STA OSFILECB,X + DEX + BPL :L1 * >>> MAINZP ; Back to normal - >>> WRTMAIN ; Back to Main mem - PLA - RTS + >>> WRTMAIN ; Back to Main mem + PLA + RTS * Get file info -GETINFO JSR MLI - DB GINFOCMD - DW GINFOPL - RTS +GETINFO JSR MLI + DB GINFOCMD + DW GINFOPL + RTS * Set file info -SETINFO LDA #$07 ; SET_FILE_INFO 7 parms - STA GINFOPL - JSR MLI - DB SINFOCMD - DW GINFOPL ; Re-use PL from GFI - LDA #$0A ; GET_FILE_INFO 10 parms - STA GINFOPL - RTS +SETINFO LDA #$07 ; SET_FILE_INFO 7 parms + STA GINFOPL + JSR MLI + DB SINFOCMD + DW GINFOPL ; Re-use PL from GFI + LDA #$0A ; GET_FILE_INFO 10 parms + STA GINFOPL + RTS * Create disk file * Uses filename in MOSFILE -CRTFILE JSR MLI ; GET_TIME - DB GTIMECMD - LDA #<MOSFILE - STA CREATEPL+1 - LDA #>MOSFILE - STA CREATEPL+2 - LDA #$C3 ; Open permissions - STA CREATEPL+3 - LDA $BF90 ; Current date - STA CREATEPL+8 - LDA $BF91 - STA CREATEPL+9 - LDA $BF92 ; Current time - STA CREATEPL+10 - LDA $BF93 - STA CREATEPL+11 - JSR MLI - DB CREATCMD - DW CREATEPL - RTS +CRTFILE JSR MLI ; GET_TIME + DB GTIMECMD + LDA #<MOSFILE + STA CREATEPL+1 + LDA #>MOSFILE + STA CREATEPL+2 + LDA #$C3 ; Open permissions + STA CREATEPL+3 + LDA $BF90 ; Current date + STA CREATEPL+8 + LDA $BF91 + STA CREATEPL+9 + LDA $BF92 ; Current time + STA CREATEPL+10 + LDA $BF93 + STA CREATEPL+11 + JSR MLI + DB CREATCMD + DW CREATEPL + RTS * Open disk file -OPENMOSFILE LDA #<MOSFILE ; Open filename in MOSFILE - STA OPENPL+1 - LDA #>MOSFILE - STA OPENPL+2 -OPENFILE JSR MLI - DB OPENCMD - DW OPENPL - RTS +OPENMOSFILE LDA #<MOSFILE ; Open filename in MOSFILE + STA OPENPL+1 + LDA #>MOSFILE + STA OPENPL+2 +OPENFILE JSR MLI + DB OPENCMD + DW OPENPL + RTS * Close disk file -CLSFILE JSR MLI - DB CLSCMD - DW CLSPL - RTS +CLSFILE JSR MLI + DB CLSCMD + DW CLSPL + RTS * Read 512 bytes into BLKBUF -RDFILE JSR MLI - DB READCMD - DW READPL - RTS +RDFILE JSR MLI + DB READCMD + DW READPL + RTS * Write data in BLKBUF to disk -WRTFILE JSR MLI - DB WRITECMD - DW WRITEPL - RTS +WRTFILE JSR MLI + DB WRITECMD + DW WRITEPL + RTS * Put ProDOS prefix in PREFIX -GETPREF JSR MLI - DB GPFXCMD - DW GPFXPL - RTS +GETPREF JSR MLI + DB GPFXCMD + DW GPFXPL + RTS * Map of file reference numbers to IOBUF1..4 -FILEREFS DB $00,$00,$00,$00 +FILEREFS DB $00,$00,$00,$00 + + diff --git a/mainmem.path.s b/mainmem.path.s index 2deeeb1..2b79a4b 100644 --- a/mainmem.path.s +++ b/mainmem.path.s @@ -313,6 +313,8 @@ PREFIX DS 65 ; Buffer for ProDOS prefix + + diff --git a/mainmem.svc.s b/mainmem.svc.s index 0589fa9..bebe6a8 100644 --- a/mainmem.svc.s +++ b/mainmem.svc.s @@ -21,100 +21,100 @@ * ProDOS file handling to rename a file -RENFILE >>> ENTMAIN - JSR PREPATH ; Preprocess arg1 - JSR MFtoTMP ; Stash arg1 - JSR COPYMF21 ; Copy arg2 - JSR PREPATH ; Preprocess arg2 - JSR COPYMF12 ; Put it back in MOSFILE2 - JSR TMPtoMF ; Recover arg1->MOSFILE - LDA #<MOSFILE - STA RENPL+1 - LDA #>MOSFILE - STA RENPL+2 - LDA #<MOSFILE2 - STA RENPL+3 - LDA #>MOSFILE2 - STA RENPL+4 - JSR MLI - DB RENCMD - DW RENPL - >>> XF2AUX,RENRET +RENFILE >>> ENTMAIN + JSR PREPATH ; Preprocess arg1 + JSR MFtoTMP ; Stash arg1 + JSR COPYMF21 ; Copy arg2 + JSR PREPATH ; Preprocess arg2 + JSR COPYMF12 ; Put it back in MOSFILE2 + JSR TMPtoMF ; Recover arg1->MOSFILE + LDA #<MOSFILE + STA RENPL+1 + LDA #>MOSFILE + STA RENPL+2 + LDA #<MOSFILE2 + STA RENPL+3 + LDA #>MOSFILE2 + STA RENPL+4 + JSR MLI + DB RENCMD + DW RENPL + >>> XF2AUX,RENRET * ProDOS file handling for file copying * Returns with ProDOS error code in A -COPYFILE >>> ENTMAIN - JSR MFtoTMP ; Swap MOSFILE & MOSFILE2 - JSR COPYMF21 - JSR TMPtoMF2 - JSR PREPATH ; Preprocess arg2 (in MOSFILE) - JSR WILDONE ; Handle any wildcards - JSR EXISTS ; See if destination exists - STA :DESTTYPE ; Stash for later - JSR MFtoTMP ; Swap MOSFILE & MOSFILE2 again - JSR COPYMF21 - JSR TMPtoMF2 - JSR PREPATH ; Preprocess arg1 - SEC ; Force wildcard lookup - JSR WILDCARD ; Handle any wildcards in arg1 - BCS :NONE - JSR HASWILD - BCC :MAINLOOP ; No wildcards in final segment - LDA :DESTTYPE ; Wildcards, check dest type - CMP #$02 ; Existing directory? - BNE :BADDEST ; If not, error - BRA :MAINLOOP ; Source: wildcard, dest: dir +COPYFILE >>> ENTMAIN + JSR MFtoTMP ; Swap MOSFILE & MOSFILE2 + JSR COPYMF21 + JSR TMPtoMF2 + JSR PREPATH ; Preprocess arg2 (in MOSFILE) + JSR WILDONE ; Handle any wildcards + JSR EXISTS ; See if destination exists + STA :DESTTYPE ; Stash for later + JSR MFtoTMP ; Swap MOSFILE & MOSFILE2 again + JSR COPYMF21 + JSR TMPtoMF2 + JSR PREPATH ; Preprocess arg1 + SEC ; Force wildcard lookup + JSR WILDCARD ; Handle any wildcards in arg1 + BCS :NONE + JSR HASWILD + BCC :MAINLOOP ; No wildcards in final segment + LDA :DESTTYPE ; Wildcards, check dest type + CMP #$02 ; Existing directory? + BNE :BADDEST ; If not, error + BRA :MAINLOOP ; Source: wildcard, dest: dir :NOWILD :MAINLOOP - LDA MOSFILE2 ; Length - STA :OLDLEN - JSR EXISTS ; See if source is file or dir - CMP #$02 ; Directory - BEQ :SKIP ; Skip directories - LDA :DESTTYPE ; Check dest type - CMP #$02 ; Existing directory? - BNE :NOTDIR - LDY MOSFILE2 ; Dest idx = length - LDA MOSFILE2,Y ; Get last char - CMP #'/' ; Is it slash? - BEQ :HASSLSH - LDA #'/' ; Add a '/' separator - STA MOSFILE2+1,Y - INY -:HASSLSH LDX #$00 ; Source id -:APPLOOP CPX MATCHBUF ; At end? - BEQ :DONEAPP - LDA MATCHBUF+1,X ; Appending MATCHBUF to MOSFILE2 - STA MOSFILE2+1,Y - INX - INY - BRA :APPLOOP -:DONEAPP STY MOSFILE2 ; Update length -:NOTDIR LDA :DESTTYPE ; Recover destination type - JSR COPY1FILE ; Copy an individual file - BCS :COPYERR -:SKIP JSR WILDNEXT - BCS :NOMORE - LDA :OLDLEN ; Restore MOSFILE2 - STA MOSFILE2 - BRA :MAINLOOP - JSR CLSDIR -:EXIT >>> XF2AUX,COPYRET -:NONE JSR CLSDIR - LDA #$46 ; 'File not found' - BRA :EXIT -:BADDEST JSR CLSDIR - LDA #$FD ; 'Wildcards' error - BRA :EXIT -:NOMORE JSR CLSDIR - LDA #$00 - BRA :EXIT -:COPYERR PHA - JSR CLSDIR - PLA - BRA :EXIT -:DESTTYPE DB $00 -:OLDLEN DB $00 + LDA MOSFILE2 ; Length + STA :OLDLEN + JSR EXISTS ; See if source is file or dir + CMP #$02 ; Directory + BEQ :SKIP ; Skip directories + LDA :DESTTYPE ; Check dest type + CMP #$02 ; Existing directory? + BNE :NOTDIR + LDY MOSFILE2 ; Dest idx = length + LDA MOSFILE2,Y ; Get last char + CMP #'/' ; Is it slash? + BEQ :HASSLSH + LDA #'/' ; Add a '/' separator + STA MOSFILE2+1,Y + INY +:HASSLSH LDX #$00 ; Source id +:APPLOOP CPX MATCHBUF ; At end? + BEQ :DONEAPP + LDA MATCHBUF+1,X ; Appending MATCHBUF to MOSFILE2 + STA MOSFILE2+1,Y + INX + INY + BRA :APPLOOP +:DONEAPP STY MOSFILE2 ; Update length +:NOTDIR LDA :DESTTYPE ; Recover destination type + JSR COPY1FILE ; Copy an individual file + BCS :COPYERR +:SKIP JSR WILDNEXT + BCS :NOMORE + LDA :OLDLEN ; Restore MOSFILE2 + STA MOSFILE2 + BRA :MAINLOOP + JSR CLSDIR +:EXIT >>> XF2AUX,COPYRET +:NONE JSR CLSDIR + LDA #$46 ; 'File not found' + BRA :EXIT +:BADDEST JSR CLSDIR + LDA #$FD ; 'Wildcards' error + BRA :EXIT +:NOMORE JSR CLSDIR + LDA #$00 + BRA :EXIT +:COPYERR PHA + JSR CLSDIR + PLA + BRA :EXIT +:DESTTYPE DB $00 +:OLDLEN DB $00 * Copy a single file * Source is in MOSFILE, DEST in MOSFILE2 @@ -122,344 +122,344 @@ COPYFILE >>> ENTMAIN * Returns with ProDOS error code in A * Buffer COPYBUF is used for the file copy, to avoid trashing * directory block in RDBUF (when doing wilcard search) -COPY1FILE LDA #<MOSFILE - STA GINFOPL+1 - STA OPENPL2+1 - LDA #>MOSFILE - STA GINFOPL+2 - STA OPENPL2+2 - JSR GETINFO ; GET_FILE_INFO - BCS :ERR - LDA #<MOSFILE2 - STA GINFOPL+1 - STA DESTPL+1 - LDA #>MOSFILE2 - STA GINFOPL+2 - STA DESTPL+2 - JSR MLI ; DESTROY - DB DESTCMD - DW DESTPL - LDA #$07 ; Fix num parms in PL - STA GINFOPL - LDA #$C3 ; Default permissions - STA GINFOPL+3 - JSR MLI ; Call CREATE with .. - DB CREATCMD ; .. PL from GET_FILE_INFO - DW GINFOPL - LDX #$0A ; Num parms back as we found it - STX GINFOPL - BCS :ERR ; Error creating dest file - LDA #$00 ; Look for empty slot - JSR FINDBUF - STX :BUFIDX1 - JSR BUFADDR - BCS :ERR ; No I/O bufs available - STA OPENPL2+3 - STY OPENPL2+4 - JSR MLI - DB OPENCMD - DW OPENPL2 - BCS :ERR ; Open error - BRA :S1 -:ERR SEC ; Report error - RTS -:S1 LDA OPENPL2+5 ; File ref num - STA RDPLCP+1 - LDX :BUFIDX1 - STA FILEREFS,X ; Record the ref number - LDA #<MOSFILE2 - STA OPENPL2+1 - LDA #>MOSFILE2 - STA OPENPL2+2 - LDA #$00 ; Look for empty slot - JSR FINDBUF - STX :BUFIDX2 - JSR BUFADDR - BCS :ERRCLS1 ; No I/O bufs available - STA OPENPL2+3 - STY OPENPL2+4 - JSR MLI - DB OPENCMD - DW OPENPL2 - BCS :ERRCLS1 - LDA OPENPL2+5 ; File ref num - STA WRTPLCP+1 - LDX :BUFIDX2 - STA FILEREFS,X ; Record the ref number -:MAINLOOP JSR MLI ; Read a block - DB READCMD - DW RDPLCP - BCC :RDOKAY - CMP #$4C ; Is it EOF? - BEQ :EOFEXIT - BRA :ERRCLS2 ; Any other error -:RDOKAY LDA RDPLCP+6 ; Trans count MSB - STA WRTPLCP+4 ; Request count MSB - LDA RDPLCP+7 ; Trans count MSB - STA WRTPLCP+5 ; Request count MSB - JSR MLI ; Write a block - DB WRITECMD - DW WRTPLCP - BCS :ERRCLS2 ; Write error - BRA :MAINLOOP -:EOFEXIT CLC ; No error - PHP - LDA #$00 - PHA -:CLOSE2 LDA WRTPLCP+1 ; Close output file - STA CLSPL+1 - JSR CLSFILE - LDX :BUFIDX2 - STZ FILEREFS,X -:CLOSE1 LDA RDPLCP+1 ; Close input file - STA CLSPL+1 - JSR CLSFILE - LDX :BUFIDX1 - STZ FILEREFS,X - PLA - PLP - RTS -:ERRCLS1 SEC - PHP - PHA - BRA :CLOSE1 -:ERRCLS2 SEC - PHP - PHA - BRA :CLOSE2 -:BUFIDX1 DB $00 -:BUFIDX2 DB $00 +COPY1FILE LDA #<MOSFILE + STA GINFOPL+1 + STA OPENPL2+1 + LDA #>MOSFILE + STA GINFOPL+2 + STA OPENPL2+2 + JSR GETINFO ; GET_FILE_INFO + BCS :ERR + LDA #<MOSFILE2 + STA GINFOPL+1 + STA DESTPL+1 + LDA #>MOSFILE2 + STA GINFOPL+2 + STA DESTPL+2 + JSR MLI ; DESTROY + DB DESTCMD + DW DESTPL + LDA #$07 ; Fix num parms in PL + STA GINFOPL + LDA #$C3 ; Default permissions + STA GINFOPL+3 + JSR MLI ; Call CREATE with .. + DB CREATCMD ; .. PL from GET_FILE_INFO + DW GINFOPL + LDX #$0A ; Num parms back as we found it + STX GINFOPL + BCS :ERR ; Error creating dest file + LDA #$00 ; Look for empty slot + JSR FINDBUF + STX :BUFIDX1 + JSR BUFADDR + BCS :ERR ; No I/O bufs available + STA OPENPL2+3 + STY OPENPL2+4 + JSR MLI + DB OPENCMD + DW OPENPL2 + BCS :ERR ; Open error + BRA :S1 +:ERR SEC ; Report error + RTS +:S1 LDA OPENPL2+5 ; File ref num + STA RDPLCP+1 + LDX :BUFIDX1 + STA FILEREFS,X ; Record the ref number + LDA #<MOSFILE2 + STA OPENPL2+1 + LDA #>MOSFILE2 + STA OPENPL2+2 + LDA #$00 ; Look for empty slot + JSR FINDBUF + STX :BUFIDX2 + JSR BUFADDR + BCS :ERRCLS1 ; No I/O bufs available + STA OPENPL2+3 + STY OPENPL2+4 + JSR MLI + DB OPENCMD + DW OPENPL2 + BCS :ERRCLS1 + LDA OPENPL2+5 ; File ref num + STA WRTPLCP+1 + LDX :BUFIDX2 + STA FILEREFS,X ; Record the ref number +:MAINLOOP JSR MLI ; Read a block + DB READCMD + DW RDPLCP + BCC :RDOKAY + CMP #$4C ; Is it EOF? + BEQ :EOFEXIT + BRA :ERRCLS2 ; Any other error +:RDOKAY LDA RDPLCP+6 ; Trans count MSB + STA WRTPLCP+4 ; Request count MSB + LDA RDPLCP+7 ; Trans count MSB + STA WRTPLCP+5 ; Request count MSB + JSR MLI ; Write a block + DB WRITECMD + DW WRTPLCP + BCS :ERRCLS2 ; Write error + BRA :MAINLOOP +:EOFEXIT CLC ; No error + PHP + LDA #$00 + PHA +:CLOSE2 LDA WRTPLCP+1 ; Close output file + STA CLSPL+1 + JSR CLSFILE + LDX :BUFIDX2 + STZ FILEREFS,X +:CLOSE1 LDA RDPLCP+1 ; Close input file + STA CLSPL+1 + JSR CLSFILE + LDX :BUFIDX1 + STZ FILEREFS,X + PLA + PLP + RTS +:ERRCLS1 SEC + PHP + PHA + BRA :CLOSE1 +:ERRCLS2 SEC + PHP + PHA + BRA :CLOSE2 +:BUFIDX1 DB $00 +:BUFIDX2 DB $00 * ProDOS file handling for MOS OSFIND OPEN call * Options in A: $40 'r', $80 'w', $C0 'rw' -OFILE >>> ENTMAIN - AND #$C0 ; Keep just action bits - PHA ; Preserve arg for later - JSR PREPATH ; Preprocess pathname - BCS :JMPEXIT1 ; Bad filename - PLA - PHA - CMP #$80 ; Is it "w"? - BEQ :NOWILD ; If so, no wildcards - JSR WILDONE ; Handle any wildcards -:NOWILD JSR EXISTS ; See if file exists ... - TAX - CMP #$02 ; ... and is a directory - BNE :NOTDIR - PLA ; Get action back - BPL :NOTDIR2 ; OPENIN(dir) allowed - LDA #$41 ; $41=Directory exists - PHA ; Balance PLA -:JMPEXIT1 PLA -:JMPEXIT JMP FINDEXIT -:NOTDIR PLA -:NOTDIR2 CMP #$80 ; Write mode - BNE :S1 - TXA - BEQ :S0 ; No file, don't try to delete - JSR DODELETE - BCS FINDEXIT ; Abort if error -:S0 LDX #$00 ; LOAD=$0000 - LDY #$00 - JSR CREATEFILE - BCS FINDEXIT ; Abort if error +OFILE >>> ENTMAIN + AND #$C0 ; Keep just action bits + PHA ; Preserve arg for later + JSR PREPATH ; Preprocess pathname + BCS :JMPEXIT1 ; Bad filename + PLA + PHA + CMP #$80 ; Is it "w"? + BEQ :NOWILD ; If so, no wildcards + JSR WILDONE ; Handle any wildcards +:NOWILD JSR EXISTS ; See if file exists ... + TAX + CMP #$02 ; ... and is a directory + BNE :NOTDIR + PLA ; Get action back + BPL :NOTDIR2 ; OPENIN(dir) allowed + LDA #$41 ; $41=Directory exists + PHA ; Balance PLA +:JMPEXIT1 PLA +:JMPEXIT JMP FINDEXIT +:NOTDIR PLA +:NOTDIR2 CMP #$80 ; Write mode + BNE :S1 + TXA + BEQ :S0 ; No file, don't try to delete + JSR DODELETE + BCS FINDEXIT ; Abort if error +:S0 LDX #$00 ; LOAD=$0000 + LDY #$00 + JSR CREATEFILE + BCS FINDEXIT ; Abort if error * Looking for a buffer should be done before creating a file -:S1 LDA #$00 ; Look for empty slot - JSR FINDBUF - STX BUFIDX - JSR BUFADDR - BCS NOBUFFS ; No empty slot (BUFIDX=FF) - STA OPENPL2+3 - STY OPENPL2+4 - LDA #<MOSFILE - STA OPENPL2+1 - LDA #>MOSFILE - STA OPENPL2+2 - JSR MLI - DB OPENCMD - DW OPENPL2 - BCS FINDEXIT - LDA OPENPL2+5 ; File ref number - LDX BUFIDX - STA FILEREFS,X ; Record the ref number -FINDEXIT JSR CHKNOTFND ; Convert NotFound to $00 - >>> XF2AUX,OSFINDRET -NOBUFFS LDA #$42 ; $42=File buffers full - BNE FINDEXIT -BUFIDX DB $00 +:S1 LDA #$00 ; Look for empty slot + JSR FINDBUF + STX BUFIDX + JSR BUFADDR + BCS NOBUFFS ; No empty slot (BUFIDX=FF) + STA OPENPL2+3 + STY OPENPL2+4 + LDA #<MOSFILE + STA OPENPL2+1 + LDA #>MOSFILE + STA OPENPL2+2 + JSR MLI + DB OPENCMD + DW OPENPL2 + BCS FINDEXIT + LDA OPENPL2+5 ; File ref number + LDX BUFIDX + STA FILEREFS,X ; Record the ref number +FINDEXIT JSR CHKNOTFND ; Convert NotFound to $00 + >>> XF2AUX,OSFINDRET +NOBUFFS LDA #$42 ; $42=File buffers full + BNE FINDEXIT +BUFIDX DB $00 * ProDOS file handling for MOS OSFIND CLOSE call * ProDOS can do CLOSE#0 but we need to manually update FILEREFS -CFILE >>> ENTMAIN - LDX #$00 ; Prepare for one file - TYA ; File ref number - BNE :CFILE1 ; Close one file - LDX #$03 ; Loop through all files -:CFILE0 LDA FILEREFS,X - BEQ :CFILE3 ; Not open, try next -:CFILE1 PHX - PHA - STA CLSPL+1 - JSR CLSFILE - BCS :CFILEERR ; Error occured during closing - PLA - JSR FINDBUF - BNE :CFILE2 - LDA #$00 - STA FILEREFS,X ; Release buffer -:CFILE2 PLX -:CFILE3 DEX - BPL :CFILE0 ; Loop to close all files - LDA #$00 - BEQ FINDEXIT -:CFILEERR PLX ; Balance stack - PLX - BCS FINDEXIT +CFILE >>> ENTMAIN + LDX #$00 ; Prepare for one file + TYA ; File ref number + BNE :CFILE1 ; Close one file + LDX #$03 ; Loop through all files +:CFILE0 LDA FILEREFS,X + BEQ :CFILE3 ; Not open, try next +:CFILE1 PHX + PHA + STA CLSPL+1 + JSR CLSFILE + BCS :CFILEERR ; Error occured during closing + PLA + JSR FINDBUF + BNE :CFILE2 + LDA #$00 + STA FILEREFS,X ; Release buffer +:CFILE2 PLX +:CFILE3 DEX + BPL :CFILE0 ; Loop to close all files + LDA #$00 + BEQ FINDEXIT +:CFILEERR PLX ; Balance stack + PLX + BCS FINDEXIT * ProDOS file handling for MOS OSBGET call * Returns with char read in A and error num in Y (or 0) -FILEGET >>> ENTMAIN - STY READPL2+1 ; File ref number - JSR MLI - DB READCMD - DW READPL2 - TAY ; Error number in Y - BCS :EXIT - LDY #$00 ; 0=Ok - LDA BLKBUF -:EXIT >>> XF2AUX,OSBGETRET +FILEGET >>> ENTMAIN + STY READPL2+1 ; File ref number + JSR MLI + DB READCMD + DW READPL2 + TAY ; Error number in Y + BCS :EXIT + LDY #$00 ; 0=Ok + LDA BLKBUF +:EXIT >>> XF2AUX,OSBGETRET * ProDOS file handling for MOS OSBPUT call * Enters with char to write in A -FILEPUT >>> ENTMAIN - STA BLKBUF ; Byte to write - STY WRITEPL+1 ; File ref number - LDA #$01 ; Bytes to write - STA WRITEPL+4 - LDA #$00 - STA WRITEPL+5 - JSR WRTFILE - BCS :FILEPUT2 - LDA #$00 ; 0=Ok -:FILEPUT2 >>> XF2AUX,OSBPUTRET +FILEPUT >>> ENTMAIN + STA BLKBUF ; Byte to write + STY WRITEPL+1 ; File ref number + LDA #$01 ; Bytes to write + STA WRITEPL+4 + LDA #$00 + STA WRITEPL+5 + JSR WRTFILE + BCS :FILEPUT2 + LDA #$00 ; 0=Ok +:FILEPUT2 >>> XF2AUX,OSBPUTRET * ProDOS file handling for FSC $01 called by OSBYTE $7F EOF * Returns EOF status in A ($FF for EOF, $00 otherwise) * A=channel to test -FILEEOF >>> ENTMAIN - STA GEOFPL+1 - STA GMARKPL+1 - JSR MLI - DB GEOFCMD - DW GEOFPL - TAY - BCS :EXIT ; Abort with any error - JSR MLI - DB GMARKCMD - DW GMARKPL - TAY - BCS :EXIT ; Abort with any error +FILEEOF >>> ENTMAIN + STA GEOFPL+1 + STA GMARKPL+1 + JSR MLI + DB GEOFCMD + DW GEOFPL + TAY + BCS :EXIT ; Abort with any error + JSR MLI + DB GMARKCMD + DW GMARKPL + TAY + BCS :EXIT ; Abort with any error - SEC - LDA GEOFPL+2 ; Subtract Mark from EOF - SBC GMARKPL+2 - STA GEOFPL+2 - LDA GEOFPL+3 - SBC GMARKPL+3 - STA GEOFPL+3 - LDA GEOFPL+4 - SBC GMARKPL+4 - STA GEOFPL+4 + SEC + LDA GEOFPL+2 ; Subtract Mark from EOF + SBC GMARKPL+2 + STA GEOFPL+2 + LDA GEOFPL+3 + SBC GMARKPL+3 + STA GEOFPL+3 + LDA GEOFPL+4 + SBC GMARKPL+4 + STA GEOFPL+4 - LDA GEOFPL+2 ; Check bytes remaining - ORA GEOFPL+3 - ORA GEOFPL+4 - BEQ :ISEOF ; EOF -> $00 - LDA #$FF ; Not EOF -> $FF -:ISEOF EOR #$FF ; EOF -> $FF, Not EOF ->$00 - LDY #$00 ; 0=No error -:EXIT >>> XF2AUX,CHKEOFRET + LDA GEOFPL+2 ; Check bytes remaining + ORA GEOFPL+3 + ORA GEOFPL+4 + BEQ :ISEOF ; EOF -> $00 + LDA #$FF ; Not EOF -> $FF +:ISEOF EOR #$FF ; EOF -> $FF, Not EOF ->$00 + LDY #$00 ; 0=No error +:EXIT >>> XF2AUX,CHKEOFRET * ProDOS file handling for OSARGS flush commands -FLUSH >>> ENTMAIN - STY FLSHPL+1 ; File ref number - JSR MLI - DB FLSHCMD - DW FLSHPL - JMP TELLEXIT +FLUSH >>> ENTMAIN + STY FLSHPL+1 ; File ref number + JSR MLI + DB FLSHCMD + DW FLSHPL + JMP TELLEXIT * ProDOS file handling for OSARGS set ptr command * GMARKPL+1=channel, GMARKPL+2,+3,+4=offset already set -SEEK >>> ENTMAIN - JSR MLI - DB SMARKCMD - DW GMARKPL - JMP TELLEXIT +SEEK >>> ENTMAIN + JSR MLI + DB SMARKCMD + DW GMARKPL + JMP TELLEXIT * ProDOS file handling for OSARGS get ptr command * and for OSARGs get length command * A=ZP, Y=channel -SIZE LDX #$02 ; $02=SIZE, Read EXT - BNE TELL2 -TELL LDX #$00 ; $00=TELL, Read PTR -TELL2 STY GMARKPL+1 ; File ref number - PHA ; Pointer to zero page - CPX #$00 ; OSARGS parameter - BEQ :POS - JSR MLI - DB GEOFCMD - DW GMARKPL ; MARK parms same as EOF parms - BRA :S1 -:POS JSR MLI - DB GMARKCMD - DW GMARKPL -:S1 PLX ; Pointer to ZP control block - BCS TELLEXIT ; Exit with error - >>> ALTZP ; Alt ZP & Alt LC on - LDA GMARKPL+2 - STA $00,X - LDA GMARKPL+3 - STA $01,X - LDA GMARKPL+4 - STA $02,X - STZ $03,X ; Sizes are $00xxxxxx - >>> MAINZP ; Alt ZP off, ROM back in - LDA #$00 ; 0=Ok -TELLEXIT >>> XF2AUX,OSARGSRET +SIZE LDX #$02 ; $02=SIZE, Read EXT + BNE TELL2 +TELL LDX #$00 ; $00=TELL, Read PTR +TELL2 STY GMARKPL+1 ; File ref number + PHA ; Pointer to zero page + CPX #$00 ; OSARGS parameter + BEQ :POS + JSR MLI + DB GEOFCMD + DW GMARKPL ; MARK parms same as EOF parms + BRA :S1 +:POS JSR MLI + DB GMARKCMD + DW GMARKPL +:S1 PLX ; Pointer to ZP control block + BCS TELLEXIT ; Exit with error + >>> ALTZP ; Alt ZP & Alt LC on + LDA GMARKPL+2 + STA $00,X + LDA GMARKPL+3 + STA $01,X + LDA GMARKPL+4 + STA $02,X + STZ $03,X ; Sizes are $00xxxxxx + >>> MAINZP ; Alt ZP off, ROM back in + LDA #$00 ; 0=Ok +TELLEXIT >>> XF2AUX,OSARGSRET -ZPMOS EQU $30 +ZPMOS EQU $30 * ProDOS file MOS OSFILE calls -CALLFILE >>> ENTMAIN - JSR FILEDISPATCH - >>> XF2AUX,OSFILERET -FILEDISPATCH CMP #$00 - BEQ SVCSAVE ; A=00 -> SAVE - CMP #$FF - BEQ SVCLOAD ; A=FF -> LOAD - CMP #$06 - BEQ DELFILE ; A=06 -> DELETE - BCC INFOFILE ; A=01-05 -> INFO - CMP #$08 - BEQ MAKEDIR ; A=08 -> MKDIR - RTS -SVCSAVE JMP SAVEFILE -SVCLOAD JMP LOADFILE +CALLFILE >>> ENTMAIN + JSR FILEDISPATCH + >>> XF2AUX,OSFILERET +FILEDISPATCH CMP #$00 + BEQ SVCSAVE ; A=00 -> SAVE + CMP #$FF + BEQ SVCLOAD ; A=FF -> LOAD + CMP #$06 + BEQ DELFILE ; A=06 -> DELETE + BCC INFOFILE ; A=01-05 -> INFO + CMP #$08 + BEQ MAKEDIR ; A=08 -> MKDIR + RTS +SVCSAVE JMP SAVEFILE +SVCLOAD JMP LOADFILE INFOFILE * >>> ENTMAIN * JSR PREPATH ; Preprocess path * JSR UPDFB ; Update FILEBLK - JSR UPDPATH ; Process path and get info - JMP COPYFB ; Copy back to aux mem + JSR UPDPATH ; Process path and get info + JMP COPYFB ; Copy back to aux mem * >>> XF2AUX,OSFILERET @@ -471,40 +471,40 @@ DELFILE * >>> ENTMAIN * JSR PREPATH ; Preprocess path * JSR UPDFB ; Update FILEBLK - JSR UPDPATH ; Process path and get info - JSR COPYFB ; Copy back to aux mem - PHA ; Save object type - JSR DODELETE - BCC :DELETED ; Success + JSR UPDPATH ; Process path and get info + JSR COPYFB ; Copy back to aux mem + PHA ; Save object type + JSR DODELETE + BCC :DELETED ; Success - TAX ; X=error code - PLA ; Get object back - CPX #$4E - BNE :DELERROR ; Not 'Insuff. access', return it - LDX #$4F ; Change to 'Locked' + TAX ; X=error code + PLA ; Get object back + CPX #$4E + BNE :DELERROR ; Not 'Insuff. access', return it + LDX #$4F ; Change to 'Locked' - CMP #$02 - BNE :DELERROR ; Wasn't a directory, return 'Locked' - LDA FBATTR+0 - AND #$08 - BNE :DELERROR ; Dir locked, return 'Locked' - LDX #$54 ; Change to 'Dir not empty' + CMP #$02 + BNE :DELERROR ; Wasn't a directory, return 'Locked' + LDA FBATTR+0 + AND #$08 + BNE :DELERROR ; Dir locked, return 'Locked' + LDX #$54 ; Change to 'Dir not empty' -:DELERROR TXA - JSR CHKNOTFND - PHA -:DELETED PLA ; Get object back -:EXIT RTS +:DELERROR TXA + JSR CHKNOTFND + PHA +:DELETED PLA ; Get object back +:EXIT RTS * >>> XF2AUX,OSFILERET -DODELETE LDA #<MOSFILE ; Attempt to destroy file - STA DESTPL+1 - LDA #>MOSFILE - STA DESTPL+2 - JSR MLI - DB DESTCMD - DW DESTPL - RTS +DODELETE LDA #<MOSFILE ; Attempt to destroy file + STA DESTPL+1 + LDA #>MOSFILE + STA DESTPL+2 + JSR MLI + DB DESTCMD + DW DESTPL + RTS * ProDOS file handling to create a directory @@ -515,20 +515,20 @@ MAKEDIR * >>> ENTMAIN * JSR PREPATH ; Preprocess path * JSR UPDFB ; Update FILEBLK - JSR UPDPATH ; Process path and get info - CMP #$02 - BEQ :EXIT1 ; Dir already exists + JSR UPDPATH ; Process path and get info + CMP #$02 + BEQ :EXIT1 ; Dir already exists - LDA #$0D ; OBJT='Directory' - STA CREATEPL+7 ; ->Storage type - LDA #$0F ; TYPE='Directory' - LDX #$00 ; LOAD=$0000 - LDY #$00 - JSR CREATEOBJ - BCS :EXIT ; Failed, exit with ProDOS result - JSR UPDFB ; Update FILEBLK, returns A=$02 -:EXIT1 JSR COPYFB ; Copy FILEBLK to aux mem -:EXIT RTS + LDA #$0D ; OBJT='Directory' + STA CREATEPL+7 ; ->Storage type + LDA #$0F ; TYPE='Directory' + LDX #$00 ; LOAD=$0000 + LDY #$00 + JSR CREATEOBJ + BCS :EXIT ; Failed, exit with ProDOS result + JSR UPDFB ; Update FILEBLK, returns A=$02 +:EXIT1 JSR COPYFB ; Copy FILEBLK to aux mem +:EXIT RTS * >>> XF2AUX,OSFILERET @@ -538,85 +538,85 @@ MAKEDIR * A>$1F ProDOS error, translated by FILERET LOADFILE * >>> ENTMAIN - LDX #4 -:LP LDA FBLOAD,X ; Get address to load to - STA ZPMOS,X - DEX - BPL :LP - JSR PREPATH ; Preprocess pathname - JSR WILDONE ; Handle any wildcards - JSR UPDFB ; Get object info - CMP #$20 - BCS :JMPEXIT ; Error occured - CMP #$01 ; Is it a file - BEQ :ISFILE - ROL A ; 0->0, 2->5 - EOR #$05 ; 0->5, 2->0 - ADC #$41 ; 0->$46, 2->$41 -:JMPEXIT JMP :EXIT2 ; Return error + LDX #4 +:LP LDA FBLOAD,X ; Get address to load to + STA ZPMOS,X + DEX + BPL :LP + JSR PREPATH ; Preprocess pathname + JSR WILDONE ; Handle any wildcards + JSR UPDFB ; Get object info + CMP #$20 + BCS :JMPEXIT ; Error occured + CMP #$01 ; Is it a file + BEQ :ISFILE + ROL A ; 0->0, 2->5 + EOR #$05 ; 0->5, 2->0 + ADC #$41 ; 0->$46, 2->$41 +:JMPEXIT JMP :EXIT2 ; Return error -:ISFILE LDA ZPMOS+4 ; If FBEXEC is zero, use addr - BEQ :CBADDR ; in the control block - LDA FBLOAD+0 ; Otherwise, use file's address - STA ZPMOS+0 - LDA FBLOAD+1 - STA ZPMOS+1 +:ISFILE LDA ZPMOS+4 ; If FBEXEC is zero, use addr + BEQ :CBADDR ; in the control block + LDA FBLOAD+0 ; Otherwise, use file's address + STA ZPMOS+0 + LDA FBLOAD+1 + STA ZPMOS+1 -:CBADDR JSR OPENMOSFILE - BCS :EXIT2 ; File not opened +:CBADDR JSR OPENMOSFILE + BCS :EXIT2 ; File not opened -:L1 LDA OPENPL+5 ; File ref number - JSR READDATA ; Read data from open file +:L1 LDA OPENPL+5 ; File ref number + JSR READDATA ; Read data from open file - PHA ; Save result - LDA OPENPL+5 ; File ref num - STA CLSPL+1 - JSR CLSFILE - PLA - BNE :EXIT2 - JSR COPYFB ; Copy FILEBLK to auxmem - LDA #$01 ; $01=File -:EXIT2 RTS + PHA ; Save result + LDA OPENPL+5 ; File ref num + STA CLSPL+1 + JSR CLSFILE + PLA + BNE :EXIT2 + JSR COPYFB ; Copy FILEBLK to auxmem + LDA #$01 ; $01=File +:EXIT2 RTS * >>> XF2AUX,OSFILERET * A=channel, MOSZP+0/1=address to load to, TO DO: MOS+4/5=length to read -READDATA STA READPL+1 -:RDLP JSR RDFILE - BCS :READERR ; Close file and return any error +READDATA STA READPL+1 +:RDLP JSR RDFILE + BCS :READERR ; Close file and return any error - LDA #<BLKBUF ; LSB of start of data buffer - STA A1L ; A1=>start of data buffer - ADC READPL+6 ; LSB of trans count - TAX ; X=>LSB end of data buffer + LDA #<BLKBUF ; LSB of start of data buffer + STA A1L ; A1=>start of data buffer + ADC READPL+6 ; LSB of trans count + TAX ; X=>LSB end of data buffer - LDA #>BLKBUF ; MSB of start of data buffer - STA A1H ; A1=>start of data buffer - ADC READPL+7 ; MSB of trans count - TAY ; Y=>MSB end of data buffer + LDA #>BLKBUF ; MSB of start of data buffer + STA A1H ; A1=>start of data buffer + ADC READPL+7 ; MSB of trans count + TAY ; Y=>MSB end of data buffer - TXA - BNE :L2 - DEY -:L2 DEX ; XY=XY-1, end address is start+len-1 - STX A2L ; A2=>end of data buffer - STY A2H + TXA + BNE :L2 + DEY +:L2 DEX ; XY=XY-1, end address is start+len-1 + STX A2L ; A2=>end of data buffer + STY A2H - LDA ZPMOS+0 ; A4=>address to load to - STA A4L - LDA ZPMOS+1 - STA A4H - INC ZPMOS+1 ; Step to next block - INC ZPMOS+1 + LDA ZPMOS+0 ; A4=>address to load to + STA A4L + LDA ZPMOS+1 + STA A4H + INC ZPMOS+1 ; Step to next block + INC ZPMOS+1 - SEC ; Main -> AUX - JSR AUXMOVE ; A4 updated to next address - JMP :RDLP + SEC ; Main -> AUX + JSR AUXMOVE ; A4 updated to next address + JMP :RDLP -:READERR CMP #$4C - BNE :EXITERR -:EXITOK LDA #$00 ; $00=Success -:EXITERR RTS +:READERR CMP #$4C + BNE :EXITERR +:EXITOK LDA #$00 ; $00=Success +:EXITERR RTS * ProDOS file handling for MOS OSFILE SAVE call @@ -625,252 +625,252 @@ READDATA STA READPL+1 * A>$1F ProDOS error translated by FILERET SAVEFILE * >>> ENTMAIN - SEC ; Compute file length - LDA FBEND+0 - SBC FBSTRT+0 - STA :LENREM+0 - LDA FBEND+1 - SBC FBSTRT+1 - STA :LENREM+1 - LDA FBEND+2 - SBC FBSTRT+2 - BNE :TOOBIG ; >64K - LDA FBEND+3 - SBC FBSTRT+3 - BEQ :L0 ; >16M -:TOOBIG JMP :CANTSAVE + SEC ; Compute file length + LDA FBEND+0 + SBC FBSTRT+0 + STA LENREM+0 + LDA FBEND+1 + SBC FBSTRT+1 + STA LENREM+1 + LDA FBEND+2 + SBC FBSTRT+2 + BNE :TOOBIG ; >64K + LDA FBEND+3 + SBC FBSTRT+3 + BEQ :L0 ; >16M +:TOOBIG JMP :CANTSAVE -:L0 JSR PREPATH ; Preprocess pathname - JSR EXISTS ; See if file exists ... - CMP #$01 - BEQ :NOTDIR ; Overwrite file - BCC :NOFILE ; Create new file - CMP #$02 - BNE :JMPEXIT2 - LDA #$41 ; Dir exists, return $41 -:JMPEXIT2 JMP :EXIT2 +:L0 JSR PREPATH ; Preprocess pathname + JSR EXISTS ; See if file exists ... + CMP #$01 + BEQ :NOTDIR ; Overwrite file + BCC :NOFILE ; Create new file + CMP #$02 + BNE :JMPEXIT2 + LDA #$41 ; Dir exists, return $41 +:JMPEXIT2 JMP :EXIT2 -:NOTDIR LDA #<MOSFILE ; Attempt to destroy file - STA DESTPL+1 - LDA #>MOSFILE - STA DESTPL+2 - JSR MLI - DB DESTCMD - DW DESTPL - BCS :EXIT2 ; Error trying to delete +:NOTDIR LDA #<MOSFILE ; Attempt to destroy file + STA DESTPL+1 + LDA #>MOSFILE + STA DESTPL+2 + JSR MLI + DB DESTCMD + DW DESTPL + BCS :EXIT2 ; Error trying to delete -:NOFILE LDX FBLOAD+0 ; Auxtype = load address - LDY FBLOAD+1 - JSR CREATEFILE - BCS :JMPEXIT2 ; Error trying to create - JSR OPENMOSFILE - BCS :JMPEXIT2 ; Error trying to open - LDA OPENPL+5 ; File ref number - JSR WRITEDATA +:NOFILE LDX FBLOAD+0 ; Auxtype = load address + LDY FBLOAD+1 + JSR CREATEFILE + BCS :JMPEXIT2 ; Error trying to create + JSR OPENMOSFILE + BCS :JMPEXIT2 ; Error trying to open + LDA OPENPL+5 ; File ref number + JSR WRITEDATA -:EXIT1 PHA ; Save result - LDA OPENPL+5 ; File ref num - STA CLSPL+1 - JSR CLSFILE - PLA - BNE :EXIT2 ; Error returned - JSR UPDFB ; Update FILEBLK - JSR COPYFB ; Copy FILEBLK to aux mem - LDA #$01 ; Return A='File' -:EXIT2 CMP #$4E - BNE :EXIT3 ; Change 'Insuff. access' - LDA #$4F ; to 'Locked' -:EXIT3 RTS +:EXIT1 PHA ; Save result + LDA OPENPL+5 ; File ref num + STA CLSPL+1 + JSR CLSFILE + PLA + BNE :EXIT2 ; Error returned + JSR UPDFB ; Update FILEBLK + JSR COPYFB ; Copy FILEBLK to aux mem + LDA #$01 ; Return A='File' +:EXIT2 CMP #$4E + BNE :EXIT3 ; Change 'Insuff. access' + LDA #$4F ; to 'Locked' +:EXIT3 RTS * >>> XF2AUX,OSFILERET -:CANTSAVE LDA #$5E ; Can't open/create - BRA :EXIT3 ; TO DO: Error=File too long +:CANTSAVE LDA #$5E ; Can't open/create + BRA :EXIT3 ; TO DO: Error=File too long * A=channel, FBSTRT+0/1=address to save from -* :LENREM+0/1=length to write -WRITEDATA STA WRITEPL+1 -:L1 LDA #$00 ; 512 bytes request count - STA WRITEPL+4 - LDA #$02 - STA WRITEPL+5 +* LENREM+0/1=length to write +WRITEDATA STA WRITEPL+1 +:L1 LDA #$00 ; 512 bytes request count + STA WRITEPL+4 + LDA #$02 + STA WRITEPL+5 - LDA :LENREM+1 - CMP #$02 - BCS :L15 ; More than 511 bytes remaining - STA WRITEPL+5 - LDA :LENREM+0 - STA WRITEPL+4 - ORA WRITEPL+5 - BEQ :SAVEOK ; Zero bytes remaining + LDA LENREM+1 + CMP #$02 + BCS :L15 ; More than 511 bytes remaining + STA WRITEPL+5 + LDA LENREM+0 + STA WRITEPL+4 + ORA WRITEPL+5 + BEQ :SAVEOK ; Zero bytes remaining -:L15 SEC - LDA :LENREM+0 ; LENREM=LENREM-count - SBC WRITEPL+4 - STA :LENREM+0 - LDA :LENREM+1 - SBC WRITEPL+5 - STA :LENREM+1 +:L15 SEC + LDA LENREM+0 ; LENREM=LENREM-count + SBC WRITEPL+4 + STA LENREM+0 + LDA LENREM+1 + SBC WRITEPL+5 + STA LENREM+1 - CLC - LDA FBSTRT+0 - STA A1L ; A1=>start of this block - ADC WRITEPL+4 - STA FBSTRT+0 ; Update FBSTRT=>start of next block - TAX ; X=>end of this block + CLC + LDA FBSTRT+0 + STA A1L ; A1=>start of this block + ADC WRITEPL+4 + STA FBSTRT+0 ; Update FBSTRT=>start of next block + TAX ; X=>end of this block - LDA FBSTRT+1 - STA A1H - ADC WRITEPL+5 - STA FBSTRT+1 - TAY + LDA FBSTRT+1 + STA A1H + ADC WRITEPL+5 + STA FBSTRT+1 + TAY - TXA - BNE :L2 - DEY -:L2 DEX ; XY=XY-1, end address is start+len-1 - STX A2L ; A2=>end of data buffer - STY A2H + TXA + BNE :L2 + DEY +:L2 DEX ; XY=XY-1, end address is start+len-1 + STX A2L ; A2=>end of data buffer + STY A2H -:S2 LDA #<BLKBUF - STA A4L - LDA #>BLKBUF - STA A4H - CLC ; Aux -> Main - JSR AUXMOVE ; Copy data from aux to local buffer +:S2 LDA #<BLKBUF + STA A4L + LDA #>BLKBUF + STA A4H + CLC ; Aux -> Main + JSR AUXMOVE ; Copy data from aux to local buffer - JSR WRTFILE ; Write the data - BCS :WRITEERR - JMP :L1 ; Loop back for next block -:SAVEOK ; Enter here with A=$00 -:WRITEERR RTS -:LENREM DW $0000 ; Remaining length + JSR WRTFILE ; Write the data + BCS :WRITEERR + JMP :L1 ; Loop back for next block +:SAVEOK ; Enter here with A=$00 +:WRITEERR RTS +LENREM DW $0000 ; Remaining length -CREATEFILE LDA #$01 ; Storage type - file - STA CREATEPL+7 - LDA #$06 ; Filetype BIN +CREATEFILE LDA #$01 ; Storage type - file + STA CREATEPL+7 + LDA #$06 ; Filetype BIN -CREATEOBJ STA CREATEPL+4 ; Type = BIN or DIR - STX CREATEPL+5 ; Auxtype = load address - STY CREATEPL+6 - JMP CRTFILE +CREATEOBJ STA CREATEPL+4 ; Type = BIN or DIR + STX CREATEPL+5 ; Auxtype = load address + STY CREATEPL+6 + JMP CRTFILE * Process pathname and read object info -UPDPATH JSR PREPATH ; Process pathname - BCC UPDFB ; If no error, update control block - RTS +UPDPATH JSR PREPATH ; Process pathname + BCC UPDFB ; If no error, update control block + RTS * Update FILEBLK before returning to aux memory * Returns A=object type or ProDOS error -UPDFB LDA #<MOSFILE - STA GINFOPL+1 - LDA #>MOSFILE - STA GINFOPL+2 - JSR GETINFO ; Call GET_FILE_INFO - BCC :UPDFB1 - JMP CHKNOTFND +UPDFB LDA #<MOSFILE + STA GINFOPL+1 + LDA #>MOSFILE + STA GINFOPL+2 + JSR GETINFO ; Call GET_FILE_INFO + BCC :UPDFB1 + JMP CHKNOTFND -:UPDFB1 LDA GINFOPL+5 ; Aux type LSB - STA FBLOAD - STA FBEXEC - LDA GINFOPL+6 ; Aux type MSB - STA FBLOAD+1 - STA FBEXEC+1 - STZ FBLOAD+2 - STZ FBEXEC+2 - STZ FBLOAD+3 - STZ FBEXEC+3 +:UPDFB1 LDA GINFOPL+5 ; Aux type LSB + STA FBLOAD + STA FBEXEC + LDA GINFOPL+6 ; Aux type MSB + STA FBLOAD+1 + STA FBEXEC+1 + STZ FBLOAD+2 + STZ FBEXEC+2 + STZ FBLOAD+3 + STZ FBEXEC+3 * - LDA GINFOPL+3 ; Access byte - CMP #$40 ; Locked? - AND #$03 ; ------wr - PHP - STA FBATTR+0 - ASL A ; -----wr- - ASL A ; ----wr-- - ASL A ; ---wr--- - ASL A ; --wr---- - PLP - BCS :UPDFB2 - ORA #$08 ; --wrl--- -:UPDFB2 ORA FBATTR+0 ; --wrl-wr - STA FBATTR+0 + LDA GINFOPL+3 ; Access byte + CMP #$40 ; Locked? + AND #$03 ; ------wr + PHP + STA FBATTR+0 + ASL A ; -----wr- + ASL A ; ----wr-- + ASL A ; ---wr--- + ASL A ; --wr---- + PLP + BCS :UPDFB2 + ORA #$08 ; --wrl--- +:UPDFB2 ORA FBATTR+0 ; --wrl-wr + STA FBATTR+0 * - LDA GINFOPL+11 ; yyyyyyym - PHA - ROR A ; ?yyyyyyy m - LDA GINFOPL+10 ; mmmddddd m - PHA - ROR A ; mmmmdddd - LSR A ; -mmmmddd - LSR A ; --mmmmdd - LSR A ; ---mmmmd - LSR A ; ----mmmm - STA FBATTR+2 - PLA ; mmmddddd - AND #31 ; ---ddddd - STA FBATTR+1 - PLA ; yyyyyyym - SEC - SBC #81*2 ; Offset from 1981 - BCS :UPDFB3 ; 1981-1999 -> 00-18 - ADC #100*2 ; 2000-2080 -> 19-99 -:UPDFB3 PHA ; yyyyyyym - AND #$E0 ; yyy----- - ORA FBATTR+1 ; yyyddddd - STA FBATTR+1 - PLA ; yyyyyyym - AND #$FE ; yyyyyyy0 - ASL A ; yyyyyy00 - ASL A ; yyyyy000 - ASL A ; yyyy0000 - ORA FBATTR+2 ; yyyymmmm - STA FBATTR+2 - STZ FBATTR+3 + LDA GINFOPL+11 ; yyyyyyym + PHA + ROR A ; ?yyyyyyy m + LDA GINFOPL+10 ; mmmddddd m + PHA + ROR A ; mmmmdddd + LSR A ; -mmmmddd + LSR A ; --mmmmdd + LSR A ; ---mmmmd + LSR A ; ----mmmm + STA FBATTR+2 + PLA ; mmmddddd + AND #31 ; ---ddddd + STA FBATTR+1 + PLA ; yyyyyyym + SEC + SBC #81*2 ; Offset from 1981 + BCS :UPDFB3 ; 1981-1999 -> 00-18 + ADC #100*2 ; 2000-2080 -> 19-99 +:UPDFB3 PHA ; yyyyyyym + AND #$E0 ; yyy----- + ORA FBATTR+1 ; yyyddddd + STA FBATTR+1 + PLA ; yyyyyyym + AND #$FE ; yyyyyyy0 + ASL A ; yyyyyy00 + ASL A ; yyyyy000 + ASL A ; yyyy0000 + ORA FBATTR+2 ; yyyymmmm + STA FBATTR+2 + STZ FBATTR+3 - JSR OPENMOSFILE ; Open file - BCS :ERR - LDA OPENPL+5 ; File ref number - STA GMARKPL+1 - JSR MLI ; Call GET_EOF MLI - DB GEOFCMD - DW GMARKPL ; MARK parms same as EOF - LDA GMARKPL+2 - STA FBSIZE+0 - LDA GMARKPL+3 - STA FBSIZE+1 - LDA GMARKPL+4 - STA FBSIZE+2 - STZ FBSIZE+3 - LDA OPENPL+5 ; File ref number - STA CLSPL+1 - JSR CLSFILE - LDA #$01 ; Prepare A=file - LDX GINFOPL+7 - CPX #$0D ; Is it a directory? - BNE :UPDFB5 - LDA #$02 ; Return A=directory -:UPDFB5 RTS + JSR OPENMOSFILE ; Open file + BCS :ERR + LDA OPENPL+5 ; File ref number + STA GMARKPL+1 + JSR MLI ; Call GET_EOF MLI + DB GEOFCMD + DW GMARKPL ; MARK parms same as EOF + LDA GMARKPL+2 + STA FBSIZE+0 + LDA GMARKPL+3 + STA FBSIZE+1 + LDA GMARKPL+4 + STA FBSIZE+2 + STZ FBSIZE+3 + LDA OPENPL+5 ; File ref number + STA CLSPL+1 + JSR CLSFILE + LDA #$01 ; Prepare A=file + LDX GINFOPL+7 + CPX #$0D ; Is it a directory? + BNE :UPDFB5 + LDA #$02 ; Return A=directory +:UPDFB5 RTS :ERR -CHKNOTFND CMP #$44 ; Convert ProDOS 'not found' - BEQ :NOTFND ; into result=$00 - CMP #$45 - BEQ :NOTFND - CMP #$46 - BNE :CHKNOTFND2 -:NOTFND LDA #$00 -:CHKNOTFND2 RTS +CHKNOTFND CMP #$44 ; Convert ProDOS 'not found' + BEQ :NOTFND ; into result=$00 + CMP #$45 + BEQ :NOTFND + CMP #$46 + BNE :CHKNOTFND2 +:NOTFND LDA #$00 +:CHKNOTFND2 RTS * Quit to ProDOS -QUIT INC $3F4 ; Invalidate powerup byte - STA $C054 ; PAGE2 off - JSR MLI - DB QUITCMD - DW QUITPL - RTS +QUIT INC $3F4 ; Invalidate powerup byte + STA $C054 ; PAGE2 off + JSR MLI + DB QUITCMD + DW QUITPL + RTS * Used for *CAT, *EX and *INFO * On entry: b7=0 - short info (*CAT) @@ -878,239 +878,239 @@ QUIT INC $3F4 ; Invalidate powerup byte * b6=0 - single entry, parameter is object (*INFO) * b6=1 - multiple items, parameter is dir (*CAT, *EX) * -CATALOG >>> ENTMAIN - STA CATARG ; Stash argument - CMP #$80 ; Is it *INFO? - BNE :NOTINFO - JMP INFO ; Handle entry for *INFO -:NOTINFO LDA MOSFILE ; Length of pathname - BEQ :NOPATH ; If zero use prefix - JSR PREPATH ; Preprocess pathname - JSR WILDONE ; Handle any wildcards - JSR EXISTS ; See if path exists ... - CMP #$01 ; ... and is a file - BNE :NOTFILE - LDA #$46 ; Not found (TO DO: err code?) - BRA CATEXIT -:NOTFILE LDA #<MOSFILE - STA OPENPL+1 - LDA #>MOSFILE - STA OPENPL+2 - BRA :OPEN -:NOPATH JSR GETPREF ; Fetch prefix into PREFIX - LDA #<PREFIX - STA OPENPL+1 - LDA #>PREFIX - STA OPENPL+2 -:OPEN JSR OPENFILE - BCS CATEXIT ; Can't open dir +CATALOG >>> ENTMAIN + STA CATARG ; Stash argument + CMP #$80 ; Is it *INFO? + BNE :NOTINFO + JMP INFO ; Handle entry for *INFO +:NOTINFO LDA MOSFILE ; Length of pathname + BEQ :NOPATH ; If zero use prefix + JSR PREPATH ; Preprocess pathname + JSR WILDONE ; Handle any wildcards + JSR EXISTS ; See if path exists ... + CMP #$01 ; ... and is a file + BNE :NOTFILE + LDA #$46 ; Not found (TO DO: err code?) + BRA CATEXIT +:NOTFILE LDA #<MOSFILE + STA OPENPL+1 + LDA #>MOSFILE + STA OPENPL+2 + BRA :OPEN +:NOPATH JSR GETPREF ; Fetch prefix into PREFIX + LDA #<PREFIX + STA OPENPL+1 + LDA #>PREFIX + STA OPENPL+2 +:OPEN JSR OPENFILE + BCS CATEXIT ; Can't open dir CATREENTRY - LDA OPENPL+5 ; File ref num - STA READPL+1 - JSR RDFILE - BCC :S1 - CMP #$4C ; EOF - BEQ :EOF - BRA :READERR -:S1 JSR COPYAUXBLK - >>> XF2AUX,PRONEBLK + LDA OPENPL+5 ; File ref num + STA READPL+1 + JSR RDFILE + BCC :S1 + CMP #$4C ; EOF + BEQ :EOF + BRA :READERR +:S1 JSR COPYAUXBLK + >>> XF2AUX,PRONEBLK :READERR -:EOF LDA OPENPL+5 ; File ref num - STA CLSPL+1 - JSR CLSFILE -CATEXIT >>> XF2AUX,STARCATRET +:EOF LDA OPENPL+5 ; File ref num + STA CLSPL+1 + JSR CLSFILE +CATEXIT >>> XF2AUX,STARCATRET * PRONEBLK call returns here ... CATALOGRET - >>> ENTMAIN - LDA CATARG - CMP #$80 ; Is this an *INFO call? - BEQ INFOREENTRY - BRA CATREENTRY + >>> ENTMAIN + LDA CATARG + CMP #$80 ; Is this an *INFO call? + BEQ INFOREENTRY + BRA CATREENTRY -CATARG DB $00 +CATARG DB $00 * Handle *INFO -INFO JSR PREPATH ; Preprocess pathname - SEC - JSR WILDCARD ; Handle any wildcards - JSR EXISTS ; Check matches something - CMP #$00 - BNE INFOFIRST - JSR CLSDIR - LDA #$46 ; Not found (TO DO: err code?) - BRA CATEXIT +INFO JSR PREPATH ; Preprocess pathname + SEC + JSR WILDCARD ; Handle any wildcards + JSR EXISTS ; Check matches something + CMP #$00 + BNE INFOFIRST + JSR CLSDIR + LDA #$46 ; Not found (TO DO: err code?) + BRA CATEXIT INFOREENTRY - JSR WILDNEXT2 ; Start of new block - BCS INFOEXIT ; No more matches -INFOFIRST LDA WILDIDX - CMP #$FF ; Is WILDNEXT about to read new blk? - BEQ :DONEBLK ; If so, print this blk first - JSR WILDNEXT2 - BCS :DONEBLK ; If no more matches - BRA INFOFIRST -:DONEBLK JSR COPYAUXBLK - >>> XF2AUX,PRONEBLK + JSR WILDNEXT2 ; Start of new block + BCS INFOEXIT ; No more matches +INFOFIRST LDA WILDIDX + CMP #$FF ; Is WILDNEXT about to read new blk? + BEQ :DONEBLK ; If so, print this blk first + JSR WILDNEXT2 + BCS :DONEBLK ; If no more matches + BRA INFOFIRST +:DONEBLK JSR COPYAUXBLK + >>> XF2AUX,PRONEBLK -INFOEXIT CMP #$4C ; EOF - BNE INFOCLS - LDA #$00 ; EOF is not an error -INFOCLS JSR CLSDIR ; Be sure to close it! - BRA CATEXIT +INFOEXIT CMP #$4C ; EOF + BNE INFOCLS + LDA #$00 ; EOF is not an error +INFOCLS JSR CLSDIR ; Be sure to close it! + BRA CATEXIT * Set prefix. Used by *CHDIR to change directory -SETPFX >>> ENTMAIN - JSR PREPATH ; Preprocess pathname - JSR WILDONE ; Handle any wildcards - BCS :ERR - LDA #<MOSFILE - STA SPFXPL+1 - LDA #>MOSFILE - STA SPFXPL+2 - JSR MLI ; SET_PREFIX - DB SPFXCMD - DW SPFXPL -:EXIT >>> XF2AUX,CHDIRRET -:ERR LDA #$40 ; Invalid pathname syn - BRA :EXIT +SETPFX >>> ENTMAIN + JSR PREPATH ; Preprocess pathname + JSR WILDONE ; Handle any wildcards + BCS :ERR + LDA #<MOSFILE + STA SPFXPL+1 + LDA #>MOSFILE + STA SPFXPL+2 + JSR MLI ; SET_PREFIX + DB SPFXCMD + DW SPFXPL +:EXIT >>> XF2AUX,CHDIRRET +:ERR LDA #$40 ; Invalid pathname syn + BRA :EXIT * Obtain info on blocks used/total blocks -DRVINFO >>> ENTMAIN - JSR PREPATH - BCS :ERR - LDA #<MOSFILE - STA GINFOPL+1 - LDA #>MOSFILE - STA GINFOPL+2 - JSR GETINFO ; GET_FILE_INFO - BCS :EXIT - PHA - >>> ALTZP ; Alt ZP & Alt LC on - LDA GINFOPL+8 ; Blcks used LSB - STA AUXBLK - LDA GINFOPL+9 ; Blks used MSB - STA AUXBLK+1 - LDA GINFOPL+5 ; Tot blks LSB - STA AUXBLK+2 - LDA GINFOPL+6 ; Tot blks MSB - STA AUXBLK+3 - >>> MAINZP ; ALt ZP off, ROM back in - PLA -:EXIT >>> XF2AUX,FREERET -:ERR LDA #$40 ; Invalid pathname syn - BRA :EXIT +DRVINFO >>> ENTMAIN + JSR PREPATH + BCS :ERR + LDA #<MOSFILE + STA GINFOPL+1 + LDA #>MOSFILE + STA GINFOPL+2 + JSR GETINFO ; GET_FILE_INFO + BCS :EXIT + PHA + >>> ALTZP ; Alt ZP & Alt LC on + LDA GINFOPL+8 ; Blcks used LSB + STA AUXBLK + LDA GINFOPL+9 ; Blks used MSB + STA AUXBLK+1 + LDA GINFOPL+5 ; Tot blks LSB + STA AUXBLK+2 + LDA GINFOPL+6 ; Tot blks MSB + STA AUXBLK+3 + >>> MAINZP ; ALt ZP off, ROM back in + PLA +:EXIT >>> XF2AUX,FREERET +:ERR LDA #$40 ; Invalid pathname syn + BRA :EXIT * Change file permissions, for *ACCESS * Filename in MOSFILE, flags in MOSFILE2 -SETPERM >>> ENTMAIN - JSR PREPATH ; Preprocess pathname - BCS :SYNERR - CLC - JSR WILDCARD ; Handle any wildcards - BCS :NONE - STZ :LFLAG - STZ :WFLAG - STZ :RFLAG - LDX MOSFILE2 ; Length of arg2 - INX -:L1 DEX - CPX #$00 - BEQ :MAINLOOP - LDA MOSFILE2,X ; Read arg2 char - CMP #'L' ; L=Locked - BNE :S1 - STA :LFLAG - BRA :L1 -:S1 CMP #'R' ; R=Readable - BNE :S2 - STA :RFLAG - BRA :L1 -:S2 CMP #'W' ; W=Writable - BNE :ERR2 ; Bad attribute - STA :WFLAG - BRA :L1 -:SYNERR LDA #$40 ; Invalid pathname syn - BRA :EXIT -:NONE JSR CLSDIR - LDA #$46 ; 'File not found' - BRA :EXIT -:MAINLOOP LDA #<MOSFILE - STA GINFOPL+1 - LDA #>MOSFILE - STA GINFOPL+2 - JSR GETINFO ; GET_FILE_INFO - BCS :EXIT - LDA GINFOPL+3 ; Access byte - AND #$03 ; Start with R, W off - ORA #$C0 ; Start with dest/ren on - LDX :RFLAG - BEQ :S3 - ORA #$01 ; Turn on read enable -:S3 LDX :WFLAG - BEQ :S4 - ORA #$02 ; Turn on write enable -:S4 LDX :LFLAG - BEQ :S5 - AND #$3D ; Turn off destroy/ren/write -:S5 STA GINFOPL+3 ; Access byte - JSR SETINFO ; SET_FILE_INFO - JSR WILDNEXT - BCS :NOMORE - BRA :MAINLOOP -:EXIT >>> XF2AUX,ACCRET -:NOMORE JSR CLSDIR - LDA #$00 - BRA :EXIT -:ERR2 LDA #$53 ; Invalid parameter - BRA :EXIT -:LFLAG DB $00 ; 'L' attribute -:WFLAG DB $00 ; 'W' attribute -:RFLAG DB $00 ; 'R' attribute +SETPERM >>> ENTMAIN + JSR PREPATH ; Preprocess pathname + BCS :SYNERR + CLC + JSR WILDCARD ; Handle any wildcards + BCS :NONE + STZ :LFLAG + STZ :WFLAG + STZ :RFLAG + LDX MOSFILE2 ; Length of arg2 + INX +:L1 DEX + CPX #$00 + BEQ :MAINLOOP + LDA MOSFILE2,X ; Read arg2 char + CMP #'L' ; L=Locked + BNE :S1 + STA :LFLAG + BRA :L1 +:S1 CMP #'R' ; R=Readable + BNE :S2 + STA :RFLAG + BRA :L1 +:S2 CMP #'W' ; W=Writable + BNE :ERR2 ; Bad attribute + STA :WFLAG + BRA :L1 +:SYNERR LDA #$40 ; Invalid pathname syn + BRA :EXIT +:NONE JSR CLSDIR + LDA #$46 ; 'File not found' + BRA :EXIT +:MAINLOOP LDA #<MOSFILE + STA GINFOPL+1 + LDA #>MOSFILE + STA GINFOPL+2 + JSR GETINFO ; GET_FILE_INFO + BCS :EXIT + LDA GINFOPL+3 ; Access byte + AND #$03 ; Start with R, W off + ORA #$C0 ; Start with dest/ren on + LDX :RFLAG + BEQ :S3 + ORA #$01 ; Turn on read enable +:S3 LDX :WFLAG + BEQ :S4 + ORA #$02 ; Turn on write enable +:S4 LDX :LFLAG + BEQ :S5 + AND #$3D ; Turn off destroy/ren/write +:S5 STA GINFOPL+3 ; Access byte + JSR SETINFO ; SET_FILE_INFO + JSR WILDNEXT + BCS :NOMORE + BRA :MAINLOOP +:EXIT >>> XF2AUX,ACCRET +:NOMORE JSR CLSDIR + LDA #$00 + BRA :EXIT +:ERR2 LDA #$53 ; Invalid parameter + BRA :EXIT +:LFLAG DB $00 ; 'L' attribute +:WFLAG DB $00 ; 'W' attribute +:RFLAG DB $00 ; 'R' attribute * Multi file delete, for *DESTROY * Filename in MOSFILE -MULTIDEL >>> ENTMAIN - JSR PREPATH ; Preprocess pathname - BCS :SYNERR - CLC - JSR WILDCARD ; Handle any wildcards - BCS :NONE - BRA :MAINLOOP -:SYNERR LDA #$40 ; Invalid pathname syn - BRA :EXIT -:NONE JSR CLSDIR - LDA #$46 ; 'File not found' - BRA :EXIT -:MAINLOOP JSR DODELETE - BCS :DELERR - JSR WILDNEXT - BCS :NOMORE - BRA :MAINLOOP -:EXIT >>> XF2AUX,DESTRET -:DELERR PHA - JSR CLSDIR - PLA - BRA :EXIT -:NOMORE JSR CLSDIR - LDA #$00 - BRA :EXIT +MULTIDEL >>> ENTMAIN + JSR PREPATH ; Preprocess pathname + BCS :SYNERR + CLC + JSR WILDCARD ; Handle any wildcards + BCS :NONE + BRA :MAINLOOP +:SYNERR LDA #$40 ; Invalid pathname syn + BRA :EXIT +:NONE JSR CLSDIR + LDA #$46 ; 'File not found' + BRA :EXIT +:MAINLOOP JSR DODELETE + BCS :DELERR + JSR WILDNEXT + BCS :NOMORE + BRA :MAINLOOP +:EXIT >>> XF2AUX,DESTRET +:DELERR PHA + JSR CLSDIR + PLA + BRA :EXIT +:NOMORE JSR CLSDIR + LDA #$00 + BRA :EXIT * Read machid from auxmem -MACHRD LDA $C081 - LDA $C081 - LDA $FBC0 - SEC - JSR $FE1F - BRA MAINRDEXIT +MACHRD LDA $C081 + LDA $C081 + LDA $FBC0 + SEC + JSR $FE1F + BRA MAINRDEXIT * Read mainmem from auxmem -MAINRDMEM STA A1L - STY A1H - LDA $C081 - LDA $C081 - LDA (A1L) -MAINRDEXIT >>> XF2AUX,NULLRTS ; Back to an RTS +MAINRDMEM STA A1L + STY A1H + LDA $C081 + LDA $C081 + LDA (A1L) +MAINRDEXIT >>> XF2AUX,NULLRTS ; Back to an RTS diff --git a/mainmem.wild.s b/mainmem.wild.s index 06e6dd5..2f228dd 100644 --- a/mainmem.wild.s +++ b/mainmem.wild.s @@ -407,6 +407,8 @@ MATCHBUF DS 65 ; For storing match results (Pascal str) + +