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