Added support for OSBYTE $7F (End of file)

This commit is contained in:
Bobbi Webber-Manners 2021-07-29 14:43:56 -04:00
parent e40f3a391a
commit 3d4c4b2e85
4 changed files with 151 additions and 38 deletions

Binary file not shown.

View File

@ -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, *.

View File

@ -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
LDY #>OSBYTEM
JSR PRSTR
TSX
LDA $103,X
PLA
JSR OUTHEX
LDA #<OSBM2
LDY #>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 STRTL
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

View File

@ -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 STRTL
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 ; Attempt to destroy file
STA DESTPL+1
LDA #>MOSFILE
STA DESTPL+2
JSR MLI
DB DESTCMD
DW DESTPL
STZ :BLOCKS
LDA #<MOSFILE
STA CREATEPL+1
@ -527,7 +589,7 @@ SAVEFILE LDX $0100 ; Recover SP
STA STRTH
PLA
SEC
BIT $FF58
BIT RTSINST
JMP XFER
:LEN DW $0000
:BLOCKS DB $00
@ -576,7 +638,7 @@ CATREENTRY
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