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.MISC

View File

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

View File

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

View File

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

View File

@ -109,7 +109,7 @@ MOSINIT LDX #$FF ; Initialize Alt SP to $1FF
:S8 STA $C00D ; 80 col on
STA $C003 ; Alt charset off
STA $C055 ; PAGE2
JMP MOSHIGH ; Ensure running in high mem
JMP MOSHIGH ; Ensure executing in high memory here
MOSHIGH SEI
LDX #$FF
@ -128,17 +128,25 @@ MOSHIGH SEI
DEX
BPL :INITPG2
JSR KBDINIT
JSR KBDINIT ; Returns A=startup MODE
JSR VDUINIT ; Initialise VDU driver
LDA #<:HELLO
LDY #>:HELLO
JSR PRSTR
JSR PRHELLO
LDA #7
JSR OSWRCH
JSR OSNEWL
CLC
JMP BYTE8E ; Enter language ROM
JMP BYTE8E
:HELLO DB $07
ASC 'Applecorn MOS v0.01'
DB $0D,$0D,$00
PRHELLO LDA #<HELLO
LDY #>HELLO
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
*
* Misc functions and API entry block
* TO DO: Write GSINIT/GSREAD
* OSBYTE $80 - ADVAL
************************************
@ -50,18 +52,18 @@ ADVALBUF INX
* (------------- - 10 ) / 5
* (8 * frequency )
* BEEPX EQU 57 ; note=C5
BEEPX EQU 116 ; note=C4
* BEEPX EQU #57 ; note=C5
BEEPX EQU #116 ; note=C4
BEEP PHA
PHX
PHY
LDY #$00 ; duration
:L1 LDX #BEEPX ; 2cy pitch 2cy
*------------------------------------------------
*------------------------------------------------------
:L2 DEX ; 2cy BEEPX * 2cy
BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy
*------------------------------------------------
* BEEPX*5-1cy
*------------------------------------------------------
* BEEPX*5-1cy
LDA $C030 ; 4cy BEEPX*5+5
DEY ; 2cy BEEPX*5+7
BNE :L1 ; 3cy/2cy BEEPX*5+10
@ -70,29 +72,29 @@ BEEP PHA
PLA
RTS
* Delay approx 1/100 sec
************************
* Enter at DELAY with CS to test keyboard
* Enter at CENTI to ignore keyboard
*
CENTI CLC ; Don't test keyboard
DELAY PHX ; 3cy
PHY ; 3cy
LDY #10 ; 2cy 10 * 1/1000s
*------------------------------------------------
:L1 LDX #$48 ; 2cy $48 gives about 1/1000s
:L2 BCC :L3 ; 2cy/3cy Don't test kbd
LDA $C000 ; 4cy
BMI :L5 ; 2cy keypress, exit early
:L3 DEX ; 2cy
BNE :L2 ; 3cy/2cy -> 72*(2+2+4+2+2+3)-1
* ; = 1079 -> 0.00105s
*------------------------------------------------
:L4 DEY ; 2cy
BNE :L1 ; 3cy/2cy
:L5 PLY ; 4cy
PLX ; 4cy
RTS ; 6cy
** Delay approx 1/100 sec
*************************
** Enter at DELAY with CS to test keyboard
** Enter at CENTI to ignore keyboard
**
*CENTI CLC ; Don't test keyboard
*DELAY PHX ; 3cy
* PHY ; 3cy
* LDY #10 ; 2cy 10 * 1/1000s
**------------------------------------------------
*:L1 LDX #$48 ; 2cy $48 gives about 1/1000s
*:L2 BCC :L3 ; 2cy/3cy Don't test kbd
* LDA $C000 ; 4cy
* BMI :L5 ; 2cy keypress, exit early
*:L3 DEX ; 2cy
* BNE :L2 ; 3cy/2cy -> 72*(2+2+4+2+2+3)-1
** ; = 1079 -> 0.00105s
**------------------------------------------------
*:L4 DEY ; 2cy
* BNE :L1 ; 3cy/2cy
*:L5 PLY ; 4cy
* PLX ; 4cy
* RTS ; 6cy
* Print string pointed to by X,Y to the screen
OUTSTR TXA
@ -124,8 +126,6 @@ OUTHEX PHA
JSR PRNIB
PLA
AND #$0F ; Continue into PRNIB
* JSR PRNIB
* RTS
* Print hex nibble in A
PRNIB CMP #$0A
@ -142,9 +142,13 @@ PRNIB CMP #$0A
* 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
IRQBRKHDLR
PHA
IRQBRKHDLR PHA
* Mustn't enable IRQs within the IRQ handler
* Do not use WRTMAIN/WRTAUX macros
STA $C004 ; Write to main memory
@ -179,10 +183,6 @@ IRQBRKRET
PLA
NULLRTI RTI
* Invoked from GSBRK in main memory. On IIgs only.
GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI
JMP IRQBRKHDLR
PRERR LDY #$01
PRERRLP LDA (FAULT),Y
BEQ PRERR1
@ -313,3 +313,5 @@ MOSVEND
* Buffer for one 512 byte disk block in aux mem
AUXBLK DS $200

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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