terug.gif
**********************************************************************;
;*                             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
terug.gif