Wrzucam procedurę używającą, przerwań. Postarałem się podłączyć ją przed firmwarową obsługa przerwań żeby złapać je jak najszybciej. Wyszło na to, że CPC w większości skacze z &0038 do &B941 rozkazem z ROMu a nie RAMu. Dlatego rozkaz skoku do swojej procedury umieściłem pod &B942 a zniszczone w ten sposób rozkazy istniejące odtworzyłem na końcu swojej procedury, żeby procedura firmwarowa nie ucierpiała.
procedura przechowywana jest w rem. Potem kopiowana do miejsca gdzie działa czyli &9000.
Z ciekawostek to w rem kłopotliwe jest przechowywanie bajtów chr$(&80), bo wyglądają identycznie jak chr$(&20) czyli jest to spacja. Takiego bajtu nie da się skopiować klawiszem COPY. zatem postanowiłem unikać w REM kodu 0 i 128 (&80).
Jestem zaskoczony jak wysoko zaczynają się przerwania. Przeważnie ekran krojony jest na 6 kawałków w tym bitmapa na 4. Tutaj po paskach bordera widać, że przerwaniami można np odkroić ostatnią 25 linię tekstu.
;oryginalna procedura CPC od #B941 do której skacze CPC z &0038
;di
;EX AF,AF'
;JR C,#B978
;--^-- czesc nadpisana
;B945:
;EXX
;...
;zmiana startu procedury przerwania
;org #B941
;DI
;JP int ;#9010
org #9000
set_:
di
ld HL,#B942
ld (HL),#C3 ;kod JP
inc hl
ld (hl),#10 ;kod adres L
inc hl
ld (hl),#90 ;kod adres H
ei
ret
org #900E
color0:
db #55
org #900F
color1:
db #54
org #9010
;nowa procedura przerwania
int:
push bc
push AF
ld b,#1 ;
;org #9013
;db #01
loop:
djnz loop
ld a,(color0)
ld c,#7F
inc c
ld b,a
and c
JR NZ,jedynka
zero:
ld a,b
or c
ld (color0),a
ld a,(color1)
jR omin
jedynka:
ld a,b
and #7F
ld (color0),a
omin:
ld bc, &7f10
out (c), c
out (c), a
pop AF
pop bc
;odtworzenie funkcjonalnosci czesci nadpisanej procedury oryginalnej.
EX AF,AF'
JP C,#B978
JP #B945
;oryginalna procedura CPC od #B941
;di
;EX AF,AF'
;JR C,#B978
;--^-- czesc nadpisana
;B945:
;EXX
;...
Procedura kopiująca z REM do &9000 bez zer i &80 wygląda tak:
org #260
xor a
ld b,a ;#00
ld c,#B0
ld d,#90
ld e,a ;#00
ld hl,#017F
inc hl ;#0180
ldir
ret