From e955be07e653a8e38c5cf4c6112f200ce2e50c9e Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Fri, 15 Oct 2021 13:01:25 -0400 Subject: [PATCH] Merge PR #122 'LOADFILE updated' --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.hostfs.s | 129 +++++++++++++++++----------------- auxmem.init.s | 2 +- mainmem.svc.s | 182 +++++++++++++++++++++++++++++++++--------------- 4 files changed, 191 insertions(+), 122 deletions(-) diff --git a/applecorn.po b/applecorn.po index 0dfe58c5f0d90258cc5496a11cc3b751a68d17c7..0ddb4a493f9a251b50b34c86102c4b14e7e2e51f 100644 GIT binary patch delta 5698 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 bL4#PxMn_hbp~^CSWtpL}Y|x>ySkwOlS+BaB delta 4091 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 u{jtyD>a%:FREE - JSR OUTSTR ; Print 'free' - LDX AUXBLK+0 ; Blocks used + JSR OUTSTR ; Print 'free' + 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' + JMP OUTSTR ; Print 'used' * OLD * JSR PRDECXY ; Print in decimal @@ -748,20 +748,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 ' @@ -877,10 +877,10 @@ MKERRLP LSR A LSR A JSR ERRHEX - STA $109 + STA $108 PLA JSR ERRHEX - STA $10A + STA $109 JMP $100 ERRHEX AND #15 @@ -898,13 +898,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 @@ -923,16 +923,16 @@ MKERROR4 DW ERROR27 * $27 - I/O error (disk not formatted) * $28 - No device con'd (drive not present) Disk not present -* $29 - (GEOS Driver is busy) +* $29 -(GSOS Driver is busy) * $2A - * $2B - Disk write protected. Disk write protected -* $2C - (GEOS bad byte count) -* $2D - (GEOS bad block number) +* $2C -(GSOS bad byte count) +* $2D -(GSOS bad block number) * $2E - Disk switched Disk changed * $2F - Device is offline (drive empty) * $40 - Invalid pathname syntax. Bad filename -* $41 - Duplicate filename. (split from $47) Directory exists +* $41 -(Duplicate filename. (split from $47) Is a directory) * $42 - File Control Block table full. Too many open * $43 - Invalid reference number. Channel not open * $44 - Path not found. (Dir not found) File not found @@ -945,91 +945,90 @@ MKERROR4 DW ERROR27 * $4B - Unsupported storage_type. Disk not recognised * $4C - End of file has been encountered. End of file * $4D - Position out of range. Past end of file -* $4E - Access error. (see also $4F) RD/WR: Insufficient access -* $4F - Access error. (split from $4E) REN/DEL: Locked +* $4E - Access error. (see also $4F) RD/WR: Insufficient access, also Dir not empty +* $4F - (GSOS Buffer too small) (Access error. (split from $4E) REN/DEL: Locked) * $50 - File already open. Can't - file open * $51 - Directory count error. Broken directory * $52 - Not a ProDOS disk. Disk not recognised * $53 - Invalid parameter. Invalid parameter -* $54 - (Dir not empty when deleting) Dir not empty +* $54 - (GSOS Out of memory) (Dir not empty when deleting) Dir not empty * $55 - Volume Control Block table full. * $56 - Bad buffer address. * $57 - Duplicate volume. * $58 - Bad volume bitmap. -* $59 - (GEOS File level out of range) +* $59 -(GSOS File level out of range) * $5A - Bit map disk address is impossible. Sector not found -* $5B - (GEOS Bad ChangePath pathname) -* $5C - (GEOS Not executable file) -* $5D - (EOF during load or save) Data lost -* $5E - (Couldn't open to save) Can't save -* $5F - (GEOS Too many applications) -* $60+ - (GEOS) +* $5B -(GSOS Bad ChangePath pathname) +* $5C -(GSOS Not executable file) +* $5D -(GSOS OS/FS not found) (EOF during load or save) Data lost +* $5E -(Couldn't open to save) Can't save +* $5F -(GSOS Too many applications) +* $60+ - (GSOS) * AcornOS ProDOS ERROR40 DW $CC00 - ASC 'Bad filename' ; $40 - Invalid pathname syntax + ASC 'Bad filename' ; $40 - Invalid pathname syntax ERROR41 DW $C400 - ASC 'Directory exists' ; $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 'Locked' ; $4F - Access error (split from $4E) + ASC '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 95e83c0..be423eb 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -174,7 +174,7 @@ BYTE00 BEQ BYTE00A ; OSBYTE 0,0 - generate error RTS ; %000x1xxx host type, 'A'pple BYTE00A BRK DB $F7 -HELLO ASC 'Applecorn MOS 2021-10-13' +HELLO ASC 'Applecorn MOS 2021-10-15' DB $00 ; Unify MOS messages diff --git a/mainmem.svc.s b/mainmem.svc.s index 3c5d5ce..26c55a9 100644 --- a/mainmem.svc.s +++ b/mainmem.svc.s @@ -15,6 +15,7 @@ * 13-Oct-2021 OSFIND implementes CLOSE#0. * 13-Oct-2021 FIND, BGET, BPUT optimised passing registers to main. * 13-Oct-2021 ARGS, EOF returns errors, optimised. +* 15-Oct-2021 LOADFILE updated. INFOFILE >>> ENTMAIN @@ -49,6 +50,9 @@ DODELETE LDA #>> ENTMAIN JSR PREPATH ; Preprocess pathname JSR WILDONE ; Handle any wildcards JSR EXISTS ; See if it exists ... +* BCS :EXIT2 CMP #$01 ; ... and is a file BEQ :ISFILE - JMP :NOTFND -:ISFILE STZ :BLOCKS + ROL A ; 0->0, 2->5 + EOR #$05 ; 0->5, 2->0 + ADC #$41 ; 0->$46, 2->$41 + JMP :EXIT2 ; Return error + +* EXISTS has done GETINFO, so file info already loaded +:ISFILE LDA FBEXEC ; If FBEXEC is zero, use addr + BEQ :CBADDR ; in the control block + LDA GINFOPL+5 ; Otherwise, use file's address + STA FBLOAD+0 ; Aux type LSB + LDA GINFOPL+6 ; Aux type MSB + STA FBLOAD+1 + +:CBADDR LDA #$60 ; *TO DO* Error=file too long + LDX GINFOPL+9 + BNE :EXIT2 ; size>128K, too big to load + LDX GINFOPL+8 + BMI :EXIT2 ; size>64K, too big to load + BEQ :EXITOK ; size=0, nothing to load + STX :BLOCKS LDA #MOSFILE STA OPENPL+2 JSR OPENFILE - BCS :NOTFND ; File not found + BCS :EXIT2 ; File not opened + +* LDA FBLOAD+0 ; A4=>start address to load to +* STA A4L +* LDA FBLOAD+1 +* STA A4H :L1 LDA OPENPL+5 ; File ref number STA READPL+1 JSR RDFILE - BCC :S1 - CMP #$4C ; EOF - BEQ :EOF - BRA :READERR -:S1 LDA #start of data buffer + ADC READPL+6 ; LSB of trans count + STA A2L ; A2=>end of data buffer LDA #>BLKBUF STA A1H - CLC - LDA #BLKBUF ADC READPL+7 ; MSB of trans count STA A2H - LDA FBEXEC ; If FBEXEC is zero, use addr - CMP #$00 ; in the control block - BEQ :CBADDR - LDA #MOSFILE - STA GINFOPL+2 - JSR GETINFO ; GET_FILE_INFO - BCS :READERR - LDA GINFOPL+5 ; Aux type LSB - STA FBLOAD+0 - LDA GINFOPL+6 ; Aux type MSB - STA FBLOAD+1 -:CBADDR LDA FBLOAD + LDA FBLOAD+0 ; A4=>address to load to STA A4L - STA FBEXEC ; EXEC = LOAD LDA FBLOAD+1 STA A4H - STA FBEXEC+1 - LDX :BLOCKS -:L2 CPX #$00 - BEQ :S2 - INC - INC - DEX - BRA :L2 -:S2 STA A4H + INC FBLOAD+1 ; Step to next block + INC FBLOAD+1 + + +* CLC +* LDA A1L ; A2=>end of data buffer +* ADC READPL+6 ; LSB of trans count +* STA A2L +* LDA A1H +* ADC READPL+7 ; MSB of trans count +* STA A2H + +* LDA FBEXEC ; If FBEXEC is zero, use addr +* CMP #$00 ; in the control block +* BEQ :CBADDR +* LDA #MOSFILE +* STA GINFOPL+2 +* JSR GETINFO ; GET_FILE_INFO +* BCS :READERR +* LDA GINFOPL+5 ; Aux type LSB +* STA FBLOAD+0 +* LDA GINFOPL+6 ; Aux type MSB +* STA FBLOAD+1 +*:CBADDR LDA FBLOAD +* STA A4L +* STA FBEXEC ; EXEC = LOAD +* LDA FBLOAD+1 +* STA A4H +* STA FBEXEC+1 +* LDX :BLOCKS +*:L2 CPX #$00 +* BEQ :S2 +* INC +* INC +* DEX +* BRA :L2 +*:S2 STA A4H + SEC ; Main -> AUX - JSR AUXMOVE - INC :BLOCKS - BRA :L1 -:NOTFND LDA #$46 ; Nothing found - PHA - BRA :EXIT -:READERR LDA #$5D ; Read error - PHA - BRA :EOF2 -:EOF LDA #$01 ; Success ('File') - PHA -:EOF2 LDA OPENPL+5 ; File ref num + JSR AUXMOVE ; A4 updated to next address + DEC :BLOCKS + BNE :L1 + BEQ :EXITOK + +* INC :BLOCKS +* BRA :L1 + +:READERR CMP #$4C + BNE :EXITERR +:EXITOK LDA #$01 ; Success ('File') +:EXITERR PHA + LDA OPENPL+5 ; File ref num STA CLSPL+1 JSR CLSFILE -:EXIT JSR UPDFB ; Update FILEBLK + PLA + CMP #$01 + BNE :EXIT2 + PHA + JSR UPDFB ; Update FILEBLK JSR COPYFB ; Copy FILEBLK to auxmem PLA ; Get return code back - >>> XF2AUX,OSFILERET +:EXIT2 >>> XF2AUX,OSFILERET :BLOCKS DB $00 + +*:NOTFILE ROL A ; 0->0, 2->5 +* EOR #$05 ; 0->5, 2->0 +* ADC #$41 ; 0->$46, 2->$41 +*:NOTFND PHA +* BRA :EXIT +*:READERR LDA #$5D ; Read error +* PHA +* BRA :EOF2 +*:EXITOK +*:EOF LDA #$01 ; Success ('File') +* PHA +*:EOF2 LDA OPENPL+5 ; File ref num +* STA CLSPL+1 +* JSR CLSFILE +*:EXIT JSR UPDFB ; Update FILEBLK +* JSR COPYFB ; Copy FILEBLK to auxmem +* PLA ; Get return code back +*:EXIT2 >>> XF2AUX,OSFILERET +*:BLOCKS DB $00 + + * ProDOS file handling for MOS OSFILE SAVE call * Invoked by AppleMOS OSFILE * Return A=01 if successful (ie: 'file') @@ -1115,7 +1189,3 @@ MAINRDEXIT >>> XF2AUX,NULLRTS ; Back to an RTS - - - -