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. Hier ist beschrieben, wie die Ansteuerung des betreffenden Programmteils aus dem angezeigten Menü 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 Menüanzeige Beispiele für die Aufrufe
batc d führt eine besondere Funktion durch, Sie ist nur für den 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-Programm entsteht. Dafür habe ich die 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 |