; Метки "@@@" - закоммент. код, чтобы не отрабатывал "Enter" для выхода из ; ListBox-а. ; Метки "###" - отработка "Enter" как Tab ; ; Внутренние сообщения evNothing: EQU 0 ; нет событий evMouseFr: EQU 1 ; нажата кнопка у мыши evKeyboard: EQU 2 ; нажата клавиша evCombKey: EQU 3 ; нажата комбинация клавиш evCommand: EQU 4 ; передача команды evMessage: EQU 5 ; передача сообщения TextLine: EQU 1 InputLine: EQU 2 ClRadioBut: EQU 3 ClCheckBut: EQU 4 ListBox: EQU 5 Button: EQU 9 Frame: EQU 10 cmOkey: EQU 36h cmCancel: EQU 37h cmOptions: EQU 38h cmSave: EQU 39h CTlabTD: EQU 47h CTkeypadD: EQU 4Ah CTcancD: EQU 36h CTokD: EQU 37h CThelpD: EQU 35h CTbox1D: EQU 4Bh CTbox2D: EQU 4Ch msHiddInvr: EQU 83h msNewElem: EQU 84h ; не отслеживается ; настроить курсор черточкой ;call SetCursor ; очистить экран CALL ClearDesk ; уст. мышку в центр экрана LD HL,312 ; X координата (0-639) LD DE,120 ; Y координата (0-255) LD C,4 RST ToDSS.Mouse ; сбросить указатели ListBox`ов LD HL,0 LD (CurElem0),HL LD (CurElem1),HL ;!FIXIT CURSOR переделать на дос MainLOOP: ; подменить вектор на свой (для мигания курсора) ; ld hl,(0039h) ;rdlow ok ; ld (vect),hl ; ld hl,rst38 ; ld (0039h),hl ; Loop1: CALL SetList ; настроить список дисководов Loop2: LD HL,WinMain1 CALL DialogW LD A,(HL) CP cmCancel ;jp z,Exit1 JP Z,Exit CP cmOptions JR NZ,.contin ; LD HL,WinOptions CALL DialogW LD A,(HL) CP cmOkey JR Z,Loop1 CP cmSave JR NZ,Loop2 CALL SaveInit ; сохр. настройки флоповодов JR Loop1 ; .contin: ; восст. вектор ; ld hl,(vect) ;!FIXIT CURSOR переделать курсор на дос и убрать перехвать прерываний ; ld (0039h),hl CALL SetDrive ; уст. заданный формат флоповодов LD A,(CurElem0) LD (DISK),A ; для п/п формат. ADD A,"A" LD (DskName),A ; буква диска LD (LDISK),A ; блок настройки под выбранный формат CALL Setup_Map ; настройка ширины карты (и др.) CALL FSETUP ; настр. программу на формат дискеты ;-- ;-- Loop3: CALL Clear1 LD HL,InsDiskette ; "Вставьте диск в дисковод" CALL DialogW ; отк. окно запроса LD A,(HL) CP cmCancel JR Z,MainLOOP ; назад в нач. окно fformat-а ; LD A,(ColDialWn) PUSH AF LD A,37h ; цвет окна форматирования LD (ColDialWn),A LD HL,WinMain2 ; окно процесса форматирования CALL PutDialWn POP AF LD (ColDialWn),A CALL FFORMAT JR Loop3 ;!FIXIT CURSOR переделать курсор на дос и убрать перехвать прерываний ;Exit1: ; восст. вектор ; ld hl,(vect) ; ld (0039h),hl ;jp Exit ; Настроить список дисководов согласно заданным опциям SetList: LD A," " LD (DiskB),A ; начало строки диска "B:" LD C,0 ; диск "A:" LD HL,DriveA ; 3 ячейки опций диска LD DE,DiskA+2 ; строка назначения CALL SetDiskList LD C,1 ; диск "B:" LD HL,DriveB ; 3 ячейки опций диска LD DE,DiskB+2 ; строка назначения ; Настройка строки дисковода согласно заданным опциям ; вх: C=диск (0=A,1=B) ; HL=адрес 3-х ячеек опций диска ; DE=адрес строки назначения SetDiskList: XOR A CP (HL) JR NZ,.loc1 ; 1.44Mb 3.5" INC HL CP (HL) JR NZ,.loc2 ; 720kB 5.25" ; no device "B:" LD (DiskB),A ; стоп-байт перед строкой RET .loc1: LD HL,.loc4 JR .loc3 .loc2: LD HL,.loc5 .loc3: LD A,"A" ADD A,C .loc6: LD (HL),A LD BC,10 LDIR RET .loc4: DB "X: 1.44 Mb" .loc5: DB "X: 720 kB" ; DialogW: PUSH HL ; очистить буфер клавы LD BC,3135h RST ToDSS POP HL CALL Dialog LD HL,what LD A,(HL) INC HL RET ;Основной обработчик диалогового окна ;На вход: HL-Адрес описателя диалогового окна Dialog: CALL PutDialWn ; DialogLp: CALL handleEvent ;Читаем событие LD IX,DialTab+5 ;Таблица об'ектов DialWlp: LD HL,DialWex PUSH HL LD A,(ix+1) ;Текущий об'ект RES 7,A CP InputLine JP Z,EInpLine CP ClRadioBut JP Z,EClasterB CP ClCheckBut JP Z,EClasterB CP ListBox JP Z,EListBox CP Button JP Z,EButton ; POP HL DialWex: LD C,(ix+0) LD B,0 ADD IX,BC ;След.объект BIT 7,(ix+0) JR Z,DialWlp ;7-й бит - конец объектов (цикл не трогать) ; LD HL,what ; поле событий LD DE,DialogC PUSH DE LD A,(HL) ; +0 INC HL CP evKeyboard ; событие клавиатуры JR Z,TstKeyD ; проверка на Enter/Esc CP evCombKey JR Z,TstCombKeyD ; тест на F10 CP evCommand JR Z,TstCmnD ; проверка команд от мышки, клавы ; POP DE DialogC: JR DialogLp TstCombKeyD: INC HL LD A,(HL) ;+2 CP 44h ; F10 JR Z,CancelD RET TstKeyD: LD A,(HL) ;+1 CP 1Bh ; Esc JR Z,CancelD ;@@@ cp 0Dh ; Enter ; jr z,OkeyD RET ; TstCmnD: LD A,(HL) CP cmCancel JR Z,CancelD JR OkeyDn ;@@@ Ok ;OkeyD: ld hl,what ; ld (hl),evCommand ; inc hl ; ld (hl),cmOkey OkeyDn: LD IX,DialTab+5 OkeyLp: LD DE,OkeyN ; Find clasters & get data PUSH DE LD A,(ix+1) ; какой тек. объект ? RES 7,A CP ClRadioBut JP Z,GetClDt CP ClCheckBut JP Z,GetClDt CP ListBox JP Z,GetLstBox POP DE OkeyN: LD C,(ix+0) LD B,0 ADD IX,BC ;Next object BIT 7,(ix+0) JR Z,OkeyLp ;NZ-End object table DialogE: CALL ClsDial ; закрыть окно диалога POP DE ; выход из цикла (выровнить стек) JP GetFire ; Cancel CancelD: LD HL,what LD (HL),evCommand INC HL LD (HL),cmCancel JR DialogE PutDial: PUSH IX LD A,(IX+2) ;with shadow ADD A,2 LD L,A LD A,(IX+3) INC A LD H,A ;Wind len LD E,(IX+0) LD D,(IX+1) LD IX,WinBoxBuff+6800 ;Address Box buffers EXX CALL GetMousInfo EXX DI kk2: LD A,(hPages.Win2) ;Page buffer LD B,A XOR A LD C,BIOS.WIN_RESTORE ; из буфера в текст. окно RST ToBIOS EI CALL GetMousInfo LD C,1 ; вывести курсор мышки RST ToDSS.Mouse POP IX RET ; Close Dialog window and restore box place ClsDial: CALL ResILCr ; сбросить курсор LD IX,DialData LD A,(IX+2) ;with shadow ADD A,2 LD L,A LD A,(IX+3) INC A LD H,A ;Wind len LD E,(IX+0) LD D,(IX+1) EXX CALL GetMousInfo EXX DI LD IX,WinBoxBuff ;Address Box buffers kk3: LD A,(hPages.Win2) ;Page buffer LD B,A XOR A LD C,BIOS.WIN_RESTORE ; из буфера в текст. окно RST ToBIOS EI CALL GetMousInfo LD C,1 ; вывести курсор мышки RST ToDSS.Mouse RET ; ; Процедура рисования и печати диалогового окна ; На вход: HL - Адрес описателя PutDialWn: PUSH IY LD IY,DialTab LD IX,DialData IN A,(Page3) PUSH AF kk4: LD A,(hPages.Win2) ;Page buffer OUT (Page3),A LD A,(HL) ;X position LD (IX+0),A ;Xpos INC HL LD A,(HL) ;Y position LD (IX+1),A ;Ypos INC HL LD A,(HL) ;Len X LD (IX+2),A ;Xlen INC HL LD A,(HL) ;Len Y LD (IX+3),A ;Ylen INC HL LD DE,DialName .loc1: LDI LD A,(HL) OR A JR NZ,.loc1 LDI PUSH HL CALL SavDial ;Save dialog place CALL PutDialRc LD HL,FramDSl CALL PutDialFr ;Put Dialog frame & name CALL PutDialSh LD A,(IX+0) ;move window LD (IY+0),A ; +0 INC IY ADD A,(IX+2) LD (IY+0),A ; +1 INC IY LD A,(IX+1) LD (IY+0),A ; +2 INC IY LD A,(IX+0) ; координаты |■| (закр.окно) LD (IY+0),A ; +3 INC IY LD A,(IX+1) LD (IY+0),A ; +4 INC IY POP HL DialCyc: LD A,(HL) ;Next get includes objects INC HL BIT 7,A JR NZ,DialExt ;End dialog label LD DE,DialCyc PUSH DE CP TextLine JP Z,PTextLn ;Put text line CP InputLine JP Z,PInpLine ;Put object input line CP ClRadioBut JP Z,PClRadioB ;Put claster radio buttons CP ClCheckBut JP Z,PClCheckB ;Put claster check buttons CP ListBox JP Z,PListBox ;Put List box CP Button JP Z,PButton ; вставить бутон CP Frame JP Z,PFrame ; POP DE DialExt: LD (IY+0),80h ;+5 End dialog table POP AF OUT (Page3),A CALL PutDial ;Put dialog window POP IY ; Select last element SelLast: LD HL,DialTab+5 LD DE,ReCompBuff LD B,0 LD C,(HL) LD A,C LDIR ; заполн. буфера DialTab+5 LD C,A DEC HL LD E,L LD D,H OR A SBC HL,BC PUSH HL LD BC,DialTab+4 OR A SBC HL,BC LD C,L LD B,H POP HL LD A,B OR C JR Z,$+4 LDDR LD HL,ReCompBuff LD DE,DialTab+5 LD C,(HL) LDIR SUB A LD (CIflag+1),A LD IX,DialTab+5 LD HL,DIALe PUSH HL LD A,(IX+1) SET 7,(IX+1) CP InputLine JP Z,InpLineI CP ClRadioBut JP Z,ClastI CP ClCheckBut JP Z,ClastI CP ListBox JP Z,PLstBoxI CP Button JR Z,ButtonI POP HL DIALe: LD C,1 ; вывести курсор мышки RST ToDSS.Mouse RET ButtonI: LD E,(IX+2) ;Xo LD D,(IX+4) ;Y LD A,(IX+3) ;Xi SUB E LD C,A JP SetDialInv ; Object ~Text line~ ; Input: HL-label ; Format mouse table: None ; PTextLn: LD C,(HL) ; X pos INC HL LD B,(HL) ; Y pos INC HL CALL GetPutA LD A,(HL) ; цвет строки объекта TextLine EX AF,AF' INC HL .loc1: LDI EX AF,AF' LD (DE),A EX AF,AF' INC DE LD A,(HL) CP 0FFh JR Z,.loc2 OR A JR NZ,.loc1 INC HL RET .loc2: INC HL LD A,(HL) OR A JR NZ,.loc2 INC HL RET ; Ожидание событий handleEvent: LD IX,what handle1: LD (ix+0),evNothing ; what = evNoting CALL ExmFire ; получить текст. коорд. мышки OR A ; бутон(ы) мышки нажат ? JR NZ,ButtPrs ; да LD C,31h ; опрос клавы без ожидания RST ToDSS RET Z ; буфер клавы пуст LD A,E OR A JR Z,NewComb ; курс. клавиши (+Home,End,PgUp,PgDwn) BIT 7,D JR NZ,NewCmb ; комбинации с Shift,Ctrl,Alt LD (ix+0),evKeyboard LD (ix+1),E ; код символа LD (ix+2),D ; код статуса клавы RET ; Курсорные клавиши NewComb: LD (ix+0),evCombKey ; признак события LD (ix+1),E ; идет ноль LD (ix+2),D ; код курс.клавиш (или статуса клавы) RET ; Комбинация с Shift,Ctrl,Alt NewCmb: LD (ix+0),evCombKey LD (ix+1),D ; 7-й бит, признак нажатия Ctrl,Shift,Alt LD (ix+2),E ; код клавиши RET ; Нажатие бутона мышки ButtPrs: BIT 1,A RET NZ ; нажата правая клавиша LD (ix+0),evMouseFr ; признак события LD (ix+1),L ; X Tcoord LD (ix+2),H ; Y Tcoord RET what: DS 8 ; поле событий ;Процедура передачи сообщений по объектам с текущего объекта TransMessUp: PUSH IY PUSH IX JR TransEx ;Процедура передачи сообщений по объектам с первого объекта TransMessage: PUSH IY PUSH IX LD IX,DialTab+5 ;Таблица объектов TransLp: LD HL,TransEx PUSH HL LD A,(IX+1) ;Текущий объект AND 7Fh ;7-й бит - объект выделенный CP InputLine JP Z,EInpLine CP ClRadioBut JP Z,EClasterB CP ClCheckBut JP Z,EClasterB CP ListBox JP Z,EListBox CP Button JP Z,EButton ; POP HL TransEx: LD C,(IX+0) LD B,0 ADD IX,BC ;След. объект BIT 7,(IX+0) JR Z,TransLp ;7-й бит - конец объектов POP IX POP IY LD HL,what LD A,(HL) CP evMessage RET NZ ;Test command LD (HL),evNothing RET ; Object ~Button~ ; Input: HL-label ; Format mouse table: ; +0 - Object ~Claster check buttons" ; +1 - Xo position object ; +2 - Xi position object ; +3 - Y position object ; +4 - genered command ; +5 - Hot key ; +6 - Context ; PButton: PUSH IY INC IY LD (IY+0),A ; +0 object LD A,(HL) ; X pos INC HL LD C,A ADD A,(IX+0) ; Pos X from begin screen LD (IY+1),A ; +1 Xo LD A,(HL) ; Y pos INC HL LD B,A ADD A,(IX+1) ; Pos Y from begin screen LD (IY+3),A ; +3 Yo PUSH BC ; Save position CALL GetPutA EX DE,HL LD C,ColButton ;LD C,A LD B,0 LD (IY+5),B LD A,(DE) PButLp1: INC DE CP '~' JR NZ,PButN0 LD C,ColDhotkey ;LD C,A LD A,(DE) INC DE LD (HL),A INC HL RES 5,A LD (IY+5),A ; задать Hot key LD A,ColButton AND 0F0h OR C LD (HL),A INC HL INC DE LD C,ColButton ; цвет бутона после hot-буквы ;LD C,A INC B LD A,(DE) INC DE PButN0: LD (HL),A INC HL LD (HL),C INC HL INC B LD A,(DE) OR A JR NZ,PButLp1 INC DE LD A,(IY+1) ADD A,B LD (IY+2),A LD A,(ColDialWn) ;-- AND 0F0h LD (HL),"▄" INC HL ; LD (HL),A ; EX DE,HL POP BC ; Reset position INC B CALL GetPutA INC DE INC DE LD A,(IY+2) SUB (IY+1) LD B,A LD A,(ColDialWn) ;-- AND 0F0h ; LD C,A ; pbtn2: LD A,"▀" LD (DE),A INC DE LD A,C ; LD (DE),A ; INC DE DJNZ pbtn2 LD A,(HL) INC HL LD (IY+4),A LD A,(HL) INC HL LD (IY+6),A ; Context LD BC,7 ADD IY,BC PUSH IY EXX POP HL POP DE OR A SBC HL,DE LD A,L LD (DE),A EXX RET ;[]===========================================================[] ; Event button ; IX,DialTab+5 ; EButton: LD HL,what ; список событий LD A,(HL) INC HL CP evMouseFr JR Z,EBmouse CP evKeyboard JR Z,EBkeys CP evCombKey RET NZ BIT 7,(IX+1) RET NZ ; выйти - объект выделен PUSH IX LD E,(IX+0) LD D,0 ADD IX,DE BIT 7,(IX+0) POP IX RET Z INC HL LD A,(HL) ;+1 CP 9 ; Shift+Tab RET NZ XOR A LD (_Push+1),A ; Push flag JP SetButt ; выделить пред. объект ; Событие от мышки, ; проверка координат EBmouse: LD E,(HL) ;Xcoord INC HL LD D,(HL) ;Ycoord LD A,D CP (IX+4) ;Y pos button RET NZ ;if <> exit LD A,E BIT 7,(IX+2) JR NZ,$+6 CP (IX+2) ;Xo pos RET C ;< BIT 7,(IX+3) RET NZ CP (IX+3) ;Xi pos RET NC ;> SUB A LD (Kbutt+1),A INC A LD (_Push+1),A ;Push flag BIT 7,(IX+1) JR NZ,_Push JR SetButt ; Событие - нажата клавиша EBkeys: XOR A LD (_Push+1),A ; Push flag LD A,(HL) CP " " JR C,ebkey1 CP "A" RET C ebkey1: INC HL ; hl,what+2 BIT 7,(HL) ; нажата клавиша с Ctrl,Shift,Alt ? RET NZ ; да, выйти RES 5,A ; a..z -> A..Z BIT 7,(IX+1) ; выбрана или не выбрана JR NZ,EBkeyN CP 9 ; Tab JR Z,SetButt ; выделить след. объект CP 0Dh ; ### JR Z,SetButt JR EBkeyN1 ; EBkeyN: CP 0Dh JR Z,EBent EBkeyN1: CP (IX+6) ; Hot key RET NZ EBent: LD A,1 LD (_Push+1),A LD (Kbutt+1),A SetButt: CALL MoveObj ; Select Button CALL ResDialInv ; Reset previos invert LD IX,DialTab+5 LD E,(IX+2) ; Xo LD D,(IX+4) ; Y LD A,(IX+3) ; Xi SUB E LD C,A CALL SetDialInv _Push: LD A,0 OR A JP Z,BTexit CALL PushBut ; Push/pop бутон JP C,BTexit LD HL,what LD (HL),evCommand INC HL LD A,(IX+5) LD (HL),A RET ;Button exit BTexit: LD HL,what LD (HL),evNothing RET ; Нажать/отжать бутон PushBut: IN A,(Page3) PUSH AF kk5: LD A,(hPages.Win2) OUT (Page3),A PUSH IX LD E,(IX+2) ;Xo LD D,(IX+4) ;Y LD A,(IX+3) ;Xi SUB E INC A ;Xi-Xo+1=Full len with shadow LD L,A LD H,1 ;Ylen=2 with shadow LD (BTlen+1),HL ;Save len LD (BTpos+1),DE ;Save pos LD A,L PUSH AF ;Save len LD IX,DialData LD A,E SUB (IX+0) LD C,A LD A,D SUB (IX+1) LD B,A PUSH BC CALL GetPutA LD C,L SLA C LD B,0 LD HL,ReCompBuff EX DE,HL LDIR EX DE,HL POP BC INC B CALL GetPutA POP AF LD C,A SLA C LD B,0 EX DE,HL LDIR PUSH AF DEC A ;len without shadow ADD A,A LD C,A LD B,0 LD HL,ReCompBuff LD DE,ReCompBuff+160 LD A,20h LD (DE),A ;shift on one pos INC DE LD A,(ColDialWn) LD (DE),A INC DE LDIR ;move button POP AF ;reset len EX DE,HL LD B,A ;LD D,20h LD A,(ColDialWn) btln: LD (HL),20h;D INC HL LD (HL),A ;without down shadow INC HL DJNZ btln ;$-4 LD IX,ReCompBuff+160 ;Put button BTlen: LD HL,0 BTpos: LD DE,0 CALL testbut JR NC,bt1 DI IN A,(Page1) LD B,A XOR A LD C,BIOS.WIN_RESTORE RST ToBIOS EI LD IX,ReCompBuff+160 ;Put button LD HL,(BTlen+1) LD DE,(BTpos+1) INC D LD A,L ADD A,A ADD A,XL LD XL,A JR NC,$+4 INC XH CALL testbut JR NC,bt1 DI IN A,(Page1) LD B,A XOR A LD C,BIOS.WIN_RESTORE RST ToBIOS EI bt1: POP IX Kbutt: LD A,0 ; режим мышка/клава OR A JR Z,PushLp ; мышка LD B,8 HALT DJNZ $-1 JR PushEx PushLp: ; проверка координат мышки CALL ExmFire ; получить знак. коорд. мышки JR Z,PushEx BIT 0,A ;1,a JR Z,PushEx ; нажата левая клавиша LD A,H CP (IX+4) ; Y pos button JR NZ,PushEx LD C,(IX+2) ; Xo pos LD B,(IX+3) ; Xi pos INC B LD A,L BIT 7,C JR NZ,$+5 CP C ; Xo pos JR C,PushEx ; < BIT 7,B JR NZ,PushLp CP B JR C,PushLp ; > PushEx: PUSH IX PUSH HL LD IX,ReCompBuff ; Put prev button LD HL,(BTlen+1) LD DE,(BTpos+1) CALL testbut JR NC,bt2 DI IN A,(Page1) LD B,A XOR A LD C,BIOS.WIN_RESTORE RST ToBIOS EI LD IX,ReCompBuff ;Put button LD HL,(BTlen+1) LD DE,(BTpos+1) INC D LD A,L ADD A,A ADD A,XL LD XL,A JR NC,$+4 INC XH CALL testbut JR NC,bt2 IN A,(Page1) LD B,A XOR A LD C,BIOS.WIN_RESTORE ; из буфера в окно DI RST ToBIOS EI bt2: POP HL POP IX POP AF OUT (Page3),A LD A,(Kbutt+1) OR A RET NZ ; координаты мышки LD A,H CP (IX+4) ;Y pos button SCF RET NZ LD C,(IX+2) ;Xo pos LD B,(IX+3) ;Xi pos INC B LD A,L BIT 7,C JR NZ,$+4 CP C ;Xo pos RET C ;< BIT 7,B SCF RET NZ CP B ;Xi pos CCF ;> RET ; testbut: LD A,D CP 31 RET NC BIT 7,E JR Z,bt0 LD A,E LD E,0 NEG LD C,A SUB L NEG LD L,A OR A RET Z RET M LD A,C ADD A,A ADD A,XL LD XL,A JR NC,bt0 INC XH bt0: LD A,E CP 80 RET NC ADD A,L CP 80 RET C LD A,80 SUB E LD L,A SCF RET ; Moving object to first tab pos ; Input: IX-Address object MoveObj: SET 6,(IX+0) ;Mark object LD HL,DialTab+5 MoveOlp: BIT 6,(HL) ;Test on mark object RES 6,(HL) ;Reset mark RET NZ ;Exit if mark INC HL RES 7,(HL) ;Reset select object DEC HL LD DE,ReCompBuff ;Move first object in buffer LD C,(HL) ;Len object label LD B,0 RES 6,C LDIR ;Move PUSH HL PUSH HL LD C,(HL) ;-6 RES 6,C ADD HL,BC ;Search end table BIT 7,(HL) JR Z,$-6 POP BC OR A ;HL-End table,BC-Address 2 obj SBC HL,BC ;HL-BC=Len table -1 object LD C,L ;BC=Len table LD B,H POP HL LD DE,DialTab+5 ;Move to begin table PUSH DE LD A,B OR C JR Z,$+4 LDIR LD HL,ReCompBuff ;Move from buffer to end table LD C,(HL) ;object BC=len Object label RES 6,C LDIR POP HL INC HL SET 7,(HL) ;Setting object DEC HL JR MoveOlp ;[]===========================================================[] ; Setting dialog invert objects ; Input: ; E - X pos ; D - Y pos ; C - X len SetDialInv: PUSH IX LD IX,DialData IN A,(Page3) PUSH AF ;сохр.page4 kk6: LD A,(hPages.Win2) OUT (Page3),A ;вкл.буфер LD L,C LD H,1 LD (RDlIlen+1),HL ;Save len LD (RDlIpos+1),DE ;Save pos LD A,E SUB (IX+0) LD C,A LD A,D SUB (IX+1) LD B,A CALL GetPutA EX DE,HL LD (RDlIbuf+2),HL LD B,E LD E,ColDialInv ;LD E,A LD D,ColDhotkey ;LD D,A SetDin1: INC HL LD A,(HL) AND 0Fh CP D JR Z,setdn2 ;$+5 LD A,(HL) ;XOR E AND 0xF0 ; OR E ; LD (HL),A setdn2: INC HL DJNZ SetDin1 LD IX,(RDlIbuf+2) ;Put Name with invert LD HL,(RDlIlen+1) LD DE,(RDlIpos+1) CALL PutDialLn POP AF OUT (Page3),A POP IX RET ; Res dialog invert objects ; Input: None ResDialInv: PUSH IX IN A,(Page3) PUSH AF ;сохр.page4 kk7: LD A,(hPages.Win2) OUT (Page3),A ;вкл.буфер LD HL,(RDlIbuf+2) LD A,(RDlIlen+1) LD B,A LD E,ColDialInv1 ;LD E,A LD D,ColDhotkey ;LD D,A ResDin1: INC HL LD A,(HL) AND 0Fh CP D JR Z,resdn2 ;$+5 LD A,(HL) ;XOR E AND 0xF0 ; CP ColButton JR Z,.loc2 OR E ; .loc2: LD (HL),A resdn2: INC HL DJNZ ResDin1 RDlIbuf: LD IX,0 ;Put Name with invert RDlIlen: LD HL,0 RDlIpos: LD DE,0 CALL PutDialLn CIflag: LD A,0 ;1-Was claster invert OR A CALL NZ,ResClasInv CALL ResILCr ; сбросить курсор в inp.line POP AF OUT (Page3),A POP IX LD HL,what LD (HL),evMessage INC HL LD (HL),msHiddInvr JP TransMessage ; Res Claster invert ; Input: None ResClasInv: PUSH IX IN A,(Page3) PUSH AF ;сохр.page4 kk8: LD A,(hPages.Win2) OUT (Page3),A ;вкл.буфер PUSH HL LD HL,(RClIbuf+2) LD A,(RClIlen+1) LD B,A LD E,ColDialInv1 ;LD E,A LD D,ColDhotkey ;LD D,A ResDin2: INC HL LD A,(HL) AND 0Fh CP D JR Z,.loc2 ;$+5 LD A,(HL) ;XOR E AND 0xF0 ; OR E ; LD (HL),A ;+6 .loc2: INC HL DJNZ ResDin2 RClIbuf: LD IX,0 ;Put Name with invert RClIlen: LD HL,0 RClIpos: LD DE,0 CALL PutDialLn CALL ResILCr ; сбросить курсор SUB A LD (CIflag+1),A POP HL POP AF OUT (Page3),A POP IX RET ;[]===========================================================[] ; PutDialLn: LD A,D CP 1Fh RET NC BIT 7,E JR Z,pdln LD A,E LD E,0 NEG LD C,A SUB L NEG LD L,A RET Z RET M LD A,C ADD A,A ADD A,XL LD XL,A JR NC,pdln INC XH pdln: LD A,E CP 80 RET NC ADD A,L CP 80 JR C,$+6 LD A,80 SUB E LD L,A DI kk9: LD A,(hPages.Win2) LD B,A XOR A LD C,BIOS.WIN_RESTORE RST ToBIOS EI RET ;!FIXIT CURSOR ; Установка курсора черточкой ; SetCursor: ; получить сист. знакогенератор ; ld de,0xB700 ; буфер для 2kB знакогенератора ; ld c,BIOS.WIN_GET_ZG ; RST ToBIOS ; ; последние 512 байт (2 нижние черты) заполнить кодом 0xFF ; ld hl,0xB700+1536 ; ld bc,00FFh ; ._loop: ld (hl),c ; inc hl ; ld (hl),c ; inc hl ; djnz ._loop ; ; уст. знакогенератор с номером 0x5B ; ld a,0x5B ; ld de,0xB700 ; ld c,BIOS.WIN_SET_ZG ; RST ToBIOS ; ret ; ;-- Dialog Windows color ColDialFr: EQU 0Fh ; цвет рамки окна ColDhotkey: EQU 0Ch ; цвет hot-клавиш ColButton: EQU 20h ; цвет бутонов ColLstBxFr: EQU 1Fh ; цвет рамки ListBox-а ColListBox: EQU 1Fh ; цвет списка ListBox-а ColLstBoxI: EQU 5Eh ; цвет выдел. курсора акт. объекта ColLstBxHI: EQU 1Eh ; цвет выдел. курсора не акт. объекта ColScrlBar: EQU 0Fh ; цвет скролл-бара ColInpLine: EQU 0Eh ; цвет редакт. поля метки дискеты ColDialInv: EQU 0Fh ; color dialog window invert ColDialInv1: EQU 07h ; color dialog window invert ColFormText: EQU 31h ; цвет текста в окне форматирования ColFormNumber: EQU 3Eh ; цвет цифр в окне форматирования ColorFrame: EQU ColFormText ; цвет рамки объекта Frame ColDialWn: DB 17h ; цвет окна FramDSl: DB "╔╗╚╝═║║║" ; рамка окна SavDial: PUSH IX LD A,(IX+2) ;with shadow ADD A,2 LD L,A LD A,(IX+3) INC A LD H,A ;Wind len LD E,(IX+0) LD D,(IX+1) EXX CALL GetMousInfo EXX DI LD IX,WinBoxBuff ;Address Box buffers kk1: LD A,(hPages.Win2) ;Page buffer LD B,A XOR A LD C,BIOS.WIN_COPY ; копир. из окна в буфер RST ToBIOS EI CALL GetMousInfo POP IX RET ; Процедура освобождения прямоугольной площади диал. окна ; На вход: IX - описатель ; PutDialRc: LD HL,WinBoxBuff+6800 LD B,(IX+3) ;Len Y LD C,(IX+2) ;Len X ;LD E,20h LD A,(ColDialWn) PutRc1: LD D,C putrc: LD (HL),20h ;E INC HL LD (HL),A ;window color INC HL DEC D JR NZ,putrc ;$-5 INC HL ;place for shadow INC HL INC HL INC HL DJNZ PutRc1 RET ; Процедура наложения на прямоугольную площадь диал. окна рамки ; На вход: IX - описатель ; HL - адрес описателя рамки ; PutDialFr: PUSH IY PUSH HL POP IY LD HL,WinBoxBuff+6800 LD C,ColDialFr LD A,(ColDialWn) AND 0F0h OR C LD C,A LD A,(IY+0) LD (HL),A ;First Line INC HL LD (HL),C INC HL LD B,(IX+2) ;Len DialX DEC B DEC B LD A,(IY+4) .loc1: LD (HL),A INC HL LD (HL),C INC HL DJNZ .loc1 LD A,(IY+1) LD (HL),A INC HL LD (HL),C INC HL INC HL INC HL INC HL INC HL ; LD E,(IX+2) ;lenX DEC E DEC E LD D,B LD B,(IX+3) ;lenY DEC B DEC B LD A,(IY+5) .loc2: LD (HL),A ;middle space window INC HL LD (HL),C INC HL ADD HL,DE ADD HL,DE LD (HL),A ;middle space window INC HL LD (HL),C INC HL INC HL INC HL INC HL INC HL DJNZ .loc2 ; LD A,(IY+2) LD (HL),A ;End Line INC HL LD (HL),C INC HL LD B,(IX+2) ;Len X DEC B DEC B LD A,(IY+4) .loc3: LD (HL),A INC HL LD (HL),C INC HL DJNZ .loc3 LD A,(IY+3) LD (HL),A INC HL LD (HL),C INC HL LD HL,DialName LD E,L ;DE=Dial label LD D,H LD B,1 .loc4: INC B ;B=Len name+2 (for space) LD A,(HL) INC HL OR A ;0-End name JR NZ,.loc4 LD HL,WinBoxBuff+6800 LD A,(IX+2) ;Len X SUB B ;LenX-Len name=Len empty SRL A ;Len empty/2=shift LD C,A LD B,0 ADD HL,BC ;get address name place ADD HL,BC ;LD (HL)," " ; вед. пробел имени окна INC HL INC HL EX DE,HL ;HL=Adr.Name,DE=Adr.Place .loc5: LDI ;Move INC DE ;Attrib place LD A,(HL) OR A ;0-End name JR NZ,.loc5 ;LD A," " ; закр. пробел имени окна ;LD (DE),A POP IY RET ; Процедура вывода в буфер тени окна ; На вход: IX - адрес описателя PutDialSh: LD HL,WinBoxBuff+6800 LD A,(IX+2) LD E,A LD D,0 ADD HL,DE ADD HL,DE EXX LD E,A ;длина окна X BIT 7,(IX+0) JR Z,ExShD1 ;правая граница экрана LD A,(IX+0) NEG ;в A-на сколько окно залезло за экран SUB E ;-длина окна=-видимая часть NEG LD E,A ;длина видимой части ExShD1: LD D,0 LD HL,WinBoxBuff ADD HL,DE ADD HL,DE LD A,(HL) ;первая линия без тени INC HL EXX LD (HL),A INC HL EXX LD A,(HL) INC HL EXX LD (HL),A INC HL EXX LD A,(HL) INC HL EXX LD (HL),A INC HL EXX LD A,(HL) INC HL EXX LD (HL),A INC HL ; середина окна LD B,(IX+3) ;длина окна Y-1 DEC B DShadLp: ADD HL,DE ADD HL,DE EXX ADD HL,DE ADD HL,DE LD A,(HL) INC HL EXX LD (HL),A INC HL EXX LD A,(HL) INC HL EXX AND 7 JR NZ,$+4 LD A,7 LD (HL),A INC HL EXX LD A,(HL) INC HL EXX LD (HL),A INC HL EXX LD A,(HL) INC HL EXX AND 7 JR NZ,$+4 LD A,7 LD (HL),A INC HL DJNZ DShadLp ADD HL,DE ;конец линии для тени ADD HL,DE INC HL INC HL INC HL INC HL EXX ADD HL,DE ;конец буфера ADD HL,DE INC HL INC HL INC HL INC HL EXX LD B,E DShadL1: EXX DEC HL ;заполняем с конца LD A,(HL) EXX DEC HL AND 7 JR NZ,$+4 LD A,7 LD (HL),A EXX DEC HL LD A,(HL) EXX DEC HL LD (HL),A DJNZ DShadL1 EXX ;два первых знакоместа без изменений DEC HL LD A,(HL) EXX DEC HL LD (HL),A EXX DEC HL LD A,(HL) EXX DEC HL LD (HL),A EXX DEC HL LD A,(HL) EXX DEC HL LD (HL),A EXX DEC HL LD A,(HL) EXX DEC HL LD (HL),A RET ; Get put address in memory ; Input: BC - Coords from begin window ; Output: DE - Address put place ; GetPutA: PUSH HL LD HL,WinBoxBuff+6800 LD A,(IX+2) ;Len X-2 ADD A,2 ;Full len with shadow ADD A,A ;With attributs LD E,A ;LenX in bytes LD D,0 LD A,B OR A JR Z,$+5 ADD HL,DE DJNZ $-1 LD E,C ;$+5 ADD HL,DE ;DE-shiftX ADD HL,DE EX DE,HL ;DE-Address POP HL RET ;[]========================================================[] ; Очистить десктоп ClearDesk: CALL setpal ; Титл программы LD DE,0000h LD C,BIOS.LP_SET_PLACE ; уст. полож. курсора RST ToBIOS LD HL,Title LD E,0Fh ; атрибут LD BC,#50*256+BIOS.LP_PRINT_LINE ; вывод строки RST ToBIOS CALL Clear1 ; нижняя полоска LD DE,1F00h ; Y/X полож. символа LD C,BIOS.LP_SET_PLACE ; уст. координаты в окне RST ToBIOS LD A," " ; символ LD E,0Fh ; атрибут LD BC,5081h ; печать символа с атрибутом RST ToBIOS RET Clear1: LD DE,0100h ; Y/X полож. окна LD HL,1E50h ; Y/X размер LD BC,408Dh ; b=атрибут LD A," " ; символ RST ToBIOS RET ;setpal: ld hl,pallete ; палитра ; ld de,1000h ; число цветов палитры/начальный цвет ; ld bc,0FFA4h ; маска цвета/функция установки ; ld a,1 ; номер палитры (0=0-й экран, 1=1-й экран) ; RST ToBIOS ; ret ;pallete: ; b,g,r,0 ; db 0,0,0,0 ; цвет 0, черный ; db 128,0,0,0 ; цвет 1, синий ; db 0,128,0,0 ; цвет 2, зеленый ; db 128,128,0,0 ; цвет 3, бирюзовый (циан) ; db 0,0,128,0 ; цвет 4, красный ; db 128,0,128,0 ; цвет 5, пурпурный ; db 64,64,64,0 ; цвет 6, коричневый ; db 128,128,128,0 ; цвет 7, серый ; ; db 192,192,192,0 ; цвет 8, белый ; db 255,0,0,0 ; цвет 9, голубой ; db 0,255,0,0 ; цвет A, ярко-зеленый ; db 255,255,0,0 ; цвет B, ярко-бирюзовый ; db 0,0,255,0 ; цвет C, ярко-красный ; db 255,0,255,0 ; цвет D, ярко-пурпурный ; db 0,255,255,0 ; цвет E, ярко-желтый ; db 255,255,255,0 ; цвет F, ярко-белый ; Установить инверсию для цвета 0Fh setpal: LD HL,pal ; палитра LD DE,0100h ; число цветов палитры/начальный цвет LD BC,0FFA4h ; маска цвета/функция установки LD A,4 ; номер палитры (0=0-й экран, 1=1-й экран) RST ToBIOS LD HL,pal1 LD DE,010Fh ; число цветов палитры/начальный цвет LD BC,0FFA4h LD A,4 RST ToBIOS ; LD HL,pal1 LD DE,0100h ; число цветов палитры/начальный цвет LD BC,0FFA4h LD A,5 RST ToBIOS LD HL,pal LD DE,010Fh ; число цветов палитры/начальный цвет LD BC,0FFA4h LD A,5 RST ToBIOS ; LD HL,pal LD DE,0100h ; число цветов палитры/начальный цвет LD BC,0FFA4h LD A,6 RST ToBIOS LD HL,pal1 LD DE,010Fh ; число цветов палитры/начальный цвет LD BC,0FFA4h LD A,6 RST ToBIOS ; LD HL,pal1 LD DE,0100h ; число цветов палитры/начальный цвет LD BC,0FFA4h LD A,7 RST ToBIOS LD HL,pal LD DE,010Fh ; число цветов палитры/начальный цвет LD BC,0FFA4h LD A,7 RST ToBIOS RET pal: DB 0,0,0,0 pal1: DB 255,255,255,0