Merging JGH: Tweeks to i/f between OSCLI & HOSTFS.

This commit is contained in:
Bobbi Webber-Manners
2021-08-26 17:36:46 -04:00
parent 9390b7c730
commit 7c98d6a98b
13 changed files with 308 additions and 216 deletions

Binary file not shown.

View File

@@ -175,3 +175,5 @@ MAINZP MAC
PUT AUXMEM.CHARIO PUT AUXMEM.CHARIO
PUT AUXMEM.MISC PUT AUXMEM.MISC

View File

@@ -2,10 +2,6 @@
* (c) Bobbi 2021 GPLv3 * (c) Bobbi 2021 GPLv3
* *
* Applecorn OSBYTE and OSWORD handlers * Applecorn OSBYTE and OSWORD handlers
* KERNEL/OSWOSB.S
*****************
* OSBYTE and OSWORD dispatch
* *
* 15-Aug-2021 Added 'set variable' OSBYTEs 1-6 * 15-Aug-2021 Added 'set variable' OSBYTEs 1-6
@@ -65,13 +61,13 @@ OSWBASE DW WORD00 ; OSWORD 0 - Read input line
DW WORD04 ; OSWORD 4 - Write interval timer DW WORD04 ; OSWORD 4 - Write interval timer
DW WORD05 ; OSWORD 5 - Read I/O memory DW WORD05 ; OSWORD 5 - Read I/O memory
DW WORD06 ; OSWORD 6 - Write I/O memory DW WORD06 ; OSWORD 6 - Write I/O memory
* DW WORD07 ; OSWORD 7 - SOUND * DW WORD07 ; OSWORD 7 - SOUND
* DW WORD08 ; OSWORD 8 - ENVELOPE * DW WORD08 ; OSWORD 8 - ENVELOPE
* DW WORD09 ; OSWORD 9 - POINT * DW WORD09 ; OSWORD 9 - POINT
* DW WORD0A ; OSWORD 10 - Read character bitmap * DW WORD0A ; OSWORD 10 - Read character bitmap
* DW WORD0B ; OSWORD 11 - Read palette * DW WORD0B ; OSWORD 11 - Read palette
* DW WORD0C ; OSWORD 12 - Write palette * DW WORD0C ; OSWORD 12 - Write palette
* DW WORD0D ; OSWORD 13 - Read coordinates * DW WORD0D ; OSWORD 13 - Read coordinates
OSWEND OSWEND
DW WORDE0 ; OSWORD &E0+ - User OSWORD DW WORDE0 ; OSWORD &E0+ - User OSWORD
@@ -142,12 +138,12 @@ BYTEGO3 ORA #$80 ; Will become CS=OSBYTE call
BYTWRDCALL ASL A ; Index into dispatch table BYTWRDCALL ASL A ; Index into dispatch table
TAY ; Y=offset into dispatch table TAY ; Y=offset into dispatch table
* BIT FXNETCLAIM ; Check Econet intercept flag * BIT FXNETCLAIM ; Check Econet intercept flag
* BPL BYTWRDNONET ; No intercept, skip past * BPL BYTWRDNONET ; No intercept, skip past
* TXA ; Set A=BYTE or WORD call * TXA ; Set A=BYTE or WORD call
* CLV ; Clear V * CLV ; Clear V
* JSR CALLNET ; Call Econet with X=call type * JSR CALLNET ; Call Econet with X=call type
* BVS BYTWRDEXIT ; V now set, claimed by NETV * BVS BYTWRDEXIT ; V now set, claimed by NETV
BYTWRDNONET LDA BYTWRDADDR+1,Y ; Get routine address BYTWRDNONET LDA BYTWRDADDR+1,Y ; Get routine address
STA OSINTWS+1 STA OSINTWS+1
@@ -172,20 +168,35 @@ BYTWRDGO JSR JMPADDR ; Call the routine
* X,Y,Cy from routine returned to caller * X,Y,Cy from routine returned to caller
BYTWRDEXIT ROR A ; Move Carry to A BYTWRDEXIT ROR A ; Move Carry to A
PLP ; Restore original flags PLP ; Restore original flags and IRQs
ROL A ; Move Carry back to flags ROL A ; Move Carry back to flags
PLA ; Restore A PLA ; Restore A
CLV ; Clear V = Actioned CLV ; Clear V = Actioned
RTS RTS
BYTWRDFAIL BYTWRDFAIL
* JSR SERVICE ; Offer to sideways ROMs * TEST code for VIEW
* LDX OSXREG ; Get returned X CPX #$07
* CMP #$00 BNE BYTFAIL0
* BEQ BYTWRDEXIT ; Claimed, return CMP #$76
BEQ BYTE76
CMP #$A0
BNE BYTFAIL0
LDY #79 ; Read VDU variable $09,$0A
LDX #23
BRA BYTWRDEXIT
BYTE76
LDX $00
BRA BYTWRDEXIT
* TEST
BYTFAIL0
* JSR SERVICE ; Offer to sideways ROMs
* LDX OSXREG ; Get returned X
* CMP #$00
* BEQ BYTWRDEXIT ; Claimed, return
JSR UNSUPBYTWRD ; *DEBUG* JSR UNSUPBYTWRD ; *DEBUG*
LDX #$FF ; X=&FF if unclaimed LDX #$FF ; X=&FF if unclaimed
PLP ; Restore IRQs PLP ; Restore original flags and IRQs
PLA ; Restore A PLA ; Restore A
BIT SETV ; Set V = Not actioned BIT SETV ; Set V = Not actioned
RTS RTS
@@ -202,7 +213,7 @@ JMPADDR JMP ($00FA)
* On exit, Y=length of line, offset to <cr> * On exit, Y=length of line, offset to <cr>
* CC = Ok, CS = Escape * CC = Ok, CS = Escape
* *
XC ; 65c02
WORD00 IF MAXLEN-OSTEXT-2 WORD00 IF MAXLEN-OSTEXT-2
LDY #$04 LDY #$04
:WORD00LP1 LDA (OSCTRL),Y ; Copy MAXLEN, MINCH, MAXCH to workspace :WORD00LP1 LDA (OSCTRL),Y ; Copy MAXLEN, MINCH, MAXCH to workspace
@@ -216,14 +227,14 @@ WORD00 IF MAXLEN-OSTEXT-2
BPL :WORD00LP2 BPL :WORD00LP2
INY ; Initial line length = zero INY ; Initial line length = zero
ELSE ELSE
LDA (OSCTRL),Y ; Copy control block LDA (OSCTRL),Y ; Copy control block
STA OSTEXT,Y ; 0,1 => text STA OSTEXT,Y ; 0,1 => text
INY ; 2 = MAXLEN INY ; 2 = MAXLEN
CPY #$05 ; 3 = MINCHAR CPY #$05 ; 3 = MINCHAR
BCC WORD00 ; 4 = MAXCHAR BCC WORD00 ; 4 = MAXCHAR
LDY #$00 ; Initial line length = zero LDY #$00 ; Initial line length = zero
FIN FIN
* STY FXLINES ; Reset line counter * STY FXLINES ; Reset line counter
CLI CLI
BEQ :WORD00LP ; Enter main loop BEQ :WORD00LP ; Enter main loop
@@ -234,17 +245,20 @@ WORD00 IF MAXLEN-OSTEXT-2
:WORD00LP JSR OSRDCH :WORD00LP JSR OSRDCH
BCS :WORD00ESC ; Escape BCS :WORD00ESC ; Escape
* TAX ; Save character in X * TAX ; Save character in X
* LDA FXVAR03 ; Get FX3 destination * LDA FXVAR03 ; Get FX3 destination
* ROR A * ROR A
* ROR A ; Move bit 1 into Carry * ROR A ; Move bit 1 into Carry
* TXA ; Get character back * TXA ; Get character back
* BCS :WORD00TEST ; VDU disabled, ignore * BCS :WORD00TEST ; VDU disabled, ignore
* LDX FXVDUQLEN ; Get length of VDU queue * LDX FXVDUQLEN ; Get length of VDU queue
* BNE :WORD00ECHO ; Not zero, just print * BNE :WORD00ECHO ; Not zero, just print
:WORD00TEST CMP #$7F ; Delete :WORD00TEST CMP #$7F ; Delete
BEQ :WORD00DEL
CMP #$08 ; If KBD has no DELETE key
BNE :WORD00CHAR BNE :WORD00CHAR
CPY #$00 LDA #$7F
:WORD00DEL CPY #$00
BEQ :WORD00LP ; Nothing to delete BEQ :WORD00LP ; Nothing to delete
DEY ; Back up one character DEY ; Back up one character
BCS :WORD00ECHO ; Loop back to print DEL BCS :WORD00ECHO ; Loop back to print DEL
@@ -269,7 +283,7 @@ WORD00 IF MAXLEN-OSTEXT-2
BCS :WORD00ECHO ; >MAXCHAR, don't step to next BCS :WORD00ECHO ; >MAXCHAR, don't step to next
:WORD00CR JSR OSNEWL :WORD00CR JSR OSNEWL
* JSR CALLNET ; Call Econet Vector, A=13 * JSR CALLNET ; Call Econet Vector, A=13
:WORD00ESC LDA ESCFLAG ; Get Escape flag :WORD00ESC LDA ESCFLAG ; Get Escape flag
ROL A ; Carry=Escape state ROL A ; Carry=Escape state
RTS RTS
@@ -297,47 +311,62 @@ WORD02 RTS ; Dummy, do nothing
* On entry, (OSCTRL)+0 address * On entry, (OSCTRL)+0 address
* (OSCTRL)+4 byte read or written * (OSCTRL)+4 byte read or written
* Y=0, A=(OSCTRL) * Y=0, A=(OSCTRL)
* IRQs are disabled, so we don't have to preserve IRQ state
XC ; 65c02 *
WORD05 JSR GETADDR ; Point to address, set X and Y WORD05 JSR GETADDR ; Point to address, set Y=>data
LDA (OSINTWS) ; Get byte BNE WORD05A
STA $C002 ; Switch to main memory
WORD05A LDA (OSINTWS) ; Get byte
STA $C003 ; Back to aux memory
STA (OSCTRL),Y ; Store it STA (OSCTRL),Y ; Store it
RTS RTS
WORD06 JSR GETADDR ; Point to address, set X and Y
WORD06 JSR GETADDR ; Point to address, set Y=>data
PHP
LDA (OSCTRL),Y ; Get byte LDA (OSCTRL),Y ; Get byte
STA (OSINTWS) ; Store it PLP
BNE WORD06A
STA $C004 ; Switch to main memory
WORD06A STA (OSINTWS) ; Store it
STA $C005 ; Back to aux memory
RTS RTS
GETADDR STA OSINTWS+0 ; (OSINTWS)=>byte to read/write GETADDR STA OSINTWS+0 ; (OSINTWS)=>byte to read/write
INY INY
LDA (OSCTRL),Y LDA (OSCTRL),Y
STA OSINTWS+1 STA OSINTWS+1
LDY #$04 ; Point Y to data byte INY
INY
LDA (OSCTRL),Y ; Get address high byte
INY ; Point Y to data byte
CMP #$80 ; *TO DO* Needs an appropriate value
RTS RTS
* OSBYTE routines * OSBYTE routines
***************** *****************
* TO DO: move to init.s
BYTE00 LDX #$0A ; $00 = identify Host BYTE00 LDX #$0A ; $00 = identify Host
RTS RTS ; %000x1xxx host type, 'A'pple
BYTE88 LDA #$01 ; $88 = *CODE BYTE88 LDA #$01 ; $88 = *CODE
WORDE0 JMP (USERV) ; OSWORD &E0+ WORDE0 JMP (USERV) ; OSWORD &E0+
* Low OSBYTE converted into Set Variable * Low OSBYTE converted into Set Variable
BYTE02 LDA #$F7 ; -> &B1 BYTE02 LDA #$F7 ; -> &B1
; *
BYTE09 ; -> &C2 BYTE09 ; -> &C2
BYTE0A ; -> &C3 BYTE0A ; -> &C3
BYTE0B ; -> &C4 BYTE0B ; -> &C4
BYTE0C ADC #$C9 ; -> &C5 BYTE0C ADC #$C9 ; -> &C5
; *
BYTE01 ; -> &F1 BYTE01 ; -> &F1
BYTE05 ; -> &F5 BYTE05 ; -> &F5
BYTE06 ADC #$07 ; -> &F6 BYTE06 ADC #$07 ; -> &F6
; *
BYTE03 ; -> &EC BYTE03 ; -> &EC
BYTE04 ADC #$E8 ; -> &ED BYTE04 ADC #$E8 ; -> &ED
; *
* Read/Write OSBYTE variable * Read/Write OSBYTE variable
BYTEVAR TAY ; offset to variable BYTEVAR TAY ; offset to variable
LDA BYTEVARBASE+0,Y LDA BYTEVARBASE+0,Y
@@ -358,7 +387,8 @@ BYTE8D ; *ROM
BYTE82 ; $82 = read high order address BYTE82 ; $82 = read high order address
* LDY #$00 * LDY #$00
* LDX #$00 ; $0000 for language processor * LDX #$00 ; $0000 for language processor
* Should return $0000, but BCPL and Lisp playing silly buggers * Should return $0000, but BCPL and Lisp try to move up to $F800
* overwriting Apple II stuff
LDY #$FF ; $FFFF for I/O processor LDY #$FF ; $FFFF for I/O processor
LDX #$FF LDX #$FF
RTS RTS
@@ -386,7 +416,7 @@ BYTE7DOK RTS
* Passed on to filing system * Passed on to filing system
BYTE8B LDA #$00 ; &00 -> &00 - *OPT BYTE8B LDA #$00 ; &00 -> &00 - *OPT
BYTE7F AND #$01 ; &7F -> &01 - EOF BYTE7F AND #$01 ; &7F -> &01 - EOF
JMP (FSCV) ; Hand over to filing system CALLFSCV JMP (FSCV) ; Hand over to filing system
* TO DO: Move this to AUXMEM.INIT.S * TO DO: Move this to AUXMEM.INIT.S
@@ -433,9 +463,18 @@ UNSUPBYTWRD
UNSUPGO JSR PRSTR UNSUPGO JSR PRSTR
LDA OSAREG LDA OSAREG
JSR OUTHEX JSR OUTHEX
* LDA #$2C
* LDA OSXREG
* JSR OUTHEX
* LDA #$2C
* LDA OSYREG
* JSR OUTHEX
LDA #<OSBM2 LDA #<OSBM2
LDY #>OSBM2 LDY #>OSBM2
JMP PRSTR JSR PRSTR
* JSR OSRDCH
LDA OSAREG
RTS
OSBYTEM ASC 'OSBYTE($' OSBYTEM ASC 'OSBYTE($'
DB $00 DB $00
@@ -444,3 +483,5 @@ OSWORDM ASC 'OSWORD($'
OSBM2 ASC ').' OSBM2 ASC ').'
DB $00 DB $00

View File

@@ -97,11 +97,11 @@ RDCHHND LDA #$80 ; flag=wait forever
TAY TAY
BRA INKEYGO ; Wait forever for input BRA INKEYGO ; Wait forever for input
; XY<$8000 - wait for a keypress * XY<$8000 - wait for a keypress
INKEY PHY ; Dummy PHY to balance RDCH INKEY PHY ; Dummy PHY to balance RDCH
INKEYGO PHX ; Save registers INKEYGO PHX ; Save registers
PHY PHY
; *
BIT VDUSTATUS ; Enable editing cursor BIT VDUSTATUS ; Enable editing cursor
BVC INKEYGO2 ; No editing cursor BVC INKEYGO2 ; No editing cursor
JSR GETCHRC ; Get character under cursor JSR GETCHRC ; Get character under cursor
@@ -111,10 +111,10 @@ INKEYGO PHX ; Save registers
JSR COPYSWAP1 ; Swap to copy cursor JSR COPYSWAP1 ; Swap to copy cursor
INKEYGO2 JSR GETCHRC ; Get character under cursor INKEYGO2 JSR GETCHRC ; Get character under cursor
STA OLDCHAR STA OLDCHAR
; *
CLI CLI
BRA INKEY1 ; Turn cursor on BRA INKEY1 ; Turn cursor on
; *
INKEYLP1 PHX INKEYLP1 PHX
INKEYLP2 PHY INKEYLP2 PHY
INKEYLP CLC INKEYLP CLC
@@ -138,7 +138,7 @@ INKEY3 LDA ESCFLAG
BMI INKEYOK ; Escape pending, return it BMI INKEYOK ; Escape pending, return it
INKEY4 JSR KEYREAD ; Test for input, all can be trashed INKEY4 JSR KEYREAD ; Test for input, all can be trashed
BCC INKEYOK ; Char returned, return it BCC INKEYOK ; Char returned, return it
; *
* VBLK pulses at 50Hz, changes at 100Hz * VBLK pulses at 50Hz, changes at 100Hz
* (60Hz in US, will need tweeking) * (60Hz in US, will need tweeking)
LDX $C019 ; Get initial VBLK state LDX $C019 ; Get initial VBLK state
@@ -147,7 +147,7 @@ INKEY5 BIT $C000
TXA TXA
EOR $C019 EOR $C019
BPL INKEY5 ; Wait for VBLK change BPL INKEY5 ; Wait for VBLK change
; *
PLY PLY
BMI INKEYLP2 ; Loop forever BMI INKEYLP2 ; Loop forever
PLX PLX
@@ -158,22 +158,22 @@ INKEYDEC DEX
BNE INKEYLP1 ; Not 0, loop back BNE INKEYLP1 ; Not 0, loop back
TYA TYA
BNE INKEYLP1 ; Not 0, loop back BNE INKEYLP1 ; Not 0, loop back
; *
PHY PHY
JSR INKEYOFF ; Restore cursors JSR INKEYOFF ; Restore cursors
PLY PLY
; *
DEY ; Y=$FF DEY ; Y=$FF
TYA ; A=$FF TYA ; A=$FF
PLX ; Drop dummy PHY PLX ; Drop dummy PHY
SEC SEC
RTS RTS
; Timeout: CS, AY=$FFFF, becomes XY=$FFFF * Timeout: CS, AY=$FFFF, becomes XY=$FFFF
INKEYOK PHA INKEYOK PHA
; *
JSR INKEYOFF ; Restore cursors JSR INKEYOFF ; Restore cursors
; *
* LDA OLDCHAR ; Remove editing cursor * LDA OLDCHAR ; Remove editing cursor
* JSR PUTCHRC ; Remove cursor * JSR PUTCHRC ; Remove cursor
* BIT VDUSTATUS * BIT VDUSTATUS
@@ -181,7 +181,7 @@ INKEYOK PHA
* JSR COPYSWAP1 ; Swap cursor back * JSR COPYSWAP1 ; Swap cursor back
* LDA COPYCHAR * LDA COPYCHAR
* JSR PUTCHRC ; Remove edit cursor * JSR PUTCHRC ; Remove edit cursor
; *
INKEYOK2 PLA INKEYOK2 PLA
PLY ; <$80=INKEY or $80=RDCH PLY ; <$80=INKEY or $80=RDCH
PLX ; Restore X PLX ; Restore X
@@ -223,7 +223,7 @@ NEGINKEY CPX #$01
LDX #$00 ; Unimplemented LDX #$00 ; Unimplemented
LDY #$00 LDY #$00
BCS NEGINKEY0 BCS NEGINKEY0
LDX #$20 ; INKEY-256 LDX #$2E ; INKEY-256 = $2E = Apple IIe
NEGINKEY0 CLC NEGINKEY0 CLC
RTS RTS
@@ -263,7 +263,7 @@ KEYREAD
* *
JSR KBDREAD ; Fetch character from KBD "buffer" JSR KBDREAD ; Fetch character from KBD "buffer"
BCS KEYREADOK ; Nothing pending BCS KEYREADOK ; Nothing pending
; *
TAY TAY
BPL KEYREADOK ; Not top-bit key BPL KEYREADOK ; Not top-bit key
AND #$CF AND #$CF
@@ -281,7 +281,7 @@ KEYREAD
KEYREADOKY TYA KEYREADOKY TYA
KEYREADOK1 CLC KEYREADOK1 CLC
KEYREADOK RTS KEYREADOK RTS
; *
* Process soft key * Process soft key
KEYSOFT1 LDX FX254VAR KEYSOFT1 LDX FX254VAR
CPX #$C0 CPX #$C0
@@ -367,7 +367,7 @@ KBDTEST LDA $C000 ; VS here to test for keypress
BCC KBDCURSR ; $08-$0B are cursor keys BCC KBDCURSR ; $08-$0B are cursor keys
CMP #$15 CMP #$15
BNE KBDCHKESC ; $15 is cursor key BNE KBDCHKESC ; $15 is cursor key
; *
KBDCUR15 LDA #$0D ; Convert RGT to $09 KBDCUR15 LDA #$0D ; Convert RGT to $09
KBDTAB SBC #$04 ; Convert TAB to &C9 KBDTAB SBC #$04 ; Convert TAB to &C9
KBDCURSR CLC KBDCURSR CLC
@@ -392,7 +392,7 @@ KBDFUNC AND #$0F ; Convert Apple-Num to function key
BRA KBDCHKESC BRA KBDCHKESC
KBDCTRL AND #$1F ; Apple-Letter -> Ctrl-Letter KBDCTRL AND #$1F ; Apple-Letter -> Ctrl-Letter
; *
* Test for Escape key * Test for Escape key
KBDCHKESC TAX ; X=keycode KBDCHKESC TAX ; X=keycode
EOR FXESCCHAR ; Current ESCAPE char? EOR FXESCCHAR ; Current ESCAPE char?
@@ -407,3 +407,5 @@ KBDNOESC TXA ; A=keycode
CLC ; CLC=Ok CLC ; CLC=Ok
KBDDONE RTS KBDDONE RTS

View File

@@ -251,6 +251,8 @@ FILEHND PHX
:LOAD >>> XF2MAIN,LOADFILE :LOAD >>> XF2MAIN,LOADFILE
:DELETE >>> XF2MAIN,DELFILE :DELETE >>> XF2MAIN,DELFILE
:MKDIR >>> XF2MAIN,MAKEDIR :MKDIR >>> XF2MAIN,MAKEDIR
* On return here, A<$80 just return to caller, A>$7F generate error
OSFILERET OSFILERET
>>> ENTAUX >>> ENTAUX
PHA PHA
@@ -258,23 +260,23 @@ OSFILERET
STA ZP1 STA ZP1
LDA CBPTR+1 LDA CBPTR+1
STA ZP1+1 STA ZP1+1
LDY #$00 LDY #$02
:L3 LDA AUXBLK,Y ; Mainmem left it in AUXBLK :L3 LDA AUXBLK,Y ; Mainmem left it in AUXBLK
STA (ZP1),Y STA (ZP1),Y
INY INY
CPY #18 ; 18 bytes in control block CPY #18 ; 18 bytes in control block
BNE :L3 BNE :L3
PLA PLA
PLY ; Value of A on OSFILE entry * BMI :L4
* JMP :EXIT ; ret<$80, return it to user
:L4 PLY ; Value of A on OSFILE entry
CPY #$FF ; See if command was LOAD CPY #$FF ; See if command was LOAD
BNE :NOTLOAD BNE :NOTLOAD ; Deal with return from SAVE
CMP #$01 ; No file found CMP #$01 ; No file found
BNE :SL1 BNE :SL1
BRK BRA ERRNOTFND
DB $D6 ; $D6 = Object not found
ASC 'File not found'
BRK
:SL1 CMP #$02 ; Read error :SL1 CMP #$02 ; Read error
BNE :SL2 BNE :SL2
@@ -306,14 +308,13 @@ OSFILERET
:SS2 LDA #$01 ; Return code - file found :SS2 LDA #$01 ; Return code - file found
:NOTLS CPY #$06 ; Was it DELETE? :NOTLS CMP #$00 ; File was not found
BNE :NOTLSD ; Was LOAD/SAVE/DELETE
CMP #$00 ; File was not found
BNE :SD1 BNE :SD1
BRK JMP :EXIT
DB $D6 ; $D6 = File not found * BRK
ASC 'Not found' * DB $D6 ; $D6 = File not found
BRK * ASC 'Not found'
* BRK
:SD1 CMP #$FF ; Some other error :SD1 CMP #$FF ; Some other error
BNE :EXIT ; A=0 or 1 already BNE :EXIT ; A=0 or 1 already
@@ -327,26 +328,31 @@ OSFILERET
:NOTLSD CPY #$08 ; Was it CDIR? :NOTLSD CPY #$08 ; Was it CDIR?
BNE :EXIT BNE :EXIT
CMP #$00 ; A=0 means dir was created CMP #$00 ; A=0 means dir was created
BEQ :SC1 BNE ERREXISTS
BRK :SC1 LDA #$02 ; A=2 - dir exists or was created
DB $C0 ; Guess - IS THIS REASONABLE??
ASC 'Can'
DB $27
ASC 't create'
BRK
:SC1 LDA #$02 ; Guess I return 2 for dir??
:EXIT PLY :EXIT PLY
PLX PLX
RTS RTS
ERRNOTFND BRK
DB $D6 ; $D6 = Object not found
ASC 'File not found'
BRK
ERREXISTS BRK
DB $C4 ; Can't create a dir if a file is
ASC 'File exists' ; already there
BRK
CBPTR DW $0000 CBPTR DW $0000
OSFILEM ASC 'OSFILE($' OSFILEM ASC 'OSFILE($'
DB $00 DB $00
OSFILEM2 ASC ')' OSFILEM2 ASC ')'
DB $00 DB $00
OSFSCM ASC 'OSFSC.'
DB $00
* OSFSC - miscellanous file system calls * OSFSC - miscellanous file system calls
***************************************** *****************************************
@@ -355,6 +361,8 @@ OSFILEM2 ASC ')'
* On exit, A=preserved if unimplemented * On exit, A=preserved if unimplemented
* A=modified if implemented * A=modified if implemented
* X,Y=any return values * X,Y=any return values
*
* TO DO: use jump table
FSCHND CMP #$00 FSCHND CMP #$00
BEQ FSOPT ; A=0 - *OPT BEQ FSOPT ; A=0 - *OPT
CMP #$01 CMP #$01
@@ -372,7 +380,7 @@ FSCHND CMP #$00
CMP #$0C CMP #$0C
BEQ FSCREN ; A=12 - *RENAME BEQ FSCREN ; A=12 - *RENAME
PHA FSCUKN PHA
LDA #<OSFSCM LDA #<OSFSCM
LDY #>OSFSCM LDY #>OSFSCM
JSR PRSTR JSR PRSTR
@@ -391,16 +399,15 @@ FSCRUN STX OSFILECB ; Pointer to filename
RTS RTS
:CALL JMP (OSFILECB+6) ; Jump to EXEC addr :CALL JMP (OSFILECB+6) ; Jump to EXEC addr
RTS RTS
FSCREN JSR XYtoLPTR ; Pointer to command line FSCREN JSR XYtoLPTR ; Pointer to command line
JSR RENAME JSR RENAME
RTS RTS
OSFSCM ASC 'OSFSC.'
DB $00
* Performs OSFSC *OPT function * Performs OSFSC *OPT function
FSOPT RTS ; No FS options for now FSOPT RTS ; No FS options for now
* Performs OSBYTE $7F EOF function * Performs OSFSC Read EOF function
* File ref number is in X * File ref number is in X
CHKEOF >>> WRTMAIN CHKEOF >>> WRTMAIN
STX MOSFILE ; File reference number STX MOSFILE ; File reference number
@@ -416,7 +423,8 @@ CHKEOFRET
FSCCAT >>> XF2MAIN,CATALOG FSCCAT >>> XF2MAIN,CATALOG
STARCATRET STARCATRET
>>> ENTAUX >>> ENTAUX
JMP OSNEWL JSR OSNEWL
LDA #0 ; 0=OK
RTS RTS
* Print one block of a catalog. Called by CATALOG * Print one block of a catalog. Called by CATALOG
@@ -536,18 +544,11 @@ RENRET
CMP #$00 CMP #$00
BNE :OTHER ; All other errors BNE :OTHER ; All other errors
RTS RTS
:NOTFND BRK :NOTFND JMP ERRNOTFND
DB $D6 :EXISTS JMP ERREXISTS
ASC 'Not found'
BRK
:EXISTS BRK
DB $C4
ASC 'Exists'
BRK
:LOCKED BRK :LOCKED BRK
DB $C3 DB $C3
ASC 'Locked' ASC 'Locked'
BRK
:OTHER BRK :OTHER BRK
DB $C7 DB $C7
ASC 'Disc error' ASC 'Disc error'

View File

@@ -109,7 +109,7 @@ MOSINIT LDX #$FF ; Initialize Alt SP to $1FF
:S8 STA $C00D ; 80 col on :S8 STA $C00D ; 80 col on
STA $C003 ; Alt charset off STA $C003 ; Alt charset off
STA $C055 ; PAGE2 STA $C055 ; PAGE2
JMP MOSHIGH ; Ensure running in high mem JMP MOSHIGH ; Ensure executing in high memory here
MOSHIGH SEI MOSHIGH SEI
LDX #$FF LDX #$FF
@@ -128,17 +128,25 @@ MOSHIGH SEI
DEX DEX
BPL :INITPG2 BPL :INITPG2
JSR KBDINIT JSR KBDINIT ; Returns A=startup MODE
JSR VDUINIT ; Initialise VDU driver JSR VDUINIT ; Initialise VDU driver
JSR PRHELLO
LDA #<:HELLO LDA #7
LDY #>:HELLO JSR OSWRCH
JSR PRSTR JSR OSNEWL
CLC CLC
JMP BYTE8E ; Enter language ROM JMP BYTE8E
:HELLO DB $07 PRHELLO LDA #<HELLO
ASC 'Applecorn MOS v0.01' LDY #>HELLO
DB $0D,$0D,$00 JSR PRSTR
JMP OSNEWL
BYTE00XX BEQ BYTE00A ; OSBYTE 0,0 - generate error
LDX #$0A ; $00 = identify Host
RTS ; %000x1xxx host type, 'A'pple
BYTE00A BRK
DB $F7
HELLO ASC 'Applecorn MOS v0.01'
DB $00 ; Unify MOS messages

View File

@@ -2,6 +2,8 @@
* (c) Bobbi 2021 GPLv3 * (c) Bobbi 2021 GPLv3
* *
* Misc functions and API entry block * Misc functions and API entry block
* TO DO: Write GSINIT/GSREAD
* OSBYTE $80 - ADVAL * OSBYTE $80 - ADVAL
************************************ ************************************
@@ -50,18 +52,18 @@ ADVALBUF INX
* (------------- - 10 ) / 5 * (------------- - 10 ) / 5
* (8 * frequency ) * (8 * frequency )
* BEEPX EQU 57 ; note=C5 * BEEPX EQU #57 ; note=C5
BEEPX EQU 116 ; note=C4 BEEPX EQU #116 ; note=C4
BEEP PHA BEEP PHA
PHX PHX
PHY PHY
LDY #$00 ; duration LDY #$00 ; duration
:L1 LDX #BEEPX ; 2cy pitch 2cy :L1 LDX #BEEPX ; 2cy pitch 2cy
*------------------------------------------------ *------------------------------------------------------
:L2 DEX ; 2cy BEEPX * 2cy :L2 DEX ; 2cy BEEPX * 2cy
BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy
*------------------------------------------------ *------------------------------------------------------
* BEEPX*5-1cy * BEEPX*5-1cy
LDA $C030 ; 4cy BEEPX*5+5 LDA $C030 ; 4cy BEEPX*5+5
DEY ; 2cy BEEPX*5+7 DEY ; 2cy BEEPX*5+7
BNE :L1 ; 3cy/2cy BEEPX*5+10 BNE :L1 ; 3cy/2cy BEEPX*5+10
@@ -70,29 +72,29 @@ BEEP PHA
PLA PLA
RTS RTS
* Delay approx 1/100 sec ** Delay approx 1/100 sec
************************ *************************
* Enter at DELAY with CS to test keyboard ** Enter at DELAY with CS to test keyboard
* Enter at CENTI to ignore keyboard ** Enter at CENTI to ignore keyboard
* **
CENTI CLC ; Don't test keyboard *CENTI CLC ; Don't test keyboard
DELAY PHX ; 3cy *DELAY PHX ; 3cy
PHY ; 3cy * PHY ; 3cy
LDY #10 ; 2cy 10 * 1/1000s * LDY #10 ; 2cy 10 * 1/1000s
*------------------------------------------------ **------------------------------------------------
:L1 LDX #$48 ; 2cy $48 gives about 1/1000s *:L1 LDX #$48 ; 2cy $48 gives about 1/1000s
:L2 BCC :L3 ; 2cy/3cy Don't test kbd *:L2 BCC :L3 ; 2cy/3cy Don't test kbd
LDA $C000 ; 4cy * LDA $C000 ; 4cy
BMI :L5 ; 2cy keypress, exit early * BMI :L5 ; 2cy keypress, exit early
:L3 DEX ; 2cy *:L3 DEX ; 2cy
BNE :L2 ; 3cy/2cy -> 72*(2+2+4+2+2+3)-1 * BNE :L2 ; 3cy/2cy -> 72*(2+2+4+2+2+3)-1
* ; = 1079 -> 0.00105s ** ; = 1079 -> 0.00105s
*------------------------------------------------ **------------------------------------------------
:L4 DEY ; 2cy *:L4 DEY ; 2cy
BNE :L1 ; 3cy/2cy * BNE :L1 ; 3cy/2cy
:L5 PLY ; 4cy *:L5 PLY ; 4cy
PLX ; 4cy * PLX ; 4cy
RTS ; 6cy * RTS ; 6cy
* Print string pointed to by X,Y to the screen * Print string pointed to by X,Y to the screen
OUTSTR TXA OUTSTR TXA
@@ -124,8 +126,6 @@ OUTHEX PHA
JSR PRNIB JSR PRNIB
PLA PLA
AND #$0F ; Continue into PRNIB AND #$0F ; Continue into PRNIB
* JSR PRNIB
* RTS
* Print hex nibble in A * Print hex nibble in A
PRNIB CMP #$0A PRNIB CMP #$0A
@@ -142,9 +142,13 @@ PRNIB CMP #$0A
* Interrupt Handlers, MOS redirection vectors etc. * Interrupt Handlers, MOS redirection vectors etc.
********************************************************** **********************************************************
* Invoked from GSBRK in main memory. On IIgs only.
GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI
* Continue into IRQBRKHDLR
* TO DO: Check, IENTAUX modifies X
* IRQ/BRK handler * IRQ/BRK handler
IRQBRKHDLR IRQBRKHDLR PHA
PHA
* Mustn't enable IRQs within the IRQ handler * Mustn't enable IRQs within the IRQ handler
* Do not use WRTMAIN/WRTAUX macros * Do not use WRTMAIN/WRTAUX macros
STA $C004 ; Write to main memory STA $C004 ; Write to main memory
@@ -179,10 +183,6 @@ IRQBRKRET
PLA PLA
NULLRTI RTI NULLRTI RTI
* Invoked from GSBRK in main memory. On IIgs only.
GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI
JMP IRQBRKHDLR
PRERR LDY #$01 PRERR LDY #$01
PRERRLP LDA (FAULT),Y PRERRLP LDA (FAULT),Y
BEQ PRERR1 BEQ PRERR1
@@ -313,3 +313,5 @@ MOSVEND
* Buffer for one 512 byte disk block in aux mem * Buffer for one 512 byte disk block in aux mem
AUXBLK DS $200 AUXBLK DS $200

View File

@@ -1,9 +1,11 @@
* AUXMEM.MOSEQU.S * AUXMEM.MOSEQU.S
* (c) Bobbi 2021 GPLv3 * (c) Bobbi 2021 GPLv3
* *
* Constant definitions for AppleMOS
* BBC MOS WORKSPACE LOCATIONS *******************************
* BBC MOS WORKSPACE LOCATIONS *
*******************************
* $00-$8F Language workspace * $00-$8F Language workspace
* $90-$9F Network workspace * $90-$9F Network workspace
* $A0-$A7 NMI workspace * $A0-$A7 NMI workspace
@@ -31,7 +33,7 @@ OSXREG EQU OSAREG+1 ; $F0 X register
OSYREG EQU OSXREG+1 ; $F1 Y register OSYREG EQU OSXREG+1 ; $F1 Y register
OSCTRL EQU OSXREG ; $F0 (XY)=>control block OSCTRL EQU OSXREG ; $F0 (XY)=>control block
OSLPTR EQU $F2 ; $F2 => command line OSLPTR EQU $F2 ; $F2 => command line
; *
OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off
OSINTA EQU $FC ; $FC IRQ register A store OSINTA EQU $FC ; $FC IRQ register A store
FAULT EQU $FD ; $FD Error message pointer FAULT EQU $FD ; $FD Error message pointer
@@ -39,7 +41,7 @@ ESCFLAG EQU $FF ; $FF Escape status
* $0200-$0235 Vectors * $0200-$0235 Vectors
* $0236-$028F OSBYTE variable * $0236-$028F OSBYTE variables
* $0290-$02ED * $0290-$02ED
* $02EE-$02FF MOS control block * $02EE-$02FF MOS control block
@@ -60,3 +62,5 @@ FSCV EQU $21E ; FSCV misc file ops
OSFILECB EQU $2EE ; OSFILE control block OSFILECB EQU $2EE ; OSFILE control block

View File

@@ -10,6 +10,7 @@
* COMMAND TABLE * COMMAND TABLE
*************** ***************
* Table structure is: { string, byte OR $80, destword-1 } $00
* fsc commands * fsc commands
CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' CMDTABLE ASC 'CAT' ; Must be first command so matches '*.'
DB $85 DB $85
@@ -52,6 +53,8 @@ CMDTABLE ASC 'CAT' ; Must be first command so matches '*.'
ASC 'DRIVE' ASC 'DRIVE'
DB $C1 DB $C1
DW STARDRIVE-1 ; Should be a FSC call, XY=>params DW STARDRIVE-1 ; Should be a FSC call, XY=>params
* ACCESS <file> <access>
* TITLE (<drive>) <title>
* osbyte commands * osbyte commands
ASC 'FX' ASC 'FX'
DB $80 DB $80
@@ -168,10 +171,8 @@ STARFSC2 PHA
PLA PLA
STARFSC AND #$7F ; A=command, XY=>parameters STARFSC AND #$7F ; A=command, XY=>parameters
JSR CALLFSCV ; Hand on to filing system JSR CALLFSCV ; Hand on to filing system
* TO DO: hostfs.s needs to return A=0
TAX TAX
BEQ CLIDONE BEQ CLIDONE ; A=0, FSC call implemented
RTS ; *TEMP*
ERRBADCMD BRK ERRBADCMD BRK
DB $FE DB $FE
ASC 'Bad command' ASC 'Bad command'
@@ -183,7 +184,8 @@ ERRBADADD BRK
ASC 'Bad address' ASC 'Bad address'
BRK BRK
CALLFSCV JMP (FSCV) ; Hand on to filing system * CALLFSCV JMP (FSCV) ; Hand on to filing system
* Moved to BYTWRD
* *FX num(,num(,num)) * *FX num(,num(,num))
@@ -293,10 +295,10 @@ SKIPCOMMA LDA (OSLPTR),Y
BNE SKIPSPC BNE SKIPSPC
* *
* Skip spaces * Skip spaces
SKIPSPCLP INY ; Step past space or comma SKIPSPC1 INY ; Step past a character
SKIPSPC LDA (OSLPTR),Y SKIPSPC LDA (OSLPTR),Y
CMP #' ' CMP #' '
BEQ SKIPSPCLP BEQ SKIPSPC1
CMP #$0D ; Return EQ=<cr> CMP #$0D ; Return EQ=<cr>
RTS RTS
@@ -319,20 +321,21 @@ XYtoLPTR STX OSLPTR+0
* Print *HELP text * Print *HELP text
* These needs tidying a bit * These needs tidying a bit
STARHELP PHY STARHELP PHY
LDA #<HELPMSG JSR PRHELLO ; Unifiy version message
LDY #>HELPMSG * LDA #<:MSG
JSR PRSTR * LDY #>:MSG
* JSR PRSTR
PLY PLY
PHY PHY
LDA (OSLPTR),Y LDA (OSLPTR),Y
CMP #'.' CMP #'.' ; *HELP .
BEQ STARHELP1 BEQ STARHELP1
INY INY
EOR (OSLPTR),Y EOR (OSLPTR),Y
INY INY
EOR (OSLPTR),Y EOR (OSLPTR),Y
AND #$DF AND #$DF
CMP #$51 CMP #$51 ; *HELP MOS
BNE STARHELP5 BNE STARHELP5
STARHELP1 LDX #0 STARHELP1 LDX #0
LDA #32 LDA #32
@@ -360,18 +363,19 @@ STARHELP5 LDA $8006
BMI STARHELP6 ; Use ROM's service entry BMI STARHELP6 ; Use ROM's service entry
JSR OSNEWL JSR OSNEWL
LDA #$09 ; Language name LDA #$09 ; Language name
LDY #$80 LDY #$80 ; *TO DO* make this and BYTE8E
JSR PRSTR JSR PRSTR ; use same code
LDA #<HELPMSG2 JSR OSNEWL
LDY #>HELPMSG2 * LDA #<:MSG2
JSR PRSTR * LDY #>:MSG2
* JSR PRSTR
STARHELP6 PLY STARHELP6 PLY
LDA #9 LDA #9
JMP SERVICE ; Pass to sideways ROM(s) JMP SERVICE ; Pass to sideways ROM(s)
HELPMSG DB $0D *:MSG DB $0D
ASC 'Applecorn MOS v0.01' * ASC 'Applecorn MOS v0.01'
DB $0D,$00 * DB $0D,$00
HELPMSG2 DB $0D,$00 *:MSG2 DB $0D,$00
* Handle *QUIT command * Handle *QUIT command
STARQUIT >>> XF2MAIN,QUIT STARQUIT >>> XF2MAIN,QUIT
@@ -394,7 +398,7 @@ STARLDSV0
CMP OSTEMP CMP OSTEMP
BNE STARLDSV0 ; Step past filename BNE STARLDSV0 ; Step past filename
* ^^^^ * ^^^^
JSR SKIPSPCLP ; Skip following spaces JSR SKIPSPC1 ; Skip following spaces
BNE STARLDSV3 ; *load/save name addr BNE STARLDSV3 ; *load/save name addr
STARLDSV1 LDA #$FF ; $FF=load to file's address STARLDSV1 LDA #$FF ; $FF=load to file's address
STARLOAD2 STARLOAD2
@@ -427,7 +431,7 @@ STARSAVE4
CMP #'+' CMP #'+'
PHP PHP
BNE STARSAVE5 ; Not start+length BNE STARSAVE5 ; Not start+length
JSR SKIPSPCLP ; Step past '+' and spaces JSR SKIPSPC1 ; Step past '+' and spaces
STARSAVE5 STARSAVE5
LDX #OSFILECB+14-$200 LDX #OSFILECB+14-$200
JSR SCANHEX ; Get end or length JSR SCANHEX ; Get end or length
@@ -472,7 +476,10 @@ STARFILE EOR #$80
STY OSFILECB+1 STY OSFILECB+1
LDX #<OSFILECB LDX #<OSFILECB
LDY #>OSFILECB LDY #>OSFILECB
JMP OSFILE JSR OSFILE
TAX
BNE STARDONE
JMP ERRNOTFND
STARCHDIR STX ZP1+0 ; TEMP STARCHDIR STX ZP1+0 ; TEMP
STY ZP1+1 ; TEMP STY ZP1+1 ; TEMP
@@ -481,13 +488,8 @@ STARCHDIR STX ZP1+0 ; TEMP
STARDRIVE STARDRIVE
STARBASIC STARBASIC
STARKEY RTS STARKEY
STARDONE RTS
** Handle *CAT / *. command (list directory)
*STARCAT LDA #$05
* JMP JUMPFSCV ; Hand on to filing system
* Code that calls this will need to be replaced with calls * Code that calls this will need to be replaced with calls
@@ -515,3 +517,6 @@ EATSPC LDA (ZP1),Y ; Check first char is ...
:NOTFND SEC :NOTFND SEC
RTS RTS

View File

@@ -1,8 +1,7 @@
* VDU.S * AUXMEM.VDU.S
* (c) Bobbi 2021 GPLv3 * (c) Bobbi 2021 GPLv3
* *
* Apple //e VDU Driver for 40/80 column mode (PAGE2) * Apple //e VDU Driver for 40/80 column mode (PAGE2)
* *
* 15-Aug-2021 Optimised address calculations and PRCHRC. * 15-Aug-2021 Optimised address calculations and PRCHRC.
* Entry point to move copy cursor. * Entry point to move copy cursor.
@@ -21,7 +20,7 @@ VDUSTATUS EQU $D0 ; $D0 VDU status
VDUZP1 EQU VDUSTATUS+1 ; $D1 VDUZP1 EQU VDUSTATUS+1 ; $D1
* VDUTEXTX EQU VDUSTATUS+2 ; $D2 text column * VDUTEXTX EQU VDUSTATUS+2 ; $D2 text column
* VDUTEXTY EQU VDUSTATUS+3 ; $D3 text row * VDUTEXTY EQU VDUSTATUS+3 ; $D3 text row
VDUADDR EQU VDUSTATUS+4 ; $D4 addr of current char cell VDUADDR EQU VDUSTATUS+4 ; $D4 address of current char cell
FXVDUQLEN EQU $D1 ; TEMP HACK FXVDUQLEN EQU $D1 ; TEMP HACK
VDUCHAR EQU $D6 ; TEMP HACK VDUCHAR EQU $D6 ; TEMP HACK
@@ -68,7 +67,7 @@ COPYMOVE2 PLA
ORA #8 ORA #8
COPYMOVE3 JMP OUTCHARGO ; Move edit cursor COPYMOVE3 JMP OUTCHARGO ; Move edit cursor
* Turn editing cursor on/off ** Turn editing cursor on/off
*COPYCURSOR BIT VDUSTATUS *COPYCURSOR BIT VDUSTATUS
* BVC COPYSWAP4 ; Copy cursor not active * BVC COPYSWAP4 ; Copy cursor not active
* PHP ; Save CS=Turn On, CC=Turn Off * PHP ; Save CS=Turn On, CC=Turn Off
@@ -80,11 +79,11 @@ COPYMOVE3 JMP OUTCHARGO ; Move edit cursor
* STA COPYCHAR * STA COPYCHAR
* LDA #$A0 ; Output edit cursor * LDA #$A0 ; Output edit cursor
*COPYCURS2 JSR PUTCHRC *COPYCURS2 JSR PUTCHRC
* ; Drop through to swap back ** ; Drop through to swap back
* Swap between edit and copy cursors * Swap between edit and copy cursors
;COPYSWAP BIT VDUSTATUS *COPYSWAP BIT VDUSTATUS
; BVC COPYSWAP4 ; Edit cursor off * BVC COPYSWAP4 ; Edit cursor off
COPYSWAP1 CLC ; CC=Swap TEXT and COPY COPYSWAP1 CLC ; CC=Swap TEXT and COPY
COPYSWAP2 LDX #1 COPYSWAP2 LDX #1
COPYSWAPLP LDY VDUCOPYX,X COPYSWAPLP LDY VDUCOPYX,X
@@ -208,14 +207,14 @@ PRCHR6 STA (VDUADDR),Y ; Store it
RTS RTS
* PHA * PHA
* LDA $C000 ; Kbd data/strobe * LDA $C000 ; Kbd data/strobe
* BMI :KEYHIT * BMI :KEYHIT
* :RESUME LDA ROW * :RESUME LDA ROW
* ASL * ASL
* TAX * TAX
* LDA SCNTAB,X ; LSB of row address * LDA SCNTAB,X ; LSB of row address
* STA ZP1 * STA ZP1
* LDA SCNTAB+1,X ; MSB of row address * LDA SCNTAB+1,X ; MSB of row address
* STA ZP1+1 * STA ZP1+1
* LDA COL * LDA COL
* BIT $C01F * BIT $C01F
@@ -285,11 +284,11 @@ GETCHROK RTS
* BPL :S1A ; 40-col * BPL :S1A ; 40-col
* LSR * LSR
* BCC :S1 * BCC :S1
*:S1A STA $C002 ; Read main memory *:S1A STA $C002 ; Read main memory
*:S1 TAY *:S1 TAY
* LDA (ZP1),Y * LDA (ZP1),Y
* EOR #$80 * EOR #$80
* STA $C003 ; Read aux mem again * STA $C003 ; Read aux mem again
* TAX * TAX
* LDY #$00 * LDY #$00
* BIT $C01F * BIT $C01F
@@ -395,14 +394,14 @@ OUTCHARGO CMP #$00 ; NULL
BEQ :TOSCROLL ; JGH BEQ :TOSCROLL ; JGH
INC ROW INC ROW
:IDONE RTS :IDONE RTS
; BRA :DONE * BRA :DONE
:TOSCROLL JMP SCROLL ; JGH :TOSCROLL JMP SCROLL ; JGH
:T5 CMP #$0B ; Cursor up :T5 CMP #$0B ; Cursor up
BNE :T6 BNE :T6
LDA ROW LDA ROW
BEQ :IDONE BEQ :IDONE
DEC ROW DEC ROW
; BRA :IDONE * BRA :IDONE
RTS RTS
:T6 CMP #$0D ; Carriage return :T6 CMP #$0D ; Carriage return
BNE :T7 BNE :T7
@@ -410,7 +409,7 @@ OUTCHARGO CMP #$00 ; NULL
AND VDUSTATUS AND VDUSTATUS
STA VDUSTATUS ; Turn copy cursor off STA VDUSTATUS ; Turn copy cursor off
STZ COL STZ COL
; BRA :IDONE * BRA :IDONE
RTS RTS
:T7 CMP #$0C ; Ctrl-L :T7 CMP #$0C ; Ctrl-L
BEQ :T7A BEQ :T7A
@@ -423,13 +422,13 @@ OUTCHARGO CMP #$00 ; NULL
TAX TAX
STA $C00C,X STA $C00C,X
:T7A JSR CLEAR :T7A JSR CLEAR
* BRA :IDONE * BRA :IDONE
RTS RTS
:T8 CMP #$1E ; Home :T8 CMP #$1E ; Home
BNE :T9 BNE :T9
STZ ROW STZ ROW
STZ COL STZ COL
* BRA :IDONE * BRA :IDONE
RTS RTS
:T9 :T9
CMP #$1F ; TAB CMP #$1F ; TAB
@@ -450,7 +449,7 @@ OUTCHARGO CMP #$00 ; NULL
:T9B CMP #$7F ; Delete :T9B CMP #$7F ; Delete
BNE :T10 BNE :T10
JSR DELETE JSR DELETE
; BRA :IDONE * BRA :IDONE
RTS RTS
:T10 CMP #$20 :T10 CMP #$20
BCC :IDONE BCC :IDONE
@@ -478,13 +477,13 @@ VDU09 LDA COL
BEQ SCROLL BEQ SCROLL
INC ROW INC ROW
:DONE RTS :DONE RTS
; BRA :DONE * BRA :DONE
:S2 INC COL :S2 INC COL
BRA :DONE BRA :DONE
SCROLL JSR SCROLLER SCROLL JSR SCROLLER
* STZ COL * STZ COL
JSR CLREOL JSR CLREOL
;:DONE *:DONE
RTS RTS
* Scroll whole screen one line * Scroll whole screen one line
@@ -535,3 +534,5 @@ SCNTAB DW $800,$880,$900,$980,$A00,$A80,$B00,$B80
DW $828,$8A8,$928,$9A8,$A28,$AA8,$B28,$BA8 DW $828,$8A8,$928,$9A8,$A28,$AA8,$B28,$BA8
DW $850,$8D0,$950,$9D0,$A50,$AD0,$B50,$BD0 DW $850,$8D0,$950,$9D0,$A50,$AD0,$B50,$BD0

View File

@@ -111,3 +111,5 @@ START JSR ROMMENU
CANTOPEN ASC "Unable to open ROM file" CANTOPEN ASC "Unable to open ROM file"
DB $00 DB $00

View File

@@ -119,3 +119,5 @@ MSG8 ASC " 8. USERROM2.ROM"
DB $00 DB $00
ROM8 STR "USERROM2.ROM" ROM8 STR "USERROM2.ROM"

View File

@@ -5,6 +5,9 @@
* This code is mostly glue between the BBC Micro code * This code is mostly glue between the BBC Micro code
* which runs in aux mem and Apple II ProDOS. * which runs in aux mem and Apple II ProDOS.
* 24-Aug-2021 AUXTYPE set from load address
* ProDOS MLI command numbers * ProDOS MLI command numbers
QUITCMD EQU $65 QUITCMD EQU $65
GTIMECMD EQU $82 GTIMECMD EQU $82
@@ -198,6 +201,7 @@ MAKEDIR >>> ENTMAIN
LDA $BF93 LDA $BF93
STA CREATEPL+11 STA CREATEPL+11
JSR CRTFILE JSR CRTFILE
LDA #$02
:EXIT >>> XF2AUX,OSFILERET :EXIT >>> XF2AUX,OSFILERET
* ProDOS file handling to rename a file * ProDOS file handling to rename a file
@@ -454,6 +458,7 @@ TELL >>> ENTMAIN
* Return A=0 if successful * Return A=0 if successful
* A=1 if file not found * A=1 if file not found
* A=2 if read error * A=2 if read error
* TO DO: change to $01, $80, some other $80+n
LOADFILE >>> ENTMAIN LOADFILE >>> ENTMAIN
STZ :BLOCKS STZ :BLOCKS
LDA #<MOSFILE LDA #<MOSFILE
@@ -546,6 +551,7 @@ COPYFB PHA
* Return A=0 if successful * Return A=0 if successful
* A=1 if unable to create/open * A=1 if unable to create/open
* A=2 if error during save * A=2 if error during save
* TO DO: change to $01, $80, some other $80+n
SAVEFILE >>> ENTMAIN SAVEFILE >>> ENTMAIN
LDA #<MOSFILE ; Attempt to destroy file LDA #<MOSFILE ; Attempt to destroy file
STA DESTPL+1 STA DESTPL+1
@@ -565,9 +571,9 @@ SAVEFILE >>> ENTMAIN
STA CREATEPL+3 STA CREATEPL+3
LDA #$06 ; Filetype BIN LDA #$06 ; Filetype BIN
STA CREATEPL+4 STA CREATEPL+4
LDA FBSTRT ; Auxtype = start address LDA FBLOAD ; Auxtype = load address
STA CREATEPL+5 STA CREATEPL+5
LDA FBSTRT+1 LDA FBLOAD+1
STA CREATEPL+6 STA CREATEPL+6
LDA #$01 ; Storage type - file LDA #$01 ; Storage type - file
STA CREATEPL+7 STA CREATEPL+7
@@ -713,6 +719,24 @@ UPDFB LDA #<MOSFILE
STZ FBLOAD+3 STZ FBLOAD+3
STZ FBEXEC+2 STZ FBEXEC+2
STZ FBEXEC+3 STZ FBEXEC+3
LDA GINFOPL+3 ; Access byte
CMP #$40 ; Locked?
AND #$03 ; ------wr
PHP
STA FBEND+0
ASL A ; -----wr-
ASL A ; ----wr--
ASL A ; ---wr---
ASL A ; --wr----
PLP
BCS :UPDFB2
ORA #$08 ; --wrl---
:UPDFB2 ORA FBEND+0 ; --wrl-wr
STA FBEND+0
STZ FBEND+1 ; TO DO: get mdate
STZ FBEND+2
STZ FBEND+3
JSR OPENFILE ; Open file JSR OPENFILE ; Open file
BCS :ERR BCS :ERR
LDA OPENPL+5 ; File ref number LDA OPENPL+5 ; File ref number
@@ -727,12 +751,6 @@ UPDFB LDA #<MOSFILE
LDA GMARKPL+4 LDA GMARKPL+4
STA FBSTRT+2 STA FBSTRT+2
STZ FBSTRT+3 STZ FBSTRT+3
LDA #$33 ; 'W/R' attribs
STA FBEND+0
STZ FBEND+1
STZ FBEND+2
STZ FBEND+3
LDA #$33 ; W/R attributes
LDA OPENPL+5 ; File ref numbre LDA OPENPL+5 ; File ref numbre
STA CLSPL+1 STA CLSPL+1
JSR CLSFILE JSR CLSFILE
@@ -928,8 +946,12 @@ FBLOAD DW $0000 ; Load address
DW $0000 DW $0000
FBEXEC DW $0000 ; Exec address FBEXEC DW $0000 ; Exec address
DW $0000 DW $0000
FBSTRT DW $0000 ; Start address for SAVE FBSIZE
FBSTRT DW $0000 ; Size / Start address for SAVE
DW $0000 DW $0000
FBEND DW $0000 ; End address for SAVE FBATTR
FBEND DW $0000 ; Attributes / End address for SAVE
DW $0000 DW $0000