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). Ну вот вроде бы на сегодня и все...