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