Difference between revisions of "Light pen driver"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
(Created page with "<pre> ; z80dasm 1.2.0 ; command line: z80dasm -g0x9c40 -l MCPEN.BIN org 09c40h sub_9c40h: jr $+8 nop add a,003h ld de,(la250h)...")
 
Line 55: Line 55:
 
         ld b,000h
 
         ld b,000h
 
         or d
 
         or d
         call 0bd19h
+
 
 +
         call 0bd19h ;; mc wait flyback
 
         di
 
         di
 
         ld bc,0f40eh
 
         ld bc,0f40eh
Line 71: Line 72:
 
         out (c),a
 
         out (c),a
 
         push bc
 
         push bc
         ld bc,0f649h
+
         ld bc,0f649h ;; select keyboard line 9 (joystick)
 
         out (c),c
 
         out (c),c
 
         out (c),c
 
         out (c),c
 
         ld b,0f4h
 
         ld b,0f4h
         ld hl,0fa66h
+
 
 +
;; loop reading joystick until input seen or timeout
 +
 
 +
         ld hl,0fa66h ;; timeout.
 
l9ca8h:
 
l9ca8h:
 
         in a,(c)
 
         in a,(c)
         cp 0fdh
+
         cp 0fdh ;; 11111101. Bits are '1' if 'no press', but '0' if pressed. checking joy 0 down.
 
         jr z,l9cb9h
 
         jr z,l9cb9h
 
sub_9caeh:
 
sub_9caeh:
Line 85: Line 89:
 
         inc h
 
         inc h
 
         jr nz,l9ca8h
 
         jr nz,l9ca8h
 +
 
         ld hl,0ffffh
 
         ld hl,0ffffh
 
         jr l9cbdh
 
         jr l9cbdh
Line 100: Line 105:
 
         ei
 
         ei
 
         ret
 
         ret
 +
 
         call 09da6h
 
         call 09da6h
 
         call sub_9ce4h
 
         call sub_9ce4h
 
         call 09db2h
 
         call 09db2h
 
         ret
 
         ret
 +
 
         ld a,h
 
         ld a,h
 
         ld c,l
 
         ld c,l
Line 156: Line 163:
 
         ld a,000h
 
         ld a,000h
 
         ld bc,01a1ah
 
         ld bc,01a1ah
         call 0bc32h
+
         call 0bc32h ;; scr set ink
 
         call 0bc14h
 
         call 0bc14h
 
         ld a,001h
 
         ld a,001h
Line 173: Line 180:
 
         ld a,001h
 
         ld a,001h
 
         ld bc,01a1ah
 
         ld bc,01a1ah
         call 0bc32h
+
         call 0bc32h ;; scr set ink
 
         ld a,000h
 
         ld a,000h
 
         ld bc,00000h
 
         ld bc,00000h
         call 0bc32h
+
         call 0bc32h ;; scr set ink
 
         ld b,00ah
 
         ld b,00ah
         call 0bd19h
+
         call 0bd19h ;; mc wait flyback
 
         djnz $-4
 
         djnz $-4
 
         ld b,020h
 
         ld b,020h
Line 346: Line 353:
 
         jr nz,l9ea9h
 
         jr nz,l9ea9h
 
         ld a,02fh
 
         ld a,02fh
         call 0bb1eh
+
         call 0bb1eh ;; km test key
 
         ret z
 
         ret z
 
         jp l9e52h
 
         jp l9e52h
Line 352: Line 359:
 
         call 09eb7h
 
         call 09eb7h
 
         ld a,02fh
 
         ld a,02fh
         call 0bb1eh
+
         call 0bb1eh ;; km test key
 
         ret z
 
         ret z
 
         ld hl,(0a41ch)
 
         ld hl,(0a41ch)

Revision as of 11:53, 12 July 2025

; z80dasm 1.2.0
; command line: z80dasm -g0x9c40 -l MCPEN.BIN

        org 09c40h

sub_9c40h:
        jr $+8
        nop
        add a,003h
        ld de,(la250h)
        ld (la248h+1),hl
        ld (05a94h),de
        ret
        or b
        ld (bc),a
        ld c,b
        ld (bc),a
        cp (hl)
        nop
        jr nz,l9c5ah
        inc b
l9c5ah:
        jr nz,l9c5dh
        cp h
l9c5dh:
        ld a,(de)
l9c5eh:
        inc c
        jr z,l9c6eh
        nop
        nop
        ld d,h
        or c
        add hl,hl
        ld bc,020a1h
        dec c
        nop
        nop
        ld d,h
        or c
l9c6eh:
        xor 019h
        add hl,de
        jr nz,l9c5eh
        jr nz,$+15
        nop
        nop
        ld d,h
        or c
        rst 28h
        add hl,de
        ld a,(de)
        nop
        ld b,000h
        or d

        call 0bd19h ;; mc wait flyback
        di
        ld bc,0f40eh
        out (c),c
        ld b,0f6h
        in a,(c)
        and 030h
        ld c,a
        or 0c0h
        out (c),a
sub_9c94h:
        out (c),a
        inc b
        ld a,092h
        out (c),a
        push bc
        ld bc,0f649h ;; select keyboard line 9 (joystick)
        out (c),c
        out (c),c
        ld b,0f4h

;; loop reading joystick until input seen or timeout

        ld hl,0fa66h ;; timeout.
l9ca8h:
        in a,(c)
        cp 0fdh  ;; 11111101. Bits are '1' if 'no press', but '0' if pressed. checking joy 0 down.
        jr z,l9cb9h
sub_9caeh:
        inc l
        jr nz,l9ca8h
        inc h
        jr nz,l9ca8h

        ld hl,0ffffh
        jr l9cbdh
l9cb9h:
        ld de,00420h
        add hl,de
l9cbdh:
        ld (0a410h),hl
        pop bc
sub_9cc1h:
        ld a,082h
        out (c),a
        dec b
        out (c),c
        ei
        ret

        call 09da6h
        call sub_9ce4h
        call 09db2h
        ret

        ld a,h
        ld c,l
        ld b,010h
        ld hl,00000h
l9cdbh:
        rl c
        rla
        adc hl,hl
        sbc hl,de
        jr nc,l9ce5h
sub_9ce4h:
        add hl,de
l9ce5h:
        ccf
        djnz l9cdbh
        rl c
        rla
        ld h,a
        ld l,c
        ret
        ld a,l
        ld c,h
        ld b,010h
        ld hl,00000h
l9cf5h:
        srl c
        rra
        jr nc,l9cfbh
        add hl,de
l9cfbh:
        ex de,hl
        add hl,hl
        ex de,hl
        djnz l9cf5h
        ret
        call sub_9c40h
        ld a,0ffh
        cp h
        ret z
        ld de,00002h
        call sub_9c94h
        ld de,00064h
        call sub_9caeh
        ld de,00084h
        call sub_9c94h
        ex de,hl
        ld hl,0018fh
        sbc hl,de
        ld (0a410h),hl
        ret
        ld a,000h
        ld bc,01a1ah
        call 0bc32h ;; scr set ink
        call 0bc14h
        ld a,001h
        call 0bbdeh
        call sub_9cc1h
        ld a,0ffh
        cp h
        ret z
        ld de,0000ah
        and a
        sbc hl,de
        jr nc,$+3
        ld hl,00000h
        ld de,00000h
        call 0bbc0h
        ld a,001h
        ld bc,01a1ah
        call 0bc32h ;; scr set ink
        ld a,000h
        ld bc,00000h
        call 0bc32h ;; scr set ink
        ld b,00ah
        call 0bd19h ;; mc wait flyback
        djnz $-4
        ld b,020h
l9d65h:
        push bc
        call 09d35h
        call sub_9c40h
        pop bc
        ld a,0ffh
        cp h
        jr nz,l9d91h
        djnz l9d65h
        ret
        ld bc,(0a418h)
l9d79h:
        push bc
        ld de,00000h
        ld hl,00014h
        call 0bbf9h
        ld de,(0a416h)
        ld hl,0ffech
        call 0bbc3h
        pop bc
        djnz l9d79h
        ret
l9d91h:
        ld de,0ffech
        ld hl,00000h
        call 0bbc3h
l9d9ah:
        ld a,000h
        call 0bbdeh
        call 09d35h
        ld a,001h
        call 0bbdeh
        ld de,0ffech
        ld hl,00000h
        call 0bbc3h
        ld bc,(0a420h)
l9db4h:
        push bc
        call sub_9cc1h
        ld a,0ffh
        cp h
        jr nz,l9ddah
        ld de,00000h
        ld hl,00014h
        call 0bbf9h
        ld de,(0a416h)
        ld hl,0ffech
        call 0bbc3h
        pop bc
        djnz l9db4h
        ld hl,0ffffh
        ld (0a410h),hl
        ret
l9ddah:
        pop bc
        ld (0a410h),hl
        call 0bbc6h
        ld (0a412h),de
        ret
sub_9de6h:
        ld bc,03fd0h
        ld hl,0c000h
        ld de,05bfeh
        ldir
        ret
        ld bc,03fd0h
        ld hl,05bfeh
        ld de,0c000h
        ldir
        ret
        push hl
        push de
        call 09e08h
        ld (0a414h),hl
        ld de,05398h
        ld b,004h
l9e0bh:
        push bc
        ld hl,(0a414h)
        ld c,b
        ld b,000h
        inc hl
        and a
        sbc hl,bc
        ld b,00bh
l9e18h:
        ld a,(hl)
        ld (de),a
        inc de
        call 0bc29h
        djnz l9e18h
        pop bc
        djnz l9e0bh
        pop de
        pop hl
        ret
        push hl
        push de
        ld de,05398h
        ld b,004h
l9e2dh:
        push bc
        ld hl,(0a414h)
        ld c,b
        ld b,000h
        inc hl
        and a
        sbc hl,bc
        ld b,00bh
l9e3ah:
        ld a,(de)
        ld (hl),a
        inc de
        call 0bc29h
        djnz l9e3ah
        pop bc
        djnz l9e2dh
        pop de
        pop hl
        ret
        push de
        ld de,00002h
        call sub_9c94h
        pop de
        push hl
        ex de,hl
l9e52h:
        ld de,(0a416h)
        call sub_9c94h
        ex de,hl
        pop hl
        call 0bc1dh
        ret
        call 09c8ah
        ld hl,(0a418h)
        ld (0a420h),hl
        ld hl,(0a410h)
        ld a,0ffh
        cp h
        ret z
        ld (0a41ch),hl
        ld de,(0a412h)
        ld (0a41ah),de
l9e7ah:
        ld de,0000ah
        and a
        sbc hl,de
        jr nc,l9e85h
        ld hl,00000h
l9e85h:
        push hl
        ld hl,(0a412h)
        add hl,de
        ex de,hl
        pop hl
        call 09dbeh
        call 0bbc0h
        call 09ed2h
        call sub_9de6h
sub_9e98h:
        ld hl,(0a410h)
        ld a,0ffh
        cp h
        jr nz,l9ea9h
        ld a,02fh
        call 0bb1eh ;; km test key
        ret z
        jp l9e52h
l9ea9h:
        call 09eb7h
        ld a,02fh
        call 0bb1eh ;; km test key
        ret z
        ld hl,(0a41ch)
        ld de,(0a41ah)
        call 0bbc0h
        ld hl,(0a410h)
        ld de,(0a412h)
        ld a,(0a41eh)
        call 0bbdeh
        ld (0a41ch),hl
        ld (0a41ah),de
        call 0bbf6h
        ld hl,(0a410h)
        jr l9e7ah
        ld de,0ffech
        ld hl,00000h
        call 0bbc3h
        ld a,001h
        call 0bbdeh
        call 09d35h
        ld a,000h
        call 0bbdeh
        call sub_9cc1h
        ld a,0ffh
        cp h
        ret nz
l9ef5h:
        pop de
        ret
        ld hl,(0a41ah)
        ld de,(0a412h)
l9efeh:
        and a
        sbc hl,de
        ret z
        jp p,09ecbh
        ld hl,l9f15h
        jp 09eceh
        ld hl,09ed2h
l9f0eh:
        ld (l9e52h+1),hl
        ret
        call sub_9e98h
l9f15h:
        ld de,0ffech
        ld hl,00000h
        call 0bbc3h
        ld bc,(0a420h)
l9f22h:
        push bc
        ld de,00000h
        ld hl,00014h
        call 0bbf9h
        call sub_9cc1h
        ld a,0ffh
        cp h
        jp nz,l9efeh
        ld hl,(0a422h)
        ld (0a410h),hl
        jp l9d9ah
        ld (0a422h),hl
        ld de,(0a416h)
        ld hl,0ffech
        call 0bbc3h
        pop bc
        djnz l9f22h
        ld hl,0ffffh
        ld (0a410h),hl
        ret
        call sub_9e98h
        ld bc,(0a420h)
l9f5ch:
        push bc
        ld de,00000h
        ld hl,00014h
        call 0bbf9h
        call sub_9cc1h
        ld a,0ffh
        cp h
        jp z,l9ef5h
        ld (0a422h),hl
        ld de,(0a416h)
        ld hl,00000h
        and a
        sbc hl,de
        push hl
        pop de
        ld hl,0ffech
        call 0bbc3h
        pop bc
        djnz l9f5ch
        ld hl,00000h
        ld de,00014h
        call 0bbc3h
        jp l9f0eh
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
la050h:
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        ld a,013h
        ld (la124h),a
        ld a,00eh
        ld (0a0e2h),a
        ld a,(la133h)
        bit 1,a
        jr z,la083h
        ld a,000h
        ld (la124h),a
        ld a,007h
        ld (0a0e2h),a
la083h:
        call 0bd28h
        ld de,00000h
        ld hl,00000h
        ld (0a12dh),de
        ld a,000h
        ld (0a12ch),a
        ld de,(0a12dh)
        call sub_a10dh
        call 0bbf0h
        ld de,00001h
        call sub_a11dh
        ld de,00002h
        call sub_a11dh
        ld de,00004h
        call sub_a11dh
        ld de,00008h
        call sub_a11dh
        ld de,00010h
        call sub_a11dh
        ld de,00020h
        call sub_a11dh
        ld de,00040h
        call sub_a0ffh
la0c9h:
        call 0bd2eh
        jr c,la0c9h
        call 0bd28h
        ld a,01bh
        call 0bd2bh
        ld a,04bh
        call 0bd2bh
        ld a,000h
        call 0bd2bh
        ld a,(la133h)
        bit 0,a
        jr z,la0f4h
        ld a,002h
        call 0bd2bh
        ld a,(0a12ch)
        call 0bd2bh
        jr la0f9h
la0f4h:
        ld a,001h
        call 0bd2bh
la0f9h:
        ld a,(0a12ch)
        call 0bd2bh
sub_a0ffh:
        call sub_a115h
        inc hl
        inc hl
        call sub_a10dh
        ld a,h
        cp 001h
        jp nz,la050h
sub_a10dh:
        ld a,l
        cp 090h
        jp nz,la050h
        ld a,00ah
sub_a115h:
        call 0bd2bh
        ld a,02fh
        call 0bb1eh
sub_a11dh:
        ret nz
        ld hl,(0a12dh)
        ld de,0000eh
la124h:
        add hl,de
        ld (0a12dh),hl
        ld hl,00000h
        call sub_a10dh
        ld de,(0a12dh)
        ld a,d
la133h:
        cp 002h
        jp nz,la050h
        ld a,e
        cp 084h
        jp nz,la050h
        ret
        ld b,a
        call 0bb99h
        cp b
        ret z
        ld hl,(0a12ch)
        add hl,de
        ld (0a12ch),hl
        ret
        ld (0a12fh),hl
        ld (0a131h),de
        ret
        ld hl,(0a12fh)
        ld de,(0a131h)
        ret
        call sub_a0ffh
        call sub_a115h
        inc de
        inc de
        call sub_a10dh
        call 0bbf0h
        ret
        nop
        add a,h
        ld (bc),a
        nop
        nop
        ld c,000h
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
la18bh:
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        call 0bc11h
        cp 000h
        jr nz,la19dh
        ld b,004h
la19dh:
        cp 001h
        jr nz,la1a3h
        ld b,002h
la1a3h:
        cp 002h
        jr nz,la1a9h
        ld b,001h
la1a9h:
        ld a,b
la1aah:
        ld (0a254h),a
        call 0bbc6h
        ld (la250h),hl
        ld (la250h+2),de
la1b7h:
        call 0bb99h
        ld (la1f9h),a
        ld bc,00000h
        ld (0a24ch),bc
        ld (0a24eh),bc
        call 0a210h
        ld a,02fh
        call 0bb1eh
        ret nz
        ld hl,(0a24eh)
        inc hl
        inc hl
        ld a,004h
        cp h
        jr nz,la1deh
        ld hl,00000h
la1deh:
        ld (0a24eh),hl
        ld bc,05398h
        add hl,bc
        ld (la1aah),hl
        ld de,(055e0h)
        ld hl,(0a24eh)
sub_a1efh:
        ld bc,057e4h
        add hl,bc
        ld (la1b7h),hl
        ld hl,(05a2ch)
la1f9h:
        ld (la257h),hl
        ld (0a255h),de
        ld bc,00000h
        ld a,(0a254h)
        ld c,a
        ex de,hl
        add hl,bc
        ex de,hl
        call sub_a1efh
        and a
        ex de,hl
        sbc hl,bc
        ex de,hl
        call sub_a1efh
        inc hl
        inc hl
        call sub_a1efh
        dec hl
        dec hl
        call sub_a1efh
        ld hl,(0a24eh)
        ld de,(0a24ch)
        inc hl
        inc hl
        and a
        sbc hl,de
        ret z
        jp la18bh
        push de
        push hl
        push bc
        call 0bbf0h
        pop bc
        pop hl
la237h:
        pop de
        cp 000h
        jr nz,la248h
        ld (la250h),hl
        ld (la250h+2),de
        push bc
        call 0a210h
        pop bc
la248h:
        ld hl,(la257h)
        ld de,(0a255h)
        ret
la250h:
        ld hl,(la250h)
        ld de,(la250h+2)
la257h:
        call 0bbeah
        ld hl,(0a24ch)
        inc hl
        inc hl
        ld a,004h
        cp h
        jr nz,la267h
        ld hl,00000h
la267h:
        ld (0a24ch),hl
        ld bc,05398h
        add hl,bc
        ld de,(la250h+2)
        ld (la237h),hl
        ld (05648h),de
        ld hl,(0a24ch)
        ld bc,057e4h
        add hl,bc
        ld de,(la250h)
        ld (la248h+1),hl
        ld (05a94h),de
        ret
        or b
        ld (bc),a
        ld c,b
        ld (bc),a
        cp (hl)
        nop
        jr nz,la295h
        inc b
la295h:
        jr nz,$+3
        cp h

        end