Difference between revisions of "Light pen driver"
From CPCWiki - THE Amstrad CPC encyclopedia!
(fix code style) |
|||
(9 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 | + | 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, | + | 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 | ||
− | + | 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 | + | 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 | + | 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 | + | jp sub_9e52h |
l9ea9h: | l9ea9h: | ||
Line 372: | Line 377: | ||
cp h | cp h | ||
ret nz | ret nz | ||
− | |||
pop de | pop de | ||
ret | ret | ||
− | + | sub_9eb7h: | |
ld hl,(0a41ah) | ld hl,(0a41ah) | ||
ld de,(0a412h) | ld de,(0a412h) | ||
− | |||
and a | and a | ||
sbc hl,de | sbc hl,de | ||
ret z | ret z | ||
− | jp p, | + | jp p,l9ecbh |
+ | |||
ld hl,l9f15h | ld hl,l9f15h | ||
− | jp | + | jp l09eceh |
− | ld hl, | + | |
− | + | l9ecbh: | |
+ | ld hl,sub_9ed2h | ||
+ | l9eceh: | ||
ld (l9e52h+1),hl | ld (l9e52h+1),hl | ||
ret | ret | ||
− | + | sub_9ed2h: | |
call sub_9e98h | call sub_9e98h | ||
− | + | ||
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) | ||
− | |||
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, | + | jp nz,sub_9efeh |
+ | sub_9ef5h: | ||
ld hl,(0a422h) | ld hl,(0a422h) | ||
ld (0a410h),hl | ld (0a410h),hl | ||
− | jp | + | 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, | + | 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 | ||
− | + | ||
− | + | 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 a,013h | ||
− | ld ( | + | ld (0a124h),a |
ld a,00eh | ld a,00eh | ||
ld (0a0e2h),a | ld (0a0e2h),a | ||
− | ld a,( | + | ld a,(0a133h) |
bit 1,a | bit 1,a | ||
jr z,la083h | jr z,la083h | ||
ld a,000h | ld a,000h | ||
− | ld ( | + | 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 ;; accumulated pixels. |
+ | |||
ld de,(0a12dh) | ld de,(0a12dh) | ||
− | call sub_a10dh | + | 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,( | + | ld a,(0a133h) |
bit 0,a | bit 0,a | ||
− | jr z, | + | 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,(0a12ch) ;; pixel data | ||
call 0bd2bh ;; mc print char | call 0bd2bh ;; mc print char | ||
jr la0f9h | jr la0f9h | ||
− | + | 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,(0a12ch) ;; pixel data |
call 0bd2bh ;; mc print char | call 0bd2bh ;; mc print char | ||
− | + | ||
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, | + | jp nz,sub_a050h |
− | + | ||
ld a,l | ld a,l | ||
cp 090h | cp 090h | ||
− | jp nz, | + | jp nz,sub_a050h |
− | ld a,00ah | + | ld a,00ah ;; next line |
− | + | 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 | ||
− | |||
ret nz | ret nz | ||
ld hl,(0a12dh) | ld hl,(0a12dh) | ||
ld de,0000eh | ld de,0000eh | ||
− | |||
add hl,de | add hl,de | ||
ld (0a12dh),hl | ld (0a12dh),hl | ||
Line 746: | Line 556: | ||
ld de,(0a12dh) | ld de,(0a12dh) | ||
ld a,d | ld a,d | ||
− | |||
cp 002h | cp 002h | ||
− | jp nz, | + | jp nz,sub_a050h |
ld a,e | ld a,e | ||
cp 084h | cp 084h | ||
− | jp nz, | + | 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 | ||
+ | |||
+ | ;; 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,(0a12ch) | ld hl,(0a12ch) | ||
add hl,de | add hl,de | ||
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 | ||
− | 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 | ||
− | + | call sub_a10dh ;; set current X/Y graphics position | |
− | call sub_a10dh | + | |
call 0bbf0h ;; gra test absolute | call 0bbf0h ;; gra test absolute | ||
ret | ret | ||
− | + | ||
− | + | db 00h,84h,02h,00h,00h,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 | call 0bc11h ;; scr get mode | ||
cp 000h | cp 000h | ||
Line 829: | Line 619: | ||
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 (0a1f9h),a |
ld bc,00000h | ld bc,00000h | ||
− | ld ( | + | ld (data_a24c),bc |
− | ld ( | + | ld (data_a24e),bc |
− | call | + | call sub_a210 |
− | ld a,02fh | + | 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 851: | Line 641: | ||
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 (0a1aah),hl |
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 (0a1b7h),hl |
ld hl,(05a2ch) | ld hl,(05a2ch) | ||
la1f9h: | la1f9h: | ||
ld (la257h),hl | ld (la257h),hl | ||
− | ld ( | + | ld (data_a255),de |
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 883: | Line 673: | ||
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 891: | Line 681: | ||
ret z | ret z | ||
jp la18bh | jp la18bh | ||
+ | sub_a1efh: | ||
push de | push de | ||
push hl | push hl | ||
Line 897: | Line 688: | ||
pop bc | pop bc | ||
pop hl | pop hl | ||
− | |||
pop de | pop de | ||
cp 000h | cp 000h | ||
jr nz,la248h | jr nz,la248h | ||
− | ld ( | + | ld (data_a250),hl |
− | ld ( | + | ld (data_a250+2),de |
push bc | push bc | ||
− | call | + | 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: | |
− | ld hl,( | + | ld hl,(data_a250) |
− | ld de,( | + | ld de,(data_a250+2) |
− | + | ||
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 923: | Line 712: | ||
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_a250+2) |
− | ld ( | + | ld (0a237h),hl |
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 (0a249),hl |
ld (05a94h),de | ld (05a94h),de | ||
ret | ret | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | 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]] |
Revision as of 22:09, 17 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 (0a12dh),de sub_a050h: ld a,000h ld (0a12ch),a ;; accumulated pixels. ld de,(0a12dh) 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,(0a12ch) ;; 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,(0a12ch) ;; 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,(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 ;; 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,(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 ;; 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 db 00h,84h,02h,00h,00h,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 (0a1f9h),a ld bc,00000h ld (data_a24c),bc ld (data_a24e),bc call sub_a210 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 (0a1aah),hl ld de,(055e0h) ld hl,(data_a24e) sub_a1efh: ld bc,057e4h add hl,bc ld (0a1b7h),hl ld hl,(05a2ch) la1f9h: ld (la257h),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 cp 000h jr nz,la248h ld (data_a250),hl ld (data_a250+2),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_a250+2) 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_a250+2) ld (0a237h),hl ld (05648h),de ld hl,(data_a24c) ld bc,057e4h add hl,bc ld de,(data_a250) ld (0a249),hl 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