Changes
<pre>
; z80dasm 1.2.0; command line: z80dasm -g0x9c40 -l 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
and 030h
ld c,a
or 0c0h out (c),asub_9c94h: ;; 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
out (c),c ;; BUG? No need to do this twice.
ld b,0f4h
;; loop reading joystick until input seen or timeout
ld hl,0fa66h ;; timeoutis 0-FA66 because it counts up from this starting point.l9ca8h ;; 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,l9cb9hsub_9caeh:l9c79
inc l
jr nz,l9ca8hl9c68
inc h
jr nz,l9ca8hl9c68 ;; timeout. not detected
ld hl,0ffffh
jr l9cbdh
ld de,00420h
add hl,de
pop bc
ld a,082h
out (c),a
dec b
out (c),c;; Set AY control inactive.
ei
ret
sub_9c8ah: call 09da6hsub_9da6h ;; screen to buffer
call sub_9ce4h
call 09db2hsub_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:
sbc hl,de
jr nc,l9ce5h
add hl,de
l9ce5h:
ld l,c
ret
;; HL = HL * DE
sub_9caeh:
ld a,l
ld c,h
ld b,010h;; 16 bits
ld hl,00000h
l9cf5h:
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 (0a410hdata_0a410),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
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,$+32 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 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 09d35hsub_9d35h ;; draw lines call sub_9c40h;;detect
pop bc
ld a,0ffh
djnz l9d65h
ret
sub_9d35h: ld bc,(0a418hdata_0a418)
l9d79h:
push bc
ld de,00000h
ld hl,00014h
call 0bbf9h;; gra line relative ld de,(0a416hdata_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 09d35hsub_09d35h ;; lines
ld a,001h
call 0bbdeh;; gra set pen ld de,0ffech;; -20
ld hl,00000h
call 0bbc3h;; gra move relative ld bc,(0a420hdata_0a420)
l9db4h:
push bc
call sub_9cc1h;; get position
ld a,0ffh
cp h
jr nz,l9ddahsub_9d9ah
ld de,00000h
ld hl,00014h
call 0bbf9h;; gra line relative ld de,(0a416hdata_0a416) ld hl,0ffech;; -20 call 0bbc3h;; gra move relative
pop bc
djnz l9db4h
ld hl,0ffffh
ld (0a410hdata_0a410),hl
ret
pop bc
ld (0a410hdata_0a410),hl call 0bbc6h;; gra ask cursor ld (0a412hdata_0a412),de
ret
ld bc,03fd0h
ld hl,0c000h
ldir
ret
;; buffer to screen
;; 5bfe->c000 length 3fd0
sub_9db2h:
ld bc,03fd0h
ld hl,05bfeh
ldir
ret
sub_9dbeh:
push hl
push de
call 09e08hsub_09e08h ld (0a414hdata_0a414),hl
ld de,05398h
ld b,004h
l9e0bh:
push bc
ld hl,(0a414hdata_0a414)
ld c,b
ld b,000h
ld (de),a
inc de
call 0bc29h;; scr prev line
djnz l9e18h
pop bc
pop hl
ret
sub_9de6h:
push hl
push de
l9e2dh:
push bc
ld hl,(0a414hdata_0a414)
ld c,b
ld b,000h
ld (hl),a
inc de
call 0bc29h;; scr prev line
djnz l9e3ah
pop bc
pop hl
ret
sub_9e08h:
push de
ld de,00002h
call sub_9c94h;; HL = HL/DE
pop de
push hl
ex de,hl
ex de,hl
pop hl
call 0bc1dh;; scr dot position
ret
sub_9e1fh: call 09c8ahsub_9c8ah ld hl,(0a418hdata_0a418) ld (0a420hdata_0a420h),hl ld hl,(0a410hdata_0a410)
ld a,0ffh
cp h
ret z
ld (0a41chdata_a41c),hl ld de,(0a412hdata_0a412) ld (0a41ahdata_a41a),de
l9e7ah:
ld de,0000ah
l9e85h:
push hl
ld hl,(0a412hdata_a412)
add hl,de
ex de,hl
pop hl
call 09dbehsub_09dbeh call 0bbc0h;; gra move absolutesub_9e52h: call 09ed2hsub_09ed2h call sub_9de6hsub_9e98h:sub_09de6h ld hl,(0a410hdata_a410)
ld a,0ffh
cp h
call 0bb1eh ;; km test key
ret z
jp l9e52hsub_9e52h
l9ea9h:
call 09eb7hsub_09eb7h
ld a,02fh
call 0bb1eh ;; km test key
ret z
ld hl,(0a41chdata_a41c) ld de,(0a41ahdata_a41a) call 0bbc0h;; gra move absolute ld hl,(0a410hdata_a410) ld de,(0a412hdata_a412) ld a,(0a41ehdata_a41e) call 0bbdeh;; gra set pen ld (0a41chdata_a41c),hl ld (0a41ahdata_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 09d35hsub_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,(0a41ahdata_a41a) ld de,(0a412hdata_a412)l9efeh:
and a
sbc hl,de
ret z
jp p,09ecbhl9ecbh
ld hl,l9f15h
jp 09ecehl09eceh l9ecbh: ld hl,09ed2hsub_9ed2hl9f0ehl9eceh:
ld (l9e52h+1),hl
ret
sub_9ed2h:
call sub_9e98h
ld de,0ffech
ld hl,00000h
call 0bbc3h;; gra move relative ld bc,(0a420hdata_a420)l9f22h:
push bc
ld de,00000h
ld hl,00014h
call 0bbf9h;; gra line relative
call sub_9cc1h
ld a,0ffh
cp h
jp nz,l9efehsub_9efehsub_9ef5h: ld hl,(0a422hdata_a422) ld (0a410hdata_a410),hl jp l9d9ahsub_9d9ah sub_9efeh: ld (0a422hdata_a422),hl ld de,(0a416hdata_a416)
ld hl,0ffech
call 0bbc3h;; gra move relative
pop bc
djnz l9f22h
ld hl,0ffffh
ld (0a410hdata_a410),hl
ret
sub_9f82h:
call sub_9e98h
ld bc,(0a420hdata_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,l9ef5hsub_9ef5h ld (0a422hdata_0a422),hl ld de,(0a416hdata_a416)
ld hl,00000h
and a
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
ld a,00eh
ld (0a0e2hla0e1+1),a ld a,(la133hdata_a133)
bit 1,a
jr z,la083h
ld a,000h ;; NOP instruction ld (la124hla124),a
ld a,007h
ld (0a0e2hla0e1+1),a
la083h:
call 0bd28h;; mc reset printer
ld de,00000h
ld hl,00000h
ld (0a12dhdata_a12d),desub_a050h:
ld a,000h
ld (0a12chdata_a12c),a;; accumulated pixels. ld de,(0a12dhdata_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,(la133hdata_a133)
bit 0,a
jr z,la0f4hla0b4h ld a,002h ;; number of columns high byte? call 0bd2bh;; mc print char ld a,(0a12chdata_a12c);; pixel data call 0bd2bh;; mc print char
jr la0f9h
la0f9h:
ld a,(0a12chdata_a12c);; pixel data call 0bd2bh;; mc print charsub_a0ffh:
call sub_a115h
inc hl
ld a,h
cp 001h
jp nz,la050hsub_a10dh:sub_a050h
ld a,l
cp 090h
jp nz,la050hsub_a050h ld a,00ahsub_a115h: ;; next line call 0bd2bh;; mc print char ld a,02fh ;; 47 - space call 0bb1ehsub_a11dh:;; km test key
ret nz
ld hl,(0a12dhdata_a12d)la0e1:
ld de,0000eh
add hl,de
ld (0a12dhdata_a12d),hl
ld hl,00000h
call sub_a10dh
ld de,(0a12dhdata_a12d)
ld a,d
cp 002h
jp nz,la050hsub_a050h
ld a,e
cp 084h
jp nz,la050hsub_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,(0a12chdata_a12c)
add hl,de
ld (0a12chdata_a12c),hl
ret
sub_a10dh: ld (0a12fhdata_a12f),hl ld (0a131hdata_a131),de
ret
sub_a115h: ld hl,(0a12fhdata_a12f) ld de,(0a131hdata_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
ret
cp 000h
jr nz,la19dh
ld a,b
la1aah:
ld (0a254hdata_a254),a call 0bbc6h;; gra ask cursor ld (la250hdata_a250),hl ld (la250hdata_a250+2),de
la1b7h:
call 0bb99h;; txt get paper ld (la1f9hpen_cmp+1),a
ld bc,00000h
ld (0a24chdata_a24c),bc ld (0a24ehdata_a24e),bc call 0a210hsub_a210la18bh: ld a,02fh ;; 47 - space call 0bb1eh;; km test key
ret nz
ld hl,(0a24ehdata_a24e)
inc hl
inc hl
ld hl,00000h
la1deh:
ld (0a24ehdata_a24e),hl
ld bc,05398h
add hl,bc
ld (la1aahbuffer_addr3+2),hl;; +2 to skip ED,53buffer_addr3:
ld de,(055e0h)
ld hl,(0a24ehdata_a24e)
sub_a1efh:
ld bc,057e4h
add hl,bc
ld (la1b7hbuffer_addr4+1),hl;; +1 to skip 22buffer_addr4:
ld hl,(05a2ch)
ld bc,00000h
ld a,(0a254hdata_a254)
ld c,a
ex de,hl
dec hl
call sub_a1efh
ld hl,(0a24ehdata_a24e) ld de,(0a24chdata_a24c)
inc hl
inc hl
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 (la250hdata_a250),hl ld (la250h+2data_a252),de
push bc
call 0a210hsub_0a210h
pop bc
la248h:
ld hl,(la257hdata_a257) ld de,(0a255hdata_a255)
ret
inc hl
inc hl
ld hl,00000h
la267h:
ld (0a24chdata_a24c),hl
ld bc,05398h
add hl,bc
ld de,(la250h+2data_a252) ld (la237hbuffer_addr1+2),hl;; +2 to skip ED, 53buffer_addr1:
ld (05648h),de
ld hl,(0a24chdata_a24c)
ld bc,057e4h
add hl,bc
ld de,(la250hdata_a250) ld (la248hbuffer_addr+12),hl;; +2 to skip ED, 53buffer_addr2:
ld (05a94h),de
ret
;;Data areadata_a24c: defw 02b0hdata_a24e: defw 0248hdata_a250: defw 0behdata_a252: defw 0120hdata_a254: defb 04hdata_a255: defw 0120hdata_a257: defw 0bch ;; detected light pen positiondata_a410: defw 0data_a412: defw 0;; memory/buffer addressdata_a414: defw 0data_a416: defw 0data_a418: defw 0 ;; gra x,y positiondata_a41a: defw 0data_a41c: defw 0;; graphics pendata_a41e: defb 0 defb 0data_a420: defw 0 end</pre>
[[Category:Source code]]