diff --git a/applecorn.po b/applecorn.po index e410aa5..cc25330 100644 Binary files a/applecorn.po and b/applecorn.po differ diff --git a/applecorn.s b/applecorn.s index 87a3470..2bb1bda 100644 --- a/applecorn.s +++ b/applecorn.s @@ -1,6 +1,6 @@ * Load an Acorn BBC Micro ROM in aux memory and * Provide an environment where it can run -* Bobbi 2021 +* (c) Bobbi 2021 GPLv3 * * Assembled with the Merlin 8 assembler. @@ -45,6 +45,8 @@ OPENCMD EQU $C8 READCMD EQU $CA WRITECMD EQU $CB CLSCMD EQU $CC +GMARKCMD EQU $CF +GEOFCMD EQU $D1 * IO Buffer for reading file (1024 bytes) IOBUF0 EQU $4000 ; For loading ROM, OSFILE, *. diff --git a/auxmem.s b/auxmem.s index 5e0d0a1..46270ff 100644 --- a/auxmem.s +++ b/auxmem.s @@ -1,4 +1,5 @@ * AUXMEM.S +* (c) Bobbi 2021 GPLv3 * BBC Micro 'virtual machine' in Apple //e aux memory ZP1 EQU $90 ; $90-$9f are Econet space @@ -967,77 +968,84 @@ BYTEHND PHA PLA RTS BYTECALLER - CMP #$00 - BNE :S1 + CMP #$00 ; $00 = identify MOS version + BNE :S7C LDX #$0A RTS -:S1 CMP #$7C ; $7C = clear escape condition - BNE :S2 +:S7C CMP #$7C ; $7C = clear escape condition + BNE :S7D LDA ESCFLAG AND #$7F ; Clear MSbit STA ESCFLAG RTS -:S2 CMP #$7D ; $7D = set escape condition - BNE :S3 +:S7D CMP #$7D ; $7D = set escape condition + BNE :S7E ROR ESCFLAG RTS -:S3 CMP #$7E ; $7E = ack detection of ESC - BNE :S4 +:S7E CMP #$7E ; $7E = ack detection of ESC + BNE :S7F LDA ESCFLAG AND #$7F ; Clear MSB STA ESCFLAG LDX #$FF ; Means ESC condition cleared RTS -:S4 CMP #$81 ; $81 = Read key with time lim - BNE :S5 +:S7F CMP #$7F ; $7F = check for EOF + BNE :S81 + PHY + JSR CHKEOF + PLY + RTS + +:S81 CMP #$81 ; $81 = Read key with time lim + BNE :S82 JSR GETKEY RTS -:S5 CMP #$82 ; $82 = read high order address - BNE :S6 +:S82 CMP #$82 ; $82 = read high order address + BNE :S83 LDY #$FF ; $FFFF for I/O processor LDX #$FF RTS -:S6 CMP #$83 ; $83 = read bottom of user mem - BNE :S7 +:S83 CMP #$83 ; $83 = read bottom of user mem + BNE :S84 LDY #$0E ; $0E00 LDX #$00 RTS -:S7 CMP #$84 ; $84 = read top of user mem - BNE :S8 +:S84 CMP #$84 ; $84 = read top of user mem + BNE :S85 LDY #$80 LDX #$00 RTS -:S8 CMP #$85 ; $85 = top user mem for mode - BNE :S9 +:S85 CMP #$85 ; $85 = top user mem for mode + BNE :S86 LDY #$80 LDX #$00 RTS -:S9 CMP #$86 ; $86 = read cursor pos - BNE :S10 +:S86 CMP #$86 ; $86 = read cursor pos + BNE :SDA LDY ROW LDX COL RTS -:S10 CMP #$DA ; $DA = clear VDU queue - BNE :S11 +:SDA CMP #$DA ; $DA = clear VDU queue + BNE :UNSUPP RTS -:S11 PHX +:UNSUPP PHX PHY + PHA LDA #OSBYTEM JSR PRSTR - TSX - LDA $103,X + PLA JSR OUTHEX LDA #OSBM2 @@ -1365,6 +1373,35 @@ OSBYTE80 CPX #$00 ; X=0 Last ADC channel :INPUT LDX #$00 ; Nothing in input buf RTS +* Performs OSBYTE $7F EOF function +* File ref number is in X +CHKEOF LDA STRTL ; Backup STRTL/STRTH + STA TEMP1 + LDA STRTH + STA TEMP2 + STA $C004 ; Write main mem + STX MOSFILE ; File reference number + STA $C005 ; Write aux mem + LDA #FILEEOF + STA STRTH + TSX ; Stash alt SP in $0101 + STX $0101 + CLC ; Use main memory + CLV ; Use main ZP and LC + JMP XFER +CHKEOFRET + LDX $0101 ; Recover alt SP from $0101 + TXS + PHA ; Return code in A + LDA TEMP1 + STA STRTL + LDA TEMP2 + STA STRTH + PLX ; Recover return code -> X + RTS + * Performs OSBYTE $81 INKEY$ function * X,Y has time limit * On exit, CC, Y=$00, X=key - key pressed @@ -1429,7 +1466,7 @@ DELAY PHX :L2 INY ; 2 CPY #$00 ; 2 BNE :L2 ; 3 (taken) - CPX #$05 ; 2 + CPX #$02 ; 2 BNE :L1 ; 3 (taken) PLY PLX diff --git a/mainmem.s b/mainmem.s index 11f7611..f0bd74a 100644 --- a/mainmem.s +++ b/mainmem.s @@ -1,4 +1,5 @@ * MAINMEM.S +* (c) Bobbi 2021 GPL v3 * Code that runs on the Apple //e in main memory * This code is mostly glue between the BBC Micro code * running in aux mem and ProDOS @@ -10,7 +11,7 @@ SETPRFX LDA #GPFXCMD :OPC7 DB $00 DW GSPFXPL LDX $0300 - BNE :S1 + BNE RTSINST LDA $BF30 STA ONLPL+1 ; Device number JSR MLI @@ -25,7 +26,7 @@ SETPRFX LDA #GPFXCMD STA $0301 DEC :OPC7 BNE :L1 -:S1 RTS +RTSINST RTS * Disconnect /RAM ramdrive to avoid aux corruption * Stolen from Beagle Bros Extra K @@ -76,7 +77,7 @@ RESET TSX LDA #>AUXMOS STA STRTH SEC - BIT $FF58 + BIT RTSINST JMP XFER RTS @@ -214,7 +215,7 @@ FINDEXIT LDA $C08B ; R/W RAM, LC bank 1 STA STRTH PLA SEC - BIT $FF58 + BIT RTSINST JMP XFER BUFIDX DB $00 @@ -277,7 +278,7 @@ GETEXIT LDA $C08B ; R/W RAM, LC bank 1 STA STRTH PLA SEC - BIT $FF58 + BIT RTSINST JMP XFER * ProDOS file handling for MOS OSBPUT call @@ -305,9 +306,62 @@ FILEPUT LDX $0100 ; Recover SP LDA #>OSBPUTRET STA STRTH SEC - BIT $FF58 + BIT RTSINST JMP XFER +* ProDOS file handling for OSBYTE $7F EOF +* Returns EOF status in A ($FF for EOF, $00 otherwise) +FILEEOF LDX $0100 ; Recover SP + TXS + LDA $C081 ; ROM, please + LDA $C081 + + LDA MOSFILE ; File ref number + STA GEOFPL+1 + STA GMARKPL+1 + JSR MLI + DB GEOFCMD + DW GEOFPL + BCS :ISEOF ; If error, just say EOF + + JSR MLI + DB GMARKCMD + DW GMARKPL + BCS :ISEOF ; If error, just say EOF + + LDA GEOFPL+2 ; Subtract Mark from EOF + SEC + SBC GMARKPL+2 + STA :REMAIN + LDA GEOFPL+3 + SBC GMARKPL+3 + STA :REMAIN+1 + LDA GEOFPL+4 + SBC GMARKPL+4 + STA :REMAIN+2 + + LDA :REMAIN ; Check bytes remaining + BNE :NOTEOF + LDA :REMAIN+1 + BNE :NOTEOF + LDA :REMAIN+2 + BNE :NOTEOF +:ISEOF LDA #$FF + BRA :EXIT +:NOTEOF LDA #$00 +:EXIT PHA ; Preserve return code + LDA $C08B ; R/W RAM, LC bank 1 + LDA $C08B + LDA #CHKEOFRET + STA STRTH + PLA ; Recover return code + SEC + BIT RTSINST + JMP XFER +:REMAIN DS 3 ; Remaining bytes + * ProDOS file handling for MOS OSFILE LOAD call * Return A=0 if successful * A=1 if file not found @@ -379,7 +433,7 @@ LOADFILE LDX $0100 ; Recover SP STA STRTH PLA SEC - BIT $FF58 + BIT RTSINST JMP XFER :BLOCKS DB $00 @@ -392,6 +446,14 @@ SAVEFILE LDX $0100 ; Recover SP LDA $C081 ; Gimme the ROM! LDA $C081 + LDA #MOSFILE + STA DESTPL+2 + JSR MLI + DB DESTCMD + DW DESTPL + STZ :BLOCKS LDA #PRONEBLK STA STRTH SEC - BIT $FF58 + BIT RTSINST JMP XFER :READERR @@ -592,7 +654,7 @@ CATEXIT LDA $C08B ; R/W LC RAM, bank 1 STA STRTH PLA SEC - BIT $FF58 + BIT RTSINST JMP XFER * PRONEBLK call returns here ... @@ -621,7 +683,7 @@ SETPFX LDX $0100 ; Recover SP LDA #>STARDIRRET STA STRTH SEC - BIT $FF58 + BIT RTSINST JMP XFER * Create disk file @@ -717,6 +779,18 @@ GPFXPL HEX 01 ; Number of parameters SPFXPL HEX 01 ; Number of parameters DW MOSFILE ; Buffer +GMARKPL HEX 02 ; Number of parameters + DB $00 ; File reference number + DB $00 ; Mark (24 bit) + DB $00 + DB $00 + +GEOFPL HEX 02 ; Number of parameters + DB $00 ; File reference number + DB $00 ; EOF (24 bit) + DB $00 + DB $00 + QUITPL HEX 04 ; Number of parameters DB $00 DW $0000