Home |
8086 Assembler:
|
Zurück zur Assemblerauswahlseite |
| Der Programmname soll auf die ursprüngliche Verwendung dieses Programmes zur Unterstützung von Stapelverarbeitungsskripten („Batch Scripts“) hinweisen.
Die Anfänge des Programms gehen auf das Jahr 1988 zurück. Das Programm beinhaltet eine Sammlung von Funktionen zur Vereinfachung von Skripten und liefert einige Informationen zur Erleichterung der Programmierung. Da das Programm in den Jahren seit 1988 häufig angepasst wurde, ist es unübersichtlich geworden. i Hier ist beschrieben, wie die Ansteuerung des betreffenden Programmteils aus dem angezeigten Menue erfolgt. |
|
![]() |
Zwei der Kommandos betreffen den Drucker LPT1, d.h. den Drucker an der ersten parallelen Druckerschnittstelle ist. Sie sollten das Testen der Auswirkungen von Steuerzeichen erleichtern und bei fehlerhafter Druckaufbereitung den Drucker neu initialisieren. Bei der heutigen Art der Druckaufbereitung über Windows und der jetzt üblichen Art des Druckeranschlusses per USB sind beide Kommandos nur für Benutzer alter Hardware von Wert. |
Im Bildschirmabdruck sind unterhalb der Menueanzeige Beispiele für die Aufrufe
batc d führt eine besondere Funktion durch, Sie ist nur für den i tragbaren PPC-Computer, einem Vorgänger des Laptops, von Interesse. |
|
![]() |
batc f veranlasst die Anzeige der 256 Möglichkeiten zur Anzeige von farbiger Schrift auf farbigem Hintergrund.
batc s zeigt den Zeichensatz an. |
![]() |
Mit batc k lässt sich ergründen, welche Codes durch Anschlagen einer Taste der Tastatur zurückgegeben werden.
batc e ermöglicht bei aktiviertem ANSI.SYS die Anzeige von farbig hervorgehobenen einzeiligen Hinweisen. Es wird nur die Escape-Sequenz am Anfang des Textes interpretiert. batc e ohne Escape-Sequenz lässt Text zur Anzeige bringen. Es gilt dann die aktuelle Farbeinstellung. batc l erzeugt eine Leerzeile auf dem Bildschirm. |
|
|
|
Die Programmauflistung ist etwas unübersichtlich. Wie oben angedeutet, habe ich das Programm etliche Male geändert! Auch sind im Programmabschnitt ab dem Merkmal „more:“ einige Codeoptimierungen noch nicht durchgeführt. Nach Austesten des Programms kann man dump$ auf „false“ setzten. Das Programm ist im MODEL SMALL programmiert, so dass daraus ein .EXE-Peogramm entsteht. Dafür habe ich die i Routinensammlung für COM-Programme in die beiden Teile MAC32.MAC und FIRM32.MAC aufgeteilt.
.MODEL SMALL
title Batch Control Program
page 65,120
.386
comment #
batch control programm
sammelsurium kleiner routinen
matthaei, 31-dec-88, 26.6.94, 27.1.2004, 16.3.2007 angepasst fuer XP
21.1.2011 umgestellt von MASM 4.xx auf ML 6.xx
26.10.2007 batc y ausser Betrieb genommen; es friert den Bildschirm unter Vista haeufig
(nicht immer) ein.
25.6.2012 angepasst auf MODEL SMALL. Vorher war es MODEL TINY
#
false equ 0
true equ not false
dump$ equ true ;fuer mdump, rdump
prompt$ equ true ;fuer enter, inkjn
intasc$ equ false ;fuer int2asc, asc2int
string$ equ false ;fuer fill, cmpstr, lenstr, instrg, movstr, ucaseg, lcaseg
pipe equ 0b3h ;Pipe-Zeichen (senkrechter Strich)
.STACK 256
.DATA
include MAC32.mac
;Arbeitsfelder
btab db 'MWV42ADEFPRSL?NJK ' ;mgl.Parameter
lbtab equ $-btab
wohin dw hilfe ;hilfeanzeige
dw keycode ;tastencode zeigen
dw ret0 ;errorlevel auf 0
dw ret1 ;errorlevel auf 1
dw ink_jn ;eingabe j/n
dw newline ;Leerzeile zum ildschirm
dw chrshow ;zeichensatz
dw resetp ;reset printer
dw list_p ;druckausgabe
dw farbe ;farbpalette zum bildschirm
dw scrn_esc ;bildchirmausgabe esc-string
dw datetest ;datumtest und Blockcursor ein
dw ask ;Ask-Abfrage
dw ega25 ;vga auf 25 / 28 Zeilen / Seite
dw ega43 ;vga auf 43 Zeilen/Seite
dw vgainfo ;anzeige video state buffer
dw weiter ;Abwarten Eingabe der CR-Taste
dw more ;Verwendung als More-Filter
zl_bs db 25 ;25 Zeilen pro Bildschirm
zei_zl db 0 ;Zeichen pro Zeile
azl_bs db 1 ;ausgegebene Zeichen dieser Seite
azei_zl db 1 ;ausgegebene Zeichen dieser Zeile
crlf1 db 11h, 0d9h ;angedeutete Enter-Taste
crlf2 db cr,lf,'$'
m_gsf db 0 ;Merker Gaensefuesschen
inp_buf db 80 DUP(0) ;Zwischenspeicher für Parameter
data_buf db 80 DUP(0) ;ab hier Datepuffer
.CODE
_start: mov ax,@DATA ;Initialisieren des Datensegment-Registers
mov ds,ax
jmp around
; .xlist
include firm32.mac
.list
; .sall
around:
; mdump lparm,30
mov ah,8 ;attribut lesen
xor bx,bx
int video
mov b cs:attr,ah
mov cs:v2,ah ;wegen Hilfsanzeige bei batc xx
or ah,8 ;Hell
mov cs:v1,ah
;-- mdump offset v1,5
;-- jmp ret0
; Uebernahme von beim Programmstart mitgegebenen Parametern
; in den Eingabebereich inp_buf.
; Geschieht, solange Register ES noch auf den PSP-Bereich zeigt
xor ch,ch ;im PSP auf Adr. 80h steht die Laenge
mov b cl,es:lparm ;der Programmaufrufparameter
jcxz v10 ;kein Parameter wurde eingegeben
inc cx
inc cx
mov si,lparm ;ab Adr. 80h steht der Parametertext
mov bx,offset inp_buf
v05:
mov b al,es:[si] ;Parameter ab es:[0080h] zum Eingabepuffer
inc si
mov b ds:[bx],al
inc bx
loopnz v05
v10: mov si,offset inp_buf ;Laenge des Parameters
xor ch,ch
mov cl,[si]
or cx,cx
; mov al,offset inp_buf
; mdump offset inp_buf,50h
jne start2
jmp hilfe ;Ausstieg, wenn keine Parameterangabe
start2: inc si ;ueberlesen fuehrende Spaces
cmp b[si],' '
jne start3
loop start2
start3:
mov al,[si] ;1. Zeichen des Parameters in
cmp al,'a' ;Grossschrift wandeln (a...z)
jb start4
cmp al,'z'
ja start4
sub al,20h
start4:
; rdump
push ds ;es auf ds setzen
pop es
mov di,offset btab ;befehlstabelle
mov cx,lbtab ;deren laenge
repne scasb
je w1
jmp hilfe ;ungueltiger aufrufparameter
w1: add cx,cx ;*2->tabellenoffset
mov di,cx
jmp wohin[di]
;hilfstextanzeige wenn aufruf ohne parameter
hilfe:
;scrollup 26,0,0,25,80,n_blck
;locate 0,0
call prmsg
dbl 'BATch Control Program Vers.: 23.6.2012'
dbl
dbl 'batc ? Eingabe J/N im Dialog'
dbl ' Errorlevel bei Ausgang: 0 nach J od.Y, 1 nach N'
dbl <'batc W prompted mit ',11h, 0d9h> ;angedeutete Enter-Taste-',3eh>
dbl 'batc A... Ask-Abfrage mit Prompt. Aufruf: BATC Aprompt[,key-list]'
dbl 'batc D Fuer PPC: Errorlevel auf 1 falls Datum vor 1987, sonst auf 0'
dbl ' und Blockcursor ein'
dbl 'batc E... Ausgabe ESC... zum Bildschirm (z.B. fuer ANSI-Treiber)'
dbl 'batc F Anzeige Farbpalette auf Bildschirm.'
dbl 'batc J setzt Errorlevel auf 0'
dbl 'batc K Keycode anzeigen'
dbl 'batc L Leerzeile zum Bildschirm'
dbl 'batc M Verwendung als more-Filter, Aufruf hinter |'
dbl <' oder batc m ',3ch,'dateiname'>
dbl 'batc N setzt Errorlevel auf 1'
dbl 'batc P... Textausgabe auf Drucker LPT1. Anleitung: batc P'
dbl 'batc R Resetbefehl fuer Drucker an LPT1 (BIOS)'
dbl 'batc S Zeichenvorrat zum Bildschirm'
dbl 'batc V Zeigt den Inhalt des Video-State-Buffers'
db 'batc ',escp
v1 db a_hell ;hell
db 'xx',escp
v2 db a_normal ;normal
dbl ' VGA auf xx Zeilen/Seite, 25 / 28 / 43'
db 0
jmp ret1
;interaktive anzeige tastencodes
keycode: call prmsg
dbl 'Hexaanzeige von Tastencodes (Scancodes und ASCII)'
dbl 'Ende: ESC'
db 0
key5: xor ah,ah ;zeichen aus
int 16h ;tastaturpuffer
push ax ;lesen
prstr 'Scancode: '
pop ax
push ax
mov al,ah
call hex_out
print_crlf
pop ax
;in ah erweiterter tastencode?
;funktionsende bei esc- eingabe!
or al,al
jz code_in_ah
cmp al,escp
jne key9
jmp ret0 ;fertig nach esc
code_in_ah: ;dann al und ah ausgeben!
push ax
call hex_out
pop ax
mov al,ah
key9:
call hex_out
print_crlf
jmp key5
;Eingabe der Fortsetzungsaufforderung
weiter: call prompt
jmp ret0
;eingabe j/n im dialog
ink_jn: call INKJN
; cmp al,3 ;ctrl c ist Errorlevel 2
; jne inkjn4
; jmp ret3
inkjn4: cmp al,'J' ;J ist Errorlevel 0
jne ret1 ;N ist Errorlevel 1
jmp ret0
;Ausgabe einer Leerzeile auf den Bildschirm
newline:
print_crlf
jmp raus
;Ask-Abfrage mit Prompt, aehnlich ASK aus den NORTON UTILITIES, nur kuerzer
ask:
mov si,offset inp_buf ;Laenge des Parameters
xor ch,ch
mov cl,[si]
dec cx ;Parameterlaenge um 2 reduzieren
dec cx
inc si ;und Index vorruecken um 2 Stellen
inc si ;ueber das a
inc si ;ueber das zeichen nach dem a
mov al,[si]
cmp al,cr
je askhilfe ;Ausstieg, wenn keine weitere Parameterangabe
dec si ;kompensiert letzte inc si
ask2: inc si ;ueberlesen fuehrende Spaces
cmp byte ptr[si],' '
jne ask3
jmp ask2
;Hilfstextanzeige wenn Aufruf ohne Parameter oder nur Spaces als Parameter
askhilfe:
call prmsg
dbl 'BATC Aprompt[,key-list]'
dbl 'Prompt mit , ? Dann Prompt in "" einschliessen!'
db 0
jmp ret1
;Ausgabe des Prompts
;Die Ausgabe endet beim Komma im Parameter, es sei denn, das Komma steht
;nach einer ungeraden Anzahl Gaensefuesschen
ask3: mov m_gsf,0 ;setzen Merker Gaensefuesschen auf gerade
dec si
ask5: inc si
mov al,[si]
cmp al,'"' ;umsetzen ?
je ask9
cmp al,cr ;carriage return ?
je ask99
cmp al,',' ;Komma enthalten ?
jne ask10 ;nein, dann Ausgabe 1 Zeichen
cmp m_gsf,0 ;ist Komma Teil des Prompts?
jne ask10 ;Ausgabe wegen Merker Schluss-Komma
jmp askantw1
ask9: xor byte ptr m_gsf,1 ;Merker Schluss-Komma umsetzen
jmp ask98
ask10: print_chr al ;Zeichen ausgeben
ask98:
cmp al,cr
jne ask5
ask99: jmp ret0 ;Programmende, wenn hier abgearbeitet
askantw1:
inc si ;ueberlesen fuehrende Spaces und
cmp byte ptr[si],cr ;kein Eingabezeichen hinter dem Komma abfangen
je ret0
cmp byte ptr[si],' '
jne askantw4
jmp askantw1
askantw4:
push si ;fuer Wiederholungen
mov bl,1
askantw5:
print_chr 3eh ;'>'
mov ah,0 ;Zeicheneingabe
int 16h ;per Tastatur
askantw6:
cmp byte ptr[si],cr ;gueltige Parameter ueberprueft?
je askantw8 ;ja - keine gueltige Antwort eingegeben
cmp al,cr
je askantw5 ;cr wird ignoriert
mov ah,al
and ah,5fh ;ah enth. das Zeichen in Grossschrift
cmp byte ptr[si],al ;vergleicht eingegebenes Zeichen ohne Aenderung
je askantw9
cmp byte ptr[si],ah ;vergleicht eingegebenes Zeichen
je askantw9 ;nach Aenderung desselben in Grossschrift
mov ah,al
or ah,20h ;ah enthält das Zeichen in Kleinschrift
cmp byte ptr[si],ah ;vergleicht eingegebenes Zeichen
je askantw9 ;nach Aenderung desselben in Kleinschrift
inc si
inc bl
jmp askantw6
askantw8: ;war nicht dabei - neue Eingabe anfordern!
pop si
jmp askantw4
askantw9:
print_crlf
mov al,bl ;Errorlevel
jmp raus
list_p:
;check argument & set-up to read it
mov si,offset inp_buf
mov bx,offset inp_buf+2 ;point to start of text argument
xor ch,ch
mov cl,[si]
cmp cx,3 ;is there at least 1 char after blank?
jb list_p_anl ;bedienungsanleitung falls nicht
jmp list_p5
;ausgabe bedienungsanleitung zu batc p
list_p_anl:
call prmsg
dbl 'Ausgabe von Druckerparametern'
dbl
dbl 'Es wird ein spezifizierter String an den Drucker geschickt.'
dbl 'Der String kann Steuerzeichen mit in [] eingeschlossenen'
dbl 'Dezimalzahlen enthalten.'
dbl 'Das normalerweise ergaenzte CR/LF kann durch ein angehaengtes'
dbl 'Semikolon unterdrueckt werden.'
dbl
dbl 'Anwendung: Tippe BATC P mit nachfolgendem Textstring'
dbl 'z.B.:'
dbl 'Batc pMerry Christmas; [ohne CRLF)'
dbl 'Batc p[27]E (ESC E mit CRLF)'
dbl 'Batc p[12]; Seitenvorschub'
dbl ' Umschaltung LC24 auf Orator mit Probedruck:'
dbl 'Batc p[27]x[1][27]k[3]LQ Orator'
db 0
jmp ret1
list_p5:
sub cx,2 ;discount char count for leading blank
;and possible trailing ";"
cmp cx,1 ;is there only one character?
je term ;if so, handle w/termination routine
inc bx ;pass p
dec cx
;parse argument & convert control codes
char_2_prn:
mov dl,[bx] ;get character
CMP DL,'[' ;is it the control prefix char?
jne send_it ;if not, go print char
xor al,al ;initialize char value to 0
mov dh,10d ;digit multiplier
convert_digit:
inc bx ;skip to next char
dec cx
mov dl,[bx] ;get char code into dl
jz exit2 ;exit if at end of text (cx = 0)
CMP DL,']' ;is it the control code suffix?
je pre_send_it ;if so, go prepare to print code
SUB DL,'0' ;convert digit code to value
mul dh ;mult. char value (in al) by 10
add al,dl ;add digit value to char value
jmp convert_digit ;loop back to convert next digit
pre_send_it:
mov dl,al ;put converted code into dl
;send character to printer & loop back for next
send_it:
call prnt_chr ;go print character in dl
inc bx ;point to next character
loop char_2_prn ;repeat until done
;Handle termination with ";"
term: mov dl,[bx] ;get last character
CMP DL,';' ;is it a semicolon?
jne cr_lf ;if not, go print cr & lf
jmp ret0 ;finished
cr_lf: call prnt_chr ;print last character
cr_lf1: mov dl,cr
call prnt_chr ;print cr
mov dl,lf
call prnt_chr
jmp ret0
;send one character to printer via dos function call
prnt_chr:
int21 5
ret ;back to calling routine
;handle case where end of text encountered while parsing control code
exit2: CMP DL,']' ;is it the control code suffix?
jne term ;if not, go do normal completion
;(w/o printing control code)
mov dl,al ;put control code in dl
call prnt_chr ;print control code
jmp cr_lf ;print cr & lf & complete
;reset des druckers
;to cancel runaway print jobs and to reset printer options to their
;boot-time settings.
resetp:
mov ah,1
xor dx,dx
int 17h
jmp ret0
;vga-karte umschalten auf 25
ega25:
inc si ;über das e hinaus
mov al,[si]
cmp al,'5'
jz ega250
cmp al,'8' ;Modus funktioniert nicht immer
jz ega28
jmp hilfe
ega250: mov ax,0040h ;25 Textzeilen
push ds
mov ds,ax
mov ax,3
int video
mov bx,0087h
; xor byte ptr ds:[bx],01h
mov cx,0d0eh ;monochromcursor
jmp ega439
ega28: ;28 Textzeilen
mov ax,1202h ;Video Funktion 12, Unterfunktion 2
; (400 rasterzeilen setzen)
mov bl,30h
int video
mov ax,1111h ;8*14 Font laden
xor bl,bl
int video
mov cx,1112h ;monochromcursor
mov ah,1 ;setzen videomodus
int video
mov cx,0d0eh ;monochromcursor
mov ah,1 ;setzen videomodus
int video
mov dx,03b4h ;Unterstreichungen korrigieren
mov ax,0714h
out dx,ax
jmp ret0
;vga-karte umschalten auf 43 textzeilen
ega43:
mov ax,1202h ;Video Funktion 12, Unterfunktion 2
mov bl,30h ;(400 rasterzeilen setzen)
int video
mov ax,0040h
push ds
mov ds,ax
mov ax,3
int video
mov ax,1112h
xor bl,bl
int video
mov bx,0087h
; or byte ptr ds:[bx],01h
mov ax,1200h
mov bl,20h
int video
mov cx,0708h
ega439: mov ah,1
int video
pop ds
jmp ret0
;errorlevel auf 0, falls datum nach 1987
;errorlevel auf 1, falls datum vor 1987 (d.h., nicht gesetzt)
datetest:
setcurtype 2,7 ;Blockcursor ein
int21 2ah ;datum lesen
cmp cx,1987
jb ret1
jmp ret0
;ausgabe esc string zum bildschirm, z.b. um zeichen fuer
;ansi.sys abzusetzen. die ausgabe muss ueber int 21h erfolgen
scrn_esc:
mov si,offset inp_buf ;Laenge des Parameters
xor ch,ch
mov cl,[si]
dec cx
jcxz scrn_esc_99 ;ausstieg, wenn keine parameterangabe
inc si ;space (1.zeichen der parameter)
inc si ;e (2.zeichen des parameters
mov b[si],escp ;wird esc
mov dx,si ;offsetadresse des puffers
mov bx,1 ;handle 1
int21 40h ;file auf handle 1 (bildschirm) schreiben
scrn_esc_99:
jmp ret0
;ausgabe zeichensatz auf bildschirm
chrshow: mov cx,256
schleif:
push cx
mov ax,cx
neg ax
push ax
and al,0fh
jnz kein_crlf
print_crlf
kein_crlf:
pop ax
push ax
call hex_out
print_chr ' '
pop ax
push ax
cmp al,cr
jz space
cmp al,lf
jz space
cmp al,tab
jz space
char: print_chr al
jmp weiter1
space: print_chr ' '
weiter1: pop ax ;kein trennstrich
and al,0fh ;am zeilenende
cmp al,0fh
jz kein_strich
print_chr pipe
kein_strich:
pop cx
loop schleif
jmp ret0
;anzeige farbpalette auf bildschirm
farbe: mov cx,256
fschleif:
push cx
mov ax,cx
neg ax
push ax
and al,0fh
jnz fkein_crlf
print_crlf
fkein_crlf:
pop ax
push ax
mov b cs:attr,16*n_blck+n_white
call hex_out
print_chr ' '
pop ax
push ax
mov b cs:attr,al
print_chr '8'
mov b cs:attr,16*n_blck+n_white
pop ax ;kein trennstrich
and al,0fh ;am zeilenende
cmp al,0fh
jz fkein_strich
print_chr pipe
fkein_strich:
pop cx
loop fschleif
jmp ret0
vgainfo:
;standardcursor setzen in abhaengikeit vom videomodus
mov ax,1a00h ;lese hardwarekonfiguration
int video
cmp al,1ah ;ob unterstuetzt
jz vgainfo9
prstr '"Lese Video-Konfiguration" wird nicht unterstuetzt'
jmp ret1
vgainfo9: push bx
prstr <'Inhalt des Video-State-Buffers',cr>
mov ah,1bh
mov di,offset data_buf
xor bx,bx
int video ;ermittle video-status
mov al,[di+4]
call hex_out
prstr <'h Videomodus',cr>
mov al,[di+6]
call hex_out
mov al,[di+5]
call hex_out
prstr <'h Spalten (Zeichen)',cr>
mov al,[di+8]
call hex_out
mov al,[di+7]
call hex_out
prstr <'h Laenge Bildschirmspeichers (Bytes)',cr>
mov al,[di+1ch]
call hex_out
prstr '/'
mov al,[di+1bh]
call hex_out
prstr <'h Cursortype, Anfangs/Endwert',cr>
mov al,[di+1dh]
call hex_out
prstr <'h Aktive Bildschirmseite',cr>
mov al,[di+1fh]
call hex_out
mov al,[di+1eh]
call hex_out
prstr <'h CRT-Controlleradr.',cr>
mov al,[di+20h]
call hex_out
prstr <'h 3x8 Registerbelegung',cr>
mov al,[di+21h]
call hex_out
prstr <'h 3x9 Registerbelegung',cr>
mov al,[di+22h]
call hex_out
prstr <'h Zeilen (Zeichen)',cr>
mov al,[di+24h]
call hex_out
mov al,[di+23h]
call hex_out
prstr <'h Zeichenhoehe in Rasterzeilen',cr>
mov al,[di+25h]
call hex_out
prstr <'h Aktive Hardware-Konfiguration',cr>
mov al,[di+26h]
call hex_out
prstr <'h Zusaetzliche Hardware-Konfiguration',cr>
mov al,[di+28h]
call hex_out
mov al,[di+27h]
call hex_out
prstr <'h Anzahl Farben',cr>
mov al,[di+29h]
call hex_out
prstr <'h Anzahl Bildschirmseiten',cr>
mov al,[di+2ah]
call hex_out
prstr <'h Rasterzeilen 00=200, 01=350, 02=400, 04-FF=reserviert',cr>
mov al,[di+31h]
call hex_out
prstr <'h Groesse Bildschirmspeicher,',cr>
prstr <' 00=64K, 01=128K, 02=192K, 3=256K, 04-FF=reserviert',cr>
jmp ret0
;Ueberarbeitetes MS-DOS 3.21 MORE.COM
;Matthaei, 10.10.89, 12.2.91: Zeilenanzahl angepasst fuer VGA/EGA
more: MOV AH,0Fh
INT 10h ;Video-Modus bestimmen
MOV byte ptr [zei_zl],AH
push ds ;sichert ds
MOV AX,0040h
MOV DS,AX
MOV AL,ds:[0084h] ;Anzahl Zeilen pro Seite
CMP AL,0
JNZ more1
MOV AL,24 ;25 Zeilen
more1: ;PUSH CS DS wiederherstellen
POP DS
inc al
MOV byte ptr ds:[zl_bs],AL
print_crlf
XOR BX,BX ;duplicate file handle 0 (standardeingabe)
MOV AH,45h
int dos
MOV BP,AX
MOV AH,3Eh ;close Standardeingabe
int dos
MOV BX,0002h ;duplicate file handle 2 (bildschirm)
MOV AH,45h
int dos
get_block:
CLD ;loesche richtungsflag
MOV DX,offset inp_buf
MOV CX,100 ;Geraet (Standardeingabe) lesen
MOV BX,BP
MOV AH,3Fh
int dos
OR AX,AX ;Anzahl gelesener Bytes
JNZ get_b5 ;wenn nicht EOF
;Programmbeendigung
get_b4: jmp ret0
get_b5: MOV CX,AX ;CX: Anzahl gelesener Bytes
MOV SI,DX ;SI: Adresse Programmende
get_byte: LODSB ;1 Byte nach AL
CMP AL,eof
JZ get_b4
CMP AL,cr
JNZ get_b6
MOV BYTE PTR [azei_zl],01
jmp ausgabe
get_b6: CMP AL,lf
JNZ get_b7
INC BYTE PTR [azl_bs]
jmp ausgabe
get_b7: CMP AL,bs
JNZ get_b8
CMP BYTE PTR [azei_zl],01 ;kein Backspace, wenn am
JZ ausgabe ;Zeilenanfang!
DEC BYTE PTR [azei_zl]
jmp ausgabe
get_b8: CMP AL,tab ;Tabulatorbehandlung
JNZ get_b9
MOV AH,byte ptr [azei_zl]
ADD AH,07
AND AH,0F8h
INC AH
MOV byte ptr [azei_zl],AH
jmp ausgabe
get_b9: CMP AL,07 ;Bell ist nicht druckbar
JZ ausgabe
INC BYTE PTR [azei_zl] ;normales Zeichen
MOV AH,byte ptr [azei_zl] ;ob Zeilenende erreicht
CMP AH,byte ptr [zei_zl]
JBE ausgabe
INC BYTE PTR [azl_bs] ;falls Zeilenende
MOV BYTE PTR [azei_zl],01
ausgabe: MOV DL,AL
MOV AH,02
int dos
MOV AH,byte ptr [azl_bs]
CMP AH,byte ptr [zl_bs]
JB ob_lesen
print_str crlf1 ;Abfrage -> am Seitenende
int21 8 ;eingabe 1 zeichen von tastatur nach
int dos ;loeschen eingabepuffer
print_str crlf2
mov byte ptr [azei_zl],01
mov byte ptr [azl_bs],01
DEC SI
INC CX
ob_lesen: DEC CX ;Puffer ausgegeben ?
JZ skip
JMP get_byte
skip: Jmp get_block
end _start
|