Difference between revisions of "Light pen driver"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
Line 5: Line 5:
 
         call 0bd19h ;; mc wait flyback
 
         call 0bd19h ;; mc wait flyback
 
         di
 
         di
         ld bc,0f40eh
+
         ld bc,0f40eh ;; we want to select AY register 14
 
         out (c),c
 
         out (c),c
 
         ld b,0f6h
 
         ld b,0f6h
Line 11: Line 11:
 
         and 030h
 
         and 030h
 
         ld c,a
 
         ld c,a
         or 0c0h
+
         or 0c0h   ;; AY control select register.
 
         out (c),a
 
         out (c),a
         out (c),a ;; BUG? No need to do this twice
+
         out (c),a ;; BUG. This should set AY control to 0 to also be compatible with Plus.
 
         inc b
 
         inc b
         ld a,092h
+
         ld a,092h  
 
         out (c),a
 
         out (c),a
 
         push bc
 
         push bc
         ld bc,0f649h ;; select keyboard line 9 (joystick)
+
         ld bc,0f649h ;; AY read from register and select keyboard line 9 (joystick)
 
         out (c),c
 
         out (c),c
 
         out (c),c ;; BUG? No need to do this twice.
 
         out (c),c ;; BUG? No need to do this twice.
Line 46: Line 46:
 
         ld (0a410h),hl ;; detected 'position' or 'ffff' for not detected
 
         ld (0a410h),hl ;; detected 'position' or 'ffff' for not detected
 
         pop bc
 
         pop bc
 +
        ;; BUG: For compatibility with Plus this should set AY control to 0 via Port F6xx.
 
         ld a,082h
 
         ld a,082h
 
         out (c),a
 
         out (c),a
Line 150: Line 151:
 
         call 0bd19h ;; mc wait flyback
 
         call 0bd19h ;; mc wait flyback
 
          
 
          
         ;; BUG? this is jumping back to the 0x0a in LD B,0ah
+
         ;; BUG? this is jumping back to the 0x0a in     LD B,0ah
 
         ;; djnz $-4
 
         ;; djnz $-4
 
         djnz l9d1e
 
         djnz l9d1e
  
  
         ld b,020h
+
         ld b,020h ;; number of lines
 
l9d65h:
 
l9d65h:
 
         push bc
 
         push bc
         call sub_9d35h
+
         call sub_9d35h ;; draw lines
 
         call sub_9c40h ;;detect
 
         call sub_9c40h ;;detect
 
         pop bc
 
         pop bc
Line 181: Line 182:
 
         ret
 
         ret
 
l9d91h:
 
l9d91h:
         ld de,0ffech
+
         ld de,0ffech ;; -20
 
         ld hl,00000h
 
         ld hl,00000h
 
         call 0bbc3h  ;; gra move relative
 
         call 0bbc3h  ;; gra move relative
Line 187: Line 188:
 
         ld a,000h
 
         ld a,000h
 
         call 0bbdeh ;; gra set pen
 
         call 0bbdeh ;; gra set pen
         call sub_09d35h
+
         call sub_09d35h ;; lines
 
         ld a,001h
 
         ld a,001h
 
         call 0bbdeh ;; gra set pen
 
         call 0bbdeh ;; gra set pen
         ld de,0ffech
+
         ld de,0ffech ;; -20
 
         ld hl,00000h
 
         ld hl,00000h
 
         call 0bbc3h ;; gra move relative
 
         call 0bbc3h ;; gra move relative
Line 204: Line 205:
 
         call 0bbf9h ;; gra line relative
 
         call 0bbf9h ;; gra line relative
 
         ld de,(0a416h)
 
         ld de,(0a416h)
         ld hl,0ffech
+
         ld hl,0ffech ;; -20
 
         call 0bbc3h ;; gra move relative
 
         call 0bbc3h ;; gra move relative
 
         pop bc
 
         pop bc
Line 240: Line 241:
 
         push hl
 
         push hl
 
         push de
 
         push de
         call 09e08h
+
         call sub_09e08h
 
         ld (0a414h),hl
 
         ld (0a414h),hl
 
         ld de,05398h
 
         ld de,05398h
Line 306: Line 307:
  
 
sub_9e1fh:
 
sub_9e1fh:
         call 09c8ah
+
         call sub_9c8ah
 
         ld hl,(0a418h)
 
         ld hl,(0a418h)
 
         ld (0a420h),hl
 
         ld (0a420h),hl
Line 659: Line 660:
 
         nop
 
         nop
 
         nop
 
         nop
 +
sub_0a028h:
 
         ld a,013h
 
         ld a,013h
         ld (la124h),a
+
         ld (0a124h),a
 
         ld a,00eh
 
         ld a,00eh
 
         ld (0a0e2h),a
 
         ld (0a0e2h),a
         ld a,(la133h)
+
         ld a,(0a133h)
 
         bit 1,a
 
         bit 1,a
 
         jr z,la083h
 
         jr z,la083h
 
         ld a,000h
 
         ld a,000h
         ld (la124h),a
+
         ld (0a124h),a
 
         ld a,007h
 
         ld a,007h
 
         ld (0a0e2h),a
 
         ld (0a0e2h),a
 
la083h:
 
la083h:
 
         call 0bd28h ;; mc reset printer
 
         call 0bd28h ;; mc reset printer
 +
 
         ld de,00000h
 
         ld de,00000h
 
         ld hl,00000h
 
         ld hl,00000h
 
         ld (0a12dh),de
 
         ld (0a12dh),de
 +
sub_a050h:
 
         ld a,000h
 
         ld a,000h
 
         ld (0a12ch),a
 
         ld (0a12ch),a
Line 704: Line 708:
 
         ld a,000h
 
         ld a,000h
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
         ld a,(la133h)
+
         ld a,(0a133h)
 
         bit 0,a
 
         bit 0,a
         jr z,la0f4h
+
         jr z,la0b4h
 
         ld a,002h
 
         ld a,002h
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
Line 712: Line 716:
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
 
         jr la0f9h
 
         jr la0f9h
la0f4h:
+
la0b4h:
 
         ld a,001h
 
         ld a,001h
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
Line 718: Line 722:
 
         ld a,(0a12ch)
 
         ld a,(0a12ch)
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
sub_a0ffh:
 
 
         call sub_a115h
 
         call sub_a115h
 
         inc hl
 
         inc hl
Line 725: Line 728:
 
         ld a,h
 
         ld a,h
 
         cp 001h
 
         cp 001h
         jp nz,la050h
+
         jp nz,sub_a050h
sub_a10dh:
+
 
         ld a,l
 
         ld a,l
 
         cp 090h
 
         cp 090h
         jp nz,la050h
+
         jp nz,sub_a050h
 
         ld a,00ah
 
         ld a,00ah
sub_a115h:
+
         call 0bd2bh ;; mc print char
         call 0bd2bh
+
 
         ld a,02fh
 
         ld a,02fh
 
         call 0bb1eh ;; km test key
 
         call 0bb1eh ;; km test key
sub_a11dh:
 
 
         ret nz
 
         ret nz
 
         ld hl,(0a12dh)
 
         ld hl,(0a12dh)
 
         ld de,0000eh
 
         ld de,0000eh
la124h:
 
 
         add hl,de
 
         add hl,de
 
         ld (0a12dh),hl
 
         ld (0a12dh),hl
Line 746: Line 745:
 
         ld de,(0a12dh)
 
         ld de,(0a12dh)
 
         ld a,d
 
         ld a,d
la133h:
 
 
         cp 002h
 
         cp 002h
         jp nz,la050h
+
         jp nz,sub_a050h
 
         ld a,e
 
         ld a,e
 
         cp 084h
 
         cp 084h
         jp nz,la050h
+
         jp nz,sub_a050h
 
         ret
 
         ret
 +
 +
sub_a0ffh:
 
         ld b,a
 
         ld b,a
 
         call 0bb99h ;; txt get paper
 
         call 0bb99h ;; txt get paper
Line 761: Line 761:
 
         ld (0a12ch),hl
 
         ld (0a12ch),hl
 
         ret
 
         ret
 +
 +
sub_a10dh:
 
         ld (0a12fh),hl
 
         ld (0a12fh),hl
 
         ld (0a131h),de
 
         ld (0a131h),de
 
         ret
 
         ret
 +
 +
sub_a115h:
 
         ld hl,(0a12fh)
 
         ld hl,(0a12fh)
 
         ld de,(0a131h)
 
         ld de,(0a131h)
 
         ret
 
         ret
 +
 +
sub_a11dh:
 
         call sub_a0ffh
 
         call sub_a0ffh
 
         call sub_a115h
 
         call sub_a115h
Line 774: Line 780:
 
         call 0bbf0h ;; gra test absolute
 
         call 0bbf0h ;; gra test absolute
 
         ret
 
         ret
 +
 +
la10ch:
 
         nop
 
         nop
 
         add a,h
 
         add a,h
Line 804: Line 812:
 
         nop
 
         nop
 
         nop
 
         nop
la18bh:
 
 
         nop
 
         nop
 
         nop
 
         nop
Line 814: Line 821:
 
         nop
 
         nop
 
         nop
 
         nop
 +
sub_a154h:
 
         call 0bc11h ;; scr get mode
 
         call 0bc11h ;; scr get mode
 
         cp 000h
 
         cp 000h
Line 831: Line 839:
 
         ld (0a254h),a
 
         ld (0a254h),a
 
         call 0bbc6h ;; gra ask cursor
 
         call 0bbc6h ;; gra ask cursor
         ld (la250h),hl
+
         ld (0a250h),hl
         ld (la250h+2),de
+
         ld (0a250h+2),de
 
la1b7h:
 
la1b7h:
 
         call 0bb99h ;; txt get paper
 
         call 0bb99h ;; txt get paper
         ld (la1f9h),a
+
         ld (0a1f9h),a
 
         ld bc,00000h
 
         ld bc,00000h
 
         ld (0a24ch),bc
 
         ld (0a24ch),bc
 
         ld (0a24eh),bc
 
         ld (0a24eh),bc
         call 0a210h
+
         call sub_a210
 
         ld a,02fh
 
         ld a,02fh
 
         call 0bb1eh ;; km test key
 
         call 0bb1eh ;; km test key
Line 854: Line 862:
 
         ld bc,05398h
 
         ld bc,05398h
 
         add hl,bc
 
         add hl,bc
         ld (la1aah),hl
+
         ld (0a1aah),hl
 
         ld de,(055e0h)
 
         ld de,(055e0h)
 
         ld hl,(0a24eh)
 
         ld hl,(0a24eh)
Line 860: Line 868:
 
         ld bc,057e4h
 
         ld bc,057e4h
 
         add hl,bc
 
         add hl,bc
         ld (la1b7h),hl
+
         ld (0a1b7h),hl
 
         ld hl,(05a2ch)
 
         ld hl,(05a2ch)
 
la1f9h:
 
la1f9h:
Line 891: Line 899:
 
         ret z
 
         ret z
 
         jp la18bh
 
         jp la18bh
 +
sub_a1efh:
 
         push de
 
         push de
 
         push hl
 
         push hl
Line 897: Line 906:
 
         pop bc
 
         pop bc
 
         pop hl
 
         pop hl
la237h:
 
 
         pop de
 
         pop de
 
         cp 000h
 
         cp 000h
 
         jr nz,la248h
 
         jr nz,la248h
         ld (la250h),hl
+
         ld (0a250h),hl
         ld (la250h+2),de
+
         ld (0a250h+2),de
 
         push bc
 
         push bc
         call 0a210h
+
         call sub_0a210h
 
         pop bc
 
         pop bc
 
la248h:
 
la248h:
         ld hl,(la257h)
+
         ld hl,(0a257h)
 
         ld de,(0a255h)
 
         ld de,(0a255h)
 
         ret
 
         ret
la250h:
+
sub_a210:
         ld hl,(la250h)
+
         ld hl,(0a250h)
         ld de,(la250h+2)
+
         ld de,(0a250h+2)
la257h:
+
 
         call 0bbeah ;; gra plot absolute
 
         call 0bbeah ;; gra plot absolute
 
         ld hl,(0a24ch)
 
         ld hl,(0a24ch)
Line 926: Line 933:
 
         ld bc,05398h
 
         ld bc,05398h
 
         add hl,bc
 
         add hl,bc
         ld de,(la250h+2)
+
         ld de,(0a250h+2)
         ld (la237h),hl
+
         ld (0a237h),hl
 
         ld (05648h),de
 
         ld (05648h),de
 
         ld hl,(0a24ch)
 
         ld hl,(0a24ch)
 
         ld bc,057e4h
 
         ld bc,057e4h
 
         add hl,bc
 
         add hl,bc
         ld de,(la250h)
+
         ld de,(0a250h)
         ld (la248h+1),hl
+
         ld (0a249),hl
 
         ld (05a94h),de
 
         ld (05a94h),de
 
         ret
 
         ret
 +
la24ch:
 
         or b
 
         or b
 
         ld (bc),a
 
         ld (bc),a
Line 944: Line 952:
 
         jr nz,la295h
 
         jr nz,la295h
 
         inc b
 
         inc b
la295h:
 
 
         jr nz,$+3
 
         jr nz,$+3
 
         cp h
 
         cp h

Revision as of 03:06, 13 July 2025

        org 09c40h

sub_9c40h:
        call 0bd19h ;; mc wait flyback
        di
        ld bc,0f40eh ;; we want to select AY register 14
        out (c),c
        ld b,0f6h
        in a,(c)
        and 030h
        ld c,a
        or 0c0h   ;; AY control select register.
        out (c),a
        out (c),a ;; BUG. This should set AY control to 0 to also be compatible with Plus.
        inc b
        ld a,092h 
        out (c),a
        push bc
        ld bc,0f649h ;; AY read from register and select keyboard line 9 (joystick)
        out (c),c
        out (c),c ;; BUG? No need to do this twice.
        ld b,0f4h

;; loop reading joystick until input seen or timeout

        ld hl,0fa66h ;; timeout is 0-FA66 because it counts up from this starting point.
                     ;; timeout is 59A loops.
l9c68:
        in a,(c)
        cp 0fdh  ;; 11111101. Bits are '1' if 'no press', but '0' if pressed. checking joy 0 down.
        jr z,l9c79
        inc l
        jr nz,l9c68
        inc h
        jr nz,l9c68
      
        ;; timeout. not detected
        ld hl,0ffffh
        jr l9cbdh
l9c79:
        ;; detected.
        ld de,00420h
        add hl,de
l9cbd:
        ld (0a410h),hl ;; detected 'position' or 'ffff' for not detected
        pop bc
        ;; BUG: For compatibility with Plus this should set AY control to 0 via Port F6xx.
        ld a,082h
        out (c),a
        dec b
        out (c),c
        ei
        ret

sub_9c8ah:
        call sub_9da6h ;; screen to buffer

        call sub_9ce4h

        call sub_9db2h ;; buffer to screen
        ret

sub_9c94:
        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
        add hl,de
l9ce5h:
        ccf
        djnz l9cdbh
        rl c
        rla
        ld h,a
        ld l,c
        ret

sub_9caeh:
        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

sub_9cc1h:
        call sub_9c40h ;; detect
        ld a,0ffh
        cp h
        ret z

        ;; detected.
        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

sub_9ce4:
        ld a,000h
        ld bc,01a1ah
        call 0bc32h ;; scr set ink
        call 0bc14h ;; scr clear
        ld a,001h
        call 0bbdeh ;; gra set pen
        call sub_9cc1h ;; get position
        ld a,0ffh
        cp h
        ret z
        ld de,0000ah
        and a
        sbc hl,de
        
        ;; BUG? This is jumping just after 0x021 of LD HL and then executing two nops before LD DE,0000h
        ;;jr nc,$+2
        jr nc,l9d06
        ld hl,00000h
l9d06:
        ld de,00000h
        call 0bbc0h ;; gra move absolute
        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
l9d1e:
        call 0bd19h ;; mc wait flyback
        
        ;; BUG? this is jumping back to the 0x0a in     LD B,0ah
        ;; djnz $-4
        djnz l9d1e


        ld b,020h ;; number of lines
l9d65h:
        push bc
        call sub_9d35h ;; draw lines
        call sub_9c40h ;;detect
        pop bc
        ld a,0ffh
        cp h
        jr nz,l9d91h
        djnz l9d65h
        ret

sub_9d35h:
        ld bc,(0a418h)
l9d79h:
        push bc
        ld de,00000h
        ld hl,00014h
        call 0bbf9h ;; gra line relative
        ld de,(0a416h)
        ld hl,0ffech
        call 0bbc3h ;; gra move relative
        pop bc
        djnz l9d79h
        ret
l9d91h:
        ld de,0ffech ;; -20
        ld hl,00000h
        call 0bbc3h  ;; gra move relative
l9d9ah:
        ld a,000h
        call 0bbdeh ;; gra set pen
        call sub_09d35h ;; lines
        ld a,001h
        call 0bbdeh ;; gra set pen
        ld de,0ffech ;; -20
        ld hl,00000h
        call 0bbc3h ;; gra move relative
        ld bc,(0a420h)
l9db4h:
        push bc
        call sub_9cc1h ;; get position
        ld a,0ffh
        cp h
        jr nz,l9ddah
        ld de,00000h
        ld hl,00014h
        call 0bbf9h ;; gra line relative
        ld de,(0a416h)
        ld hl,0ffech ;; -20
        call 0bbc3h ;; gra move relative
        pop bc
        djnz l9db4h
        ld hl,0ffffh
        ld (0a410h),hl
        ret
l9ddah:
        pop bc
        ld (0a410h),hl
        call 0bbc6h ;; gra ask cursor
        ld (0a412h),de
        ret

;; screen to buffer
;; c000->5bfe length 3fd0
sub_9da6h:
        ld bc,03fd0h
        ld hl,0c000h
        ld de,05bfeh
        ldir
        ret

;; buffer to screen
;; 5bfe->c000 length 3fd0

sub_9db2h:
        ld bc,03fd0h
        ld hl,05bfeh
        ld de,0c000h
        ldir
        ret

sub_9dbeh:
        push hl
        push de
        call sub_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 ;; scr prev line
        djnz l9e18h
        pop bc
        djnz l9e0bh
        pop de
        pop hl
        ret

sub_9de6h:
        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 ;; scr prev line
        djnz l9e3ah
        pop bc
        djnz l9e2dh
        pop de
        pop hl
        ret

sub_9e08h:
        push de
        ld de,00002h
        call sub_9c94h
        pop de
        push hl
        ex de,hl
        ld de,(0a416h)
        call sub_9c94h
        ex de,hl
        pop hl
        call 0bc1dh ;; scr dot position
        ret

sub_9e1fh:
        call sub_9c8ah
        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 sub_09dbeh
        call 0bbc0h ;; gra move absolute
        call sub_09ed2h
        call sub_09de6h
        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 sub_09eb7h
        ld a,02fh
        call 0bb1eh ;; km test key
        ret z
        ld hl,(0a41ch)
        ld de,(0a41ah)
        call 0bbc0h ;; gra move absolute
        ld hl,(0a410h)
        ld de,(0a412h)
        ld a,(0a41eh)
        call 0bbdeh ;; gra set pen
        ld (0a41ch),hl
        ld (0a41ah),de
        call 0bbf6h ;; gra line absolute
        ld hl,(0a410h)
        jr l9e7ah

sub_09e98h:
        ld de,0ffech
        ld hl,00000h
        call 0bbc3h ;; gra move relative
        ld a,001h
        call 0bbdeh ;; gra set pen
        call sub_09d35h
        ld a,000h
        call 0bbdeh ;; gra set pen
        call sub_9cc1h ;; get position
        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 ;; gra move relative
        ld bc,(0a420h)
l9f22h:
        push bc
        ld de,00000h
        ld hl,00014h
        call 0bbf9h ;; gra line relative
        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 ;; gra move relative
        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 ;; gra line relative
        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 ;; gra move relative
        pop bc
        djnz l9f5ch
        ld hl,00000h
        ld de,00014h
        call 0bbc3h ;; gra move relative
        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
sub_0a028h:
        ld a,013h
        ld (0a124h),a
        ld a,00eh
        ld (0a0e2h),a
        ld a,(0a133h)
        bit 1,a
        jr z,la083h
        ld a,000h
        ld (0a124h),a
        ld a,007h
        ld (0a0e2h),a
la083h:
        call 0bd28h ;; mc reset printer

        ld de,00000h
        ld hl,00000h
        ld (0a12dh),de
sub_a050h:
        ld a,000h
        ld (0a12ch),a
        ld de,(0a12dh)
        call sub_a10dh
        call 0bbf0h ;; gra test absolute
        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 ;; mc busy printer
        jr c,la0c9h
        call 0bd28h ;; mc reset printer
        ld a,01bh
        call 0bd2bh ;; mc print char
        ld a,04bh
        call 0bd2bh ;; mc print char
        ld a,000h
        call 0bd2bh ;; mc print char
        ld a,(0a133h)
        bit 0,a
        jr z,la0b4h
        ld a,002h
        call 0bd2bh ;; mc print char
        ld a,(0a12ch)
        call 0bd2bh ;; mc print char
        jr la0f9h
la0b4h:
        ld a,001h
        call 0bd2bh ;; mc print char
la0f9h:
        ld a,(0a12ch)
        call 0bd2bh ;; mc print char
        call sub_a115h
        inc hl
        inc hl
        call sub_a10dh
        ld a,h
        cp 001h
        jp nz,sub_a050h
        ld a,l
        cp 090h
        jp nz,sub_a050h
        ld a,00ah
        call 0bd2bh ;; mc print char
        ld a,02fh
        call 0bb1eh ;; km test key
        ret nz
        ld hl,(0a12dh)
        ld de,0000eh
        add hl,de
        ld (0a12dh),hl
        ld hl,00000h
        call sub_a10dh
        ld de,(0a12dh)
        ld a,d
        cp 002h
        jp nz,sub_a050h
        ld a,e
        cp 084h
        jp nz,sub_a050h
        ret

sub_a0ffh:
        ld b,a
        call 0bb99h ;; txt get paper
        cp b
        ret z
        ld hl,(0a12ch)
        add hl,de
        ld (0a12ch),hl
        ret

sub_a10dh:
        ld (0a12fh),hl
        ld (0a131h),de
        ret

sub_a115h:
        ld hl,(0a12fh)
        ld de,(0a131h)
        ret

sub_a11dh:
        call sub_a0ffh
        call sub_a115h
        inc de
        inc de
        call sub_a10dh
        call 0bbf0h ;; gra test absolute
        ret

la10ch:
        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
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
sub_a154h:
        call 0bc11h ;; scr get mode
        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 ;; gra ask cursor
        ld (0a250h),hl
        ld (0a250h+2),de
la1b7h:
        call 0bb99h ;; txt get paper
        ld (0a1f9h),a
        ld bc,00000h
        ld (0a24ch),bc
        ld (0a24eh),bc
        call sub_a210
        ld a,02fh
        call 0bb1eh ;; km test key
        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 (0a1aah),hl
        ld de,(055e0h)
        ld hl,(0a24eh)
sub_a1efh:
        ld bc,057e4h
        add hl,bc
        ld (0a1b7h),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
sub_a1efh:
        push de
        push hl
        push bc
        call 0bbf0h ;; gra test absolute
        pop bc
        pop hl
        pop de
        cp 000h
        jr nz,la248h
        ld (0a250h),hl
        ld (0a250h+2),de
        push bc
        call sub_0a210h
        pop bc
la248h:
        ld hl,(0a257h)
        ld de,(0a255h)
        ret
sub_a210:
        ld hl,(0a250h)
        ld de,(0a250h+2)
        call 0bbeah ;; gra plot absolute
        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,(0a250h+2)
        ld (0a237h),hl
        ld (05648h),de
        ld hl,(0a24ch)
        ld bc,057e4h
        add hl,bc
        ld de,(0a250h)
        ld (0a249),hl
        ld (05a94h),de
        ret
la24ch:
        or b
        ld (bc),a
        ld c,b
        ld (bc),a
        cp (hl)
        nop
        jr nz,la295h
        inc b
        jr nz,$+3
        cp h

        end