8086 Assembler (MS-DOS):
BATC - Batch Control Program

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.

Menü des Programmes BATC

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 ? (Ja/Nein-Abfrage),
  • batc a"Na, wie geht es Dir (g=gut, s=schlecht)",gs (Anfordern einer Antwort,
    vergl. Frage-Programm und
  • batc w (Anfordern einer Tasteneingabe)
abgebildet.

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, Farb- und Zeichensatzanzeige batc f veranlasst die Anzeige der 256 Möglichkeiten zur Anzeige von farbiger Schrift auf farbigem Hintergrund.
batc s zeigt den Zeichensatz an.
BATC, ANSI-Escape-Sequenzen zum Bildschirm 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.
  • batc e[2J löscht den Bildschirminhalt und bringt den Cursor in die linke obere Ecke. Mit dem DOS-Kommando „cls” geht des jedoch bequemer!
  • batc m leistet das Gleiche wie ältere Versionen des MS-DOS-Programmes „more”, d.h. die seitenweise Anzeige einer Textdatei. Modernere Versionen, wie sie beispielsweise bei VISTA mitgeliefert werden, sind leistungsfähiger!
  • batc v liefert einige Informationen zum Video-State-Puffer.
  • batc 25 oder 28 oder 43 sollte die Anzahl Zeilen auf dem Bildschirm umschalten. Man muss ausprobieren, wann es funktioniert und wann nicht!

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
Letztes Upload: 24.03.2023 um 11:35:12 • Impressum und Datenschutzerklärung