(c) deadie/horrorsoft/cpu
вообще-то я вот о чём. пока я кодил, а точнее собирал horrorfastest , мне в голову закралась крамольная мысля об autoconfig'е для всяких там multicolor'ов и border'ных эффектов. для меня до сих пор остается загадкой, почему demomaker'ы фиксят такие эффекты только (в основном) под две модели спектрума ( pentagon и scorpion ). как многие знают, для создания чего-то на бордере или мультиколора надо знать количество строк (линий) экрана /tpl/ и количество тактов на одну строку (линию) /lps/. естественно, исходя из этих значений и задаются константы для процедур вывода на экран. вот эти самые значения можно получить, использовав нижеприведенные процедурки. замечу, что истинные значения вы получите, только если выключен турборежим. и для начала приведу процедуру, которая определяет, включен или выключен turbo mode:
attention!!
на авторство нижеприведенных процедур
не претендую!
;определение состояния turbo mode
; вх: -
;вых: a=0 - выкл, a=1 - вкл
turbo call int_trb
ld a,b
cp #00
jr z,turboff
cp #02
jr nc,turbon
ld a,c
cp #41
jr nc,turbon
turboff xor a
ret
turbon ld a,1
ret
trb_int di
ld a,#c3
ld (#bcbc),a
ld hl,int_tr1
ld (#bcbd),hl
ld a,#ba
ld i,a
im 2
ld de,#0000
ei
halt
ld hl,int_tr2
ld (#bcbd),hl
trb_in3 inc de
ld b,#0f
djnz $
ld a,r
jr int_tr3
trb_in1 ei
ret
trb_in2 pop hl
ld c,e
ld b,d
im 1
ei
ret
а теперь самое главное - процедуры расчета lps и tpl:
;рассчет кол-ва строк растра
;(линий в экране)
;вх:
;вых: de - lps
clc_lps call im2set
ld a,#c3
ld (#fefe),a
ld hl,lps2
ld (#feff),hl
ld de,0
ei
halt
ld hl,lps3
ld (#feff),hl
lps1 inc de
ld b,#0f
djnz $
ld a,r
jr lps1
lps2 ei
ret
lps3 pop hl
call im1set
ei
ret
почти во всех спектрумах сделано 312 либо 320 строчек (к примеру: в фирменном 312, в пентагоне - 320). продолжим:
;рассчет кол-ва тактов в строке растра
;(линии экрана)
;вх: -
;вых: a - tpl
clc_tpl call im2set
ld a,#c3
ld (#fefe),a
ld hl,tpl1
ld (#feff),hl
ld de,0
ld hl,tpl2
ei
halt
tpl1 ld (#feff),hl
ld hl,tpl3
ei
halt
tpl2 ld (#feff),hl
nop
nop
nop
inc hl
ei
inc de
jp $-1
tpl3 pop hl
pop hl
ex de,hl
add hl,hl
add hl,hl
add hl,hl
ld a,n ;n=0 -312, иначе -320 строк
or a;^сюда заносите число
ld bc,156
jr z,tpl4;156 (312) и 160 (320)
ld bc,160
xor a
tpl4 or a
sbc hl,bc
inc a
jr nc,tpl4
call im1set
ei
ret
;процедурки установки прерываний im2set di
im2set di
ld hl,#fe00
ld a,h
ld b,l
im2setl ld (hl),a
dec hl
djnz im2setl
ld (hl),a
ld a,h
ld i,a
im 2
ret
im1set di
ld a,#3f
ld i,a
im 1
ret
а длина int'а в тактах рассчитывается еще проще: tpl*lps (только для nowait спеков ) и все!
+-------+---------+---------+
| lps | 312 tpl | 320 tpl |
+-------+---------+---------|
| 216 | 67392 | 69120 |
| 220 | 68640 | 70400 |
| 224 | 69888 | 71680 |
| 228 | 71136 | 72960 |
| 232 | 72384 | 74240 |
+-------+---------+---------+
вообще-то, для настройки необходимо знать положение int'а относительно начала кадра, но об этом в следующей серии...
вместо ps: я не кодер, поэтому мои измышления по поводу autoconfig'а надо взять за теорему, которую надо еще доказать. надеюсь, что мои догадки все же превратятся и в аксиому, а эта информация вам хоть как-как поможет.