G10CLSE ; da - zakryt' fajl RET ; i vernut'sya v DOS BEGIN ENDP ; Otkrytie diskovogo fajla: ; ------------------------ C10OPEN PROC NEAR MOV AH,16H ;Funkciya sozdaniya fajla LEA DX,FCBREC INT 21H CMP AL,00 ;Est' mesto na diske? JNZ C20 ; net - oshibka MOV FCBRCSZ,RECLEN ;Razmer zapisi (EQU) LEA DX,NAMEDTA ;Zagruzit' adres DTA MOV AH,1AH INT 21AH RET C20: LEA DX,OPNMSG ;Soobshchenie ob oshibke CALL X10ERR RET C10OPEN ENDP ; Vvod s klaviatury: ; ----------------- D10PROC PROC NEAR MOV AH,09 ;Funkciya vyvoda na ekran LEA DX,PROMPT ;Vydat' zapros INT 21H MOV AH,0AH ;Funkciya vvoda LEA DX,NAMEPAR ;Vvesti imya fajla INT 21H CALL E10DISP ;Prokrutka na ekrane CMP NAMELEN,00 ;Imya vvedeno? JNE D20 ; da - prodolzhit', RET ; net - vyjti D20: MOV BH,00 ;Zamenit' simvol Return MOV BL,NAMELEN MOV NAMEDTA[BX],' ' ;Zapisat' probel CALL F10WRIT ;Vyzvat' ; podprogrammu zapisi CLD LEA DI,NAMEDTA ;Ochistit' MOV CX,RECLEN / 2 ; pole MOV AX,2020H ; imeni REP STOSW RET ;Vyjti D10PROC ENDP ; Prokrutka i ustanovka kursora: Assembler dlya IBM PC. Programmy. 109 ; ----------------------------- E10DISP PROC NEAR MOV AH,09 ;Funkciya vyvoda na ekran LEA DX,CRLF ;CR/LF INT 21H ;Vyzov DOS CMP ROW,18 ;Poslednyaya stroka ekrana? JAE E20 ; da - obojti, INC ROW ; net - uvelichit' stroku RET E20: MOV AX,0601H ;Prokrutka na 1 stroku CALL Q10SCR CALL Q20CURS ;Ustanovit' kursor RET E10DISP ENDP ; Zapis' na disk: ; -------------- F10WRIT PROC NEAR MOV AH,15H ;Funkciya zapisi LEA DX,FCBREC INT 21H CMP AL,00 ;Zapis' bez oshibok? JZ F20 ; da LEA DX,WRTMSG ; net - CALL X10ERR ; vydat' soobshchenie MOV NAMELEN,00 F20: RET F10WRIT ENDP ; Zakrytie diskovogo fajla: ; ------------------------ G10CLSE PROC NEAR MOV NAMEDTA,1AH ;Ustanovit' EOF CALL F10WRIT MOV AH,10H ;Funkciya zakrytiya LEA DX,FCBREC INT 21H RET G10CLSE ENDP ; Prokrutka ekrana: ; ---------------- Q10SCR PROC NEAR ;AX uzhe ustanovlen MOV BH,1EH ;Cvet zheltyj na sinem MOV CX,0000 MOV DX,184FH INT 10H ;Prokrutka RET Q10SCR ENDP ; Ustanovka kursora: ; ----------------- Q20CURS PROC NEAR MOV AH,02 MOV BH,00 MOV DL,00 Assembler dlya IBM PC. Programmy. 110 MOV DH,ROW ;Ustanovit' kursor INT 10H RET Q20CURS ENDP ; Vyvod soobshcheniya ob oshibke na diske: ; ---------------------------------- X10ERR PROC NEAR MOV AH,09 ;DX soderzhit INT 21H ; adres soobshcheniya MOV ERRCDE,01 ;Ustanovit' kod oshibki RET X10ERR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 111 TITLE FCBREAD (EXE) CHtenie zapisej sozdannyh v CREATDSK ; ------------------------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 80 DUP(?) STACKSG ENDS ;-------------------------------------------------------- DATASG SEGMENT PARA 'Data' FCBREC LABEL BYTE ;FCB dlya fajla FCBDRIV DB 04 ; diskovod D FCBNAME DB 'NAMEFILE' ; imya fajla FCBEXT DB 'DAT' ; tip fajla FCBBLK DW 0000 ; nomer tekushchego bloka FCBRCSZ DW 0000 ; dlina logicheskoj zapisi DD ? ; razmer fajla (DOS) DW ? ; data (DOS) DT ? ; zarezervirovano (DOS) FCBSQRC DB 00 ; tekushchij nomer zapisi DD ? ; otnositel'nyj nomer RECLEN EQU 32 ;Dlina zapisi NAMEFLD DB RECLEN DUP(' '), 13, 10, '$' ENDCDE DB 00 OPENMSG DB '*** Open error ***', '$' READMSG DB '*** Read error ***', '$' ROW DB 00 DATASG ENDS ;-------------------------------------------------------- CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX MOV AX,0600H CALL Q10SCR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor CALL E10OPEN ;Otkryt' fajl, ; ustanovit' DTA CMP ENDCDE,00 ;Otkrytie bez oshibok? JNZ A90 ; net - zavershit' A20LOOP: CALL F10READ ;Prochitat' zapis' CMP ENDCDE,00 ;CHtenie bez oshibok? JNZ A90 ; net - vyjti CALL G10DISP ;Vydat' imya na ekran JMP A20LOOP ;Prodolzhit' A90: RET ;Zavershit' BEGIN ENDP Assembler dlya IBM PC. Programmy. 112 ; Otkrytie fajla na diske: ; ----------------------- E10OPEN PROC NEAR LEA X,FCBREC MOV AH,0FH ;Funkciya otkrytiya INT 21H CMP AL,00 ;Fajl najden? JNZ E20 ; net - oshibka MOV FCBRCSZ,RECLEN ;Dlina zapisi (EQU) MOV AH,1AH LEA DX,NAMEFLD ;Adres DTA INT 21H RET E20: MOV ENDCDE,01 ;Soobshchenie ob oshibke LEA DX,OPENMSG CALL X10ERROR RET E10OPEN ENDP ; CHtenie diskovoj zapisi: ; ---------------------- F10READ PROC NEAR MOV AH,14H ;Funkciya chteniya LEA DX,FCBREC INT 21H CMP NAMEFLD,1AH ;Schitan marker EOF? JNE F20 ; net MOV ENDCDE,01 ; da JMP F90 F20: CMP AL,00 ;CHtenie bez oshibok? JZ F90 ; da - vyjti MOV ENDCDE,01 ;Net: CMP AL,01 ;Konec fajla? JZ F90 ; da - vyjti, LEA DX,READMSG ; net - znachit CALL X10ERR ; oshibka chteniya F90: RET F10READ ENDP ; Vyvod zapisi na ekran: ; --------------------- G10DISP PROC NEAR MOV AH,09 ;Funkciya vyvoda na ekran LEA DX,NAMEFLD INT 21H CMP ROW,20 ;Poslednyaya stroka ekrana? JAE G30 ; net - INC ROW ; da - uvelichit' stroku JMP G90 G30: MOV AX,0601H Assembler dlya IBM PC. Programmy. 113 CALL Q10SCR ; prokrutit' CALL Q20CURS ; ustanovit' kursor G90: RET G10DISP ENDP ; Prokrutka (skrolling) ekrana: ; ---------------------------- Q10SCR PROC NEAR ;AX uzhe ustanovlen MOV BH,1EH ;Ustanovit' cvet MOV CX,0000 MOV DX,184FH ;Funkciya prokrutki INT 10H RET Q1OSCR ENDP ; Ustanovka kursora: ; ----------------- Q20CURS PROC NEAR MOV AH,02 MOV BH,00 MOV DH,ROW MOV DL,00 INT 10H RET Q20CURS ENDP ; Vyvod soobshcheniya ob oshibke na diske: ; ---------------------------------- X10ERR PROC NEAR MOV AH,09 ;DX soderzhit adres INT 21H ; soobshcheniya RET X10ERR ENDP CODESG ENDS END BEGIN page 60,132 TITLE RANREAD (COM) Pryamoe chtenie zapisej, ; sozdannyh v FCBCREAT CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H BEGIN: JMP MAIN ;----------------------------------------------------- FCBREC LABEL BYTE ;FCB dlya diskovogo fajla FCBDRIV DB 04 ; diskovod D FCBNAME DB 'MAMEFILE' ; imya fajla FCBEXT DB 'DAT' ; tip fajla FCBBLK DW 0000 ; nomer tekushchego bloka FCBRCSZ DW 0000 ; dlina logicheskoj zapisi DD ? ; razmer fajla (DOS) DW ? ; data (DOS) DT ? ; zarezervirovano (DOS) Assembler dlya IBM PC. Programmy. 114 DB 00 ; nomer tekushchej zapisi FCBRNRC DD 000000000 ; otnositel'nyj nomer RECLEN EQU 32 ;Dlina zapisi RECDPAR LABEL BYTE ;Spisok parametrov: MAXLEN DB 3 ; ACTLEN DB ? ; RECDNO DB 3 DUP(' ') ; NAMEFLD DB RECLEN DUP(' '),13,10,'$' ;DTA OPENMSG DB '*** Open error ***',13,10,'$' READMSG DB '*** Read error ***',13,10,'$' COL DB 00 PROMPT DB 'Record number? $' ROW DB 00 ENDCDE DB 00 ;----------------------------------------------------- MAIN PROC NEAR CALL Q10CLR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor CALL C10OPEN ;Otkryt' fajl, ; ustanovit' DTA CMP ENDCDE,00 ;Otkrytie bez oshibok? JZ A20LOOP ; da - prodolzhit', RET ; net - zavershit' A20LOOP: CALL D10RECN ;Poluchit' nomer zapisi CMP ACTLEN,00 ;Est' zapros? JE A40 ; net - vyjti CALL F10READ ;CHtenie (pryamoj dostup) CMP ENDCDE,00 ;Est' oshibki chteniya? JNZ A30 ; da - obojti CALL G10DISP ;Vyvesti na ekran A30: JMP A20LOOP A40: RET ;Zavershit' programmu MAIN ENDP ; Podprogramma otkrytiya fajla na diske: ; ------------------------------------ C10OPEN PROC NEAR MOV AH,0FH ;Funkciya otkrytiya LEA DX,FCBREC INT 21H CMP AL,00 ;Otkrytie normal'noe? JNZ C20 ; net - oshibka MOV FCBRCSZ,RECLEN ;Dlina zapisi (EQU) MOV AH,1AH LEA DX,NAMEFLD ;Ustanovit' adres DTA INT 21H RET C20: LEA DX,OPENMSG Assembler dlya IBM PC. Programmy. 115 CALL X10ERR RET C10OPEN ENDP ; Vvod s klaviatury nomera zapisi: ; ------------------------------- D10RECN PROC NEAR MOV AH,09H ;Funkciya vyvoda na ekran LEA DX,PROMPT INT 21H MOV AH,0AH ;Funkciya vvoda s klaviatury LEA DX,RECDPAR INT 21H CMP ACTLEN,01 ;Proverit' dlinu (0,1,2) JB D40 ;Dlina 0, zavershit' JA D20 SUB AH,AH ;Dlina 1 MOV AL,RECDNO JMP D30 D20: MOV AH,RECDNO ;Dlina 2 MOV AL,RECDNO+1 D30: AND AX,0F0FH ;Udalit' ASCII trojki AAD Preobrazovat' v dvoichnoe MOV WORD PTR FCBRNRC,AX D40: MOV COL,20 CALL Q20CURS ;Ustanovit' kursor RET D10RECN ENDP ; CHtenie diskovoj zapisi: ; ---------------------- F10READ PROC NEAR MOV ENDCDE,00 ;Ochistit' kod zaversheniya MOV AH,21H ;Funkciya pryamogo chteniya LEA DX,FCBREC INT 21H CMP AL,00 ;CHtenie bez oshibok? JZ F20 ; da - vyjti LEA DX,READMSG ; net - vydat' CALL X10ERR ; soobshchenie ob oshibke F20: RET F10READ ENDP ; Vyvod imeni na ekran: ; -------------------- G10DISP PROC NEAR MOV AH,09 ;Funkciya vyvoda na ekran LEA DX,NAMEFLD INC 21H INC ROW MOV COL,00 RET G10DISP ENDP Assembler dlya IBM PC. Programmy. 116 ; Ochistka ekrana: ; -------------- Q10CLR PROC NEAR MOV AX,0600H ;Funkciya prokrutki MOV BH,41H ;Cvet (07 dlya ch/b) MOV CX,0000 MOV DX,184FH INT 10H RET Q10CLR ENDP ; Ustanovka kursora: ; ----------------- Q20CURS PROC NEAR MOV AH,02 ;Funkciya ustanovki MOV BH,00 ; kursora MOV DH,ROW MOV DL,COL INT 10H RET Q20CURS ENDP ; Vyvod soobshcheniya ob oshibke na diske: ; ---------------------------------- X10ERR PROC NEAR MOV AH,09 ;DX soderzhit adres INT 21H ; soobshcheniya INC ROW MOV ENDCDE,01 RET X10ERR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 117 TITLE RANBLOK (COM) Pryamoe blochnoe chtenie fajla CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H BEGIN: JMP MAIN ;---------------------------------------------------- FCBREC LABEL BYTE ;FCB dlya diskovogo fajla FCBDRIV DB 04 ; diskovod D FCBNAME DB 'NAMEFILE' ; imya fajla FCBEXT DB 'DAT' ; tip fajla FCBBLK DW 0000 ; nomer tekushchego bloka FCBRCSZ DW 0000 ; logicheskaya dlina zapisi FCBFLZ DD ? ; DOS razmer fajla DW ? ; DOS data DT ? ; DOS zarezervirovano DB 00 ; nomer tekushchej zapisi FCBRNRC DD 00000000 ; otnositel'nyj nomer DSKRECS DB 1024 DUP(?),'$' ;DTA dlya bloka zapisej ENDCODE DB 00 NORECS DW 25 ;CHislo zapisej OPENMSG DB '*** Open error ***',13,10,'$' READMSG DB '*** Open error ***',13,10,'$' ROWCTR DB 00 ; --------------------------------------------------- MAIN PROC NEAR CALL Q10CLR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor CALL E10OPEN ;Otkryt' fajl, ; ustanovit' DTA CMP ENDCODE,00 ;Uspeshnoe otkrytie? JNZ A30 ; net - vyjti CALL F10READ ;CHitat' zapisi CALL G10DISP ;Vyvod bloka na ekran A30: RET ;Zavershit' programmu MAIN ENDP ; Otkryt' diskovyj fajl: ; --------------------- E10OPEN PROC NEAR MOV AH,0FH ;Funkciya otkrytiya fajla LEA DX,FCBREC INT 21H CMP AL,00 ;Uspeshnoe otkrytie? JNZ A30 ; net - oshibka MOV FCBRCSZ,0020H ;Razmer zapisi MOV AH,1AH LEA DX,DSKRECS ;Ustanovit' adres DTA INT 21H RET E20: Assembler dlya IBM PC. Programmy. 118 LEA DX,OPENMSG ;Oshibka otkrytiya fajla CALL X10ERR RET E10OPEN ENDP ; CHtenie bloka: ; ------------ F10READ PROC NEAR MOV AH,27H ;Pryamoe chtenie bloka MOV CX,NORECS ;CHislo zapisej LEA DX,FCBREC INT 21H MOV ENDCODE,AL ;Sohranit' kod vozvrata RET F10READ ENDP ; Vyvod bloka na ekran: ; -------------------- G10DISP PROC NEAR MOV AH,09 ;Funkciya vyvoda na ekran LEA DX,DSKRECS INT 21H RET G10DISP ENDP ; Podprogramma ochistki ekrana: Q10CLR PROC NEAR MOV AX,0600H ;Funkciya skrol MOV BH,41H ;Cvet (07 dlya ch/b) MOV CX,0000 MOV DX,184FH INT 10H RET Q10CLR ENDP ; Podprogramma ustanovki kursora: ; ------------------------------ Q20CURS PROC NEAR MOV AH,02 ;Funkciya ustanovki kursora MOV BH,00 MOV DH,ROWCTR MOV DL,00 INT 10H INC ROWCTR RET Q20CURS ENDP ; Podprogramma soobshcheniya ob oshibke diska: ; -------------------------------------- X10ERR PROC NEAR MOV AH,09 ;DX soderzhit adres INT 21H ; soobshcheniya MOV ENDCODE,01 RET X10ERR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 119 TITLE SELDEL (COM) Vyborochnoe udalenie fajlov ; Predpolagaetsya tekushchij diskovod; ; Primery parametrov: *.*, *.BAK, i t.d. CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN JMP MAIN ; ---------------------------------------------------------- TAB EQU 09 LF EQU 10 CR EQU 13 CRLF DB CR,LF,'$' DELMSG DB TAB,'Erase','$' ENDMSG DB CR,LF,'No more directory entries',CR,LF,'$' ERRMSG DB 'Write protected disk','$' PROMPT DB 'y = Erase, N = Keep, Ret = Exit',CR,LF,'$' ; ---------------------------------------------------------- MAIN PROC NEAR ;Glavnaya procedura MOV AH,11H ;Najti pervyj element CALL D10DISK CMP AL,0FFH ;Esli net elementov, JE A90 ; to vyjti LEA DX,PROMPT ;Tekst zaprosa CALL B10DISP A20: LEA DX,DELMSG ;Vydat' soobshchenie CALL B10DISP ; ob udalenii fajla MOV CX,11 ;11 simvolov MOV SI,81H ;Nachalo imeni fajla A30: MOV DL,[SI] ;Tekushchij simvol CALL C10CHAR ; dlya vyvoda na ekran INC SI ;Sleduyushchij simvol LOOP A30 MOV DL,'?' CALL C10CHAR MOV AH,01 ;Poluchit' odnosimvol'nyj INT 21H ; otvet CMP AL,ODH ;Simvol Return? JE A90 ; da - vyjti OR AL,00100000B ;Perekodirovat' ; v propisnuyu bukvu CMP AL,'y' ;Zaprosheno udalenie? JNE A50 ; net - obojti, MOV AH,13H ; da - udalit' fajl MOV DX,80H INT 21H CMP AL,0 ;Uspeshnoe udalenie? JZ A50 ; da - obojti LEA DX,ERRMSG ; net - vydat' CALL B10DISP ; preduprezhdenie JMP A90 Assembler dlya IBM PC. Programmy. 120 A50: LEA DX,CRLF ;Perevesti stroku na ekrane CALL B10DISP MOV AH,12H CALL B10DISK ;Poluchit' sleduyushchij element CMP AL,0FFH ;Est' eshche? JNE A20 ; da - povtorit' A90: RET ;Vyhod v DOS MAIN ENDP ; Vyvod stroki na ekran; ; --------------------- B10DISP PROC NEAR ;v DX nahoditsya adres MOV AH,09 ; stroki INT 21H RET B10DISP ENDP ; Vyvod simvola na ekran; ; ---------------------- C10CHAR PROC NEAR ;v DL nahoditsya simvol MOV AH,02 INT 21H RET C10CHAR ENDP ; CHtenie elementa kataloga: ; ------------------------ D10DISK PROC NEAR MOV DX,5CH ;Ustanovit' FCB INT 21H CMP AL,0FFH ;Est' eshche elementy? JNE D90 PUSH AX ;Sohranit' AL LEA DX,ENDMSG CALL B10DISP POP AX ;Vosstanovit' AL D90: RET D10DISK ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 121 page 60,132 TTILE HANCREAT (EXE) Sozdanie fajla na diske ; ----------------------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 80 DUP(?) STACKSG ENDS ; ----------------------------------------------------- DATASG SEGMENT PARA 'Data' NAMEPAR LABEL BYTE ;Spisok parametrov: MAXLEN DB 30 ; NAMELEN DB ? ; NAMEREC DB 30 DUP(' '), 0DH, 0AH ; vvedennoe imya, ; CR/LF dlya zapisi ERRCDE DB 00 HANDLE DW ? PATHNAM DB 'D:\NAMEFILE.DAT',0 PROMPT DB 'Name? ' ROW DB 01 OPNMSG DB '*** Open error ***', 0DH, 0AH WRTMSG DB '*** Write error ***', 0DH, 0AH DATASG ENDS ; ------------------------------------------------------- CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX MOV AX,0600H CALL Q10SCR ;Ochistka ekrana CALL Q20CURS ;Ustanovka kursora CALL C10CREA ;Sozdanie fajla, ; ustanovka DTA CMP ERRCDE,00 ;Oshibka pri sozdanii? JZ A20LOOP ; da - prodolzhit', RET ; net - vernut'sya v DOS A20LOOP: CALL D10PROC CMP NAMELEN,00 ;Konec vvoda? JNE A20LOOP ; net - prodolzhit', CALL G10CLSE ; da - zakryt' fajl RET ; i vyjti v DOS BEGIN ENDP ; Sozdanie fajla na diske: ; ----------------------- C10CREA PROC NEAR MOV AH,3CH ;Funkciya sozdaniya fajla MOV CX,00 ;Normal'nyj atribut LEA CX,PATHNAM Assembler dlya IBM PC. Programmy. 122 INT 21H JC C20 ;Est' oshibka? MOV HANDLE,AX ; net - zapomnit' nomer, RET C20: ; da - LEA DX,OPNMSG ; vydat' soobshchenie CALL X10ERR ; ob oshibke RET C10CREA ENDP ; Vvod s klaviatury: ; ----------------- D10PROC PROC NEAR MOV AH,40H ;Funkciya vyvoda na ekran MOV BX,01 ;Nomer (Handle) MOV CX,06 ;Dlina teksta zaprosa LEA DX,PROMPT ;Vydat' zapros INT 21H MOV AH,0AH ;Funkciya vvoda s klaviatury LEA DX,NAMEPAR ;Spisok parametrov INT 21H CMP NAMELEN,00 ;Imya vvedeno? JNE D20 ; da - obojti RET ; net - vyjti D20: MOV AL,20H ;Probel dlya zapolneniya SUB CH,CH MOV CL,NAMELEN ;Dlina LEA DI,NAMEREC ; ADD DI,CX ;Adres + dlina NEG CX ;Vychislit' ADD CX,30 ; ostavshuyusya dlinu REP STOSB ;Zapolnit' probelom D90: CALL F10WRIT ;Zapis' na disk CALL E10SCRL ;Proverka na skroling RET D10PROC ENDP ; Proverka na skroling: ; -------------------- E10SCRL PROC NEAR CMP ROW,18 ;Poslednyaya stroka ekrana JAE E10 ; da - obojti, INC ROW ; net - uvelichit' stroku JMP E10 E10: MOV AX,0601H ;Prodvinut' na odnu stroku CALL Q10SCR E90: CALL Q20CURS ;Ustanovka kursora RET E10SCRL ENDP ; Zapis' na disk: ; -------------- Assembler dlya IBM PC. Programmy. 123 F10WRIT PROC NEAR MOV AH,40H ;Funkciya zapisi na disk MOV BX,HANDLE MOV CX,32 ;30 dlya imeni + 2 dlya CR/LF LEA DX,NAMEREC INT 21H JNC F20 ;Oshibka zapisi? LEA DX,WRTMSG ; da - CALL X10ERR ; vydat' preduprezhdenie MOV NAMELEN,00 F20: RET F10WRIT ENDP ; Zakrytie fajla na diske: ; ----------------------- G10CLSE PROC NEAR MOV NAMEREC,1AH ;Marker konca zapisi (EOF) CALL F10WRIT MOV AH,3EH ;Funkciya zakrytiya MOV BX,HANDLE INT 21H RET G10CLSE ENDP ; Prokrutka (skrolling) ekrana: ; ---------------------------- Q10SCR PROC NEAR ;v AX - adres elementa MOV BH,1EH ;Cvet - zheltyj na sinem MOV CX,0000 MOV DX,184FH INT 10H ;Skrolling RET Q10SCR ENDP ; Ustanovka kursora: ; ----------------- Q20CURS PROC NEAR MOV AH,02 MOV BH,00 MOV DH,ROW ;Ustanovit' kursor MOV DL,00 INT 10H RET Q20CURS ENDP ; Vyvod soobshcheniya ob oshibke: ; ------------------------- X10ERR PROC NEAR ;DX soderzhit MOV AH,40H ; adres soobshcheniya MOV BX,01 MOV CX,21 ;Dlina soobshcheniya INT 21H MOV ERRCDE,01 ;Ustanovit' kod oshibki RET X10ERR ENDP Assembler dlya IBM PC. Programmy. 124 CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 125 page 60,132 TITLE HANREAD (EXE) CHtenie zapisej, sozdannyh v HANCREAT ; ----------------------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 80 DUP(?) STACKSG ENDS ; ----------------------------------------------------- DATASG SEGMENT PARA 'Data' ENDCDE DB 00 HANDLE DW ? IOAREA DB 32 DUP(' ') PATHNAM DB 'D:\NAMEFILE.SRT',0 OPENMSG DB '*** Open error ***', 0DH, 0AH READMSG DB '*** Read error ***', 0DH, 0AH ROW DB 00 DATASG ENDS ; ------------------------------------------------------ CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG PUSH DS SUB AX,AX PUSH AX MOV AX,DATASG MOV DS,AX MOV ES,AX MOV AX,0600H CALL Q10SCR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor CALL E100PEN ;Otkryt' fajl, ; ; ustanovit' DTA CMP ENDCDE,00 ;Oshibka otkrytiya? JNZ A90 ; da - zavershit' programmu A20LOOP: CALL F10READ ;CHtenie zapisi s diska CMP ENDCDE,00 ;Oshibka chteniya? JNZ A90 ; da - vyjti, CALL G10DISP ; net - vydat' imya, JMP A20LOOP ; i prodolzhit' A90: RET BEGIN ENDP ; Otkrytie fajla: ; -------------- E100PEN PROC NEAR MOV AH,3DH ;Funkciya otkrytiya MOV CX,00 ;Normal'nye atributy LEA DX,PATHNAM INT 21H JC E20 ;Oshibka otkrytiya? MOV HANDLE,AX ; net - sohranit' RET ; fajlovyj nomer E20: Assembler dlya IBM PC. Programmy. 126 MOV ENDCDE,01 ; da - vydat' LEA DX,OPENMSG ; soobshchenie ob oshibke CALL X10ERR RET E100PEN ENDP ; CHtenie diskovoj zapisi: ; ---------------------- F10READ PROC NEAR MOV AX,3FH ;Funkciya chteniya MOV BX,HANDLE MOV CX,32 ;30 dlya imeni, 2 dlya CR/LF LEA DX,IOAREA INT 21H JC F20 ;Oshibka pri chtenii? CMP AX,00 ;Konec fajla? JE F30 CMP IOAREA,1AH ;Marker konca fajla (EOF)? JE F30 ; da - vyjti RET F20: LEA DX,READMSG ; net - vydat' CALL X10ERR ; soobshchenie ob oshibke F30: MOV ENDCDE,01 ;Kod zaversheniya F90: RET F10READ ENDP ; Vyvod imeni na ekran: ; -------------------- G10DISP PROC NEAR MOV AH,40H ;Funkciya vyvoda na ekran MOV BX,01 ;Ustanovit' nomer MOV CX,32 ; i dlinu LEA DX,IOAREA INT 21H CMP ROW,20 ;Poslednyaya stroka ekrana? JEA G90 ; da - obojti INC ROW RET G90: MOV AX,0601H CALL Q10SCR ;Prokrutka (skrolling) CALL Q20CURS ;Ustanovit' kursor RET G10DISP ENDP ; Prokrutka (skrolling) ekrana: ; ---------------------------- Q10SCR PROC NEAR ;v AX - adres elementa MOV BH,1EH ;Ustanovit' cvet MOV CX,0000 MOV DXX,184FH ;Funkciya prokrutki INT 10H RET Q10SCR ENDP Assembler dlya IBM PC. Programmy. 127 ; Ustanovka kursora: ; ----------------- Q20CURS PROC NEAR MOV AH,02 ;Funkciya ustanovki kursora MOV BH,00 ; kursor MOV DH,ROW ; stroka MOV DL,00 ; stolbec INT 10H RET Q20CURS ENDP ; Vyvod soobshcheniya ob oshibke: ; ------------------------- X10ERR PROC NEAR MOV AH,40H ;v DX - adres soobshcheniya MOV BX,01 ;Nomer MOV CX,20 ;Dlina soobshcheniya INT 21H RET X10ERR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 128 page 60,132 TITLE ASCREAD (COM) CHtenie ASCII fajla CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H BEGIN: JMP MAIN ; ------------------------------------------------- SECTOR DB 512 DUP(' ') ;Oblast' vvoda DISAREA DB 120 DUP(' ') ;Oblast' vyvoda na ekran ENDCDE DW 00 HANDLE DW 0 OPENMSG DB '*** Open error ***' PATHNAM DB 'D:\HANREAD.ASM', 0 ROW DB 00 ; ------------------------------------------------- MAIN PROC NEAR ;Osnovnaya programmya MOV AX,0600H CALL Q10SCR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor CALL E10OPEN ;Otkryt' fajl, ; ustanovit' DTA CMP ENDCDE,00 ;Oshibka pri otkrytii? JNE A90 ; da - vyjti, A20LOOP: ; net - prodolzhit' CALL R10READ ;CHtenie pervogo sektora CMP ENDCDE,00 ;Konec fajla, net dannyh? JE A90 ; da - vyjti CALL G10XPER ;Vydat' na ekran A90: RET ;Zavershit' programmu MAIN ENDP ; Otkryt' fajl na diske: ; --------------------- E10OPEN PROC NEAR MOV AH,3DH ;Funkciya otkrytiya MOV AL,00 ;Tol'ko chtenie LEA DX,PATHNAM INT 21H JNC E20 ;Proverit' flag CF CALL X10ERR ; oshibka, esli ustanovlen RET E20: MOV HANDLE,AX ;Zapomniit' nomer fajla RET E10OPEN ENDP ; Postrochnyj vyvod dannyh na ekran: ; -------------------------------- G10XPER PROC NEAR CLD ;Napravlenie sleva-napravo LEA SI,SECTOR G20: LEA DI,DISAREA G30: Assembler dlya IBM PC. Programmy. 129 LEA DX,SECTOR+512 CMP SI,DX ;Konec sektora? JNE G40 ; net - obojti, CALL R10READ ; da - chitat' sleduyushchij CMP ENDCDE,00 ;Konec fajla? JE G80 ; da - vyjti LEA SI,SECTOR G40: LEA DX,DISAREA+80 CMP DI,DX ;Konec DISAREA? JB G50 ; net - obojti, MOV [DI],0D0AH ; da - ustanovit' CR/LF CALL H10DISP ; i vydat' na ekran LEA DI,DISAREA G50: LODSB ;Zagruzit' [SI] v AL ; i uvelichit' SI STOSB ;Zapisat' AL v [DI] ; i uvelichit' DI CMP AL,1AH ;Konec fajla? JE G80 ; da - vyjti CMP AL,0AH ;Konec stroki? JNE G30 ; net - povtorit' cikl, CALL H10DISP ; da - vyvesti na ekran JMP G20 G80: CALL H10DISP ;Vyvesti poslednyuyu stroku G90: RET G10XPER ENDP ; Vyvod stroki na ekran: ; --------------------- H10DISP PROC NEAR MOV AH,40H ;Funkciya vyvoda na ekran MOV BX,01 ;Nomer (Handle) LEA CX,DISAREA ;Vychislit' NEG CX ; dlinu ADD CX,DI ; stroki LEA DX,DISAREA INT 21H CMP ROW,22 ;Poslednyaya stroka ekrana? JAE H20 ; net - vyjti INC ROW JMP H90 H20: MOV AX,0601H ;Prokrutka (skrolling) CALL Q10SCR CALL Q20CURS H90: RET H10DISP ENDP ; CHteni diskovogo sektora: ; ----------------------- R10READ PROC NEAR MOV AH,3FH ;Funkciya chteniya Assembler dlya IBM PC. Programmy. 130 MOV BX,HANDLE ;Ustrojstvo MOV CX,512 ;Dlina LEA DX,SECTOR ;Bufer INT 21H MOV ENDCDE,AX RET R10READ ENDP ; Prokrutka (skrolling) ekrana: ; ---------------------------- Q10SCR PROC NEAR ;v AX adres elementa MOV BH,1EH ;Ustanovit' cvet MOV CX,0000 ;Prokrutka MOV DX,184FH INT 10H RET Q10SCR ENDP ; Ustanovka kursora: ; ----------------- Q20CURS PROC NEAR MOV AH,02 ;Funkciya MOV BH,00 ; ustanovki kursora MOV DH,ROW MOV DL,00 INT 10H RET Q20CURS ENDP ; Vyvod soobshcheniya ob oshibke na diske: ; ---------------------------------- X10ERR PROC NEAR MOV AH,40H ;Funkciya vyvoda na ekran MOV BX,01 ;Nomer ustrojstva MOV CX,18 ;Dlina LEA DX,OPENMSG INT 21H MOV ENDCDE,O1 ;Indikator oshibki RET X10ERR ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 131 TITLE GETPATH (COM) Poluchit' tekushchij katalog CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,ES:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ----------------------------------------------- PATHNAM DB 65 DUP(' ') ;Imya tekushchego puti dostupa ; ----------------------------------------------- MAIN PROC NEAR MOV AH,19H ;Opredelit' tekushchij disk INT 21H ADD AL,41H ;Zamenit' shest.nomer MOV DL,AL ; na bukvu: 0=A, 1=B ... CAL B10DISP ;Vydat' nomer diskovoda, MOV DL,':' CAL B10DISP ; dvoetochie, MOV DL,'\' CAL B10DISP ; obratnuyu kosuyu MOV AH,47H ;Poluchit' tekushchij katalog MOV DL,00 LEA SI,PATHNAM INT 21H A10LOOP: CMP BYTE PTR [SI],0 ;Konec imeni puti dostupa JE A20 ; da - vyjti MOV AL,[SI] ;Vydat' na ekran MOV DL,AL ; imya puti dostupa CALL B10DISP ; pobajtno INC SI JMP A10LOOP A20: RET ;Vyhod v DOS MAIN ENDP B10DISP PROC NEAR MOV AH,02 ;v DL - adres elementa INT 21H ;Funkciya vyvoda na ekran RET B10DISP ENDP CODESG ENDS END BEGIN Assembler dlya IBM PC. Programmy. 132 TITLE BIOREAD (COM) CHtenie diskovogo sektora cherez BIOS CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG ORG 100H BEGIN JMP MAIN ; --------------------------------------------------------- RECDIN DB 512 DUP(' ') ;Oblast' vvoda ENDCDE DB 00 CURADR DW 0304H ;Nachalo (dorozhka/sektor) ENDADR DW 0501H ;Konec (dorozhka/sektor) READMSG DB '*** Read error ***$' SIDE DB 00 ; --------------------------------------------------------- MAIN PROC NEAR MOV AX,0600H ;Funkciya prokrutki ekrana A20LOOP: CALL Q10SCR ;Ochistit' ekran CALL Q20CURS ;Ustanovit' kursor CALL C10ADDR ;Opredelit' adres na diske MOV CX,CURADR MOV DX,ENDADR CMP CX,DX ;Poslednij sektor? JE A90 ; da - vyjti CALL F10READ ;Poluchit' diskovuyu zapis' CMP ENDCDE,00 ;Oshibka chteniya? JNZ A90 ; da - vyjti CALL G10DISP ;Vyvesti sektor na ekran JMP A20LOOP ;Povtorit' A90 RET ;Zavershit' programmu MAIN ENDP ; Vychislit' sleduyushchij adres na diske: ; ---------------------------------- C10ADDR PROC NEAR MOV CX,CURADR ;Poslednyaya dorozhka/sektor CMP CL,10 ;Poslednij sektor? JNE C90 ; net - vyjti CMP SIDE,00 ;Obojti, esli storona = 0 JE C20 INC CH ;Uvelichit' nomer dorozhki C20: XOR SIDE,01 ;Smenit' storonu MOV CL,01 ;Ustanovit' sektor = 1 MOV CURADR,CX C90: RET C10ADDR ENDP ; CHtenie diskovogo sektora: ; ------------------------ F10READ PROC NEAR MOV AL,01 ;CHislo sektorov MOV AH,02 ;Funkciya chteniya LEA BX,RECDIN ;Adres bufera MOV CX,CURADR ;Dorozhka/sektor Assembler dlya IBM PC. Programmy. 133 MOV DH,SIDE ;Storo