..LIB = 1 ..L$$ = 1 .INCLUDE "QF.MAC" .mcall .ttyin .ttyout .print .macro strmenu str .ascii `str`<200> .endm .LASM PUTCH .LASM PRINT ASCIZ. .LASM EXTRB BYTE2. .LASM PUSB BYTE. .LASM PUSHB var. .LCOD EXTR0 .LCOD TTYOUT BYTE. .lcod SHOW .lasm P$PAR byte. .lasm PUTDUp byte. .lcod NOINVERS .lcod INVERSe .lasm DECOD .lasm CURON .lcod CUROFF .lasm COLON byte. .lasm ADDBS .lcod cursor byte. .lcod author .lasm do byte. .lasm enddo .lcod clr$R .lcod clr$M .lcod clr$D .lcod list$D .lcod subscr .lcod nosubscr .lcod MZnum .cod ed$cur cursor e$Y:: .blkb 1 e$X:: .blkb 1 end. .cod ret$m2 clr$R author list$D end. .cod primnp print <Возврат в меню настройки параметров> end. .cod t$move clr$D cursor <19.,6.> print .byte 202,200 ttyout 200 print .byte 201,203,200 cursor <19.,16.> print <Перемещение по таблице> end. .psect .prog a$parm:: movb curdev,r5 mul #recsiz,r5 add (r2)+,r5 add #pardev,r5 1$: rts r2 rstscr:: call ramker mov r5,r0 jmp primen ttyjmp:: trap 3 ; .ttyin mov (r5),r1 ; chrs table 1$: cmpb r0,(r1) beq 100$ tstb (r1)+ bne 1$ dec r1 100$: sub (r5)+,r1 asl r1 ; Смещение в табл. add r5,r1 ; Адрес в таблице jumpов mov (r1),r5 ; Адрес rts r5 .psect .strn k$mas: .byte up,down,left,right .byte cr,esc,quit$,ctrlW,0 .psect .data c$mas: .word U$proc,D$proc,L$proc,R$proc .word exec$,can$,exit$p,rstscr .psect .prog exec$: movb m$choic(r5),r0 asl r0 ptr$c == :.+2 jmp @-1(r0) intmen:: mov (r1)+,r0 ; само меню mov (r1)+,ptr$c ; call table mov r1,(sp) trap 0 mov r0,r5 ; Указатель на меню call primen k$disp: 3$: trap 3 ; Мой .ttyin mov #k$mas,r1 1$: tstb (r1) beq 3$ cmpb r0,(r1)+ bne 1$ 2$: asl r1 call @*2>>(r1) bcc k$disp return can$: tst (sp)+ clr r0 return ; ╣╣╣╣╣╣╣ Меню смены параметров ╣╣╣╣╣╣╣╣╣ ch$par: jsr r1,intmen .word chan$m,chan$p tst r0 beq 10$ ; Выход был по ESC 9$: .forth clr$M cursor <17.,22.> print <Записываются параметры устройств> .quit mov #r.blk,r0 emt 375 ; .readw bcs 1$ cmp pass,buf$rd+pass-1000 bne 1$ ; Подсунули другой диск mov #w.blk,r0 emt 375 ; .writw bcc 10$ 1$: .forth clr$M cursor <17.,29.> inverse print .asciz / Ошибка записи /<7> noinverse clr$D cursor <20.,6.> print .asciz <224>/ - Повторить/ cursor <21.,6.> print <АР2 - Продолжить> .quit trap 3 ; Ожидаем нажатия кнопки cmpb r0,#esc bne 9$ 10$: .forth clr$R author .quit mov #work$p,ptr$c mov #work$m,r0 jmp primen ret$mm: sec ret$: return ;╣╣╣╣╣╣╣╣╣╣╣╣ Тип накопителя ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣ .psect .strn s$key: .byte cr,up,down,left,right,0 .psect .prog s$ides: trap 0 .forth clr$D clr$R cursor <11.,44.> ttyout '╙ putdup <15.,'╣> colon <1,'ё> colon <2,'╥> cursor <12.,44.> colon <2,'╥> ttyout '╕ putdup <15.,'╣> ttyout '╧ cursor <19.,6.> ttyout 200 print .byte 40,201,200 cursor <19.,16.> print <Установка типа накопителя> cursor <20.,6.> print .byte 202,40,203,200 cursor <20.,16.> print <Выбор накопителя> cursor <21.,6.> ttyout 224 cursor <21.,16.> primnp cursor <19.,14.> colon <3,'-> .quit 200$: .forth ; pushb curdev cursor <9.,45.> subscr ; print ; .ascii /Накопитель MZ#:/<200> ; pusb '0 ; addbs ; putch print <Накопитель> MZnum nosubscr .quit 2$: ; jsr r2,a$parm ; .word no$up call clc.up mov #3$,-(sp) ; Точка модификации bicb #^c1,(r5) bne 6$ mov #4$,(sp) ; Модифицируем указатель на точку модификации 6$: movb #$inverse,@(sp) .forth 3$: noinvers cursor <12.,45.> print < Двухсторонний > 4$: noinvers cursor <13.,45.> print < Односторонний > noinvers show .quit movb #$noinvers,@(sp)+ jsr r5,ttyjmp .word s$key ;cr up down left right else .word 10$, 7$, 7$, 20$, 21$, 2$ 7$: incb (r5) br 2$ 20$: call L$proc br 200$ 21$: call R$proc br 200$ 10$: .forth ret$m2 .quit return ;╣╣╣╣╣╣╣╣╣╣╣╣ Число дорожек ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣ s$trk: .forth clr$R cursor <12.,39.> print <Число дорожек на диске> .quit jsr r0,gt$int .byte 0,86. return ;╣╣╣╣╣╣╣╣╣╣╣╣╣ Число сегментов ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣ s$egs: .forth clr$R cursor <12.,37.> print <Число сегментов каталога> .quit jsr r0,gt$int .byte 3,31. return .psect .strn gi$key: .byte del,cr,left,right,0 .psect .prog ;╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣ gt$int:: movb (r0)+,33$ ; Смещение movb (r0)+,34$ ; макс. число mov r0,(sp) trap 0 .forth clr$D cursor <19.,6.> print <0..9, Del> cursor <19.,20.> print <Редактирование параметра> cursor <20.,6.> print .byte 202,40,203,200 cursor <20.,20.> print <Выбор накопителя> cursor <21.,6.> ttyout 224 cursor <21.,20.> primnp cursor <19.,18.> colon <3,'-> .quit 1$: 2$: .forth cursor <12.,62.> print <: > curon .quit jsr r2,a$parm .word ntrk add (pc)+,r5 33$: .word 0 movb (r5),r0 ; Указатель на параметр call putint ; Напечатали число mov #buf$wr,r3 ; trap 5 ; .ttyout #40 ; .word 40 jsr r5,ttyjmp .word gi$key ; del cr left right else .word 300$, 100$, 10$, 4$, 400$ ; del subprocess 300$: movb (r5),r1 ; Параметр clr r0 div #10.,r0 movb r0,(r5) br 2$ 10$: call L$proc br 5$ 4$: call R$proc 5$: .forth show .quit br 1$ 400$: sub #'0,r0 blt 2$ ; Левые символы -- на х.. ! cmp r0,#9. bgt 2$ ; Правые символы -- туда же ! movb (r5),r1 mul #10.,r1 add r0,r1 34$ = :.+2 cmp r1,#0 bgt 3$ movb r1,(r5) br 2$ 3$: trap 5 ; .ttyout #7 .word 7 br 2$ 100$: .forth curoff show ret$m2 .quit rts pc ;╣╣╣╣╣╣╣╣╣╣╣╣╣ Имя тома и владельца ╣╣╣╣╣╣╣╣╣╣╣╣ v$own: trap 0 jsr r2,str$ed .byte owner-labvol .byte labvol .byte 12.,37. .byte 200 .asciz /Метка тома :/ .even bcs ed$ex jsr r2,str$ed .byte recsiz-owner .byte owner .byte 12.,37. .byte 200 .asciz /Владелец :/ .even br ed$ex inp$fd: trap 0 jsr r2,str$ed .byte labvol-fnam .byte fnam .byte 12.,37. .byte 0 .asciz /Имя вх. файла :/ .even jsr r2,a$parm .word fnam mov #labvol-fnam,r0 1$: cmpb (r5)+,#40 beq 2$ sob r0,1$ br 3$ 2$: clrb -(r5) 3$: ed$ex: .forth curoff show ret$m2 .quit ccc return str$ed:: movb (r2)+,r0 ; Длина строки movb r0,maxlen movb (r2)+,off$s ; Смещение movb (r2)+,e$Y ; Поз. курсора movb (r2),e$X movb (r2)+,ed$pX movb (r2)+,r.l. ; Как работать с РУС/ЛАТ clr ed$k8 tstb off$s bmi 1$ ; Если заказали -1, то строку ложить по r5 jsr r2,a$parm ; Если > 0 то ложить в табл. параметров off$s =:. .word 0 1$: mov r5,-(sp) mov #disk,r1 3$: movb (r5)+,(r1) beq 4$ inc r1 sob r0,3$ 4$: 5$: cmpb -(r1),#40 beq 5$ clrb 1(r1) sub #disk-1,r1 movb r1,curchr .forth clr$R clr$D cursor <19.,6.> print <АЛФ> cursor <19.,15.> print <Смена РУС/ЛАТ регистров> cursor <20.,6.> print .byte 202,40,203,200 cursor <20.,15.> print <Перемещение по строке> cursor <21.,6.> print <АР2> cursor <21.,15.> print <Отказ от редактирования> cursor <22.,6.> ttyout 224 cursor <22.,15.> print <Завершение редактирования строки> cursor <19.,13.> colon <4,'-> cursor <8.,70.> subscr print <Лат> nosubscr ed$cur curon .quit 13$: incb e$X movb (r2)+,r0 beq 2$ trap 6 ; .ttyout br 13$ 2$: .forth ed$cur print .byte 33,'K,200 ed$pX = :.+1 cursor <0,74.> ttyout 244 ed$cur .quit mov maxlen,r0 clrb disk(r0) .print #disk 222$: movb e$X,r0 curchr = :.+2 add #0,r0 movb r0,-(r3) movb e$Y,-(r3) .forth print .byte 33,'Y,200 pusb 40 addbs putch pusb 40 addbs putch .quit bis #40000,@#44 mov #curchr,r4 jsr r5,ttyjmp .word ed$mas ;rus lat left right del cr esc ^U rst else .word 110$, 110$, 111$, 10$, 11$, ed$brk,ed$qui,25$,1010$,12$ 110$: r.l. = :.+2 mov #0,r4 xor r4,ed$k8 bne 113$ .forth cursor <8.,70.> subscr print <Лат> nosubscr .quit br 222$ 113$: .forth cursor <8.,70.> subscr print <Рус> nosubscr .quit br 222$ 111$: ; left process tstb (r4) ble 99$ decb (r4) br 222$ 10$: ; Right process movb (r4),r1 tstb disk(r1) beq 99$ maxlen =: .+2 cmpb r1,#0 bgt 99$ incb (r4) br 222$ 11$: ; del tstb (r4) ble 99$ decb (r4) movb (r4),r4 ; Смещение add #disk,r4 7$: movb 1(r4),(r4)+ bne 7$ 99$: br 2$ 25$: clrb (r4) clr disk br 2$ 1010$: mov (r4),r4 clrb disk(r4) br 2$ 12$: cmpb r0,#40 beq 16$ bhi 14$ ;99$: trap 5 ; beep !!! ; .word 7 br 2$ 14$: ; else ... ed$k8 = :.+2 bisb #0,r0 16$: cmpb (r4),maxlen bge 99$ ; /// incb (r4) movb (r4),r4 ; Смещение add #disk-1,r4 ; Куда вставлять символ mov #disk,r1 8$: tstb (r1)+ bne 8$ 9$: movb -(r1),1(r1) cmpb r1,r4 bhi 9$ movb r0,(r1) br 2$ .psect .strn ed$mas: .byte rus,lat,left,right,del,cr,esc,25,rst,0 .psect .prog ed$$: bic #40000,@#44 tst (sp)+ inc r2 bic #1,r2 rts r5 ; Заргузим сохраненное выше r5 ed$qui: jsr r5,ed$$ br ex$ed+2 ed$brk: jsr r5,ed$$ mov maxlen,r4 mov #disk,r0 1$: movb (r0)+,(r5)+ beq 2$ sob r4,1$ br ex$ed 2$: dec r5 3$: movb #40,(r5)+ sob r4,3$ ex$ed: tst (pc)+ sec rts r2 ;╣╣╣╣╣╣╣╣╣╣╣╣ Тип разметки ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣ typ$f: trap 0 .forth t$move cursor <20.,6.> print <ТАБ> cursor <20.,16.> print <Перейти к след. устройству> cursor <21.,6.> print <Пробел> cursor <21.,16.> print <Установка типа форматирования текущего привода> cursor <22.,6.> ttyout 224 cursor <22.,16.> primnp cursor <19.,13.> colon <4,'-> clr$R cursor <8.,31.> subscr print <Тип> cursor <9.,31.> print <разметки> nosubscr cursor <7.,42.> colon <1,'╚> print <╥ 0-я дорожка> cursor <7.,58.> colon <1,'╚> print <╥Область данных> cursor <9.,42.> do 2 print <╥ Низ ╥ Верх > enddo cursor <10.,29.> ttyout '╔ putdup <12.,'╣> do 4 ttyout '╟ putdup <7.,'╣> enddo ttyout 240 .quit mov #42.,r5 mov #4,r2 1$: movb r5,2$ .forth 2$ = :.+2 cursor <11.,0> colon <5,'╥> ttyout '║ .quit add #8.,r5 sob r2,1$ .forth curon .quit call te1 br end$te ;╣╣╣╣╣╣╣╣╣╣╣╣ Порядок секторов ╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣╣ setord: trap 0 .forth clr$R cursor <7.,43.> ttyout '╚ cursor <8.,30.> print <Усл. обознач.╥> cursor <8.,50.> subscr print <Порядок секторов> nosubscr cursor <9.,29.> ttyout '╔ putdup <44.,'╣> ttyout '═ cursor <9.,43.> colon <1.,'╟> colon <6.,'╥> ttyout '║ t$move cursor <20.,6.> print <0-9,Del> cursor <20.,16.> print <Ввод номера сектора [1..10]> cursor <21.,6.> ttyout 224 cursor <21.,16.> primnp cursor <19.,14.> colon <3,'-> cursor <10.,36.> curon .quit mov #pscts1,r1 movb #'A,(r1) 1$: .print r1 incb (r1) cmpb (r1),#'F ble 1$ call te2 end$te: .forth curoff ret$m2 show .quit return .psect .strn pscts1: .byte 0,back,12,200 .psect .data ; oper blk buf nwrd wait w.blk:: .word 11*400+17,1,1000,400,0 r.blk:: .word 10*400+17,1,buf$rd,400,0 ; Рабочие процессы work$p:: .word f$disk,q$disk,f$area,SF0,SF1 .word f$copy,ch$par,exit$p ; Процессы настройки параметров chan$p::.word s$ides,s$trk,s$egs,v$own .word inp$fd,typ$f,setord,ret$mm .psect .strn chan$m::.byte 8.,5.,24.,^c7,7 strmenu <Число сторон> strmenu <Накопитель : двухсторонний или односторонний> strmenu <Число дорожек> strmenu <Количество дорожек : 40, 80 или другое [35..86]> strmenu <Число сегментов> strmenu <Количество сегментов по 1К, отводимое под каталог [1..31]> strmenu <Имена тома и владельца> strmenu <Они заносятся в каталог при инициализации> strmenu <Вх. файл/устройство> strmenu <Из него информация копируется на форматируемый диск> strmenu <Тип форматирования> strmenu <Каким форматом размечать диск (см. след. пункт)> strmenu <Порядок секторов> strmenu <Изменение порядка расположения секторов на дорожке> strmenu <Запись параметров> strmenu <Запись и возврат в основное меню. АР2 - возврат без записи> work$m::.byte 8.,5.,24.,^c7,0 strmenu <Форматирование диска> strmenu <Форматирование диска с инициализацией> strmenu <Быстрое форматирование> strmenu <Форматирование диска без проверки> strmenu <Форматирование области> strmenu <Форматирование участка диска с уничтожением информации> strmenu <Полный SaveFormat> strmenu <Форматирование всего диска с сохранением информации> strmenu <Выборочный SaveFormat> strmenu <Восстановление сбойных дорожек по всему диску> strmenu <Формат+копир. (FCopy)> strmenu <Форматирование диска с одновременным Copy/Device на него> strmenu <Смена параметров> strmenu <Изменение числа дорожек, секторов, типа разметки и т.п.> strmenu <Выход в систему> strmenu <Завершение работы с программой> ; ----------- File tabed --------- .psect .prog curtab:: mov r1,r5 clr r0 div (r2)+,r0 add (r2)+,r0 ; частное - смещ Y movb r0,e$Y mul (r2)+,r1 add (r2)+,r1 movb r1,e$X .forth ed$cur .quit rts r2 cur1: trap 0 mov (pc)+,r1 cho1: .blkw 1 ; Альтернатива jsr r2,curtab .word 4,11.,8.,46. movb tf$tab(r5),r0 trap 6 trap 5 .word back $$ret:: return tf1: movb #30.,e$X movb #11.,e$Y 1$: movb e$Y,-(r3) movb #$noinvers,2$ jsr r2,a$parm .word typfor movb (r3),r0 sub #10.,r0 cmpb r0,(r5) bne 3$ movb #$inverse,2$ 3$: .forth ed$cur 2$: inverse putdup <6.,40> pusb <'1 - 11.> addbs putch putdup <5.,40> noinverse .quit incb e$Y cmpb e$Y,#15. ble 1$ .forth cursor <4.,69.> .quit movb (r5),r0 jmp putint te1:: ;------------------------------------- mov cho1,-(sp) mov #19.,cho1 1$: call cur1 dec cho1 bge 1$ mov (sp)+,cho1 19$: call tf1 20$: call cur1 21$: mov #cho1,r4 jsr r5,ttyjmp .word e1$k. .word 50$ .word 100$ ; sp process .word 200$ ; left process .word 300$ ; right process .word 400$ ; up process .word 500$ ; down process .word $$ret .word 250$ 50$: call R$proc br 19$ 100$: jsr r2,a$parm .word typfor incb (r5) cmpb (r5),#6. blt 102$ 101$: movb #1,(r5) 102$: call tf1 br 19$ 200$: ; left dec (r4) bge 20$ mov #19.,(r4) br 20$ 250$: ; Ввод значения cmpb r0,#'A blt 20$ cmpb r0,#'F bgt 20$ mov (r4),r1 movb r0,tf$tab(r1) call cur1 300$: ; right inc (r4) cmpb (r4),#19. ble 20$ clr (r4) br 20$ 400$: ; up sub #4,(r4) bge 20$ add #20.,(r4) br 20$ 500$: ; down add #4,(r4) cmp (r4),#19. ble 20$ sub #20.,(r4) br 20$ .psect .strn e1$k.: .byte 11,40,Left,Right,Up,down,cr,0 e2$k.: .byte Left,Right,Up,down,Del,cr,0 .psect .prog cur2: trap 0 mov (pc)+,r1 cho2: .blkw 1 ; Альтернатива jsr r2,curtab .word 10.,10.,3.,44. movb ordsct(r5),r0 jmp putint te2:: ; mov cho2,-(sp) ; mov #59.,cho2 ;1$: call cur2 ; dec cho2 ; bge 1$ ; mov (sp)+,cho2 mov #6.,r5 mov #ordsct,r2 movb #10.,2$ 1$: .forth cursor 2$: .byte 0,44. .quit incb 2$ mov #10.,r4 3$: movb (r2)+,r0 call putint trap 5 .word 31 sob r4,3$ sob r5,1$ 20$: call cur2 incb e$X .forth ed$cur .quit mov #cho2,r4 jsr r5,ttyjmp .word e2$k. .word 100$ ; left process .word 200$ ; right process .word 300$ ; up process .word 400$ ; down process .word 500$ ; del process .word $$ret .word 50$ 50$: ; Ввод значения sub #60,r0 blt 20$ cmp r0,#9. bgt 20$ mov (r4),r4 ; choice movb ordsct(r4),r1 mul #10.,r1 add r1,r0 cmp r0,#100. bge 20$ movb r0,ordsct(r4) br 20$ 100$: ; left dec (r4) bge 20$ mov #59.,(r4) br 20$ 200$: ; right inc (r4) cmpb (r4),#59. ble 20$ clr (r4) br 20$ 300$: ; up sub #10.,(r4) bge 20$ add #60.,(r4) br 20$ 400$: ; down add #10.,(r4) cmp (r4),#59. ble 20$ sub #60.,(r4) br 20$ 500$: ; del mov (r4),r4 movb ordsct(r4),r1 clr r0 div #10.,r0 movb r0,ordsct(r4) br 20$ .end