Boot ROM working

This commit is contained in:
dschmenk 2014-02-14 21:06:12 -08:00
parent 7335ff7576
commit 14b8ff2e11
5 changed files with 1198 additions and 50 deletions

542
client/BUILD/a2pi.s Executable file
View File

@ -0,0 +1,542 @@
PTR EQU $06
PTRL EQU $06
PTRH EQU $07
SPINIDX EQU $07
BASEL EQU $28
CSWL EQU $36
CSWH EQU $37
KSWL EQU $38
KSWH EQU $39
RNDL EQU $4E
RNDH EQU $4F
CEVL EQU $3CE
CEVH EQU $3CF
OUTVECT0 EQU $BE10
OUTVECT3 EQU $BE16
INVECT0 EQU $BE20
INVECT3 EQU $BE26
VECTOUT EQU $BE30
VECTIN EQU $BE32
WARMDOS EQU $BE00
TEXTSCRN EQU $0400
WAIT EQU $FCA8
BELL1 EQU $FBD9
COUT1 EQU $FDF0
KEYBD EQU $C000
KBCLR EQU $C010
ANYKEY EQU $C010
ORG $9600
CLD
LDA #$C1
STA PTRH
LDA #$00
STA PTRL
*
* SEARCH SLOTS FOR MOUSE CARDS
*
IDCARD LDY #$05
LDA (PTR),Y
CMP #$38 ; PASCAL ID BYTE
BNE NEXTCARD
LDY #$07
LDA (PTR),Y
CMP #$18
BNE NEXTCARD ; PASCAL ID BYTE
ISMOU LDY #$0C
LDA (PTR),Y
CMP #$20
BNE NEXTCARD
LDY #$FB
LDA (PTR),Y
CMP #$D6
BNE NEXTCARD
LDA PTRH
STA MOUROM
AND #$07
STA MOUINDEX
ASL
ASL
ASL
ASL
STA MOUSLOT
NEXTCARD INC PTRH
LDA PTRH
CMP #$C8
BNE IDCARD
*
* GET SERIAL PORT SLOT AT $300 (768)
*
LDA $300
STA SSCSLOT
BNE ENTRY
RTS ; NO A2PI SLOT, EXIT
*
* RESET ENTRYPOINT
*
ENTRY CLI
*
* INIT MOUSE
*
INITMOU LDX $FBC0
BNE INITMOU1 ; NOT //C
JSR $FB1E ; READ GAME CONTROLLER
CPY #$FF
BEQ INITMOU1 ; NO JOYSTICK CHECK MOUSE
STX MOUINDEX
STX MOUROM
INITMOU1 LDY MOUINDEX
BEQ INITSSC
LDY #$19 ; INIT MOUSE
JSR CALLMOU
LDY #$12 ; SET MOUSE
LDA #$01 ; TRANSPARENT MODE
JSR CALLMOU
LDA #$00
STA $478
STA $4F8
LDA #$C0
STA $578
LDA #$3F
STA $5F8
LDY #$17 ; CLAMP MOUSE
LDA #$00 ; X AXIS
JSR CALLMOU
LDY #$17 ; CLAMP MOUSE
LDA #$01 ; Y AXIS
JSR CALLMOU
*
* INIT SSC CARD FOR 115K BAUD
*
INITSSC LDY SSCSLOT
LDA #$0B
STA $C089,Y ; RESET ACIA
STA $C08A,Y
LDA #$10
STA $C08B,Y ; 115K
*
* SYNCHRONIZE WITH PI
*
SYNC TYA
ORA #$88+1
TAY
LDA #$80
STA $C000-1,Y ; AVOID PHANTOM READ OF $C0XX
INC SPINIDX
LDA SPINIDX
AND #$07
TAX
LDA SPINNER,X
STA TEXTSCRN
LDA #$FF
JSR WAIT
LDA KEYBD
BPL CHKACK
JMP EXIT
CHKACK LDY SSCSLOT
LDA $C089,Y
AND #$08
BEQ SYNC
LDA $C088,Y
CMP #$81
BNE SYNC
STY $301 ; TELL CALLING PROGRAM SYNC OK
LDA #$A0
STA TEXTSCRN
LDA #$87
JSR BELL1
LDA ANYKEY
STA KEYSTAT
*
* GET COUT/CIN VECTORS
*
JSR $C300
LDA CSWL
STA CHAINOUT+1
LDA CSWH
STA CHAINOUT+2
JSR HOOK
*
* SET VECTOR FOR CHKEVENT
*
; LDX #<CHKEVENT
; STX CEVL
; LDX #>CHKEVENT
; STX CEVH
*
* SET UP RESET VECTOR
*
LDA RESET+1
BNE ISRESET
LDA $3F2
STA RESET
LDA $3F3
STA RESET+1
LDA #<ENTRY
STA $3F2
LDA #>ENTRY
STA $3F3
EOR #$A5
STA $3F4
RTS
ISRESET LDX #$FF
TXS
JMP WARMDOS
*
* CHAR OUT HOOK - CHECK ONCE FOR A2PI EVENTS
*
COUTPI PHP
CLI
PHA
STX SAVEX
STY SAVEY
LDA #$98
JSR SENDACC
PLA
PHA
JSR SENDACC
JSR SENDACC
LDA CHRIN
BNE COUTNXT ; SKIP IF INPUT CHAR PENDING
LDA KEYBD
CMP #$83 ; SKIP CTRL-C
BEQ COUTNXT
CMP #$93 ; SKIP CTRL-S
BEQ COUTNXT
LDA #$01
STA WAITEV
JSR CHKEVENT ; CHECK ON EVENTS
BCC COUTNXT
STA CHRIN
COUTNXT PLA
LDY SAVEY
LDX SAVEX
PLP
STA SAVEY
CHAINOUT JSR COUT1
*
* SET INPUT/OUTPUT VECTORS
*
HOOK STX SAVEX
LDX #<COUTPI
STX CSWL
LDX #>COUTPI
STX CSWH
LDX #<CINPI
STX KSWL
LDX #>CINPI
STX KSWH
LDX SAVEX
RTS
*
* CHAR IN HOOK - EVENT LOOP FOR A2PI DAEMON
*
CINPI STA (BASEL),Y ; RESTORE CURSOR
LDA CHRIN
BNE CINPIEX
STX SAVEX
LDA #$5F ; PRINT _
JSR CHAINOUT
LDA #$88 ; BACKSAPCE
JSR CHAINOUT
PHP
CLI
EVENTLP INC RNDL ; UPDATE RND LIKE ANY PROPER RDKEY
BNE EVENTLP1
INC RNDH
EVENTLP1 JSR CHKEVENT
BCC EVENTLP
PLP ; HAVE CHAR FROM A2PI DAEMON
LDX SAVEX
CINPIEX LDY #$00
STY CHRIN
RTS
*
* SEND MODIFIER (OPEN & CLOSED APPLE) KEYS/PADDLE BUTTONS
*
SENDMOD LDA $C062
ASL
LDA $C061
ROR
AND #$C0 ; FALL THROUGH
*
* ACIA SEND BYTE IN ACCUMULATOR
*
SENDACC PHA
LDA SSCSLOT
ORA #$89+1
TAY
SENDWT LDA $C000-1,Y
AND #$10
BEQ SENDWT
PLA
STA $C000-2,Y ; AVOID PHANTOM READ FROM $C0XX
RTS
*
* ACIA RECEIVE BYTE IN ACCUMULATOR
*
RECVACC LDA SSCSLOT
ORA #$89+1
TAY
RECVWT LDA $C000-1,Y
AND #$08
BEQ RECVWT
LDA $C000-2,Y
RTS
*
* CHECK INPUT STATE FOR CHANGE
*
CHKEVENT LDA ANYKEY ; CHECK FOR KEY PRESS/RELEASE
CMP KEYSTAT
BNE SENDKEY
LDA SSCSLOT ; CHECK FOR INPUT TO ACIA
ORA #$89+1
TAY
LDA $C000-1,Y
AND #$08
BEQ CHKMOU
LDA $C000-2,Y
JMP HOSTREQ
CHKMOU DEC WAITEV ; CHECK FOR MOUSE UPDATE
BEQ UPDTMOU
EXEVENT CLC
RTS
*
* KEYBOARD EVENT
*
SENDKEY TAX
BPL SENDKBEV
LDA #$80 ; DEBOUNCE KEYPRESS
JSR WAIT
LDX ANYKEY
CPX #$FF
BNE SENDKBEV
LDA $C062
BPL SENDKBEV
LDA $C061
BPL SENDKBEV
UNHOOK JSR EXIT
LDA #$00
STA RESET
STA RESET+1
LDA #$0D
SEC
RTS
SENDKBEV STX KEYSTAT
LDA #$82 ; KBEVENT CODE
JSR SENDACC
JSR SENDMOD
TXA
CLC
JMP SENDACC
*
* MOUSE EVENTS
*
UPDTMOU LDY #$14 ; READ MOUSE
LDA #$80
JSR CALLMOU
BCC EXMOU
LDY MOUINDEX
LDA $478,Y
STA MOUXSTAT
LDA $4F8,Y
STA MOUYSTAT
LDA $778,Y
PHA
LDY #$15 ; CLEAR MOUSE
LDA #$80
JSR CALLMOU
LDA MOUXSTAT
ORA MOUYSTAT
BEQ CHKBTTN
LDA #$84 ; SEND MOUSE POSITION
JSR SENDACC
LDA MOUXSTAT
JSR SENDACC
LDA MOUYSTAT
JSR SENDACC
CHKBTTN LDY MOUINDEX
PLA
STA $778,Y ; GS CLEARS THIS IN CLEAR MOUSE CALL
AND #$80
CMP BTTNSTAT
BEQ EXMOU
SENDBTTN STA BTTNSTAT
LDA #$86
JSR SENDACC
JSR SENDMOD
LDA BTTNSTAT
JSR SENDACC
EXMOU CLC
RTS
*
* CALL MOUSE FIRMWARE
*
CALLMOU LDX MOUROM
BEQ EXMOU
PHA
LDA PTRL ; SAVE ZERO PAGE LOCATIONS
STA SAVEZP
LDA PTRH
STA SAVEZP+1
LDA #$00
STA PTRL
STX PTRH
LDA (PTR),Y
STA PTRL
PLA
LDX MOUROM
LDY MOUSLOT
PHP
SEI
JSR IJMP
PLP
LDA SAVEZP ; RESTORE ZERO PAGE LOCATIONS
STA PTRL
LDA SAVEZP+1
STA PTRH
SEC ; MOUSE PRESENT FLAG
RTS
*
* HOST REQUEST/RESPONSE HANDLING
*
RECVADDR JSR SENDACC ; ECHO REQUEST
JSR SENDACC ; DUMMY VALUE
JSR SENDACC ; DUMMY VALUE
JSR RECVACC
STA PTRL
TXA ; ACK
JSR SENDACC
JSR RECVACC
STA PTRH
TXA ; ACK
JMP SENDACC
RECVCNT JSR RECVACC
STA CNTL
TXA ; ACK
JSR SENDACC
JSR RECVACC
STA CNTH ; INC FOR LOOP CONTROL
INC CNTH
TXA ; ACK
JMP SENDACC
HOSTREQ LDX PTRL ; SAVE ZERO PAGE LOCATIONS
STX SAVEZP
LDX PTRH
STX SAVEZP+1
READREQ CMP #$90 ; READ BYTES
BNE WRITEREQ
LDX #$91
JSR RECVADDR
JSR RECVCNT
LDX #$00
READLP LDA (PTR,X)
JSR SENDACC
INC PTRL
BNE READDEC
INC PTRH
READDEC DEC CNTL
BNE READLP
DEC CNTH
BNE READLP
BEQ OKREQ
WRITEREQ CMP #$92 ; WRITE BYTES
BNE CALLREQ
SEI ; DISABLE INTERRUPTS
LDX #$93
JSR RECVADDR
JSR RECVCNT
LDX #$00
WRITELP JSR RECVACC
STA (PTR,X)
INC PTRL
BNE WRITEDEC
INC PTRH
WRITEDEC DEC CNTL
BNE WRITELP
DEC CNTH
BNE WRITELP
BEQ OKREQ
CALLREQ CMP #$94
BEQ CALLREQ1
CMP #$9A
BNE CINREQ
CALLREQ1 TAX
INX
JSR RECVADDR
JSR IJMP
OKREQ LDX #$9E ; REQ COMPLETE OK
SENDCOMP CLI ; ENABLE INTERRUPTS
PHP
PHA
TXA
JSR SENDACC
PLA
JSR SENDACC ; ACCUM VALUE
PLA
JSR SENDACC ; FLAGS VALUE
LDA SAVEZP ; RESTORE ZERO PAGE LOCATIONS
STA PTRL
LDA SAVEZP+1
STA PTRH
EXREQ CLC
RTS
CINREQ CMP #$96
BNE RESYNC
LDX #$97
JSR RECVADDR
LDA #$9E ; REQ COMPLETE OK
JSR SENDACC
LDA PTRL
LDX SAVEZP ; RESTORE ZERO PAGE LOCATIONS
STX PTRL
LDX SAVEZP+1
STX PTRH
JSR SENDACC ; ECHO VALUE
JSR SENDACC ; ECHO VALUE
SEC ; RETURN CHAR TO RDKEY
RTS
RESYNC CMP #$80 ; RESYNC WITH HOST
BNE BADREQ
JSR SENDACC ; ECHO
JSR RECVACC
CMP #$81
BEQ EXREQ
* JMP UNHOOK
BNE RESYNC
BADREQ LDX #$9F ; REQ BAD
BNE SENDCOMP
*
* CLEANUP
*
EXIT LDA KBCLR
JSR $C300
LDA RESET+1
BEQ EX1
STA $3F3
EOR #$A5
STA $3F4
LDA RESET
STA $3F2
EX1 LDY #$12 ; SET MOUSE
LDA #$00 ; DISABLE MOUSE
STA RESET
STA RESET+1
JMP CALLMOU
IJMP JMP (PTR)
MOUROM DB 0
MOUSLOT DB 0
SSCSLOT DB 0
MOUINDEX DB 0
MOUXSTAT DB 0
MOUYSTAT DB 0
BTTNSTAT DB 0
KEYSTAT DB 0
WAITEV DB 0
CNTL DB 0
CNTH DB 0
RESET DW 0
SAVEZP DW 0
SAVEX DB 0
SAVEY DB 0
CHRIN DB 0
SPINNER ASC "|\-/|\-/"

569
client/BUILD/a2pluspi.s Executable file
View File

@ -0,0 +1,569 @@
PTR EQU $06
PTRL EQU $06
PTRH EQU $07
SPINIDX EQU $07
BASEL EQU $28
CSWL EQU $36
CSWH EQU $37
KSWL EQU $38
KSWH EQU $39
RNDL EQU $4E
RNDH EQU $4F
CEVL EQU $3CE
CEVH EQU $3CF
OUTVECT0 EQU $BE10
OUTVECT3 EQU $BE16
INVECT0 EQU $BE20
INVECT3 EQU $BE26
VECTOUT EQU $BE30
VECTIN EQU $BE32
WARMDOS EQU $BE00
TEXTSCRN EQU $0400
WAIT EQU $FCA8
BELL1 EQU $FBD9
COUT1 EQU $FDF0
KEYIN EQU $FD1B
KEYBD EQU $C000
KBCLR EQU $C010
ANYKEY EQU $C010
ORG $9600
CLD
LDA #$C1
STA PTRH
LDA #$00
STA PTRL
*
* SEARCH SLOTS FOR MOUSE AND SUPERSERIAL CARDS
*
IDCARD LDY #$05
LDA (PTR),Y
CMP #$38 ; PASCAL ID BYTE
BNE NEXTCARD
LDY #$07
LDA (PTR),Y
CMP #$18
BNE NEXTCARD ; PASCAL ID BYTE
ISMOU LDY #$0C
LDA (PTR),Y
CMP #$20
BNE NEXTCARD
LDY #$FB
LDA (PTR),Y
CMP #$D6
BNE NEXTCARD
LDA PTRH
STA MOUROM
AND #$07
STA MOUINDEX
ASL
ASL
ASL
ASL
STA MOUSLOT
NEXTCARD INC PTRH
LDA PTRH
CMP #$C8
BNE IDCARD
*
* SET SERIAL PORT SLOT AT $300 (768)
*
LDA $300
STA SSCSLOT
BNE ENTRY
RTS ; NO A2PI SLOT, EXIT
*
* RESET ENTRYPOINT
*
ENTRY CLI
*
* INIT MOUSE
*
INITMOU LDY MOUINDEX
BEQ INITSSC
LDY #$19 ; INIT MOUSE
JSR CALLMOU
LDY #$12 ; SET MOUSE
LDA #$01 ; TRANSPARENT MODE
JSR CALLMOU
LDA #$00
STA $478
STA $4F8
LDA #$C0
STA $578
LDA #$3F
STA $5F8
LDY #$17 ; CLAMP MOUSE
LDA #$00 ; X AXIS
JSR CALLMOU
LDY #$17 ; CLAMP MOUSE
LDA #$01 ; Y AXIS
JSR CALLMOU
*
* INIT SSC CARD FOR 115K BAUD
*
INITSSC LDY SSCSLOT
LDA #$0B
STA $C089,Y ; RESET ACIA
STA $C08A,Y
LDA #$10
STA $C08B,Y ; 115K
*
* SYNCHRONIZE WITH PI
*
SYNC TYA
ORA #$88+1
TAY
LDA #$80
STA $C000-1,Y ; AVOID PHANTOM READ OF $C0XX
LDA #$FF
JSR WAIT
LDA KEYBD
BPL CHKACK
JMP EXIT
CHKACK LDY SSCSLOT
LDA $C089,Y
AND #$08
BEQ SYNC
LDA $C088,Y
CMP #$81
BNE SYNC
STY $301 ; LET CALLING PROGRAM KNOW SYNC OK
LDA #$87
JSR BELL1
JSR HOOK
*
* SET UP RESET VECTOR
*
LDA RESET+1
BNE ISRESET
LDA $3F2
STA RESET
LDA $3F3
STA RESET+1
LDA #<ENTRY
STA $3F2
LDA #>ENTRY
STA $3F3
EOR #$A5
STA $3F4
RTS
ISRESET LDX #$FF
TXS
JMP WARMDOS
*
* CHAR OUT HOOK - CHECK ONCE FOR A2PI EVENTS
*
COUTPI PHP
CLI
PHA
STX SAVEX
STY SAVEY
LDA #$98
JSR SENDACC
PLA
PHA
JSR SENDACC
JSR SENDACC
LDA CHRIN
BNE COUTNXT ; SKIP IF INPUT CHAR PENDING
LDA KEYBD
CMP #$83 ; SKIP CTRL-C
BEQ COUTNXT
CMP #$93 ; SKIP CTRL-S
BEQ COUTNXT
LDA #$01
STA WAITEV
JSR CHKEVENT ; CHECK ON EVENTS
BCC COUTNXT
STA CHRIN
COUTNXT PLA
LDY SAVEY
LDX SAVEX
PLP
STA SAVEY
CHAINOUT JSR COUT1
*
* SET INPUT/OUTPUT VECTORS
*
HOOK STX SAVEX
LDX #<COUTPI
STX CSWL
LDX #>COUTPI
STX CSWH
LDX #<CINPI
STX KSWL
LDX #>CINPI
STX KSWH
LDX SAVEX
RTS
*
* CHAR IN HOOK - EVENT LOOP FOR A2PI DAEMON
*
CINPI STA (BASEL),Y ; RESTORE CURSOR
LDA CHRIN
BNE CINPIEX
STX SAVEX
LDA #$5F ; PRINT _
JSR CHAINOUT
LDA #$88 ; BACKSAPCE
JSR CHAINOUT
PHP
CLI
EVENTLP INC RNDL ; UPDATE RND LIKE ANY PROPER RDKEY
BNE EVENTLP1
INC RNDH
EVENTLP1 JSR CHKEVENT
BCC EVENTLP
PLP ; HAVE CHAR FROM A2PI DAEMON
LDX SAVEX
CINPIEX LDY #$00
STY CHRIN
RTS
*
* SEND MODIFIER (OPEN & CLOSED APPLE) KEYS/PADDLE BUTTONS
*
SENDMOD LDA $C062
ASL
LDA $C061
ROR
AND #$C0 ; FALL THROUGH
*
* ACIA SEND BYTE IN ACCUMULATOR
*
SENDACC PHA
LDA SSCSLOT
ORA #$89+1
TAY
SENDWT LDA $C000-1,Y
AND #$10
BEQ SENDWT
PLA
STA $C000-2,Y ; AVOID PHANTOM READ FROM $C0XX
RTS
*
* ACIA RECEIVE BYTE IN ACCUMULATOR
*
RECVACC LDA SSCSLOT
ORA #$89+1
TAY
RECVWT LDA $C000-1,Y
AND #$08
BEQ RECVWT
LDA $C000-2,Y
RTS
*
* CHECK INPUT STATE FOR CHANGE
*
CHKEVENT LDA KEYBD ; CHECK FOR KEY PRESS
BMI SENDKEY
LDA SSCSLOT ; CHECK FOR INPUT TO ACIA
ORA #$89+1
TAY
LDA $C000-1,Y
AND #$08
BEQ CHKMOU
LDA $C000-2,Y
JMP HOSTREQ
CHKMOU DEC WAITEV ; CHECK FOR MOUSE UPDATE
BEQ UPDTMOU
EXEVENT CLC
RTS
*
* KEYBOARD EVENT
*
FROMKEY DB $DE ; ^ -> N
DB $C0 ; @ -> P
DB $DD ; ] -> M
DB $9E ; CTRL-^ -> ^
DB $80 ; CTRL-@ -> @
DB $88 ; <- -> RUB
DB $95 ; -> -> TAB
DB $B0 ; 0 -> _
DB $89 ; CTRL-I -> {
DB $8F ; CTRL-O -> }
DB $8C ; CTRL-L -> |
DB $8A ; CTRL-J -> [
DB $8B ; CTRL-K -> ]
DB $9D ; CTRL-[ -> \
DB $9A ; CTRL-Z -> ~
DB $98 ; CTRL-X -> `
DB $91 ; CTRL-Q -> NUL
TOKEY DB $CE ; N
DB $D0 ; P
DB $CD ; M
DB $DE ; ^
DB $C0 ; @
DB $FF ; RUB
DB $89 ; TAB
DB $DF ; _
DB $FB ; {
DB $FD ; }
DB $FC ; |
DB $DB ; [
DB $DD ; ]
DB $DC ; \
DB $FE ; ~
DB $E0 ; `
DB $80 ; NUL
SENDKEY STA KBCLR
LDY $C063
BMI TOLOWER
LDX #TOKEY-FROMKEY
CMP #$81 ; SHIFT+CTRL-A = CAPS LOCK
BNE ISESC
EOR CAPSLOCK
STA CAPSLOCK
EXKBEV CLC
RTS
ISESC CMP #$9B ; ESC KEY
BNE MAPKEY
JSR EXIT
LDA #$8D
SEC
RTS
MAPKEY CMP FROMKEY,X
BEQ SWAPKEY
DEX
BPL MAPKEY
BMI SENDKBEV
SWAPKEY LDA TOKEY,X
BNE SENDKBEV
TOLOWER LDY CAPSLOCK
BNE SENDKBEV
CMP #$C1 ; 'A'
BCC SENDKBEV
CMP #$DB ; 'Z'
BCS SENDKBEV
ADC #$20
SENDKBEV TAX
LDA #$82 ; KBEVENT CODE
JSR SENDACC
JSR SENDMOD
TXA ; KEY PRESSED
JSR SENDACC
LDA #$82 ; KBEVENT CODE
JSR SENDACC
JSR SENDMOD
TXA
AND #$7F ; KEY RELEASED
CLC
JMP SENDACC
*
* MOUSE EVENTS
*
UPDTMOU LDY #$14 ; READ MOUSE
LDA #$80
JSR CALLMOU
BCC EXMOU
LDY MOUINDEX
LDA $478,Y
STA MOUXSTAT
LDA $4F8,Y
STA MOUYSTAT
LDA $778,Y
PHA
LDY #$15 ; CLEAR MOUSE
LDA #$80
JSR CALLMOU
LDA MOUXSTAT
ORA MOUYSTAT
BEQ CHKBTTN
LDA #$84 ; SEND MOUSE POSITION
JSR SENDACC
LDA MOUXSTAT
JSR SENDACC
LDA MOUYSTAT
JSR SENDACC
CHKBTTN LDY MOUINDEX
PLA
STA $778,Y ; GS CLEARS THIS IN CLEAR MOUSE CALL
AND #$80
CMP BTTNSTAT
BEQ EXMOU
SENDBTTN STA BTTNSTAT
LDA #$86
JSR SENDACC
JSR SENDMOD
LDA BTTNSTAT
JSR SENDACC
EXMOU CLC
RTS
*
* CALL MOUSE FIRMWARE
*
CALLMOU LDX MOUROM
BEQ EXMOU
PHA
LDA PTRL ; SAVE ZERO PAGE LOCATIONS
STA SAVEZP
LDA PTRH
STA SAVEZP+1
LDA #$00
STA PTRL
STX PTRH
LDA (PTR),Y
STA PTRL
PLA
LDX MOUROM
LDY MOUSLOT
PHP
SEI
JSR IJMP
PLP
LDA SAVEZP ; RESTORE ZERO PAGE LOCATIONS
STA PTRL
LDA SAVEZP+1
STA PTRH
SEC ; MOUSE PRESENT FLAG
RTS
*
* HOST REQUEST/RESPONSE HANDLING
*
RECVADDR JSR SENDACC ; ECHO REQUEST
JSR SENDACC ; DUMMY VALUE
JSR SENDACC ; DUMMY VALUE
JSR RECVACC
STA PTRL
TXA ; ACK
JSR SENDACC
JSR RECVACC
STA PTRH
TXA ; ACK
JMP SENDACC
RECVCNT JSR RECVACC
STA CNTL
TXA ; ACK
JSR SENDACC
JSR RECVACC
STA CNTH ; INC FOR LOOP CONTROL
INC CNTH
TXA ; ACK
JMP SENDACC
HOSTREQ LDX PTRL ; SAVE ZERO PAGE LOCATIONS
STX SAVEZP
LDX PTRH
STX SAVEZP+1
READREQ CMP #$90 ; READ BYTES
BNE WRITEREQ
LDX #$91
JSR RECVADDR
JSR RECVCNT
LDX #$00
READLP LDA (PTR,X)
JSR SENDACC
INC PTRL
BNE READDEC
INC PTRH
READDEC DEC CNTL
BNE READLP
DEC CNTH
BNE READLP
BEQ OKREQ
WRITEREQ CMP #$92 ; WRITE BYTES
BNE CALLREQ
SEI ; DISABLE INTERRUPTS
LDX #$93
JSR RECVADDR
JSR RECVCNT
LDX #$00
WRITELP JSR RECVACC
STA (PTR,X)
INC PTRL
BNE WRITEDEC
INC PTRH
WRITEDEC DEC CNTL
BNE WRITELP
DEC CNTH
BNE WRITELP
BEQ OKREQ
CALLREQ CMP #$94
BEQ CALLREQ1
CMP #$9A
BNE CINREQ
CALLREQ1 TAX
INX
JSR RECVADDR
JSR IJMP
OKREQ LDX #$9E ; REQ COMPLETE OK
SENDCOMP CLI ; ENABLE INTERRUPTS
PHP
PHA
TXA
JSR SENDACC
PLA
JSR SENDACC ; ACCUM VALUE
PLA
JSR SENDACC ; FLAGS VALUE
LDA SAVEZP ; RESTORE ZERO PAGE LOCATIONS
STA PTRL
LDA SAVEZP+1
STA PTRH
EXREQ CLC
RTS
CINREQ CMP #$96
BNE RESYNC
LDX #$97
JSR RECVADDR
LDA #$9E ; REQ COMPLETE OK
JSR SENDACC
LDA PTRL
LDX SAVEZP ; RESTORE ZERO PAGE LOCATIONS
STX PTRL
LDX SAVEZP+1
STX PTRH
JSR SENDACC ; ECHO VALUE
JSR SENDACC ; ECHO VALUE
SEC ; RETURN CHAR TO RDKEY
RTS
RESYNC CMP #$80 ; RESYNC WITH HOST
BNE BADREQ
JSR SENDACC ; ECHO
JSR RECVACC
CMP #$81
BEQ EXREQ
* JMP UNHOOK
BNE RESYNC
BADREQ LDX #$9F ; REQ BAD
BNE SENDCOMP
*
* CLEANUP
*
EXIT LDA KBCLR
;JSR $C300
LDX #<COUT1
STX CSWL
LDX #>COUT1
STX CSWH
LDX #<KEYIN
STX KSWL
LDX #>KEYIN
STX KSWH
LDA RESET+1
BEQ EX1
STA $3F3
EOR #$A5
STA $3F4
LDA RESET
STA $3F2
EX1 LDY #$12 ; SET MOUSE
LDA #$00 ; DISABLE MOUSE
STA RESET
STA RESET+1
JMP CALLMOU
IJMP JMP (PTR)
MOUROM DB 0
MOUSLOT DB 0
SSCSLOT DB 0
MOUINDEX DB 0
MOUXSTAT DB 0
MOUYSTAT DB 0
BTTNSTAT DB 0
CAPSLOCK DB 0
WAITEV DB 0
CNTL DB 0
CNTH DB 0
RESET DW 0
SAVEZP DW 0
SAVEX DB 0
SAVEY DB 0
CHRIN DB 0

View File

@ -11,11 +11,11 @@ BINTYPE = \#060000
SYSTYPE = \#ff0000
TXTTYPE = \#040000
all: $(ROM) $(VDRV) $(VCLK)
clean:
-rm $(ROM) $(VDRV) $(VCLK) *.o *~
all: $(ROM) $(VDRV) $(VCLK)
$(ROM): rom.s
ca65 rom.s -o rom.o
ld65 -o $(ROM) -C rom.cfg rom.o

View File

@ -235,15 +235,13 @@ DOCMD: LDA PDUNIT
ROL
ASL
ORA #$A0
LDX PDBLKL
LDY PDBLKH
PHP
FIXUP5: STA PAD0
SEI
JSR SENDACC
TXA
LDA PDBLKL
JSR SENDACC
TYA
LDA PDBLKH
JSR SENDACC
CHKACK: JSR RECVACC
TAX

View File

@ -1,6 +1,13 @@
.DEFINE EQU =
.DEFINE EQU =
.DEFINE DB .BYTE
.DEFINE DW .WORD
.DEFINE PAGE .ALIGN 256
.DEFINE ORG .ORG
.CODE
PISLOT EQU $05
ROMSLOT EQU $07
PISLOT EQU $02 ; ROMSLOT
BOOTDEV EQU ROMSLOT*16
ORG $C000+ROMSLOT*256
;*
;* ACIA REGISTERS
;*
@ -11,9 +18,21 @@ ACIAMR EQU $C08B+PISLOT*16
;*
;* APPLE I/O LOCATIONS
;*
INDCTR EQU $0400
KEYBD EQU $C000
STROBE EQU $C010
;*
;* DRIVER SCRATCHPAD
;*
PAD0 EQU $0478+ROMSLOT
PAD1 EQU $04F8+ROMSLOT
PAD2 EQU $0578+ROMSLOT
PAD3 EQU $05F8+ROMSLOT
PAD4 EQU $0678+ROMSLOT
PAD5 EQU $06F8+ROMSLOT
PAD6 EQU $0778+ROMSLOT
PAD7 EQU $07F8+ROMSLOT
;*
;* UTIL ROUTINES
;*
WAIT EQU $FCA8
@ -69,43 +88,59 @@ PDWRPRT EQU $2B
;*
SYNC: LDA #$80
STA ACIADR
INX
TXA
AND #$07
TAX
LDA SPIN,X
STA INDCTR
LDA #$FF
JSR WAIT
LDA #$A0
STA INDCTR
LDA KEYBD
BMI SKIPBOOT
LDA ACIASR
AND #$08
BEQ SYNC
LDA ACIADR
CMP #$81
LDY ACIADR
CPY #$81
BNE SYNC
BEQ BOOT
SPIN: DB $A1, $AF, $AD, $DC, $A1, $AF, $AD, $DC
SKIPBOOT: STA STROBE
JMP $FABA ; JUMP BACK TO BOOT SCANNER ROM ROUTINE
LDA $00
BNE NOAUTO
JMP $FABA ; JUMP BACK TO AUTOSTART BOOT SCANNER ROM
NOAUTO: RTS
;*
;* CREATE COMMAND BUFFER FOR BOOT BLOCK
;*
BOOT: LDA #PDREAD
STA PDCMD
BOOT: LDY #PDREAD
STY PDCMD
;LDA #$08
STA PDBUFH
LDX #BOOTDEV
STX PDUNIT
LDA #$00
STA PDUNIT
STA PDBUFL
STA PDBLKL
STA PDBLKH
PHA
LDA #$08
STA PDBUFH
PHA
JSR DOCMD
LDX #BOOTDEV
JMP $801
;*
;* PRODOS INTELLIGENT DEVICE ENTRYPOINT
;*
DOCMD: PHP
SEI
LDA PDUNIT
DOCMD: LDA PDUNIT
ASL
LDA PDCMD
ROL
ASL
ORA #$A0
PHP
STA PAD0
SEI
JSR SENDACC
LDA PDBLKL
JSR SENDACC
@ -114,49 +149,44 @@ DOCMD: PHP
CHKACK: JSR RECVACC
TAX
DEX
CPX PDCMD
CPX PAD0
BNE CHKACK
LDY #$00
CPX #PDREAD
LDY PDCMD
BEQ STATUS
LDX #$02 ; # OF PAGES TO XFER
DEY ; CPY #PDREAD
BEQ RDBLK
CPX #PDWRITE
DEY ; CMP #PDWRITE
BEQ WRBLK
CPX #PDSTAT
BEQ STATDEV
LDA #PDIOERR
IOERR: LDA #PDIOERR
CMDERR: PLP
SEC
RTS
STATDEV:
LDX #$FF
LDY #$FF
RDBLK: JSR RECVACC
STA (PDBUFF),Y
INY
BNE RDBLK
INC PDBUFH
DEX
BNE RDBLK
STATUS: LDX #$FF
DEY ; LDY #$FF
CMDEX: JSR RECVACC
BNE CMDERR
PLP
CLC
RTS
RDBLK:
RD1BLK: JSR RECVACC
STA (PDBUFF),Y
INY
BNE RD1BLK
INC PDBUFH
RD2BLK: JSR RECVACC
STA (PDBUFF),Y
INY
BNE RD2BLK
BEQ CMDEX
WRBLK:
WR1BLK: LDA (PDBUFF),Y
WRBLK: LDA (PDBUFF),Y
JSR SENDACC
INY
BNE WR1BLK
BNE WRBLK
INC PDBUFH
WR2BLK: LDA (PDBUFF),Y
JSR SENDACC
INY
BNE WR1BLK
DEX
BNE WRBLK
BEQ CMDEX
;*
;* ACIA I/O ROUTINES
;*
SENDACC:
PHA
SENDWT: LDA ACIASR
@ -170,4 +200,13 @@ RECVWT: LDA ACIASR
AND #$08
BEQ RECVWT
LDA ACIADR
RTS
RTS
ENDCMD:
.REPEAT $C000+ROMSLOT*256+250-*
DB $FF
.ENDREP
DB "Pi"
DW 0
DB $A7
DB <DOCMD
.ASSERT * = $C000+(ROMSLOT+1)*256, error, "Code not page size"