Last modified on 18 July 2025, at 02:52

Difference between revisions of "Light pen driver"

 
(10 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
<pre>
 
<pre>
 +
;; Dissassembled and commented from MCPEN.BIN
 +
 
         org 09c40h
 
         org 09c40h
  
Line 5: Line 7:
 
         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 13:
 
         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. Should be out (c),c to 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 control 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 49: Line 51:
 
         out (c),a
 
         out (c),a
 
         dec b
 
         dec b
         out (c),c
+
         out (c),c ;; Set AY control inactive.
 
         ei
 
         ei
 
         ret
 
         ret
Line 61: Line 63:
 
         ret
 
         ret
  
 +
;; HL = HL/DE
 
sub_9c94:
 
sub_9c94:
 
         ld a,h
 
         ld a,h
 
         ld c,l
 
         ld c,l
         ld b,010h
+
         ld b,010h ;; 16 bits.
 
         ld hl,00000h
 
         ld hl,00000h
 
l9cdbh:
 
l9cdbh:
Line 82: Line 85:
 
         ret
 
         ret
  
 +
;; HL = HL * DE
 
sub_9caeh:
 
sub_9caeh:
 
         ld a,l
 
         ld a,l
 
         ld c,h
 
         ld c,h
         ld b,010h
+
         ld b,010h ;; 16 bits
 
         ld hl,00000h
 
         ld hl,00000h
 
l9cf5h:
 
l9cf5h:
Line 107: 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
Line 150: Line 154:
 
         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 185:
 
         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 191:
 
         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 199: Line 203:
 
         ld a,0ffh
 
         ld a,0ffh
 
         cp h
 
         cp h
         jr nz,l9ddah
+
         jr nz,sub_9d9ah
 
         ld de,00000h
 
         ld de,00000h
 
         ld hl,00014h
 
         ld hl,00014h
 
         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 211: Line 215:
 
         ld (0a410h),hl
 
         ld (0a410h),hl
 
         ret
 
         ret
l9ddah:
+
sub_9d9ah:
 
         pop bc
 
         pop bc
 
         ld (0a410h),hl
 
         ld (0a410h),hl
Line 240: Line 244:
 
         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 294: 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,(0a416h)
 
         ld de,(0a416h)
         call sub_9c94h
+
         call sub_9c94h ;; HL = HL/DE
 
         ex de,hl
 
         ex de,hl
 
         pop hl
 
         pop hl
Line 306: Line 310:
  
 
sub_9e1fh:
 
sub_9e1fh:
         call 09c8ah
+
         call sub_9c8ah
 
         ld hl,(0a418h)
 
         ld hl,(0a418h)
 
         ld (0a420h),hl
 
         ld (0a420h),hl
Line 330: Line 334:
 
         call sub_09dbeh
 
         call sub_09dbeh
 
         call 0bbc0h ;; gra move absolute
 
         call 0bbc0h ;; gra move absolute
 +
sub_9e52h:
 
         call sub_09ed2h
 
         call sub_09ed2h
 
         call sub_09de6h
 
         call sub_09de6h
Line 339: Line 344:
 
         call 0bb1eh ;; km test key
 
         call 0bb1eh ;; km test key
 
         ret z
 
         ret z
         jp l9e52h
+
         jp sub_9e52h
  
 
l9ea9h:
 
l9ea9h:
Line 372: Line 377:
 
         cp h
 
         cp h
 
         ret nz
 
         ret nz
l9ef5h:
 
 
         pop de
 
         pop de
 
         ret
 
         ret
  
 
+
sub_9eb7h:
 
         ld hl,(0a41ah)
 
         ld hl,(0a41ah)
 
         ld de,(0a412h)
 
         ld de,(0a412h)
l9efeh:
 
 
         and a
 
         and a
 
         sbc hl,de
 
         sbc hl,de
 
         ret z
 
         ret z
         jp p,09ecbh
+
         jp p,l9ecbh
 +
 
 
         ld hl,l9f15h
 
         ld hl,l9f15h
         jp 09eceh
+
         jp l09eceh
         ld hl,09ed2h
+
 
l9f0eh:
+
l9ecbh:
 +
         ld hl,sub_9ed2h
 +
l9eceh:
 
         ld (l9e52h+1),hl
 
         ld (l9e52h+1),hl
 
         ret
 
         ret
  
 
+
sub_9ed2h:
 
         call sub_9e98h
 
         call sub_9e98h
l9f15h:
+
 
 
         ld de,0ffech
 
         ld de,0ffech
 
         ld hl,00000h
 
         ld hl,00000h
 
         call 0bbc3h ;; gra move relative
 
         call 0bbc3h ;; gra move relative
 
         ld bc,(0a420h)
 
         ld bc,(0a420h)
l9f22h:
 
 
         push bc
 
         push bc
 
         ld de,00000h
 
         ld de,00000h
Line 406: Line 411:
 
         ld a,0ffh
 
         ld a,0ffh
 
         cp h
 
         cp h
         jp nz,l9efeh
+
         jp nz,sub_9efeh
 +
sub_9ef5h:
 
         ld hl,(0a422h)
 
         ld hl,(0a422h)
 
         ld (0a410h),hl
 
         ld (0a410h),hl
         jp l9d9ah
+
         jp sub_9d9ah
 +
 
 +
sub_9efeh:
 
         ld (0a422h),hl
 
         ld (0a422h),hl
 
         ld de,(0a416h)
 
         ld de,(0a416h)
Line 419: Line 427:
 
         ld (0a410h),hl
 
         ld (0a410h),hl
 
         ret
 
         ret
 +
 +
sub_9f82h:
 
         call sub_9e98h
 
         call sub_9e98h
 
         ld bc,(0a420h)
 
         ld bc,(0a420h)
Line 429: Line 439:
 
         ld a,0ffh
 
         ld a,0ffh
 
         cp h
 
         cp h
         jp z,l9ef5h
+
         jp z,sub_9ef5h
 +
 
 
         ld (0a422h),hl
 
         ld (0a422h),hl
 
         ld de,(0a416h)
 
         ld de,(0a416h)
Line 445: Line 456:
 
         call 0bbc3h ;; gra move relative
 
         call 0bbc3h ;; gra move relative
 
         jp l9f0eh
 
         jp l9f0eh
        nop
+
 
         nop
+
         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
         nop
+
         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
         nop
+
         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
         nop
+
         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
         nop
+
         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
         nop
+
         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
         nop
+
         db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
        nop
+
 
        nop
+
;; screen dump to printer.
        nop
+
sub_0a028h:
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        nop
+
        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 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 (data_a12d),de
 +
sub_a050h:
 
         ld a,000h
 
         ld a,000h
         ld (0a12ch),a
+
         ld (data_a12c),a ;; accumulated pixels.
         ld de,(0a12dh)
+
 
         call sub_a10dh
+
         ld de,(data_a12d)
 +
         call sub_a10dh ;; store current graphics position
 +
 
 
         call 0bbf0h ;; gra test absolute
 
         call 0bbf0h ;; gra test absolute
 
         ld de,00001h
 
         ld de,00001h
         call sub_a11dh
+
         call sub_a11dh ;; get pixel
 
         ld de,00002h
 
         ld de,00002h
         call sub_a11dh
+
         call sub_a11dh ;; get pixel
 
         ld de,00004h
 
         ld de,00004h
         call sub_a11dh
+
         call sub_a11dh ;; get pixel
 
         ld de,00008h
 
         ld de,00008h
         call sub_a11dh
+
         call sub_a11dh ;; get pixel
 
         ld de,00010h
 
         ld de,00010h
         call sub_a11dh
+
         call sub_a11dh ;; get pixel
 
         ld de,00020h
 
         ld de,00020h
         call sub_a11dh
+
         call sub_a11dh ;; get pixel
 
         ld de,00040h
 
         ld de,00040h
         call sub_a0ffh
+
         call sub_a0ffh ;; get pixel
 
la0c9h:
 
la0c9h:
 
         call 0bd2eh ;; mc busy printer
 
         call 0bd2eh ;; mc busy printer
 
         jr c,la0c9h
 
         jr c,la0c9h
 
         call 0bd28h ;; mc reset printer
 
         call 0bd28h ;; mc reset printer
         ld a,01bh
+
         ld a,01bh   ;; ESC
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
         ld a,04bh
+
         ld a,04bh   ;; K
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
         ld a,000h
+
         ld a,000h   ;; number of columns low byte
 
         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   ;; number of columns high byte?
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
         ld a,(0a12ch)
+
 
 +
         ld a,(data_a12c) ;; pixel data
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
 
         jr la0f9h
 
         jr la0f9h
la0f4h:
+
la0b4h:
         ld a,001h
+
         ld a,001h   ;; number of columns high byte?
 
         call 0bd2bh ;; mc print char
 
         call 0bd2bh ;; mc print char
 
la0f9h:
 
la0f9h:
         ld a,(0a12ch)
+
         ld a,(data_a12c) ;; pixel data
 
         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 538:
 
         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   ;; next line
sub_a115h:
+
         call 0bd2bh ;; mc print char
         call 0bd2bh
+
 
         ld a,02fh
+
         ld a,02fh ;; 47 - space
 
         call 0bb1eh ;; km test key
 
         call 0bb1eh ;; km test key
sub_a11dh:
 
 
         ret nz
 
         ret nz
         ld hl,(0a12dh)
+
         ld hl,(data_a12d)
 
         ld de,0000eh
 
         ld de,0000eh
la124h:
 
 
         add hl,de
 
         add hl,de
         ld (0a12dh),hl
+
         ld (data_a12d),hl
 
         ld hl,00000h
 
         ld hl,00000h
 
         call sub_a10dh
 
         call sub_a10dh
         ld de,(0a12dh)
+
         ld de,(data_a12d)
 
         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
 +
 +
;; accumulate pixels
 +
sub_a0ffh:
 
         ld b,a
 
         ld b,a
 +
 
         call 0bb99h ;; txt get paper
 
         call 0bb99h ;; txt get paper
         cp b
+
         cp b       ;; was the colour read the same as the paper?
 
         ret z
 
         ret z
         ld hl,(0a12ch)
+
 
 +
        ;; 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
 
         add hl,de
         ld (0a12ch),hl
+
         ld (data_a12c),hl
 
         ret
 
         ret
         ld (0a12fh),hl
+
 
         ld (0a131h),de
+
sub_a10dh:
 +
         ld (data_a12f),hl
 +
         ld (data_a131),de
 
         ret
 
         ret
         ld hl,(0a12fh)
+
 
         ld de,(0a131h)
+
sub_a115h:
 +
         ld hl,(data_a12f)
 +
         ld de,(data_a131)
 
         ret
 
         ret
         call sub_a0ffh
+
 
         call sub_a115h
+
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.
 
         inc de
 
         inc de
        inc de
+
         call sub_a10dh ;; set current X/Y graphics position
         call sub_a10dh
+
 
         call 0bbf0h ;; gra test absolute
 
         call 0bbf0h ;; gra test absolute
 
         ret
 
         ret
        nop
+
data_a12c:
         add a,h
+
         db 00h
         ld (bc),a
+
data_a12d:
        nop
+
         db 84h,02h
        nop
+
data_a12f:
         ld c,000h
+
         db 00h,00h
        nop
+
data_a131:
         nop
+
         db 0eh,00h,00h,00h
         nop
+
         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
        nop
+
 
        nop
+
sub_a154h:
        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 ;; scr get mode
 
         call 0bc11h ;; scr get mode
 
         cp 000h
 
         cp 000h
Line 829: Line 625:
 
         ld a,b
 
         ld a,b
 
la1aah:
 
la1aah:
         ld (0a254h),a
+
         ld (data_a254),a
 
         call 0bbc6h ;; gra ask cursor
 
         call 0bbc6h ;; gra ask cursor
         ld (la250h),hl
+
         ld (data_a250),hl
         ld (la250h+2),de
+
         ld (data_a250+2),de
 
la1b7h:
 
la1b7h:
 
         call 0bb99h ;; txt get paper
 
         call 0bb99h ;; txt get paper
         ld (la1f9h),a
+
         ld (pen_cmp+1),a
 
         ld bc,00000h
 
         ld bc,00000h
         ld (0a24ch),bc
+
         ld (data_a24c),bc
         ld (0a24eh),bc
+
         ld (data_a24e),bc
         call 0a210h
+
         call sub_a210
         ld a,02fh
+
la18bh:
 +
         ld a,02fh ;; 47 - space
 
         call 0bb1eh ;; km test key
 
         call 0bb1eh ;; km test key
 
         ret nz
 
         ret nz
         ld hl,(0a24eh)
+
         ld hl,(data_a24e)
 
         inc hl
 
         inc hl
 
         inc hl
 
         inc hl
Line 851: Line 648:
 
         ld hl,00000h
 
         ld hl,00000h
 
la1deh:
 
la1deh:
         ld (0a24eh),hl
+
         ld (data_a24e),hl
 
         ld bc,05398h
 
         ld bc,05398h
 
         add hl,bc
 
         add hl,bc
         ld (la1aah),hl
+
         ld (buffer_addr3+2),hl ;; +2 to skip ED,53
 +
buffer_addr3:
 
         ld de,(055e0h)
 
         ld de,(055e0h)
         ld hl,(0a24eh)
+
         ld hl,(data_a24e)
 
sub_a1efh:
 
sub_a1efh:
 
         ld bc,057e4h
 
         ld bc,057e4h
 
         add hl,bc
 
         add hl,bc
         ld (la1b7h),hl
+
         ld (buffer_addr4+1),hl ;; +1 to skip 22
 +
buffer_addr4:
 
         ld hl,(05a2ch)
 
         ld hl,(05a2ch)
la1f9h:
+
         ld (data_a257),hl
         ld (la257h),hl
+
         ld (data_a255),de
         ld (0a255h),de
+
 
         ld bc,00000h
 
         ld bc,00000h
         ld a,(0a254h)
+
         ld a,(data_a254)
 
         ld c,a
 
         ld c,a
 
         ex de,hl
 
         ex de,hl
Line 883: Line 681:
 
         dec hl
 
         dec hl
 
         call sub_a1efh
 
         call sub_a1efh
         ld hl,(0a24eh)
+
         ld hl,(data_a24e)
         ld de,(0a24ch)
+
         ld de,(data_a24c)
 
         inc hl
 
         inc hl
 
         inc hl
 
         inc hl
Line 891: Line 689:
 
         ret z
 
         ret z
 
         jp la18bh
 
         jp la18bh
 +
 +
sub_a1efh:
 
         push de
 
         push de
 
         push hl
 
         push hl
Line 897: Line 697:
 
         pop bc
 
         pop bc
 
         pop hl
 
         pop hl
la237h:
 
 
         pop de
 
         pop de
 +
pen_cmp:
 
         cp 000h
 
         cp 000h
 
         jr nz,la248h
 
         jr nz,la248h
         ld (la250h),hl
+
         ld (data_a250),hl
         ld (la250h+2),de
+
         ld (data_a252),de
 
         push bc
 
         push bc
         call 0a210h
+
         call sub_0a210h
 
         pop bc
 
         pop bc
 
la248h:
 
la248h:
         ld hl,(la257h)
+
         ld hl,(data_a257)
         ld de,(0a255h)
+
         ld de,(data_a255)
 
         ret
 
         ret
la250h:
+
sub_a210:
         ld hl,(la250h)
+
         ld hl,(data_a250)
         ld de,(la250h+2)
+
         ld de,(data_a252)
la257h:
+
 
         call 0bbeah ;; gra plot absolute
 
         call 0bbeah ;; gra plot absolute
         ld hl,(0a24ch)
+
         ld hl,(data_a24c)
 
         inc hl
 
         inc hl
 
         inc hl
 
         inc hl
Line 923: Line 722:
 
         ld hl,00000h
 
         ld hl,00000h
 
la267h:
 
la267h:
         ld (0a24ch),hl
+
         ld (data_a24c),hl
 
         ld bc,05398h
 
         ld bc,05398h
 
         add hl,bc
 
         add hl,bc
         ld de,(la250h+2)
+
         ld de,(data_a252)
         ld (la237h),hl
+
         ld (buffer_addr1+2),hl ;; +2 to skip ED, 53
 +
buffer_addr1:
 
         ld (05648h),de
 
         ld (05648h),de
         ld hl,(0a24ch)
+
         ld hl,(data_a24c)
 
         ld bc,057e4h
 
         ld bc,057e4h
 
         add hl,bc
 
         add hl,bc
         ld de,(la250h)
+
         ld de,(data_a250)
         ld (la248h+1),hl
+
         ld (buffer_addr+2),hl ;; +2 to skip ED, 53
 +
buffer_addr2:
 
         ld (05a94h),de
 
         ld (05a94h),de
 
         ret
 
         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</pre>
+
;;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
 +
 
 +
         end
 +
</pre>
  
 
[[Category:Source code]]
 
[[Category:Source code]]

Latest revision as of 02:52, 18 July 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 (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 (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,sub_9d9ah
        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
sub_9d9ah:
        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 ;; HL = HL/DE
        pop de
        push hl
        ex de,hl
        ld de,(0a416h)
        call sub_9c94h ;; HL = HL/DE
        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
sub_9e52h:
        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 sub_9e52h

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
        pop de
        ret

sub_9eb7h:
        ld hl,(0a41ah)
        ld de,(0a412h)
        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,(0a420h)
        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,(0a422h)
        ld (0a410h),hl
        jp sub_9d9ah

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

sub_9f82h:
        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,sub_9ef5h

        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

        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
        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 (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,(0a133h)
        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)
        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.
        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:
        db 0eh,00h,00h,00h
        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

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

        end