PrintShopCompanion-Apple-II/PSC Source Disk 1 - System .../S_SUBPAK5.txt

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