Tapeta na Amstradzie. Ekran główny pod adresem &c000 przełączany w przerwaniach 1/50 sek z ekranem w &4000.
Skorzystałem z licznika scrolla pod adresem &b72d
Tapeta nie jest scrollowana a ekran główny jest.
wrzuciłem na Youtuba filmik z efektem zobaczymy czy opublikują go w 60Hz
https://youtu.be/A0s2uqhhmoc .....narazie nie działa. klatki z tapetą nie widać.
Dorzucam 1sek spakowany zipem film jakby ktoś chciał zobaczyć.
Zrzut ekranu z JavaCPC przy włączonym DeInterleaced
I gif który ma migać 60Hz
Zalączam snapa.
na 60Hz monitorze najlepiej widać co się dzieje w Caprice32 ustawianym na custom turbo 121% i włączonym Turbo.
jestem zaskoczony, że na CRTC 0 nie można ustawić koloru dla INK 3 , w WinAPE działa dopiero na CRTC 2 , a w Caprice na CRTC 1.
Kod procedury asemblerowej wygląda tak.
;orginalna procedura CPC od #B941
;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
db #AF
db #AF
org #9010
;nowa procedura przerwania 300Hz
int:
push bc
push AF
push hl
push de
ld hl,pasek
ld C,(HL) ;nr paska (od gory 6,5,4,3,2,1)
ld a,c
cp 6
jp nz,nvst
ld b,#f5
in a,(c) ;sprwdzenie czy pasek 6 jest w czasie synchronizacji pionowej
rra
jp c,vs
jp koniec
vs:
push bc
xor a
ld b,a
ld h,a
ld A,(#b72D) ;firmwarowy licznik scrolla
neg
ld l,a
sla l
rl h
sla l
rl h
sla l
rl h
ld c,l ;Ax8
ld b,h
sla l
rl h
sla l
rl h ;Ax32
add hl,bc ;A*(32+8)
ld a,#03
and h
ld h,a ;wyliczony w HL offset scrolla 0-1023
ld bc,#bc00
ld a,12
out (c),a ; bc00,12
tu:
jr first
first:
ld a,tam-first
ld (tu+1),A
ld A,#10
ld l,0
;or h
jr tim
tam:
xor a
ld (tu+1),A
ld A,#30
or h
tim:
inc b
out (c),a ;bd00,(12)<- #10, #30 + $offset H <-#10 - &4000, #30 - &C000
dec b
ld a,13
out (c),a ;bc00,13
inc b
ld a,l
out (c),l ;bd00,(13)<- $offset L
pop bc
nvst:
;----------------
po_pasku_nr6:
sla c
sla c
ld HL,dane
ld b,#ff
inc b
add HL,bc
ld a,(HL)
ld d,a ;color0
inc hl
ld a,(HL)
ld e,a ;color1
inc hl
ld a,(HL)
ld (color),a ;color_border
inc hl
ld a,(HL)
ld (tryb),a ;tryb
; ---------------------
ld hl,pasek
ld c,(hl)
dec c
jr nz,omin
ld c,6
omin:
ld (HL),c
delay:
ld b,#1
loop:
djnz loop
;---------------- szybkie wlanczenie trybu tylko na jedna linie
ld bc,#7fff
inc c
;ld a,(tryb)
or #8C
ld h,a
out (c),a
;---------------------------------
ld a,d
out (c), c
out (c), a
inc c ;pen 1
ld a,e
out (c), c
out (c), a
ld c,#10 ;border
ld a,(color)
out (c), c
out (c), a
;---------------- wolne ale trwale wlonczenie trybu
ld a,h
and #3
call #BD1C
;--------------------------------------------------
koniec:
pop de
pop hl
pop AF
pop bc
;odtworzenie funkcjonalnosci czesci nadpisanej procedury oryginalnej.
EX AF,AF'
JP C,#B978
JP #B945
;orginalna procedura CPC od #B941
;di
;EX AF,AF'
;JR C,#B978
;--^-- czesc nadpisana
;B945:
;EXX
;...
color:
db #78
tryb:
db #2
pasek:
db #1 ;nr paska (od gory 6,5,4,3,2,1)
dane:
db #FF ;pasek nr 0 nie istniejacy.
db #ff
db #FF
db #ff
color1t:
db #47 ;&90D9
color1p:
db #43 ;&90DA
color1b:
db #52 ;&90DB
tryb1:
db #81 ;&90DC
color2t:
db #47 ;&90DD
color2p:
db #43 ;&90DE
color2b:
db #4D ;&90DF
tryb2:
db #81 ;&90E0
color3t:
db #47 ;&90E1
color3p:
db #43
color3b:
db #4a
tryb3:
db #81
color4t:
db #47 ;&90E5
color4p:
db #43
color4b:
db #45
tryb4:
db #81
color5t:
db #47 ;&90E9
color5p:
db #43
color5b:
db #42
tryb5:
db #81
color6t:
db #47 ;&90ED
color6p:
db #43
color6b:
db #40
tryb6:
db #81 ;&90F0