843 lines
14 KiB
Plaintext
843 lines
14 KiB
Plaintext
;
|
|
; S:SUBPAK5
|
|
;
|
|
; Input device support routines
|
|
; -----------------------------
|
|
; The Print Shop Companion Disk
|
|
;
|
|
;
|
|
; DEVICENW: Find current input device
|
|
; and intialize it, and set
|
|
; up the following vectors:
|
|
;
|
|
; DEVICEON: Turn on current input
|
|
; device and return flashing
|
|
; cursor delay in A,Y.
|
|
;
|
|
; DEVICEOF: Turn off current input
|
|
; device.
|
|
;
|
|
; DEVICERD: Read current input device.
|
|
; SEC=error, ignore values
|
|
; CLC=good values in X,Y
|
|
; A=button status
|
|
; bit 7:button is down
|
|
; bit 6:button was down at
|
|
; last reading
|
|
;
|
|
; DEVICEST: Set X,Y coordinates, given
|
|
; X,Y. This is used for
|
|
; clamping.
|
|
;
|
|
; SCALING: hi bit 0:graphic 88x52
|
|
; hi bit 1:full screen 192x140
|
|
;
|
|
; Read both paddles
|
|
;
|
|
READPDL JSR FASTPDL
|
|
BCS PDLERROR
|
|
;
|
|
; First compute X-coor (paddle 0)
|
|
;
|
|
^1 LDX #3
|
|
^2 LDA P0D0,X
|
|
BNE >3
|
|
DEX
|
|
BPL <2
|
|
BMI PDLERROR
|
|
;
|
|
^3 CMP #$40
|
|
BLT >4
|
|
LDA #$40
|
|
^4 SEC
|
|
SBC #1
|
|
ASL
|
|
ASL
|
|
CLC
|
|
ADC PDLADD,X
|
|
TAX
|
|
;
|
|
; Last, compute Y-coor (paddle 1)
|
|
;
|
|
LDY #3
|
|
^0 LDA P1D0,Y
|
|
BNE >1
|
|
DEY
|
|
BPL <0
|
|
BMI PDLERROR
|
|
;
|
|
^1 CMP #$40
|
|
BLT >2
|
|
LDA #$40
|
|
^2 SEC
|
|
SBC #1
|
|
ASL
|
|
ASL
|
|
CLC
|
|
ADC PDLADD,Y
|
|
TAY
|
|
CLC
|
|
RTS
|
|
;
|
|
; Return error code
|
|
;
|
|
PDLERROR SEC
|
|
RTS
|
|
;
|
|
PDLADD BYT 0,1,2,3
|
|
;
|
|
P0D0 BRK
|
|
P0D1 BRK
|
|
P0D2 BRK
|
|
P0D3 BRK
|
|
P1D0 BRK
|
|
P1D1 BRK
|
|
P1D2 BRK
|
|
P1D3 BRK
|
|
;
|
|
; Check for paddles
|
|
;
|
|
CHECKPDL LDA $C070
|
|
LDX #0
|
|
LDY #16
|
|
^0 LDA $C064
|
|
ORA $C065
|
|
BPL >1
|
|
DEX
|
|
BNE <0
|
|
DEY
|
|
BNE <0
|
|
;
|
|
; If no paddle, then return to main
|
|
;
|
|
PLA
|
|
PLA
|
|
^1 RTS
|
|
;---------------------------
|
|
;
|
|
; Select input device to use
|
|
;
|
|
DEVICENW LDA $FBC0
|
|
BEQ >0
|
|
;
|
|
; If //c, check for paddles first
|
|
;
|
|
JSR FINDMOUS
|
|
^0 JSR FINDKOLA
|
|
JSR FINDJOYS
|
|
JSR FINDMOUS
|
|
JSR NODEVICE
|
|
;
|
|
; NODEVICE always installs
|
|
;
|
|
; Install vectors
|
|
;
|
|
; JSR INSTALL
|
|
;
|
|
; JMP DEVICEON
|
|
; JMP DEVICEOF
|
|
; JMP DEVICERD
|
|
; JMP DEVICEST
|
|
;
|
|
; Installs the 4 jump vectors
|
|
; following the JSR INSTALL.
|
|
;
|
|
INSTALL PLA
|
|
STA DTMPLO
|
|
PLA
|
|
STA DTMPHI
|
|
LDY #12
|
|
^0 LDA (DTMPLO),Y
|
|
STA DEVMODS-1,Y
|
|
DEY
|
|
BNE <0
|
|
PLA
|
|
PLA
|
|
;---
|
|
;
|
|
; Since the routine that scans
|
|
; for a mouse turns on the $C800
|
|
; rom behind either $C3 or another
|
|
; card, turn it off!!!
|
|
;
|
|
BIT $CFFF
|
|
JMP DEVICEON
|
|
;-----------------
|
|
;
|
|
; Search for mouse
|
|
;
|
|
FINDMOUS LDY #$00
|
|
LDA #$C7
|
|
STY DTMPLO
|
|
^0 STA DTMPHI
|
|
LDY #$0C
|
|
LDA (DTMPLO),Y
|
|
CMP #$20
|
|
BNE >1
|
|
LDY #$FB
|
|
LDA (DTMPLO),Y
|
|
CMP #$D6
|
|
BNE >1
|
|
LDA DTMPHI
|
|
STA MOUSECN
|
|
AND #$0F
|
|
STA MOUSEN
|
|
ASL
|
|
ASL
|
|
ASL
|
|
ASL
|
|
STA MOUSEN0
|
|
JSR MSINIT
|
|
;
|
|
JSR INSTALL
|
|
JMP MSTURNON
|
|
JMP MSTURNOF
|
|
JMP MSREAD
|
|
JMP MSSET
|
|
;
|
|
^1 DEC DTMPHI
|
|
LDA DTMPHI
|
|
CMP #$C1
|
|
BGE <0
|
|
RTS
|
|
;
|
|
; Initialize the mouse
|
|
;
|
|
MSINIT LDY #$19
|
|
MSINIT2 JSR DOMOUSE
|
|
;
|
|
; On the ][ and ][+, this routine
|
|
; will clear hires page 1, so only
|
|
; execute it once.
|
|
;
|
|
LDA #$2C
|
|
STA MSINIT2
|
|
;
|
|
; fall into...
|
|
;
|
|
; Turn on the mouse
|
|
;
|
|
MSTURNON LDY #$12
|
|
LDA #1
|
|
JSR DOMOUSE
|
|
LDY #100
|
|
LDA /100
|
|
LDX $FBC0
|
|
BNE SETFLASH
|
|
;
|
|
; The //c mouse routines are faster!
|
|
;
|
|
LDY #600
|
|
LDA /600
|
|
;
|
|
SETFLASH STY FLSHINIT+1
|
|
STA >1+1
|
|
RTS
|
|
;-----------
|
|
FLSHINIT LDY #00
|
|
^1 LDA #00
|
|
STY FLASHLO
|
|
STA FLASHHI
|
|
RTS
|
|
;
|
|
; Turn off the mouse
|
|
;
|
|
MSTURNOF SEI
|
|
LDY #$12
|
|
LDA #0
|
|
;
|
|
; Do mouse routine given in Y
|
|
; with parameter in A
|
|
;
|
|
DOMOUSE PHA
|
|
LDA $C400,Y
|
|
MOUSECN = *-1
|
|
LDX MOUSECN
|
|
LDY #00
|
|
MOUSEN0 = *-1
|
|
STA >0+1
|
|
STX >0+2
|
|
PLA
|
|
^0 JMP $C400
|
|
;
|
|
; Read the mouse
|
|
;
|
|
MSREAD PHP
|
|
SEI
|
|
LDY #$14
|
|
JSR DOMOUSE
|
|
LDY #00
|
|
MOUSEN = *-1
|
|
;
|
|
; Get button status
|
|
;
|
|
LDA $778,Y
|
|
PHA
|
|
;
|
|
; X-coor
|
|
;
|
|
LDA $478,Y
|
|
STA DTMPLO
|
|
LDA $578,Y
|
|
STA DTMPHI
|
|
BIT SCALING
|
|
BMI >0
|
|
LSR DTMPHI
|
|
ROR DTMPLO
|
|
^0 LDX $FBC0
|
|
BEQ >1
|
|
LSR DTMPHI
|
|
ROR DTMPLO
|
|
^1 LDX DTMPLO
|
|
;
|
|
; Y-coor
|
|
;
|
|
LDA $4F8,Y
|
|
STA DTMPLO
|
|
LDA $5F8,Y
|
|
STA DTMPHI
|
|
LSR DTMPHI
|
|
ROR DTMPLO
|
|
BIT SCALING
|
|
BMI >2
|
|
LSR DTMPHI
|
|
ROR DTMPLO
|
|
^2 LDA $FBC0
|
|
BEQ >3
|
|
LSR DTMPHI
|
|
ROR DTMPLO
|
|
^3 LDY DTMPLO
|
|
;
|
|
PLA
|
|
PLP
|
|
AND #$FF
|
|
CLC
|
|
RTS
|
|
;
|
|
; Compute actual mouse address given
|
|
; A=either X or Y
|
|
;
|
|
MSDOX CLC
|
|
HEX 24
|
|
MSDOY SEC
|
|
LDY #0
|
|
STY DTMPHI
|
|
BCC >0
|
|
ASL
|
|
ROL DTMPHI
|
|
^0 BIT SCALING
|
|
BMI >1
|
|
ASL
|
|
ROL DTMPHI
|
|
^1 LDX $FBC0
|
|
BEQ >2
|
|
ASL
|
|
ROL DTMPHI
|
|
^2 LDY MOUSEN
|
|
LDX DTMPHI
|
|
RTS
|
|
;
|
|
; Set mouse to given coordinates
|
|
;
|
|
MSSET PHP
|
|
SEI
|
|
STY >0+1
|
|
TXA
|
|
JSR MSDOX
|
|
STA $478,Y
|
|
TXA
|
|
STA $578,Y
|
|
^0 LDA #00
|
|
JSR MSDOY
|
|
STA $4F8,Y
|
|
TXA
|
|
STA $5F8,Y
|
|
LDY #$16
|
|
JSR DOMOUSE
|
|
PLP
|
|
RTS
|
|
;-------------------
|
|
;
|
|
; Check for KoalaPad
|
|
;
|
|
FINDKOLA JSR CHECKPDL
|
|
;
|
|
; If X,Y is less than KPMIN
|
|
; then assume KoalaPad.
|
|
;
|
|
JSR KPONPAD
|
|
BCC >0
|
|
RTS
|
|
;
|
|
^0 JSR INSTALL
|
|
JMP KPTURNON
|
|
JMP KPTURNOF
|
|
JMP KPREAD
|
|
JMP KPSET
|
|
;
|
|
KPMIN = 16
|
|
;
|
|
; Tables to keep track of last
|
|
; 8 coordinates
|
|
;
|
|
KPPOINT HEX 00
|
|
;
|
|
KPXLAST DFS 8,0
|
|
KPYLAST DFS 8,0
|
|
;
|
|
; Get coordinates from KoalaPad
|
|
; If CLC then pen is off pad
|
|
; SEC then X,Y are adjusted values
|
|
;
|
|
KPONPAD JSR READPDL
|
|
CPX #KPMIN
|
|
BGE >0
|
|
CPY #KPMIN
|
|
BLT KPONPADR
|
|
;
|
|
; Don't believe paddle readings unless
|
|
; you get the same values twice.
|
|
; (ignoring bit 0)
|
|
;
|
|
; compute X
|
|
;
|
|
^0 TXA
|
|
AND #$FE
|
|
CMP LASTX
|
|
STA LASTX
|
|
BNE KPONPAD
|
|
;
|
|
TXA
|
|
SEC
|
|
SBC #KPMIN
|
|
BCS *+4
|
|
LDA #0
|
|
BIT SCALING
|
|
BMI >1
|
|
LSR
|
|
^1 TAX
|
|
;
|
|
; compute Y
|
|
;
|
|
TYA
|
|
AND #$FE
|
|
CMP LASTY
|
|
STA LASTY
|
|
BNE KPONPAD
|
|
;
|
|
TYA
|
|
SEC
|
|
SBC #KPMIN
|
|
BCS *+4
|
|
LDA #0
|
|
BIT SCALING
|
|
BMI >2
|
|
;
|
|
; Y*.3125 (1/4+1/16)
|
|
;
|
|
STA DTMPHI
|
|
LDA #0
|
|
LSR DTMPHI
|
|
ROR
|
|
LSR DTMPHI
|
|
ROR
|
|
LDY DTMPHI
|
|
STA DTMP0
|
|
STY DTMP1
|
|
LSR DTMPHI
|
|
ROR
|
|
LSR DTMPHI
|
|
ROR
|
|
ADC DTMP0
|
|
LDA DTMPHI
|
|
ADC DTMP1
|
|
;
|
|
^2 TAY
|
|
SEC
|
|
KPONPADR RTS
|
|
;
|
|
KPTURNON LDY #40
|
|
LDA /40
|
|
JMP SETFLASH
|
|
;
|
|
KPTURNOF = RTS
|
|
;
|
|
; Read KoalaPad by averaging
|
|
; the current reading with the
|
|
; last 7 readings
|
|
;
|
|
KPREAD JSR KPONPAD
|
|
BCC KPDONE
|
|
TXA
|
|
LDX KPPOINT
|
|
STA KPXLAST,X
|
|
TYA
|
|
STA KPYLAST,X
|
|
INX
|
|
TXA
|
|
AND #7
|
|
STA KPPOINT
|
|
;
|
|
LDX #0
|
|
JSR KPAVG
|
|
STA XCOOR
|
|
LDX #8
|
|
JSR KPAVG
|
|
STA YCOOR
|
|
KPDONE LDX XCOOR
|
|
LDY YCOOR
|
|
;
|
|
; Read KoalaPad/Joystick buttons
|
|
;
|
|
READBTN LDA $C061
|
|
ORA $C062
|
|
AND #$80
|
|
LASTBTN ORA #00
|
|
PHA
|
|
LSR
|
|
AND #$40
|
|
STA LASTBTN+1
|
|
PLA
|
|
CLC
|
|
RTS
|
|
;
|
|
; Set KoalaPad averaging tables
|
|
;
|
|
KPSET JSR JYSET
|
|
TXA
|
|
LDX #7
|
|
^0 STA KPXLAST,X
|
|
DEX
|
|
BPL <0
|
|
;
|
|
TYA
|
|
LDY #7
|
|
^1 STA KPYLAST,Y
|
|
DEY
|
|
BPL <1
|
|
RTS
|
|
;
|
|
; Compute average of last 8
|
|
; readings and return result in A
|
|
;
|
|
KPAVG LDY #0
|
|
TYA
|
|
STY DTMPHI
|
|
CLC
|
|
^0 ADC KPXLAST,X
|
|
BCC >1
|
|
INC DTMPHI
|
|
^1 INX
|
|
INY
|
|
CPY #8
|
|
BCC <0
|
|
;
|
|
LSR DTMPHI
|
|
ROR
|
|
LSR DTMPHI
|
|
ROR
|
|
LSR DTMPHI
|
|
ROR
|
|
RTS
|
|
;-------------------
|
|
;
|
|
; Check for Joystick
|
|
;
|
|
FINDJOYS JSR CHECKPDL
|
|
;
|
|
; If joystick is centered,
|
|
; then assume joystick
|
|
;
|
|
JSR JYREAD2
|
|
BEQ >0
|
|
RTS
|
|
;
|
|
^0 JSR INSTALL
|
|
JMP JYTURNON
|
|
JMP JYTURNOF
|
|
JMP JYREAD
|
|
JMP JYSET
|
|
;
|
|
JYTIMER BYT 20
|
|
JYSPEEDU BYT 5
|
|
;
|
|
; "How fast to return values"
|
|
; constants
|
|
;
|
|
JYSLOW = 45
|
|
JYFAST = 10
|
|
;
|
|
JYTURNON = KPTURNON
|
|
;
|
|
JYTURNOF = RTS
|
|
;
|
|
JYTBL0 BYT JYFAST,JYSLOW,JYSLOW
|
|
JYTBL1 BYT JYFAST,JYSLOW,JYFAST
|
|
;
|
|
JYREAD LDA JYTBL0,Y
|
|
STA JYMOD0
|
|
LDA JYTBL1,Y
|
|
STA JYMOD1
|
|
JSR JYREAD2
|
|
BNE >0
|
|
;
|
|
; Joystick is centered, so reset all
|
|
; the JY values
|
|
;
|
|
LDX #8
|
|
STX JYSPEEDU
|
|
LDX #1
|
|
STX JYTIMER
|
|
LDX #JYSLOW
|
|
JYMOD0 = *-1
|
|
STX JYSPEED
|
|
BNE >3
|
|
;
|
|
^0 DEC JYTIMER
|
|
BNE >3
|
|
;
|
|
DEC JYSPEEDU
|
|
BNE >1
|
|
LDX #JYFAST
|
|
JYMOD1 = *-1
|
|
STX JYSPEED
|
|
;
|
|
^1 LDX #00
|
|
JYSPEED = *-1
|
|
STX JYTIMER
|
|
CLC
|
|
ADC XCOOR
|
|
CMP #$FF
|
|
BEQ >2
|
|
STA XCOOR
|
|
^2 TYA
|
|
CLC
|
|
ADC YCOOR
|
|
CMP #$FF
|
|
BEQ >3
|
|
STA YCOOR
|
|
;
|
|
^3 LDX XCOOR
|
|
LDY YCOOR
|
|
JMP READBTN
|
|
;
|
|
; Compute direction add value
|
|
; in A for X, and Y for Y
|
|
;
|
|
JYREAD2 JSR READPDL
|
|
TXA
|
|
JSR JYCALC
|
|
STA DTMP0
|
|
TYA
|
|
JSR JYCALC
|
|
TAY
|
|
ORA DTMP0
|
|
PHP
|
|
LDA DTMP0
|
|
PLP
|
|
CLC
|
|
RTS
|
|
;
|
|
; Calculate add value FF,00,01
|
|
; based on position of joystick
|
|
;
|
|
JYCALC TAX
|
|
LDA #$FF
|
|
CPX #$30
|
|
ADC #0
|
|
CPX #$A0
|
|
ADC #0
|
|
RTS
|
|
;
|
|
JYSET STX XCOOR
|
|
STY YCOOR
|
|
RTS
|
|
;
|
|
; No input device connected handler
|
|
;
|
|
NODEVICE JSR INSTALL
|
|
JMP >0
|
|
JMP >0
|
|
JMP >0
|
|
JMP >0
|
|
;
|
|
; Satisfy DEVICEON
|
|
;
|
|
^0 LDY #3000
|
|
LDA /3000
|
|
;
|
|
; Satisfy DEVICERD
|
|
;
|
|
SEC
|
|
JMP SETFLASH
|
|
;
|
|
; Scratch pad area:
|
|
;
|
|
XCOOR BRK
|
|
YCOOR BRK
|
|
LASTX BRK
|
|
LASTY BRK
|
|
;
|
|
;
|
|
; David Snider's
|
|
; Fast paddle read routine
|
|
;
|
|
; Make sure on page boundary
|
|
;
|
|
DFS $100-*&$FF,$EA
|
|
;
|
|
FASTPDL LDA #0
|
|
LDY #7
|
|
^0 STA P0D0,Y
|
|
DEY
|
|
BPL <0
|
|
TAX
|
|
CLC
|
|
LDA $C070
|
|
;
|
|
; Both paddles loop
|
|
;
|
|
^1 INX
|
|
BMI PDLERR2
|
|
BIT $C064
|
|
BPL P0X0
|
|
BIT $C065
|
|
BPL P1X0
|
|
BIT $C064
|
|
BPL P0X1
|
|
BIT $C065
|
|
BPL P1X1
|
|
BIT $C064
|
|
BPL P0X2
|
|
BIT $C065
|
|
BPL P1X2
|
|
BIT $C064
|
|
BPL P0X3
|
|
BIT $C065
|
|
BMI <1
|
|
;
|
|
; Paddle 1 exits
|
|
;
|
|
P1X3 BIT $C064
|
|
STX P1D3
|
|
BCC P0W3
|
|
P1X0 BIT $C064
|
|
STX P1D0
|
|
BCC P0W0
|
|
P1X1 BIT $C064
|
|
STX P1D1
|
|
BCC P0W1
|
|
P1X2 BIT $C064
|
|
STX P1D2
|
|
BCC P0W2
|
|
;
|
|
; Paddle 0 exits
|
|
;
|
|
P0X0 BIT $C065
|
|
STX P0D0
|
|
BCC P1W0
|
|
P0X1 BIT $C065
|
|
STX P0D1
|
|
BCC P1W1
|
|
P0X2 BIT $C065
|
|
STX P0D2
|
|
BCC P1W2
|
|
P0X3 BIT $C065
|
|
STX P0D3
|
|
BCC P1W3
|
|
;
|
|
PDLERR2 SEC
|
|
RTS
|
|
;
|
|
;
|
|
; Wait for paddle 1 to time out
|
|
;
|
|
^0 BIT $C065
|
|
P1W0 BPL P1F0
|
|
NOP
|
|
NOP
|
|
NOP
|
|
BIT $C065
|
|
P1W1 BPL P1F1
|
|
NOP
|
|
NOP
|
|
NOP
|
|
BIT $C065
|
|
P1W2 BPL P1F2
|
|
NOP
|
|
NOP
|
|
NOP
|
|
BIT $C065
|
|
P1W3 BPL P1F3
|
|
NOP
|
|
NOP
|
|
INX
|
|
BPL <0
|
|
BMI PDLERR2
|
|
;
|
|
; Wait for paddle 0 to time out
|
|
;
|
|
^0 BIT $C064
|
|
P0W0 BPL P0F0
|
|
NOP
|
|
NOP
|
|
NOP
|
|
BIT $C064
|
|
P0W1 BPL P0F1
|
|
NOP
|
|
NOP
|
|
NOP
|
|
BIT $C064
|
|
P0W2 BPL P0F2
|
|
NOP
|
|
NOP
|
|
NOP
|
|
BIT $C064
|
|
P0W3 BPL P0F3
|
|
NOP
|
|
NOP
|
|
INX
|
|
BPL <0
|
|
BMI PDLERR2
|
|
;
|
|
; Final stuff
|
|
;
|
|
P1F0 STX P1D0
|
|
BCC >0
|
|
P1F1 STX P1D1
|
|
BCC >0
|
|
P1F2 STX P1D2
|
|
BCC >0
|
|
P1F3 STX P1D3
|
|
BCC >0
|
|
P0F0 STX P0D0
|
|
BCC >0
|
|
P0F1 STX P0D1
|
|
BCC >0
|
|
P0F2 STX P0D2
|
|
BCC >0
|
|
P0F3 STX P0D3
|
|
;
|
|
; Make sure this routine always takes
|
|
; the same amount of time.
|
|
;
|
|
; 51 microsecond loop until X=$40
|
|
;
|
|
^0 CPX #$40
|
|
BGE >1
|
|
JSR RTS
|
|
JSR RTS
|
|
JSR RTS
|
|
NOP
|
|
NOP
|
|
NOP
|
|
INX
|
|
BNE <0
|
|
^1 CLC
|
|
RTS
|
|
;
|
|
;
|
|
;
|
|
USR "SUBPAK",ORG
|
|
END
|