music: Midisoft/Energy Minds
(C) Eraser/Delirium Tremens
---------------------------------FUNeral--
рочитав статейку в DJV#05 о
журнальной оболочке, у меня вкралось
сомнение насчет "оптимизации". Енто куда
же годно, господа!!! В журнале предлагают
примерно такую шнягу:
LD IX,Win1 ; основное окно
CALL WIN ; нарисовали
CALL SELECT ; опрос
LD A,(OPC) ; номер опции
LD HL,TABLICA_1 ; переход по
JP JP_HL ; таблице
Win1 DEFB x,у,len,high,еще че-нибудь
DEFB "Шняга 1",13
DEFB "Шняга 2",13
DEFB "Шняга 3",13
DEFB "Шняга 4",13
DEFB "Шняга 5",0
TABLICA_1
DEFW OPC_1 ; таблица
DEFW OPC_2
DEFW OPC_3
...
OPC_1 ...
; загружаем данные очень
; примитивным образом:
LD A,1 ; к примеру,
CALL RAM_PAGE ; музыку
LD HL,ХХХХ
LD DE,YYYY
LD В,10
CALL LOAD
CALL DEPACK_MUS
LD A,3 ; текст
CALL RAM_PAGE
LD HL,ZZZZ
LD DE,NNNN
LD В,10
CALL LOAD
CALL DEPACK_TXT
...
JP VIEW ; запуск
; листалки...
Люди! Ведь енто все полный вперед !!!
Это ведь Lamerz Must Die!!! Или не так???
Подумав, что у автора статьи съехал
чердак, я полез в оболочки журналов... и
вижу - он съехал не только у него:(
Так что опупев от съеxавшиx чердаков,
Eraser решил их поправить...
Вектор окна имеет следующий вид:
Win1 DEFB x,у,len,high,...
DEFW Txt1,Mus1,Spr1; можно и без
; этого
DEFB "OPC_1",13 ; опция 1
DEFB "OPC_2",13 ; опция 2
DEFB "OPC_3",13 ; опция 3
DEFB "OPC_4",13 ; опция 4
DEFB "OPC_5",0 ; опция 5
...
;описатель данных для текстов, к примеру:
;
; DEFW TrkSec1
; DEFB Blk1
; DEFW TrkSec2
; DEFB Blk2
; ...
;если Blk=#00, то данная опция имеет
;вложенность c описателем Win2, а если #FF
;(как во FUNearl'е), то это приложение...
Txt1 DEFW #аааа ; TXT_LEN
DEFB #аа ; TXT_BLK
DEFW Win2 ; во 2 опции есть
DEFB #00 ; вложенность
DEFW #ЬЬЬЬ
DEFB #ЬЬ
DEFW #0000 ; а здесь у нас
DEFB #FF ; приложение
...
;описатель музыки, аналoгични предыдущему,
;только если #00, то музыки нет...
Mus1 DEFW #cccc
DEFB #dd
DEFW #hhhh
DEFB #hh
DEFW #ееее
DEFB #ее
DEFW #ffff
DEFB #ff
...
;описатель cпарайтoв
;если Blk=0, то cпарйты absent...
Spr1 DEFW #gggg
DEFB #gg
DEFW #mmmm
DEFB #mm
DEFW #nnnn
DEFB #nn
DEFW #oooo
DEFB #oo
;..
Win2 DEFB x,у,len,high,...
DEFW Txt2,Mus2,Spr2
DEFB "ZX_1",13 ; опция 1
DEFB "ZX_2",13 ; опция 2
DEFB "ZX_3",13 ; опция 3
DEFB "ZX_4",13 ; опция 4
DEFB "ZX_5",0 ; опция 5
Txt2 DEFW WinЗ
DEFB #00
DEFW #аааа
DEFB #аа
DEFW #ЬЬЬЬ
DEFB #ЬЬ
DEFW #zzzz
DEFB #zz
Mus2 DEFW #cccc
DEFB #dd
DEFW #hhhh
DEFB #hh
DEFW #ееее
DEFB #ее
DEFW #ffff
DEFB #ff
Spr2 DEFW #gggg
DEFB #gg
DEFW #mmmm
DEFB #mm
DEFW #nnnn
DEFB #nn
DEFW #oooo
DEFB #oo
WinЗ ....
; и так далее...
C описателем разобрались. Я думаю, что
здесь все понятно , и для вас не составит
труда сделать оболочку, поддерживающую
данное окно.
А теперь перейдем непосредственно к
ядру оболочки...
LD IX,MainWin ; описатель главного окна
CALL OPEN_W ; запомнили вектор окна на стеке окон,
; для пocледующещегo доступа
CALL DRAW_W ; нарисовали
CONT_1 CALL WINSEL ; селектор
LD A,(OPC) ; номер опции
CP #FF ; если "ткнули" мимо опции, то закры-
; ваем
JR Z,CLOSE_W ; пocледнне окно
CALL INIT_DAT ; настраиваем данные для загрузки
; или открытия окна
LD A,(TXT_BLK) ; если BLK=0, то, значит, есть
OR A ; вложенность,
JR NZ,LOAD ; иначе загружажеm данные
CALL OPEN_W ; открываем okkho (в IX у нас адрес
; окна, взятый из описатель текущего
; окна
CALL DRAW_W ; рисуем его
JR CONT_1 ; селектор...
DRAW_W рисуем окно
RET
OPEN_W заносим на стек окон
вектор окна, для последую-
щего доступа
RET
CLOSE_W закрытие окна - удаление вектора
последнего окна
Если последнее окно является
matepuhckum, то переходим на
адрес CONT_1,
вызываем процедуру REFRESH
RET
REFRESH процедура берет последовательно
все вектора (c самого первого до
последнего) и строит их
на экране (хотя если вы использу-
ете буфер для окон, то восстанав-
ливаем область под последним ок-
ном)
RET
LOAD загрузка, настроенных предва-
рительных данных
...
CALL REFRESH
JP CONT_1
Если вам нужна вложенность для проги,
то описатель окна будет выглядить следую-
щим образом:
Win1 DEFB x,у,len,high,...
DEFB "OPC_1",13 ; опция 1
DEFB "OPC_2",13 ; опция 2
DEFB "OPC_3",13 ; опция 3
DEFB "OPC_4",13 ; опция 4
DEFB "OPC_5",0 ; опция 5
;описатель адресов для перехода в опциях
DEFW #аааа ; переход на адрес #аааа,
DEFB #00 ; т.к. здесь #00
DEFW #zzzz
DEFB #00
;описатель адресов для перехода в опциях
DEFW #аааа ; переход на адрес #аааа,
DEFB #00 ; т.к. здесь #00
DEFW #zzzz
DEFB #00
DEFW Win2 ; есть вложенность, т.к.
DEFB #01 ; здесь #01
DEFW #ЬЬЬЬ
DEFB #ЬЬ
...
Вроде бы все понятно. Ядро похоже на
предыдущее, но только с той разницей, что
процедура LOAD должна быть заменена на
процедуру JP_HL, т.е. JP_HL должна брать
из переменной JP_Adr, в которой содержится
адрес перехода, взятого из описателя
адресов перехода, и переходить на
(JP_Adr).
Ну вот вроде бы на сегодня и все...
Other articles: