|  (label incomplete) | |||
| (6 intermediate revisions by 3 users not shown) | |||
| Line 46: | Line 46: | ||
|          add hl,de |          add hl,de | ||
| l9cbd: | l9cbd: | ||
| − |          ld ( | + |          ld (data_0a410h),hl ;; detected 'position' or 'ffff' for not detected | 
|          pop bc |          pop bc | ||
|          ld a,082h |          ld a,082h | ||
| Line 63: | Line 63: | ||
|          ret |          ret | ||
| + | ;; HL = HL/DE | ||
| sub_9c94: | sub_9c94: | ||
|          ld a,h |          ld a,h | ||
| Line 84: | Line 85: | ||
|          ret |          ret | ||
| + | ;; HL = HL * DE | ||
| sub_9caeh: | sub_9caeh: | ||
|          ld a,l |          ld a,l | ||
| Line 109: | Line 111: | ||
|          ;; detected. |          ;; detected. | ||
|          ld de,00002h |          ld de,00002h | ||
| − |          call sub_9c94h | + |          call sub_9c94h ;; HL = HL/DE | 
|          ld de,00064h |          ld de,00064h | ||
| − |          call sub_9caeh | + |          call sub_9caeh ;; HL = HL*DE | 
|          ld de,00084h |          ld de,00084h | ||
| − |          call sub_9c94h | + |          call sub_9c94h ;; HL = HL/DE | 
|          ex de,hl |          ex de,hl | ||
|          ld hl,0018fh |          ld hl,0018fh | ||
|          sbc hl,de |          sbc hl,de | ||
| − |          ld ( | + |          ld (data_0a410),hl | 
|          ret |          ret | ||
| − | + | sub_9ce4h: | |
|          ld a,000h |          ld a,000h | ||
|          ld bc,01a1ah |          ld bc,01a1ah | ||
| Line 170: | Line 172: | ||
| sub_9d35h: | sub_9d35h: | ||
| − |          ld bc,( | + |          ld bc,(data_0a418) | 
| l9d79h: | l9d79h: | ||
|          push bc |          push bc | ||
| Line 176: | Line 178: | ||
|          ld hl,00014h |          ld hl,00014h | ||
|          call 0bbf9h ;; gra line relative |          call 0bbf9h ;; gra line relative | ||
| − |          ld de,( | + |          ld de,(data_0a416) | 
|          ld hl,0ffech |          ld hl,0ffech | ||
|          call 0bbc3h ;; gra move relative |          call 0bbc3h ;; gra move relative | ||
| Line 195: | Line 197: | ||
|          ld hl,00000h |          ld hl,00000h | ||
|          call 0bbc3h ;; gra move relative |          call 0bbc3h ;; gra move relative | ||
| − |          ld bc,( | + |          ld bc,(data_0a420) | 
| l9db4h: | l9db4h: | ||
|          push bc |          push bc | ||
| Line 205: | Line 207: | ||
|          ld hl,00014h |          ld hl,00014h | ||
|          call 0bbf9h ;; gra line relative |          call 0bbf9h ;; gra line relative | ||
| − |          ld de,( | + |          ld de,(data_0a416) | 
|          ld hl,0ffech ;; -20 |          ld hl,0ffech ;; -20 | ||
|          call 0bbc3h ;; gra move relative |          call 0bbc3h ;; gra move relative | ||
| Line 211: | Line 213: | ||
|          djnz l9db4h |          djnz l9db4h | ||
|          ld hl,0ffffh |          ld hl,0ffffh | ||
| − |          ld ( | + |          ld (data_0a410),hl | 
|          ret |          ret | ||
| sub_9d9ah: | sub_9d9ah: | ||
|          pop bc |          pop bc | ||
| − |          ld ( | + |          ld (data_0a410),hl | 
|          call 0bbc6h ;; gra ask cursor |          call 0bbc6h ;; gra ask cursor | ||
| − |          ld ( | + |          ld (data_0a412),de | 
|          ret |          ret | ||
| Line 243: | Line 245: | ||
|          push de |          push de | ||
|          call sub_09e08h |          call sub_09e08h | ||
| − |          ld ( | + |          ld (data_0a414),hl | 
|          ld de,05398h |          ld de,05398h | ||
|          ld b,004h |          ld b,004h | ||
| l9e0bh: | l9e0bh: | ||
|          push bc |          push bc | ||
| − |          ld hl,( | + |          ld hl,(data_0a414) | 
|          ld c,b |          ld c,b | ||
|          ld b,000h |          ld b,000h | ||
| Line 274: | Line 276: | ||
| l9e2dh: | l9e2dh: | ||
|          push bc |          push bc | ||
| − |          ld hl,( | + |          ld hl,(data_0a414) | 
|          ld c,b |          ld c,b | ||
|          ld b,000h |          ld b,000h | ||
| Line 296: | Line 298: | ||
|          push de |          push de | ||
|          ld de,00002h |          ld de,00002h | ||
| − |          call sub_9c94h | + |          call sub_9c94h ;; HL = HL/DE | 
|          pop de |          pop de | ||
|          push hl |          push hl | ||
|          ex de,hl |          ex de,hl | ||
| − |          ld de,( | + |          ld de,(data_0a416) | 
| − |          call sub_9c94h | + |          call sub_9c94h ;; HL = HL/DE | 
|          ex de,hl |          ex de,hl | ||
|          pop hl |          pop hl | ||
| Line 309: | Line 311: | ||
| sub_9e1fh: | sub_9e1fh: | ||
|          call sub_9c8ah |          call sub_9c8ah | ||
| − |          ld hl,( | + |          ld hl,(data_0a418) | 
| − |          ld ( | + |          ld (data_0a420h),hl | 
| − |          ld hl,( | + |          ld hl,(data_0a410) | 
|          ld a,0ffh |          ld a,0ffh | ||
|          cp h |          cp h | ||
|          ret z |          ret z | ||
| − |          ld ( | + |          ld (data_a41c),hl | 
| − |          ld de,( | + |          ld de,(data_0a412) | 
| − |          ld ( | + |          ld (data_a41a),de | 
| l9e7ah: | l9e7ah: | ||
|          ld de,0000ah |          ld de,0000ah | ||
| Line 326: | Line 328: | ||
| l9e85h: | l9e85h: | ||
|          push hl |          push hl | ||
| − |          ld hl,( | + |          ld hl,(data_a412) | 
|          add hl,de |          add hl,de | ||
|          ex de,hl |          ex de,hl | ||
| Line 335: | Line 337: | ||
|          call sub_09ed2h |          call sub_09ed2h | ||
|          call sub_09de6h |          call sub_09de6h | ||
| − |          ld hl,( | + |          ld hl,(data_a410) | 
|          ld a,0ffh |          ld a,0ffh | ||
|          cp h |          cp h | ||
| Line 349: | Line 351: | ||
|          call 0bb1eh ;; km test key |          call 0bb1eh ;; km test key | ||
|          ret z |          ret z | ||
| − |          ld hl,( | + |          ld hl,(data_a41c) | 
| − |          ld de,( | + |          ld de,(data_a41a) | 
|          call 0bbc0h ;; gra move absolute |          call 0bbc0h ;; gra move absolute | ||
| − |          ld hl,( | + |          ld hl,(data_a410) | 
| − |          ld de,( | + |          ld de,(data_a412) | 
| − |          ld a,( | + |          ld a,(data_a41e) | 
|          call 0bbdeh ;; gra set pen |          call 0bbdeh ;; gra set pen | ||
| − |          ld ( | + |          ld (data_a41c),hl | 
| − |          ld ( | + |          ld (data_a41a),de | 
|          call 0bbf6h ;; gra line absolute |          call 0bbf6h ;; gra line absolute | ||
|          ld hl,(0a410h) |          ld hl,(0a410h) | ||
| Line 379: | Line 381: | ||
| sub_9eb7h: | sub_9eb7h: | ||
| − |          ld hl,( | + |          ld hl,(data_a41a) | 
| − |          ld de,( | + |          ld de,(data_a412) | 
|          and a |          and a | ||
|          sbc hl,de |          sbc hl,de | ||
| Line 401: | Line 403: | ||
|          ld hl,00000h |          ld hl,00000h | ||
|          call 0bbc3h ;; gra move relative |          call 0bbc3h ;; gra move relative | ||
| − |          ld bc,( | + |          ld bc,(data_a420) | 
|          push bc |          push bc | ||
|          ld de,00000h |          ld de,00000h | ||
| Line 411: | Line 413: | ||
|          jp nz,sub_9efeh |          jp nz,sub_9efeh | ||
| sub_9ef5h: | sub_9ef5h: | ||
| − |          ld hl,( | + |          ld hl,(data_a422) | 
| − |          ld ( | + |          ld (data_a410),hl | 
|          jp sub_9d9ah |          jp sub_9d9ah | ||
| sub_9efeh: | sub_9efeh: | ||
| − |          ld ( | + |          ld (data_a422),hl | 
| − |          ld de,( | + |          ld de,(data_a416) | 
|          ld hl,0ffech |          ld hl,0ffech | ||
|          call 0bbc3h ;; gra move relative |          call 0bbc3h ;; gra move relative | ||
| Line 423: | Line 425: | ||
|          djnz l9f22h |          djnz l9f22h | ||
|          ld hl,0ffffh |          ld hl,0ffffh | ||
| − |          ld ( | + |          ld (data_a410),hl | 
|          ret |          ret | ||
| sub_9f82h: | sub_9f82h: | ||
|          call sub_9e98h |          call sub_9e98h | ||
| − |          ld bc,( | + |          ld bc,(data_a420) | 
| l9f5ch: | l9f5ch: | ||
|          push bc |          push bc | ||
| Line 439: | Line 441: | ||
|          jp z,sub_9ef5h |          jp z,sub_9ef5h | ||
| − |          ld ( | + |          ld (data_0a422),hl | 
| − |          ld de,( | + |          ld de,(data_a416) | 
|          ld hl,00000h |          ld hl,00000h | ||
|          and a |          and a | ||
| Line 454: | Line 456: | ||
|          call 0bbc3h ;; gra move relative |          call 0bbc3h ;; gra move relative | ||
|          jp l9f0eh |          jp l9f0eh | ||
| + | |||
|          db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |          db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | ||
|          db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |          db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | ||
| Line 464: | Line 467: | ||
| ;; screen dump to printer. | ;; screen dump to printer. | ||
| sub_0a028h: | sub_0a028h: | ||
| − |          ld a,013h | + |          ld a,013h ;; INC instruction | 
| − |          ld ( | + |          ld (la124),a | 
|          ld a,00eh |          ld a,00eh | ||
| − |          ld ( | + |          ld (la0e1+1),a | 
| − |          ld a,( | + |          ld a,(data_a133) | 
|          bit 1,a |          bit 1,a | ||
|          jr z,la083h |          jr z,la083h | ||
| − |          ld a,000h | + |          ld a,000h  ;; NOP instruction | 
| − |          ld ( | + |          ld (la124),a | 
|          ld a,007h |          ld a,007h | ||
| − |          ld ( | + |          ld (la0e1+1),a | 
| la083h: | la083h: | ||
|          call 0bd28h ;; mc reset printer |          call 0bd28h ;; mc reset printer | ||
| Line 480: | Line 483: | ||
|          ld de,00000h |          ld de,00000h | ||
|          ld hl,00000h |          ld hl,00000h | ||
| − |          ld ( | + |          ld (data_a12d),de | 
| sub_a050h: | sub_a050h: | ||
|          ld a,000h |          ld a,000h | ||
| − |          ld ( | + |          ld (data_a12c),a ;; accumulated pixels. | 
| − |          ld de,( | + |          ld de,(data_a12d) | 
|          call sub_a10dh ;; store current graphics position |          call sub_a10dh ;; store current graphics position | ||
| Line 513: | Line 516: | ||
|          ld a,000h   ;; number of columns low byte |          ld a,000h   ;; number of columns low byte | ||
|          call 0bd2bh ;; mc print char |          call 0bd2bh ;; mc print char | ||
| − |          ld a,( | + |          ld a,(data_a133) | 
|          bit 0,a |          bit 0,a | ||
|          jr z,la0b4h |          jr z,la0b4h | ||
| Line 519: | Line 522: | ||
|          call 0bd2bh ;; mc print char |          call 0bd2bh ;; mc print char | ||
| − |          ld a,( | + |          ld a,(data_a12c) ;; pixel data | 
|          call 0bd2bh ;; mc print char |          call 0bd2bh ;; mc print char | ||
|          jr la0f9h |          jr la0f9h | ||
| Line 526: | Line 529: | ||
|          call 0bd2bh ;; mc print char |          call 0bd2bh ;; mc print char | ||
| la0f9h: | la0f9h: | ||
| − |          ld a,( | + |          ld a,(data_a12c) ;; pixel data | 
|          call 0bd2bh ;; mc print char |          call 0bd2bh ;; mc print char | ||
| Line 545: | Line 548: | ||
|          call 0bb1eh ;; km test key |          call 0bb1eh ;; km test key | ||
|          ret nz |          ret nz | ||
| − |          ld hl,( | + |          ld hl,(data_a12d) | 
| + | la0e1: | ||
|          ld de,0000eh |          ld de,0000eh | ||
|          add hl,de |          add hl,de | ||
| − |          ld ( | + |          ld (data_a12d),hl | 
|          ld hl,00000h |          ld hl,00000h | ||
|          call sub_a10dh |          call sub_a10dh | ||
| − |          ld de,( | + |          ld de,(data_a12d) | 
|          ld a,d |          ld a,d | ||
|          cp 002h |          cp 002h | ||
| Line 573: | Line 577: | ||
|          ;; pixel is set to foreground. accumulate it into the pixel data so far |          ;; pixel is set to foreground. accumulate it into the pixel data so far | ||
| − |          ld hl,( | + |          ld hl,(data_a12c) | 
|          add hl,de |          add hl,de | ||
| − |          ld ( | + |          ld (data_a12c),hl | 
|          ret |          ret | ||
| sub_a10dh: | sub_a10dh: | ||
| − |          ld ( | + |          ld (data_a12f),hl | 
| − |          ld ( | + |          ld (data_a131),de | 
|          ret |          ret | ||
| sub_a115h: | sub_a115h: | ||
| − |          ld hl,( | + |          ld hl,(data_a12f) | 
| − |          ld de,( | + |          ld de,(data_a131) | 
|          ret |          ret | ||
| Line 592: | Line 596: | ||
|          call sub_a115h ;; get current X/Y graphics position |          call sub_a115h ;; get current X/Y graphics position | ||
|          inc de         ;; increment X to next pixel accross screen. |          inc de         ;; increment X to next pixel accross screen. | ||
| + | la124: | ||
|          inc de |          inc de | ||
|          call sub_a10dh ;; set current X/Y graphics position |          call sub_a10dh ;; set current X/Y graphics position | ||
|          call 0bbf0h ;; gra test absolute |          call 0bbf0h ;; gra test absolute | ||
|          ret |          ret | ||
| + | data_a12c: | ||
| + |         db 00h | ||
| + | data_a12d: | ||
| + |         db 84h,02h | ||
| + | data_a12f: | ||
| + |         db 00h,00h | ||
| + | data_a131: | ||
| + |         dw 000eh | ||
| + | data_a133:  | ||
| + |         db 00h | ||
| + | data_a134: | ||
| + |         db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| sub_a154h: | sub_a154h: | ||
|          call 0bc11h ;; scr get mode |          call 0bc11h ;; scr get mode | ||
| Line 653: | Line 630: | ||
|          ld a,b |          ld a,b | ||
| la1aah: | la1aah: | ||
| − |          ld ( | + |          ld (data_a254),a | 
|          call 0bbc6h ;; gra ask cursor |          call 0bbc6h ;; gra ask cursor | ||
| − |          ld ( | + |          ld (data_a250),hl | 
| − |          ld ( | + |          ld (data_a250+2),de | 
| la1b7h: | la1b7h: | ||
|          call 0bb99h ;; txt get paper |          call 0bb99h ;; txt get paper | ||
| − |          ld ( | + |          ld (pen_cmp+1),a | 
|          ld bc,00000h |          ld bc,00000h | ||
| − |          ld ( | + |          ld (data_a24c),bc | 
| − |          ld ( | + |          ld (data_a24e),bc | 
|          call sub_a210 |          call sub_a210 | ||
| + | la18bh: | ||
|          ld a,02fh  ;; 47 - space |          ld a,02fh  ;; 47 - space | ||
|          call 0bb1eh ;; km test key |          call 0bb1eh ;; km test key | ||
|          ret nz |          ret nz | ||
| − |          ld hl,( | + |          ld hl,(data_a24e) | 
|          inc hl |          inc hl | ||
|          inc hl |          inc hl | ||
| Line 675: | Line 653: | ||
|          ld hl,00000h |          ld hl,00000h | ||
| la1deh: | la1deh: | ||
| − |          ld ( | + |          ld (data_a24e),hl | 
|          ld bc,05398h |          ld bc,05398h | ||
|          add hl,bc |          add hl,bc | ||
| − |          ld ( | + |          ld (buffer_addr3+2),hl ;; +2 to skip ED,53 | 
| + | buffer_addr3: | ||
|          ld de,(055e0h) |          ld de,(055e0h) | ||
| − |          ld hl,( | + |          ld hl,(data_a24e) | 
| sub_a1efh: | sub_a1efh: | ||
|          ld bc,057e4h |          ld bc,057e4h | ||
|          add hl,bc |          add hl,bc | ||
| − |          ld ( | + |          ld (buffer_addr4+1),hl ;; +1 to skip 22 | 
| + | buffer_addr4: | ||
|          ld hl,(05a2ch) |          ld hl,(05a2ch) | ||
| − | + |          ld (data_a257),hl | |
| − |          ld ( | + |          ld (data_a255),de | 
| − |          ld ( | + | |
|          ld bc,00000h |          ld bc,00000h | ||
| − |          ld a,( | + |          ld a,(data_a254) | 
|          ld c,a |          ld c,a | ||
|          ex de,hl |          ex de,hl | ||
| Line 707: | Line 686: | ||
|          dec hl |          dec hl | ||
|          call sub_a1efh |          call sub_a1efh | ||
| − |          ld hl,( | + |          ld hl,(data_a24e) | 
| − |          ld de,( | + |          ld de,(data_a24c) | 
|          inc hl |          inc hl | ||
|          inc hl |          inc hl | ||
| Line 715: | Line 694: | ||
|          ret z |          ret z | ||
|          jp la18bh |          jp la18bh | ||
| + | |||
| sub_a1efh: | sub_a1efh: | ||
|          push de |          push de | ||
| Line 723: | Line 703: | ||
|          pop hl |          pop hl | ||
|          pop de |          pop de | ||
| + | pen_cmp: | ||
|          cp 000h |          cp 000h | ||
|          jr nz,la248h |          jr nz,la248h | ||
| − |          ld ( | + |          ld (data_a250),hl | 
| − |          ld ( | + |          ld (data_a252),de | 
|          push bc |          push bc | ||
|          call sub_0a210h |          call sub_0a210h | ||
|          pop bc |          pop bc | ||
| la248h: | la248h: | ||
| − |          ld hl,( | + |          ld hl,(data_a257) | 
| − |          ld de,( | + |          ld de,(data_a255) | 
|          ret |          ret | ||
| sub_a210: | sub_a210: | ||
| − |          ld hl,( | + |          ld hl,(data_a250) | 
| − |          ld de,( | + |          ld de,(data_a252) | 
|          call 0bbeah ;; gra plot absolute |          call 0bbeah ;; gra plot absolute | ||
| − |          ld hl,( | + |          ld hl,(data_a24c) | 
|          inc hl |          inc hl | ||
|          inc hl |          inc hl | ||
| Line 746: | Line 727: | ||
|          ld hl,00000h |          ld hl,00000h | ||
| la267h: | la267h: | ||
| − |          ld ( | + |          ld (data_a24c),hl | 
|          ld bc,05398h |          ld bc,05398h | ||
|          add hl,bc |          add hl,bc | ||
| − |          ld de,( | + |          ld de,(data_a252) | 
| − |          ld ( | + |          ld (buffer_addr1+2),hl ;; +2 to skip ED, 53 | 
| + | buffer_addr1: | ||
|          ld (05648h),de |          ld (05648h),de | ||
| − |          ld hl,( | + |          ld hl,(data_a24c) | 
|          ld bc,057e4h |          ld bc,057e4h | ||
|          add hl,bc |          add hl,bc | ||
| − |          ld de,( | + |          ld de,(data_a250) | 
| − |          ld ( | + |          ld (buffer_addr+2),hl ;; +2 to skip ED, 53 | 
| + | buffer_addr2: | ||
|          ld (05a94h),de |          ld (05a94h),de | ||
|          ret |          ret | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | ;;Data area | ||
| + | data_a24c: | ||
| + |         defw 02b0h | ||
| + | data_a24e: | ||
| + |         defw 0248h | ||
| + | data_a250: | ||
| + |         defw 0beh | ||
| + | data_a252: | ||
| + |         defw 0120h | ||
| + | data_a254: | ||
| + |         defb 04h | ||
| + | data_a255: | ||
| + |         defw 0120h | ||
| + | data_a257: | ||
| + |         defw 0bch | ||
| + | |||
| + | |||
| + | ;; detected light pen position | ||
| + | data_a410: | ||
| + |         defw 0 | ||
| + | data_a412: | ||
| + |         defw 0 | ||
| + | ;; memory/buffer address | ||
| + | data_a414: | ||
| + |         defw 0 | ||
| + | data_a416: | ||
| + |         defw 0 | ||
| + | data_a418: | ||
| + |         defw 0 | ||
| + | |||
| + | ;; gra x,y position | ||
| + | data_a41a: | ||
| + |         defw 0 | ||
| + | data_a41c:  | ||
| + |         defw 0 | ||
| + | ;; graphics pen | ||
| + | data_a41e: | ||
| + |         defb 0 | ||
| + |         defb 0 | ||
| + | data_a420: | ||
| + |         defw 0 | ||
|          end |          end | ||
| </pre> | </pre> | ||
| [[Category:Source code]] | [[Category:Source code]] | ||
Latest revision as of 03:30, 21 August 2025
;; Dissassembled and commented from MCPEN.BIN
        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. Should be out (c),c to be compatible with Plus.
        inc b
        ld a,092h 
        out (c),a
        push bc
        ld bc,0f649h ;; AY control 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 (data_0a410h),hl ;; detected 'position' or 'ffff' for not detected
        pop bc
        ld a,082h
        out (c),a
        dec b
        out (c),c ;; Set AY control inactive.
        ei
        ret
sub_9c8ah:
        call sub_9da6h ;; screen to buffer
        call sub_9ce4h
        call sub_9db2h ;; buffer to screen
        ret
;; HL = HL/DE
sub_9c94:
        ld a,h
        ld c,l
        ld b,010h ;; 16 bits.
        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
;; HL = HL * DE
sub_9caeh:
        ld a,l
        ld c,h
        ld b,010h ;; 16 bits
        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 ;; HL = HL/DE
        ld de,00064h
        call sub_9caeh ;; HL = HL*DE
        ld de,00084h
        call sub_9c94h ;; HL = HL/DE
        ex de,hl
        ld hl,0018fh
        sbc hl,de
        ld (data_0a410),hl
        ret
sub_9ce4h:
        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,(data_0a418)
l9d79h:
        push bc
        ld de,00000h
        ld hl,00014h
        call 0bbf9h ;; gra line relative
        ld de,(data_0a416)
        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,(data_0a420)
l9db4h:
        push bc
        call sub_9cc1h ;; get position
        ld a,0ffh
        cp h
        jr nz,sub_9d9ah
        ld de,00000h
        ld hl,00014h
        call 0bbf9h ;; gra line relative
        ld de,(data_0a416)
        ld hl,0ffech ;; -20
        call 0bbc3h ;; gra move relative
        pop bc
        djnz l9db4h
        ld hl,0ffffh
        ld (data_0a410),hl
        ret
sub_9d9ah:
        pop bc
        ld (data_0a410),hl
        call 0bbc6h ;; gra ask cursor
        ld (data_0a412),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 (data_0a414),hl
        ld de,05398h
        ld b,004h
l9e0bh:
        push bc
        ld hl,(data_0a414)
        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,(data_0a414)
        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 ;; HL = HL/DE
        pop de
        push hl
        ex de,hl
        ld de,(data_0a416)
        call sub_9c94h ;; HL = HL/DE
        ex de,hl
        pop hl
        call 0bc1dh ;; scr dot position
        ret
sub_9e1fh:
        call sub_9c8ah
        ld hl,(data_0a418)
        ld (data_0a420h),hl
        ld hl,(data_0a410)
        ld a,0ffh
        cp h
        ret z
        ld (data_a41c),hl
        ld de,(data_0a412)
        ld (data_a41a),de
l9e7ah:
        ld de,0000ah
        and a
        sbc hl,de
        jr nc,l9e85h
        ld hl,00000h
l9e85h:
        push hl
        ld hl,(data_a412)
        add hl,de
        ex de,hl
        pop hl
        call sub_09dbeh
        call 0bbc0h ;; gra move absolute
sub_9e52h:
        call sub_09ed2h
        call sub_09de6h
        ld hl,(data_a410)
        ld a,0ffh
        cp h
        jr nz,l9ea9h
        ld a,02fh
        call 0bb1eh ;; km test key
        ret z
        jp sub_9e52h
l9ea9h:
        call sub_09eb7h
        ld a,02fh
        call 0bb1eh ;; km test key
        ret z
        ld hl,(data_a41c)
        ld de,(data_a41a)
        call 0bbc0h ;; gra move absolute
        ld hl,(data_a410)
        ld de,(data_a412)
        ld a,(data_a41e)
        call 0bbdeh ;; gra set pen
        ld (data_a41c),hl
        ld (data_a41a),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
        pop de
        ret
sub_9eb7h:
        ld hl,(data_a41a)
        ld de,(data_a412)
        and a
        sbc hl,de
        ret z
        jp p,l9ecbh
        ld hl,l9f15h
        jp l09eceh
l9ecbh:
        ld hl,sub_9ed2h
l9eceh:
        ld (l9e52h+1),hl
        ret
sub_9ed2h:
        call sub_9e98h
        ld de,0ffech
        ld hl,00000h
        call 0bbc3h ;; gra move relative
        ld bc,(data_a420)
        push bc
        ld de,00000h
        ld hl,00014h
        call 0bbf9h ;; gra line relative
        call sub_9cc1h
        ld a,0ffh
        cp h
        jp nz,sub_9efeh
sub_9ef5h:
        ld hl,(data_a422)
        ld (data_a410),hl
        jp sub_9d9ah
sub_9efeh:
        ld (data_a422),hl
        ld de,(data_a416)
        ld hl,0ffech
        call 0bbc3h ;; gra move relative
        pop bc
        djnz l9f22h
        ld hl,0ffffh
        ld (data_a410),hl
        ret
sub_9f82h:
        call sub_9e98h
        ld bc,(data_a420)
l9f5ch:
        push bc
        ld de,00000h
        ld hl,00014h
        call 0bbf9h ;; gra line relative
        call sub_9cc1h
        ld a,0ffh
        cp h
        jp z,sub_9ef5h
        ld (data_0a422),hl
        ld de,(data_a416)
        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
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;; screen dump to printer.
sub_0a028h:
        ld a,013h ;; INC instruction
        ld (la124),a
        ld a,00eh
        ld (la0e1+1),a
        ld a,(data_a133)
        bit 1,a
        jr z,la083h
        ld a,000h  ;; NOP instruction
        ld (la124),a
        ld a,007h
        ld (la0e1+1),a
la083h:
        call 0bd28h ;; mc reset printer
        ld de,00000h
        ld hl,00000h
        ld (data_a12d),de
sub_a050h:
        ld a,000h
        ld (data_a12c),a ;; accumulated pixels.
        ld de,(data_a12d)
        call sub_a10dh ;; store current graphics position
        call 0bbf0h ;; gra test absolute
        ld de,00001h
        call sub_a11dh ;; get pixel
        ld de,00002h
        call sub_a11dh ;; get pixel
        ld de,00004h
        call sub_a11dh ;; get pixel
        ld de,00008h
        call sub_a11dh ;; get pixel
        ld de,00010h
        call sub_a11dh ;; get pixel
        ld de,00020h
        call sub_a11dh ;; get pixel
        ld de,00040h
        call sub_a0ffh ;; get pixel
la0c9h:
        call 0bd2eh ;; mc busy printer
        jr c,la0c9h
        call 0bd28h ;; mc reset printer
        ld a,01bh    ;; ESC
        call 0bd2bh ;; mc print char
        ld a,04bh   ;; K
        call 0bd2bh ;; mc print char
        ld a,000h   ;; number of columns low byte
        call 0bd2bh ;; mc print char
        ld a,(data_a133)
        bit 0,a
        jr z,la0b4h
        ld a,002h   ;; number of columns high byte?
        call 0bd2bh ;; mc print char
        ld a,(data_a12c) ;; pixel data
        call 0bd2bh ;; mc print char
        jr la0f9h
la0b4h:
        ld a,001h   ;; number of columns high byte?
        call 0bd2bh ;; mc print char
la0f9h:
        ld a,(data_a12c) ;; pixel data
        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   ;; next line
        call 0bd2bh ;; mc print char
        ld a,02fh  ;; 47 - space
        call 0bb1eh ;; km test key
        ret nz
        ld hl,(data_a12d)
la0e1:
        ld de,0000eh
        add hl,de
        ld (data_a12d),hl
        ld hl,00000h
        call sub_a10dh
        ld de,(data_a12d)
        ld a,d
        cp 002h
        jp nz,sub_a050h
        ld a,e
        cp 084h
        jp nz,sub_a050h
        ret
;; accumulate pixels
sub_a0ffh:
        ld b,a
        call 0bb99h ;; txt get paper
        cp b        ;; was the colour read the same as the paper?
        ret z
        ;; any pixel which is not the same as the paper will be considered foreground
        ;; and the printer will draw a dot. Any pixel the same as the paper will
        ;; be considered background and no dot is drawn by the printer.
        ;; pixel is set to foreground. accumulate it into the pixel data so far
        ld hl,(data_a12c)
        add hl,de
        ld (data_a12c),hl
        ret
sub_a10dh:
        ld (data_a12f),hl
        ld (data_a131),de
        ret
sub_a115h:
        ld hl,(data_a12f)
        ld de,(data_a131)
        ret
sub_a11dh:
        call sub_a0ffh ;; accumulate a pixel for printing.
        call sub_a115h ;; get current X/Y graphics position
        inc de         ;; increment X to next pixel accross screen.
la124:
        inc de
        call sub_a10dh ;; set current X/Y graphics position
        call 0bbf0h ;; gra test absolute
        ret
data_a12c:
        db 00h
data_a12d:
        db 84h,02h
data_a12f:
        db 00h,00h
data_a131:
        dw 000eh
data_a133: 
        db 00h
data_a134:
        db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
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 (data_a254),a
        call 0bbc6h ;; gra ask cursor
        ld (data_a250),hl
        ld (data_a250+2),de
la1b7h:
        call 0bb99h ;; txt get paper
        ld (pen_cmp+1),a
        ld bc,00000h
        ld (data_a24c),bc
        ld (data_a24e),bc
        call sub_a210
la18bh:
        ld a,02fh  ;; 47 - space
        call 0bb1eh ;; km test key
        ret nz
        ld hl,(data_a24e)
        inc hl
        inc hl
        ld a,004h
        cp h
        jr nz,la1deh
        ld hl,00000h
la1deh:
        ld (data_a24e),hl
        ld bc,05398h
        add hl,bc
        ld (buffer_addr3+2),hl ;; +2 to skip ED,53
buffer_addr3:
        ld de,(055e0h)
        ld hl,(data_a24e)
sub_a1efh:
        ld bc,057e4h
        add hl,bc
        ld (buffer_addr4+1),hl ;; +1 to skip 22
buffer_addr4:
        ld hl,(05a2ch)
        ld (data_a257),hl
        ld (data_a255),de
        ld bc,00000h
        ld a,(data_a254)
        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,(data_a24e)
        ld de,(data_a24c)
        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
pen_cmp:
        cp 000h
        jr nz,la248h
        ld (data_a250),hl
        ld (data_a252),de
        push bc
        call sub_0a210h
        pop bc
la248h:
        ld hl,(data_a257)
        ld de,(data_a255)
        ret
sub_a210:
        ld hl,(data_a250)
        ld de,(data_a252)
        call 0bbeah ;; gra plot absolute
        ld hl,(data_a24c)
        inc hl
        inc hl
        ld a,004h
        cp h
        jr nz,la267h
        ld hl,00000h
la267h:
        ld (data_a24c),hl
        ld bc,05398h
        add hl,bc
        ld de,(data_a252)
        ld (buffer_addr1+2),hl ;; +2 to skip ED, 53
buffer_addr1:
        ld (05648h),de
        ld hl,(data_a24c)
        ld bc,057e4h
        add hl,bc
        ld de,(data_a250)
        ld (buffer_addr+2),hl ;; +2 to skip ED, 53
buffer_addr2:
        ld (05a94h),de
        ret
;;Data area
data_a24c:
        defw 02b0h
data_a24e:
        defw 0248h
data_a250:
        defw 0beh
data_a252:
        defw 0120h
data_a254:
        defb 04h
data_a255:
        defw 0120h
data_a257:
        defw 0bch
;; detected light pen position
data_a410:
        defw 0
data_a412:
        defw 0
;; memory/buffer address
data_a414:
        defw 0
data_a416:
        defw 0
data_a418:
        defw 0
;; gra x,y position
data_a41a:
        defw 0
data_a41c: 
        defw 0
;; graphics pen
data_a41e:
        defb 0
        defb 0
data_a420:
        defw 0
        end