;************************** ;* File Operations Demo * ;* Read File from Harddisc* ;* 2010 H.V.Viehof * ;* Assembled with A86 * ;************************** ;________________ ; ; Stapelsegment : ;________________ stack segment stack word 'stack' dw 100 dup (?) stack ends ;_________________ ; ; Programmsegment: ;_________________ code segment public word 'prog' main: mov bx, offset Intro ; Text anzeigen call Message call GetName ; Unterprog. Dateinamen eingeben cmp al, 01b ; ist es die ESC Taste? jnz >X1 mov ax, 04c00 ; Ruecksprung zu DOS int 021 X1: mov bx, offset CRLF call Display call OpenFile ; Unterprog. Datei oeffnen jnc >X2 ; Oops, ein Fehler trat auf... jmp Fehler X2: call ReadFile ; Unterprog. Datei lesen und danach schliessen mov ax, seg datafix mov es, ax mov ax, seg imgdata mov ds, ax mov di, offset Bmp mov si, offset FileBuffer call zCompare jc >X3 mov bx, offset NoBmp ; Pufferinhalt auf Bildschirm anzeigen call Message mov ah, 1 int 021 jmp main X3: mov bx, offset IsBmp ; Pufferinhalt auf Bildschirm anzeigen mov w BufferPoint, si call Message mov ax, seg imgdata mov es, ax mov ax, es: [offset FileBuffer + 2] ; Dateigroesse call DezOut push ds mov bx, offset breite call Message pop ds mov ax, es: [offset FileBuffer + 18] mov ds: w Width, ax call DezOut push ds mov bx, offset hoehe call Message pop ds mov ax, es: [offset FileBuffer + 22] mov ds: w Height, ax call DezOut push ds mov bx, offset farbe call Message pop ds mov ax, es: [offset FileBuffer + 28] mov ds: w Colors, ax call DezOut push ds mov bx, offset relevant call Message pop ds mov ax, es: [offset FileBuffer + 34] mov ds: w maxbyt, ax call DezOut mov ah, 1 int 021 jmp main Message: mov ax, seg datafix mov ds, ax Display: mov dl, ds: [bx] ; Zeichen an Position [bx] laden cmp dl, 0 je >A2 mov ah, 2 int 021 inc bx jmp Display A2: ret Fehler: mov bx, offset Error ; Ein Errorhandler falls Datei nicht gefunden call Message jmp main GetName: mov ax, seg Filename ; Extrasegment initialisieren mov es, ax mov di, offset Filename X10: 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 X10 ; Und naechstes Zeichen holen JumpOut: mov al,0 ; Schlusszeichen setzen stosb ret OpenFile: mov ax, seg Filename ; Datensegment der Variablen / Hildfsspeicherzellen mov ds, ax 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 FileBuffer mov ax, seg imgdata ; Datensegment / Dateiinhalt festlegen mov ds, ax mov ax, seg datavar ; Datensegment / Dateiinhalt festlegen mov es, ax S1: mov bx, es: 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, es: FileHandle int 021 ; Datei schliessen ret DezOut: cld mov bx, 10 mov cx, 0 ; cx wird als Zaehler gebraucht X1: xor dx ,dx ; dx loeschen div bx ; dx:ax durch bx (10) teilen add dl, 030 ; dem divisionsrest 30h hinzuaddieren push dx ; auf den stapel legen inc cx ; Durchlaufzaehler erhoehen cmp ax, 0 ; ist ax schon 0? jnz X1 ; nicht? dann das ganze noch einmal... Ruecksprung nach X1 mov al, 020 ; evtl. werden Leerzeichen gebraucht X3: cmp cx, 5 ; 5 Stellen insgesammt? jz >X2 ; gut, dann kann das Ergebniss in den Ausgabepuffer push ax ; andernfalls: ein Leerzeichen davor inc cx ; Zaehler erhoehen jmp X3 ; und noch einmal... X2: pop dx ; Ok, die Zahl wird einmal rumgedreht: dx vom Stapel holen mov ah, 2 ; und dl auf Bildschirm ausgenben int 021 ; loop X2 ; schreibzeiger erhoehen bis Durchlaufzaehler = 0 mov dl, 020 ; und ein Leerzeichen int 021 ; dahinter ret ;_______________________________________ ; ; Vergleicht ds:si mit es:di ; dl = definiertes Suchendezeichen ; cx = max Suchtiefe ; Ausgabe True/False mit Carry Flag ;_______________________________________ zCompare: mov dl, 0 Compare: cld ; immer Directionflag loeschen, denn man kennt den Status vorher nicht mov bx, di ; Indexregister des Suchbegriffs ;dec cx ; max Suchtiefe in CX ;jz EOF_false ; erreicht? A2: ds: lodsb ; ein Zeichen aus dem Textpuffer holen cmp al, 0 ; ist es Null? jz EOF_false ; dann wurde schon jetzt das Dateiende erreicht, siehe unten... cmp al, es: b [bx] ; wenn nicht Vergleichen wir es mit der Speicherstelle die bx zeigt jne Compare ; ist es ungleich dann bx auf Anfang und naechstes Byte des Textes holen inc bx ; ist es gleich, dann bx + 1: zeigt auf das naechste Byte des Suchbegriffs cmp es: b [bx], 0 ; die Null zeigt Ende des Suchbegriffs, also gibt es Uebereinstimmung :-) jnz A2 ; falls (noch) nicht pruefen wir die beiden naechsten Bytes ;ds: lodsb ;cmp al, 0 ;jnz Compare stc ; Suchbegriff gefunden - darum das Carryflag setzen und ret ; zurueck EOF_false: clc ; Dateiende erreicht und Suchbegriff nicht gefunden... ret ; ohne Erfolgsmeldung zum Hauptquartier :-( code ends ;_______________ ; ; Datensegmente: ;_______________ datafix segment public word 'daten' Intro db 0a,0d db "**********************************************************************",0a,0d db "* File Info - Liest eine Bitmap Datei und wertet die Headerdaten aus *",0a,0d db "* Dateinamen eingeben - Datei lesen Beenden mit *",0a,0d db "* 2010 Heinz Volker Viehof (Dateigroesse max. 64kBytes) *",0a,0d db "**********************************************************************",0a,0d db 0a,0d,0a,0d db " Eingabe: ",0 Error db 0a, 0d, "<<< Datei nicht gefunden! >>>" CRLF db 0a,0d,0 NoBmp db " ist keine Bitmap Datei!",0 IsBmp db 0a, 0d, " ,ist Bitmap Datei, Groesse : ", 0 breite db " Bytes" db 0a, 0d, " Die Breite in Pixeln betraegt: ",0 hoehe db 0a, 0d, " Die Hoehe in Pixeln betraegt : ",0 farbe db 0a, 0d, " Die Farbtiefe betraegt (Bit) : ",0 relevant db 0a, 0d, " Die Anzahl Bilddaten betraegt: ",0 Bmp db "BM",0 datafix ends datavar segment public word 'daten' Height dw ? Width dw ? Colors dw ? maxbyt dw ? BufferPoint dw ? FileHandle dw ? Filename DB 128 dup (?) datavar ends imgdata segment public word 'daten' FileBuffer DB 0ffff dup (?) imgdata ends end