int xMZ[] = {10,25,40,55}; int device = 0; int flag = 0; int pasword= 0123456; int *pp = 0; int sides[4]; int sizsct[4]; int tracks[4]; int *bufer = 0; #define INVERS 01 #include main() { int dm[15]; register int i,j; tstuknc("?FMZ-F-tOLXKO DLQ uknc"); writeln("\033H\033J"); if(!pp) if(!load(pp = dm,14)) report("\007Input error",1); else { for (i = 0 ; i < 4; i++) sides[i] = *pp++; for (i = 0 ; i < 4; i++) sizsct[i] = *pp++; for (i = 0 ; i < 4; i++) tracks[i] = *pp++; pasword = *pp; } border(5,0,65,23); cursor(5,4); chout(0247); line(0272,4,6,64); chout(0273); cursor(5,13); chout(0247); line(0272,13,6,64); chout(0273); cursor(5,19); chout(0247); line(0272,19,6,64); chout(0273); cursor(35,4); chout(0275); colon(0244,35,5,12); chout(0254); cursor(55,13); chout(0275); colon(0244,55,14,18); chout(0254); if (!bufer) bufer = malloc(10 * 01000); j = TRUE; cursor(10,6); writeln("Comint (C) Corp."); cursor(8,8); writeln("Formater MZ: V01.00"); cursor(8,10); writeln("Dessigned by Oleg H."); cursor(9,11); writeln("MIEPh, 1991, March"); do { report("\t\t wYBOR USTROJSTWA",1); if (j) showMZ(); switch(i = inkey()) { case 0303: device++; j = 1; break; case 0304: device--; j = 1; break; case '\n': case 0302: install(); j = 0; break; case 0233: restart(); default: j = 1; if((i>=060) && (i <=063)) device = i - 060; break; } if (device < 0) device = 3; device %= 4; } while(1); } /* main */ /***********************/ quit() { strout("\033H\033J"); exit(); } /***********************/ report(str,l) char *str; int l; { cursor(8,21); writeln("\33K\200"); cursor(8,22); writeln("\33K\200"); colon(0244,65,21,22); cursor(8,20 + l); puts(str); home(); } /***********************/ home() { clrbuff(); cursor(6,21); writeln(" \033D\200"); } /***********************/ inversion(k) int k; { register x; x = k && 01; if (x == (flag & INVERS)) return; flag |= INVERS; putchar(033); if (!x) { chout (0277); flag &= ~INVERS; } chout(0243); } /***********************/ border(x1,y1,x2,y2) int x1,x2,y1,y2; { line (0272,y1,x1 + 1,x2 - 1); line (0272,y2,x1 + 1,x2 - 1); colon(0244,x1,y1 + 1,y2 - 1); colon(0244,x2,y1 + 1,y2 - 1); cursor(x1,y1);chout(0250); cursor(x1,y2);chout(0266); cursor(x2,y1);chout(0277); cursor(x2,y2);chout(0274); } /***********************/ inkey() { register x; clrbuff(); if ((x = getchar()) != 033) return(x); return(0200 | getchar()); } /***********************/ lineout(str,size,inv,x,y) char *str; int size,inv,x,y; { register i; register char *p; /* clrbuff(); */ cursor(x,y); inversion(inv); for( i = 0, p = str; *p; i++) putchar(*p++); while(i++ < size) putchar(' '); clrbuff(); inversion(0); home(); } /***********************/ remove(mas,slen,old,new,x,y) char **mas; int slen,old,new,x,y; { lineout(mas[old],slen,0,x,y + old); lineout(mas[new],slen,1,x,y + new); } /***********************/ menu(mas,lines,slen,x,y,exi) char **mas; int lines,slen,x,y,exi; { register i,j; int rezultat; rezultat = 0; for(i = 0; i < lines; i++) lineout(mas[i],slen,i == rezultat,x,y + i); home(); do { j = rezultat; switch(i = inkey()) { case 0233 : restart(); case 0301 : rezultat--; break; case 0302 : rezultat++; break; default : if((i >= '1') && (i <= '0' + lines)) rezultat = i - '1'; break; } if(rezultat < 0 ) rezultat = lines - 1; rezultat %= lines; remove(mas,slen,j,rezultat,x,y); } while(i != '\n'); switch(exi) { case 1 : lineout(mas[rezultat],slen,0,x,y + rezultat); break; case 2 : for(i = 0; i < lines; i++) { cursor(x,y + i); for(j = slen; j--;) putchar(' '); } break; default: break; } home(); return(rezultat); } /****************************************************************/ extern int xMZ[] ; extern int device ; extern int flag ; extern int code ; extern int wcnt ; extern int *bufer ; extern int sides[4]; extern int sizsct[4]; extern int tracks[4]; extern int pasword; #define INVERS 01 #include static char *mas[] = { "1 wYBOR USTROJSTWA", "2 fORMATIR. DISKA", "3 fORMATIR. DOROVKI", "4 fORMAT. + INICIAL.", "5 kONTROLX DOROVKI", "6 sMENA PARAMETROW", "7 zAPISX PARAMETROW", "8 wYJTI W o.s. RT11" }; static char *masp[] ={ "1 wOZWRAT W MEN@", "2 ~ISLO DOROVEK", "3 ~ISLO STORON", "4 rAZMER SEKTORA" }; static char *sect[] ={ "1 256", "2 512", "3 1024" }; static char *sided[] ={ "1 oBE", "2 nIZ", "3 wERH" }; static char *trk[] = { "1 dR.", "2 40", "3 80" }; static char *ari[] = { "pOWTOR. ", "iGNORIR.", "pRERWATX" }; install() { int x,y,j; register int c,fl,i; do { cursor(60,15); writeln(" \033D\033B "); report("\t\t wYBOR OPERACII",1); x = menu(mas,8,22,8,5,2); switch(x) { case 0 : return; case 1 : case 3 : if (x == 1) report("\t\t fORMATIROWANIE DISKA",1); else report("\tfORMATIROWANIE DISKA S INICIALIZACIEJ",1); cursor(10,16); puts("\t fORMATIROWANIE USTROJSTWA MZ"); putchar(device + '0'); putchar(':'); cursor(10,17); puts("\t\twY UWERENY ? > "); i = getchar(); cursor(10,16); puts("\t\t\t\t\t"); cursor(10,17); puts("\t\t\t\t\t"); if((i != 'Y') && (i != 'y')) break; for(i = 0; i < tracks[device]; i++) { cursor(12,8); puts("dOROVKA N# "); putdec(i); $clrstr(); if(ttinr() == 033) goto ABO; if((j = format(sides[device],i)) == -1) goto ABO; if(j) { cursor(20,16); writeln("aPPARATNAQ O[IBKA N# \007\200"); putoct(j); j = menu(ari,3,9,56,15,2); cursor(20,16); writeln("\t\t\t\t\200"); switch(j) { case 0: i--; case 1: break; case 2: goto ABO; } /* case j*/ } /* if j */ } /* for */ if (x == 1) break; x = (sizsct[device])? 10 : 8; if(!sides[device]) x *= 2; cursor(12,8); writeln("iNICIALIZACIQ"); cursor(20,16); writeln("eMKOSTX DISKA \200"); putdec(x * tracks[device] - 12); writeln(" BLOKOW. \200"); if(!init(device,x * tracks[device])) { report("\007\to[IBKA ZAPISI KATALOGA",2); inkey();} ABO: break; case 2 : report("\t\tfORMATIROWANIE DOROVKI",1); i = getdec(20,16,"uKAVITE N# DOROVKI > "); if ((i >= 0) && (i < tracks[device])) { c = menu(sided,3,8,57,15,2); if(j = format(c,i)) errcod(j); } break; case 4 : report("\t\tTecTIROWANIE DOROVKI",1); i = getdec(20,16,"uKAVITE N# DOROVKI > "); if ((i >= 0) && (i < tracks[device])) if(c = testrk(i)) errcod(c); break; case 5 : /* MEN@ PARAMETROW */ do { report("\t wYBOR PARAMETROW USTROJSTWA",1); y = menu(masp,4,20,8,6,0); switch(y) { case 0 : break; case 1 : i = menu(trk,3,7,57,15,2) * 40; if (i) tracks[device] = i; else { i = getdec(20,16,"~ISLO DOROVEK ?> "); if ((i >= 0) && (i <= 128)) tracks[device] = i; } break; /* WYBOR STORON */ case 2 : sides[device] = menu(sided,3,8,57,15,2); break; /* WYBOR RAZMERA SEKTORA */ case 3 : sizsct[device] = menu(sect,3,6,57,15,2); break; } /* switch */ showMZ(); } while(y); break; case 6 : report(" zAPISYWA@TSQ TEKU]IE PARAMETRY USTROJSTW",1); if(!save(sides,12)) { report("\007\to[IBKA ZAPISI",1); inkey(); } break; case 7 : quit(); } /* main case */ } while(x); } /* install */ /***********************/ showMZ() { register i; clrbuff(); for (i = 0; i < 4; i++) { inversion(device == i); cursor(xMZ[i],2); writeln("MZ\200"); putchar(i + '0'); putchar(':'); } inversion(0); cursor(39,6); writeln("uSTROJSTWO MZ\200"); putchar(device + '0'); putchar(':'); cursor(39,7); writeln("dOROVEK : \200"); putdec(tracks[device]); $clrstr(); cursor(39,8); writeln("sTORONY : \200"); puts(sided[sides[device]] + 2); $clrstr(); cursor(39,9); writeln("sEKTOR : \200"); puts(sect[sizsct[device]] + 2); wcnt = (sizsct[device])? 01000 * 10 / 2 : 0400 * 16 / 2; $clrstr(); home(); } $clrstr() { writeln(" \200"); } getdec(x,y,m) int x,y; char *m; { char str[12]; register char *p,*s; register j; cursor(x,y); puts(m); for(p = str; (j = getchar()) != '\n';) { if((j == 0177) && (p > str)) { writeln("\033D \033D\200"); p--; } if((j >= '0') && (j <= '9')) putchar( *p++ = j); }; *p = 0; cursor(x,y); for(s = m ; *s++ ; putchar(' ')); $clrstr(); if(p == str) return(-1); for( p = str, j = 0; *p; j = (j * 10) + *p++ - 060); return(j); } errcod(i) int i; { register x; cursor(20,16); writeln("aPPARATNAQ O[IBKA N# \007\200"); putoct(i); x = inkey(); cursor(20,16); writeln("\t\t\t\t\200"); return(x); } format(c,i) int c,i; { register int fl,*p,j; int w2,k,cx; w2 = wcnt; wcnt = 1; k = (sizsct[device])? 10 / sizsct[device] : 16; if(!(c & 01)) { cursor(60,15);putchar('F'); cursor(60,16); if(ttinr() == 033) return (-1); fl = trkform(sizsct[device],i,device, tracks[device] > 45,1); cursor(60,15);putchar('V'); cursor(60,16); for(cx = 2 ; cx >= 1; cx--) for(j = cx ; j <= k; j += 2) { fl |= sctest(j,i,device,tracks[device] > 45,1,bufer); if(fl) { wcnt = w2; return(fl); } } cursor(60,15);putchar('*'); } if(!(c & 02)) { cursor(60,16);putchar('F'); cursor(60,15); if(ttinr() == 033) return (-1); fl = trkform(sizsct[device],i,device, tracks[device] > 45,0); cursor(60,16);putchar('V'); cursor(60,15); for(cx = 2 ; cx >= 1; cx--) for(j = cx ; j <= k; j += 2) { fl |= sctest(j,i,device,tracks[device] > 45,0,bufer); if(fl) { wcnt = w2; return(fl); } } cursor(60,16);putchar('*'); } wcnt = w2; return(fl); } testrk(i) int i; { register j,k,c; int fl,w2; w2 = wcnt; wcnt = 1; k = (sizsct[device])? 10 / sizsct[device] : 16; j = sides[device]; fl= 0; if(!(j & 01)) { cursor(60,15);putchar('V'); for(c = 1 ; c <= k; c++) fl |= sctest(c,i,device,tracks[device] > 45,1,bufer); cursor(60,15);putchar('*'); } if(fl) { wcnt = w2; return(fl); } if(!(j & 02)) { cursor(60,16);putchar('V'); for(c = 1 ; c <= k; c++) fl |= sctest(c,i,device,tracks[device] > 45,0,bufer); cursor(60,16);putchar('*'); } wcnt = w2; return(fl); } /************************************************************/ .TITLE FMZ .MCALL .TTYINR, .TTYIN, .PRINT, .READW .MCALL .WRITW, .LOOKUP, .WRITE, .PURGE, .SERR, .HERR .MCALL .LOCK .CSECT TSTUKN:: JSR R5,CSV$ BIS #10100,@#44 CALL CLRBUF .PRINT #QUEST MOV #REQUES,R1 2$: .TTYIN CMPB R0,(R1)+ BNE 1$ TSTB (R1) BNE 2$ .LOCK ;********************************* ; CLR R4 ; .LOOKUP #AREA2,R4,#DBLK ; ;********************************* RETURN 1$: .PRINT 2(SP) EMT 350 TTINR:: BIS #10100,@#44 EMT 340 BCC 1$ CLR R0 1$: RTS PC .PSECT BYTES QUEST: .BYTE 33,132,200 REQUES: .BYTE 33,57,132,0 .CSECT CLRBUF:: BIS #10100,@#44 EMT 340 BCC .-2 1$: BIT #100,@#177564 BNE 1$ RETURN CHOUT:: TSTB @#177564 BPL CHOUT BIT #100,@#177564 BNE CHOUT MOVB 2(SP),@#177566 RETURN STROUT:: MOV 2(SP),R0 TST -(SP) 2$: MOVB (R0)+,(SP) BNE 1$ TST (SP)+ RETURN 1$: CALL CHOUT BR 2$ LINE:: JSR R5,CSV$ MOVB 6(R5),-(SP) ; Y MOVB 10(R5),-(SP) ; X CALL CURSOR MOVB 12(R5),R4 ; s~et~ik SUB 10(R5),R4 INC R4 MOVB 4(R5),(SP) 1$: CALL CHOUT SOB R4,1$ JMP CRET$ COLON:: JSR R5,CSV$ MOVB 10(R5),-(SP) ; Y MOVB 6(R5),-(SP) ; X CALL CURSOR MOVB 12(R5),R4 ; s~et~ik SUB 10(R5),R4 INC R4 MOVB 4(R5),(SP) 1$: CALL CHOUT .PRINT #STEP SOB R4,1$ JMP CRET$ .PSECT BYTES STEP: .BYTE 33,104,33,102,200 .ASECT .=44 .WORD 1000 .CSECT LOAD:: JSR R5,CSV$ MOV $$END,R1 .READW #AREA2,#17,R1,#400,#0 BCS IOERR ADD #300,R1 MOV 4(5),R4 ; *MAS MOV 6(5),R2 ; n# MOV (R1)+,(R4)+ SOB R2,.-2 RETURN SAVE:: JSR R5,CSV$ MOV 4(5),R4 ; *MAS MOV 6(5),R2 ; n# MOV $$END,R1 MOV R1,R3 .READW #AREA2,#17,R1,#400,#0 BCS IOERR ADD #300,R1 CMP PASWORD,24.(R1) BNE IOERR MOV (R4)+,(R1)+ SOB R2,.-2 .WRITW #AREA2,#17,R3,#400,#0 BCS IOERR RETURN IOERR: CLR R0 RETURN .PSECT BYTES MPFORM: .BYTE 0,30 TYPDEV: .BYTE 0 DEVSID: .BYTE 0 TRACK: .BYTE 0 TYPSCT: .BYTE 0 CODE:: .RAD50 /FMZ/ MPTEST: .BYTE 0,10 TDEV: .BYTE 0 SDEV: .BYTE 0 TRK: .BYTE 0 SCT: .BYTE 0 ADDR: .WORD 0 WCNT:: .WORD 10 * 01000 / 2 .CSECT SCTEST:: CLRB MPTEST MOVB 2(SP),SCT MOVB 6(SP),SDEV TSTB 12(SP) BEQ 1$ BISB #200,SDEV 1$: MOVB 4(SP),TRK MOVB 10(SP),TDEV INCB TDEV MOV #MPTEST,R0 MOV 14(SP),ADDR CALL OUTMP RETURN TRKFOR:: CLRB MPFORM MOVB 2(SP),TYPSCT INCB TYPSCT MOVB 6(SP),DEVSID TSTB 12(SP) BEQ 1$ BISB #200,DEVSID 1$: MOVB 4(SP),TRACK MOVB 10(SP),TYPDEV INCB TYPDEV MOV #MPFORM,R0 CALL OUTMP RETURN OUTMP:: MOV R0,R1 TSTB @#176674 BPL .-4 MOVB R0,@#176676 SWAB R0 TSTB @#176674 BPL .-4 MOVB R0,@#176676 MOVB #377,R0 TSTB @#176674 BPL .-4 MOVB R0,@#176676 TSTB @#176674 BPL .-4 MOVB R0,@#176676 MOVB (R1),R0 RETURN INIT:: JSR R5,CSV$ .SERR MOV MZ,DBLK ADD 4(R5),DBLK MOV 6(R5),SIZE ; BLOCKS ON THE VOLUME SUB #12.,SIZE .LOOKUP #AREA2,#0,#DBLK BCS ERROR MOV BUFER,R4 JSR R3,COPY .WORD 0 ;ADRESS .WORD 3 ;WCNT .WORD 0,170000,7777 JSR R3,COPY .WORD 700 .WORD 1 .WORD 177777 JSR R3,COPY .WORD 210 .WORD 11. .WORD 1,0,14,1000,54137,23364,136642,3065 .WORD 0,7123,4000 JSR R3,COPY .WORD 722 .WORD 21. .WORD 1,6,107123 .ASCII "MZ: Diskette" .ASCII "<---------->" .ASCII "FMZ V01.00 " .WRITE #AREA2,#0,R4,#400,#1 BCS ERROR .WRITE #AREA2,#0,#DIR,#15.,#6. BCS ERROR .WRITW #AREA2,#0,#BOOT,#</2>,#0. BCS ERROR E: .PURGE #0 .HERR RTS PC ERROR: CLR R0 BR E COPY: MOV R4,R0 ADD (R3)+,R0 ; ADDR MOV (R3)+,R1 ; WCNT MOV (R3)+,(R0)+ SOB R1,.-2 RTS R3 MZ: .RAD50 "MZ0" DBLK: .RAD50 " " .WORD 0,0,0 DIR: .WORD 3,0,1,0,14,1000 .RAD50 "NEWFIL MZ" SIZE: .WORD 0,0,7123,4000 BOOT: NOP RESET JSR R2,PUT .BYTE 33,'H,33,'J,33,'Y,53,65,16 .ASCIZ "w \TOM DISKE NET ZAGRUZ^IKA ! "<17> PUT: TSTB @#177564 BPL PUT MOVB (R2)+,@#177566 BNE PUT STOP: TSTB @#177560 BPL STOP CLR STOP JSR R2,PUT .BYTE 33,'H,33,'J,0 .EVEN EBOT: .END