
Сообщение от
Improver
Если глянуть исходники МДОС Т-72, то там палитру тоже устанавливали за два раза, но между ними была небольшая задержка:
Код:
...
L_F613: OUT 00Ch ; палитра -- установка физического цвета
PUSH PSW
POP PSW
PUSH PSW
POP PSW
DCR E
DCR D ; (счётчик -1)
OUT 00Ch ; палитра -- установка физического цвета, ещё раз
...
Думаю, такой вариант можно считать оптимальным и по скорости, и по объёму.
Все ПЗУ на Векторах, как правило, имели при запуске команду отключения КД. Кроме того, квази-диск отключает БЛК-СБР -- там это сделано аппаратно, таким образом, если демку будут запускать, например, загрузкой "с ленты", или из загрузочной записи дискеты, то можно этот момент пропустить, а если из под МДОСа -- то эти команды обязательны.
Спасибо за этот сниппет. Очень класный.
Вот мой вариант который может тищить данные с квазидиска и сетить палитру без отключения прерываний. За основу был взят приведенный тобой код.
Код:
; Set palette copied from the ram-disk no blocking interruptions
; input:
; de - the addr of the first item in the palette
; use:
; hl, bc, a
PALETTE_COLORS = 16
SetPaletteFromRamDisk:
hlt
; store sp
lxi h, $0000
dad sp
shld @restoreSp+1
; copy unpacked data into the ram_disk
xchg
RAM_DISK_ON()
sphl
mvi a, PORT0_OUT_OUT
out 0
mvi e, $00
@loop:
pop b
; even color
mov a, e
out 2
mov a, c
out $0c
xthl ; delay 24
xthl ; delay 24
inr e ; counter plus delay 8
inr h ; delay 8
dcr h ; delay 8
out $0c
; odd color
mov a, e
out 2
mov a, b
out $0c
xthl ; delay 24
xthl ; delay 24
inr e ; counter plus delay 8
inr h ; delay 8
dcr h ; delay 8
out $0c
mov a, e
cpi PALETTE_COLORS
jnz @loop
@restoreSp: lxi sp, TEMP_ADDR
RAM_DISK_OFF()
ret
.closelabels
; mount the ram-disk
.macro RAM_DISK_ON(_command = RAM_DISK0_B0_STACK)
mvi a, _command
out $10
.endmacro
; dismount the ram-disk
.macro RAM_DISK_OFF()
xra a
out $10
.endmacro