program MGTODX(output); (* KOPIROVANI SOUBORU Z KAZETY VE FORMATU BASIC NA DISKETU. SOUBOR NA DISKETE JE BEZNY TEXTOVY NAHRADNIM JMENEM JE MLOAD.BAS NA AKTIVNI DISKETE. KOPIROVANI PROBIHA VE DVOU FAZICH: 1. CTENI Z KAZETY DO PAMETI 2. ZAPIS Z PAMETI NA DISKETU *) origin BUF=80H, (* BUFFER DISKETY *) FILENAME=5DH, (* JMENO A TYP SOUBORU *) FILETYP=65H, BREAK=39H, (* ADRESA PRO BREAK *) MEM=8000H; label 99,999; const BDOS=5; FDT=5CH; DEL=13H; (* MANIPULACE SE SOUBOREM *) MAKE=16H; WRI=15H; CLS=10H; CR=0DH; LF=0AH; ctrlz=1ah; ESC=1BH; OCW1=9FH; (* POVOLENO BREAK A TIMER *) P591=89H; (* RIZENI 8259 *) MGRI=0F51FH; (* RUTINY MONITORU *) STARM=0F71BH; BELX=0F973H; TYPE MEMP=^integer; external var BUF:array [0..127] of byte; FILENAME:packed array [1..8] of char; FILETYP:packed array [1..3] of char; BREAK:MEMP; var DXADR,I:byte; SPSAVE:MEMP; MEMPNTR:INTEGER; PNTR,MEMSTOP,MEMSTART:memp; dynamic procedure INIT; label 9; var A:array[1..100] of integer; (* REZERVA PRO ZASOBNIK *) I:byte; begin writeln(chr(1fh), '(c) VS FEL CVUT BIM 260988??'); writeln; writeln; writeln('Kopirovani z kazety na disketu'); writeln(' Format BASIC'); writeln; if FILENAME=' ' then FILENAME:='MLOAD'; (* IMPLICITNI JMENO SOUBORU *) if FILETYP=' ' then FILETYP:='BAS'; write('Vytvareny soubor: '); for I:=1 to 8 do if FILENAME[I]<>' ' then write(FILENAME[I]); writeln('.',FILETYP); inline("MVI C,DEL (* DELETE FILE *) "LXI D,FDT "CALL BDOS); inline("MVI C,MAKE (* MAKE FILE *) "LXI D,FDT "CALL BDOS "CPI 0FFH "JNZ ref(9)); write('## Adresar diskety je zaplnen'); goto 999; 9: NEW(MEMSTART); PNTR:=MEMSTART; MEMSTOP:=REF(INIT); DXADR:=0; end; procedure PUTC(B:byte); (* ZAPIS DO BUFFERU DISKETY *) label 9; begin BUF[DXADR]:=B; if DXADR<127 then DXADR:=DXADR+1 else begin DXADR:=0; inline("MVI C,WRI "LXI D,FDT "CALL BDOS "ANA A "JZ ref(9)); writeln('## Disketa je zaplnena'); inline( "MVI C,CLS (* UZAVRI SOUBOR *) "LXI D,FDT "CALL BDOS); goto 999; end; 9:; end; procedure CTIMGBLOKY; label 1; var I,J:CHAR; begin 1:inline( "CALL MGRI (* : *) "ANI 7FH "SUI LF "JNZ ref(1)); REPEAT INLINE("CALL MGRI "ANI 7FH "STA REF(I)); PNTR^ TYPE CHAR:=I; PNTR:=PNTR+1; IF PNTR=MEMSTOP THEN BEGIN (* VYCERPANI PAMETI *) WRITELN('## Program je prilis rozsahly !'); WRITELN('Cteni preruseno, priste pokracuj od tohoto'); WRITELN('mista, ale do jineho disketoveho souboru !'); goto 99; end; UNTIL i type integer=esc; end; begin (* MAIN *) INIT; inline("LXI H,0 "DAD SP "SHLD ref(SPSAVE)); writeln('*'); inline("MVI B,3 "CALL STARM); BREAK:=ref(99); CTIMGBLOKY; 99:inline("CALL BELX "LHLD ref(SPSAVE) "SPHL); writeln('*'); writeln('Zapis na disketu'); while memstart<>pntr do begin putc(memstart^ type byte); memstart:=memstart+1; end; while DXADR<>0 do PUTC(CTRLZ); inline( "MVI C,CLS (* ZAPLNENI ZBYTKU SEKTORU *) "LXI D,FDT "CALL BDOS); 999: inline("MVI A,OCW1 "OUT P591 "JMP 0); end.