(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'а надо взять за теорему, которую надо еще доказать. надеюсь, что мои догадки все же превратятся и в аксиому, а эта информация вам хоть как-как поможет.