**********************************************************************;
;* E G A *;
;*--------------------------------------------------------------------*;
;* doel : definieert een aantal elementaire functies *;
;* voor de EGA-kaart *;
;*--------------------------------------------------------------------*;
;* opm : alle functies verdelen het scherm in de *;
;* kolommen 0-79 en de regels 0-24 (tekstmodus) *;
;* resp. 0-639 en 0-349 (grafische modus) *;
;*--------------------------------------------------------------------*;
;* auteur : Roland Leurs *;
;* ontwikkeld : 21-5-93 *;
;*--------------------------------------------------------------------*;
;* gebruik : in hoofdprogramma opnemen met include, *;
;* de functies kunnen daarna via macro's opge- *;
;* roepen worden. *;
;**********************************************************************;
;-- TEXT: schakelt de tekstmodus in ---------------------------------
;-- invoer : geen
;-- uitvoer : geen
;-- registers: geen registers worden veranderd
text proc near
push ax
mov ax,0002h ; zet scherm in mode 2
int 10h
pop ax
ret
text endp
;-- GRAFIX: schakelt de grafische weergave aan --------------------------
;-- invoer : geen
;-- uitvoer : geen
;-- registers: geen registers worden veranderd
grafix proc near
push ax
mov ax,0004h ; zet scherm in mode 4 (320*200*4)
int 10h
pop ax
ret
grafix endp
;-- CDEF: definieert de 1e en laatste beeldlijn van de cursor -----
;-- invoer : CL = eerste beeldlijn
;-- CH = laatste beeldlijn
;-- uitvoer : geen
;-- registers: AX en DX
cdef proc near
mov ah,01h ; functie 1 van int 10h
int 10h
ret
cdef endp
;-- CLS: hele scherm wissen ---------------------------------------
;-- invoer : BP = nummer schermpagina (0 of 1)
;-- uitvoer : geen
;-- registers: alleen FLAGS wordt veranderd
clscr proc near
jmp text ; is gelijk aan omschakelen naar tekstmode
clscr endp
;-- PIXEL: zet een punt in het grafische scherm ------------------------
;-- invoer : BP = nummer schermpagina (0 of 1)
;-- BX = kolom (0-319)
;-- DX = regel (0-199)
;-- AL = bewerking (1=zetten,2=inverteren,3=wissen)
;-- uitvoer : geen
;-- registers: AX, DI en FLAGS worden veranderd
pixel proc near
cmp bx,319 ;test of beeldpunt buiten beeld valt
ja spix6 ;spring indien buiten beeld
cmp dx,199 ;idem voor y-coordinaat
ja spix6
push es ;ES op stack opslaan
push ax ;AX op stack opslaan
push bx ;BX op stack opslaan
push cx ;CX op stack opslaan
push dx ;DX op stack opslaan
push ax ;AX op stack opslaan
mov ax,199 ;dx:=199-dx
sub ax,dx
mov dx,ax
mov cx,bx
pop ax ;haal ax terug
cmp ax,1 ;bepaal puntbewerking
jne pix1 ;en zet overeenkomstige schermkleur
mov al,3
jmp short pix4
pix1: cmp ax,2
jne pix2
mov al,83h
jmp short pix4
pix2: mov al,00h
pix4: mov ah,0Ch
xor bx,bx ;alleen schermpagina 0 toegestaan
int 10h ;plaats pixel d.m.v. biosfunctie
spix5: pop dx ;DX weer van stack halen
pop cx ;CX weer van stack halen
pop bx ;BX weer van stack halen
pop ax ;AX weer van stack halen
pop es ;ES weer van stack halen
spix6: ret
pixel endp
;== einde ===============================================================
;== macro definities ====================================================
initgraph macro
call grafix
endm
exitgraph macro
push ax
mov ax,0003h
int 10h
pop ax
endm
cls macro
call clscr
endm
;getpix proc near
; push bx ; save bx register
; xor bh,bh ; schermpagina 0
; mov bl,ah ; bewaar ah in bl
; mov ah,0Dh ; int 10, functie 13: pixelwaarde opvragen
; int 10h ; voer functie uit
; mov ah,bl ; herstel ah
; pop bx ; herstel bx
; ret
;getpix endp
;
;putpix proc near
; push bx ; save bx register
; xor bh,bh ; schermpagina 0
; mov bl,ah ; bewaar ah in bl
; mov ah,0Ch ; int 10, functie 12: pixel zetten
; int 10h ; voer functie uit
; mov ah,bl ; herstel ah
; pop bx ; herstel bx
; ret
;putpix endp
;== atom video emulatie =================================================
TABCL4: DB 000H,003H,00CH,00FH,030H,033H,03CH,03FH
DB 0C0H,0C3H,0CCH,0CFH,0F0H,0F3H,0FCH,0FFH
CLEAR4: CMP CLEAR4MUIS,1 ; TEST OP MUISSUPPORT
JNE CLMUIS1 ; SPRING INDIEN MUIS NIET UIT HOEFT
MOV AX,0002H ; ZET MUISCURSOR UIT
INT 33H
CLMUIS1: CALL LEESBYTE ; LEES MSB ADRES
MOV AH,AL ; ZET IN AH
CALL LEESBYTE ; LEES LSB ADRES
MOV DX,AX ; ZET ADRES IN DX
CALL LEESBYTE ; LEES GESCHREVEN DATA
CMP DX,9800H ; TEST OF ADRES BUITEN VIDEO GEBIED
JAE END4 ; SPRING INDIEN ONGELDIG ADRES
MOV BX,00A8H ; ZET BASISADRES PC-VIDEO
TEST DX,0020H ; TEST OP EVEN/ONEVEN BEELDREGEL
JZ EVEN4 ; SPRING INDIEN EVEN
MOV BX,20A8H ; ZET NIEUW BASISADRES
EVEN4: AND DX,0FFDFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; ZET EVEN OP STACK
AND DX,001FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,6 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,50H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
MOV CX,0B800H ; ZET EXTRA SEGMENT NAAR VIDEORAM
MOV ES,CX
; Onderstaande regels zijn vervangen door FastVideo routines
; XOR DX,DX ; RESET DATA REGISTER
; MOV CX,8 ; LAADT TELLER
;DATA4: SHL AL,1 ; SCHUIF DATABIT IN CARRY
; PUSHF ; BEWAAR CARRY
; RCL DX,1 ; SCHUIF DATABIT IN DATAREGISTER
; POPF ; HAAL CARRY TERUG
; RCL DX,1 ; SCHUIF NOGMAALS IN DATAREGISTER
; LOOP DATA4 ; HERHAAL TOT ALLE BITS GELEZEN
; Versie 4.21 FastVideo
XOR AH,AH ; WIS AH
AND AL,0FH ; MASKEER LAGE NIBBLE
MOV SI,AX ; ZET TABEL INDEX IN INDEXREGISTER
MOV DL,BYTE PTR TABCL4[SI] ; LEES SCHERMDATA UIT TABEL
MOV AL,DH ; LAADT SCHERMDATA OPNIEUW
SHR AL,4 ; ZET HOGE NIBBLE IN LAGE NIBBLE
MOV SI,AX ; ZET TABEL INDEX IN INDEXREGISTER
MOV DH,BYTE PTR TABCL4[SI] ; LEES SCHERMDATA UIT TABEL
MOV ES:[BX],DH ; SCHRIJF HOGE BYTE NAAR SCHERM
INC BX ; VERHOOG SCHERMPOINTER
MOV ES:[BX],DL ; SCHRIJF LAGE BYTE NAAR SCHERM
END4: CMP CLEAR4MUIS,1 ; TEST OF MUIS WEER AAN MOET
JNE CLMUIS2
MOV AX,0001H ; ZET MUIS WEER AAN
INT 33H
CLMUIS2: JMP LEESCOM ; EINDE ROUTINE
CLEAR4A: CALL ATOMKLEUR ; ATOM KLEUREN PALET ZETTEN
CALL LEESBYTE ; LEES MSB ADRES
MOV AH,AL ; ZET IN AH
CALL LEESBYTE ; LEES LSB ADRES
MOV DX,AX ; ZET ADRES IN DX
CALL LEESBYTE ; LEES GESCHREVEN DATA
CMP DX,9800H ; TEST OF ADRES BUITEN VIDEO GEBIED
JAE END4A ; SPRING INDIEN ONGELDIG ADRES
MOV BX,00A8H ; ZET BASISADRES PC-VIDEO
TEST DX,0020H ; TEST OP EVEN/ONEVEN BEELDREGEL
JZ EVEN4A ; SPRING INDIEN EVEN
MOV BX,20A8H ; ZET NIEUW BASISADRES
EVEN4A: AND DX,0FFDFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; ZET EVEN OP STACK
AND DX,001FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,6 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,50H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
MOV CX,0B800H ; ZET EXTRA SEGMENT NAAR VIDEORAM
MOV ES,CX
XOR DX,DX ; RESET DATA REGISTER
MOV CX,4 ; LAADT TELLER
DATA4A: PUSH AX ; SAVE DATA
SHL AL,1 ; SCHUIF KLEURBIT IN CARRY
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
SHL AL,1 ; NOGMAALS VOOR TWEEDE KLEURBIT
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
POP AX ; HAAL DATA TERUG
SHL AL,1 ; SCHUIF KLEURBIT IN CARRY
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
SHL AL,1 ; NOGMAALS VOOR TWEEDE KLEURBIT
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
LOOP DATA4A ; HERHAAL TOT ALLE BITS GELEZEN
MOV ES:[BX],DH ; SCHRIJF HOGE BYTE NAAR SCHERM
INC BX ; VERHOOG SCHERMPOINTER
MOV ES:[BX],DL ; SCHRIJF LAGE BYTE NAAR SCHERM
END4A: JMP LEESCOM ; EINDE ROUTINE
CLEAR3: CALL LEESBYTE ; LEES MSB ADRES
MOV AH,AL ; ZET IN AH
CALL LEESBYTE ; LEES LSB ADRES
MOV DX,AX ; ZET ADRES IN DX
CALL LEESBYTE ; LEES GESCHREVEN DATA
CMP DX,8C00H ; TEST OF ADRES BUITEN VIDEO GEBIED
JAE END3 ; SPRING INDIEN ONGELDIG ADRES
MOV BX,00A8H ; ZET BASISADRES PC-VIDEO
TEST DX,0010H ; TEST OP EVEN/ONEVEN BEELDREGEL
JZ EVEN3 ; SPRING INDIEN EVEN
MOV BX,20A8H ; ZET NIEUW BASISADRES
EVEN3: AND DX,0FFEFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; ZET EVEN OP STACK
AND DX,000FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,5 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,50H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
MOV CX,0B800H ; ZET EXTRA SEGMENT NAAR VIDEORAM
MOV ES,CX
MOV CX,4 ; LAADT TELLER
DATA3: XOR DX,DX ; RESET DATA REGISTER
SHL AL,1 ; SCHUIF DATABIT IN CARRY
JNC DATA3L1 ; SPRING ALS BIT NIET GEZET IS
OR DL,0F0H ; ALS BIT GEZET, ZET PIXELS
DATA3L1: SHL AL,1 ; SCHUIF VOLGEND DATABIT IN CARRY
JNC DATA3L2 ; SPRING ALS BIT NIET GEZET IS
OR DL,0FH ; ZET PIXELS
DATA3L2: MOV ES:[BX],DL ; SCHRIJF DATA NAAR SCHERM
INC BX ; VERHOOG SCHERMPOINTER
LOOP DATA3
END3: JMP LEESCOM ; EINDE ROUTINE
CLEAR3A: CALL ATOMKLEUR ; ATOM KLEUREN PALET ZETTEN
CALL LEESBYTE ; LEES MSB ADRES
MOV AH,AL ; ZET IN AH
CALL LEESBYTE ; LEES LSB ADRES
MOV DX,AX ; ZET ADRES IN DX
CALL LEESBYTE ; LEES GESCHREVEN DATA
CMP DX,8C00H ; TEST OF ADRES BUITEN VIDEO GEBIED
JAE END3A ; SPRING INDIEN ONGELDIG ADRES
MOV BX,00A8H ; ZET BASISADRES PC-VIDEO
TEST DX,0020H ; TEST OP EVEN/ONEVEN BEELDREGEL
JZ EVEN3A ; SPRING INDIEN EVEN
MOV BX,00F8H ; ZET NIEUW BASISADRES
EVEN3A: AND DX,0FFDFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; ZET EVEN OP STACK
AND DX,001FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,6 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,0A0H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
MOV CX,0B800H ; ZET EXTRA SEGMENT NAAR VIDEORAM
MOV ES,CX
XOR DX,DX ; RESET DATA REGISTER
MOV CX,4 ; LAADT TELLER
DATA3A: PUSH AX ; SAVE DATA
SHL AL,1 ; SCHUIF KLEURBIT IN CARRY
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
SHL AL,1 ; NOGMAALS VOOR TWEEDE KLEURBIT
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
POP AX ; HAAL DATA TERUG
SHL AL,1 ; SCHUIF KLEURBIT IN CARRY
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
SHL AL,1 ; NOGMAALS VOOR TWEEDE KLEURBIT
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
LOOP DATA3A ; HERHAAL TOT ALLE BITS GELEZEN
MOV ES:[BX],DH ; SCHRIJF HOGE BYTE NAAR SCHERM
MOV ES:[BX+2000H],DH
INC BX ; VERHOOG SCHERMPOINTER
MOV ES:[BX],DL ; SCHRIJF LAGE BYTE NAAR SCHERM
MOV ES:[BX+2000H],DL
END3A: JMP LEESCOM ; EINDE ROUTINE
CLEAR2: CALL LEESBYTE ; LEES MSB ADRES
MOV AH,AL ; ZET IN AH
CALL LEESBYTE ; LEES LSB ADRES
MOV DX,AX ; ZET ADRES IN DX
CALL LEESBYTE ; LEES GESCHREVEN DATA
CMP DX,8600H ; TEST OF ADRES BUITEN VIDEO GEBIED
JAE END2 ; SPRING INDIEN ONGELDIG ADRES
MOV BX,00A8H ; ZET BASISADRES PC-VIDEO
TEST DX,0010H ; TEST OP EVEN/ONEVEN BEELDLIJN
JZ EVEN2 ; SPRING INDIEN EVEN
ADD BX,050H ; VERHOOG VERTIKALE OFFSET
EVEN2: AND DX,0FFEFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; ZET EVEN OP STACK
AND DX,000FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,5 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,0A0H ; LAADT AL MET REGELLENGTE*2
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
MOV CX,0B800H ; ZET EXTRA SEGMENT NAAR VIDEORAM
MOV ES,CX
MOV CX,4 ; LAADT TELLER
DATA2: XOR DX,DX ; RESET DATA REGISTER
SHL AL,1 ; SCHUIF DATABIT IN CARRY
JNC DATA2L1 ; SPRING ALS BIT NIET GEZET IS
OR DL,0F0H ; ALS BIT GEZET, ZET PIXELS
DATA2L1: SHL AL,1 ; SCHUIF VOLGEND DATABIT IN CARRY
JNC DATA2L2 ; SPRING ALS BIT NIET GEZET IS
OR DL,0FH ; ZET PIXELS
DATA2L2: MOV ES:[BX],DL ; SCHRIJF DATA NAAR EVEN SCHERMREGEL
MOV ES:[BX+2000H],DL ; EN NAAR ONEVEN SCHERMREGEL
INC BX ; VERHOOG SCHERMPOINTER
LOOP DATA2
END2: JMP LEESCOM ; EINDE ROUTINE
CLEAR2A: CALL ATOMKLEUR ; ATOM KLEURENPALET ZETTEN
CALL LEESBYTE ; LEES MSB ADRES
MOV AH,AL ; ZET IN AH
CALL LEESBYTE ; LEES LSB ADRES
MOV DX,AX ; ZET ADRES IN DX
CALL LEESBYTE ; LEES GESCHREVEN DATA
CMP DX,8800H ; TEST OF ADRES BUITEN VIDEO GEBIED
JAE END2 ; SPRING INDIEN ONGELDIG ADRES
TEST DX,0020H ; TEST OP EVEN/ONEVEN BEELDREGEL
JZ EVEN2A ; SPRING INDIEN EVEN
MOV BX,20F8H ; ZET NIEUW BASISADRES
AND DX,0FFDFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; BEWAAR EVEN OP STACK
AND DX,01FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,6 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,0F0H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
PUSH BX ; ZET EERSTE SCHERMADRES OP STACK
ADD BX,50H ; BEREKEN TWEEDE SCHERMADRES
PUSH BX ; ZET OP STACK
SUB BX,2000H ; BEREKEN DERDE SCHERMADRES
JMP SHORT CLEAR2A1 ; GEDWONGEN SPRONG
EVEN2A: MOV BX,00A8H ; ZET BASISADRES PC-VIDEO
AND DX,0FFDFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; ZET EVEN OP STACK
AND DX,001FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,6 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,0F0H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
PUSH BX ; ZET EERSTE SCHERMADRES OP STACK
ADD BX,2000H ; BEREKEN TWEEDE SCHERMADRES
PUSH BX ; ZET OP STACK
SUB BX,1FB0H ; BEREKEN DERDE SCHERMADRES
CLEAR2A1: MOV CX,0B800H ; ZET EXTRA SEGMENT NAAR VIDEORAM
MOV ES,CX
XOR DX,DX ; RESET DATA REGISTER
MOV CX,4 ; LAADT TELLER
DATA2A: PUSH AX ; SAVE DATA
SHL AL,1 ; SCHUIF KLEURBIT IN CARRY
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
SHL AL,1 ; NOGMAALS VOOR TWEEDE KLEURBIT
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
POP AX ; HAAL DATA TERUG
SHL AL,1 ; SCHUIF KLEURBIT IN CARRY
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
SHL AL,1 ; NOGMAALS VOOR TWEEDE KLEURBIT
RCL DX,1 ; SCHUIF KLEURBIT IN DATAREGISTER
LOOP DATA2A ; HERHAAL TOT ALLE BITS GELEZEN
MOV ES:[BX],DH ; SCHRIJF HOGE BYTE NAAR SCHERM
INC BX ; VERHOOG SCHERMPOINTER
MOV ES:[BX],DL ; SCHRIJF LAGE BYTE NAAR SCHERM
POP BX ; HAAL TWEEDE SCHERMADRES VAN STACK
MOV ES:[BX],DH ; SCHRIJF HOGE BYTE NAAR SCHERM
INC BX ; VERHOOG SCHERMPOINTER
MOV ES:[BX],DL ; SCHRIJF LAGE BYTE NAAR SCHERM
POP BX ; HAAL EERSTE SCHERMADRES VAN STACK
MOV ES:[BX],DH ; SCHRIJF HOGE BYTE NAAR SCHERM
INC BX ; VERHOOG SCHERMPOINTER
MOV ES:[BX],DL ; SCHRIJF LAGE BYTE NAAR SCHERM
END2A: JMP LEESCOM ; EINDE ROUTINE
CLEAR1: CALL LEESBYTE ; LEES MSB ADRES
MOV AH,AL ; ZET IN AH
CALL LEESBYTE ; LEES LSB ADRES
MOV DX,AX ; ZET ADRES IN DX
CALL LEESBYTE ; LEES GESCHREVEN DATA
CMP DX,8400H ; TEST OF ADRES BUITEN VIDEO GEBIED
JAE END2A ; SPRING INDIEN ONGELDIG ADRES
TEST DX,0010H ; TEST OP EVEN/ONEVEN BEELDREGEL
JZ EVEN1 ; SPRING INDIEN EVEN
MOV BX,20F8H ; ZET NIEUW BASISADRES
AND DX,0FFEFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; BEWAAR EVEN OP STACK
AND DX,00FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,5 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,0F0H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
MOV TEMP+0,BX ; ZET EERSTE SCHERMADRES OP STACK
ADD BX,50H ; BEREKEN TWEEDE SCHERMADRES
MOV TEMP+2,BX ; ZET OP STACK
SUB BX,2000H ; BEREKEN DERDE SCHERMADRES
JMP SHORT CLEAR1_1 ; GEDWONGEN SPRONG
EVEN1: MOV BX,00A8H ; ZET BASISADRES PC-VIDEO
AND DX,0FFEFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; ZET EVEN OP STACK
AND DX,000FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,5 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,0F0H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
MOV TEMP+0,BX ; ZET EERSTE SCHERMADRES OP STACK
ADD BX,2000H ; BEREKEN TWEEDE SCHERMADRES
MOV TEMP+2,BX ; ZET OP STACK
SUB BX,1FB0H ; BEREKEN DERDE SCHERMADRES
CLEAR1_1: MOV TEMP+4,BX ; ZET OP STACK
MOV CX,0B800H ; ZET EXTRA SEGMENT NAAR VIDEORAM
MOV ES,CX
XOR DX,DX ; RESET DATA REGISTER
MOV CX,4 ; LAADT TELLER
DATA1: XOR DX,DX ; RESET DATA REGISTER
SHL AL,1 ; SCHUIF DATABIT IN CARRY
JNC DATA1L1 ; SPRING ALS BIT NIET GEZET IS
OR DL,0F0H ; ALS BIT GEZET, ZET PIXELS
DATA1L1: SHL AL,1 ; SCHUIF VOLGEND DATABIT IN CARRY
JNC DATA1L2 ; SPRING ALS BIT NIET GEZET IS
OR DL,0FH ; ZET PIXELS
DATA1L2: MOV BX,TEMP+0
MOV ES:[BX],DL ; SCHRIJF DATA NAAR SCHERM
MOV BX,TEMP+2
MOV ES:[BX],DL
MOV BX,TEMP+4
MOV ES:[BX],DL
INC TEMP+0 ; VERHOOG SCHERMPOINTER
INC TEMP+2
INC TEMP+4
LOOP DATA1
END1: JMP LEESCOM ; EINDE ROUTINE
CLEAR1A: CALL ATOMKLEUR ; KLEURENPALET ZETTEN
CALL LEESBYTE ; LEES MSB ADRES
MOV AH,AL ; ZET IN AH
CALL LEESBYTE ; LEES LSB ADRES
MOV DX,AX ; ZET ADRES IN DX
CALL LEESBYTE ; LEES GESCHREVEN DATA
CMP DX,8400H ; TEST OF ADRES BUITEN VIDEO GEBIED
JAE END1 ; SPRING INDIEN ONGELDIG ADRES
TEST DX,0010H ; TEST OP EVEN/ONEVEN BEELDREGEL
JZ EVEN1A ; SPRING INDIEN EVEN
MOV BX,20F8H ; ZET NIEUW BASISADRES
AND DX,0FFEFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; BEWAAR EVEN OP STACK
AND DX,00FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,5 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,0F0H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
MOV TEMP+0,BX ; ZET EERSTE SCHERMADRES OP STACK
ADD BX,50H ; BEREKEN TWEEDE SCHERMADRES
MOV TEMP+2,BX ; ZET OP STACK
SUB BX,2000H ; BEREKEN DERDE SCHERMADRES
JMP SHORT CLEAR1A1 ; GEDWONGEN SPRONG
EVEN1A: MOV BX,00A8H ; ZET BASISADRES PC-VIDEO
AND DX,0FFEFH ; RESET EVEN/ONEVEN BIT
PUSH DX ; ZET EVEN OP STACK
AND DX,000FH ; BEPAAL HORIZONTALE SCHERMPOSITIE
SHL DX,1
SHL DX,1
ADD BX,DX ; TEL OP BIJ BASISADRES
POP DX ; HAAL DX WEER TERUG
MOV CL,5 ; LAADT AANTAL SCHUIFOPDRACHTEN
SHR DX,CL ; BEREKEN ADRES/32
AND DX,00FFH ; BEREKEN VERTIKALE POSITIE
MOV DH,AL ; BEWAAR DATA
MOV AL,0F0H ; LAADT AL MET REGELLENGTE
MUL DL ; VERMENIGVULDIG MET REGELLENGTE
ADD BX,AX ; TEL OP BIJ BASISADRES
MOV AL,DH ; ZET DATA WEER IN AL
MOV TEMP+0,BX ; ZET EERSTE SCHERMADRES OP STACK
ADD BX,2000H ; BEREKEN TWEEDE SCHERMADRES
MOV TEMP+2,BX ; ZET OP STACK
SUB BX,1FB0H ; BEREKEN DERDE SCHERMADRES
CLEAR1A1: MOV TEMP+4,BX ; ZET OP STACK
MOV CX,0B800H ; ZET EXTRA SEGMENT NAAR VIDEORAM
MOV ES,CX
MOV CX,4 ; LAADT TELLER
DATA1A: XOR DX,DX ; RESET DATA REGISTER
PUSH AX ; ZET DATA OP STACK
SHL AL,1 ; SCHUIF DATABIT IN CARRY
RCL DL,1
SHL AL,1 ; SCHUIF DATABIT IN CARRY
RCL DL,1
POP AX
PUSH AX ; ZET DATA OP STACK
SHL AL,1 ; SCHUIF DATABIT IN CARRY
RCL DL,1
SHL AL,1 ; SCHUIF DATABIT IN CARRY
RCL DL,1
POP AX
PUSH AX ; ZET DATA OP STACK
SHL AL,1 ; SCHUIF DATABIT IN CARRY
RCL DL,1
SHL AL,1 ; SCHUIF DATABIT IN CARRY
RCL DL,1
POP AX
SHL AL,1 ; SCHUIF DATABIT IN CARRY
RCL DL,1
SHL AL,1 ; SCHUIF DATABIT IN CARRY
RCL DL,1
MOV BX,TEMP+0
MOV ES:[BX],DL ; SCHRIJF DATA NAAR SCHERM
MOV BX,TEMP+2
MOV ES:[BX],DL
MOV BX,TEMP+4
MOV ES:[BX],DL
INC TEMP+0 ; VERHOOG SCHERMPOINTER
INC TEMP+2
INC TEMP+4
LOOP DATA1A
END1A: JMP LEESCOM ; EINDE ROUTINE
CLEAR0: CALL LEESBYTE ; LEES MSB ADRES
MOV AH,AL ; ZET IN AH
CALL LEESBYTE ; LEES LSB ADRES
MOV DX,AX ; ZET ADRES IN DX
CALL LEESBYTE ; LEES GESCHREVEN DATA
CMP DX,8200H ; TEST OF ADRES BUITEN VIDEO GEBIED
JAE END0 ; SPRING INDIEN ONGELDIG ADRES
MOV CH,AL ; BEWAAR DATA IN CH
MOV BX,DX ; ZET GELEZEN ADRES IN BX
AND BX,001FH ; BEREKEN HORIZONTALE POSITIE
SHL BX,1 ; VERMENIGVULDIG MET 2
ADD BX,00A8H ; TEL OFFSET ERBIJ
MOV CL,5 ; LAADT TELLER VOOR SCHUIFOPDRACHT
SHR DX,CL ; ADRES := ADRES / 32
AND DX,000FH ; ALLEEN ONDERSTE VIER BITS VAN BELANG
MOV AX,01E0H ; LAADT AX MET REGELLENGTE
MUL DX ; BEREKEN BEGINADRES VAN REGEL
ADD BX,AX ; BEREKEN BEGINADRES VAN KARAKTER
MOV AX,0B800H ; ZET EXTRA SEGMENT NAAR VIDEORAM
MOV ES,AX
MOV DL,CH ; ZET DATA IN DX
AND DL,7FH ; RESET HOOGSTE BIT
MOV AX,24 ; BEPAAL BEGINADRES VAN KAR IN FONTRAM
MUL DL
MOV DI,AX ; ZET RESULTAAT IN INDEXREGISTER
MOV DX,00FFH ; RESET KLEURMASKER
TEST CH,80H ; BEPAAL HOOGSTE BIT WAARDE
JZ CLEAR0L1 ; SPRING INDIEN GEWIST
MOV DH,55H ; ZET NIEUW KLEURMASKER
TEST CH,40H ; BEPAAL EEN NA HOOGSTE BIT
JZ CLEAR0L1
MOV DL,0AAH ; NIEUW KLEURMASKER
JZ CLEAR0L1 ; SPRING INDIEN GEWIST
CLEAR0L1: MOV CX,12 ; LAADT TELLER
CLEAR0L2: MOV AX,WORD PTR RAMFONT[DI] ; LEES EERSTE HELFT VAN KARAKTER
INC DI ; VERHOOG POINTER
INC DI ; VERHOOG POINTER
XCHG AL,AH
XOR AH,DH ; PAS KLEUR AAN
XOR AL,DH
AND AH,DL
AND AL,DL
MOV ES:[BX],AX ; SCHRIJF NAAR VIDEORAM
TEST CX,0001H ; TEST OP EVEN/ONEVEN REGEL
JZ CLEAR0L3 ; SPRING ALS EVEN
SUB BX,1FB0H ; BEKENEN ADRES NIEUWE KARAKTERLIJN
JMP SHORT CLEAR0L4 ; SPRING ALTIJD
CLEAR0L3: ADD BX,2000H ; BEREKEN ADRES NIEUWE KARAKTERLIJN
CLEAR0L4: LOOP CLEAR0L2 ; VOLGENDE LIJN
END0: JMP LEESCOM ; EINDE COMMANDO
ATOMKLEUR PROC NEAR
CMP ATOMPALET,1 ; TEST OF ATOMPALET AL GESELECTEERD IS
JE ATOMKL1 ; JA, DAN NIETS DOEN
MOV AL,VIDEOKAART ; LAADT VIDEOKAART
CMP AL,30H ; NIETS DOEN BIJ CGA OF HERCULES
JE ATOMKL1
CMP AL,00H
JE ATOMKL1
MOV AX,1000H ; LAADT FUNCTIE EN SUBFUNCTIE
MOV BX,0200H ; LAADT LOGISCH KLEURNUMMER
INT 10H ; HERPROGRAMMEER PALET
MOV AX,1000H
MOV BX,3E01H
INT 10H
MOV AX,1000H
MOV BX,0102H
INT 10H
MOV AX,1000H
MOV BX,0403H
INT 10H
MOV ATOMPALET,1 ; GEEF AAN DAT PALET GEZET IS
ATOMKL1: RET ; EINDE ROUTINE
ATOMKLEUR ENDP