diff --git a/input/pcanalog.s b/input/pcanalog.s index 8fedb29..4ec24a7 100644 --- a/input/pcanalog.s +++ b/input/pcanalog.s @@ -1,29 +1,179 @@ ; GEOS by Berkeley Softworks ; reverse engineered by Maciej Witkowiak, Michael Steil ; -; pcanalog input driver +; pc-analog input driver + +.include "const.inc" +.include "geossym.inc" +.include "geosmac.inc" +.include "jumptab.inc" +.include "c64.inc" .segment "inputdrv" -.byte $4c, $94, $fe, $4c, $a0, $fe, $4c, $a1, $fe, $00, $2d, $33, $39, $07, $05, $39 -.byte $3e, $43, $08, $04, $a9, $00, $85, $3b, $a9, $00, $85, $3a, $a9, $00, $85, $3c -.byte $60, $24, $30, $10, $fb, $a5, $01, $48, $a9, $35, $85, $01, $ad, $00, $dc, $48 -.byte $ad, $02, $dc, $48, $ad, $03, $dc, $48, $a9, $ff, $8d, $02, $dc, $a9, $40, $8d -.byte $00, $dc, $a2, $66, $ea, $ea, $ea, $ca, $d0, $fa, $ad, $19, $d4, $cd, $8a, $fe -.byte $30, $08, $cd, $8c, $fe, $10, $3a, $4c, $42, $ff, $85, $02, $ad, $8b, $fe, $38 -.byte $e5, $02, $85, $02, $ad, $8d, $fe, $85, $04, $a9, $00, $85, $03, $85, $05, $a2 -.byte $02, $a0, $04, $20, $69, $c1, $a5, $3a, $38, $e5, $02, $85, $3a, $a5, $3b, $f0 -.byte $07, $e9, $00, $85, $3b, $4c, $42, $ff, $b0, $fb, $a9, $00, $85, $3a, $4c, $42 -.byte $ff, $38, $ed, $8b, $fe, $85, $02, $ad, $8e, $fe, $85, $04, $a9, $00, $85, $03 -.byte $85, $05, $a2, $02, $a0, $04, $20, $69, $c1, $a5, $3a, $18, $65, $02, $85, $3a -.byte $a5, $3b, $69, $00, $85, $3b, $f0, $cd, $a5, $3a, $c9, $40, $30, $c7, $a9, $3f -.byte $85, $3a, $ad, $1a, $d4, $cd, $8f, $fe, $30, $08, $cd, $91, $fe, $10, $32, $4c -.byte $ab, $ff, $85, $02, $ad, $90, $fe, $38, $e5, $02, $85, $02, $ad, $92, $fe, $85 -.byte $04, $a9, $00, $85, $03, $85, $05, $a2, $02, $a0, $04, $20, $69, $c1, $a5, $3c -.byte $38, $e5, $02, $90, $05, $85, $3c, $4c, $ab, $ff, $a9, $00, $85, $3c, $4c, $ab -.byte $ff, $38, $ed, $90, $fe, $85, $02, $ad, $93, $fe, $85, $04, $a9, $00, $85, $03 -.byte $85, $05, $a2, $02, $a0, $04, $20, $69, $c1, $a5, $3c, $18, $65, $02, $c9, $c7 -.byte $b0, $05, $85, $3c, $4c, $ab, $ff, $a9, $c7, $85, $3c, $a9, $00, $8d, $02, $dc -.byte $8d, $03, $dc, $ad, $01, $dc, $29, $0c, $cd, $89, $fe, $f0, $13, $8d, $89, $fe -.byte $0a, $0a, $0a, $0a, $10, $01, $0a, $8d, $05, $85, $a5, $39, $09, $20, $85, $39 -.byte $68, $8d, $03, $dc, $68, $8d, $02, $dc, $68, $8d, $00, $dc, $68, $85, $01, $60 +MouseInit: + jmp _MouseInit +SlowMouse: + jmp _SlowMouse +UpdateMouse: + jmp _UpdateMouse +.ifdef bsw128 +SetMouse: + rts +.endif + +lastF: .byte $00 +xlow: .byte $2D +xav: .byte $33 +xhigh: .byte $39 +xlstep: .byte $07 +xhstep: .byte $05 +ylow: .byte $39 +yav: .byte $3E +yhigh: .byte $43 +ylstep: .byte $08 +yhstep: .byte $04 + +_MouseInit: + lda #$00 + sta $3B + lda #$00 + sta mouseXPos + LoadB mouseYPos, NULL +_SlowMouse: +rts0: rts + +_UpdateMouse: + bit $30 + bpl rts0 + PushB CPU_DATA + lda #$35 + sta CPU_DATA + PushB cia1base+0 + PushB cia1base+2 + PushB cia1base+3 + lda #$FF + sta cia1base+2 + lda #%01000000 + sta cia1base+0 + ldx #$66 +LFEC4: nop + nop + nop + dex + bne LFEC4 + lda sidbase+$19 + cmp xlow + bmi XLO + cmp xhigh + bpl XHI + jmp ReadY + +XLO: sta r0L + lda xav + sub r0L + sta r0L + MoveB xlstep, r1L + LoadB r0H, NULL + sta r1H + ldx #r0 + ldy #r1 + jsr Ddiv + lda mouseXPos + sub r0L + sta mouseXPos + lda $3B + beq LFF08 + sbc #$00 + sta $3B +LFF05: jmp ReadY + +LFF08: bcs LFF05 + LoadB mouseXPos, NULL + jmp ReadY + +XHI: sub xav + sta r0L + MoveB xhstep, r1L + LoadB r0H, NULL + sta r1H + ldx #r0 + ldy #r1 + jsr Ddiv + lda mouseXPos + add r0 + sta mouseXPos + lda $3B + adc #$00 + sta $3B + beq LFF05 + lda mouseXPos + cmp #$40 + bmi LFF05 + lda #$3F + sta mouseXPos +ReadY: lda sidbase+$1A + cmp ylow + bmi YLO + cmp yhigh + bpl YHI + jmp ReadF + +YLO: sta r0L + lda yav + sub r0L + sta r0L + MoveB ylstep, r1L + LoadB r0H, NULL + sta r1H + ldx #r0 + ldy #r1 + jsr Ddiv + lda mouseYPos + sub r0 + bcc LFF7A + sta mouseYPos + jmp ReadF + +LFF7A: LoadB mouseYPos, NULL + jmp ReadF + +YHI: sub yav + sta r0L + MoveB yhstep, r1L + LoadB r0H, NULL + sta r1H + ldx #r0 + ldy #r1 + jsr Ddiv + lda mouseYPos + add r0 + cmp #199 + bcs LFFA7 + sta mouseYPos + jmp ReadF + +LFFA7: lda #199 + sta mouseYPos +ReadF: LoadB cia1base+2, NULL + sta cia1base+3 + lda cia1base+1 + and #%00001100 + cmp lastF + beq LFFD0 + sta lastF + asl a + asl a + asl a + asl a + bpl LFFC7 + asl a +LFFC7: sta mouseData + lda $39 + ora #$20 + sta $39 +LFFD0: PopB cia1base+3 + PopB cia1base+2 + PopB cia1base+0 + PopB CPU_DATA + rts