CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
CR EQU 13 ; Carriage Return
LF EQU 10 ; Line Feed
DISP_BLOCK PROC NEAR
MOV AX,DSEG ; Initialisierung DS mit Adresse vom Segment DSEG
MOV DS,AX
MOV BX,0 ; BX : Indizierung BLOCK
MOV CX,16 ; CX (DISP_BLOCK) : Anzahl Zeilen
LINE_LOOP:
CALL DISP_LINE
MOV AH,02h ; MS-DOS Funktion 2, Zeichenausgabe
MOV DL,CR ; entspricht MOV DL,13
INT 21h
MOV DL,LF ; entspricht MOV DL,10
INT 21h
ADD BX,16 ; naechste Zeile
LOOP LINE_LOOP ; alle Zeilen bearbeitet ?
MOV AX,4C00h
INT 21h
DISP_BLOCK ENDP
DISP_LINE PROC NEAR
PUSH CX ; CX aus DISP_BLOCK sichern
MOV CX,16 ; CX (DISP_LINE) : Anzahl Spalten
PUSH BX ; Index sichern (Zeilenanfang)
HEX_LOOP:
MOV DL,BLOCK[BX] ; hoeherwertige Bits ausgeben
PUSH CX ; hoeherwertige Bits rechtsschieben
MOV CL,4
SHR DL,CL
POP CX
CALL WRITE_DIGIT
MOV DL,BLOCK[BX] ; niederwertige Bits ausgeben
AND DL,0Fh ; niederwertige Bits maskieren
CALL WRITE_DIGIT
MOV AH,02h ; MS-DOS Funktion 2, Zeichenausgabe
MOV DL,' '
INT 21h
INC BX ; naechste Spalte
LOOP HEX_LOOP ; alle Spalten (Zahlen) bearbeitet ?
POP BX ; Index restaurieren (Zeilenanfang)
PUSH BX ; Index sichern (Zeilenanfang)
MOV CX,16 ; CX (DISP_LINE) : Anzahl Spalten
ASCII_LOOP:
MOV AH,02h ; MS-DOS Funktion 2, Zeichenausgabe
MOV DL,BLOCK[BX]
CMP DL,20h ; Zeichen druckbar ?
JAE DRUCKBAR ; ja, ausgeben
MOV DL,'.' ; nein, stattdessen . ausgeben
DRUCKBAR:
INT 21h
INC BX ; naechste Spalte
LOOP ASCII_LOOP ; alle Spalten (Zeichen) bearbeitet ?
POP BX ; Index ruecksichern (Zeilenanfang)
POP CX ; CX fuer DISP_BLOCK restaurieren
RET
DISP_LINE ENDP
WRITE_DIGIT PROC NEAR
ADD DL,30h ; ASC-II Code der Ziffer generieren
CMP DL,3Ah ; Ziffer gehoert der Gruppe 0..9 an ?
JB DIGIT_OK
ADD DL,07h ; ASC-II Code korrigieren
DIGIT_OK:
MOV AH,02h ; MS-DOS Funktion 2, Zeichenausgabe
INT 21h
RET
WRITE_DIGIT ENDP
CSEG ENDS
DSEG SEGMENT
BLOCK DB 16 DUP (30h) ; 16 Zeilen * 16 Spalten
DB 16 DUP (31h)
DB 16 DUP (32h)
DB 16 DUP (33h)
DB 16 DUP (34h)
DB 16 DUP (35h)
DB 16 DUP (36h)
DB 16 DUP (37h)
DB 16 DUP (38h)
DB 16 DUP (39h)
DB 16 DUP (3Ah)
DB 16 DUP (3Bh)
DB 16 DUP (3Ch)
DB 16 DUP (3Dh)
DB 16 DUP (3Eh)
DB 16 DUP (3Fh)
DSEG ENDS
SSEG SEGMENT STACK
DW 256 DUP (?)
SSEG ENDS
END DISP_BLOCK