From 3ef8aefe3074509f630719be693c4f4ba39b5c43 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 9 Jun 2024 08:13:19 +1000 Subject: [PATCH] Begin --- .gitmodules | 4 + BUTTON.ASM | 219 ++++++ DIALOG.ASM | 1773 ++++++++++++++++++++++++++++++++++++++++++ ESTEX.ASM | 602 +++++++++++++++ ESTEX.BS | Bin 0 -> 1536 bytes EXIT.ASM | 71 ++ FMAIN.ASM | 225 ++++++ FORM.ASM | 1622 +++++++++++++++++++++++++++++++++++++++ LISTBOX.ASM | 1740 ++++++++++++++++++++++++++++++++++++++++++ MAIN.ASM | 245 ++++++ MAP.ASM | 851 +++++++++++++++++++++ MOUSE.ASM | 28 + RADIO.ASM | 1946 +++++++++++++++++++++++++++++++++++++++++++++++ Shared_Includes | 1 + Version.inc | 4 + mhmt | Bin 0 -> 87384 bytes 16 files changed, 9331 insertions(+) create mode 100644 .gitmodules create mode 100755 BUTTON.ASM create mode 100755 DIALOG.ASM create mode 100755 ESTEX.ASM create mode 100644 ESTEX.BS create mode 100755 EXIT.ASM create mode 100755 FMAIN.ASM create mode 100755 FORM.ASM create mode 100755 LISTBOX.ASM create mode 100755 MAIN.ASM create mode 100755 MAP.ASM create mode 100755 MOUSE.ASM create mode 100755 RADIO.ASM create mode 160000 Shared_Includes create mode 100644 Version.inc create mode 100755 mhmt diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7355856 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "Shared_Includes"] + branch = main + path = Shared_Includes + url = https://github.com/Tolik-Trek/Shared_Includes.git diff --git a/BUTTON.ASM b/BUTTON.ASM new file mode 100755 index 0000000..ec8a708 --- /dev/null +++ b/BUTTON.ASM @@ -0,0 +1,219 @@ +;===================================================================== +; +; Обработчик событий объектов "Button" +; +;===================================================================== +EvButton: ld hl,what ; поле событий + ld a,(hl) ;+0 + inc hl + cp evMouseFr + jr z,EBmouse + cp evKeyboard + jp z,EBkeys + cp evCombKey + ret nz + bit 7,(ix+1) ; sel or nosel + ret nz ; объект уже выделен + ld b,(hl) ;+1 what + inc hl + ld a,(hl) ;+2 what + cp 56h ; курсор вправо + jr z,tb__ + push ix + ld e,(ix+0) ; размер таблицы "Button" + ld d,0 + add ix,de + bit 7,(ix+0) + pop ix + ret z ; еще не конец объектов + cp 54h ; курсор влево + jr z,tb__ + ld a,b + and 00111111b ; биты Ctrl, Alt + ret nz + ld a,(hl) ;+2 what + cp 15+80h ; Tab скен-код+80h + ret nz + ; Shift+Tab +tb__: xor a + ld (_Push+1),a ; Push flag + jp SetButton ; select my + +; Событие - мышка +EBmouse: ld e,(hl) ;+1 X coord + inc hl + ld d,(hl) ;+2 Y coord + ld a,d + cp (ix+4) ; Y pos button + jr nz,get_fr ; if <> exit + ld a,e + bit 7,(ix+2) + jr nz,$+6 + cp (ix+2) ; Xo pos + jr c,get_fr ; < + bit 7,(ix+3) + jr nz,get_fr + cp (ix+3) ; Xi pos + jr nc,get_fr ; > + xor a + inc a + ld (_Push+1),a ; Push flag + bit 7,(ix+1) + jr nz,_Push + jr SetButton + +; Событие - обычная клавиша +EBkeys: xor a + ld (_Push+1),a ; Push flag + ld a,(hl) ;+1 what код клавиши + bit 7,(ix+1) ; Sel or nosel + jr nz,EBkeyN + cp 9 ; Tab + jr z,SetButton ; if tab then set button + jr EBkeyN1 + ; +EBkeyN: cp 0Dh ; Enter + jr z,EBent +EBkeyN1: inc hl + ld a,(hl) ;+2 what скен-код + cp (ix+6) ; hot-буква + ret nz +EBent: ld a,1 + ld (_Push+1),a +SetButton: call MoveObj ; Select Button + call ResDialInv ; Reset previos invert + ld ix,DialTab+5 + ;ld de,color_array+34 ; цвет Selected buttons + ;ld (set_dial_tmp_inv+1),de + ld e,(ix+2) ; Xo + ld d,(ix+4) ; Y + ld a,(ix+3) ; Xi + sub e + ld c,a + call SetDialInv ; выделить бутон цветом + ;ld de,color_array+26 ; цвет Selected title (объекта) + ;ld (set_dial_tmp_inv+1),de +_Push: ld a,0 + or a + jr z,BTexit + call PushBut ; засветить курсор + ld hl,what + ld (hl),evCommand + inc hl + ld a,(ix+5) ; номер команды + ld (hl),a +get_fr: jp GetFire + ; +; Button exit +BTexit: ld hl,what + ld (hl),evNothing + 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 diff --git a/DIALOG.ASM b/DIALOG.ASM new file mode 100755 index 0000000..e6c0214 --- /dev/null +++ b/DIALOG.ASM @@ -0,0 +1,1773 @@ +; Метки "@@@" - закоммент. код, чтобы не отрабатывал "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 + + + +MainLOOP: ; подменить вектор на свой (для мигания курсора) + ld hl,(0039h) ;rdlow ok + ld (vect+1),hl + ld hl,rst38 + ld (0039h),hl + ; +Loop1: call SetList ; настроить список дисководов +Loop2: ld hl,WinMain1 + call DialogW + ld a,(hl) + cp cmCancel + jp z,Exit1 + 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+1) + 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 + + +Exit1: ; восст. вектор + ld hl,(vect+1) + 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,(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,(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,(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,(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,(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,(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,(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,(Win2) + LD B,A + xor a + LD C,BIOS.WIN_RESTORE + RST ToBIOS + ei + RET + + + + +;!FIXIT +; Установка курсора черточкой +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 ; цвет редакт. поля метки дискеты + +ColDialWn: db 17h ; цвет окна +ColDialInv equ 0Fh ; color dialog window invert +ColDialInv1 equ 07h ; color dialog window invert + +ColFormText equ 31h ; цвет текста в окне форматирования +ColFormNumber equ 3Eh ; цвет цифр в окне форматирования +ColorFrame equ ColFormText ; цвет рамки объекта Frame + + + +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,(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 diff --git a/ESTEX.ASM b/ESTEX.ASM new file mode 100755 index 0000000..ac947b2 --- /dev/null +++ b/ESTEX.ASM @@ -0,0 +1,602 @@ +; Работа с системными и boot-файлами; +; Функция сравнения портов окон Биоса и используемых программой; +; + + + + +;--- Копирование сист. файлов в буферы +; вых: "CY" при ошибке +; +CopySysFiles: xor a + ld (sFlag),a + ld (bigFile),a + ld a,(ColDialWn) ; сохр. цвет окна + ld (TmpColor),a + ; Номер загрузочного диска + ld bc,0009h + RST ToDSS + ld (SysDisk),a + ; Установить текущим загрузочный диск + ld a,(SysDisk) + ld c,1 + RST ToDSS + ; Установить "корень" boot-диска + ld hl,RootDir + ld c,1Dh + RST ToDSS + ;Найти файл "SYSTEM.EXE" + ;ld hl,Name1 + ;call FirstFile + ;jp c,NoFound ; файл не найден + ; открыть файл + ld hl,Name1 + call OpenFile + jp c,error1 ; ошибка открытия файла + ld (hFile1),a + ; прочитать файл + in a,(Page3) + push af + ld a,(SBuff0) + out (Page3),a ; подкл. буфер + ld a,(hFile1) + call ReadFile + jp c,err1 ; ошибка чтения файла + pop af + out (Page3),a ; восст. страницу + ld (Number1),de ; число прочитанных байт + ; закрыть файл + ld a,(hFile1) + call CloseFile + jp c,error1 ; ошибка закрытия файла + + ;Найти файл "SYSTEM.DOS" + ;ld hl,Name2 + ;call FirstFile + ;jp c,error1 ; файл не найден + ; открыть файл + ld hl,Name2 + call OpenFile + jp c,error1 ; ошибка открытия файла + ld (hFile2),a + ; узнать размер файла + ld hl,0 + ld ix,0 ; мл.слово + ld bc,0215h ; указатель от конца файла + RST ToDSS + jp c,error1 + push ix + pop hl + ld de,4001h + ; hl >= de + ld a,l + sub e + ld l,a + ld a,h + sbc a,d + ld h,a + inc hl + ld (ost+1),hl ; сохр. размер остатка файла + jr c,tinRead ; файл < 1-й страницы + ld a,1 + ld (bigFile),a ; файл > 1-й страницы +tinRead: ld (Number2),ix ; сохр. размер файла + ; указатель на начало файла + ld hl,0 + ld ix,0 ; мл.слово + ld a,(hFile2) + ld bc,0015h ; указатель от начала файла + RST ToDSS + jp c,error1 + ; прочитать файл + in a,(Page3) + push af + ld a,(SBuff1) + out (Page3),a ; подкл. 1-ю страницу + ld a,(hFile2) + call ReadFile + jp c,err1 ; ошибка чтения файла + ld a,(bigFile) + or a + jr z,endRead ; прочитан весь файл + ; читаем остаток файла +ost: ld de,0 + ld a,(SBuff2) + out (Page3),a ; подкл. 2-ю страницу + ld hl,WinBoxBuff ; буфер под данные + ld a,(hFile2) + ld c,13h + RST ToDSS + jp c,err1 ; ошибка чтения файла +endRead: pop af + out (Page3),a ; восст. страницу +; закрыть файл + ld a,(hFile2) + call CloseFile + jp c,error1 ; ошибка закрытия файла + ret + + + +; флаг, 0/1 - отработать/нет функции WriteSysFiles +sFlag: db 0 + +; флаг, 0/1 - отработать/нет функции записи trd-boot`а +sFlag1: db 0 + +; флаг, 0/1 - "system.dos" меньше/больше 1-й страницы +bigFile: db 0 + + + +;--- Запись сист. файлов на дискету +; вых: "CY" при ошибке +; +WriteSysFiles: ld a,(sFlag) + or a + ret nz + ; Открыть окно + ld a,(ColDialWn) ; сохр. цвет окна + ld (TmpColor),a + ld a,10h ; цвет вывод. окна + ld (ColDialWn),a + ld hl,SysWrite ; "Writing system files..." + call PutDialWn + ; скрыть мышку + call HiddenMouse + ; Уст. текущий диск и путь на дискету + call SetDisketa + ; Создать файл "SYSTEM.EXE" + ld hl,Name1 ; имя файла + call CreateFile + jp c,error1 ; ошибка создания файла + ld (hFile1),a + ; записать файл + in a,(Page3) + push af + ld a,(SBuff0) + out (Page3),a ; подкл. буфер + ld de,(Number1) ; число запис. байт + ld a,(hFile1) ; хэндл + call WriteFile + ex af,af' + pop af + out (Page3),a ; восст. страницу + ex af,af' + jr c,error1 ; ошибка записи файла + ; закрыть файл + ld a,(hFile1) ; хэндл + call CloseFile + jr c,error1 ; ошибка закрытия файла + + ; Создать файл "SYSTEM.DOS" + ld hl,Name2 ; имя файла + call CreateFile + jr c,error1 ; ошибка создания файла + ld (hFile2),a + ; записать файл + in a,(Page3) + push af + ld a,(SBuff1) + out (Page3),a ; подкл. 1-ю страницу + ld de,(Number2) ; размер "system.dos" + ld hl,4000h ; 1-на страница + ld a,(bigFile) + or a + jr z,tinFile ; файл <= 1-й страницы + ex de,hl + sbc hl,de + push hl + ld a,(hFile2) ; хэндл + call WriteFile + pop de + jr c,err1 ; ошибка записи файла + ld a,(SBuff2) + out (Page3),a ; подкл. 2-ю страницу + ; +tinFile: ld a,(hFile2) ; хэндл + call WriteFile + jr c,err1 ; ошибка записи файла + pop af + out (Page3),a ; восст. страницу + ; закрыть файл + ld a,(hFile2) ; хэндл + call CloseFile + jr c,error1 ; ошибка закрытия файла + ; восст. диск и путь + call RestPath + ; закрыть окно "Запись сист. файлов" + call ClsDial + ; открыть окно "System files transfered" + ld hl,SysCopy + call PutDialWn + ; скрыть мышку + call HiddenMouse + ; задержка в 2 секунды + ei + ld b,2 ; секунды +1: ld a,49 ; 1/50 секунды +2: halt + dec a + jr nz,2B + djnz 1B + ; закрыть окно + call ClsDial + ld a,(TmpColor) + ld (ColDialWn),a ; восст. прежнюю установку цвета окна + ret + ; +err1: pop af + out (Page3),a ; восст. страницу + ; +error1: call RestPath ; восст. диск и путь + ld a,40h + ld (ColDialWn),a + ld hl,ErrSysFiles + call DialogW + ld a,(TmpColor) + ld (ColDialWn),a + ld a,1 + ld (sFlag),a + ret + + + +SetDisketa: ; Уст. текущий диск на формат. дискету + ld a,(DISK) + ld c,1 + RST ToDSS + ; Уст. "корень" дискеты + ld hl,RootDir + ld c,1Dh + RST ToDSS + ret + +RestPath: ; Восст. текущий диск + ; ld a,(CurDisk) + ; ld c,Dss.ChDisk + ; RST ToDSS + ; Восст. тек. путь + ld hl,CurPath + ld c,Dss.ChDir + RST ToDSS + ret + + + + +; Найти файл +FirstFile: ld bc,0019h ; имя в формате 11 байт + ld de,BuffName ; 44 байта буфера + ld a,20h ; атрибут "архивный" + RST ToDSS + ret + + +; Создать файл +CreateFile: ld c,0Ah + ld a,20h ; атрибут "архивный" + RST ToDSS + ret + + +; Открыть файл +OpenFile: ld c,11h + ld a,1 ; на чтение + RST ToDSS + ret + + +; Прочитать файл +ReadFile: ld hl,WinBoxBuff ;L4000 буфер под данные + ld de,4000h ; число читаемых байт (1 страница) + ld c,13h + RST ToDSS + ret + + +; Запись файла +WriteFile: ld hl,WinBoxBuff ;L4000 буфер данных + ld c,14h + RST ToDSS + ret + + +; Закрыть файл +CloseFile: ld c,12h + RST ToDSS + ret + + + + + +SysDisk: db 0 ; номер загр. диска +Name1: db "SYSTEM.EXE",0 +Name2: db "SYSTEM.DOS",0 +;Name2: db "DIAL.TXT",0 +hFile1: db 0 ; хэндл файла "system.exe" +hFile2: db 0 ; хэндл файла "system.dos" +Number1: dw 0 ; размер файла "system.exe" +Number2: dw 0 ; размер файла "system.dos" +RootDir: db '\',0 ; +; +CurPath: +CurDisk: db 0,':\' ; сохр. тек. диск +CurDir: ds 256 ; сохр. текущий путь (каталог) +; +TmpColor: db 0 ; врем. сохр. цвета окна + +; файл настроек программы +IniName: db "FFORMAT.INI",0 +hFile3: db 0 ; дескриптор файла +;Number3:dw 0 ; размер файла "fformat.ini" +BuffName: ds 45 ; буфер для функции поиска файла + +TrdName: db "BOOT.$B",0 ; имя trd-boot файла +hFile4: db 0 ; дескриптор файла + + + + + +;[]===============================================[] +/* +; Определение текущей конфигурации +; портов и включенных страниц ОЗУ +compare_page: ld c,0C6h ;получить конф. портов + ld a,1 ;параметры 1-го окна + RST ToBIOS + ld a,c ;вот здесь идет сpавнение считанного + cp Page1 ;номеpа поpта с тем, котоpый я юзаю + jr z,.loc1 + ; уст. новый номер Page1 + ld (port1+1),a + ld (port2+1),a + ld (port3+1),a + ld (port4+1),a +.loc1: ld c,0C6h + ld a,3 ;параметры 3-го окна + RST ToBIOS + ld a,c + cp Page3 + ret z + ; уст. новый номер Page3 + ld (port5+1),a + ld (port6+1),a + ld (port7+1),a + ld (port8+1),a + ld (port9+1),a + ld (port10+1),a + ld (port11+1),a + ld (port12+1),a + ld (port13+1),a + ld (port14+1),a + ld (port15+1),a + ld (port16+1),a + ld (L091B+1),a + ld (port18+1),a + ld (port19+1),a + ld (L0BAA+1),a + ld (port21+1),a + ld (port22+1),a + ld (L0B21+1),a + ld (port24+1),a + ld (port25+1),a + ld (port26+1),a + ld (port27+1),a + ld (port28+1),a + ld (port29+1),a + ld (PushBut+1),a + ld (port31+1),a + ld (port32+1),a + ld (port33+1),a + ld (port34+1),a + ld (port35+1),a + ld (port36+1),a + ld (port37+1),a + ld (port38+1),a + ld (port39+1),a + ld (port40+1),a + ld (port41+1),a + ld (port42+1),a + ld (port43+1),a + ld (port44+1),a + ld (port45+1),a + ld (port46+1),a + ld (port47+1),a + ld (port48+1),a + ld (port49+1),a + ld (port50+1),a + ld (port51+1),a + ld (port52+1),a + ld (port53+1),a + ld (port54+1),a + ld (port55+1),a + ld (port56+1),a + ld (port57+1),a + ld (port58+1),a + ld (port59+1),a + ld (port60+1),a + ld (port61+1),a + ld (port62+1),a + ld (ChangeR+1),a + ld (port64+1),a + ld (port65+1),a + ; + ld (port69+1),a + ld (port70+1),a + ld (port71+1),a + ld (port73+1),a + ; + ld (port74+1),a + ld (port75+1),a + ld (port76+1),a + ; + ld (port77+1),a + ld (port78+1),a + ret +*/ + + + +;[]===============================================[] + +; Чтение файла настроек (поиск в тек. каталоге) +; Читаются 2 байта в буфер BuffName +; При ошибках - просто выход +ReadInit: + ; найти файл "form.ini" + ld hl,IniName + call FirstFile + ret c ; файл не найден + ; открыть файл + ld hl,IniName + ld c,11h + ld a,1 ; на чтение + RST ToDSS + ret c ; ошибка открытия + ld (hFile3),a + ; прочитать файл + ld a,(hFile3) + ld hl,BuffName ; буфер под данные + ld de,2 ; число читаемых байт + ld c,13h + RST ToDSS + ;ld (Number3),de ; число прочитанных байт + ; закрыть файл + ld a,(hFile3) + call CloseFile + jp SetParam ; настроить 2 ячейки опций дисков + + + +; Запись в файл настроек +; При ошибке создания - просто выход +SaveInit: ; восст. начальный диск и каталог + ; ld a,(CurDisk) + ; ld c,1 + ; RST ToDSS + ; ld hl,CurDir + ; ld c,Dss.ChDir + ; RST ToDSS + ld hl,CurPath + ld c,Dss.ChDir + RST ToDSS + ; + call GetParam ; настроить буфер для записи + ; создать файл (сущест. урезает до нуля) + ld hl,IniName ; "form.ini" + ld c,0Ah + ld a,20h ; атрибут "архивный" + RST ToDSS + ret c ; ошибка создания файла + ld (hFile3),a ; сохр. хэндл + ; запись файла + ld hl,BuffName ; буфер данных + ld de,2 ; число запис. байт + ld c,14h + RST ToDSS + ; закрыть файл + ld a,(hFile3) + jp CloseFile + + +; Настроить буфер для записи "form.ini" +GetParam: ld hl,DriveA + call .loc1 + ld hl,BuffName + ld (hl),a ; для диска "A:" + ; + ld hl,DriveB + call .loc1 + ld hl,BuffName+1 + ld (hl),a ; для диска "B:" + ret + ; +.loc1: xor a + ld b,3 ; 3 ячейки + ld c,a ; счетчик +.loc2: cp (hl) + jr nz,.loc3 + inc hl + inc c + djnz .loc2 +.loc3: ld a,c + and 3 + ret + + + +; Настроить 2 ячейки RadioCheck-а опций дисков +SetParam: ; обнулить 6 ячеек опций дисков A/B + ld hl,DriveA + ld b,6 + xor a +.loc1: ld (hl),a + inc hl + djnz .loc1 + ; + ld hl,DriveA + ld de,BuffName ; диск "A:" + ld a,(de) + ld c,a + add hl,bc + ld (hl),1 ; отметить "RadioCheck" диска "A:" + ; + inc de ; на байт диска "B:" + ld hl,DriveB + ld a,(de) + ld c,a + add hl,bc + ld (hl),1 ; отметить "RadioCheck" диска "B:" + ret + + + +; Копирование trd-загрузчика из внешнего файла. +; При ошибках работы с файлом - просто выход из п/программы. +CopyBootTRD: xor a + ld (sFlag1),a + ; найти файл "boot.$b" + ld hl,TrdName + call FirstFile + jr c,trd_err ; файл не найден + ; открыть файл + ld hl,TrdName + call OpenFile + jr c,trd_err ; ошибка открытия + ld (hFile4),a + ; прочитать файл + in a,(Page3) + push af + ld a,(TRBoot) + out (Page3),a ; подкл. буфер + ; читаем заголовок бута + ld hl,NameBt ; буфер под данные + ld de,17 ; число читаемых байт + ld a,(hFile4) + ld c,13h + RST ToDSS + ; читаем тело бута + ld e,0 + ld a,(NameBt+14) ; узнать размер бута + ld d,a + cp 40h + jr c,.loc1 + ld d,40h +.loc1: ld (SizeBt+1),de ; сохр. размер бута + ld hl,L4000 ; 0C000h буфер под бут + ld a,(hFile4) + ld c,13h + RST ToDSS + pop af + out (Page3),a ; восст. страницу + ; закрыть файл + ld a,(hFile4) + jp CloseFile + ; +trd_err: ld a,1 + ld (sFlag1),a + ret + diff --git a/ESTEX.BS b/ESTEX.BS new file mode 100644 index 0000000000000000000000000000000000000000..8a720a5b61d8c8b82c8eff62838741ff7158fa20 GIT binary patch literal 1536 zcmcIjZAe>J7(Pc`W@2;A-D>CU*7e*7YfK?q^JA8vck72OZRwOGT0g2I>a~VyBIdTM z+epK0F47ftV1EbuImt?KmUgB4(P^E-O!8wbMXelS29ZH_(IQeA%XQ~OyLPbs+~wYL z&&Tt;=XuZb9-k5zQi7p#E|&|exj~F;OH1(JJ`ae^UUpb=d_|G&r4ze&po#zxu?WDX zBD$JBXqvL9sm_=LXtQ>)(hx^uunX3fj+K_`<4Y5zb?9j_buv~7qE&ZhQvI>Yr-s#G zHY^SfsxY18K2N_1xOkx>?fo8AKFab4z|UZs2YczfgrM4(&iqoblYxNM;_s7DWH_S8 z1E?<$L0z&OqMd$4?s1{UAvqF3-g;lXA1Pr(M=UKg9KJAwy2As57ZiEOWwp>Kt>Fu( zuqgNZa~XXURQgZ=U6h9+!EgwLd(q(&4L%eMu>b)j*wrs@VU)gLrcC=3PdfWA^!tV-%`H~uv&cEo+GB+>8QNe+4KOxN3upv7|*&|=}v z&LwFCT2t3lR#Vf?(GkAsn^E115E0Lfm`X^r#NZs2hRLzhC~?>f=-9#AKwhvdOGQ&s zjC7WgW-|#{NN*YGBIn6gN_;|tO^}uCs%|FAT)LQJ_pTHXH4}L;q2;3$#_Bvfwi`I#$>p2N1^ac{+m&yA&2v{1>d>F| zF`UbX_(y)65Ke8;fa;|5`H@@4k2c*DF=8 z+MY(M4CMI3I8ZYYHQp6BHytk^abo0$Lqwbw~=g?9u%J#VIfin;u(^e zoS(SF0{|hYLyI*@jwj;P5qedLV4WdRaHnR*$U0U?v~1aieiOgch@W(r%68vFi!_4` zHWKgR97I6>cC0q3`v}ga#^ZWB!8CCL9ps=F(fTQ6J7z|c$2sq_k&{qux3OR+I5VG0 z$LDiXN__wR9OWIS=f-R!!h`8}m2E?Bzln)JW$JBu`y%bKr1Z9A)^iIR?w>i02gPHx zy7$5FaiO|SKb63De++2!w1m#8W^rYcR#-*?Nqrp7osbmUi@XwK-QHiPX#& zIZr6*@e%Fg=16. usec delay + ;ld b,5 + ;djnz $ ; 13 T-states each + ld a,1Fh + dec a + jr nz,$-1 + ret +;---- + +; сброс контроллера +;A0929: ld a,0D0h +; jr A092C +; головку на 0-ю дорожку +A092A: ld a,8 +; послать команду +A092C: out (REGCOM),a + exx + ld b,3+3; ; 3 счетчик + call delay ; микро-пауза +.loc2: ld de,0 +.loc3: in a,(REGCOM) + ;bit 7,a ; дискета менялась ? (NZ-да) + ;... + rrca ; тест на 0-й бит + jr nc,.loc4 ; готов + dec de + ld a,d + or e + jr nz,.loc3 + djnz .loc2 +.loc4: in a,(REGCOM) ; получить код статуса + exx + ret + + + + +; Ожидание готовности НГМД +L07AF: xor a + ld (side),a ; тек. сторона +L07B3: call L0870 ; в контроллер сторону и диск + ld a,3+6; ; 3 число попыток ожидания + ld (L0ACB),a + ; цикл ожидания +.loc1: ld hl,0 +.loc2: in a,(REGCOM) + and 0x81 ; 7 и 0 биты + ret z + dec hl + ld a,h + or l + jr nz,.loc2 + ; декремент попыток ожидания + ld hl,L0ACB ; число попыток + dec (hl) + jr nz,.loc1 + ; 3 попытки ожидания закончены + call A0929; ;закоммент. сброс контроллера + ;call A0626 ; сбросить обращение к ВГ93 + ld a,0x80 ; код - нет диска + or a + ret + + + +; Запись сист. области ms-dos или trd-бута +L09D9: ld a,(density) + ld c,8Fh ; turbo on/off + RST ToBIOS + xor a + ld (tracks),a + call A092A ; перейти на 0-ю дорожку + ld hl,L2400 ; буфер сист. области + ld (L0AC8),hl + ld a,(_OS) + or a + jr z,_msdos + dec a + jr z,_trdos + ret + ;jp _cpm80 + ; Копирует 2-ю FAT и записывает сист. область дискеты, + ; при вкл. опции копирует загрузчик Estex в секторы 2..4. +_msdos: ld a,(media5) ; число секторов на FAT + ld e,a + ld hl,0 + ld bc,512 +.loc0: add hl,bc + dec a + jr nz,.loc0 + ld a,e + push hl + ld hl,0 + ld de,L2400+512 ; начало 1-й FAT +.loc1: add hl,bc + dec a + jr nz,.loc1 + pop bc + add hl,de + ex de,hl + ldir + ld a,(cSystem) ; флаг создания сист. дискеты + or a + jr z,.loc2 + ; копир. загрузчика Estex в сист. область + ld hl,ES_Boot ; код загрузчика + ld de,L2400+512 ; начало 1-й FAT + ld bc,1536 ; 512*3 сект. = размер загрузчика + ldir + ; скоррект. BPB в буфере + ld a,(media5) + inc a + ld (L2400+14),a + ld a,1 ; число копий FAT + ld (L2400+16),a ; смещ. на число копий + ; +.loc2: call L07AF ; ожидание готовности нгмд + ; запись 0-й стороны + ld a,1 + ld (sect),a ; 1-й сектор (boot) + call L0870 ; сторону и диск в контроллер +L08F0: call L0906 ; запись сектора + ret nz ; ошибки записи + ld a,(sect) ; тек. сектор + inc a + ld (sect),a +loc02: cp 18+1 ; запредельный сектор + jr nz,L08F0 + ; запись 1-й стороны + ld a,1 + ld (side),a ; тек. сторона + ld (sect),a ; тек. сектор + call L0870 ; сторону и диск в контроллер +L08F6: call L0906 ; запись сектора + ret nz ; ошибки записи + ld a,(sect) ; тек. сектор + inc a + ld (sect),a +loc03: cp 18+1 ; запред. сектор ? + jr nz,L08F6 + ret + +; Запись сист. области TR-DOS. +; При boot-диске корректирует начало своб. места, +; число своб. секторов и число запис. файлов +_trdos: xor a ; вычислить число своб. секторов + ld hl,(BadSect) + ex de,hl + ld hl,2544 ; общее число секторов + sbc hl,de ; минус bad-секторы + ld (L2400+2277),hl ; число своб. секторов + ld e,16 ; предустановка + ; + ld a,(sFlag1) + or a + jr nz,.loc8 ; ошибки работы с файлом "boot.$b" + ld a,(cSystem) ; флаг создания boot-дискеты + or a + jr z,.loc8 ; не загрузочная + ; + call copy1 ; скопировать тело бута + ld a,(NameBt+14) + ld c,a + add a,e + ld e,a ; e=1000h+размер бута + xor a + ld b,a + sbc hl,bc ; минус размер бута (в секторах) + ; число файлов, запис. на диск + inc a + ld (L2400+2276),a + ; занести реальное число своб. секторов + ld (L2400+2277),hl + ; вычисл. начало своб. места + ld a,c + cp 16 + jr c,.loc6 ; размер бута меньше 16-ти секторов + add a,10h + rrca + rrca + rrca + rrca + ld h,a + ld l,b + jr .loc7 +.loc6: ld hl,0100h + add hl,bc +.loc7: ld (L2400+2273),hl ; начало своб. места на диске + ; +.loc8: call L07AF ; ожидание готовности нгмд +.loc2: ld a,1 ; с 1-го сектора + ld (sect),a + call L0870 ; сторону и диск в контроллер +.loc3: call L0906 ; запись сектора + ret nz ; ошибки записи + dec e + ld a,(sect) ; тек. сектор + inc a + ld (sect),a + cp 16+1 ; запред. сектор + jr nz,.loc3 + ; след. сторона + ld a,(side) + xor 1 + ld (side),a + ld a,e + or a + ret z ; записана только сист. область + sub 16 + jr c,.loc4 ; остаток меньше 16-ти секторов + ld a,(side) + or a + call z,NxtTrack + jr .loc2 + ; +.loc4: add a,16 ; a=остаток секторов + ld b,a + ld a,1 ; с 1-го сектора + ld (sect),a + exx + call L0870 ; сторону и диск в контроллер + exx +.loc5: push bc + call L0906 ; запись сектора + pop bc + ret nz ; ошибки записи + ld hl,sect ; тек. сектор + inc (hl) + djnz .loc5 + ret + +; Скопировать тело бута из буфера TRBoot в буфер L2400+1000h +copy1: exx + in a,(Page1) + ex af,af' + ld a,(TRBoot) + out (Page1),a ; подкл. буфер + ld hl,4000h ; начало Page1 + ld de,L2400+1000h +SizeBt: ld bc,4000h + ldir + ex af,af' + out (Page1),a ; подкл. буфер + exx + ret + +; заголовок бута "boot.$b" +NameBt: ds 17 + + + + + + + + + +L0906: ld a,(sect) ; тек. сектор + out (REGSEC),a ; регистр сектора + ld a,0xA0 ; запись сектора +; ЗАПИСЬ СЕКТОРА (дорожки) +; 0x00 - Ok +; 0x40 - Read-Only +; 0x80 - No disk +; Z - без ошибок, NZ - ошибки +; Коды возврата действительны при записи секторов. +A0875: push de + ld hl,(L0AC8) ; адрес буфера + ld de,0 + ld b,4 ; счетчик + di + ld c,REGDATA ; порт данных + out (REGCOM),a ; послать команду +.loc1: in a,(REGCTRL) + and 0C0h + jr nz,.loc2 + dec de + ld a,e + or d + jr nz,.loc1 + djnz .loc1 + ld a,0x80 + jr .loc4 ; нет диска +.loc2: outi ; (hl) -> в порт +.loc3: in a,(REGCTRL) + and 0C0h + jr z,.loc3 + jp p,.loc2 + in a,(REGCOM) +.loc4: ld (RetCode),a + ld (L0AC8),hl + pop de + ei + ex af,af' + call A0929 + ex af,af' + or a + ret + + + +; Запись дорожки +L091B: in a,(Page3) + push af + ld a,(BuffTrk) + out (Page3),a ; подкл. буфер структуры дорожки + ld hl,L4000 ; начало данных + ld (L0AC8),hl + call L0870 ; в контроллер сторону и диск + ld a,(tracks) ;- тек. дорожка + out (REGTRK),a ;- регистр дорожки + ld a,0xF4 ; запись дорожки + call A0875 + pop af + out (Page3),a + ret + + + +; Уст. головку на след. дорожку +NxtTrack: + ld hl,tracks + inc (hl) +; Уст. головку на тек. дорожку +L0759: ld a,(tracks) ; тек. дорожка + out (REGDATA),a ; регистр данных + ld a,18h ; перейти на задан. дорожку + jp A092C ; занести команду + + + + + +; ЧТЕНИЕ СЕКТОРА. +; Чтение происходит в никуда, т.е. верификация. +; Read-Only не ловит +; 0x00 - Ok +; 0x08 - ошибка CRC +; 0x10 - не найдены требуемые дорожка, сектор или сторона +; 0x80 - No disk +; Z - без ошибок, NZ - ошибка +L0C65: ld a,(sect) ; тек. сектор + out (REGSEC),a ; в регистр сектора + ld a,(side) ; тек. сторона + add a,a + add a,a + add a,a + or 0x80 + ; 0-я сторона: 80h + ; 1-я сторона: 88h + call A092C ; занести команду + di + ld c,REGCOM + ld b,3 ; счетчик попыток +.loc1: ld de,0 ; счетчик +.loc2: in a,(c) + and 0x18 ; 4,3-й биты + jr nz,.loc6 ; ошибка + in a,(REGDATA) + dec de + ld a,d + or e + jr nz,.loc3 + djnz .loc1 + ld a,0x80 ; код "нет диска" + or a + jr .loc5 +.loc3: in a,(c) + and 1 ; 0-й бит + jr nz,.loc2 ; контр. занят + in a,(c) + and 0x18 ; тест на 4,3-й биты +.loc5: ld (RetCode),a + ei + ex af,af' + call A0929 + ex af,af' + or a + ret +.loc6: djnz .loc1 + jr .loc5 + + +; Чтение (верификация) секторов одной стороны +; Z - Ok +; NZ - есть ошибки +; "CY" - процесс прерван +L0C87: ld a,maska ; 05h + ld (bad),a ; признак норм. сектора + ld (flg_bad+1),a ; сбр. флаг наличия bad-секторов + ld (flg_wrn+1),a ; сбр. флаг наличия warn-секторов + ld a,1 + ld (sect),a ; тек. сектор + call L0870 ; сторону и диск в контроллер +L0C8C: ld a,3+1 ; 3 попытки + ld (L0C63),a ; тек. попытки чтения сектора +L0C91: call L0D25 ; признак нажатия клавиши + ret c ; процесс прерван + call L0C65 ; тест на чтение сектора + jr z,L0CC3 ; без ошибок + ; анализ ошибки + cp 0x80 + jr z,L0CB7 ; отсутствует диск + ; сектор не читается + xor a + ld (flg_wrn+1),a ; уст. флаг "были подозр. секторы" + ld hl,L0C63 ; тек. попытки чтения сектора + dec (hl) ; уменьшить число попыток + jr nz,L0C91 ; повторить чтение + ; все попытки истекли + ld a,(tracks) ; тек. дорожка + or a ; нулевая ? + jr nz,L0CB8 + ; плохая нулевая дорожка (на парсинг ошибок) +L0CB7: xor a + dec a + ret +; Отметить сектор как "BAD" +L0CB8: xor a + ld (flg_bad+1),a ; уст. флаг "были bad-секторы" + ld a,(_OS) ; тип ОС-и ms-dos ? + or a + call z,L0ACF ; вычислить ячейку bad-сектора в FAT-е + push bc + call CalcAvail ; ++bad-сект. с выводом "Available bytes" + pop bc +L0CC3: ld hl,sect + inc (hl) ; инкремент тек. сектора +loc06: ld a,18+1 + cp (hl) ; запред. сектор ? + jr nz,L0C8C ; читать след. сектор + ; все секторы стороны прочитаны +flg_bad:ld a,1 + or a + jr z,_done1 ; были "bad" +flg_wrn:ld a,1 + or a + jr z,_done2 ; были "warn" + xor a + ret + ; +_done1: ld a,2 + ld (bad),a + xor a + ret +_done2: xor a + ld (bad),a + ret + + + + + + +;[]==============================================================[] + +; вычислить ячейку bad-сектора в FAT-е +L0ACF: ld hl,(media6) ; секторов на сторону + add hl,hl ; *2 (секторов на всю дорожку) + ex de,hl + ld hl,0 + ld a,(tracks) ; тек. дорожка +L0AD8: add hl,de + dec a + jr nz,L0AD8 + ld a,(side) ; тек. сторона + or a + jr z,L0AE8 + ld de,(media6) ; секторов на сторону + add hl,de +L0AE8: ld a,(sect) ; тек. сектор + ld e,a + add hl,de + ld a,(LastSect) ; номер посл. служ. сектора дискеты + cpl + inc a + ld e,a + ld d,0xFF + add hl,de + xor a + ld a,h + rra + ld h,a + ld a,l + rra + ld l,a + ld a,(media1) ; секторов на кластер + ld e,a + ld d,0 + add hl,de +; Помечает в буфере FAT-а bad-сектор + push hl + push de + ld a,l + rrca ; четный/не четный ? + jr nc,L0A1C ; четный сектор + call L0A2C + ld a,(hl) + and 0x0F + or 0x70 + ld (hl),a + inc hl + ld (hl),0xFF + jr L0A28 +L0A1C: call L0A2C + ld (hl),0xF7 + inc hl + ld a,(hl) + and 0xF0 + or 0x0F + ld (hl),a +L0A28: xor a + pop de + pop hl + ret +L0A2C: push hl + xor a + ld a,h + rra + ld h,a + ld a,l + rra + ld l,a + pop de + add hl,de + ld de,L2400+512 ; начало 1-й FAT + add hl,de + ret + + + + +;[]============================================[] +; Установка смещения порядковых номеров +; секторов на +2 (лучший вариант). +; +add_offset: + ld hl,(media6) ; число секторов в тек. формате + ld a,(_OS) ; тип ОС-и + or a + jr z,.loc0 ; ms-dos + ld l,16 ; число секторов tr-dos + dec a + ret nz ; cpm/80 +.loc0: ld c,l + ld b,0 + ld hl,(INTERL+1) ; массив номеров секторов + ld d,h + ld e,l + add hl,bc ; в конец массива + ld b,c + inc b +.loc1: ld a,(hl) + push af ; накопить в стеке номера секторов + dec hl + djnz .loc1 + inc hl + ; + inc hl ;- смещ. на 2 сектора + inc hl ;- + ld b,c + dec b ;- число секторов - 2 + dec b ;- +.loc2: pop af + ld (hl),a + inc hl + djnz .loc2 + ; + pop af + ld (de),a + inc de + pop af + ld (de),a + pop af ; выровнять баланс стека + ret + + +; Установить интерлив для всех форматов +init_interlive: + ; для 720kB, 1.44Mb..1.64Mb + ld b,20 ; число секторов + ld hl,INTERL1 + ld c,1 +.loc1: ld (hl),c + inc c + inc hl + djnz .loc1 + ; для 1.68Mb..1.74Mb + ld b,10 + ld de,010Ch ; c=12 + call .loc2 + ld (hl),d + inc hl + ; для 800kB..830kB + ld b,5 + ld de,0106h + call .loc2 + ; для TR-DOS + ld b,8 + ld de,0109h +.loc2: ld (hl),d + inc hl + ld (hl),e + inc d + inc e + inc hl + djnz .loc2 + ret + + + +; Таблицы интерливов секторов +; +; 720kB, 1.44Mb..1.64Mb +INTERL1:ds 20 ; 1,2,3,...20 + +; 1.68Mb..1.74Mb +INTERL2:ds 21 ; 1,x,2,x,3,x,... (интерлив = 2) + +; 800kB..830kB +INTERL3:ds 10 ; интерлив = 2 + +; TR-DOS +INTERL4:ds 16 ; интерлив = 2 + + + + +; Получить тек. номер сектора из таблицы +; интерлива и настроить раб. ячейку +L0B05: push hl + ld a,(L0BA9) ; счетчик секторов + ld c,a + ld b,0 +INTERL: ld hl,INTERL1 ; таблица интерлива секторов + add hl,bc + ld a,(hl) ; получить интерлив сектора + ld (sect),a ; тек. сектор + pop hl + ret + + + +; размер GAP1-а +GAP1 equ 50 + +; межсекторный пробел (перем. величина, задается при форматировании) +GAP3 dw 108 ; по-умолчанию для 1.44Mb + +; Подготовить заголовки секторов дорожки (одной стороны) +L0BAA: in a,(Page3) + push af + ld a,(BuffTrk) + out (Page3),a ; подкл. буфер дорожки + xor a + ld (L0BA9),a ; обнулить счетчик секторов + ; + ld hl,GAP1+16 + ld (L0BB5+1),hl + ld a,GAP1 + ld (GAP+1),a + ld hl,L4000+96 ; перейти на начало сектора (обойти GAP4A) + ; + ; цикл иниц. заголовков секторов +L0BB2: call L0B05 ; получить тек. номер сектора из таблицы интерлива +L0BB5: ld bc,GAP1+16 ;# перейти на заголовок сектора (66=GAP1+12синхро+IDAM) + add hl,bc ; hl=адрес заголовка + exx + ld bc,16 ; 12 синхро-байт + IDAM + ld hl,(GAP3) + add hl,bc + ld (L0BB5+1),hl ; уст. межсект. пробел + exx + ; заголовок сектора + ld a,(tracks) ; тек. дорожка + ld (hl),a + inc hl + ; + ld a,(_OS) + or a + jr z,.loc1 + dec a + jr z,.loc2 ; для TR-DOS всегда 0-я сторона + ; +.loc1: ld a,(side) ; тек. сторона +.loc2: ld (hl),a + inc hl + ld a,(sect) ; тек. сектор + ld (hl),a + inc hl +L0BB6: ld bc,553 ; после заголовка сектора до конца сектора + add hl,bc + ld a,(L0BA9) ; счетчик тек. сектора + inc a + ld (L0BA9),a +loc05: cp 18 ; посл. сектор ? + jr nz,L0BB2 + pop af + out (Page3),a ; восст. раб. страницу + ret + + + +; Создает в буфере структуру дорожки +; Буфер: 0xC000..0xFFFF +L0B21: in a,(Page3) + push af + ld a,(BuffTrk) + out (Page3),a ; подкл. буфер дорожки + call CLEAR ; заполнить буфер кодом 0x4E + ld hl,L4000 ; начало буфера данных дорожки + xor a + ld (L0BA9),a ; обнулить счетчик секторов +; Начало дорожки + ; GAP4A, 80 байт + ld bc,504Eh ; 80 байт 4Eh + call FILL ; c -> (hl), dec b + ld bc,0C00h ; 12 синхро-байт + call FILL + ld bc,03F6h ; 3 байта F6 | + call FILL ; | IAM + ld (hl),0FCh ; 1 байт FC | + inc hl +; начало сектора (+96 первого сектора от нач. дорожки) +L0B3E: ; GAP1, 50 байт +GAP: ld b,GAP1 ; GAP1/GAP3 + ld c,4Eh + call FILL ; c -> (hl), dec b + ; синхро-байты + ld bc,0C00h ; 12 синхро-байтов + call FILL + ; + ld bc,03F5h ; 3 байта F5 маркера | + call FILL ; | IDAM + ld (hl),0FEh ; и FE, его идентификатор | + inc hl + ; Заголовок сектора + ld bc,0300h ; 3 байта заголовка сектора + call FILL +SecCode:ld (hl),2 ; код размера сектора + inc hl + ld (hl),0F7h ; 1 байт CRC + inc hl + ld bc,164Eh ; 22 байта GAP2 + call FILL + ld bc,0C00h ; 12 синхро-байтов + call FILL + ; DATA AM + ld bc,03F5h ; 3 байта маркера + call FILL + ld (hl),0FBh ; и его идентификатор + inc hl + ; Область данных + ld bc,00E5h ; 256 байтов заполнителя + call FILL ; c -> (hl), dec b + ld a,(_OS) ; тип текущей ОС + or a + jr z,.loc1 ; ms-dos + dec a + jr z,.loc2 ; tr-dos + ; cpm-80 + ld bc,00E5h ; 256 + call FILL + ld bc,00E5h ; 256 + call FILL +.loc1: ld bc,00E5h ; 256 + call FILL + ; CRC области данных +.loc2: ld (hl),0F7h ; 1 байт +; Конец сектора + inc hl + ld a,(GAP3) + ld (GAP+1),a ; уст. межсект. пробел + ld a,(L0BA9) ; счетчик номера тек. сектора + inc a + ld (L0BA9),a +loc08: cp 18 ; последний сектор ? + jr nz,L0B3E +; GAP4B, остаток дорожки (буфер уже заполнен 0x4E) + pop af + out (Page3),a ; вкл. рабочую страницу 0xC000 + ret + +FILL: ld (hl),c + inc hl + djnz FILL + ret + + +; Заполнение буфера структуры дорожки кодом 0x4E +CLEAR: ld (L0ACD),sp + ld sp,0 ; заполнение с 0xFFFF + ld bc,0x4E4E ; код заполнения +.loc1: push bc + ld hl,0 + add hl,sp + ld a,h + cp 0xC0 ; ст. байт нижней границы + jr nz,.loc1 + ld a,l + or a + jr nz,.loc1 + ld sp,(L0ACD) + ret + + + + +; Создает в буфере системную область дискеты (boot-сектор, FAT, Root dir). +; Буфер: L2400... +; макс. длина области: 0x4C00 для 1.74Mb +L09A8: ld de,L2400 ; буфер Boot-сектора + ld hl,MS_Boot ; ms-dos boot-сектор + ld bc,512 ; длина boot-а + ldir + ex de,hl ; hl = начало FAT в буфере +loc07: ld bc,16896 ; 6656/16896 длина FAT-ов + Root dir + ld e,0 ; байт заполнения + call L0994 ; перекачка е -> (hl) + ld a,(media4) ; байт-описатель формата диска + ld hl,L2400+512 + ld (hl),a ; занести первым байтом в FAT + inc hl + ld (hl),0FFh ; 2 и 3-й байты FAT + inc hl + ld (hl),0FFh + ret + +L0994: ld (hl),e + inc hl + dec bc + ld a,b + or c + jr nz,L0994 + ret + + + + +; Настроить форматилку на тек. формат дискеты +FSETUP: ld a,(_OS) + or a + jr nz,noMSDOS +frm1: ld a,18 ; число секторов + ld (loc05+1),a + ld (loc08+1),a +SSect: ld hl,18 ; секторов на сторону + ld (media6),hl ;; + inc a ; запред. сектор + ld (loc02+1),a + ld (loc03+1),a + ld (loc06+1),a +frm2: ld a,34 ; посл. служ. сектор дискеты + ld (LastSect),a +frm3: ld a,1 ; секторов на кластер + ld (media1),a +frm4: ld a,0xF0 ; байт формата + ld (media4),a +frm5: ld hl,16896 ; размер FAT-ов + Root dir + ld (loc07+1),hl +frm6: ld hl,224 ; записей в корне + ld (media2),hl +ASect: ld hl,2880 ; секторов на диске + ld (media3),hl ;; +FSect: ld hl,9 ; секторов на FAT + ld (media5),hl ;; + ret + ; +noMSDOS:dec a + jr nz,SetCPM +; Настроить форматилку на формат TR-DOS + ld a,16 ; число секторов + jr setOS +; Настроить форматилку на формат CP/M-80 +SetCPM: ld a,5 ; число секторов +setOS: ld (loc05+1),a + ld (loc08+1),a + inc a ; запред. сектор + ld (loc06+1),a + ret + + + +; Создает в буфере системную область TR-DOS дискеты. +SysAreaTRDOS: + ; очистить место до бута + ld hl,L2400 ; буфер сист. области + ld bc,1000h ; 16*256 + ld e,0 ; байт заполнения + call L0994 ; очистить сист. область + ld a,(sFlag1) + or a + jr nz,.loc0 ; ошибки работы с файлом "boot.$b" + ld a,(cSystem) ; флаг создания boot-дискеты + or a + jr z,.loc0 ; не загрузочная + ; + ld hl,NameBt + ld de,L2400 + ld bc,13 + ldir + inc hl + ldi + ex de,hl + ld (hl),0 + inc hl + ld (hl),1 + ; +.loc0: ld hl,L2400+2274 ; +226 от начала + ld (hl),1 ; ст.байт начало своб. места на диске + inc hl + ld (hl),22 ; тип разметки диска + inc hl ; число файлов на диске + inc hl + ld (hl),240 ; число своб. секторов + inc hl ; + ld (hl),9 ; + inc hl + ld (hl),16 ; +231 число секторов на дорожке + ; + ld de,LABEL ; буфер имени метки форматилки + ld a,(de) + or a + jr nz,.loc1 ; метка задана + ld de,.loc4 ; метка по умолчанию +.loc1: ld hl,L2400+2293 ; перейти на метку в буфере + ex de,hl + ld b,11 ; длина метки +.loc2: ld a,(hl) + or a + jr z,.loc3 + ld (de),a + inc hl + inc de + djnz .loc2 + ret +.loc3: ld a," " + ld (de),a + inc de + djnz .loc3 + ret + ; tr-dos метка по умолчанию +.loc4: db "FFORMAT",0 + + + + + + + +LastSect: + db 34 ; 34/14, посл. служ. сектор +DISK: db 0 ; диск (0=A,1=B) + +L0AC8: dw 0 ; тек. адрес в сист. буфере +L0ACB: db 0 ; счетчик попыток ожидания +L0ACD: dw 0 ; сохр. стека + +L0BA9: db 0 ; счетчик секторов + +L0C63: db 0 ; тек. попытки чтения сектора +;L0C64: db 0 ; тек. число 3-х разовых попыток чтения +BadSect:dw 0 ; число bad-секторов + +sect: db 0 ; тек. сектор +side: db 0 ; тек. сторона +tracks: db 0 ; тек. дорожка +RetCode:db 0 ; код возврата записи сектора/дорожки +density:db 0 ; 13h/12h режим 1.44Mb/720kB + + + + + +; Главная функция форматирования +L0BFF: ld a,(density) + ld c,8Fh ; turbo on/off + RST ToBIOS + ld hl,0 + ld (BadSect),hl ; число bad-секторов + call InitElapsedTime ; сохр. и сбросить время + call L07AF ; ожидание готовности нгмд + ; цикл формат. дорожек +L0C14: call L0BDA ; форматирование + ret c ; формат. прервано + ret nz ; есть ошибки чтения + ; нет ошибок + ld a,(Mode2) ; "Optimize sectors" + or a + call nz,add_offset ; смещ. +2 к порядк. номерам секторов + ld hl,tracks + inc (hl) ; ++тек. дорожки +TRACKS: ld a,82 + cp (hl) + jr nc,L0C14 + xor a ; конец форм-ния (или при ошибках) + ret + + +; Форматир. одной дорожки +L0BDA: xor a + ld (side),a ; тек. сторона + ld (RetCode),a ; сбр. возвр. код +L0BDE: ;ld a,2 + ;ld (L0C64),a ; число 3-х разовых попыток + call L0BAA ; иниц. заголовков секторов дорожки + call L0759 ; уст. головку на тек. дорожку + call L091B ; запись целой дорожки + call L0C87 ; тест на чтение секторов одной стороны + ret c ; выход - процесс прерван + ret nz ; есть ошибки чтения + call Map ; вывод карты + call L0D93 ; вывод "Side: X" + call L0D92 ; вывод "Cylinder: XX" + call ElapsedTime ; вывод времени работы + call L0D25 ; признак нажатия клавиши + ret c ; процесс прерван + ld hl,side + inc (hl) ; смена стороны + ld a,(hl) ; тек. сторона + cp 1+1 ; запредельная ? + jr nz,L0BDE + xor a + ret + + + + +; Вывод тек. номера дорожки +L0D92: ld de,1323h ; Y/X полож. курсора + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ld a,(tracks) ; тек. дорожка + ld l,a + ld bc,10 ; десятки + ld h,b + ld de,space4 + ld iy,tmp1 + res 7,(iy+0) + call GetLenN16 + ld a,l + add a,"0" + ld (de),a + ld hl,space4 + ld bc,0285h ; вывод строки + ld e,ColFormNumber ; атрибут + RST ToBIOS + ret + + +; Вывод тек. стороны +L0D93: ld de,1316h ; Y/X полож. курсора + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ld a,(side) ; тек. сторона + add a,"0" + ld bc,0181h ; вывод символа + ld e,ColFormNumber ; атрибут + RST ToBIOS + ret + + + + +; Сохранение и сброс тек. времени +InitElapsedTime: + ld c,0F5h ; проверить наличие м/с CMOS + RST ToBIOS + jr nc,.loc1 ; есть м/с + xor a ; false + ld (cmos),a + ret +.loc1: ld a,1 ; true + ld (cmos),a + ld de,140Fh ; Y/X полож. курсора + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ld hl,.string + ld bc,0E85h ; вывод строки + ld e,ColFormText ; цвет строки + RST ToBIOS + ld hl,.time + ld bc,0885h ; вывод строки + ld e,ColFormNumber ; атрибут + RST ToBIOS + ; сохр. тек. время + ld c,21h + RST ToDSS + ld (hours),hl ; часы/минуты + ld a,b + ld (seconds),a ; секунды + ; сбросить время + ld h,0 ; часы + ld l,h ; минуты + ld b,h ; секунды + ld c,22h ; уст. текущие дату и время + RST ToDSS + ret + +.string:db "Elapsed time: " +.time: db "00:00:00" + + +hours: dw 0 ; часы/минуты +seconds:db 0 ; секунды +cmos: db 0 ; флаг наличия м/с CMOS (false/true) + + +; Вывести время работы +ElapsedTime: + ld a,(cmos) + or a + ret z ; нет м/с CMOS + ld de,141Dh ; Y/X полож. курсора + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; + ld c,21h ; получить тек. время + RST ToDSS + ex de,hl + ld a,d + ld hl,elptime + call GetData ; часы + ld a,e + call GetData ; минуты + ld a,b + call GetData ; секунды + ; + ld hl,elptime + ld bc,0885h ; вывод строки + ld e,ColFormNumber ; атрибут + RST ToBIOS + ret + +elptime:db "00:00:00" + +; Вывод десятков с ведущим нулем +; вх: A=число +; HL=буфер +GetData:ld c,"0"-1 +.loc1: inc c + sub 10 + jr nc,.loc1 + ld (hl),c + inc hl + add a,58 + ld (hl),a + inc hl + inc hl + ret + + + + +; Восст. системное время +RestoreTime: + push af + ld a,(cmos) + or a + jr z,.loc1 ; нет м/с CMOS + ; получить тек. время (elapsed time) + ld c,21h + RST ToDSS + ; d - день + ; e - месяц + ; ix - год + ; h - час + ; l - минуты + ; b - секунды + push de + ex de,hl ; de = elapsed time + ld hl,(hours) ; часы/минуты + ld a,(seconds) ; секунды + call CalcTime + pop de + ; уст. время + ld c,22h + RST ToDSS +.loc1: pop af + ret + + +; корректировка времени +CalcTime: + ld c,60 + ; секунды + add a,b + cp c + jr c,.loc1 + inc e ; ++минуты + sub c +.loc1: ld b,a + ; минуты + ld a,l + add a,e + cp c + jr c,.loc2 + inc d ; ++часы + sub c +.loc2: ld l,a + ; часы + ld a,d + add a,h + cp 24 + jr c,.loc3 + sub 24 +.loc3: ld h,a + ret + + + + + + + + + + + +;-------------------------------------------------+ +; MS-DOS загрузчик дискет (из fformat), 512 байт. | +; формат 1.44Mb. | +; для 720kB см. метку '#' | +;-------------------------------------------------+ +MS_Boot: + db 0xEB,0x3C,0x90 ; 3 байта, код перехода на загрузчик + db "DSS 1.60" ; 8 байт, OEM ID +;BPB, 17 байт +BPB: dw 512 ; байт на сектор +media1: db 1 ; # 2, секторов на кластер + dw 1 ; зарезерв. секторов + db 2 ; число FAT-ов +media2: dw 224 ; # 112, записей в корне +media3: dw 2880 ; # 1440, всех секторов на диске +media4: db 0xF0 ; # 0xF9, байт формата +media5: dw 9 ; # 3, секторов на FAT +media6: dw 18 ; # 9, секторов на сторону + dw 2 ; кол-во сторон диска +;extended boot-record + dw 0,0 ; скрытых секторов + dw 0,0 ; всех секторов на диске + dw 0 ; физ. номер диска + db 0x29 ; сигнатура расш. boot-записи + dw 96C2h,2D3Ah ; серийный номер дискеты 2D3A:96C2 + db "NO NAME " ; 11 байт, метка дискеты + db "FAT12 " ; 8 байт, ID файловой системы +;--------------------------------------------------------------------- + db 0xFA,0x33,0xD2,0x8E,0xD2,0xBC,0xF0,0x7B + db 0xFB,0xB8,0xC0,0x07,0x8E,0xD8,0xE8,0x89 + db 0x00,0xBE,0xFE,0x00,0xFC,0xBB,0x70,0x00 + db 0xE8,0x25,0x00,0x32,0xE4,0xCD,0x16,0x3C + db 0x1B,0x74,0x18,0x3C,0x0D,0x74,0x08,0x3C + db 0x20,0x74,0x04,0x3C,0x6F,0x75,0xEC,0xBE + db 0xDF,0x01,0xE8,0x0B,0x00,0xBE,0xC1,0x01 + db 0xE8,0x05,0x00,0xE8,0x5C,0x00,0xCD,0x19 + db 0xAC,0x0A,0xC0,0x74,0x46,0x3C,0x01,0x75 + db 0x05,0xAC,0x8A,0xD8,0xEB,0xF2,0x3C,0x02 + db 0x75,0x0A,0xAD,0x8B,0xD0,0x56,0xE8,0x62 + db 0x00,0x5E,0xEB,0xE4,0x3C,0x03,0x75,0x0A + db 0xAC,0xA2,0x00,0x00,0x89,0x36,0x01,0x00 + db 0xEB,0xD6,0x3C,0x04,0x75,0x0C,0xFE,0x0E + db 0x00,0x00,0x74,0x04,0x8B,0x36,0x01,0x00 + db 0xEB,0xC6,0x33,0xC9,0xA8,0x80,0x74,0x05 + db 0x24,0x7F,0x8A,0xC8,0xAC,0x41,0xE8,0x17 + db 0x00,0xEB,0xB5,0x36,0xA1,0x6C,0x04,0x05 + db 0x04,0x00,0x36,0x39,0x06,0x6C,0x04,0x72 + db 0xF9,0xC3,0xB8,0x03,0x00,0xCD,0x10,0xC3 + db 0x56,0x3C,0x0A,0x74,0x10,0xB4,0x09,0xCD + db 0x10,0x02,0xD1,0x80,0xFA,0x50,0x73,0x05 + db 0xE8,0x08,0x00,0x5E,0xC3,0xFE,0xC6,0x32 + db 0xD2,0xEB,0xF5,0xB4,0x02,0xCD,0x10,0xC3 + ; 21 байт + db " FFORMAT Version " + db major_version + "0","." + db (minor_version / 10) + "0",(minor_version % 10) + "0" + ; + db 0xBA,0x20,0x01,0x1F,0x03,0x07,0xCF,0xB0 + db 0x04,0x91,0xB0,0x01,0x4E,0x80,0xC9,0xA7 + db 0xCD,0x80,0xBB,0x01,0x1F,0x93,0xB0,0x03 + db 0x06,0x91,0xB0,0x01,0x4E,0x80,0xBA,0xA7 + db 0x20,0x80,0xBA,0x01,0x07,0x81,0xB0,0x01 + db 0x1F,0x91,0xB0,0x04,0x91,0xB0,0x01,0x4E + db 0x80,0xC8,0xA7,0xCD,0x80,0xBC,0x01,0x07 + db 0x81,0xB0,0x01,0x1F,0x91,0xB0,0x93,0xB0 + db 0x01,0x07,0xA9,0xB0,0x01,0x1F,0x91,0xB0 + db 0x03,0x07,0xCF,0xB0,0x04,0x01,0x70 + ; 16 байт + db " RLE Boot record" + db 0xC6,0x20,0x01,0x4F,0x02,0x15,0x0A + ; 36 байт + db "Sorry, but this disk is not bootable" + db 0x02,0x16,0x0B + ; 33 байта + db "Insert SYSTEM disk into the drive" + db 0x01,0x7F,0x02,0x22,0x0D + ; не нажатый бутон + db "",82h,20h,01h,7Ch,"O",01h,7Fh,"k",82h,20h,"" + db 0x01,0x40,0x80,0xDC,0x02,0x23,0x0E,0x89 + db 0xDF,0x02,0x00,0x19,0x00,0x01,0x4E,0x02 + db 0x22,0x0D,0x20,0x01,0x7F + ; нажатый бутон + db "",82h,20h,01h,7Ch,"O",01h,7Fh,"k",82h,20h,"" + db 0x01,0x4E,0x02,0x23,0x0E,0x89,0x20,0x02 + db 0x00,0x19,0x00 + dw 0xAA55 + + + + +;[]========================================================[] + + +; Опрос статуса нажатия клавиши +; выход: NZ - нажата (буфер не пуст) +L0D25: ld c,31h + RST ToDSS + ret z + cp 0Dh ; Enter + jr z,.loc3 + cp 1Bh ; Esc + jr z,.loc3 + and 5Fh + cp "C" ; Hot-key + jr z,.loc3 + xor a + ret + ; очистить буфер клавы +.loc3: ld bc,3135h + RST ToDSS + ; окно "прервать процесс ?" + call okno0 + ld a,(hl) + cp cmOkey + jr z,.loc2 +.loc1: call HiddenMouse ; скрыть мышку + ld a,(tracks) + out (REGDATA),a + ld a,18h ; перейти на задан. дорожку + call A092C ; занести команду + call L07B3 ; ожидание готовности НГМД + ret z ; нет ошибок + call okno3 ; "Вставьте дискету" + ld a,(hl) + cp cmOkey + jr z,.loc1 +.loc2: call Fresh + xor a + scf + ret diff --git a/LISTBOX.ASM b/LISTBOX.ASM new file mode 100755 index 0000000..d432e5e --- /dev/null +++ b/LISTBOX.ASM @@ -0,0 +1,1740 @@ +; Метки "@@@" - закоммент. код, чтобы не отрабатывал клик мышки на текущей +; позиции списка для выхода из ListBox-а +; +; Метки "###" - отработка "Enter" как Tab +; + + + + + +; Отрисовка объекта +; Object ~List Box~ +; Input: HL-label +; Format mouse table (IY=DialTab+5): +; +0 - Object ~List Box" +; +1 - Xo position object +; +2 - Xi position object +; +3 - Yo position object +; +4 - Yi position object +; +5 - Xi position name +; +6 - Текущий элемент +; +7 - Кол-во элементов в ListBox +; +8,9 - Address list +; +0A - Y pos line up +; +0B - Y pos line down +; +0C - Previos Y pos bar +; +0D - Hot key +; +0E - Context +; +PListBox: + LD (IY+1),A + LD A,(HL) ;X pos + INC HL + LD C,A + LD (IX+4),A ;Save X pos + ADD A,(IX+0) ;Pos X from begin window + LD (IY+2),A ;+1 Xo + LD A,(HL) ;Y pos + INC HL + LD B,A + LD (IX+5),A ;Save Y pos + ADD A,(IX+1) ;Pos Y from begin window + LD (IY+4),A ;+3 Yo ;; + CALL GetPutA + LD A,(HL) ;len X + INC HL + ADD A,2 + LD (IX+6),A + LD B,A + ADD A,3 + ADD A,(IY+2) + LD (IY+3),A ;Xi pos + LD A,(HL) ;len Y + INC HL + ADD A,2 ;Yi pos + ADD A,(IY+4) + LD (IY+5),A + LD A,"┌" + LD (DE),A + INC DE + ld a,ColLstBxFr + ld (de),a + INC DE + LD A," " ; ведущ. пробел титла окна + LD (DE),A + INC DE + INC DE + DEC B + ld a,(ColDialWn) ; цвет заголовока ListBox-а + LD C,A + LD A,(HL) +LstBox0:INC HL ; цикл переноса заголовка ListBox-а + CP '~' + JR NZ,LstBox1 + ld c,ColDhotkey + LD A,(HL) + INC HL + INC HL + LD (DE),A + INC DE + RES 5,A + LD (IY+0Fh),A ; hot-буква + LD A,(DE) + AND 0F0h + OR C + LD (DE),A + INC DE + ld a,(ColDialWn) + LD C,A + DEC B + LD A,(HL) + INC HL +LstBox1:LD (DE),A + INC DE + INC DE + DEC B + LD A,(HL) + OR A + JR NZ,LstBox0 + INC HL + LD A," " ; хвост. пробел титла окна + LD (DE),A + INC DE + INC DE + DEC B + LD A,(IX+6) + SUB B + ADD A,(IY+2) + LD (IY+6),A ;Xi pos name + LD A,B + OR A + JR Z,LstBox2 +lstbx2: LD A,"─" + LD (DE),A + INC DE + ld a,ColLstBxFr + ld (de),a + INC DE + DJNZ lstbx2 +LstBox2:LD A,"┐" + LD (DE),A + inc de + ld a,ColLstBxFr + ld (de),a + INC (IX+5) + LD A,(HL) ; ячейка контекста тек. ListBox-а + LD (IY+10h),A + INC HL + ; уст. указатель + ld de,(CurElem1) ; полож. указателя 2-го ListBox`а + ld b,14 + or a ; контекст тек. ListBox-a ? + jr nz,.loc1 ; 2-й ListBox + ld b,1 + ld de,0 ; для одного "A:" + ld a,(SetDriveB2) ; дисковода "B:" нет ? + or a + jr nz,.loc1 ; "B:" нет + inc b + ld de,(CurElem0) ; полож. указателя 1-го ListBox`а +.loc1: ld (iy+7),e ; тек.элем. + ld (iy+8),d ; первый элем. на странице + ld a,b + ld (elnum+1),a + ld a,d + ld b,d + ld (EndBox2+1),a + xor a + ld (iy+9),a ; кол-во элементов + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld (iy+0Ah),e ; адрес списка + ld (iy+0Bh),d + ; +.loc2: ld a,b + or a + jr z,.loc4 +.loc3: ld a,(de) + inc de + cp 0Dh ; конец строки + jr nz,.loc3 + dec b + jr .loc2 + ; +.loc4: ld (iy+11h),e ; адрес списка + ld (iy+12h),d + push hl + ex de,hl + ld a,(hl) + or a + jp z,EndBox +; Next element list +LstBox3:LD C,(IX+4) ;pos element + LD B,(IX+5) + CALL GetPutA + LD A,(IX+6) + SUB 2 + LD B,A ; длина вывод. строк списка + EX DE,HL + LD (HL),"│" + INC HL + ld (hl),ColLstBxFr + INC HL + ld c,ColListBox ; цвет элементов ListBox + ld a,(ix+5) + sub (ix+1) + inc a + cp (iy+7) + jr nz,lstbx4 + ld c,ColLstBxHI ; цвет указателя не актив. ListBox-а +lstbx4: LD (HL)," " ; ведущ. пробел в списке элементов + INC HL + LD (HL),C ; атрибут + INC HL +LstBox4:LD A,(DE) ; цикл переноса строки списка ListBox-а + INC DE + CP 0Dh ; конец строки + JR Z,NxtLst + LD (HL),A + INC HL + LD (HL),C + INC HL + DJNZ LstBox4 ; цикл переноса строки списка +lstbx41:LD A,(DE) + INC DE + CP 0Dh ; конец строки + JR NZ,lstbx41 +NxtLst: LD A,B + OR A + JR Z,LstBox5 + LD A," " ; заполн. с конца строки элемента +lstbx42:LD (HL),A + INC HL + LD (HL),C ; атрибут + INC HL + DJNZ lstbx42 +LstBox5:LD (HL)," " ; хвост. пробел в списке + INC HL + LD (HL),C ; атрибут + INC HL + call ScrollB ; нарисовать атрибуты скролл-бара + INC (IY+9) + LD A,(IY+5) + SUB (IX+1) + DEC A + CP (IX+5) + JR Z,EndBox1 + LD A,(HL) + OR A + JP NZ,LstBox3 ; на цикл вывода списка + ;-- +EndBox: LD A,(IY+5) + SUB (IX+1) + SUB (IX+5) + DEC A + JR Z,EndBox1 + LD B,A +LstBox6:PUSH BC + LD C,(IX+4) ;pos element + LD B,(IX+5) + CALL GetPutA + LD A,(IX+6) + LD B,A + EX DE,HL + LD (HL),"│" + INC HL + ld (hl),ColLstBxFr + INC HL + ld c,ColListBox + LD A," " ; пустая строка в списке (если окно больше по Y) +lstbx6: LD (HL),A + INC HL + LD (HL),C + INC HL + DJNZ lstbx6 + ; скролл-бар ниже списка + call ScrollB ; нарисовать атрибуты скролл-бара + POP BC + DJNZ LstBox6 + ; +EndBox1:LD A,(HL) +endbx0: OR A + JR Z,EndBox2 +endbx1: CP 0Dh ; конец строки + INC HL + LD A,(HL) + JR NZ,endbx1 + INC (IY+9) + jr endbx0 + ; +EndBox2:ld a,0 + add a,(iy+9) + ld (iy+9),a + LD C,(IX+4) ;End string + LD B,(IX+5) + CALL GetPutA + EX DE,HL + LD (HL),"└" + INC HL + ld (hl),ColLstBxFr + INC HL + LD B,(IX+6) +endbx2: LD A,"─" + LD (HL),A + INC HL + ld (hl),ColLstBxFr + INC HL + DJNZ endbx2 + LD (HL),"┘" + inc hl + ld (hl),ColLstBxFr + LD A,(IY+4) + INC A + LD (IY+0Ch),A ;line up + INC A +prevPos:ld b,0 + add a,b + LD (IY+0Eh),A ;prev pos + LD A,(IY+5) + SUB 2 + LD (IY+0Dh),A ;line down + POP HL + LD BC,0013h ; не трогать + LD (IY+0),C + ADD IY,BC + RET + ; + ; прорисовка атрибутов скролл-бара +ScrollB:LD A,(IY+4) ; Yo + SUB (IX+1) ; Y pos from begin window + INC A + CP (IX+5) ; Y тек. строки списка + LD B,"" + JR Z,.loc1 + call pos + LD B,"■" + JR Z,.loc1 + LD A,(IY+5) ; Yi + SUB (IX+1) ; Y pos from begin window + SUB 2 + CP (IX+5) ; Y тек. строки списка + LD B,"" + JR Z,.loc1 + LD B,"▒" +.loc1: LD (HL),B + INC HL + LD (HL),ColScrlBar + EX DE,HL + INC (IX+5) ; Y тек. строки списка + ret + +; расчет полож. скролл-бара по тек. положению указателя списка +pos: exx + ld a,(iy+7) + add a,(iy+8) + ld e,a ; смещ. указателя + ld c,3 ; высота бара + call Mult8X8 ; E*C=HL, CurLine * LenScrollBar = num16bit + ld a,h + or l + jr z,ps1 +elnum: ld a,0 ; число элементов в списке + or a + jr z,$+3 + dec a + ld c,a + call Divis16X8 ; HL/C=LH +ps1: ld a,l + ld (prevPos+1),a + add a,4 ; скоррект. полож. + cp (ix+5) + exx + ret + + + + + + +;[]===================================================[] +; События ListBox-а +EListBox: + ld a,(DialTab+5+1) ; характер объекта + res 7,a + cp ListBox + jr nz,ELst1 + ld hl,(DialTab+5+7) ; 2 ячейки тек. полож. указателя + ld a,(DialTab+5+16) ; ячейка контекста + or a + jr nz,ELst0 + ld (CurElem0),hl ; сохр. полож. курсора в ListBox1 + jr ELst1 +ELst0: ld (CurElem1),hl ; сохр. полож. курсора в ListBox2 +ELst1: LD HL,what ; список событий + LD A,(HL) + INC HL + CP evMouseFr + JP Z,ELmouse + CP evKeyboard + JP Z,ELkeys + CP evMessage + JR Z,ELmess + CP evCombKey + RET NZ + BIT 7,(IX+1) + JR NZ,ELcomb ; можно переходить - объект выделен + 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) ; Shift+Tab + CP 9 + RET NZ + JP SetLstBox ; выделить пред. объект + ; +ELmess: LD A,(HL) + INC HL + CP msHiddInvr + ret nz + BIT 7,(IX+1) + RET NZ + LD A,(IX+9) + OR A + RET Z + jp HdLstBoxI + ; +ELcomb: INC HL + LD DE,ELexit + PUSH DE + LD A,(HL) + CP 58h ; Cursor Up + JR Z,ELup + CP 52h ; Cursor down + JP Z,ELdown + CP 59h ; PgUp + JP Z,ELpgup + CP 53h ; PgDwn + JP Z,ELpgdwn + CP 57h ; Home + JP Z,ELhome + CP 51h ; End + JP Z,ELend + POP DE + RET + +; Курсор вверх +ELup: LD A,(IX+9) + CP 2 + RET C + LD A,(IX+7) + DEC A + JP M,ELup1 + CALL RsLstBoxI ; убрать инверсию + LD (IX+7),A + CALL StLstBoxI ; уст. инверсию + CALL LstBoxBar + JP ELboxex + ; +ELup1: LD A,(IX+8) + DEC A + RET M + LD (IX+8),A + LD L,(IX+0Ah) + LD H,(IX+0Bh) + JR Z,ELupn1 + LD L,(IX+11h) + LD H,(IX+12h) + DEC HL + DEC HL + LD A,(HL) + CP 0Dh + JR NZ,$-4 + INC HL +ELupn1: LD (IX+11h),L + LD (IX+12h),H + CALL PrnLstBox + CALL LstBoxBar + JP ELboxex + +; Курсор вниз +ELdown: LD A,(IX+9) + CP 2 + RET C + LD A,(IX+5) + SUB (IX+4) + SUB 2 + LD C,A + LD A,(IX+7) + ADD A,(IX+8) + INC A + CP (IX+9) + RET Z + SUB (IX+8) + CP C + JR Z,ELdown1 + CALL RsLstBoxI + LD (IX+7),A + CALL StLstBoxI + CALL LstBoxBar + JP ELboxex +ELdown1:LD A,(IX+8) + INC A + LD (IX+8),A + LD L,(IX+0Ah) + LD H,(IX+0Bh) + JR Z,ELdwn1 + LD L,(IX+11h) + LD H,(IX+12h) + LD A,(HL) + INC HL + CP 0Dh + JR NZ,$-4 +ELdwn1: LD (IX+11h),L + LD (IX+12h),H + CALL PrnLstBox + CALL LstBoxBar + JP ELboxex + +; На страницу вверх +ELpgup: LD A,(IX+9) + CP 2 + RET C + LD A,(IX+8) + OR A + LD B,1 + JP Z,ELnopg + LD A,(IX+5) + SUB (IX+4) + SUB 2 + LD C,A + LD A,(IX+8) + SUB C + JR NC,$+3 + SUB A + LD (IX+8),A + JR ELpgex + +; На страницу вниз +ELpgdwn:LD A,(IX+9) + CP 2 + RET C + LD A,(IX+5) + SUB (IX+4) + SUB 2 + LD C,A + LD A,(IX+9) + SUB (IX+8) + LD B,A + CP C + JR C,ELnopg + JR Z,ELnopg + LD A,(IX+8) + ADD A,C + CP (IX+9) + JR C,$+6 + LD A,(IX+9) + SUB C + LD (IX+8),A + ADD A,C + CP (IX+9) + JR C,ELpgex + JR Z,ELpgex + LD A,(IX+9) + SUB C + LD (IX+8),A + ; +ELpgex: LD L,(IX+0Ah) + LD H,(IX+0Bh) + LD A,(IX+8) + OR A + JR Z,ELpgex1 + LD B,A + LD A,(HL) + INC HL + CP 0Dh + JR NZ,$-4 + DJNZ $-6 +ELpgex1:LD (IX+11h),L + LD (IX+12h),H + CALL PrnLstBox + CALL LstBoxBar + LD A,(IX+7) + ADD A,(IX+8) + CP (IX+9) + JR C,ELboxex + LD A,(IX+9) + SUB (IX+8) + LD B,A + ; +ELnopg: DEC B + LD A,B + CP (IX+7) + RET Z + CALL RsLstBoxI + LD (IX+7),A + CALL StLstBoxI + CALL LstBoxBar + ; +ELboxex:LD HL,what + LD (HL),evMessage + INC HL + LD (HL),msNewElem + INC HL + LD A,(IX+7) + ADD A,(IX+8) + LD (HL),A ; тек. элемент списка + CALL TransMessUp + LD B,8 +elbxs1: call ExmFire + RET Z + HALT + DJNZ elbxs1 + RET + +; В начало ListBox-списка +ELhome: LD A,(IX+8) + OR A + JR Z,ELhome1 + LD (IX+8),0 + LD L,(IX+0Ah) + LD H,(IX+0Bh) + LD (IX+11h),L + LD (IX+12h),H + CALL PrnLstBox +ELhome1:LD A,(IX+7) + OR A + RET Z + CALL RsLstBoxI + LD (IX+7),0 + CALL StLstBoxI + JP LstBoxBar + +; В конец ListBox-списка +ELend: LD A,(IX+8) + ADD A,(IX+7) + INC A + CP (IX+9) + RET Z + LD A,(IX+5) + SUB (IX+4) + SUB 2 + LD C,A + LD A,(IX+9) + SUB C + JR C,ELend1 + JR Z,ELend1 + LD A,(IX+9) + SUB C + LD (IX+8),A + LD L,(IX+0Ah) + LD H,(IX+0Bh) + LD B,A + LD A,(HL) + INC HL + CP 0Dh + JR NZ,$-4 + DJNZ $-6 + LD (IX+11h),L + LD (IX+12h),H + CALL RsLstBoxI + CALL PrnLstBox + LD A,(IX+9) + DEC A + SUB (IX+8) + LD (IX+7),A + CALL StLstBoxI + JP LstBoxBar + ; +ELend1: CALL RsLstBoxI + LD A,(IX+9) + DEC A + LD (IX+7),A + CALL StLstBoxI + JP LstBoxBar + + +; Обработка событий от мышки +ELmouse:LD E,(HL) ; Xcoord + INC HL + LD D,(HL) ; Ycoord + 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 ; > + LD A,D + CP (IX+4) ; Yo pos list box + RET C + CP (IX+5) ; Yi pos list box + RET NC + BIT 7,(IX+1) ; Sel or nosel + PUSH DE + CALL Z,SetLstBox + POP DE + LD HL,ELexit + PUSH HL + LD A,(IX+9) + OR A + RET Z + LD A,E + ADD A,2 + CP (IX+3) + JR Z,ELmous1 + RET NC + LD A,E + CP (IX+2) + RET Z + LD A,D + CP (IX+4) + RET Z + INC A + CP (IX+5) + RET Z + LD A,D + SUB (IX+4) + DEC A + ADD A,(IX+8) + CP (IX+9) + JR C,$+6 + LD A,(IX+9) + DEC A + SUB (IX+8) +;@@@ CP (IX+7) +; JR Z,SelLine + CALL RsLstBoxI + LD (IX+7),A + CALL StLstBoxI + CALL LstBoxBar + JP ELboxex +;@@@ +;SelLine:POP HL +; LD HL,what +; LD (HL),evCommand +; INC HL +; LD (HL),evNothing ;cmSelect +; RET + ; +ELmous1:LD A,D + CP (IX+0Ch) + RET C + JP Z,ELup + CP (IX+0Dh) + JP Z,ELdown + RET NC + CP (IX+0Eh) + RET Z + JP C,ELpgup + JP NC,ELpgdwn + RET + + +; Обработка событий от клавиатуры +ELkeys: LD A,(HL) + RES 5,A + BIT 7,(IX+1) ; Sel or nosel + RET NZ + CP 9 ; Tab + JR Z,SetLstBox ; выделить след. объект + CP 0Dh ; ### + JR Z,SetLstBox ; выделить след. объект + CP (IX+0Fh) ; Hot key + RET NZ +SetLstBox: + CALL MoveObj ; Select Button + CALL ResDialInv ; Reset previos invert + LD IX,DialTab+5 + LD E,(IX+2) ; Xo + INC E + LD D,(IX+4) ; Y + LD A,(IX+6) ; Xi + SUB E + LD C,A + CALL SetDialInv + LD A,(IX+9) + OR A + CALL NZ,StLstBoxI + LD HL,what + LD (HL),evMessage + INC HL + LD (HL),msNewElem + INC HL + LD A,(IX+7) + ADD A,(IX+8) + LD (HL),A ;Тек. элемент + CALL TransMessUp +ELexit: LD HL,what + LD (HL),evNothing + RET + + + + +;[]===========================================================[] +; +RsLstBoxI: + PUSH AF + ld a,ColListBox + CALL LstBoxInv + POP AF + RET + +; Цвет курсора не активного объекта +HdLstBoxI: + ld a,ColLstBxHI + JR LstBoxInv + +StLstBoxI: + ld a,ColLstBoxI ; цвет выдел. курсора +LstBoxInv: + ld (lbcolor+1),a + PUSH IY + PUSH IX + PUSH IX + POP IY + LD IX,DialData + LD A,(IY+2) + SUB (IX+0) + INC A + LD C,A + LD A,(IY+4) ;; Yo + SUB (IX+1) + INC A + ADD A,(IY+7) ;; + LD B,A + CALL GetPutA + PUSH DE + IN A,(Page3) + PUSH AF + LD A,(Win2) + OUT (Page3),A + LD A,(IY+3) + SUB (IY+2) + SUB 3 + LD L,A ; длина выдел. курсора + LD H,1 + sub 2 ; курсор не на всю ширину ListBox-а + ld b,a + ld a," " + ld (de),a ; в 1-м месте "не выводить" выдел. курсор + inc de + ld a,ColListBox ; атрибут (цвет списка ListBox-а) + ld (de),a + ex af,af' + inc de +lbcolor:LD A,0 +lbclr1: INC DE ; цикл прорисовки выдел. курсора + LD (DE),A + INC DE + DJNZ lbclr1 + ld a," " + ld (de),a ; в посл. месте "не выводить" выдел. курсор + inc de + ex af,af' + ld (de),a + POP AF + OUT (Page3),A + POP IX + LD E,(IY+2) + INC E + LD A,(IY+4) + INC A + ADD A,(IY+7) + LD D,A + CALL PutDialLn + POP IX + POP IY + RET + + +PrnLstBox: + PUSH IY + PUSH IX + IN A,(Page3) + PUSH AF + LD A,(Win2) + OUT (Page3),A + PUSH IX + POP IY + LD IX,DialData + LD L,(IY+11h) + LD H,(IY+12h) + LD A,(IY+2) + SUB (IX+0) + ADD A,2 + LD C,A + LD A,(IY+4) + SUB (IX+1) + INC A + LD B,A + LD A,(IY+5) + SUB (IY+4) + SUB 2 +PrLsBx0:PUSH AF + PUSH BC + CALL GetPutA + LD A,(IY+3) + SUB (IY+2) + SUB 5 + LD B,A +PrLsBx1:LD A,(HL) + INC HL + CP 0Dh + JR Z,PrLsBx2 + LD (DE),A + INC DE + INC DE + DJNZ PrLsBx1 + LD A,(HL) + INC HL + CP 0Dh + JR NZ,$-4 +PrLsBx2:LD A,B + OR A + JR Z,PrLsBx3 + LD A," " + LD (DE),A + INC DE + INC DE + DJNZ $-3 +PrLsBx3:POP BC + INC B + POP AF + DEC A + JR Z,PrLsBx4 + LD E,(HL) + INC E + DEC E + JR NZ,PrLsBx0 +PrLsBx4:OR A + JR Z,PrLsBx6 +PrLsBx5:PUSH AF + PUSH BC + CALL GetPutA + LD A,(IY+3) + SUB (IY+2) + SUB 5 + LD B,A + SUB A + LD (DE),A + INC DE + INC DE + DJNZ $-3 + POP BC + INC B + POP AF + DEC A + JR NZ,PrLsBx5 +PrLsBx6:CALL PutDial + POP AF + OUT (Page3),A + POP IX + POP IY + RET + + +PLstBoxI: + LD E,(IX+2) ; Xo + INC E + LD D,(IX+4) ; Y + LD A,(IX+6) ; Xi + SUB E + LD C,A + CALL SetDialInv + jp StLstBoxI + + +GetLstBox: + LD HL,what + INC HL + INC HL + LD A,(IX+7) + ADD A,(IX+8) + LD (HL),A + RET + + +; Верт. скролл-бар объекта ListBox +LstBoxBar: + LD A,(IX+7) + ADD A,(IX+8) + LD E,A + ;LD A,(IX+0Dh) ; line down + ;SUB (IX+0Ch) ; line up + ;SUB 2 + ;LD C,A ; высота бара + ld c,3 + CALL Mult8X8 ; E*C=HL, CurLine * LenScrollBar = num16bit + LD A,H + OR L + JR Z,LBB1 + LD A,(IX+9) ; num16bit / EquipElem + OR A + JR Z,$+3 + DEC A + LD C,A + CALL Divis16X8 ; HL/C=LH +LBB1: ld a,l + ld (prevPos+1),a + LD A,(IX+0Ch) ; смещение от начала + INC A + ADD A,L + CP (IX+0Eh) ; prev pos + RET Z ; когда L=0 ? + PUSH IY + PUSH IX + PUSH AF ;- + PUSH IX + POP IY + LD IX,DialData + LD A,(IY+3) + SUB (IX+0) + SUB 2 + LD C,A + LD A,(IY+0Eh) ; prev pos + SUB (IX+1) + LD B,A + CALL GetPutA + IN A,(Page3) + PUSH AF + LD A,(Win2) + OUT (Page3),A + LD A,"▒" + LD (DE),A + POP AF + OUT (Page3),A + LD A,(IY+3) + SUB 2 + LD E,A + LD D,(IY+0Eh) ; 0..31 + BIT 7,E + JR NZ,LBe + ld h,ColScrlBar + LD L,"▒" ; предв. стереть "■" + LD BC,1BB5h ; символ на экран + SUB A + RST ToBIOS +LBe: LD A,(IY+3) + SUB 2 + LD E,A + POP AF ;- + LD (IY+0Eh),A ; prev pos + LD D,A ; 0..31 + PUSH DE + BIT 7,E + JR NZ,LBe1 + ld h,ColScrlBar + LD L,"■" ; новое полож. + LD BC,1BB5h ; символ на экран + SUB A + RST ToBIOS +LBe1: POP DE + LD A,E + SUB (IX+0) + LD C,A + LD A,D + SUB (IX+1) + LD B,A + CALL GetPutA + IN A,(Page3) + PUSH AF + LD A,(Win2) + OUT (Page3),A + LD A,"■" + LD (DE),A + POP AF + OUT (Page3),A + POP IX + POP IY + RET + + +; Процедура умножения (8*8bit) +; На вход: E*C +; На выход: HL-результат +Mult8X8:SUB A + LD L,A + LD H,A + LD D,A + CP C + RET Z + CP E + RET Z + LD H,C + LD B,8 +.loc1: ADD HL,HL + JR NC,$+3 + ADD HL,DE + DJNZ .loc1 + RET + +; Процедура деления (16X8bit) +; На вход: HL/C +; На выход: L-результат +; H-остаток +Divis16X8: + LD B,8 +.loc1: ADD HL,HL + LD A,H + JR C,.loc2 + SUB C + JR NC,.loc3 + ADD A,C + LD H,A + DJNZ .loc1 + RET +.loc2: SUB C +.loc3: LD H,A + INC HL + DJNZ .loc1 + RET + + + + + +;[]===========================================================[] +; Начальное окно программы +WinMain1: + dw 0409h,173Eh ; Yo,Xo,lenY,lenX + db " FFORMAT ",0 ; имя окна + ; + db ListBox ; характер объекта + dw 0203h,060Fh ; Yo,Xo,lenY,lenX + db "~D~rives",0 ; имя кластера + db 0 ; конт. помощь + dw DiskList ; список элементов + ; + db ListBox + dw 0219h,061Eh ; Yo,Xo,lenY,lenX + db "~A~vailable - Tr - Sc - Type",0 + db 1 ; контекст. помощь + dw ItemList ; список элементов + ; + db ClRadioBut ; характер объекта + dw 0C03h,0116h ; Yo,Xo,lenY,lenX + db "Options",0 ; имя кластера + db "Put ~s~ystem files",0 ; имя элемента + db 2 ; контекст. помощь + dw cSystem ; ячейка памяти + db 0 ; конец кластера + ; + db ClCheckBut ; характер объекта + dw 0C22h,0317h ; Yo,Xo,lenY,lenX + db "Perfomance",0 ; имя кластера + db "S~t~andart mode",0 ; имя элемента + db 3 ; контекст. помощь + dw Mode0 ; ячейка памяти + db "O~p~timize sectors",0 ; имя элемента + db 3 ; контекст. помощь + dw Mode2 ; ячейка памяти + db "Quic~k~ format",0 ; имя элемента + db 3 ; контекст. помощь + dw Mode1 ; ячейка памяти + db 0 ; конец кластера + ; + db InputLine ; характер объекта + dw 1103h ; Yo,Xo + db "~L~abel: ",0 ; имя кластера + db 12 ; длина редакт. строки + db 4 ; контекст. помощь + dw LabelBuff ; адрес буфера редакт. строки + ; + db Button ; характер объекта + dw 1405h ; Yo,Xo + db " ~F~ormatting ",0 ; имя элемента + db cmOkey ; назнач. команда + db 5 ; контекст. помощь + ; + db Button + dw 1417h ; Yo,Xo + db " ~O~ptions ",0 + db cmOptions + db 5 + ; + db Button + dw 142Bh ; Yo,Xo + db " ~Q~uit ",0 ; имя элемента + db cmCancel + db 5 + ; + db 0xFF ; конец списка + +DiskList: +DiskA: db " X: X.XX ",0Dh +DiskB: db " X: X.XX ",0Dh,0 + +ItemList: + db " 1.44 Mb 80 18 DS/HD",0Dh + db " 1.52 Mb 80 19 DS/HD",0Dh + db " 1.60 Mb 80 20 DS/HD",0Dh + db " 1.64 Mb 82 20 DS/HD",0Dh + db " 1.66 Mb 83 20 DS/HD",0Dh + db " 1.68 Mb 80 21 DS/HD",0Dh + db " 1.72 Mb 82 21 DS/HD",0Dh + db " 1.74 Mb 83 21 DS/HD",0Dh + db " 720 kB 80 09 DS/DD",0Dh + db " 800 kB 80 10 DS/DD",0Dh + db " 820 kB 82 10 DS/DD",0Dh + db " 830 kB 83 10 DS/DD",0Dh + db " 636 kB - 80 - 16 TR-DOS",0Dh + db " 800 kB - 80 - 05 CPM-80",0Dh + db 0 + + + + +; Окно опций выбора формата дисководов +WinOptions: + dw 0910h,0D2Fh ; Yo,Xo,lenY,lenX + db " Setup drivers ",0 ; имя окна + ; + db Button + dw 0A07h ; Yo,Xo + db " ~O~k ",0 + db cmOkey + db 5 + ; + db Button + dw 0A13h ; Yo,Xo + db " ~C~ancel ",0 + db cmCancel + db 5 + ; + db Button + dw 0A1Fh ; Yo,Xo + db " ~S~ave ",0 ; имя элемента + db cmSave + db 5 + ; + db ClCheckBut ; характер объекта + dw 0203h,0212h ; Yo,Xo,lenY,lenX + db "Drive A:",0 ; имя кластера + db '1.44Mb 3.5"',0 ; имя элемента + db 3 ; контекст. помощь + dw SetDriveA0 ; ячейка памяти + db ' 720kB 5.25"',0 ; имя элемента + db 3 ; контекст. помощь + dw SetDriveA1 ; ячейка памяти + db 0 ; конец кластера + ; + db ClCheckBut ; характер объекта + dw 0218h,0312h ; Yo,Xo,lenY,lenX + db "Drive B:",0 ; имя кластера + db '1.44Mb 3.5"',0 ; имя элемента + db 3 ; контекст. помощь + dw SetDriveB0 ; ячейка памяти + db ' 720kB 5.25"',0 ; имя элемента + db 3 ; контекст. помощь + dw SetDriveB1 ; ячейка памяти + db " None",0 ; имя элемента + db 3 ; контекст. помощь + dw SetDriveB2 ; ячейка памяти + db 0 ; конец кластера + ; + db 0xFF ; конец списка + + + + +; Окно процесса форматирования +WinMain2: + dw 060Bh,133Ah ; Yo,Xo,lenY,lenX + db " FFORMAT ",0 ; имя окна + ; + db Frame ; рамка "карты" цилиндров + dw 0502h,0534h ; Yo,Xo,lenY,lenX + ; + db Frame ; рамка тек. цилиндра + dw 0C02h,0218h ; Yo,Xo,lenY,lenX + ; + db Frame ; рамка емкости дискеты + dw 0C1Ch,031Ah ; Yo,Xo,lenY,lenX + ; + db TextLine + dw 0704h ; Yo,Xo + db 75h ; цвет строки + db "████████████████████████████████████████" +metka1: db "██",0 + ; + db TextLine + dw 0730h ; Yo,Xo + db ColFormText ; цвет строки + db "Side 0",0 + ; + db TextLine + dw 0804h ; Yo,Xo + db 75h ; цвет строки + db "████████████████████████████████████████" +metka2: db "██",0 + ; + db TextLine + dw 0830h ; Yo,Xo + db ColFormText ; цвет строки + db "Side 1",0 + ; + db TextLine + dw 0904h ; Yo,Xo + db ColFormText ; цвет строки + db "0246802468024680246802468024680246802468" +metka3: db "02",0 + ; + db TextLine + dw 0930h ; Yo,Xo + db ColFormText ; цвет строки + db "Tracks",0 + ; + db TextLine + dw 0A04h ; Yo,Xo + db ColFormText ; цвет строки + db "0 1 2 3 4 5 6 7" +metka4: db " 8",0 + ; + db TextLine + dw 0D04h ; Yo,Xo + db ColFormText ; цвет строки + db "Head: ",0 + ; + db TextLine + dw 0D0Bh ; Yo,Xo + db ColFormNumber ; цвет строки + db "0",0 + ; + db TextLine + dw 0D0Ch ; Yo,Xo + db ColFormText ; цвет строки + db " Cylinder: ",0 + ; + db TextLine + dw 0D18h ; Yo,Xo + db ColFormNumber ; цвет строки +space4: db " 0",0 + ; + db TextLine + dw 0D1Eh ; Yo,Xo + db ColFormNumber ; цвет строки +space1: db "1457664",0 + ; + db TextLine + dw 0D25h ; Yo,Xo + db ColFormText ; цвет строки + db " Total disk space",0 + ; + db TextLine + dw 0E1Eh ; Yo,Xo + db ColFormNumber ; цвет строки + db " " +space3: db " 0",0 ; число bad-секторов + ; + db TextLine + dw 0E25h ; Yo,Xo + db ColFormText ; цвет строки + db " Bad sectors",0 + ; + db TextLine + dw 0F1Eh ; Yo,Xo + db ColFormNumber ; цвет строки +space2: db "1457664",0 + ; + db TextLine + dw 0F25h ; Yo,Xo + db ColFormText ; цвет строки + db " Available bytes",0 + ; + db TextLine + dw 0504h ; Yo,Xo +; db ColFormNumber ; цвет строки + db 30h ; функция в DSS не отрабатывает +LABEL1: db "NO NAME ",0 + ; + db TextLine + dw 0503h ; Yo,Xo + db ColFormText ; цвет строки + db "[",0 + ; + db TextLine + dw 050Fh ; Yo,Xo + db ColFormText ; цвет строки + db "]",0 + ; + db TextLine + dw 052Fh ; Yo,Xo + db ColFormNumber ; цвет строки + db "DISK " +LDISK: db "A:",0 + ; + db TextLine + dw 052Eh ; Yo,Xo + db ColFormText ; цвет строки + db "[",0 + ; + db TextLine + dw 0536h ; Yo,Xo + db ColFormText ; цвет строки + db "]",0 + ; + db TextLine + dw 0204h ; Yo,Xo + db ColFormText ; цвет строки + db "Formatting " +metka5: db "1.44 Mb",0 + ; + db TextLine + dw 0304h ; Yo,Xo + db ColFormText ; цвет строки +metka7: db "System files",0 + ; + db TextLine + dw 0223h ; Yo,Xo + db ColFormText ; цвет строки +metka6: db "(Optimize sectors) ",0 + ; + db Button + dw 1009h ; Yo,Xo + db " ~C~ancel ",0 + db cmCancel + db 5 + ; + db 0xFF ; конец списка + + + + +; Окно запроса вставить дискету +InsDiskette: + DW 0B16h,0824h ; Yo,Xo,lenY,lenX + DB " Information ",0 + ; + DB TextLine + DW 0305h ; Yo,Xo + db 1Fh ; цвет строки + DB "Insert NEW disk in drive " +DskName:db "A:",0 + ; + DB Button ; характер объекта + DW 0507h ; Yo,Xo + DB " ~O~k ",0 ; имя элемента + db cmOkey ; назнач. команда + db 5 ; контекст. помощь + ; + DB Button + DW 0515h ; Yo,Xo + DB " ~C~ancel ",0 + db cmCancel + db 5 + ; + db 0FFh ; конец списка + + + +; Окно подтв. прерывания операции +Interrupt: + DW 0A16h,0A24h ; Yo,Xo,lenY,lenX + DB " Confirmation ",0 + ; + DB TextLine + DW 0205h ; Yo,Xo + db 1Fh ; цвет строки + DB "FFORMAT interrupted by user",0 + ; + DB TextLine + DW 0408h ; Yo,Xo + db 1Fh ; цвет строки + DB "Do you wish to cancel",0 + ; + DB TextLine + DW 0507h ; Yo,Xo + db 1Fh ; цвет строки + DB "the current operation ?",0 + ; + DB Button ; характер объекта + DW 0707h ; Yo,Xo + DB " ~Y~es ",0 ; имя элемента + db cmOkey ; назнач. команда + db 5 ; контекст. помощь + ; + DB Button + DW 0715h ; Yo,Xo + DB " ~N~o ",0 + db cmCancel + db 5 + ; + db 0FFh ; конец списка + + +; Окно при отсутствии дискеты +MissingDisk: + DW 0B14h,0928h ; Yo,Xo,lenY,lenX + DB " Information ",0 + ; + DB TextLine + DW 0203h ; Yo,Xo + db 4Fh ; цвет строки + DB "The disk is missing from the drive",0 + ; + DB TextLine + DW 040Ah ; Yo,Xo + db 4Fh ; цвет строки + DB "Please insert a disk",0 + ; + DB Button ; характер объекта + DW 0609h ; Yo,Xo + DB " ~O~k ",0 ; имя элемента + db cmOkey ; назнач. команда + db 5 ; контекст. помощь + ; + DB Button + DW 0617h ; Yo,Xo + DB " ~C~ancel ",0 + db cmCancel + db 5 + ; + db 0FFh ; конец списка + + + +; Окно при "битой" нулевой дорожке дискеты +NoForm: + DW 0B14h,0927h ; Yo,Xo,lenY,lenX + DB " Information ",0 + ; + DB TextLine + DW 0203h ; Yo,Xo + db 4Fh ; цвет строки + DB "This disk could not be formatted:",0 + ; + DB TextLine + DW 0305h ; Yo,Xo + db 4Fh ; цвет строки + DB "unrecoverable error in system",0 + ; + DB TextLine + DW 0403h ; Yo,Xo + db 4Fh ; цвет строки + DB "area or uncompatible format mode",0 + ; + DB Button ; характер объекта + DW 060Fh ; Yo,Xo + DB " ~O~k ",0 ; имя элемента + db cmOkey ; назнач. команда + db 5 ; контекст. помощь + ; + db 0FFh ; конец списка + + + +; Окно успешного завершения форматирования +FComplite: + dw 0B18h,071Fh ; Yo,Xo,lenY,lenX + db "═",0 + ; + DB TextLine + DW 0208h ; Yo,Xo + db 1Fh ; цвет строки + DB "Format complete",0 + ; + DB Button ; характер объекта + DW 040Bh ; Yo,Xo + DB " ~O~k ",0 ; имя элемента + db cmOkey ; назнач. команда + db 5 ; контекст. помощь + ; + db 0FFh ; конец списка + + +; Окно записи сист. области дискеты +SystemArea: + dw 0C19h,051Eh ; Yo,Xo,lenY,lenX + db "═",0 ; без заголовка + ; + db TextLine + dw 0204h ; Yo,Xo + db 1Fh ; цвет строки + db "Writing system area...",0 + ; + db 0xFF ; конец списка + + +; Окно успешного копирования сист. файлов +SysCopy: + dw 0C19h,051Eh ; Yo,Xo,lenY,lenX + db "═",0 ; без заголовка + ; + DB TextLine + DW 0204h ; Yo,Xo + db 1Bh ; цвет строки + db "System files transfered",0 + ; + db 0FFh ; конец списка + + +; Окно записи сист. файлов +SysWrite: + dw 0C19h,051Eh ; Yo,Xo,lenY,lenX + db "═",0 ; без заголовка + ; + db TextLine + dw 0204h ; Yo,Xo + db 1Bh ; цвет строки + db "Writing system files...",0 + ; + db 0xFF ; конец списка + + +; Окно успешного копирования сист. файлов +ErrSysFiles: + dw 0B19h,081Eh ; Yo,Xo,lenY,lenX + db "═",0 ; без заголовка + ; + db TextLine + dw 0204h ; Yo,Xo + db 4Fh ; цвет строки + db "System files not found",0 + db TextLine + dw 0304h ; Yo,Xo + db 4Fh ; цвет строки + db "or work with errors...",0 + ; + db Button ; характер объекта + dw 050Bh ; Yo,Xo + db " ~O~k ",0 ; имя элемента + db cmOkey ; назнач. команда + db 5 ; контекст. помощь + ; + db 0xFF ; конец списка + + +; Окно "Защита от записи" +Protect: + dw 0C19h,071Eh ; Yo,Xo,lenY,lenX + db "═",0 ; без заголовка + ; + db TextLine + dw 0203h ; Yo,Xo + db 4Fh ; цвет строки + db "Disk is write protected!",0 + ; + DB Button ; характер объекта + DW 040Bh ; Yo,Xo + DB " ~O~k ",0 ; имя элемента + db cmOkey ; назнач. команда + db 5 ; контекст. помощь + ; + db 0FFh ; конец списка + + + +; Окно инициализации дисковода +InitFdd: + dw 0C1Bh,0519h ; Yo,Xo,lenY,lenX + db "═",0 + ; + db TextLine + dw 0203h ; Yo,Xo + db 1Fh ; цвет строки + db "Resetting drive ...",0 + ; + db 0FFh ; конец списка + + + + + + + + if release + else +PR: push af + push bc + push de + push hl + push ix + push iy + ld de,0100h + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ld hl,(hours) ; часы/минуты + call HEXHL + ld a," " + ld bc,0182h + RST ToBIOS + ld a,(seconds) ; секунды + call HEX1 + pop iy + pop ix + pop hl + pop de + pop bc + pop af + ret + +HEXA: push hl + push de + push bc + push ix + push iy + push af + push af + ld de,0100h + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + pop af + call HEX1 + ;ld a," " + ;ld bc,0182h + ;RST ToBIOS + ;ld a,(ix+1) + ;call HEX1 + ;ld a," " + ;ld bc,0182h + ;RST ToBIOS + ;ld a,(iy+3) + ;call HEX1 + ;ld a," " + ;ld bc,0182h + ;RST ToBIOS + ;ld a,(iy+0Ch) + ;call HEX1 + ;ld a," " + ;ld bc,0182h + ;RST ToBIOS + ;ld a,(iy+0Eh) + ;call HEX1 + pop af + pop iy + pop ix + pop bc + pop de + pop hl + ret + + +HEXHL: ld a,h + call HEX1 + ld a,l +HEX1: push af + rra + rra + rra + rra + call HEX2 + pop af +HEX2: and 0Fh + add a,90h + daa + adc a,40h + daa + ld bc,0182h ; вывод 'a' в тек. позиции курсора + RST ToBIOS + ret + endif diff --git a/MAIN.ASM b/MAIN.ASM new file mode 100755 index 0000000..ddf3454 --- /dev/null +++ b/MAIN.ASM @@ -0,0 +1,245 @@ +; Код Форматилки (без ехе-заголовка) упакован Hrust v1.2 +; + + +; описание ds xx +; %imacro ds 1 +; times %1 db 0 +; %endmacro + + include './shared_includes/constants/dss_equ.inc' + include './shared_includes/constants/bios_equ.inc' + + org #9200 - exe_begin.size + +exe_begin: db 'EX' ; exe ID + db 'E' ; exe тип + db 1 ; exe версия + DWORD exe_begin.size ; смещ. кода + dw 0 ; end-beg, первичный загрузчик + dw 0,0 ; резерв + dw 0 ; + dw Packed ; адрес загрузки кода + dw Start ; адрес передачи управления + dw #C000 ; адрес стека + ;ds 490 ; резерв +.size EQU $-exe_begin + + + org #9200 +Packed: incbin 'build/format.hrs' + + +Start: ld c,0 ; узнать версию ДОС + RST ToDSS + ld hl,0145h ; 1.69 + and a + sbc hl,de + jr c,ok ; > 1.69 + ; + ld hl,ver_err + ld c,5Ch + RST ToDSS + ld bc,#2641 + RST ToDSS + ret + +ver_err: db "Invalid DSS version, DSS 1.70 or higher is required.",0Dh,0Ah,0 + + +ok: LD HL,#6200 ;!HARDCODE + LD BC,Dss.AppInfo.EXE_HomeDir + RST ToDSS + ; + ld hl,Packed ; упак. данные + ld de,6400h ; куда распаковать + push de ; адрес перехода + +; формат упак. файла: +; +0 (word) "HR" - сигнатура +; +2 (word) - длина исходного файла +; +4 (word) - длина упакованного файла + +; Распаковщик (DeHrust) + + ld ix,-12 + add ix,sp + push de + ld sp,hl + pop bc + ex de,hl + pop bc + dec bc + add hl,bc + ex de,hl + pop bc + dec bc + add hl,bc + sbc hl,de + add hl,de + jr c,loc1 + ld d,h + ld e,l +loc1: lddr + ex de,hl + ld d,(ix+11) + ld e,(ix+10) + ld sp,hl + pop hl + pop hl + pop hl + ld b,6 +loc2: dec sp + pop af + ld (ix+6),a + inc ix + djnz loc2 + exx + ld d,0BFh + ld bc,1010h + pop hl +loc3: dec sp + pop af + exx +loc4: ld (de),a + inc de +loc5: exx +loc6: add hl,hl + djnz loc7 + pop hl + ld b,c +loc7: jr c,loc3 + ld e,1 +loc8: ld a,80h +loc9: add hl,hl + djnz loc10 + pop hl + ld b,c +loc10: rla + jr c,loc9 + cp 3 + jr c,loc11 + add a,e + ld e,a + xor c + jr nz,loc8 +loc11: add a,e + cp 4 + jr z,loc26 + adc a,0FFh + cp 2 + exx +loc12: ld c,a +loc13: exx + ld a,0BFh + jr c,loc17 +loc14: add hl,hl + djnz loc15 + pop hl + ld b,c +loc15: rla + jr c,loc14 + jr z,loc16 + inc a + add a,d + jr nc,loc18 + sub d +loc16: inc a + jr nz,loc20 + ld a,0EFh +loc17: rrca + cp a +loc18: add hl,hl + djnz loc19 + pop hl + ld b,c +loc19: rla + jr c,loc18 +loc20: exx + ld h,0FFh + jr z,loc21 + ld h,a + dec sp + inc a + jr z,loc24 + pop af +loc21: ld l,a + add hl,de + ldir +loc22: jr loc5 + ; +loc23: exx + rrc d + jr loc6 + ; +loc24: pop af + cp 0E0h + jr c,loc21 + rlca + xor c + inc a + jr z,loc23 + sub 10h +loc25: ld l,a + ld c,a + ld h,0FFh + add hl,de + ldi + dec sp + pop af + ld (de),a + inc hl + inc de + ld a,(hl) + jr loc4 + ; +loc26: ld a,80h +loc27: add hl,hl + djnz loc28 + pop hl + ld b,c +loc28: adc a,a + jr nz,loc31 + jr c,loc27 + ld a,0FCh + jr loc32 + ; +loc29: dec sp + pop bc + ld c,b + ld b,a + ccf + jr loc13 + ; +loc30: cp 0Fh + jr c,loc29 + jr nz,loc12 + add a,0F4h + ld sp,ix + jr loc34 + ; +loc31: sbc a,a + ld a,0EFh +loc32: add hl,hl + djnz loc33 + pop hl + ld b,c +loc33: rla + jr c,loc32 + exx + jr nz,loc25 + bit 7,a + jr z,loc30 + sub 0EAh +loc34: ex de,hl +loc35: pop de + ld (hl),e + inc hl + ld (hl),d + inc hl + dec a + jr nz,loc35 + ex de,hl + jr nc,loc22 + ret + diff --git a/MAP.ASM b/MAP.ASM new file mode 100755 index 0000000..d54ff96 --- /dev/null +++ b/MAP.ASM @@ -0,0 +1,851 @@ +; Вывод карты диска, с выделением цветом bad-сторон +; вх: тек.дорожка +; тек.сторона +; флаг bad-вывода +; +Map: ld a,(tracks) + cp 83+1 ; запред. дорожка + ret nc + ld de,(cursor) ; Y/X полож. курсора + ld hl,count ; счетчик + dec (hl) + jr nz,.loc1 + ld (hl),4 ; сбросить счетчик "до инкремента X полож." + inc de ; ++E, X полож. + ld (cursor),de +.loc1: ld a,(side) + add a,d + ld d,a ; Y полож. + LD C,BIOS.LP_SET_PLACE ; уст. полож. курсора + RST ToBIOS + ; получить символ с экрана + ld c,0B4h + xor a + RST ToBIOS + ; + ld a,(bad) ; 5/2/0 хороший/плохой/подозр. сектор + ld c,a + add a,52h ; вычислить атрибут + ld e,a ; 57h/54h/52h атрибуты четного сектора + ld a,(tracks) ; тек. дорожка + rrca + ld a,"▌" + jr nc,.loc2 ; четная дорожка + ; атрибут не четного сектора + ld a,h + and 0x0F + rlca + rlca + rlca + rlca + add a,2 + add a,c + ld e,a + ; + ld a,"▐" ; не четная дорожка +.loc2: ld bc,0181h ; печать символа с атрибутом + RST ToBIOS + ret + + +maska equ 05h ; 5/2/0 "маска" ok/bad/wrn для уст.атрибута цвета + +bad: db maska ; атрибут bad=0k+03h +cursor: dw 0D0Fh ; нач. полож. метки на карте +count: db 5 + + + +; Настройка окна процесса форматирования +Setup_Map: + xor a + ld (_OS),a + ld hl,553 + ld (L0BB6+1),hl + ld hl,512 + ld (MinusSc+1),hl + ld a,2 + ld (SecCode+1),a ; код размера сектора + ld hl,INTERL1 + ld (INTERL+1),hl ; уст. интерлив для < 21 сектора + ld hl,LABEL ; буфер имени метки + ld a,(hl) + or a + jr nz,.loc0 + ld hl,.loc22 ; "NO NAME " +.loc0: ld de,LABEL1 + ld b,11 +.loc1: ld a,(hl) + or a + jr z,.loc2 + ld (de),a + inc hl + inc de + djnz .loc1 + jr .loc3 +.loc2: ld a," " ; заполнить остаток "LABEL" пробелом + ld (de),a + inc de + djnz .loc2 +.loc3: ld hl,(CurElem1) ; тек. полож. указателя формата + ld a,h + add a,l + call Space + call SetCyl + call SetMedia + push af + cp 3 + jr z,.loc4 + cp 4 + jr z,.loc4 + cp 6 + jr z,.loc4 + cp 7 + jr z,.loc4 + cp 10 + jr z,.loc4 + cp 11 + jr z,.loc4 + ; 80 дорожек + ld a,0FFh + ld (metka1),a + ld (metka2),a + ld (metka4),a + ld (metka3),a + jr .loc5 + ; 82-83 дорожки +.loc4: ld a,"█" + ld (metka1),a + ld (metka2),a + ld a," " + ld (metka4),a + ld a,"0" + ld (metka3),a +.loc5: pop af + rlca + ld e,a + ld d,0 + ld hl,.loc6 + ld bc,7 + add hl,de + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld de,metka5 + ldir + ; + ld a,(_OS) + or a + jr z,.loc30 ; ос ms-dos + dec a + jr nz,.loc28 ; ос cpm-80 + ld a,(sFlag1) + or a + jr nz,.loc28 ; ошибки работы с файлом "boot.$b" + ld a,(cSystem) + or a + jr z,.loc28 + ld hl,.loc53 ; tr-dos "Boot disk " + jr .loc27 + ; ms-dos +.loc30: ld hl,.loc25 ; "System files" + ld a,(sFlag) + or a + jr nz,.loc28 ; ошибки работы с сист. файлами Estex + ld a,(cSystem) + or a + jr nz,.loc27 +.loc28: ld hl,.loc26 ; " " +.loc27: ld de,metka7 + ld bc,12 + ldir + ; настроить строку тек. режима + ld hl,(CurElem1) ; тек. полож. указателя формата + ld a,h + add a,l + ld hl,.loc52 ; " " + cp 13 ; пункт CPM-80 ? + jr z,.loc21 + ; ms-dos, tr-dos + ld hl,.loc29 ; "Optimize sectors" + ld a,(Mode2) + or a + jr nz,.loc21 + ld hl,.loc19 ; "Standart mode" + ld a,(Mode0) + or a + jr nz,.loc21 + ld hl,.loc20 ; "Quick format" +.loc21: ld bc,18 + ld de,metka6 ; строка в ListBox-е + ldir + ret + ; +.loc6: dw .loc7 + dw .loc8 + dw .loc9 + dw .loc10 + dw .loc11 + dw .loc12 + dw .loc13 + dw .loc14 + dw .loc15 + dw .loc16 + dw .loc17 + dw .loc18 + dw .loc50 + dw .loc51 + ; +.loc7: db "1.44 Mb" +.loc8: db "1.52 Mb" +.loc9: db "1.60 Mb" +.loc10: db "1.64 Mb" +.loc11: db "1.66 Mb" +.loc12: db "1.68 Mb" +.loc13: db "1.72 Mb" +.loc14: db "1.74 Mb" +.loc15: db "720 kB " +.loc16: db "800 kB " +.loc17: db "820 kB " +.loc18: db "830 kB " +.loc50: db "TR-DOS " +.loc51: db "CP/M-80" + + +.loc19: db "(Standart mode) " +.loc29: db "(Optimize sectors)" +.loc20: db "(Quick format) " +.loc52: db " " +.loc22: db "NO NAME " +.loc25: db "System files" +.loc53: db "Boot disk " +.loc26: db " " + + + +; Занести размер выбранного формата в байтах +Space: push af + rlca + ld e,a + ld d,0 + ld hl,.loc1 + ld bc,7 + add hl,de + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + push hl + ld de,space1 + ldir + pop hl + ld bc,7 + ld de,space2 + ldir + ld hl,.loc14 + ld de,space3 ; сбр. число bad-секторов + ld bc,4 + ldir + ld hl," 0" + ld (space4),hl ; сбр. тек. число дорожек + pop af + ret + +.loc1: dw .loc2 + dw .loc3 + dw .loc4 + dw .loc5 + dw .loc6 + dw .loc7 + dw .loc8 + dw .loc9 + dw .loc10 + dw .loc11 + dw .loc12 + dw .loc13 + dw .loc15 + dw .loc16 + ; +.loc2: db "1457664" ; 1.44Mb +.loc3: db "1539584" ; 1.52Mb +.loc4: db "1620480" ; 1.60Mb +.loc5: db "1661440" ; 1.64Mb +.loc6: db "1681920" ; 1.66Mb +.loc7: db "1702400" ; 1.68Mb +.loc8: db "1745408" ; 1.72Mb +.loc9: db "1765888" ; 1.74Mb +.loc10: db " 730112" ; 720kB +.loc11: db " 812032" ; 800kB +.loc12: db " 832512" ; 820kB +.loc13: db " 842752" ; 830kB +.loc15: db " 651264" ; TR-DOS 16 сект. по 256 байт +.loc16: db " 819200" ; CP/M-80 5 сект. по 1024 байт + ; +.loc14: db " 0" ; сбросить число bad-секторов + + + +; Настроить макс. число дорожек +SetCyl: push af + cp 3 + jr z,.loc2 + cp 6 + jr z,.loc2 + cp 10 + jr z,.loc2 + cp 4 + jr z,.loc3 + cp 7 + jr z,.loc3 + cp 11 + jr z,.loc3 + ld a,80-1 ; 80 дорожек +.loc1: ld (TRACKS+1),a + pop af + ret +.loc2: ld a,82-1 ; 82 дорожки + jr .loc1 +.loc3: ld a,83-1 ; 83 дорожки + jr .loc1 + + +; Настроить BPB ms-dos загрузчика +SetMedia: + push af + or a + jr z,.loc1 ; 1.44Mb + dec a + jp z,.loc2 ; 1.52Mb + dec a + jp z,.loc3 ; 1.60Mb + dec a + jp z,.loc4 ; 1.64Mb + dec a + jp z,.loc5 ; 1.66Mb + dec a + jp z,.loc6 ; 1.68Mb + dec a + jp z,.loc7 ; 1.72Mb + dec a + jp z,.loc8 ; 1.74Mb + dec a + jp z,.loc9 ; 720kB + dec a + jp z,.loc10 ; 800kB + dec a + jp z,.loc11 ; 820kB + dec a + jp z,.loc14 ; 830kB + dec a + jp z,.trdos ; TR-DOS + jp .cpm ; CPM-80 + +;1.44Mb +.loc1: ld hl,108 ; размер межсект. пробела + ld (GAP3),hl + ld hl,0016h + ld (Avail+2),hl ; 4 байта размера формата + ld hl,3E00h + ld (Avail),hl + ld a,18 ; число секторов + ld (frm1+1),a + ld hl,18 ; секторов на сторону + ld (SSect+1),hl + ld a,34 ; посл. служ. сектор + ld (frm2+1),a + ld hl,16896 ; размер FAT-ов + Root dir + ld (frm5+1),hl + ld hl,2880 ; секторов на диске + ld (ASect+1),hl + ld hl,9 ; секторов на FAT + ld (FSect+1),hl +.loc13: ld a,0F0h ; байт формата + ld (frm4+1),a + ld a,1 ; секторов на кластер + ld (frm3+1),a + ld hl,224 ; записей в корне + ld (frm6+1),hl +.loc12: ld hl,Avail + ld de,avail1 + ld bc,4 + ldir ; сохр. емкость дискеты в доп. ячейке + pop af + ret + +;1.52Mb +.loc2: ld hl,42 ; размер межсект. пробела + ld (GAP3),hl + ld hl,0017h + ld (Avail+2),hl ; 4 байта размера формата + ld hl,7E00h + ld (Avail),hl + ld a,19 ; число секторов + ld (frm1+1),a + ld hl,19 ; секторов на сторону + ld (SSect+1),hl + ld a,34 ; посл. служ. сектор + ld (frm2+1),a + ld hl,16896 ; размер FAT-ов + Root dir + ld (frm5+1),hl + ld hl,3040 ; секторов на диске + ld (ASect+1),hl + ld hl,9 ; секторов на FAT + ld (FSect+1),hl + jr .loc13 +;1.60Mb +.loc3: ld hl,0018h + ld (Avail+2),hl ; 4 байта размера формата + ld hl,0BA00h + ld (Avail),hl + ld a,20 ; число секторов + ld (frm1+1),a + ld hl,20 ; секторов на сторону + ld (SSect+1),hl + ld a,36 ; посл. служ. сектор + ld (frm2+1),a + ld hl,17920 ; размер FAT-ов + Root dir + ld (frm5+1),hl + ld hl,3200 ; секторов на диске + ld (ASect+1),hl + ld hl,10 ; секторов на FAT + ld (FSect+1),hl + jp .loc50 +;1.64Mb +.loc4: ld hl,0019h + ld (Avail+2),hl ; 4 байта размера формата + ld hl,5A00h + ld (Avail),hl + ld a,20 ; число секторов + ld (frm1+1),a + ld hl,20 ; секторов на сторону + ld (SSect+1),hl + ld a,36 ; посл. служ. сектор + ld (frm2+1),a + ld hl,17920 ; размер FAT-ов + Root dir + ld (frm5+1),hl + ld hl,3280 ; секторов на диске + ld (ASect+1),hl + ld hl,10 ; секторов на FAT + ld (FSect+1),hl + jr .loc50 +;1.66Mb +.loc5: ld hl,0019h + ld (Avail+2),hl ; 4 байта размера формата + ld hl,0AA00h + ld (Avail),hl + ld a,20 ; число секторов + ld (frm1+1),a + ld hl,20 ; секторов на сторону + ld (SSect+1),hl + ld a,36 ; посл. служ. сектор + ld (frm2+1),a + ld hl,17920 ; размер FAT-ов + Root dir + ld (frm5+1),hl + ld hl,3320 ; секторов на диске + ld (ASect+1),hl + ld hl,10 ; секторов на FAT + ld (FSect+1),hl +.loc50: ld hl,40 ; размер межсект. пробела + ld (GAP3),hl + jp .loc13 +;1.68Mb +.loc6: ld hl,0019h + ld (Avail+2),hl ; 4 байта размера формата + ld hl,0FA00h + ld (Avail),hl + ld a,21 ; число секторов + ld (frm1+1),a + ld hl,21 ; секторов на сторону + ld (SSect+1),hl + ld a,36 ; посл. служ. сектор + ld (frm2+1),a + ld hl,17920 ; размер FAT-ов + Root dir + ld (frm5+1),hl + ld hl,3360 ; секторов на диске + ld (ASect+1),hl + ld hl,10 ; секторов на FAT + ld (FSect+1),hl + jp .loc80 +;1.72Mb +.loc7: ld hl,001Ah + ld (Avail+2),hl ; 4 байта размера формата + ld hl,0A200h + ld (Avail),hl + ld a,21 ; число секторов + ld (frm1+1),a + ld hl,21 ; секторов на сторону + ld (SSect+1),hl + ld a,36 ; посл. служ. сектор + ld (frm2+1),a + ld hl,17920 ; размер FAT-ов + Root dir + ld (frm5+1),hl + ld hl,3444 ; секторов на диске + ld (ASect+1),hl + ld hl,10 ; секторов на FAT + ld (FSect+1),hl + jr .loc80 +;1.74Mb +.loc8: ld hl,001Ah + ld (Avail+2),hl ; 4 байта размера формата + ld hl,0F200h + ld (Avail),hl + ld a,21 ; число секторов + ld (frm1+1),a + ld hl,21 ; секторов на сторону + ld (SSect+1),hl + ld a,38 ; посл. служ. сектор + ld (frm2+1),a + ld hl,18944 ; размер FAT-ов + Root dir + ld (frm5+1),hl + ld hl,3486 ; секторов на диске + ld (ASect+1),hl + ld hl,11 ; секторов на FAT + ld (FSect+1),hl +.loc80: ld hl,11 ; размер межсект. пробела + ld (GAP3),hl + ld hl,INTERL2 ; уст. интерлив для 21 сектора + ld (INTERL+1),hl + jp .loc13 + +;720kB +.loc9: ld hl,80 ; размер межсект. пробела + ld (GAP3),hl + ld hl,000Bh + ld (Avail+2),hl ; 4 байта размера формата + ld hl,2400h + ld (Avail),hl + ld a,9 ; число секторов + ld (frm1+1),a + ld hl,9 ; секторов на сторону + ld (SSect+1),hl + ld hl,1440 ; секторов на диске + ld (ASect+1),hl +.loc15: ld hl,6656 ; размер FAT-ов + Root dir + ld (frm5+1),hl + ld a,14 ; посл. служ. сектор + ld (frm2+1),a + ld hl,3 ; секторов на FAT + ld (FSect+1),hl + ld a,0F9h ; байт формата + ld (frm4+1),a + ld a,2 ; секторов на кластер + ld (frm3+1),a + ld hl,112 ; записей в корне + ld (frm6+1),hl + jp .loc12 +;800kB +.loc10: ld hl,000Ch + ld (Avail+2),hl ; 4 байта размера формата + ld hl,6400h + ld (Avail),hl + ld hl,1600 ; секторов на диске + ld (ASect+1),hl + jr .loc16 +;820kB +.loc11: ld hl,000Ch + ld (Avail+2),hl ; 4 байта размера формата + ld hl,0B400h + ld (Avail),hl + ld hl,1640 ; секторов на диске + ld (ASect+1),hl + jr .loc16 +;830kB +.loc14: ld hl,000Ch + ld (Avail+2),hl ; 4 байта размера формата + ld hl,0DC00h + ld (Avail),hl + ld hl,1660 ; секторов на диске + ld (ASect+1),hl +.loc16: ld a,10 ; число секторов + ld (frm1+1),a + ld hl,10 ; секторов на сторону + ld (SSect+1),hl + ld hl,36 ; размер межсект. пробела + ld (GAP3),hl + ld hl,INTERL3 ; уст. интерлив для 21 сектора + ld (INTERL+1),hl + jr .loc15 + +; TR-DOS +.trdos: ld hl,50 ; размер межсект. пробела + ld (GAP3),hl + ld hl,256 + ld (MinusSc+1),hl + ld hl,INTERL4 + ld (INTERL+1),hl ; уст. интерлив для < 21 сектора + ld hl,0009h + ld (Avail+2),hl ; 4 байта размера формата + ld hl,0F000h + ld (Avail),hl + ld a,1 + ld (_OS),a + ld (SecCode+1),a ; код размера сектора + ld hl,297 ; 553-256 + ld (L0BB6+1),hl + jp .loc12 + +; CP/M-80 +.cpm: ld hl,50 ; размер межсект. пробела + ld (GAP3),hl + ld hl,1024 + ld (MinusSc+1),hl + ld hl,000Ch + ld (Avail+2),hl ; 4 байта размера формата + ld hl,8000h + ld (Avail),hl + ld a,2 + ld (_OS),a + inc a + ld (SecCode+1),a ; код размера сектора + ld hl,1065 ; 553+512 + ld (L0BB6+1),hl + jp .loc12 + + + + +; Вывод в десятичном формате (7 разрядов) +; вх: hl'= мл.разряд +; hl = ст.разряд +Hex7Dec:EXX + LD BC,4240h + EXX + LD BC,000Fh ;1.000.000 + EXX + ld iy,tmp1 + res 7,(iy+0) + CALL GetLenN32 + LD BC,86A0h + EXX + LD BC,0001h ;100.000 + EXX + CALL GetLenN32 + LD BC,10000 ;10.000 + EXX + LD BC,0 ;100.000 + EXX + CALL GetLenN32 +Hex4Dec:LD BC,1000 ;1.000 + CALL GetLenN16 + LD BC,100 ;100 + CALL GetLenN16 + LD BC,10 ;10 + CALL GetLenN16 + LD A,L + ADD A,"0" + LD (DE),A + RET +tmp1: db 0 + +GetLenN32: + LD A,2Fh + OR A +.loc1: INC A + SBC HL,BC + EXX + SBC HL,BC + EXX + JR NC,.loc1 + ADD HL,BC + EXX + ADC HL,BC + EXX + CP "0" + JR Z,.loc2 + SET 7,(IY+0) +.loc2: BIT 7,(IY+0) + JR NZ,.loc3 + LD A," " +.loc3: LD (DE),A + INC DE + RET + +GetLenN16: + LD A,2Fh + OR A +.loc1: INC A + SBC HL,BC + JR NC,.loc1 + ADD HL,BC + CP "0" + JR Z,.loc2 + SET 7,(IY+0) +.loc2: BIT 7,(IY+0) + JR NZ,.loc3 + LD A," " +.loc3: LD (DE),A + INC DE + RET + + +Avail: dw 0,0 ; число доступ. байт +avail1: dw 0,0 ; ячейка для восст. "Avail" + + + +; Вычисление и вывод доступного пространства дискеты +CalcAvail: + ld de,1529h ; Y/X полож. "Available bytes" + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + and a ; сбр. перенос + ld de,space2 ; буфер числа + ld hl,(Avail) ; мл.разряд +MinusSc:ld bc,512 + sbc hl,bc + ld (Avail),hl + exx + ld hl,(Avail+2) ; ст.разряд + ld bc,0 + sbc hl,bc + ld (Avail+2),hl + call Hex7Dec + ld hl,space2 + ld bc,0785h ; вывод строки + ld e,ColFormNumber ; атрибут + RST ToBIOS + ; + ld de,142Ch ; Y/X полож. "Bad sectors" + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ld hl,(BadSect) + inc hl + ld (BadSect),hl + ld iy,tmp1 + res 7,(iy+0) + ld de,space3 + call Hex4Dec ; вывод кол-ва bad-секторов + ld hl,space3 + ld bc,0485h ; вывод строки + ld e,ColFormNumber ; атрибут + RST ToBIOS + ret + + + + + + + ;"Системные файлы скопированы" + ;okno4: ld a,10h ; цвет вывод. окна + ;ld (_mtk1+1),a + ;ld hl,SysCopy + ;jr _mtk + +; "Отсутствует диск или устройство" +okno3: ld a,40h ; цвет вывод. окна + ld (_mtk1+1),a + ld hl,MissingDisk + jr _mtk + +; "Прервано пользователем" +okno0: ld a,10h ; цвет вывод. окна + ld (_mtk1+1),a + ld hl,Interrupt + jr _mtk + +; "Форматирование завершено" +okno1: ld a,10h ; цвет вывод. окна + ld (_mtk1+1),a + ld hl,FComplite + jr _mtk + +; "Ошибка записи сист. области или не совместимый формат" +okno2: ld a,40h ; цвет вывод. окна + ld (_mtk1+1),a + ld hl,NoForm +_mtk: ld (_mtk2+1),hl + ; + ld a,(ColDialWn) ; сохр. цвет окна + push af +_mtk1: ld a,40h ; цвет вывод. окна + ld (ColDialWn),a +_mtk2: ld hl,NoForm ; "Ошибка записи сист. области" + call DialogW + pop af + ld (ColDialWn),a ; восст. цвет окна + ret + + + + +; Очистить карту +ClearMap: + ld de,0D0Fh ; Y/X полож. верх. строки + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + call clrMap + ld de,0E0Fh ; Y/X полож. нижн. строки + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; +clrMap: ld hl,.loc2 + ld a,(metka1) + cp 0xFF ; стоп-байт + ld b,42 ; длина строки при > 80 дорожках + jr nz,.loc1 + ld b,40 ; длина строки при 80 дорожках +.loc1: ld c,85h ; вывод строки + ld e,75h ; норм. атрибут карты + RST ToBIOS + ret + ; +.loc2: db "██████████████████████████████████████████" + + + + + + +; Установить заданный формат текущего флоповода. +; Для 5.25" уст. всегда 1МГц тактовой ВГ93 (практически не нужна). +SetDrive: + ld a,(CurElem0) ; (0=A,1=B) тек. диск + ld hl,DriveA ; форматы в RadioCheck "A:" + or a + jr z,.loc1 + ld hl,DriveB ; форматы в RadioCheck "B:" +.loc1: xor a + cp (hl) + jr nz,.d1440 ; 1.44Mb 3.5" + ; девайс 720kB 5.25" +.loc2: ld a,12h ; всегда форматить на 1МГц тактовой +.loc3: ld (density),a + ret + ; девайс 1.44Mb 3.5" +.d1440: ld hl,(CurElem1) ; тек. полож. указателя формата + ld a,h + add a,l + cp 8 ; пункт 720kB и ниже + jr nc,.loc2 + ld a,13h + jr .loc3 ; форматы 1.44Mb..1.52Mb + + + + +; << Функция создания атрибута "метка тома" убрана из DSS >> +; +; Создание метки дискеты (MS-DOS) +; (байт атрибута находится по смещ. +11 от начала записи) +CreateLabel: + ret + ld hl,LABEL ; имя метки + ld a,(hl) + or a + ret z + call SetDisketa ; уст. текущим диском дискету + ; создать файл + ld hl,LABEL ; имя метки + ld a,08h ; атрибут "метка тома" + ld c,0Ah + RST ToDSS + jr c,.loc1 ; ошибка создания метки + ;ret c + ; закрыть файл + ld c,12h + RST ToDSS +.loc1: jp RestPath ; восст. диск и путь +; RET + diff --git a/MOUSE.ASM b/MOUSE.ASM new file mode 100755 index 0000000..0254060 --- /dev/null +++ b/MOUSE.ASM @@ -0,0 +1,28 @@ +; Получить новую информацию о мышке. +; Преобразует граф. координаты в текстовые +GetMousInfo: +ExmFire: ld c,3 ; получить коорд. мышки + RST ToDSS.Mouse + ret c + ex af,af' + srl h + rr l + srl h + rr l + srl l + ld a,e ; Y координата (0-255) + rra + rra + rra + and 1Fh + ld h,a ; hl=коорд. в знакоместах + ex af,af' ; статус бутонов мышки + and 3 + ret + + +; Ждем, если нажат бутон(ы) мышки +GetFire: call GetMousInfo + jr nz,GetFire ; узнать новую инфу по статусу бутонов + ; бутон(ы) не нажаты + ret diff --git a/RADIO.ASM b/RADIO.ASM new file mode 100755 index 0000000..04b5614 --- /dev/null +++ b/RADIO.ASM @@ -0,0 +1,1946 @@ +; Метка "###" - отработка "Enter" как Tab +; Метка "$$$" - раскомментарить, чтобы попадать Enter-ом +; (и Tab-ом) в InputLine. +; + + + +; Буфер имени метки дискеты +LabelBuff: + db 11 ; Max input symbols + db 0 ; ReadyString + db 0 ; Pos X + db 0 ; Add X + db 0 ; Inp.Symb +LABEL: ds 12,0 + +cSystem:db 0 ; 01/00 - созд./не созд. сист. дискету + + +Mode0: db 0 ; "Standart mode" +Mode2: db 1 ; "Optimize sectors" +Mode1: db 0 ; "Quick format" + + +CurElem0:dw 0 ; тек. полож. курсора ListBox1-а +CurElem1:dw 0 ; тек. полож. курсора ListBox2-а + + +CurILFl:db 0 ; флаг курсора 00-выкл/01-вкл +Flag: db 0 ; флаг курсора 00-нет/01-есть +Timer: db 1 ; таймер +CursPos:dw 0 ; позиция курсора + +_OS: db 0 ; 00/01/02 тип ОС (ms-dos/tr-dos/cpm) + + +; Опции выбора формата FDD +; диск "A" +DriveA: +SetDriveA0:db 1 ; 1.44Mb 3.5" +SetDriveA1:db 0 ; 720kB 5.25" +SetDriveA2:db 0 ; None (ячейка не отслеживается) +; диск "B" +DriveB: +SetDriveB0:db 0 ; 1.44Mb 3.5" +SetDriveB1:db 1 ; 720kB 5.25" +SetDriveB2:db 0 ; None + + + + + + + + + +;[]===========================================================[] +; Отрисовка объекта +; Put object 'input line' +; Input: HL-label +; Format mouse table: +; +0 - Object ~Input line~ +; +1 - Xo position object +; +2 - Xi position object +; +3 - Y position object +; +4 - Xi position text +; +5 - Xo position input line +; +6 - Hot keys +; +7 - Context +; +8,9 - Address input buffer +; +PInpLine: + PUSH IY ; iy=DialTab+5 + 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 (IX+4),A ;Temp X coord + 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 + CALL GetPutA + EX DE,HL + ld a,(ColDialWn) + LD C,A + LD A,(DE) +PInpLp1:INC DE + CP '~' + JR NZ,PInpN0 + ld c,ColDhotkey + ;LD C,A + LD A,(DE) + INC DE + LD (HL),A + INC HL + RES 5,A + LD (IY+6),A ;Hot key + LD A,(HL) + AND 0F0h + OR C + LD (HL),A + INC HL + INC DE + INC (IX+4) + ld a,(ColDialWn) + LD C,A + LD A,(DE) + INC DE +PInpN0: LD (HL),A + INC HL + LD (HL),C + INC HL + INC (IX+4) + LD A,(DE) + OR A + JR NZ,PInpLp1 + EX DE,HL + INC HL + LD A,(IX+4) + LD (IY+4),A ;Xi position text + LD A,(IX+4) + LD (IY+5),A ;Xi position input line + LD (next1+1),DE + LD B,(HL) ;len input line + INC HL + LD A,(HL) ;context + INC HL + LD (IY+7),A + LD E,(HL) ;DE-Address input buffer + LD (IY+8),E + INC HL + LD D,(HL) + LD (IY+9),D + INC HL + LD A,(DE) + INC DE + SUB A + INC A + LD (DE),A ;Ready + DEC A + INC DE + LD (DE),A ;Pos X + INC DE + LD (DE),A ;Add X + INC DE + INC DE + PUSH HL +next1: LD HL,0 + ld c,ColInpLine ; цвет строки ввода + ;LD C,A +PInpLp2:LD A,(DE) + INC DE + LD (HL),A + INC HL + LD (HL),C + INC HL + INC (IX+4) + DJNZ PInpLp2 ; цикл прохода строки ввода + POP HL + LD E,(IY+5) + LD D,(IY+3) + LD (CursPos),DE + LD A,(IX+4) + LD (IY+2),A ;Xi position object + LD BC,000Ah + ADD IY,BC ;IY-next element + PUSH IY + EXX ;Len label objects + POP HL + POP DE + OR A + SBC HL,DE + LD A,L + LD (DE),A + EXX + RET + + +; Отрисовка объекта +; Object ~Claster radio buttons~ +; Input: HL-label +; Format mouse table: +; +0 - Object ~Claster radio buttons" +; +1 - Xo position object +; +2 - Xi position object +; +3 - Yo position object +; +4 - Yi position object +; +5 - Xi position name +; from: +0 - Y position radio button +; +1 - Hot key +; +2 - Context +; +3 - (Ceil) +; +4,5 - Address ceil +; 80h - End buttons +PClRadioB: + PUSH IY + INC IY + LD (IY+0),A + LD A,(HL) ;X pos + INC HL + LD C,A + LD (IX+4),A ;Save X pos + 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 + LD (IX+5),A ;Save Y pos + ADD A,(IX+1) ;Pos Y from begin screen + LD (IY+3),A ;+3 Yo + CALL GetPutA + LD A,(HL) + INC HL + LD (IX+6),A + SUB 2 + LD C,A + LD B,0 + ADD A,4 + ADD A,(IY+1) + LD (IY+2),A ;Xi pos + LD A,(HL) + INC HL + ADD A,3 ;Yi pos + ADD A,(IY+3) + LD (IY+4),A + LD A,"┌" + LD (DE),A + INC DE + ld a,ColLstBxFr ; цвет рамки + ld (de),a + INC DE + LD A," " + LD (DE),A + INC DE + INC DE + LDI ;$-5 + INC DE + LD A,(HL) + OR A + JR NZ,$-5 + LD A," " + LD (DE),A + INC DE + INC DE + INC HL + LD A,(IX+6) + SUB C + INC A + ADD A,(IY+1) + LD (IY+5),A ;Xi pos name + LD A,C + OR A + JR Z,ClRadN1 + LD B,C +clrd1: LD A,"─" + LD (DE),A + INC DE + ld a,ColLstBxFr ; + ld (de),a + INC DE + DJNZ clrd1 +ClRadN1:LD A,"┐" + LD (DE),A + inc de + ld a,ColLstBxFr ; + ld (de),a + INC (IX+5) + LD BC,6 ;Next element claster + ADD IY,BC + ; + LD C,(IX+4) ;Empty string + LD B,(IX+5) + CALL GetPutA + EX DE,HL + LD (HL),"│" + INC HL + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC HL + LD C,(IX+6) + LD B,0 + ADD HL,BC + ADD HL,BC + LD (HL),"│" + inc hl + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC (IX+5) + EX DE,HL + ; + ; Next element +ClRadLp:LD C,(IX+4) ;pos element + LD B,(IX+5) + CALL GetPutA + LD B,0 + EX DE,HL + LD (HL),"│" + INC HL + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC HL + INC HL + INC HL + INC B + LD (HL),'[' + INC HL + INC HL + INC B + PUSH HL + INC HL + INC HL + INC B + LD (HL),']' + INC HL + INC HL + INC B + INC HL + INC HL + INC B + ; + ld a,(ColDialWn) ;Put name element + LD C,A + LD A,(DE) +ClRadL1:INC DE + CP '~' + JR NZ,ClRadN0 + ld c,ColDhotkey + ;LD C,A + LD A,(DE) + INC DE + LD (HL),A + INC HL + RES 5,A + LD (IY+1),A ;Hot key + LD A,(HL) + AND 0F0h + OR C + LD (HL),A + INC HL + INC DE + ld a,(ColDialWn) + LD C,A + INC B + LD A,(DE) + INC DE +ClRadN0:LD (HL),A + INC HL + LD (HL),C + INC HL + INC B + LD A,(DE) + OR A + JR NZ,ClRadL1 + INC DE + LD A,(IX+6) + SUB B + LD C,A + LD B,0 + ADD HL,BC + ADD HL,BC + LD (HL),"│" + inc hl + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + LD A,(IX+5) ;Current Y pos + ADD A,(IX+1) ;from begin screen + LD (IY+0),A + INC IY + INC IY + EX DE,HL + LD A,(HL) + INC HL + LD (IY+0),A ;Context + INC IY + LD C,(HL) + INC HL + LD B,(HL) + INC HL + LD A,(BC) + LD (IY+0),A ;(Ceil) + INC IY + LD (IY+0),C ;BC=Ceil + INC IY + LD (IY+0),B + INC IY + POP BC + OR A + LD A," " + JR Z,$+4 + LD A,"x" + LD (BC),A + INC (IX+5) + LD A,(HL) + OR A + JP NZ,ClRadLp + LD (IY+0),80h ;End tab claster + INC IY + INC HL + ; + LD C,(IX+4) ;End string + LD B,(IX+5) + CALL GetPutA + EX DE,HL + LD (HL),"└" + INC HL + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC HL + LD B,(IX+6) +clrd2: LD A,"─" + LD (HL),A + INC HL + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC HL + DJNZ clrd2 + LD (HL),"┘" + inc hl + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + EX DE,HL + PUSH IY + EXX + POP HL + POP DE + OR A + SBC HL,DE + LD A,L + LD (DE),A + EXX + RET + + +; Отрисовка объекта +; Object ~Claster check buttons~ +; Input: HL-label +; Format mouse table: +; +0 - Object ~Claster check buttons" +; +1 - Xo position object +; +2 - Xi position object +; +3 - Yo position object +; +4 - Yi position object +; +5 - Xi position name +; from: +0 - Y position check button +; +1 - Hot key +; +2 - Context +; +3 - (Ceil) +; +4,5 - Address ceil +; 80h - End buttons +PClCheckB: + PUSH IY + INC IY + LD (IY+0),A + LD A,(HL) ;X pos + INC HL + LD C,A + LD (IX+4),A ;Save X pos + 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 + LD (IX+5),A ;Save Y pos + ADD A,(IX+1) ;Pos Y from begin screen + LD (IY+3),A ;+3 Yo + CALL GetPutA + LD A,(HL) + INC HL + LD (IX+6),A + SUB 2 + LD C,A + LD B,0 + ADD A,4 + ADD A,(IY+1) + LD (IY+2),A ;Xi pos + LD A,(HL) + INC HL + ADD A,3 ;Yi pos + ADD A,(IY+3) + LD (IY+4),A + LD A,"┌" + LD (DE),A + INC DE + ld a,ColLstBxFr ; + ld (de),a + INC DE + LD A," " + LD (DE),A + INC DE + INC DE + LDI ;$-5 + INC DE + LD A,(HL) + OR A + JR NZ,$-5 + LD A," " + LD (DE),A + INC DE + INC DE + INC HL + LD A,(IX+6) + SUB C + INC A + ADD A,(IY+1) + LD (IY+5),A ;Xi pos name + LD A,C + OR A + JR Z,ClChkN1 + LD B,C +clch1: LD A,"─" + LD (DE),A + INC DE + ld a,ColLstBxFr ; + ld (de),a + INC DE + DJNZ clch1 +ClChkN1:LD A,"┐" + LD (DE),A + inc de + ld a,ColLstBxFr ; + ld (de),a + INC (IX+5) + LD BC,6 ;Next element claster + ADD IY,BC + ; + LD C,(IX+4) ;Empty string + LD B,(IX+5) + CALL GetPutA + EX DE,HL + LD (HL),"│" + INC HL + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC HL + LD C,(IX+6) + LD B,0 + ADD HL,BC + ADD HL,BC + LD (HL),"│" + inc hl + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC (IX+5) + EX DE,HL + ; Next element +ClChkLp:LD C,(IX+4) ;pos element + LD B,(IX+5) + CALL GetPutA + LD B,0 + EX DE,HL + LD (HL),"│" + INC HL + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC HL + INC HL + INC HL + INC B + LD (HL),'(' + INC HL + INC HL + INC B + PUSH HL + INC HL + INC HL + INC B + LD (HL),')' + INC HL + INC HL + INC B + INC HL + INC HL + INC B + ; + ld a,(ColDialWn) ;Put name element + LD C,A + LD A,(DE) +ClChkL1:INC DE + CP '~' + JR NZ,ClChkN0 + ld c,ColDhotkey + ;LD C,A + LD A,(DE) + INC DE + LD (HL),A + INC HL + RES 5,A + LD (IY+1),A ;Hot key + LD A,(HL) + AND 0F0h + OR C + LD (HL),A + INC HL + INC DE + ld a,(ColDialWn) + LD C,A + INC B + LD A,(DE) + INC DE +ClChkN0:LD (HL),A + INC HL + LD (HL),C + INC HL + INC B + LD A,(DE) + OR A + JR NZ,ClChkL1 + INC DE + LD A,(IX+6) + SUB B + LD C,A + LD B,0 + ADD HL,BC + ADD HL,BC + LD (HL),"│" + inc hl + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + ; + LD A,(IX+5) ;Current Y pos + ADD A,(IX+1) ;from begin screen + LD (IY+0),A + INC IY + INC IY + EX DE,HL + LD A,(HL) + INC HL + LD (IY+0),A ;Context + INC IY + LD C,(HL) + INC HL + LD B,(HL) + INC HL + LD A,(BC) + LD (IY+0),A ;(Ceil) + INC IY + LD (IY+0),C ;BC=Ceil + INC IY + LD (IY+0),B + INC IY + POP BC + OR A + LD A," " + JR Z,$+4 + LD A,"" + LD (BC),A + INC (IX+5) + LD A,(HL) + OR A + JP NZ,ClChkLp + LD (IY+0),80h ;End tab claster + INC IY + INC HL + ; + LD C,(IX+4) ;End string + LD B,(IX+5) + CALL GetPutA + EX DE,HL + LD (HL),"└" + INC HL + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC HL + LD B,(IX+6) +clch2: LD A,"─" + LD (HL),A + INC HL + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + INC HL + DJNZ clch2 + LD (HL),"┘" + inc hl + ;ld a,(ColLstBxFr) ; + ld (hl),ColLstBxFr + EX DE,HL + PUSH IY + EXX + POP HL + POP DE + OR A + SBC HL,DE + LD A,L + LD (DE),A + EXX + RET + + + +; Отрисовка объекта +; Object ~Frame~ +; Input: HL-label +; Format mouse table: None +; +PFrame: ld c,(hl) ; X pos + inc hl + ld b,(hl) ; Y pos + inc hl ; X len + inc hl ; Y len + ld a,(hl) + push af ; сохр. Y len + push bc + call GetPutA + ld a,"┌" + ld (de),a + inc de + ld a,ColorFrame + ld (de),a + inc de + dec hl + ld b,(hl) ; X len +.loop1: ld a,"─" + ld (de),a + inc de + ld a,ColorFrame + ld (de),a + inc de + djnz .loop1 + ld a,"┐" + ld (de),a + inc de + ld a,ColorFrame + ld (de),a + pop bc +.loop2: inc b + push bc + call GetPutA + ex de,hl + ld (hl),"│" + inc hl + ld (hl),ColorFrame + inc hl + ex de,hl + ld b,(hl) ; X len +.loop3: ld a," " + ld (de),a + inc de + ld a,ColorFrame ; цвет внутри фрейма + ld (de),a + inc de + djnz .loop3 + ld a,"│" + ld (de),a + inc de + ld a,ColorFrame + ld (de),a + inc de + pop bc + inc hl + dec (hl) + dec hl + jr nz,.loop2 + inc b + call GetPutA + ld a,"└" + ld (de),a + inc de + ld a,ColorFrame + ld (de),a + inc de + ld b,(hl) ; X len + inc hl + pop af + ld (hl),a ; восст. Y len +.loop4: ld a,"─" + ld (de),a + inc de + ld a,ColorFrame + ld (de),a + inc de + djnz .loop4 + ld a,"┘" + ld (de),a + inc de + ld a,ColorFrame + ld (de),a + inc hl + ret + + + + + +;[]===========================================================[] +; Event Input Line +EInpLine: + LD HL,what ; список событий + LD A,(HL) + INC HL + CP evMouseFr + JR Z,EImouse + CP evKeyboard + JR Z,EIkeys + CP evCombKey + JP Z,EIcombK + RET + +;Event - Mouse fire +EImouse:LD E,(HL) ;Xcoord + INC HL + LD D,(HL) ;Ycoord + LD A,D + CP (IX+4) ;Y pos input line + RET NZ + 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 + BIT 7,(IX+1) + JR Z,SetInLn + BIT 7,(IX+6) + JR NZ,$+6 + CP (IX+6) ;Xo inp.line + RET C + SUB (IX+6) ;shift from begin + LD C,A + LD L,(IX+9) + LD H,(IX+0Ah) + INC HL + LD (HL),0 ;Flag + INC HL + CP (HL) + RET Z + PUSH HL + INC HL + ADD A,(HL) ;AddX + INC HL + CP (HL) ;InpSymb + LD A,(HL) + POP HL + JR Z,EIM + JR C,EIM + INC HL + SUB (HL) + DEC HL + LD C,A +EIM: LD (HL),C + DEC HL + DEC HL + PUSH IY + PUSH HL + POP IY + CALL PrnInLn + POP IY + JR InLnExt + +;Event - Key press +EIkeys: BIT 7,(IX+1) + JR NZ,ILwork + LD A,(HL) ; what+1 + RES 5,A +; CP 9 ; Tab +; JR Z,SetInLn +; cp 0Dh ; $$$ +; jr z,SetInLn + CP (IX+7) ;Hot key + RET NZ +SetInLn:CALL MoveObj ;Select Input line + CALL ResDialInv ;Reset previos invert + LD IX,DialTab+5 + LD E,(IX+2) ;Xo + LD D,(IX+4) ;Y + LD A,(IX+5) ;Xi text + SUB E + LD C,A ;Len text + CALL SetDialInv + PUSH IY + LD L,(IX+9) + LD H,(IX+0Ah) + PUSH HL + POP IY + INC HL + LD (HL),1 ;Flag + INC HL + SUB A + LD (HL),A ;Pos X + INC HL + LD (HL),A ;Add X + INC HL + CALL PrnInLn + POP IY + CALL PILCurs ; уст. курсор + EI +InLnExt:LD HL,what + LD (HL),evNothing + jp GetFire + + +; Work select input line +ILwork: LD A,(HL) ; what+1 Get keys +ILwrk2: CP 8 + JR Z,ILw1 + CP " " + RET C +ILw1: PUSH IY + LD DE,InLnWex + PUSH DE + LD L,(IX+9) ;Address buffer + LD H,(IX+0Ah) + PUSH HL + POP IY + PUSH AF + RES 7,(IY+1) + LD A,1 + AND 1 + RRCA + OR (IY+1) + LD (IY+1),A + POP AF + CP 8 + JP Z,ILdelet + EX AF,AF' + BIT 0,(IY+1) + CALL NZ,ClearIL + LD A,(IY+4) ;InpytSymb + CP (IY+0) ;Max len + JR NZ,ILn + LD A,(IY+2) + ADD A,(IY+3) + CP (IY+0) + RET NC + BIT 7,(IY+1) + RET NZ +ILn: LD A,(IY+4) + SUB (IY+3) + SUB (IY+2) + JR Z,NoInsrt + DEC (IY+4) + BIT 7,(IY+1) + JR Z,NoInsrt + INC (IY+4) + ; Ввод в середину текста + LD C,A + LD B,0 + LD L,(IX+9) + LD H,(IX+0Ah) + LD A,(IY+4) + ADD A,L + LD L,A + JR NC,$+3 + INC H + INC HL + INC HL + INC HL + INC HL + INC HL + LD D,H + LD E,L + DEC HL + LDDR +NoInsrt:LD L,(IX+9) + LD H,(IX+0Ah) + LD A,(IY+2) + ADD A,(IY+3) + ADD A,L + LD L,A + JR NC,$+3 + INC H + INC HL + INC HL + INC HL + INC HL + INC HL + EX AF,AF' + LD (HL),A + INC (IY+4) + INC (IY+2) + LD A,(IX+3) + SUB (IX+6) + CP (IY+2) + CALL Z,OutIL + CALL PrnInLn + POP DE +InLnWex:LD HL,what + LD (HL),evNothing + POP IY + RET + +;Курсор за экраном +OutIL: LD A,(IY+3) + ADD A,8 ;Step + LD (IY+3),A + LD A,(IY+2) + SUB 8 ;Step + LD (IY+2),A + RET + +;Clear Buffer +ClearIL:SUB A + LD B,(IY+0) + LD L,(IX+9) + LD H,(IX+0Ah) + INC HL + INC HL + INC HL + INC HL + INC HL + LD (HL),A + DJNZ $-2 + LD (IY+4),A + RES 0,(IY+1) + RET + + +; Combination keys +EIcombK:BIT 7,(IX+1) + JR NZ,EIcombn + 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) ; what+2 Shift+Tab + CP 9 + RET NZ + JP SetInLn ; выделить пред. объект + ; +EIcombn:PUSH IY + ld c,(hl) ; what+1 + INC HL + LD A,(HL) ; what+2 + LD L,(IX+9) ; Address buffer + LD H,(IX+0Ah) + LD DE,InLnWex + PUSH DE + PUSH HL + POP IY + bit 7,c ; курсорные или shift+... ? + jr nz,eicmb1 ; Shift+... + CP 54h + JR Z,ILleft ; курсор влево + CP 56h + JR Z,ILright ; курсор вправо + CP 4Fh + JP Z,IL_del_ ; удалить символ в тек. позиции + CP 57h + JP Z,ILHome ; в начало строки + CP 51h + JP Z,ILEnd ; в конец строки + jr eicmb2 +eicmb1: cp " " + jr c,eicmb2 + cp "~"+1 + jp c,ILwrk2 ; на ввод символов +eicmb2: POP DE + POP IY + RET + + +;Курсор влево на одно место +ILleft: LD A,(IY+2) + DEC A + JP P,ILlfnxt + LD A,(IY+3) + SUB 8 ;Step + RET C + LD (IY+3),A + LD A,(IY+2) + ADD A,8 ;Step +ILlfnxt:LD (IY+2),A + CALL PrnInLn + RES 0,(IY+1) + RET + +;Курсор вправо на одно место +ILright:LD A,(IY+2) + ADD A,(IY+3) + CP (IY+4) + RET Z + LD A,(IX+3) + SUB (IX+6) + LD B,A + LD A,(IY+2) + INC A + CP B + JR NZ,ILrgnxt + LD A,(IY+3) + ADD A,8 ;Step + LD (IY+3),A + LD A,(IY+2) + SUB 8 ;Step +ILrgnxt:LD (IY+2),A + CALL PrnInLn + RES 0,(IY+1) + RET + +;delete +ILdelet:LD A,(IY+2) + OR A + JR NZ,ILDelNx + LD A,(IY+3) + SUB 8 ;Step + RET C + LD (IY+3),A + LD A,(IY+2) + ADD A,8 ;Step + LD (IY+2),A +ILDelNx:LD L,(IX+9) + LD H,(IX+0Ah) + LD A,(IY+2) + ADD A,(IY+3) + ADD A,L + LD L,A + JR NC,$+3 + INC H + INC HL + INC HL + INC HL + INC HL + INC HL + LD D,H + LD E,L + DEC DE + LD A,(IY+4) + SUB (IY+3) + SUB (IY+2) + JR Z,ILDelN + LD C,A + LD B,0 + LDIR +ILDelN: SUB A + LD (DE),A + DEC (IY+2) + DEC (IY+4) + CALL PrnInLn + RES 0,(IY+1) + RET + +;Delete Char in Current Position +IL_del_:LD L,(IX+9) + LD H,(IX+0Ah) + LD A,(IY+2) + INC A + ADD A,(IY+3) + ADD A,L + LD L,A + JR NC,$+3 + INC H + INC HL + INC HL + INC HL + INC HL + INC HL + LD D,H + LD E,L + DEC DE + LD A,(IY+4) + SUB (IY+3) + SUB (IY+2) + RET Z + LD C,A + LD B,0 + LDIR + SUB A + LD (DE),A + DEC (IY+4) + CALL PrnInLn + RES 0,(IY+1) + RET + +;Home +ILHome: LD A,(IY+2) + OR A + RET Z + SUB A + LD (IY+2),A + LD (IY+3),A + CALL PrnInLn + RES 0,(IY+1) + RET + +;End string +ILEnd: LD A,(IY+4) + SUB (IY+3) + CP (IY+2) + RET Z + ADD A,(IY+3) + LD C,A + LD (IY+3),0 + LD A,(IX+3) + SUB (IX+6) + SUB C + JR Z,ILEndLp + JR NC,EndNIL + NEG +ILEndLp:LD C,A + LD A,(IY+3) + ADD A,8 ;Step + LD (IY+3),A + LD A,C + SUB 8 ;Step + JR NC,ILEndLp +EndNIL: LD A,(IY+4) + SUB (IY+3) + LD (IY+2),A + CALL PrnInLn + RES 0,(IY+1) + RET + + + + + + +;[]===========================================================[] +; Put Input Line in window +PrnInLn:LD A,(CurILFl) + PUSH AF + CALL ResILCr ; сбросить курсор + LD HL,0 + LD E,(IX+6) ;Xo pos inp.line + LD D,(IX+4) ;Y pos object + BIT 7,(IX+3) + JP NZ,prne + BIT 7,E + JR Z,$+7 + LD A,E + NEG + LD L,A + LD E,H + ;LD A,E + ;CP 80 + ;JR NC,prne + ;LD A,D + ;CP 31 + ;JR NC,prne + LD (prnadd+1),HL + LD C,BIOS.LP_SET_PLACE ; уст. позицию курсора + RST ToBIOS + LD L,(IX+9) ;Address buffer + LD H,(IX+0Ah) + LD A,(IY+3) + ADD A,L + LD L,A + JR NC,$+3 + INC H + INC HL + INC HL + INC HL + INC HL + INC HL + LD A,(IX+3) ;Xi-Xo(inp.ln.)=Len inp.ln. + SUB (IX+6) + LD E,A + LD C,A + LD B,A + LD A,(IX+6) + ADD A,C + CP 80+1 + JR C,$+8 + LD A,80 + SUB (IX+6) + LD B,A + BIT 7,(IX+6) + JR Z,$+11 + LD A,(IX+6) + NEG + SUB C + NEG + LD B,A + PUSH BC + SUB A + LD B,E + LD DE,CompBuff + PUSH DE + LD (DE),A + INC DE + DJNZ $-2 + LD A,(IY+0) + SUB (IY+3) + CP C + JR NC,$+3 + LD C,A + LD B,0 + LD A,(IY+4) + SUB C + JR NC,$+4 + ADD A,C + LD C,A + POP DE + PUSH DE + LD A,B + OR C + JR Z,$+4 + LDIR + POP HL + POP BC +prnadd: LD DE,0 + ADD HL,DE + LD A,B + OR A + JR Z,prne + LD C,86h ; вывод строки без атрибутов + RST ToBIOS +prne: LD A,(IY+2) + ADD A,(IX+6) + LD E,A + LD D,(IX+4) + LD (CursPos),DE + POP AF + OR A + CALL NZ,PILCurs ; уст. курсор + EI + PUSH IY + LD IY,DialData + LD A,(IX+6) + SUB (IY+0) + LD C,A + LD A,(IX+4) + SUB (IY+1) + LD B,A + POP IY + PUSH IX + LD IX,DialData + CALL GetPutA + POP IX + LD HL,CompBuff + LD A,(IX+3) ;Xi-Xo(inp.ln.)=Len inp.ln. + SUB (IX+6) + LD C,A + LD B,0 + IN A,(Page3) + PUSH AF + LD A,(Win2) + OUT (Page3),A + LDI + INC DE + JP PE,$-3 + POP AF + OUT (Page3),A + RET + + +;Курсор объекта InputLine +PrnILCr:LD A,(Timer) ;пауза мигания + DEC A + CALL Z,PutILCr + LD (Timer),A + RET + +PutILCr:LD A,(Flag) + CPL + LD (Flag),A +PILCurs:LD DE,(CursPos) ; уст. курсор + LD (CrPs+1),DE + BIT 7,E + JR NZ,cre + ;LD A,E + ;CP 80 + ;JR NC,cre + ;LD A,D + ;CP 31 + ;JR NC,cre + LD C,0B4h ; получить символ + SUB A + RST ToBIOS + LD A,(Flag) + OR A + LD B,1Bh + JR Z,NoILC + LD B,5Bh ; курсор черточкой +NoILC: LD C,0B5h ; символ на экран + SUB A + RST ToBIOS +cre: LD A,1 + LD (CurILFl),A + LD A,12 + RET + +; Сбросить курсор +ResILCr:LD A,(CurILFl) + OR A + RET Z + LD A,0FFh + LD (Flag),A + INC A + LD (CurILFl),A + LD A,12 + LD (Timer),A +CrPs: LD DE,0 + BIT 7,E + RET NZ + ;LD A,E + ;CP 80 + ;RET NC + ;LD A,D + ;CP 31 + ;RET NC + LD C,0B4h ; получить символ + SUB A + RST ToBIOS + LD BC,1BB5h ; символ на экран + SUB A + RST ToBIOS + RET + + +; +InpLineI: + LD E,(IX+2) ;Xo + LD D,(IX+4) ;Y + LD A,(IX+5) ;Xi text + SUB E + LD C,A ;Len text + CALL SetDialInv + LD DE,(CursPos) + CALL PILCurs ; уст. курсор + EI + RET + +ClastI: LD E,(IX+2) ;Xo + INC E + LD D,(IX+4) ;Y + LD A,(IX+6) ;Xi name + SUB E + LD C,A + CALL SetDialInv + LD E,(IX+2) ;Xo + INC E + LD D,(IX+7) ;Y elem + LD A,(IX+3) + SUB E + DEC A + LD C,A ;Len X + jp SetClasInv + + + +; Set claster buttons invert +; Input: +; E - X pos +; D - Y pos +; C - X len +SetClasInv: + PUSH IX + LD IX,DialData + IN A,(Page3) + PUSH AF ;сохр.page4 + LD A,(Win2) + OUT (Page3),A ;вкл.буфер + PUSH HL + LD L,C ;Len X + LD H,1 ;len Y + LD (RClIlen+1),HL ;Save len + LD (RClIpos+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 (RClIbuf+2),HL + LD B,E + ld e,ColDialInv + ;LD E,A + ld d,ColDhotkey + ;LD D,A +SetDin2: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 +.loc2: INC HL + DJNZ SetDin2 + LD IX,(RClIbuf+2) ;Put Name with invert + LD HL,(RClIlen+1) + LD DE,(RClIpos+1) + CALL PutDialLn + POP HL + POP AF + OUT (Page3),A + POP IX + LD E,(IX+2) ;Xo pos element + INC E + INC E + INC E + LD D,(HL) ;Y pos element + LD (CursPos),DE + PUSH HL + CALL PILCurs ; Set cursor + POP HL + LD A,1 + LD (CIflag+1),A + RET + + + +; Get claster data +GetClDt:PUSH IX + POP HL + LD BC,7 + ADD HL,BC ;Begin claster elements +GetDtLp:INC HL ;Ypos + INC HL ;Hot key + INC HL ;Context + LD A,(HL) ;(Ceil) + INC HL + LD E,(HL) ;Address Ceil + INC HL ; + LD D,(HL) ; + INC HL + LD (DE),A + BIT 7,(HL) ;7bit-end claster + JR Z,GetDtLp + RET + + + + + + +;[]===========================================================[] +; Event claster radio/check buttons +; +EClasterB: + LD HL,what + LD A,(HL) + INC HL + CP evMouseFr + JR Z,ECmouse ;Mouse fire + CP evKeyboard + JR Z,ECkeys ;Key press + CP evCombKey + JP Z,ECcombK ;Key press + RET + +; Event - Mouse fire +; проверка координат мышки +ECmouse:LD E,(HL) ;Xpos + INC HL + LD D,(HL) ;Ypos + 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 ;> + LD A,D + CP (IX+4) ;Yo pos + RET C ;< + CP (IX+5) ;Yi pos + RET NC ;> + SUB A + LD (ECnext+1),A + DEC A + LD (SaveA1+1),A ;Begin element claster + PUSH IX + POP HL + INC HL + LD BC,6 ;len element claster + LD E,B ;number element + LD A,D +EClsLp1:ADD HL,BC + BIT 7,(HL) + JP NZ,SelClas ;Elem not found + INC E + CP (HL) ;Compare with Y pos elem + JR NZ,EClsLp1 + JR CSelNxt + +;Event - Key press +ECkeys: SUB A + LD (ECnext+1),A + DEC A + LD (SaveA1+1),A ;Begin element claster + LD A,(HL) +; CP 0Dh +; JR Z,ECspace ; test on "Enter" + CP " " + JR Z,ECspace ; test on "Space" + RES 5,A + BIT 7,(IX+1) + JR NZ,ECkeyN ; I is select + CP 9 ; Tab + JP Z,SelCls0 ; выделить след. объект + CP 0Dh ; ### + JP Z,SelCls0 ; выделить след. объект +ECkeyN: PUSH IX + POP HL + INC HL + LD BC,6 ;Len elements + LD E,B +ECkeyLp:ADD HL,BC + BIT 7,(HL) + RET NZ + INC E + INC HL + CP (HL) ;Hot key element + DEC HL + JR NZ,ECkeyLp +CSelNxt:BIT 7,(IX+1) ;NZ-object is select + JP NZ,CSelect + JP SelCls1 + +;Test on space +ECspace:BIT 7,(IX+1) + RET Z ;not select + LD A,(SavElem+1) + OR A + JR NZ,ECspc1 + INC A + LD (SavElem+1),A +ECspc1: LD (ECnext+1),A + PUSH IX + POP HL + INC HL + LD DE,6 + LD B,A + ADD HL,DE ;find elem.label + DJNZ $-1 + JP ECnext ;change + +;Test on cursor keys +ECcombK:BIT 7,(IX+1) + JR NZ,ECcombn ;is select + 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) ; Shift+Tab + CP 9 + RET NZ + JP SelCls0 ; выделить пред. объект + ; +ECcombn:SUB A + LD (ECnext+1),A ;Flag change buttons + INC HL + LD A,(HL) + CP 58h ; курсор вверх + JR Z,ECup + CP 54h ; курсор влево + JR Z,ECup + CP 52h ; курсор вниз + JR Z,ECdown + CP 56h ; курсор вправо + RET NZ + ; курсор вниз +ECdown: PUSH IX + POP HL + INC HL + LD E,L + LD D,H + LD BC,6 + LD A,(SavElem+1) + OR A + JR NZ,$+3 + INC A + INC A ;increment element + LD (SavElem+1),A +ECcmlp: ADD HL,BC ;find label + BIT 7,(HL) + CALL NZ,EndClst ;table is over + DEC A + JR NZ,ECcmlp + CALL ResClasInv ;Res inver elem + JP Pcurs ;next invert + +;Get begin table elem +EndClst:EX DE,HL + ADD HL,BC ;table is begin + LD A,1 + LD (SavElem+1),A ;first elem. + RET + +;Cursor up +ECup: PUSH IX + POP HL + INC HL + LD DE,6 + LD A,(SavElem+1) + OR A + JR NZ,$+3 + INC A + DEC A ;decrement cur.elem. + CALL Z,BegClst + LD (SavElem+1),A + LD B,A + ADD HL,DE ;find label + DJNZ $-1 + CALL ResClasInv ;Res inver elem + JR Pcurs ;next invert + +;Get end table elem +BegClst:PUSH HL + SUB A + DEC A + INC A + ADD HL,DE ;find nember end element + BIT 7,(HL) + JR Z,$-4 + POP HL + RET ;A=end element + +;selected claster +SelClas:BIT 7,(IX+1) + JR NZ,SaveA1 ;NZ-is select +SelCls0:LD E,0 +SelCls1:LD A,E + LD (SaveA1+1),A + CALL MoveObj + CALL ResDialInv ;Res orevios invert + LD IX,DialTab+5 + LD E,(IX+2) ;Xo name + INC E + LD D,(IX+4) ;Y name + LD A,(IX+6) ;Xi name + SUB E + LD C,A ;len name + CALL SetDialInv ;Set my invert +SaveA1: LD A,0 + INC A + JR Z,EClexit ;Element not found + DEC A + LD (SavElem+1),A + LD (ECnext+1),A + JR CButton ;Change buttons + +;Event - Mouse fire (in select claster) +CSelect:LD A,1 + LD (ECnext+1),A + LD A,(SavElem+1) + CP E + JR Z,ECnext + LD A,E + LD (SavElem+1),A + CALL ResClasInv ;Res inver elem +CButton:PUSH IX + POP HL + INC HL + LD DE,6 +SavElem:LD A,0 + OR A + JR NZ,$+3 + INC A + LD B,A + ADD HL,DE + DJNZ $-1 +Pcurs: LD E,(IX+2) ;Xo pos element + INC E + LD D,(HL) ;Y pos element + LD A,(IX+3) + SUB E + DEC A + LD C,A ;len element + CALL SetClasInv ;Set inver elem +ECnext: LD A,0 + OR A + CALL NZ,ChangeB +EClexit:LD HL,what ;Event claster exit + LD (HL),evNothing + jp GetFire + + + +;[]===========================================================[] +; Change buttons (Check/Radio) +; Input parameters: HL-Address claster element label +ChangeB:LD A,(IX+1) + RES 7,A + CP ClRadioBut + JP Z,ChangeR + ; Change check button + LD E,L + LD D,H + PUSH IX + POP HL + LD BC,7 + ADD HL,BC + PUSH HL ;Save cur.elem +ChangL1:INC HL ;Begin elements claster + INC HL + INC HL + LD (HL),B ;(Ceil)=0 + INC HL + INC HL + INC HL + BIT 7,(HL) + JR Z,ChangL1 + EX DE,HL ;HL=Current element claster + INC B + INC HL + INC HL + INC HL + LD (HL),B ;Cur.elem=1 + INC HL + INC HL + INC HL + POP HL ;Reset begin elem table + IN A,(Page3) + PUSH AF + LD A,(Win2) + OUT (Page3),A +ChangL2:LD D,(HL) ;Ypos + INC HL + INC HL + INC HL + LD A,(HL) ;Address ceil + INC HL + INC HL + INC HL + LD E,(IX+2) ;X pos + INC E + INC E + INC E + PUSH IX + PUSH DE + LD IX,DialData + EX AF,AF' + LD A,E + SUB (IX+0) + LD C,A + LD A,D + SUB (IX+1) + LD B,A + CALL GetPutA + EX AF,AF' + LD C,A + OR A + LD A," " + JR Z,$+4 + LD A,"" + LD (DE),A + POP DE + POP IX + ;LD A,D + ;CP 31 + ;JR NC,cl1 + BIT 7,E + JR NZ,cl1 + ;LD A,E + ;CP 80 + ;JR NC,cl1 + PUSH HL + LD A,C + PUSH AF + LD C,BIOS.LP_SET_PLACE ; уст. позицию курсора + RST ToBIOS + POP AF + OR A + LD A," " + JR Z,$+4 + LD A,"" + LD BC,0182h + RST ToBIOS ;Print on/off + POP HL +cl1: BIT 7,(HL) + JR Z,ChangL2 + CALL ResILCr ; сбросить курсор + CALL PILCurs ; Set cursor + EI + POP AF + OUT (Page3),A + RET + +;Change radio button ([x]) +ChangeR:IN A,(Page3) + PUSH AF + LD A,(Win2) + OUT (Page3),A + LD D,(HL) ;Ypos + INC HL + INC HL + INC HL + LD A,(HL) ;Address ceil + XOR 1 + LD (HL),A + INC HL + INC HL + INC HL + LD E,(IX+2) ;Xpos + INC E + INC E + INC E + PUSH IX + PUSH DE + LD IX,DialData + EX AF,AF' + LD A,E + SUB (IX+0) + LD C,A + LD A,D + SUB (IX+1) + LD B,A + CALL GetPutA + EX AF,AF' + LD C,A + OR A + LD A," " + JR Z,$+4 + LD A,"x" + LD (DE),A + POP DE + POP IX + ;LD A,D + ;CP 31 + ;JR NC,cl2 + BIT 7,E + JR NZ,cl2 + ;LD A,E + ;CP 80 + ;JR NC,cl2 + LD A,C + PUSH AF + LD C,BIOS.LP_SET_PLACE ; уст. позицию курсора + RST ToBIOS + POP AF + OR A + LD A," " + JR Z,$+4 + LD A,"x" + LD BC,0182h + RST ToBIOS ;Print +cl2: CALL ResILCr ; сбросить курсор + CALL PILCurs ; уст. курсор + EI + POP AF + OUT (Page3),A + RET + diff --git a/Shared_Includes b/Shared_Includes new file mode 160000 index 0000000..378f3fd --- /dev/null +++ b/Shared_Includes @@ -0,0 +1 @@ +Subproject commit 378f3fdd49601390b3aacfe51e45c6fceba25022 diff --git a/Version.inc b/Version.inc new file mode 100644 index 0000000..97875d7 --- /dev/null +++ b/Version.inc @@ -0,0 +1,4 @@ + define RELEASE 1 + +; версия программы + DEFINE FF_Version '1.13.2' \ No newline at end of file diff --git a/mhmt b/mhmt new file mode 100755 index 0000000000000000000000000000000000000000..8ef5dfe6e2704bcdd361f631bb936ad9806274a8 GIT binary patch literal 87384 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 literal 0 HcmV?d00001