From 39d6fad47151186cbb42fd6ad353f9fdede0b7f5 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Mon, 30 Aug 2021 19:08:22 -0400 Subject: [PATCH] Merged JGH's memory reorganization changes. --- applecorn.po | Bin 819200 -> 819200 bytes applecorn.s | 20 +--- auxmem.hostfs.s | 167 +++++++++++++++++++++++-------- auxmem.oscli.s | 158 +++++++++++++++++------------ import | 14 +++ loader.s | 3 +- mainmem.s | 260 +++++++++++++++++++++++++++++------------------- memmap.txt | 66 ++++++++++++ 8 files changed, 462 insertions(+), 226 deletions(-) create mode 100755 import create mode 100644 memmap.txt diff --git a/applecorn.po b/applecorn.po index d79041833b90d0f57cb28d5d62bd31028a5e8667..106a63ba9f63624cc31573b968f03d08e7e87a2c 100644 GIT binary patch delta 22108 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 UBpi%{gOPAB68^ss36GNh3uiQs5&!@I delta 12671 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 C?p?kB diff --git a/applecorn.s b/applecorn.s index aaa2d28..1b72b4b 100644 --- a/applecorn.s +++ b/applecorn.s @@ -40,18 +40,6 @@ A2IRQV EQU $3FE MLI EQU $BF00 * IO Buffer for reading file (1024 bytes) -*IOBUF0 EQU $4000 ; For loading/saving, OSFILE, *. -*IOBUF1 EQU $4400 ; Four open files for langs -*IOBUF2 EQU $4800 -*IOBUF3 EQU $4C00 -*IOBUF4 EQU $5000 - -*IOBUF0 EQU $5000 ; For loading/saving, OSFILE, *. -*IOBUF1 EQU $5400 ; Four open files for langs -*IOBUF2 EQU $5800 -*IOBUF3 EQU $5C00 -*IOBUF4 EQU $6000 - IOBUF0 EQU $0C00 ; For loading/saving, OSFILE, *. IOBUF1 EQU $1000 ; Four open files for langs IOBUF2 EQU $1400 @@ -59,11 +47,8 @@ IOBUF3 EQU $1800 IOBUF4 EQU $1C00 * 512 byte buffer sufficient for one disk block -*BLKBUF EQU $5200 -*BLKBUFEND EQU $5400 - -BLKBUF EQU $6200 ; Is this ever used at same time -BLKBUFEND EQU $6400 ; as IOBUF0? +BLKBUF EQU $5000 ; Can't use $400 as ProDOS uses +BLKBUFEND EQU $5200 ; 'hidden' bytes within screen * Address in aux memory where ROM will be loaded AUXADDR EQU $8000 @@ -190,5 +175,6 @@ MAINZP MAC PUT AUXMEM.CHARIO PUT AUXMEM.MISC +* Automatically save the object file: SAV APPLECORN diff --git a/auxmem.hostfs.s b/auxmem.hostfs.s index bad7c53..bba53b9 100644 --- a/auxmem.hostfs.s +++ b/auxmem.hostfs.s @@ -5,6 +5,8 @@ * 29-Aug-2021 Generalised CHKERROR routone, checks for and * translates ProDOS errors into Acorn errors * Set &E0=&FF for testing to report ProDOS errors +* 30-Aug-2021 FSC commands moved to here +* Command line set by *RUN, and read by OSARGS FSXREG EQU $B0 @@ -13,6 +15,7 @@ FSAREG EQU $B2 FSCTRL EQU FSXREG FSPTR1 EQU $B4 FSPTR2 EQU $B6 +FSCMDLINE EQU $CE * OSFIND - open/close a file for byte access @@ -100,31 +103,54 @@ OSBGETRET * OSARGS - adjust file arguments * On entry, A=action +* Y<>0 A=FF Flush channel Y +* A=00 Read PTR#Y +* A=01 Write PTR#Y +* A=02 Read EXT#Y +* A=03 Write EXT#Y +* Y=0 A=FF Flush all channels +* A=00 Return filing system number in A +* A=01 Read command line address * X=>4 byte ZP control block * Y=file handle -ARGSHND PHA - PHX +* On exit, A=0 - implemented (except ARGS 0,0) +* A - preserved=unimplemented +* X,Y - preserved +* control block updated for 'read' calls +* control block preserved otherwise +* +ARGSHND PHX PHY + PHA CPY #$00 BNE :HASFILE CMP #$00 ; Y=0,A=0 => current file sys BNE :S1 - PLY - PLX PLA LDA #105 ; 105=AppleFS filing system + PLY + PLX RTS + :S1 CMP #$01 ; Y=0,A=1 => addr of CLI BNE :S2 -* TODO: Implement this for *RUN and *command - JSR BEEP - BRA :IEXIT + LDA FSCMDLINE+0 + STA $00,X + LDA FSCMDLINE+1 + STA $01,X + LDA #$FF + STA $02,X + STA $03,X + JMP OSARGSDONE ; Implemented + :S2 CMP #$FF ; Y=0,A=FF => flush all files BNE :IEXIT >>> WRTMAIN STZ MOSFILE ; Zero means flush all >>> WRTAUX - BRA :IFLUSH + JMP :FLUSH +:IEXIT JMP :EXIT ; Exit preserved + :HASFILE >>> WRTMAIN STY MOSFILE ; File ref num STX MOSFILE+1 ; Pointer to ZP control block @@ -135,8 +161,7 @@ ARGSHND PHA STZ MOSFILE+2 ; 0 means get pos >>> WRTAUX >>> XF2MAIN,TELL -:IEXIT BRA :IEXIT2 -:IFLUSH BRA :FLUSH + :S3 CMP #$01 ; Y!=0,A=1 => write seq ptr BNE :S4 >>> WRTMAIN @@ -148,25 +173,28 @@ ARGSHND PHA STA MOSFILE+4 >>> WRTAUX >>> XF2MAIN,SEEK -:IEXIT2 BRA :EXIT + :S4 CMP #$02 ; Y!=0,A=2 => read file len BNE :S5 >>> WRTMAIN STA MOSFILE+2 ; Non-zero means get len >>> WRTAUX >>> XF2MAIN,TELL + :S5 CMP #$FF ; Y!=0,A=FF => flush file BNE :EXIT :FLUSH >>> XF2MAIN,FLUSH -:EXIT PLY - PLX - PLA - RTS -OSARGSRET - >>> ENTAUX + +:EXIT PLA ; Unimplemented + PLY + PLX + RTS + +OSARGSRET >>> ENTAUX +OSARGSDONE PLA + LDA #0 ; Implemented PLY PLX - PLA RTS @@ -245,7 +273,7 @@ FILEHND PHX BEQ :LOAD ; A=FF -> LOAD CMP #$06 BEQ :DELETE ; A=06 -> DELETE -* BCC :INFO ; A=01-05 -> INFO + BCC :JMPINFO ; A=01-05 -> INFO CMP #$08 BEQ :MKDIR ; A=08 -> MKDIR * LDA #>> XF2MAIN,INFOFILE +:JMPINFO JMP :INFO :SAVE >>> XF2MAIN,SAVEFILE :LOAD >>> XF2MAIN,LOADFILE :DELETE >>> XF2MAIN,DELFILE :MKDIR >>> XF2MAIN,MAKEDIR +:INFO >>> XF2MAIN,INFOFILE * On return here, A<$20 return to caller, A>$1F ProDOS error OSFILERET @@ -387,6 +415,37 @@ OSFSCM ASC 'OSFSC.' DB $00 +* FSC Command Table +******************* +* These are commands specific to the filing system that can't be +* called via OSFILE, OSFSC, etc. +* +FSCCOMMAND ASC 'CHDIR' + DB $C0 + DW FSCCHDIR-1 ; Change directory, XY=>params + ASC 'CD' + DB $C0 + DW FSCCHDIR-1 ; Change directory, XY=>params + ASC 'DIR' + DB $C0 + 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 + ASC 'FREE' + DB $80 + DW FSCFREE-1 ; FREE (, LPTR=>params + ASC 'ACCESS' + DB $80 + DW FSCACCESS-1 ; ACCESS params + ASC 'TITLE' + DB $80 + DW FSCTITLE-1 ; TITLE () , LPTR=>params +* + DB $FF ; Terminator + + * OSFSC - miscellanous file system calls ***************************************** * On entry, A=action, XY=>command line @@ -397,33 +456,35 @@ OSFSCM ASC 'OSFSC.' * * TO DO: use jump table FSCHND - CMP #$40 - BEQ FSCCHDIR - CMP #$41 - BEQ FSCDRIVE - CMP #$42 - BEQ FSCFREE - CMP #$43 - BEQ FSCACCESS - CMP #$42 - BEQ FSCTITLE +* CMP #$40 +* BEQ FSCCHDIR +* CMP #$41 +* BEQ FSCDRIVE +* CMP #$42 +* BEQ FSCFREE +* CMP #$43 +* BEQ FSCACCESS +* CMP #$42 +* BEQ FSCTITLE - CMP #$0C - BEQ FSCREN ; A=12 - *RENAME CMP #$00 BEQ FSOPT ; A=0 - *OPT CMP #$01 BEQ CHKEOF ; A=1 - Read EOF CMP #$02 BEQ FSCRUN ; A=2 - */filename + CMP #$03 + BEQ FSC03 ; A=3 - *command CMP #$04 BEQ FSCRUN ; A=4 - *RUN CMP #$05 - BEQ FSCCAT ; A=5 - *CAT + BEQ JMPCAT ; A=5 - *CAT CMP #$09 - BEQ FSCCAT ; A=9 - *EX + BEQ JMPCAT ; A=9 - *EX CMP #$0A - BEQ FSCCAT ; A=10 - *INFO + BEQ JMPCAT ; A=10 - *INFO + CMP #$0C + BEQ FSCREN ; A=12 - *RENAME FSCDRIVE FSCFREE FSCACCESS @@ -435,8 +496,29 @@ FSCUKN PHA PLA FSCNULL RTS +JMPCAT JMP FSCCAT + +FSC03 JSR XYtoLPTR + LDX #<FSCCOMMAND + LDY #>FSCCOMMAND + JSR CLILOOKUP + BEQ FSCNULL + JSR LPTRtoXY +* FSCRUN STX OSFILECB ; Pointer to filename STY OSFILECB+1 + JSR XYtoLPTR +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 +* +* *BUG* OSFILE &FF should give error if trying to load a directory! LDA #$FF ; OSFILE load flag STA OSFILECB+6 ; Use file's address LDX #<OSFILECB ; Pointer to control block @@ -445,12 +527,12 @@ FSCRUN STX OSFILECB ; Pointer to filename JSR :CALL LDA #$00 ; A=0 on return RTS -:CALL JMP (OSFILECB+6) ; Jump to EXEC addr - RTS +:CALL LDA #$01 ; A=1 - entering code + SEC ; Not from RESET + JMP (OSFILECB+6) ; Jump to EXEC addr FSCREN JSR XYtoLPTR ; Pointer to command line - JSR RENAME - RTS + JMP RENAME FSCCHDIR STX ZP1+0 STY ZP1+1 @@ -811,14 +893,15 @@ MKERROR4 * $55 - Volume Control Block table full. * $56 - Bad buffer address. * $57 - Duplicate volume. -* ($58) $27 - I/O error -* ($59) $28 - No device connected Disk not present +* ($58) $27 - I/O error (disk not formatted) +* ($59) $28 - No device connected (drive not present) Disk not present * $5A ($29) - Bit map disk address is impossible. Sector not found * $5B $2A - * ($5C) $2B - Disk write protected. Disk write protected * $5D ($2C) - (EOF during load or save) Data lost * $5E ($2D) - (Couldn't open to save) Can't save * ($5F) $2E - Disk switched Disk changed +* $2F - Device is offline (drive empty) * * AcornOS ProDOS diff --git a/auxmem.oscli.s b/auxmem.oscli.s index 99193e2..d38f168 100644 --- a/auxmem.oscli.s +++ b/auxmem.oscli.s @@ -43,19 +43,20 @@ CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' ASC 'CDIR' DB $88 DW STARFILE-1 ; CDIR -> OSFILE 08, CBLK=>filename -* other filing commands - ASC 'CHDIR' - DB $C0 - DW STARFSC-1 ; Should be a FSC 3 call, XY=>params - ASC 'CD' - DB $C0 - DW STARFSC-1 ; Should be a FSC 3 call, XY=>params - ASC 'DIR' - DB $C0 - DW STARFSC-1 ; Should be a FSC 3 call, XY=>params - ASC 'DRIVE' - DB $C1 - DW STARFSC-1 ; Should be a FSC 3 call, XY=>params +* filing-system-specific commands +* Moved to HostFS +* ASC 'CHDIR' +* DB $C0 +* DW STARFSC-1 ; Should be a FSC 3 call, XY=>params +* ASC 'CD' +* DB $C0 +* DW STARFSC-1 ; Should be a FSC 3 call, XY=>params +* ASC 'DIR' +* DB $C0 +* DW STARFSC-1 ; Should be a FSC 3 call, XY=>params +* ASC 'DRIVE' +* DB $C1 +* DW STARFSC-1 ; Should be a FSC 3 call, XY=>params * FREE (<drive>) * ACCESS <file> <access> * TITLE (<drive>) <title> @@ -83,7 +84,79 @@ CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' * TYPE <file> * BUILD <file> * terminator - DB $00 + DB $FF + + +* Command table lookup +* On entry, (OSLPTR)=>command string +* XY=>command table +* On exit, A=0 done, command called +* A<>0 no match +* +* Search command table +CLILOOKUP STX OSTEXT+0 ; Start of command table + STY OSTEXT+1 + LDX #0 ; (ZP,X)=>command table +CLILP4 LDY #0 ; Start of command line +CLILP5 LDA (OSTEXT,X) + BMI CLIMATCH ; End of table string + EOR (OSLPTR),Y + AND #$DF ; Force upper case match + BNE CLINOMATCH + JSR CLISTEP ; Step to next table char + INY ; Step to next command char + BNE CLILP5 ; Loop to check + +CLINOMATCH LDA (OSLPTR),Y + CMP #'.' ; Abbreviation? + BEQ CLIDOT +CLINEXT JSR CLISTEP ; No match, step to next entry + BPL CLINEXT +CLINEXT2 JSR CLISTEP ; Step past byte, address + JSR CLISTEP + JSR CLISTEP + BPL CLILP4 ; Loop to check next + RTS ; Exit, A>$7F + +CLIDOT LDA (OSTEXT,X) + BMI CLINEXT2 ; Dot after full word, no match +CLIDOT2 JSR CLISTEP ; Step to command address + BPL CLIDOT2 + INY ; Step past dot + BNE CLIMATCH2 ; Jump to this command + +CLIMATCH LDA (OSLPTR),Y + CMP #'.' + BEQ CLINEXT ; Longer abbreviation, eg 'CAT.' + CMP #'A' + BCS CLINEXT ; More letters, eg 'HELPER' +CLIMATCH2 JSR CLIMATCH3 ; Call the routine + LDA #0 + RTS ; Return A=0 to claim + +CLIMATCH3 JSR SKIPSPC ; (OSLPTR),Y=>parameters + LDA (OSTEXT,X) ; Command byte + PHA + JSR CLISTEP ; Address low byte + STA OSTEMP + JSR CLISTEP ; Address high byte + PLX ; Get command byte + PHA ; Push address high + LDA OSTEMP + PHA ; Push address low + TXA ; Command byte + PHA + ASL A ; Drop bit 7 + BEQ CLICALL ; If $80 don't convert LPTR + JSR LPTRtoXY ; XY=>parameters +CLICALL PLA ; A=command parameter +CLIDONE RTS ; Call command routine + +CLISTEP INC OSTEXT+0,X ; Point to next table byte + BNE CLISTEP2 + INC OSTEXT+1,X +CLISTEP2 LDA (OSTEXT,X) ; Get next byte + RTS * OSCLI HANDLER @@ -113,56 +186,11 @@ CLILP2 LDA (OSLPTR),Y DEY JSR LPTRtoXY ; Add Y to LPTR JSR XYtoLPTR ; LPTR=>start of actual command -* -* Search command table - LDX #0 ; Start of command table -CLILP4 LDY #0 ; Start of command line -CLILP5 LDA CMDTABLE,X - BEQ CLIUNKNOWN ; End of command table - BMI CLIMATCH ; End of table string - EOR (OSLPTR),Y - AND #$DF ; Force upper case match - BNE CLINOMATCH - INX ; Step to next table char - INY ; Step to next command char - BNE CLILP5 ; Loop to check - -CLINOMATCH LDA (OSLPTR),Y - CMP #'.' ; Abbreviation? - BEQ CLIDOT -CLINEXT INX ; No match, step to next entry - LDA CMDTABLE,X - BPL CLINEXT -CLINEXT2 INX ; Step past byte, address - INX - INX - BNE CLILP4 ; Loop to check next - -CLIDOT LDA CMDTABLE,X - BMI CLINEXT2 ; Dot after full word, no match -CLIDOT2 INX ; Step to command address - LDA CMDTABLE,X - BPL CLIDOT2 - INY ; Step past dot - BNE CLIMATCH2 ; Jump to this command - -CLIMATCH LDA (OSLPTR),Y - CMP #'.' - BEQ CLINEXT ; Longer abbreviation, eg 'CAT.' - CMP #'A' - BCS CLINEXT ; More letters, eg 'HELPER' -CLIMATCH2 JSR SKIPSPC ; (OSLPTR),Y=>parameters - LDA CMDTABLE+2,X ; Push destination address - PHA - LDA CMDTABLE+1,X - PHA - LDA CMDTABLE+0,X ; A=command parameter - PHA - ASL A ; Drop bit 7 - BEQ CLICALL ; If $80 don't convert LPTR - JSR LPTRtoXY ; XY=>parameters -CLICALL PLA ; A=command parameter -CLIDONE RTS + LDX #<CMDTABLE ; XY=>command table + LDY #>CMDTABLE + JSR CLILOOKUP ; Look for command + BNE CLIUNKNOWN ; No match + RTS CLISLASH JSR SKIPSPC BEQ CLIDONE ; */<cr> @@ -347,7 +375,7 @@ STARHELP1 LDX #0 JSR OSWRCH STARHELPLP1 LDY #10 LDA CMDTABLE,X - BEQ STARHELP4 + BMI STARHELP4 STARHELPLP2 LDA CMDTABLE,X BMI STARHELP3 JSR OSWRCH diff --git a/import b/import new file mode 100755 index 0000000..2cc6c9c --- /dev/null +++ b/import @@ -0,0 +1,14 @@ +#!/bin/bash + +# For importing JGH's files into Github + +for i in *.s; do + fromdos $i + sed -i s/^\;/\*/ $i + cadius outdentfile $i + cadius sethighbit $i + mv $i $i#040000 + cadius deletefile applecorn.po /APPLECORN/$i + cadius addfile applecorn.po /APPLECORN $i#040000 +done + diff --git a/loader.s b/loader.s index f686b55..a73687d 100644 --- a/loader.s +++ b/loader.s @@ -6,8 +6,9 @@ * Loads Acorn ROM file (16KB) from disk and writes it * to aux memory starting at $08000. Copies Applecorn MOS * to aux memory starting at AUXMOS1 and jumps to it. -* (Note that the MOS code will relocate itself to $D000.) +* (Note that the MOS code will copy itself to $D000.) START JSR ROMMENU + STZ :BLOCKS LDX #$00 :S1 JSR CROUT diff --git a/mainmem.s b/mainmem.s index bdbefd6..ad48bc1 100644 --- a/mainmem.s +++ b/mainmem.s @@ -9,9 +9,33 @@ * 27-Aug-2021 Delete and MkDir return ProDOS result to caller * 29-Aug-2021 All calls (seem to) return ProDOS result to caller * Set ?&E0=255 for testing to report ProDOS result +* 30-Aug-2021 INFOFILE semi-implemented, UPDFB returns moddate * Lots of tidying up possible once confirmed code working +* *BUG* LOAD loads full 512 bytes from last sector even when < 512 +* ProDOS string buffers +RTCBUF EQU $0200 ; Use by RTC calls, 40 bytes +* ; $0228-$023D +DRVBUF1 EQU $023E +DRVBUF2 EQU $023F ; Prefix on current drive, len+64 +CMDPATH EQU $0280 ; Path used to start Applecorn + +* Filename string buffers +MOSFILE1 EQU $0300 ; length + 64 bytes +MOSFILE2 EQU $0341 ; length + 64 bytes +MOSFILE EQU MOSFILE1 +* $0382 ; $3C bytes here +* +FILEBLK EQU $03BE +FBPTR EQU FILEBLK+0 ; Pointer to name (in aux) +FBLOAD EQU FILEBLK+2 ; Load address +FBEXEC EQU FILEBLK+6 ; Exec address +FBSIZE EQU FILEBLK+10 ; Size +FBSTRT EQU FILEBLK+10 ; Start address for SAVE +FBATTR EQU FILEBLK+14 ; Attributes +FBEND EQU FILEBLK+14 ; End address for SAVE + * ProDOS MLI command numbers QUITCMD EQU $65 GTIMECMD EQU $82 @@ -49,20 +73,20 @@ SETPRFX LDA #GPFXCMD :L1 JSR MLI :OPC7 DB $00 DW GSPFXPL - LDX $0300 + LDX DRVBUF1 ; was $0300 BNE RTSINST LDA $BF30 STA ONLNPL+1 ; Device number JSR MLI DB ONLNCMD DW ONLNPL - LDA $0301 + LDA DRVBUF2 ; was $0301 AND #$0F TAX INX - STX $0300 + STX DRVBUF1 ; was $0300 LDA #$2F - STA $0301 + STA DRVBUF2 ; was $0301 DEC :OPC7 BNE :L1 RTSINST RTS @@ -88,16 +112,16 @@ DISCONN LDA $BF98 BPL :L1 BMI :S1 :S3 LDA $BF32,Y - STA $0302 + STA DRVBUF2+1 ; was $0302 :L2 LDA $BF33,Y STA $BF32,Y BEQ :S4 INY BNE :L2 :S4 LDA $BF26 - STA $0300 + STA DRVBUF1 ; was $0300 LDA $BF27 - STA $0301 + STA DRVBUF2 ; was $0301 LDA $BF10 STA $BF26 LDA $BF11 @@ -147,11 +171,24 @@ COPYAUXBLK CLI RTS +* TO DO: All OSFILE calls combined and dispatch in here +* All start with PREPATH, UPDFB, COPYFB then branch +* to relevent routine. + + +INFOFILE >>> ENTMAIN +* TO DO: call PREPATH to check for drive, up, etc + JSR UPDFB ; Update FILEBLK + JSR COPYFB ; Copy back to aux mem + >>> XF2AUX,OSFILERET + + * ProDOS file handling to delete a file * Called by AppleMOS OSFILE * Return A=0 no object, A=1 file deleted, A=2 dir deleted * A>$1F ProDOS error DELFILE >>> ENTMAIN +* TO DO: call PREPATH to check for drive, up, etc JSR UPDFB ; Update FILEBLK JSR COPYFB ; Copy back to aux mem PHA ; Save object type @@ -190,23 +227,26 @@ DESTROY LDA #<MOSFILE ; Attempt to destroy file * Return A=02 on success (ie: 'directory') * A>$1F ProDOS error, translated by OSFILE handler MAKEDIR >>> ENTMAIN +* TO DO: call PREPATH to check for drive, up, etc JSR UPDFB ; Update FILEBLK JSR COPYFB ; Copy back to aux mem CMP #$02 BEQ :EXIT ; Dir already exists * Make into a subroutine + LDA #$0D ; 'Directory' + STA CREATEPL+7 ; ->Storage type + LDA #$0F ; 'Directory' + STA CREATEPL+4 ; ->File type +* subroutine.... LDA #<MOSFILE STA CREATEPL+1 LDA #>MOSFILE STA CREATEPL+2 LDA #$C3 ; 'Default access' STA CREATEPL+3 ; ->Access - LDA #$0F ; 'Directory' - STA CREATEPL+4 ; ->File type STZ CREATEPL+5 ; Aux type LSB STZ CREATEPL+6 ; Aux type MSB - LDA #$0D ; 'Directory' - STA CREATEPL+7 ; ->Storage type +* Don't we have to make a call to update BF90-BF93? LDA $BF90 ; Current date STA CREATEPL+8 LDA $BF91 @@ -216,6 +256,7 @@ MAKEDIR >>> ENTMAIN LDA $BF93 STA CREATEPL+11 JSR CRTFILE +* ... BCS :EXIT ; Failed, exit with ProDOS result JSR UPDFB ; Update FILEBLK JSR COPYFB ; Copy FILEBLK to aux mem @@ -245,10 +286,15 @@ DORENAME LDA #<MOSFILE OFILE >>> ENTMAIN PHA ; Preserve arg for later * TO DO: Mustn't write to a directory +* TO DO: call PREPATH to check for drive, up, etc CMP #$80 ; Write mode BNE :S0 JSR DESTROY * Make into a subroutine + LDA #$01 ; Storage type - file + STA CREATEPL+7 + LDA #$06 ; Filetype BIN + STA CREATEPL+4 LDA #<MOSFILE ; Attempt to create file STA CREATEPL+1 STA OPENPL+1 @@ -257,14 +303,10 @@ OFILE >>> ENTMAIN STA OPENPL+2 LDA #$C3 ; Access unlocked STA CREATEPL+3 - LDA #$06 ; Filetype BIN - STA CREATEPL+4 LDA #$00 ; Auxtype STA CREATEPL+5 LDA #$00 STA CREATEPL+6 - LDA #$01 ; Storage type - file - STA CREATEPL+7 LDA $BF90 ; Current date STA CREATEPL+8 LDA $BF91 @@ -274,7 +316,7 @@ OFILE >>> ENTMAIN LDA $BF93 STA CREATEPL+11 JSR CRTFILE - +* ... :S0 LDA #$00 ; Look for empty slot JSR FINDBUF STX BUFIDX @@ -474,12 +516,14 @@ TELL >>> ENTMAIN >>> MAINZP ; Alt ZP off, ROM back in BRA :EXIT + * ProDOS file handling for MOS OSFILE LOAD call * Invoked by AppleMOS OSFILE * Return A=01 if successful (meaning 'file') * A>$1F ProDOS error, translated by FILERET * TO DO: If object not a file, return $46 - File not found LOADFILE >>> ENTMAIN +* TO DO: call PREPATH to check for drive, up, etc STZ :BLOCKS LDA #<MOSFILE STA OPENPL+1 @@ -530,6 +574,8 @@ LOADFILE >>> ENTMAIN INC DEX BRA :L2 +* *BUG* This is copy all 512 bytes of last block instead of +* just the bytes used :S2 STA A4H SEC ; Main -> AUX JSR AUXMOVE @@ -574,6 +620,7 @@ COPYFB PHA * A>$1F ProDOS error translated by FILERET * TO DO: If dir exists, return $41 SAVEFILE >>> ENTMAIN +* TO DO: call PREPATH to check for drive, up, etc * TO DO: MUSTN'T OVERWITE A DIRECTORY LDA #<MOSFILE ; Attempt to destroy file STA DESTPL+1 @@ -584,6 +631,11 @@ SAVEFILE >>> ENTMAIN DW DESTPL STZ :BLOCKS * TO DO: Make this a subroutine + LDA #$01 ; Storage type - file + STA CREATEPL+7 + LDA #$06 ; Filetype BIN + STA CREATEPL+4 +* subroutine.... LDA #<MOSFILE STA CREATEPL+1 STA OPENPL+1 @@ -592,14 +644,10 @@ SAVEFILE >>> ENTMAIN STA OPENPL+2 LDA #$C3 ; Access unlocked STA CREATEPL+3 - LDA #$06 ; Filetype BIN - STA CREATEPL+4 LDA FBLOAD ; Auxtype = load address STA CREATEPL+5 LDA FBLOAD+1 STA CREATEPL+6 - LDA #$01 ; Storage type - file - STA CREATEPL+7 LDA $BF90 ; Current date STA CREATEPL+8 LDA $BF91 @@ -609,6 +657,7 @@ SAVEFILE >>> ENTMAIN LDA $BF93 STA CREATEPL+11 JSR CRTFILE +* ... BCS :FWD1 ; :CANTOPEN error JSR OPENFILE BCS :FWD1 ; :CANTOPEN error @@ -728,8 +777,10 @@ UPDFB LDA #<MOSFILE JSR MLI ; Call GET_FILE_INFO DB GINFOCMD DW GINFOPL - BCS :ERR - LDA GINFOPL+5 ; Aux type LSB + BCC :UPDFB1 + JMP CHKNOTFND + +:UPDFB1 LDA GINFOPL+5 ; Aux type LSB STA FBLOAD STA FBEXEC LDA GINFOPL+6 ; Aux type MSB @@ -739,6 +790,7 @@ UPDFB LDA #<MOSFILE STZ FBEXEC+2 STZ FBLOAD+3 STZ FBEXEC+3 +* LDA GINFOPL+3 ; Access byte CMP #$40 ; Locked? AND #$03 ; ------wr @@ -753,8 +805,37 @@ UPDFB LDA #<MOSFILE ORA #$08 ; --wrl--- :UPDFB2 ORA FBATTR+0 ; --wrl-wr STA FBATTR+0 - STZ FBATTR+1 ; TO DO: get mdate - STZ FBATTR+2 +* + 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 OPENFILE ; Open file @@ -777,9 +858,9 @@ UPDFB LDA #<MOSFILE LDA #$01 ; Prepare A=file LDX GINFOPL+7 CPX #$0D ; Is it a directory? - BNE :UPDFB3 + BNE :UPDFB5 LDA #$02 ; Return A=directory -:UPDFB3 RTS +:UPDFB5 RTS :ERR CHKNOTFND CMP #$44 ; Convert ProDOS 'not found' @@ -838,35 +919,7 @@ CATALOGRET * dir/file.ext filesystem, so '..' means parent dir (eg: '../SOMEDIR') * Also allows '^' as '^' is illegal character * Carry set on error, clear otherwise -* TO DO: drv: prefix, drv:/dir/file -PREPATH LDX MOSFILE ; Length - BEQ :EXIT ; If zero length - LDA MOSFILE+1 ; 1st char of filename - CMP #$3A ; Is it ':'? - BNE :NOTCLN ; Nope - CPX #$03 ; Len at least 3? - BCC :ERR ; Nope! - LDA MOSFILE+3 ; Drive - SEC - SBC #'1' - TAX - LDA MOSFILE+2 ; Slot - SEC - SBC #'0' - JSR DRV2PFX ; Slt/Drv->pfx in MOSFILE2 - JSR DEL1CHAR ; Delete ':' from MOSFILE - JSR DEL1CHAR ; Delete the two digits - JSR DEL1CHAR - LDA MOSFILE ; Is there more? - BEQ :APPEND ; Only ':sd' - CMP #$02 ; Len at least 2? - BCC :ERR ; Nope! - LDA MOSFILE+1 ; 1st char of filename - CMP #$2F ; '/' - BNE :ERR - JSR DEL1CHAR ; Delete '/' from MOSFILE - BRA :APPEND -:NOTCLN JSR GETPREF ; Current pfx -> MOSFILE2 +PREPATH JSR GETPREF ; Current pfx -> MOSFILE2 :REENTER LDA MOSFILE+1 ; First char of dirname CMP #'.' BEQ :UPDIR1 @@ -874,7 +927,7 @@ PREPATH LDX MOSFILE ; Length BEQ :CARET ; If '^' CMP #$2F ; '/' char - abs path BEQ :EXIT ; Nothing to do - BRA :APPEND + BRA :PARENT :UPDIR1 LDA MOSFILE+2 CMP #'.' ; '..' @@ -883,7 +936,7 @@ PREPATH LDX MOSFILE ; Length :CARET JSR DEL1CHAR ; Delete '^' from MOSFILE JSR PARENT ; Parent dir -> MOSFILE2 LDA MOSFILE ; Is there more? - BEQ :APPEND ; Only '^' + BEQ :PARENT ; Only '^' CMP #$02 ; Len at least two? BCC :ERR ; Nope! LDA MOSFILE+1 ; What is next char? @@ -891,7 +944,7 @@ PREPATH LDX MOSFILE ; Length BNE :ERR ; Nope! JSR DEL1CHAR ; Delete '/' from MOSFILE BRA :REENTER ; Go again! -:APPEND JSR APPMF2 ; Append MOSFILE->MOSFILE2 +:PARENT JSR APPMF2 ; Append MOSFILE->MOSFILE2 JSR COPYMF2 ; Copy back to MOSFILE :EXIT CLC RTS @@ -966,34 +1019,39 @@ PARENT LDX MOSFILE2 ; Length of string * Convert slot/drive to prefix * Expect slot number (1..7) in A, drive (0..1) in X -* Puts prefix (or empty string) in MOSFILE2 -DRV2PFX ASL - ASL - ASL - ASL - CPX #$00 - BEQ :S1 ; Drive 1 - ORA #$80 ; Drive 2 -:S1 STA ONLNPL+1 ; Device number +* Puts prefix (or empty string) in MOSFILE +DRV2PFX +* ASL +* ASL +* ASL +* ASL +* STX :TEMP ; Gets 0SSS000D +* ORA :TEMP ; Shouldn't this be DSSS00000 ? + + CLC ; Cy=0 A=00000sss + ROR A ; s 000000ss + ROR A ; s s000000s + ROR A ; s ss000000 + ROR A ; s sss00000 + CPX #1 ; d sss00000 + ROR A ; 0 dsss0000 + + STA ONLNPL+1 ; Device number JSR MLI ; Call ON_LINE DB ONLNCMD - DW ONLNPL ; Buffer set to $301 - LDA $301 ; Slot/Drive/Length + DW ONLNPL ; Buffer set to DRVBUF2 (was $301) + LDA DRVBUF2 ; was $301 ; Slot/Drive/Length AND #$0F ; Mask to get length + STA MOSFILE ; Store length TAX - INC ; Plus '/' at each end - INC - STA MOSFILE2 ; Store length - LDA #$2F ; '/' - STA MOSFILE2+1 - STA MOSFILE2+2,X -:L1 CPX #$00 ; Copy -> MOSFILE2 +:L1 CPX #$00 ; Copy -> MOSFILE BEQ :EXIT - LDA $301,X - STA MOSFILE2+1,X - DEX + LDA DRVBUF2,X ; was $301,X + STA MOSFILE,X ; Should be able to read + DEX ; directly to MOSFILE BRA :L1 :EXIT RTS +* :TEMP DB $00 * Delete first char of MOSFILE DEL1CHAR LDX MOSFILE ; Length @@ -1088,10 +1146,10 @@ FLSHPL HEX 01 ; Number of parameters ONLNPL HEX 02 ; Number of parameters DB $00 ; Unit num - DW $301 ; Buffer + DW DRVBUF2 ; was $301 ; Buffer GSPFXPL HEX 01 ; Number of parameters - DW $300 ; Buffer + DW DRVBUF1 ; was $300 ; Buffer GPFXPL HEX 01 ; Number of parameters DW MOSFILE2 ; Buffer @@ -1129,25 +1187,25 @@ QUITPL HEX 04 ; Number of parameters DB $00 DW $0000 -* Buffer for Acorn MOS filename -* Pascal string -MOSFILE DS 65 ; 64 bytes max prefix/file len +** Buffer for Acorn MOS filename +** Pascal string +*MOSFILE DS 65 ; 64 bytes max prefix/file len +* +** Buffer for second filename (for rename) +** Pascal string +*MOSFILE2 DS 65 ; 64 bytes max prefix/file len -* Buffer for second filename (for rename) -* Pascal string -MOSFILE2 DS 65 ; 64 bytes max prefix/file len - -* Acorn MOS format OSFILE param list -FILEBLK -FBPTR DW $0000 ; Pointer to name (in aux) -FBLOAD DW $0000 ; Load address - DW $0000 -FBEXEC DW $0000 ; Exec address - DW $0000 -FBSIZE -FBSTRT DW $0000 ; Size / Start address for SAVE - DW $0000 -FBATTR -FBEND DW $0000 ; Attributes / End address for SAVE - DW $0000 +** Acorn MOS format OSFILE param list +*FILEBLK +*FBPTR DW $0000 ; Pointer to name (in aux) +*FBLOAD DW $0000 ; Load address +* DW $0000 +*FBEXEC DW $0000 ; Exec address +* DW $0000 +*FBSIZE +*FBSTRT DW $0000 ; Size / Start address for SAVE +* DW $0000 +*FBATTR +*FBEND DW $0000 ; Attributes / End address for SAVE +* DW $0000 diff --git a/memmap.txt b/memmap.txt new file mode 100644 index 0000000..5b56aee --- /dev/null +++ b/memmap.txt @@ -0,0 +1,66 @@ +* Memory layout in main memory +* +* ; $0000-$00FF Zero page +* ; $0100-$01FF Stack +* ; $0200-$02FF ProDOS string buffers +* ; $0200-$022F Overwritten by RTC routines +* ; $0228-$023D +DRVBUF1 EQU $023E ; $023E Drive +DRVBUF2 EQU $023F ; $022F Prefix on current drive +CMDPATH EQU $0280 ; $0280 Path used to start Applecorn +* +* ; $0300-$03CF File system core workspace +* ; $0300-$0382 Filename string buffers +MOSFILE1 EQU $0300 ; $0300 length +* ; $0301 64 byte string +MOSFILE2 EQU $0341 ; $0341 length +* ; $0342 64 byte string +* ; $0382-$03BD $3C spare bytes +* ; +* ; $03BE-$03CF: local copy of control block +* ; $03BE FPTR FPTR +* ; $03BF CHANNEL +* ; $03C0 LOAD LOAD ADDR +* ; $03C4 EXEC EXEC COUNT +* ; $03C8 SIZE START OFFSET +* ; $03CC ATTR END +* ; $03D0-$03FF: ProDOS vectors, etc. +* ; $03D0-$03D2 JMP WARM +* ; $03D3-$03D5 JMP WARM +* ; $03D6-$03EC ProDOS +* ; $03ED-$03DE XFER address +* ; $03EF ProDOS +* ; $03F0-$03D1 BRKV +* ; $03F2-$03D3 RESETV +* ; $03F4 RESETV ACK +* ; $03F5-$03F7 JMP AMP +* ; $03F8-$03FA JMP USER +* ; $03FB-$03FD JMP MON +* ; $03FE-$03FF IRQV +* +* EQU $0400 ; $0400- Can't use as ProDOS uses 'hidden' bytes +* ; -$07FF within screen for workspace +SCREEN EQU $0800 ; $0800-$0BFF half 80-col screen or 40-col screen +IOBUF0 EQU $0C00 ; $0C00-$0FFF For loading ROM, OSFILE, *. +IOBUF1 EQU $1000 ; $1000-$13FF Four open files for langs +IOBUF2 EQU $1400 ; $1400-$17FF +IOBUF3 EQU $1800 ; $1800-$1BFF +IOBUF4 EQU $1C00 ; $1C00-$1FFF +* ; $2000- Code, to do: make code move itself +* -$4FFF +BLKBUF EQU $5000 ; $5000-$53FF 512-byte buffer plus channel data +BLKBUFEND EQU $5200 + + +* To do later: +* ; $2000-$3FFF Hi-Res screen 1 +* ; $4000-$5FFF Hi-Res screen 2 +* ; $6000- available +* ; -$95FF available +* ; $9600-$BDFF ProDOS buffers +* ; $BE00-$BEFF MLI Global workspace +* ; $BF00-$BFFF MLI API interface + +I think $0300-$03DF can be usefully used as filing system workspace, +the mainmem copies of the filename and control block, MOSNAME and CBFILE, +and later for OSGBPB.