;**********************************************************************; ;* 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 mov ah,0bh ; selecteer palet 0 (groen/rood/geel) mov bx,0100h int 10h endm exitgraph macro push ax mov ax,0002h int 10h pop ax endm cls macro call clscr endm ;== atom video emulatie ================================================= CLEAR4: 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 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 MOV ES:[BX],DH ; SCHRIJF HOGE BYTE NAAR SCHERM INC BX ; VERHOOG SCHERMPOINTER MOV ES:[BX],DL ; SCHRIJF LAGE BYTE NAAR SCHERM END4: JMP LEESCOM ; EINDE ROUTINE CLEAR4A: 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 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 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 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