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 0000000..8a720a5 Binary files /dev/null and b/ESTEX.BS differ diff --git a/EXIT.ASM b/EXIT.ASM new file mode 100755 index 0000000..e372bec --- /dev/null +++ b/EXIT.ASM @@ -0,0 +1,71 @@ +; Функция выхода в ДОС +; + + + + +Exit: ; вкл. режим 1.44Mb + call set_1440 + ; восст. cga-палитру + ld bc,03A6h + ld a,0 + RST ToBIOS + ; восст. экран + call RestScreen + ; восст. полож. курсора сист. экрана +sys_cursor_coords+1: + ld de,0 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS + ; восст. сист. диск и путь + ;call RestPath ;!FIXIT + ld hl,#6200 ;!HARDCODE + ld c,Dss.ChDir + RST ToDSS + ; очистить буфер клавы + ld bc,3135h + rst 0x10 + ; освоб. выделенный блок памяти + ld a,(hBlock) + ld c,3Eh + rst 0x10 + jr nc,quit + ld hl,NoFree + call Print + ld b,-1 ; код ошибки + jr quit1 +quit: ld b,0 +quit1: ld c,41h ; выйти в Estex + rst 0x10 + ret + + +NoFree: db "Error free block memory !",0Dh,0Ah,0 + + + + +; Вывод строки на экран +Print: ld c,5Ch + rst 0x10 + ret + + + + +; Восст. экран +RestScreen: ld c,0B3h + jr _skrn +; Сохранить экран +SaveScreen: ld c,BIOS.WIN_COPY ; копир. из буфера в окно +_skrn: di + ld ix,WinBoxBuff ; Address Box buffers + ld hl,2050h ; Y/X размер окна + ld de,0000h ; Y/X полож. окна + ld a,(Win1) ; Page buffer + ld b,a + xor a + RST ToBIOS + ei + ret + diff --git a/FMAIN.ASM b/FMAIN.ASM new file mode 100755 index 0000000..1295313 --- /dev/null +++ b/FMAIN.ASM @@ -0,0 +1,225 @@ +; Работает через порты ВГ93. +; Выделяет 8 страниц памяти. +; +; При создании загрузочной дискеты, копирует загрузчик Estex +; в секторы 2..4 и корректирует BPB boot-сектора, устанавливая +; 10 зарезерв. секторов (4 для 720kB) и 1 копию FAT. С систем- +; ного диска копирует на дискету системные файлы. +; +; + + define release 1 ; режим компиляции исходника + + +; ; описание ds xx +; %imacro ds 1 +; times %1 db 0 +; %endmacro + +; ; описание ds xx,yy +; %imacro ds 2 +; times %1 db %2 +; %endmacro + + include './shared_includes/constants/dss_equ.inc' + include './shared_includes/constants/bios_equ.inc' + + +SysPort equ 0x3C ; сист. порт (без подкл. ПЗУ биоса) +Page1 equ 0xA2 ; порт 1-й страницы +Page3 equ 0xE2 ; порт 3-й страницы +WinBoxBuff equ 0xC000 ; начало буфера + +; версия программы +major_version equ 1 +minor_version equ 13 + + + + + + if release + org 0x6400 + else + org 0x6200 + + db 'EX' ; exe ID + db 'E' ; exe тип + db 0 ; exe версия + dw 512 ; мл. смещ. кода + dw 0 ; ст. смещ. кода + dw 0 ; end-beg, первичный загрузчик + dw 0,0 ; резерв + dw 0 ; + dw Start ; адрес загрузки кода + dw Start ; адрес передачи управления + dw Stack ; адрес стека + ds 490 ; резерв + endif + + +Start: ld sp,Stack + ; режим турбо - 1.44Mb + ld a,13h + ld c,8Fh + RST ToBIOS + ; сравнить исп. номера портов страниц с номерами портов Биоса + ;call compare_page + ; выделяем блок в 8 страниц + ld bc,8*256 + Dss.GetMem ;!HARDCODE + RST ToDSS + jr c,err_mem ; нет памяти + ld (hBlock),a ; хэндл блока + ; создать список выдел. страниц + ld hl,hPages + ld c,0C5h + RST ToBIOS + ; вкл. рабочую страницу в Page3 (исп. для буфера сист. области дискеты) + ld a,(BuffSys) + out (Page3),a + ; очистить буфер клавы + ld bc,Dss.ScanKey*256 + Dss.K_CLEAR + RST ToDSS + ; получить свой каталог + LD HL,#6200 + LD DE,CurPath + LD BC,256 + LDIR + ; сохр. текущий диск + ld c,2 + RST ToDSS + ADD A,"A" + ld (#6200),a ;!HARDCODE + ; сохр. текущий путь + ld c,Dss.CurDir + ld hl,#6200+3 ; буфер тек. пути ;!HARDCODE + RST ToDSS + ; перейти в свой каталог + ld hl,CurPath + ld c,#1D ; Dss.ChDir + RST ToDSS + ; + jp Begin + + +err_mem: ld hl,NoMem + ld a,30 + ld (quit+1),a + call Print + ; выход в ДОС + jp quit + +NoMem: db "Not enough memory !",0Dh,0Ah,0 + + +hBlock: db 0 ; хэндл выдел. блока +hPages: +BuffSys: db 0 ; хэндл рабочей страницы (+для сист. области) +BuffTrk: db 0 ; хэндл стр. буфера структуры дорожки (и "system.exe") +Win1: db 0 ; хэндл стр. сохр. экрана +Win2: db 0 ; хэндл стр. сохр. гл. окон форматилки +TRBoot: db 0 ; хэндл буфера загрузчика TR-DOS +SBuff0: db 0 ; хэндл буфера "system.exe" +SBuff1: db 0 ; хэндлы буфера под +SBuff2: db 0 ; файл "system.dos" + db 0xFF ; стоп-байт списка + + + + + + +;[]=================== Начало программы =========================[] + +Begin: ; сохр. экран + call SaveScreen + ; сохр. полож. курсора сист. экрана + ld c,8Eh + RST ToBIOS + ld (sys_cursor_coords),de + ; иниц. драйвер мышки + ld c,0 + RST ToDSS.Mouse + jr nc,continue + ld hl,NoMouse ; драйвер мыши не установлен + call Print + ; ждем нажатия клавиши + ld c,30h + RST ToDSS +continue: call ReadInit ; чтение "fformat.ini" и настройка + call CopyBootTRD ; скопир. бут из "boot.$b" (если есть) + + call CopySysFiles ; скопир. сист. файлы в буферы + + + + include "dialog.asm" + include "listbox.asm" + include "radio.asm" + include "mouse.asm" + include "map.asm" + + + + + +; вектор для отображения курсора +rst38: di + push iy + push ix + push hl + push de + push bc + push af + ld a,(CurILFl) + or a + call nz,PrnILCr + pop af + pop bc + pop de + pop hl + pop ix + pop iy +vect: jp 0x0000 ; адрес сист. вектора + + + + +; Рабочий буфер Input Line +CompBuff: ds 16 + +_1: +DialData: ds 16 + +; Буфер заголовка вывод. окна +DialName: ds 16 + +DialTab: ds 128 + +; Буфер под объекты +ReCompBuff: ds 512 + +_2: +NoMouse: db "Driver mouse not installed",0Dh,0Ah,0 +Title: db " Floppy disk formatting utility Version " + db major_version + "0","." + db (minor_version / 10) + "0",(minor_version % 10) + "0" + db " (c) 2005-2007 " + ; + ds 562 ; 565 + start2 = 672 (_2 -_1) + + + + include "exit.asm" + include "estex.asm" + include "form.asm" + + ds 80 +Stack: db 0 ; буфер под стек программы + +ES_Boot: incbin "estex.bs" ; загрузчик Estex + + +; Буфер системной области дискеты +L2400: + diff --git a/FORM.ASM b/FORM.ASM new file mode 100755 index 0000000..9de4715 --- /dev/null +++ b/FORM.ASM @@ -0,0 +1,1622 @@ +; Порты ВГ93 +REGCOM equ 0x0F ; порт команд и статуса +REGTRK equ 0x3F ; порт дорожки +REGSEC equ 0x5F ; порт сектора +REGDATA equ 0x7F ; порт данных +REGCTRL equ 0xFF ; порт управления + +L4000 equ 0xC000 ; буфер структуры дорожки + + + + +; Форматилка +FFORMAT:ld a,2 ; число попыток иниц. ВГ93 после глюков + ld (try_init),a +FFORM1: call ClearMap ; очистить карту + call Fresh ; обновить константы окна форм-ния + call HiddenMouse ; скрыть мышку + call init_interlive ; уст. интерлив для всех форматов + call L0B21 ; созд. в стр. BuffTrk структуру дорожки + ld a,(_OS) + or a + jr z,.loc1 ; ms-dos + dec a + jr nz,.loc2 ; cpm-80 + ; tr-dos + call SysAreaTRDOS + jr .loc2 + ; ms-dos +.loc1: call L09A8 ; созд. с L2400.. структуру сист. области + ; откр. окно иниц. дисковода +.loc2: ld a,(ColDialWn) ; сохр. цвет окна + ld (TmpColor),a + ld a,1Fh ; цвет окна + ld (ColDialWn),a + ld hl,InitFdd ; "Resetting drive..." + call PutDialWn + call HiddenMouse ; скрыть мышку + call set_1440 + ; Открыть порты ВГ93 + ld a,1Ch + out (SysPort),a + call A0626 ; сбросить контроллер + ; дернуть головкой + ld a,70 + out (REGDATA),a + ld a,18h ; перейти на задан. дорожку + call A092C ; занести команду + call A092A ; на 0-ю дорожку +; + ; проверить наличие дискеты + call L0C65 ; тест на чтение сектора + jr z,.loc3 ; Ok + call set_720 + call L0C65 ; тест на чтение сектора + jr z,.loc3 ; Ok + cp 0x80 ; проверяем на отсутствие дискеты + jr z,Pars1 ; нет дискеты + ; тест на защиту от записи +.loc3: call L0906 ; тест на запись сектора + bit 6,a + jr nz,Pars1 ; "защита записи" +; + call ClsDial ; закрыть окно + ld a,(TmpColor) + ld (ColDialWn),a + call HiddenMouse ; скрыть мышку + ld a,(Mode1) ; "Quick format" + or a + jr nz,.loc4 + call L0BFF ; форматирование + call RestoreTime ; восст. сист. время + jp c,Abort ; прерывание операции + jp nz,Parsing ; есть ошибки записи/чтения + ; +.loc4: xor a + ld (RetCode),a ; очистить код возврата ошибок + ld a,(ColDialWn) ; сохр. цвет окна + push af + ld a,17h ; цвет вывод. окна + ld (ColDialWn),a + ld hl,SystemArea ; "Writing system area..." + call PutDialWn + call HiddenMouse ; скрыть мышку + call L09D9 ; запись сист. области + call ClsDial ; закрыть окно диалога + pop af + ld (ColDialWn),a + ; + ld a,(RetCode) + or a + jr nz,Parsing ; были ошибки при записи сист. области + call A092A ; на 0-ю дорожку + ; Закрыть порты ВГ93 + call Abort + ld a,(_OS) + or a + jp nz,okno1 ; при tr-dos, cp/m-80 + ld a,(cSystem) ; флаг копир. системных файлов + or a + call nz,WriteSysFiles ; запись сист. файлов на дискету + call CreateLabel ; создать метку дискеты, если задана + jp okno1 ; "Форм. завершено", выход из функции fformat + + +Abort: call A0626 ; сбросить контроллер + ; закрыть порты ВГ93 + ld a,4 + out (SysPort),a + ld c,1 ; показать мышку + RST ToDSS.Mouse + ret + + + + + +; закрыть окно "Resseting drive..." +Pars1: ;нет диска, R/O + call ClsDial + ld a,(TmpColor) + ld (ColDialWn),a + ; +; Разбор ошибок записи/чтения +Parsing:;любые ошибки + call Abort + ld a,(RetCode) + bit 6,a ; бит "запрещена запись" + jr nz,ReadOnly + and 0x18 ; 4,3 биты + jr z,nodisk + ld hl,try_init + dec (hl) + jp nz,FFORM1 + jp okno2 ; "ошибка записи сист. области или не совм. формат" + ; + ; нет дискеты (код 80h) +nodisk: call okno3 ; "Вставьте дискету" + ld a,(hl) + cp cmOkey + ret nz + ; дискета вынута (в процессе форм-ния) + jp FFORM1 + + +ReadOnly: + ld a,(ColDialWn) + push af + ld a,4Fh ; цвет окна форматирования + ld (ColDialWn),a + ld hl,Protect ; "Защита от записи" + call DialogW + pop af + ld (ColDialWn),a + ret + + + +; Число попыток иниц. ВГ93 после ошибок "R/O" и (или) +; "ошибка записи сист. области или не совм. формат" +try_init: + db 2 + + + + + +; Обновить константы окна процесса форм-ния +Fresh: call Reset_Map ; сбросить tracks, side + call L0D92 ; вывод номера дорожки + call L0D93 ; вывод стороны + ; сбросить число bad-секторов и доступн. емкость дискеты + ld hl,-1 ; коррект. для CalcAvail + ld (BadSect),hl + ld hl,(avail1) ; мл.разряд + ld bc,(MinusSc+1) ; 512/256/1024 + add hl,bc ; коррект. для CalcAvail + ld (Avail),hl + ld hl,(avail1+2) ; мл.разряд + ld (Avail+2),hl + jp CalcAvail ; вывести нач. данные + + + + +; Скрыть мышку +HiddenMouse: + ld c,2 + RST ToDSS.Mouse + ret + + +; Вкл. режим 1.44Mb +set_1440: + ld a,13h ; 1.44Mb + jr set_hz + +; Вкл. режим 720kB +set_720: + ld a,12h ; 720kB +set_hz: ld c,8Fh ; turbo + RST ToBIOS + ret + + + +; Сбросить карту в начальное состояние +Reset_Map: + xor a + ld (tracks),a + ld (side),a + inc a + ld (sect),a + ld a,5 + ld (count),a + ld a,maska ; 05h атрибут норм. сектора + ld (bad),a + ld hl,0D0Fh + ld (cursor),hl ; восст. полож. метки + ret + + + + + + +;[]======================================================[] + +; Занести в контроллер диск и сторону +L0870: ld a,(side) + xor 1 ; 1 = 0-я сторона, 0 = 1-я сторона + add a,a + add a,a + add a,a + add a,a + ld c,a + ld a,(DISK) + or c + or 00001100b ; 0Ch + out (REGCTRL),a + ret + + + +; Сброс ВГ93 +; установка на тек. диск и 0-ю сторону +A0626: ex af,af' + ld a,(DISK) ; диск + and 3 + ld c,a + ld a,00011000b ; сброс ВГ93 нулем 2-го бита + or c + out (REGCTRL),a + set 2,a ; 1Ch + out (REGCTRL),a + call A0929 ; сбр. контроллер + ex af,af' + ret + + +;---- +; прерывание FDC +A0929: ld a,0D0h ; abort (force interrupt) + out (REGCOM),a + call delay ; delay 16 usec + in a,(REGDATA) ; чтение регистра данных (clear DRQ) + in a,(REGCOM) ; чтение статуса (clear INTRQ) + ld a,0D0h ; abort again (why?) + out (REGCOM),a + call delay ; delay 16 usec + in a,(REGCOM) ; получить статус (регистр команд) + ret + +delay: ; >=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 0000000..8ef5dfe Binary files /dev/null and b/mhmt differ