;------------------ ;CPC Mousepack 2.0 disassembly, 8/2010 by nocash ;disassembly of I/O part used by MOUSEDEM.BAS ;------------------ 9000 pos_x dw .... ;x coord (0..639) (0=left, 639=top) 9002 pos_y dw .... ;y coord (0..399) (0=bottom, 399=top) ;------------------ irq_handler: ;called at 300Hz rate 90AE CD 1F 96 call 961F ;-dummy (ret) 90B1 3A BF B8 ld a,[B8BFh] ;\irq counter (1..6) 90B4 3D dec a ; exit if non-vblank irq 90B5 C0 ret nz ;/ 90B6 01 0E F4 ld bc,F40Eh ;\PPI.A (PSG index) 90B9 ED 49 out [bc],c ;[F4XXh]=0Eh ;/ 90BB 06 F6 ld b,F6h ;\ 90BD ED 78 in a,[bc] ;[F6xxh] ; PPI.C (PSG: write index, row0) 90BF E6 30 and a,30h ;cas.motor.data ; (with old cassette bits, 90C1 4F ld c,a ;typ=00h (cas=off); which are typically zero) 90C2 F6 C0 or a,C0h ;typ=C0h ; 90C4 ED 79 out [bc],a ;[F6xxh]=typ C0h ;/ 90C6 ED 49 out [bc],c ;[F6xxh]=typ 00h ;-PPI.C (PSG: inactive, row0) 90C8 04 inc b ;F7h ;\ 90C9 3E 92 ld a,92h ; PPI.CTRL (direction=read) 90CB ED 79 out [bc],a ;[F7xxh]=92h ;/ 90CD C5 push bc ;b=F7h, C=inactive 90CE 3E 49 ld a,49h ;bc1.bdir=1,row=9 ;\ 90D0 B1 or a,c ;typ=49h ; precalc ppi.c values 90D1 4F ld c,a ;typ=49h ; for row 9 and row 6 90D2 5F ld e,a ;typ=49h ; (stick1 and stick2) 90D3 D6 03 sub a,03h ;typ=46h ;row6 ; 90D5 57 ld d,a ;typ=46h ;/ ;--- 90D6 06 F6 ld b,F6h ;\PPI.C (PSG: data read, row9) 90D8 ED 49 out [bc],c ;[F6xxh]=typ 49h ;/ 90DA 06 0F ld b,0Fh ;7 ;\delay (197 clks) 90DC 10 FE djnz $ ;13*14+8 ;/ 90DE 06 F4 ld b,F4h ;\ 90E0 ED 78 in a,[bc] ; 90E2 87 add a,a ; 90E3 87 add a,a ; read pos x (msb) 90E4 87 add a,a ; 90E5 87 add a,a ; 90E6 67 ld h,a ;/ 90E7 06 0F ld b,0Fh ;\delay (197 clks) 90E9 10 FE djnz $ ;/ 90EB 06 F4 ld b,F4h ;\ 90ED ED 78 in a,[bc] ; 90EF E6 0F and a,0Fh ; read pos x (lsb) 90F1 B4 or a,h ;merge ;positive=lt ; 90F2 ED 44 neg ;neg ;positive=rt ; 90F4 67 ld h,a ;/ 90F5 06 F6 ld b,F6h ;\PPI.C (PSG: data read, row6) 90F7 ED 51 out [bc],d ;[F6xxh]=typ 46h ;/ ;--- 90F9 ED 59 out [bc],e ;[F6xxh]=typ 49h ;-PPI.C (PSG: data read, row9) 90FB 06 05 ld b,05h ;7 ;\short delay (67 clks) 90FD 10 FE djnz $ ;13*4+8 ;/ 90FF 06 F4 ld b,F4h ;\ 9101 ED 78 in a,[bc] ; 9103 87 add a,a ; 9104 87 add a,a ; read pos y (msb) 9105 87 add a,a ; 9106 87 add a,a ; 9107 6F ld l,a ;/ 9108 06 14 ld b,14h ;7 ;\delay (262 clks) 910A 10 FE djnz $ ;13*19+8 ;/ 910C 06 F4 ld b,F4h ;\ 910E ED 78 in a,[bc] ; 9110 E6 0F and a,0Fh ; read pos y (lsb) 9112 B5 or a,l ;merge ;positive=up ; 9113 6F ld l,a ;/ 9114 06 F6 ld b,F6h ;\PPI.C (PSG: data read, row6) 9116 ED 51 out [bc],d ;[F6xxh]=typ 46h ;/ ;--- 9118 C1 pop bc ;b=F7h, C=inactive 9119 3E 82 ld a,82h ;\PPI.CTRL (direction=write) 911B ED 79 out [bc],a ;[F7xxh]=82h ;/ 911D 05 dec b ;F6h ;\PPI.C (PSG: inactive, row0) 911E ED 49 out [bc],c ;[F6xxh]=typ 00h ;/ 9120 E5 push hl 9121 7C ld a,h ;\ 9122 2A 00 90 ld hl,[pos_x] ; raise pos x (crappy: 9125 CD 45 95 call add_hl_a ; without doublespeed threshold) 9128 22 00 90 ld [pos_x],hl ;/ 912B E1 pop hl 912C 7D ld a,l ;\ 912D 2A 02 90 ld hl,[pos_y] ; raise pos y (crappy: 9130 CD 45 95 call add_hl_a ; without doublespeed threshold) 9133 22 02 90 ld [pos_y],hl ;/ 9136 11 90 01 ld de,0190h ;=400 decimal ;\ 9139 7C ld a,h ; 913A B7 or a,a ; 913B ED 52 sbc hl,de ; 913D DA 50 91 jp c,@@this_pos_y ; clip pos y to 0..399 9140 1B dec de ;018Fh ;=399 decimal ; 9141 ED 53 02 90 ld [pos_y],de ; 9145 FE 80 cmp a,80 ; 9147 DA 50 91 jp c,@@this_pos_y ; 914A 21 00 00 ld hl,0000h ; 914D 22 02 90 ld [pos_y],hl ; @@this_pos_y: ;/ 9150 11 80 02 ld de,0280h ;=640 decimal ;\ 9153 2A 00 90 ld hl,[pos_x] ; 9156 7C ld a,h ; 9157 B7 or a,a ; 9158 ED 52 sbc hl,de ; clip pos x to 0..639 915A D8 ret c ;=this_pos_x ; 915B 1B dec de ;027Fh ;=639 decimal ; 915C ED 53 00 90 ld [pos_x],de ; 9160 FE 80 cmp a,80 ; 9162 D8 ret c ;=this_pos_x ; 9163 21 00 00 ld hl,0000h ; 9166 22 00 90 ld [pos_x],hl ;/ 9169 C9 ret ;------------------ add_hl_a: ;HL=HL+A ;(A = sign-expanded) 9545 CB 7F bit 7,a 9547 28 01 jr z,@@positive 9549 25 dec h @@positive: 954A 85 add a,l 954B 6F ld l,a 954C D0 ret nc 954D 24 inc h 954E C9 ret ;------------------