;************************** ;* File Operations Demo * ;* Read File from Harddisc* ;* 2010 H.V.Viehof * ;* Assembled with A86 * ;************************** ;________________ ; ; Stapelsegment : ;________________ stack segment stack word 'stack' dw 10 dup (?) stack ends ;_________________ ; ; Programmsegment: ;_________________ code segment public word 'prog' main: mov ax, seg Intro ; Hauptteil mov ds, ax ; Datensegment initialisieren mov dx, offset CRLF ; eine Leerzeile ausgeben mov ah, 9 int 021 mov dx, offset Intro ; Text anzeigen mov ah, 9 int 021 call GetName ; Unterprog. Dateinamen eingeben cmp al, 01b ; ist es die ESC Taste? jnz >X2 mov ax, 04c00 ; Ruecksprung zu DOS int 021 X2: mov dx, offset CRLF mov ah, 9 int 021 call OpenFile ; Unterprog. Datei oeffnen jc Fehler ; Oops, ein Fehler trat auf... call ReadFile ; Unterprog. Datei lesen und danach schliessen mov bx, offset TextBuffer ; Pufferinhalt auf Bildschirm anzeigen A1: mov dl, [bx] ; Zeichen an Position [bx] laden cmp dl, 0 je main mov ah, 2 int 021 inc bx jmp A1 Fehler: mov ax, seg Intro ; Ein Errorhandler falls Datei nicht gefunden mov ds, ax mov dx, offset Error mov ah, 9 int 021 jmp main GetName: mov ax, seg Filename ; Extrasegment initialisieren mov es, ax mov di, offset Filename X1: mov ah, 1 ; Int 021 Funktion 1: Zeichen von der Tastatur lesen int 021 and ax, 0ff ; nur das in al wird benötigt cmp al, 01b ; ist es die ESC Taste? jz ret ; sprung zum geplanten Programmende cmp al, 0d ; ist es die Enter Taste? jz JumpOut ; dann ist das hier fertig stosb ; im Namenspuffer speichern jmp X1 ; Und naechstes Zeichen holen JumpOut: mov al,0 ; Schlusszeichen setzen stosb ret OpenFile: mov ax, seg Filename mov ds, ax ; Datensegment festlegen xor al, al ; al = 0 die Datei wird nur lesend verwendet mov dx, OFFSET Filename ; dx zeigt auf den Dateinamen mov ah, 03D int 021 ; Datei oeffnen mov ds:[FileHandle], ax ; und Dateihandle sichern ret ReadFile: mov dx, OFFSET TextBuffer S1: mov bx, ds:[FileHandle] ; Handle nach BX mov cx, 512 ; Der Datenpuffer hat zwar Platz fuer 64000 Zeichen mov ah, 03F ; aber DOS/FAT16 liest nur 512 WIN/FAT33/NTFS wuerden 4096 akzeptieren int 021 ; Daten Lesen add dx, ax ; Pufferzeiger + Anzahl gelesener Bytes cmp ax, 0 jne S1 ; solange ax != 0 naechsten Datensatz lesen mov bx, dx ; Das Dateiende im Puffer ermitteln mov ds:b[bx],0 ; und mit 0 markieren CloseFile: mov ah, 03E mov bx, ds:[FileHandle] int 021 ; Datei schliessen ret code ends ;_______________ ; ; Datensegmente: ;_______________ datafix segment public word 'daten' Intro db 0a,0d db "*********************************************************************",0a,0d db "* File Read - Liest eine Datei im aktuellen Arbeitsverzeichniss *",0a,0d db "* Entgegen vieler Behauptungen in so manchem Programmiererforum *",0a,0d db "* ist auch unter Windows 5.0 / NTFS die Benutzung des int21h *",0a,0d db "* zulaessig/moeglich um z.B. Zugriff auf die Festplatte zu erhalten.*",0a,0d db "* Das wird mit diesem Programm demonstriert. *",0a,0d db "* Dateinamen eingeben - Datei lesen *",0a,0d db "* Beenden mit *",0a,0d db "* 2010 Heinz Volker Viehof *",0a,0d db "*********************************************************************",0a,0d db 0a,0d,0a,0d db "Eingabe:" CRLF db 0a,0d,024 Error db "<<< Datei nicht gefunden! >>>",0a,0d,024 datafix ends datavar segment public word 'daten' FileHandle dw ? Filename DB 128 dup(?) TextBuffer DB 64000 dup(?) datavar ends end