home *** CD-ROM | disk | FTP | other *** search
- ; ----------------------------
- ; TEXTIO.DEM - Demoprogramm für die Routinen aus TEXTIO.LIB
- ; (für den A86)
- ;
- ; (c) Bernd Schemmer 1990 - 1992
- ; Letzter Update: 22.02.1992
- ;
- ; Übersetzen:
- ; A86 TEXTIO.DEM DEMOS.INC TO TEXTIO.COM
- ;
- ; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
- ; enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
- ; erreichbar sein.
- ;
- ; ---------------------------
-
- jmp start ; Daten überspringen
-
- logo db CR,LF
- db 'TEXTIO.DEM - Demoprogramm für die Routinen aus TEXTIO.LIB'
- db CR,LF
- db '----------------------------------------------------------'
- db CR,LF
- db 'ACHTUNG: Dieses Demo erstellt die Dateien TEST.IN und TEST.OUT'
- db CR,LF
- db ' im aktuellen Directory (bestehende Dateien werden überschrieben!)'
- db CR,LF
- db CR,LF
- db 'Bitte eine Taste drücken (ESC für Programm-Ende) ...'
- db CR,LF
- GETLENGTH logo
-
- ; ----------------------------
- ; Meldungen
- ;
- MakeMsg CreateMSG1, 'Erstelle die Datei TEST.IN'
- MakeMsg CreateMSG2, 'Erstelle die Datei TEST.OUT'
- MakeMsg WriteMSG1, 'Schreibe die Datei TEST.IN (500 Zeilen)'
- MakeMsg CloseMSG1, 'Schliesse die Datei TEST.IN'
- MakeMsg AppendMSG1, 'Verlängere die Datei TEST.IN (500 Zeilen)'
- MakeMsg OpenMSG1, 'Öffne die Datei TEST.IN zum Lesen'
- MakeMsg KonvertMSG1,'Konvertiere die Datei TEST.IN und schreibe die Datei TEST.OUT'
- MakeMsg CloseMSG2, 'Schliesse die Datei TEST.OUT'
-
- ; ----------------------------
- ; Fehlermeldungen
- ;
- MakeMsg MemoryError, CR,LF, 'Fehler: Zuwenig freier Speicher'
- MakeMsg CreateError1, CR,LF, 'Fehler beim Erstellen der Datei TEST.IN'
- MakeMsg CreateError2, CR,LF, 'Fehler beim Erstellen der Datei TEST.OUT'
- MakeMsg WriteError1, CR,LF, 'Fehler beim Schreiben der Datei TEST.IN'
- MakeMsg WriteError2, CR,LF, 'Fehler beim Schreiben der Datei TEST.OUT'
- MakeMsg ReadError1, CR,LF, 'Fehler beim Lesen der Datei TEST.IN'
- MakeMsg OpenError1, CR,LF, 'Fehler beim Öffnen der Datei TEST.IN'
- MakeMsg AppendError1, CR,LF, 'Fehler bein Verlängern der Datei TEST.IN'
- MakeMsg CloseError1, CR,LF, 'Fehler beim Schliessen der Datei TEST.IN'
- MakeMsg CloseError2, CR,LF, 'Fehler beim Schliessen der Datei TEST.OUT'
-
- ; ----------------------------
- ; Variablen
- ;
- DefString zeile,255 ; Zeile zum Lesen u. Schreiben der Datei
-
- ; Datei-Tabelle zum Bearbeiten der Datei TEST.IN
- ;
- InputBufferT dw
- dw ? ; Handle
- InputLen dw ? ; Größe des Puffers
- dw ? ; Zeiger
- dw ? ; Ende
- InputOfs dw ? ; Offset des Puffers
- InputSeg dw ? ; Segment des Puffers
- InputStat db 0FFh ; Status (0FFh = geschlossen)
- InputName db 7 ; Länge des Namens
- db 'TEST.IN' ; Name der Datei
- db 41h-7 dup 0
-
- ; Datei-Tabelle zum Schreiben einer Datei
- ;
- OutputBufferT dw
- dw ? ; Handle
- OutputLen dw ? ; Größe des Puffers
- dw ? ; Zeiger
- dw ? ; Ende
- OutputOfs dw ? ; Offset des Puffers
- OutputSeg dw ? ; Segment des Puffers
- OutputStat db 0FFh ; Status (0FFh = geschlossen)
- OutputName db 8 ; Länge des Namens
- db 'TEST.OUT' ; Name der Datei
- db 41h-8 dup 0
-
- ; ----------------------------
-
- start:
- call ShowLogoAndAsk
- ; Speicher für die Puffer allokieren
- mov bx,2000h
- mov ah,048h
- int 021h
- jnc >l1
- ; 2 Segmente kriegen wir nicht, nehmen wir was
- mov ah,048h ; wir kriegen können
- int 021h
- jc >l2
- ; min. 512 Byte pro Puffer sollten es aber schon
- ; sein
- cmp bx,(512xD*2)/16xD
- jae >l1
- l2:
- WRITE_STRING MemoryError
- mov ax,0FFh
- jmp Ende
-
- l1:
- ; Dateitabelle korrigieren
-
- shr bx,1 ; BX = Größe eines Puffers in Paragraphen
-
- mov InputSeg,ax
- add ax,bx
- mov OutputSeg,ax
-
- shl bx,1
- shl bx,1
- shl bx,1
- shl bx,1
- or bx,bx
- if z mov bx,0FFFFh
- ; BX = Größe eines Puffers in Byte
-
- mov InputOfs,0
- mov OutputOfs,0
-
- mov InputLen,bx
- mov OutputLen,bx
-
- WRITE_STRING CreateMSG1
-
- ; Testdatei erstellen
- mov bx,offset InputBufferT
- mov al,1 ; Code = Schreiben
- call CreateFileBuffered
- jnc >l1
- ; Fehler beim Erstellen
- WRITE_STRING createError1
- jmp Ende
- l1:
- WRITE_STRING WriteMSG1
-
- ; 500 Zeilen in die Datei schreiben
- mov cx,500xD
- mov bx,offset InputBufferT
- mov si,offset zeile
- l0:
- push cx
- call ErstelleZeile
- call WriteLnFileBuffered
- pop cx
-
- jc >l1
-
- push dx
- mov dl,'.' ; 'Laufzeit'-Anzeige
- mov ah,02h
- int 021h
- pop dx
-
- loop l0
-
- jmp >l2
-
- l1:
- ; Fehler beim Schreiben
- WRITE_STRING WriteError1
- jmp CloseFile1 ; Datei trotzdem schliessen!
-
- l2:
- call ShowCR_LF
- ; Datei schliessen
- WRITE_STRING CloseMSG1
-
- call CloseFileBuffered
- jnc >l1
- ; Fehler beim Schliessen der Datei
- WRITE_STRING CloseError1
- jmp Ende
- l1:
- ; Datei verlängern um 500 Zeilen
- WRITE_STRING AppendMSG1
-
- call AppendFileBuffered
- jnc >l1
- ; Fehler beim Eröffnen der Datei zum Verlängern
- WRITE_STRING AppendError1
- jmp Ende
- l1:
- ; 500 weitere Zeilen in die Datei schreiben
- WRITE_STRING WriteMSG1
-
- mov cx,500xD
- mov bx,offset InputBufferT
- mov si,offset zeile
-
- l0:
- push cx
- call ErstelleZeile
- call WritelnFileBuffered
- pop cx
-
- jc >l1
-
- push dx
- mov dl,'.' ; 'Laufzeit'-Anzeige
- mov ah,02h
- int 021h
- pop dx
-
- loop l0
- jmp >l2
-
- l1:
- ; Fehler beim Schreiben
- WRITE_STRING WriteError1
- jmp CloseFile1 ; Datei trotzdem schliessen!
- l2:
- call ShowCR_LF
- ; Datei schliessen
- WRITE_STRING CloseMSG1
-
- call CloseFileBuffered
- jnc >l1
- ; Fehler beim Schliessen der Datei
- WRITE_STRING CloseError1
- jmp Ende
- l1:
- ; Datei öffnen zum Lesen
- WRITE_STRING OpenMSG1
-
- call ResetFileBuffered
- jnc >l1
- ; Fehler beim Öffnen
- WRITE_STRING OpenError1
- jmp ende
- l1:
- ; zweite Datei erstellen
- WRITE_STRING CreateMSG2
-
- mov bx,offset OutputBufferT
- mov al,1 ; Code = Schreiben
- call CreateFileBuffered
- jnc >l1
- ; Fehler beim Erstellen der Datei
- WRITE_STRING CreateError2
- jmp CloseFile1 ; Input-Datei schliessen
-
- l1:
- WRITE_STRING KonvertMSG1
- mov si,offset Zeile
- mov di,offset Zeile
- mov cx,offset InputBufferT
- mov dx,offset OutputBufferT
-
- l00:
- mov bx,cx ; BX zeigt auf die Tabelle der Datei TEST.IN
- call ReadLnFileBuffered
- jnc >l1
- cmp ah,0FFh ; EOF ?
- je CloseFile1_2
- ; Fehler beim Lesen
- WRITE_STRING ReadError1
- jmp CloseFile1_2
- l1:
- ; Zeile bearbeiten
- call KonvertiereZeile
-
- push dx
- mov dl,'.' ; 'Laufzeit'-Anzeige
- mov ah,02h
- int 021h
- pop dx
-
- mov bx,dx ; BX zeigt auf die Datei-Tabelle von TEST.OUT
- call WritelnFileBuffered
- jnc >l1
- l10:
- WRITE_STRING WriteError2
- jmp CloseFile1_2 ; Input- und Output-Datei schliessen!
- l1:
- jmp l00 ; nächste Zeile
-
-
- CloseFile1_2:
- call ShowCR_LF
- ; Output-Datei schliessen
- WRITE_STRING CloseMSG2
-
- mov bx,offset OutputBufferT
- call CLoseFileBuffered
- jnc CloseFile1
- ; Fehler beim Schliessen
- WRITE_STRING CloseError2
-
- CloseFile1: ; Input-Datei schliessen
- WRITE_STRING CloseMSG1
-
- mov bx,offset InputBufferT
- call CLoseFileBUffered
- jnc Ende
- ; Fehler beim Schliessen
- WRITE_STRING CloseError1
- ENDE:
- EndProcess
-
- ; ----------------------------
- ; KonvertiereZeile
- ;
- ; Funktion: Ersetzt alle Zeichen mit ASCII-Codes kleiner als 32 in
- ; der Zeile durch einen Punkt
- ;
- KonvertiereZeile:
- push di,si,cx
- mov di,offset Zeile
- lodsb
- or al,al
- jz >l9 ; Zeile ist leer
- mov cl,al
- xor ch,ch ; CX = Länge der Zeile
- mov di,si
- l0:
- lodsb
- cmp al,BLANK
- if b mov al,'.'
- stosb
- loop l0
- l9:
- pop cx,si,di
- ret
-
- ; ----------------------------
- ; ErstelleZeile
- ;
- ; Funktion: Erstellt eine Zeile mit (fast) zufälligen Werten für die Datei
- ;
- ErstelleZeile:
- push di,bx,cx,dx
-
- mov di,offset zeile
- xor al,al
- mov [di],al ; Zeile erst einmal löschen
-
- xor ah,ah ; 'zufällige' Zeilenlänge ermitteln
- int 01Ah
-
- mov cl,dl
- shl cl,1
- add cl,dl
-
- xor ch,ch
- or cx,cx
- jz >l2
-
- mov [di],cl ; Stringlänge eintragen
- inc di
-
- l0:
- push cx
- xor ah,ah
- int 01Ah
-
- cmp dl,CR ; KEINE Trennzeichen zulassen!
- if e mov dl,4
- cmp dl,LF
- if e mov dl,4
- cmp dl,CTRL_Z
- if e mov dl,4
-
- mov al,dl
- stosb
- pop cx
- loop l0
- l2:
- pop dx,cx,bx,di
- ret
-
-