diff --git a/applecorn.po b/applecorn.po index ada7f0e..a59ab50 100644 Binary files a/applecorn.po and b/applecorn.po differ diff --git a/applecorn.s b/applecorn.s index 40a1478..361b141 100644 --- a/applecorn.s +++ b/applecorn.s @@ -1,6 +1,8 @@ * Load an Acorn BBC Micro ROM in aux memory and * Provide an environment where it can run * Bobbi 2021 +* +* Assembled with the Merlin 8 assembler. XC ; 65c02 ORG $2000 ; Load addr of loader in main memory @@ -58,9 +60,6 @@ AUXMOS1 EQU $2000 ; Temp staging area in Aux EAUXMOS1 EQU $3000 ; End of staging area AUXMOS EQU $D000 ; Final location in aux LC -* Address is aux memory where the MOS entrypoints are -AUXVEC EQU $FFB9 ; Final location in aux LC - START STZ BLOCKS LDX #$00 :L1 LDA HELLO,X ; Signon message @@ -123,7 +122,7 @@ START STZ BLOCKS BRA :L4 :S25 STA A4H - SEC ; Main -> Aux + SEC ; Copy Main -> Aux JSR AUXMOVE INC BLOCKS @@ -148,7 +147,7 @@ START STZ BLOCKS LDA #>AUXMOS1 STA A4H - SEC ; Main->aux + SEC ; Copy MOS from Main->Aux JSR AUXMOVE LDA #RESET @@ -166,11 +165,11 @@ START STZ BLOCKS STA STRTH SEC ; Main -> Aux BIT $FF58 ; Set V; Use page zero and stack in aux - JMP XFER + JMP XFER ; Jump to copied MOS code in Aux -:DONE JSR CROUT - JSR BELL - RTS +;:DONE JSR CROUT +; JSR BELL +; RTS BLOCKS DB 0 ; Counter for blocks read * Set prefix if not already set @@ -786,6 +785,23 @@ ZP3 EQU $94 ROW EQU $96 ; Cursor row COL EQU $97 ; Cursor column WARMSTRT EQU $9F ; Cold or warm start + +* $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 + +OSAREG EQU $EF +OSXREG EQU $F0 +OSYREG EQU $F1 +OSCTRL EQU OSXREG +OSLPTR EQU $F2 + FAULT EQU $FD ; Error message pointer ESCFLAG EQU $FF ; Escape status BRKV EQU $202 ; BRK vector @@ -812,6 +828,7 @@ MOSSHIM * This code is initially loaded into aux mem at AUXMOS1 * Then relocated into aux LC at AUXMOS by MOSINIT * +* Initially executing at $3000 until copied to $D000 MOSINIT STA $C005 ; Make sure we are writing aux @@ -861,9 +878,9 @@ MOSINIT STA A2L LDA #>MOSVEND-MOSINIT+AUXMOS1 STA A2H - LDA #AUXVEC + LDA #>MOSAPI STA A4H :L2 LDA (A1L) STA (A4L) @@ -893,59 +910,11 @@ MOSINIT STZ ESCFLAG - LDA #MOSBRKHDLR - STA BRKV+1 - - LDA #OSCLI - STA CLIV+1 - LDA #OSBYTE - STA BYTEV+1 - LDA #OSWORD - STA WORDV+1 - LDA #OSWRCH - STA WRCHV+1 - LDA #OSRDCH - STA RDCHV+1 - LDA #OSFILE - STA FILEV+1 - LDA #OSARGS - STA ARGSV+1 - LDA #OSBGET - STA BGETV+1 - LDA #OSBPUT - STA BPUTV+1 - LDA #OSGBPB - STA GBPBV+1 - LDA #OSFIND - STA FINDV+1 - LDA #OSFSC - STA FSCV+1 + LDX #$35 +INITPG2 LDA DEFVEC,X + STA $200,X + DEX + BPL INITPG2 LDA #<:HELLO LDY #>:HELLO @@ -954,8 +923,8 @@ MOSINIT LDA #$09 ; Print language name at $8009 LDY #$80 JSR PRSTR - JSR $FFE7 ; OSNEWL - JSR $FFE7 + JSR OSNEWL + JSR OSNEWL LDA WARMSTRT CMP #MAGIC @@ -967,13 +936,15 @@ MOSINIT :S9 LDA #MAGIC ; So we do not reloc again STA WARMSTRT - LDA #$01 + CLC ; CLC=Entered from RESET + LDA #$01 ; $01=Entering application code JMP AUXADDR ; Start Acorn ROM * No return :HELLO ASC 'Applecorn MOS v0.01' - DB $0D,$0A,$0D,$0A,$00 + DB $0D,$0D,$00 :OLDM ASC '(Use OLD to recover any program)' - DB $0D,$0A,$0D,$0A,$00 + DB $0D,$0D,$00 + * Clear to EOL CLREOL LDA ROW @@ -1015,20 +986,28 @@ CLEAR STZ ROW STZ COL RTS +* Print string pointed to by X,Y to the screen +OUTSTR TXA + * Print string pointed to by A,Y to the screen -PRSTR STA ZP3 ; String in A,Y +PRSTR STA ZP3+0 ; String in A,Y STY ZP3+1 :L1 LDA (ZP3) ; Ptr to string in ZP3 BEQ :S1 - JSR $FFEE ; OSWRCH + JSR OSASCI INC ZP3 BNE :L1 INC ZP3+1 BRA :L1 :S1 RTS +* Print XY in hex +OUT2HEX TYA + JSR OUTHEX + TAX ; Continue into OUTHEX + * Print hex byte in A -PRHEX PHA +OUTHEX PHA LSR LSR LSR @@ -1036,51 +1015,46 @@ PRHEX PHA AND #$0F JSR PRNIB PLA - AND #$0F - JSR PRNIB - RTS + AND #$0F ; Continue into PRNIB +; JSR PRNIB +; RTS * Print hex nibble in A PRNIB CMP #$0A BCC :S1 CLC ; >= $0A ADC #'A'-$0A - JSR $FFEE ; OSWRCH + JSR OSWRCH RTS :S1 ADC #'0' ; < $0A - JSR $FFEE ; OSWRCH - RTS + JMP OSWRCH -OSRDRM LDA #OSRDRMM - JSR PRSTR - RTS + JMP PRSTR OSRDRMM ASC 'OSRDDRM.' DB $00 -OSEVEN LDA #OSEVENM - JSR PRSTR - RTS + JMP PRSTR OSEVENM ASC 'OSEVEN.' DB $00 -OSINIT LDA #OSINITM - JSR PRSTR - RTS -OSINITM ASC 'OSINITM.' + JMP PRSTR +OSINITM ASC 'GSINITM.' DB $00 -OSREAD LDA #OSREADM - JSR PRSTR - RTS -OSREADM ASC 'OSREAD.' + JMP PRSTR +OSREADM ASC 'GSREAD.' DB $00 * OSFIND - open/close a file for byte access -OSFIND PHX +FINDHND PHX PHY PHA STX ZP1 ; Points to filename @@ -1159,15 +1133,14 @@ OSFSCM ASC 'OSFSC.' DB $00 * OSGBPB - Get/Put a block of bytes to/from an open file -OSGBPB LDA #OSGBPBM - JSR PRSTR - RTS + JMP PRSTR OSGBPBM ASC 'OSGBPB.' DB $00 * OSBPUT - write one byte to an open file -OSBPUT LDA STRTL ; Backup STRTL/STRTH +BPUTHND LDA STRTL ; Backup STRTL/STRTH STA TEMP1 LDA STRTH STA TEMP2 @@ -1182,7 +1155,7 @@ OSBPUT LDA STRTL ; Backup STRTL/STRTH JMP XFER * OSBGET - read one byte from an open file -OSBGET LDA STRTL ; Backup STRTL/STRTH +BGETHND LDA STRTL ; Backup STRTL/STRTH STA TEMP1 LDA STRTH STA TEMP2 @@ -1210,15 +1183,22 @@ OSBGETRET RTS * OSARGS - adjust file arguments -OSARGS LDA #OSARGSM - JSR PRSTR - RTS + JMP PRSTR OSARGSM ASC 'OSARGS.' DB $00 -* OSFILE - load or save an entire file -OSFILE PHX +* OSFILE - perform actions on entire files +* On entry, A=action +* XY=>control block +* On exit, A=preserved if unimplemented +* A=0 object not found (not load/save) +* A=1 file found +* A=2 directory found +* XY preserved +* control block updated +FILEHND PHX PHY PHA @@ -1252,8 +1232,8 @@ OSFILE PHX STA (ZP1),Y STA $C005 ; Write aux INY - CMP #$0D ; Carriage return - BNE :L2 + CMP #$21 ; Space or Carriage return + BCS :L2 DEY STA $C004 ; Write main STY MOSFILE ; Length (Pascal string) @@ -1267,7 +1247,7 @@ OSFILE PHX TSX STX $0101 ; Store alt SP in $0101 - PLA + PLA ; Get action back PHA BEQ :S1 ; A=00 -> SAVE CMP #$FF @@ -1278,11 +1258,11 @@ OSFILE PHX JSR PRSTR PLA PHA - JSR PRHEX + JSR OUTHEX LDA #OSFILEM2 JSR PRSTR - PLA + PLA ; Not implemented, return unchanged PLY PLX RTS @@ -1299,6 +1279,7 @@ OSFILE PHX :S3 CLC ; Use main memory CLV ; Use main ZP and LC JMP XFER + OSFILERET LDX $0101 ; Recover alt SP from $0101 TXS @@ -1309,47 +1290,49 @@ OSFILERET STA STRTH PLA ; Return value PLY ; Value of A on entry - CPY #$FF ; LOAD - BNE :S4 + BNE :S4 ; Deal with return from SAVE + CMP #$01 ; No file found BNE :SL1 BRK - DB $D6 ; Error number ?? TBD + DB $D6 ; $D6 = Object not found ASC 'File not found' BRK - LDA #$00 ; Return code - no file - BRA :EXIT + :SL1 CMP #$02 ; Read error BNE :SL2 BRK - DB $D6 ; Error number + DB $CA ; $CA = Premature end, 'Data lost' ASC 'Read error' BRK - LDA #$01 ; Return code - file found - BRA :EXIT + :SL2 LDA #$01 ; Return code - file found BRA :EXIT -:S4 CPY #$00 ; SAVE +:S4 CPY #$00 ; Return from SAVE BNE :S6 CMP #$01 ; Unable to create or open BNE :SS1 BRK - DB $D5 ; Error number ?? TBD - ASC 'Create error' + DB $C0 ; $C0 = Can't create file to save + ASC 'Can' + DB $27 + ASC 't save file' BRK - BRA :S6 + :SS1 CMP #$02 ; Unable to write BNE :S6 BRK - DB $D5 ; Error number ?? TBD + DB $CA ; $CA = Premature end, 'Data lost' ASC 'Write error' BRK + :S6 LDA #$00 :EXIT PLY PLX RTS + OSFILEM ASC 'OSFILE($' DB $00 OSFILEM2 ASC ')' @@ -1357,7 +1340,7 @@ OSFILEM2 ASC ')' TEMP1 DB $00 TEMP2 DB $00 -OSRDCH PHX +RDCHHND PHX PHY JSR GETCHRC STA OLDCHAR @@ -1391,13 +1374,11 @@ OSRDCH PHX PLY PLX CMP #$1B ; Escape pressed? - BEQ :S5 - CLC + BNE :S5 + ROR $FF ; Set ESCFLG + SEC ; Return CS RTS -:S5 LDA ESCFLAG - ORA #$80 - STA ESCFLAG - SEC +:S5 CLC RTS CURS DW $0000 ; Counter CSTATE DB $00 ; Cursor on or off @@ -1477,12 +1458,23 @@ CURSRT LDA COL STZ COL :S2 RTS -* OSWRCH - write a character to the console -OSWRCH PHA +* OSWRCH handler +* All registers preserved +WRCHHND PHA PHX PHY +* Check any output redirections +* Check any spool output + JSR OUTCHAR +* Check any printer output + PLY + PLX + PLA + RTS - CMP #$00 ; NULL +* Output character to VDU driver +* All registers trashable +OUTCHAR CMP #$00 ; NULL BNE :T1 BRA :IDONE :T1 CMP #$07 ; BELL @@ -1543,10 +1535,7 @@ OSWRCH PHA :SCROLL JSR SCROLL STZ COL JSR CLREOL -:DONE PLY - PLX - PLA - RTS +:DONE RTS * Scroll whole screen one line SCROLL LDA #$00 @@ -1590,9 +1579,13 @@ SCNTAB DW $800,$880,$900,$980,$A00,$A80,$B00,$B80 DW $828,$8A8,$928,$9A8,$A28,$AA8,$B28,$BA8 DW $850,$8D0,$950,$9D0,$A50,$AD0,$B50,$BD0 -* OSWORD - system calls that take word argument in X,Y -OSWORD STX ZP1 ; ZP1 points to control block - STY ZP1+1 +* OSWORD HANDLER +* On entry, A=action +* XY=>control block +* On exit, All preserved (except OSWORD 0) +* control block updated +WORDHND STX OSCTRL+0 ; Point to control block + STY OSCTRL+1 CMP #$00 ; OSWORD 0 read a line BNE :S01 JMP OSWORD0 @@ -1607,74 +1600,80 @@ OSWORD STX ZP1 ; ZP1 points to control block JMP OSWORD5 :S06 CMP #$06 ; OSWORD 6 write I/O memory BNE :UNSUPP - JMP OSWORD6 + :UNSUPP PHA LDA #<:OSWORDM ; Unimplemented, print msg LDY #>:OSWORDM JSR PRSTR PLA - JSR PRHEX + PHA + JSR OUTHEX LDA #<:OSWRDM2 LDY #>:OSWRDM2 JSR PRSTR + PLA RTS -:OSWORDM STR 'OSWORD(' +:OSWORDM ASC 'OSWORD(' DB $00 -:OSWRDM2 STR ')' +:OSWRDM2 ASC ')' DB $00 -OSWORD0 LDA (ZP1) ; Addr of buf -> ZP2 - STA ZP2 - LDY #$01 - LDA (ZP1),Y - STA ZP2+1 +* OSRDLINE - Read a line of input +* On entry, (OSCTRL)=>control block +* On exit, Y=length of line, offset to +* CC = Ok, CS = Escape +* +OSWORD0 LDY #$04 +:RDLNLP1 LDA (OSCTRL),Y ; Copy MAXLEN, MINCH, MAXCH to workspace + STA :MAXLEN-2,Y + DEY + CPY #$02 + BCS :RDLNLP1 +:RDLNLP2 LDA (OSCTRL),Y ; (ZP2)=>line buffer + STA ZP2,Y + DEY + BPL :RDLNLP2 INY - LDA (ZP1),Y - STA :MAXLEN - INY - LDA (ZP1),Y - STA :MINCH - INY - LDA (ZP1),Y - STA :MAXCH - LDY #$00 BRA :L1 :BELL LDA #$07 ; BELL :R1 DEY -:R2 INY -:R3 JSR $FFEE ; OSWRCH +:R2 INY ; Step to next character +:R3 JSR OSWRCH ; Output character -:L1 JSR $FFE0 ; OSRDCH +:L1 JSR OSRDCH BCS :EXIT - + CMP #$08 ; Backspace + BEQ :RDDEL CMP #$7F ; Delete - BNE :S1 ; Nope - CPY #$00 ; Begin of line? - BEQ :L1 - DEY - BCS :R3 -:S1 CMP #$15 ; Line delete ^U - BNE :S2 ; Nope - TYA ; Begin of line? - BEQ :L1 + BEQ :RDDEL + CMP #$15 ; Ctrl-U + BNE :S2 + INY ; Balance first DEY +:RDCTRLU DEY ; Back up one character + BEQ :L1 ; Beginning of line LDA #$7F ; Delete -:L2 JSR $FFEE ; OSWRCH - DEY - BNE :L2 - BEQ :L1 + JSR OSWRCH + JMP :RDCTRLU +:RDDEL TYA + BEQ :L1 ; Beginning of line + DEY ; Back up one character + LDA #$7F ; Delete + BNE :R3 ; Jump back to delete + :S2 STA (ZP2),Y CMP #$0D ; CR BEQ :S3 CPY :MAXLEN - BCS :BELL + BCS :BELL ; Too long, beep CMP :MINCH - BCC :R1 + BCC :R1 ; MAXCHAR, don't step to next + +:S3 JSR OSNEWL :EXIT LDA ESCFLAG ROL RTS @@ -1684,7 +1683,7 @@ OSWORD0 LDA (ZP1) ; Addr of buf -> ZP2 OSWORD1 LDA #$00 LDY #$00 -:L1 STA (ZP1),Y +:L1 STA (OSCTRL),Y INY CPY #$05 BNE :L1 @@ -1692,152 +1691,122 @@ OSWORD1 LDA #$00 OSWORD2 RTS ; Nothing to do -OSWORD5 LDA (ZP1) +OSWORD5 LDA (OSCTRL) LDY #$04 - STA (ZP1),Y + STA (OSCTRL),Y RTS -OSWORD6 LDY #$04 - LDA (ZP1),Y - STA (ZP1) +OSWORD6 LDA #$04 + LDA (OSCTRL),Y + STA (OSCTRL) RTS -* OSBYTE - system calls that take a byte in A -OSBYTE PHX - PHY -:S02 CMP #$02 ; $02 = select i/p stream - BNE :S03 - PLY ; Nothing to do, for now - PLX +* OSBYTE HANDLER +* On entry, A=action +* X=first parameter +* Y=second parameter if A>$7F +* On exit, A=preserved +* X=first returned result +* Y=second returned result if A>$7F +* Cy=any returned status if A>$7F +BYTEHND PHA + JSR BYTECALLER + PLA RTS -:S03 CMP #$03 ; $03 = select o/p stream - BNE :S0B - PLY ; Nothing to do, for now - PLX +BYTECALLER + CMP #$00 + BNE :S1 + LDX #$0A RTS -:S0B CMP #$0B ; $0B = Set k/b autorep delay - BNE :S0C - PLY ; Nothing to do - PLX - RTS -:S0C CMP #$0C ; $0C = Set kbd autrep rate - BNE :S0F - PLY ; Nothing to do - PLX - RTS -:S0F CMP #$0F ; $0F = Flush selected bufs - BNE :S7C - PLY ; Nothing to do - PLX - RTS -:S7C CMP #$7C ; $7C = clear escape condition - BNE :S7D - PHA + +:S1 CMP #$7C ; $7C = clear escape condition + BNE :S2 LDA ESCFLAG AND #$7F ; Clear MSbit STA ESCFLAG - PLA - PLY - PLX RTS -:S7D CMP #$7D ; $7D = set escape condition - BNE :S7E - PHA + +:S2 CMP #$7D ; $7D = set escape condition + BNE :S3 ROR ESCFLAG - PLA - PLY - PLX RTS -:S7E CMP #$7E ; $7E = ack detection of ESC - BNE :S80 - PHA + +:S3 CMP #$7E ; $7E = ack detection of ESC + BNE :S4 LDA ESCFLAG AND #$7F ; Clear MSB STA ESCFLAG - PLA - PLY - PLX LDX #$FF ; Means ESC condition cleared RTS -:S80 CMP #$80 ; $80 = Read ADC/get buf status - BNE :S81 - PLY - PLX - JMP OSBYTE80 -:S81 CMP #$81 ; $81 = Read key with time lim - BNE :S82 - PLY - PLX - JMP GETKEY -:S82 CMP #$82 ; $82 = read high order address - BNE :S83 - PLY - PLX + +:S4 CMP #$81 ; $81 = Read key with time lim + BNE :S5 + JSR GETKEY + RTS + +:S5 CMP #$82 ; $82 = read high order address + BNE :S6 LDY #$FF ; $FFFF for I/O processor LDX #$FF RTS -:S83 CMP #$83 ; $83 = read bottom of user mem - BNE :S84 - PLY - PLX + +:S6 CMP #$83 ; $83 = read bottom of user mem + BNE :S7 LDY #$0E ; $0E00 LDX #$00 RTS -:S84 CMP #$84 ; $84 = read top of user mem - BNE :S85 - PLY - PLX + +:S7 CMP #$84 ; $84 = read top of user mem + BNE :S8 LDY #$80 LDX #$00 RTS -:S85 CMP #$85 ; $85 = top user mem for mode - BNE :S86 - PLY - PLX + +:S8 CMP #$85 ; $85 = top user mem for mode + BNE :S9 LDY #$80 LDX #$00 RTS -:S86 CMP #$86 ; $86 = read cursor pos - BNE :S8B - PLY - PLX + +:S9 CMP #$86 ; $86 = read cursor pos + BNE :S10 LDY ROW LDX COL RTS -:S8B CMP #$8B ; $8B = select file options - BNE :SDA - PLY ; Do nothing, for now - PLX + +:S10 CMP #$DA ; $DA = clear VDU queue + BNE :S11 RTS -:SDA CMP #$DA ; $DA = clear VDU queue - BNE :UNSUPP - PLY ; Nothing to do - PLX - RTS -:UNSUPP PHA + +:S11 PHX + PHY LDA #OSBYTEM JSR PRSTR - PLA - PHA - JSR PRHEX + TSX + LDA $103,X + JSR OUTHEX LDA #OSBM2 JSR PRSTR - PLA PLY PLX RTS + OSBYTEM ASC 'OSBYTE($' DB $00 OSBM2 ASC ').' DB $00 -* OSCLI - interface to command line -OSCLI PHX +* OSCLI HANDLER +* On entry, XY=>command string +CLIHND PHX PHY - STX ZP1 ; Pointer to CLI + STX ZP1+0 ; Pointer to CLI STY ZP1+1 +; TO DO: needs to skip leading '*'s and ' 's +; TO DO: exit early with +; TO DO: exit early with | as comment LDA #<:QUIT STA ZP2 LDA #>:QUIT @@ -1960,10 +1929,10 @@ STARHELP LDA #<:MSG LDY #>:MSG2 JSR PRSTR RTS -:MSG DB $0A,$0D +:MSG DB $0D ASC 'Applecorn MOS v0.01' - DB $0A,$0D,$0A,$0D,$00 -:MSG2 DB $0A,$0D,$0A,$0D,$00 + DB $0D,$0D,$00 +:MSG2 DB $0D,$00 STARQUIT LDA #MSGBRK + JSR PRSTR JSR PRERR - JSR $FFE7 ; OSNEWL - JSR $FFE7 - RTS + JSR OSNEWL + JSR OSNEWL +STOP JMP STOP ; Cannot return from a BRK -DEFBRKHDLR - LDA #BRKM - JSR PRSTR - PLA - PLX - PLY - PHY - PHX - PHA - TYA - JSR PRHEX - TXA - JSR PRHEX - LDA #BRKM2 - JSR PRSTR - RTI -BRKM ASC "BRK($" - DB $00 -BRKM2 ASC ")." +MSGBRK DB $0D + ASC "ERROR: " DB $00 + +;DEFBRKHDLR +; LDA #BRKM +; JSR PRSTR +; PLA +; PLX +; PLY +; PHY +; PHX +; PHA +; JSR OUT2HEX +; LDA #BRKM2 +; JSR PRSTR +; RTI +;BRKM ASC "BRK($" +; DB $00 +;BRKM2 ASC ")." +; DB $00 + +* 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 NULLRTS ; $21E FSCV +ENDVEC + * * Acorn MOS entry points at the top of RAM +* Copied from loaded code to high memory * -MOSVEC - JMP OSRDRM ; FFB9 - NOP ; FFBC - NOP ; FFBD - NOP ; FFBE - JMP OSEVEN ; FFBF - JMP OSINIT ; FFC2 - JMP OSREAD ; FFC5 - JMP OSWRCH ; FFC8 NVWRCH Non vectored - JMP OSRDCH ; FFCB NVRDCH Non vectored - JMP (FINDV) ; FFCE OSFIND - JMP (GBPBV) ; FFD1 OSGBPB - JMP (BPUTV) ; FFD4 OSBPUT - JMP (BGETV) ; FFD7 OSBGET - JMP (ARGSV) ; FFDA OSARGS - JMP (FILEV) ; FFDD OSFILE - JMP (RDCHV) ; FFE0 OSRDCH - CMP #$0D ; FFE3 OSASCI - BNE :S1 - LDA #$0A ; FFE7 OSNEWL + +MOSVEC ; Base of API entries here in loaded code +MOSAPI EQU $FFB6 ; Real base of API entries in real memory + ORG MOSAPI + +* OPTIONAL ENTRIES +* ---------------- +*OSSERV JMP NULLRTS ; FF95 OSSERV +*OSCOLD JMP NULLRTS ; FF98 OSCOLD +*OSPRSTR JMP OUTSTR ; FF9B PRSTRG +*OSFF9E JMP NULLRTS ; FF9E +*OSSCANHEX JMP RDHEX ; FFA1 SCANHX +*OSFFA4 JMP NULLRTS ; FFA4 +*OSFFA7 JMP NULLRTS ; FFA7 +*PRHEX JMP OUTHEX ; FFAA PRHEX +*PR2HEX JMP OUT2HEX ; FFAD PR2HEX +*OSFFB0 JMP NULLRTS ; FFB0 +*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 + BNE OSWRCH +OSNEWL LDA #$0A ; FFE7 OSNEWL JSR OSWRCH - LDA #$0D -:S1 JMP (WRCHV) ; FFEE OSWRCH - JMP (WORDV) ; FFF1 OSWORD - JMP (BYTEV) ; FFF4 OSBYTE - JMP (CLIV) ; FFF7 OSCLI - NOP ; FFFA - NOP ; FFFB - NOP ; FFFC - NOP ; FFFD - DW BRKHDLR ; FFFE +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 MOSVEND + * Buffer for one 512 byte disk block in aux mem AUXBLK DS $200