terug.gif
; ***************************************************************************
; In deze include-file staan grafische uitbreidingen van ATOM.COM vanaf
; versie 3.xx.
; De opzet is om meer grafisch werk door de PC uit te laten voeren en dus een
; hogere snelheid te bereiken. De grafische uitbreidingen werken alleen in
; extended video modi.
; ***************************************************************************
; Vanaf versie 4.0 worden de paint patronen opgeslagen in page 0 van het
; XMS geheugen (als geen XMS geheugen beschikbaar is staan de patronen in
; het zeer vluchtige filebuffergeheugen).
; Eveneens vanaf deze versie worden sprites (32x32) ondersteund. Sprites komen
; altijd in het XMS geheugen. Voor de eerste 256 sprites wordt een
; administratie bijgehouden voor wat betreft de coordinaten.
; ***************************************************************************
; In versie 4.1x komt hier support bij voor BBC Basic plot commando's (d.i.
; VDU code 25).
; ***************************************************************************
; Auteur : Roland Leurs
; Datum  : 25 maart 1994
; Update : mei 1998 (toevoeging BBC graphics emulatie)
; ***************************************************************************
; ---------------------------------------------------------------------------
; PUTWIN - Schrijft een grafisch window naar file. De file moet van te voren
;          al geopend zijn. De coordinaten van het window en de file handle
;          worden als parameter opgegeven. De coordinaten gelden vanaf de
;          logische oorsprong. Er wordt dus rekening gehouden met een
;          verschoven oorsprong.
; ---------------------------------------------------------------------------
PUTWIN:         XOR     DI,DI           ; PARAMETER TELLER := 0
PUTWIN1:        CALL    LEESBYTE        ; LEES COORDINAAT VAN WINDOW
                MOV     BL,AL           ; ZET IN BX
                CALL    LEESBYTE
                MOV     BH,AL
                MOV     TEMP[DI],BX     ; ZET COORDINAAT IN WERKRUIMTE
                INC     DI              ; VERHOOG TELLER
                INC     DI
                CMP     DI,8            ; DOE DIT VOOR VIER COORDINATEN
                JNE     PUTWIN1
                CALL    LEESBYTE        ; LEES FILE HANDLE
                MOV     BL,AL           ; ZET IN BL
                XOR     BH,BH           ; BX IS NU FILE HANDLE
                CALL    RESET_FP        ; ZET FILEPOINTER NAAR BEGIN VAN FILE
                MOV     AX,TEMP         ; PAS COORDINATEN AAN T.O.V OORSPRONG
                ADD     AX,OORSPRONG_X
                MOV     TEMP,AX
                MOV     AX,TEMP+2
                ADD     AX,OORSPRONG_Y
                MOV     TEMP+2,AX
                MOV     AX,TEMP+4
                ADD     AX,OORSPRONG_X
                MOV     TEMP+4,AX
                MOV     AX,TEMP+6
                ADD     AX,OORSPRONG_Y
                MOV     TEMP+6,AX
                MOV     DX,TEMP+2       ; LAADT DX MET BOVENGRENS
PUT_WHILE1:     CMP     DX,TEMP+6       ; ZOLANG BOVENGRENS > ONDERGRENS
                JNG     PUT_END         ;   SPRING INDIEN KLEINER OF GELIJK
                MOV     CX,TEMP         ;   LAADT CX MET LINKERGRENS
                MOV     DI,1            ;   LAADT KLEURTELLER
                CALL    GETPIX          ;   LEES KLEUR VAN 1e PIXEL VAN REGEL
PUT_WHILE2:     CMP     CX,TEMP+4       ;   ZOLANG LINKERGRENS <= RECHTERGRENS
                JG      PUT_EOL         ;     SPRING INDIEN GROTER
                INC     CX              ;     VERHOOG PIXELTELLER
                MOV     BH,AL           ;     BEWAAR OUDE KLEUR IN BH
                CALL    GETPIX          ;     LEES KLEUR VAN VOLGENDE PIXEL
                CMP     AL,BH           ;     OUDE KLEUR = NIEUWE KLEUR
                JE      PUT_GELIJK      ;     JA, SPRING
                XCHG    AX,DI           ;     NEE, WISSEL AX EN DI
                CALL    BYTE2FILE       ;     NEE, KLEURTELLER NAAR FILE
                MOV     AL,AH
                CALL    BYTE2FILE
                MOV     AL,BH           ;     KLEUR NAAR AL
                CALL    BYTE2FILE       ;     SCHRIJF OOK NAAR FILE
                MOV     AX,DI           ;     KLEURCODE WEER NAAR AL
                MOV     DI,1            ;     RESET KLEURTELLER
                JMP     SHORT PUT_WHILE2;     SPRING NAAR BEGIN VAN LUS
PUT_GELIJK:     INC     DI              ;   VERHOOG KLEURTELLER
                JMP     SHORT PUT_WHILE2;   SPRING NAAR BEGIN VAN LUS
PUT_EOL:        ; EINDE VAN REGEL BEREIKT; DATA ALTIJD NAAR FILE SCHRIJVEN
                XCHG    AX,DI           ;   WISSEL AX EN DI
                CALL    BYTE2FILE       ;   NEE, KLEURTELLER NAAR FILE
                MOV     AL,AH
                CALL    BYTE2FILE
                MOV     AX,DI           ;   KLEURCODE WEER NAAR AL
                CALL    BYTE2FILE       ;   SCHRIJF OOK NAAR FILE
                XOR     AL,AL           ;   SCHRIJF END-OF-LINE NAAR FILE
                CALL    BYTE2FILE
                CALL    BYTE2FILE
                DEC     DX              ;   VERLAAG REGELTELLER
                JMP     PUT_WHILE1      ;   SPRING NAAR BEGIN VAN DE LUS
PUT_END:        XOR     AL,AL           ; GEEF EINDE VAN FILE AAN
                CALL    BYTE2FILE
                CALL    BYTE2FILE
                JMP     LEESCOM         ; EINDE ROUTINE, VOLGEND COMMANDO
; ---------------------------------------------------------------------------
; GETWIN - Leest een grafisch window van file. De file moet van te voren
;          al geopend zijn en de data moeten met behulp van PUTWIN in de
;          file geplaatst zijn. Als parameters worden de coordinaten van de
;          linker onderhoek gegeven en een filehandle. De coordinaten gelden
;          vanaf de logische oorsprong. Er wordt dus rekening gehouden met
;          een verschoven oorsprong.
;          Er wordt bij het plotten geen rekening gehouden met een grafisch
;          venster waar alleen binnen in getekend mag worden.
; ---------------------------------------------------------------------------
GETWIN:         CALL    LEESBYTE        ; LEES X-COORDINATEN
                MOV     CL,AL           ; ZET IN CX REGISTER
                CALL    LEESBYTE
                MOV     CH,AL
                ADD     CX,OORSPRONG_X  ; AANPASSING VERSCHOVEN OORSPRONG
                MOV     SI,CX           ; ZET X-COORDINAAT OOK IN HULPREGISTER
                CALL    LEESBYTE        ; LEES Y-COORDINATEN
                MOV     DL,AL           ; ZET IN DX REGISTER
                CALL    LEESBYTE
                MOV     DH,AL
                ADD     DX,OORSPRONG_Y  ; AANPASSING VERSCHOVEN OORSPRONG
                CALL    LEESBYTE        ; LEES FILE HANDLE
                MOV     BL,AL           ; ZET IN BL REGISTER
                XOR     BH,BH           ; BX IS NU FILEHANDLE
                CALL    RESET_FP        ; ZET FILEPOINTER AAN BEGIN VAN FILE
GET_WHILE1:     CALL    FILE2BYTE       ; LEES KLEURTELLER VAN FILE
                MOV     AH,AL           ;  (eerste kleur van de regel)
                CALL    FILE2BYTE
                XCHG    AL,AH           ; WISSEL HOGE EN LAGE BYTE
                MOV     DI,AX           ; ZET IN DI
                AND     DI,DI           ; IS HET END-OF-FILE ?
                JE      GET_END         ; JA, DAN SPRINGEN
                MOV     CX,SI           ; ZET X-COORDINAAT IN CX
GET_WHILE2:     CALL    FILE2BYTE       ; LEES KLEUR
GETWIN1:        CALL    PUTPIX          ; PLOT PIXEL
                INC     CX              ; VERHOOG X-COORDINAAT
                DEC     DI              ; VERLAAG TELLER
                JNZ     GETWIN1         ; SPRING INDIEN NOG PUNTEN VOLGEN
                CALL    FILE2BYTE       ; LEES VOLGENDE KLEURTELLER
                MOV     AH,AL
                CALL    FILE2BYTE
                XCHG    AH,AL           ; WISSEL HOGE EN LAGE BYTE
                MOV     DI,AX           ; ZET TELLER IN DI
                AND     DI,DI           ; IS HET END-OF-LINE ?
                JNZ     GET_WHILE2      ; NEE, DAN LUS NOGMAALS DOORLOPEN
                DEC     DX              ; VERLAAG Y-COORDINAAT
                JMP     SHORT GET_WHILE1; SPRING NAAR BEGIN VAN LUS
GET_END:        JMP     LEESCOM         ; EINDE ROUTINE
; ---------------------------------------------------------------------------
; BYTE2FILE - Schrijft het byte in AL naar de file met handle BX. Alle
;             registers, behalve het statusregister, blijven bewaard.
; ---------------------------------------------------------------------------
BYTE2FILE       PROC    NEAR
                PUSH    AX              ; SAVE REGISTERS
                PUSH    BX
                PUSH    CX
                PUSH    DX
                MOV     FILEBUFFER,AL   ; ZET DATA IN FILEBUFFER
                MOV     AH,40H          ; DOS FUNCTIE 40H: BESTAND SCHRIJVEN
                XOR     BH,BH           ; HOGE BYTE VAN HANDLE WISSEN
                MOV     CX,1            ; AANTAL TE SCHRIJVEN BYTES
                MOV     DX,OFFSET FILEBUFFER
                INT     21H             ; FUNCTIE UITVOEREN
                POP     DX              ; REGISTERS HERSTELLEN
                POP     CX
                POP     BX
                POP     AX
                RET                     ; EINDE ROUTINE
BYTE2FILE       ENDP
; ---------------------------------------------------------------------------
; FILE2BYTE - Leest een byte uit de file met handle BX in AL. Alle registers
;             behalve AL en het statusregister blijven bewaard.
; ---------------------------------------------------------------------------
FILE2BYTE       PROC    NEAR
                PUSH    CX              ; SAVE REGISTERS
                PUSH    DX
                PUSH    AX
                MOV     DX,OFFSET FILEBUFFER
                MOV     AH,3FH          ; DOS FUNCTIE 3FH: BESTAND LEZEN
                MOV     CX,1            ; AANTAL TE LEZEN BYTES
                INT     21H             ; FUNCTIE UITVOEREN
                POP     AX              ; REGISTERS HERSTELLEN
                POP     DX
                POP     CX
                MOV     AL,FILEBUFFER   ; ZET GELEZEN DATA IN AL
                RET                     ; EINDE ROUTINE
FILE2BYTE       ENDP
; ---------------------------------------------------------------------------
; RESET_FP - Zet de filepointer van de file met handle bx naar het begin
;            van de random acces file.Alle registers blijven bewaard.
; ---------------------------------------------------------------------------
RESET_FP        PROC    NEAR
                PUSH    AX              ; SAVE REGISTERS
                PUSH    CX
                PUSH    DX
                MOV     AX,4200H        ; DOS FUNCTIE 42H: POINTER VERPLAATSEN
                MOV     CX,0000H        ; LOW WORD VAN POINTER
                MOV     DX,0010H        ; HIGH WORD VAN POINTER
                INT     21H             ; VOER FUNCTIE UIT
                POP     DX              ; HERSTEL REGISTERS
                POP     CX
                POP     AX
                RET                     ; EINDE ROUTINE
RESET_FP        ENDP
; ---------------------------------------------------------------------------
; SHAPES - leest een sub-commando nummer en voert vervolgens de functie uit.
;   subfunctie 00: teken een cirkel
;   subfunctie 01: teken een cirkel en vul deze
;   subfunctie 02: teken een rechthoek
;   subfunctie 03: teken een rechthoek en vul deze
;   subfunctie 04: teken een driehoek
;   subfunctie 05: teken een driehoek en vul deze
;   subfunctie 06: zet lijn patroon
;   subfunctie 07: teken een rechte lijn
;   subfunctie 08: opvragen huidige schermkleur/attribuut
;   subfunctie 09: opvragen geldigheid van video mode
;   subfunctie 10: and/exor patroon zetten
;   subfunctie 11: schrijf karakter (atomic windows)
;   subfunctie 12: teken blok (atomic windows)
;   subfunctie 13: teken kader (atomic windows)
;   subfunctie 14: teken focus (atomic windows)
; ---------------------------------------------------------------------------
SHAPES:         CALL    LEESBYTE        ; LEES SUBFUNCTIE NUMMER
                CMP     AL,14           ; TEST OP GELDIGE FUNCTIE
                JLE     SHAPES1         ; SPRING INDIEN GELDIG
                MOV     FUN_CODE,AL     ; ZET AL IN WERKRUIMTE
                JMP     ERROR           ; GEEF FOUTMELDING EN BEEINDIG ROUTINE
SHAPES1:        MOV     AH,0            ; MAAK HOGE BYTE AX 0
                SHL     AX,1            ; MAAK ER EEN WORD POINTER VAN
                MOV     BX,AX           ; ZET TABEL OFFSET IN BASE REGISTER
                CMP     CLEAR4MUIS,1    ; TEST OF MUIS AANSTAAT
                JNE     SHAPES2         ; SPRING BIJ GEEN MUIS
                PUSH    BX              ; SAVE BX REGISTER
                CALL    MUISUIT         ; ZET MUIS FF UIT
                MOV     CLEAR4MUIS,1    ; ANDERS KOMT MUIS NIET MEER TERUG
                POP     BX              ; HERSTEL BX REGISTER
SHAPES2:        JMP     WORD PTR SHAPETAB[BX]  ; SPRING NAAR SUBFUNCTIE
SHAPE_END:      CMP     CLEAR4MUIS,1    ; TEST OF MUIS WEER AAN MOET
                JNE     SHAPES3         ; SPRING BIJ GEEN MUIS
                CALL    MUISAAN         ; ZET MUIS WEER AAN
SHAPES3:        JMP     LEESCOM         ; EINDE ROUTINE
SHAPETAB:       DW      CIRCLE, CIRCLE_F, BLOCK, BLOCK_F
                DW      DRIEHOEK, DRIEHOEK_F, SET_LINE_STYLE
                DW      DRAWLINE, WHATCOL, VALID_MODE, PIXANDXOR
                DW      AWSPRITE, AWBLOCK, AWKADER, AWFOCUS
; ---------------------------------------------------------------------------
; CIRCLE - tekent een cirkel. Als parameters worden gegeven de x en y
;          coordinaten en de straal. Er wordt rekening gehouden met een
;          verschoven oorsprong en een grafisch venster.
;          De cirkel-routine wordt berekend volgens het Bressenham-
;          algoritme (zie AN7-1).
; ---------------------------------------------------------------------------
CIRCLE_F:       MOV     DI,0            ; RESET POINTER/TELLER
                MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE
                JMP     SHORT CIRCLE1   ; SPRING ALTIJD
CIRCLE:         MOV     DI,0            ; RESET POINTER/TELLER
                MOV     BYTE PTR TEMP[8],0
CIRCLE1:        CALL    LEESBYTE        ; LEES COORDINATEN EN STRAAL
                MOV     BYTE PTR TEMP[DI],AL
                INC     DI              ; VERHOOG TELLER/POINTER
                CMP     DI,6            ; ALLE PARAMETERS GELEZEN?
                JNE     CIRCLE1         ; NEE, DAN VOLGENDE LEZEN
_CIRCLE:        MOV     CX,0            ; X=0 , cx=x-coordinaat
                MOV     DX,TEMP+4       ; Y=STRAAL , dx=y-coordinaat
                MOV     AX,DX           ; S=1-2*R , ax=hulpvariabele , bx = S
                SHL     AX,1
                MOV     BX,1
                SUB     BX,AX
DO_CIRCLE:      CALL    SETPOINTS       ; DO TEKEN DE PUNTEN
                MOV     AX,CX           ;   S=S+4*X+2
                SHL     AX,1
                SHL     AX,1
                ADD     BX,AX
                ADD     BX,2
                INC     CX              ;   X=X+1
                CMP     BX,0            ;   IF S>0
                JLE     UNTIL_CIRCLE
                MOV     AX,DX           ;   THEN S=S-4*Y+4
                SHL     AX,1
                SHL     AX,1
                SUB     BX,AX
                ADD     BX,4
                DEC     DX              ;   Y=Y-1
UNTIL_CIRCLE:   CMP     CX,DX           ; UNTIL X>Y
                JLE     DO_CIRCLE
                JMP     SHAPE_END       ; EINDE ROUTINE, VOLGEND COMMANDO
SETPOINTS       PROC    NEAR            ; TEKENT DE PUNTEN VOOR CIRCLE
                PUSH    AX              ; SAVE REGISTERS
                PUSH    BX
                PUSH    CX
                PUSH    DX
                MOV     TEMP[10],CX     ; ZET X EN Y IN HULPREGISTERS
                MOV     TEMP[12],DX
                ADD     CX,TEMP         ; PLOT P+X,Q+Y
                ADD     DX,TEMP+2
                MOV     DI,CX           ; ZET EINDPUNT IN DI
                INC     DI
                MOV     CX,TEMP         ; PLOT P-X,Q+Y
                SUB     CX,TEMP[10]
                MOV     SI,CX
                CALL    _LINE
                MOV     DX,TEMP+2       ; PLOT P-X,Q-Y
                SUB     DX,TEMP[12]
                MOV     CX,TEMP         ; PLOT P+X,Q-Y
                ADD     CX,TEMP[10]
                MOV     DI,CX
                INC     DI
                CALL    _LINE
                MOV     CX,TEMP         ; PLOT P+Y,Q-X
                ADD     CX,TEMP[12]
                MOV     DI,CX
                INC     DI
                MOV     DX,TEMP+2
                SUB     DX,TEMP[10]
                MOV     CX,TEMP         ; PLOT P-Y,Q-X
                SUB     CX,TEMP[12]
                MOV     SI,CX
                CALL    _LINE
                MOV     DX,TEMP+2       ; PLOT P-Y,Q+X
                ADD     DX,TEMP[10]
                MOV     CX,TEMP         ; PLOT P+Y,Q+X
                ADD     CX,TEMP[12]
                MOV     DI,CX
                INC     DI
                CALL    _LINE
ENDPOINT:       POP     DX              ; REGISTERS HERSTELLEN
                POP     CX
                POP     BX
                POP     AX
                RET                     ; EINDE ROUTINE
SETPOINTS       ENDP
_LINE           PROC    NEAR
                MOV     CX,SI           ; LAADT CX MET Xmin
_LINE_D:        CMP     BYTE PTR TEMP[8],1 ; TEST OP VULLEN
                JE      _LINE_P         ; BIJ VULLEN ALLE PIXELS ZETTEN
                CMP     CX,SI           ; ANDERS ALLEEN PIXEL ZETTEN OP Xmin
                JE      _LINE_P
                CMP     CX,DI           ; EN OP Xmax
                JE      _LINE_P
                MOV     CX,DI           ; X-COORDINAAT VERHOGEN TOT Xmax
                DEC     CX
_LINE_P:        CALL    _PIXEL          ; ZET HET PIXEL
                INC     CX              ; VERHOOG X-COORDINAAT
                CMP     CX,DI           ; TEST OP Xmax
                JNE     _LINE_D         ; SPRING INDIEN NOG PUNTEN VOLGEN
                RET
_LINE           ENDP
_PIXEL          PROC    NEAR
                CMP     BBC,1           ; TEST OP BBC MODE
                JNE     ATOMPIXEL       ; SPRING BIJ ATOM MODE
                JMP     BBCPIXEL        ; DE (G)ROUTE IN BBC MODE
ATOMPIXEL:      PUSH    CX              ; BEWAAR COORDINATEN
                PUSH    DX
                ROL     LINE_STYLE,1    ; TEST OF PIXEL GEZET MOET WORDEN
                JNC     _PIXEND         ; NEE, DAN HELE ROUTINE OVERSLAAN
                ADD     CX,OORSPRONG_X  ; REKEN VERSCHUIVING VAN OORSPRONG MEE
                ADD     DX,OORSPRONG_Y
                CMP     CX,GWINDOW_XLO  ; TEST OF X BINNEN VENSTER VALT
                JB      _PIXEND         ; NEE, DAN GEEN PIXEL PLOTTEN
                CMP     CX,GWINDOW_XRB
                JA      _PIXEND
                CMP     DX,GWINDOW_YRB  ; TEST OF Y BINNEN VENSTER VALT
                JB      _PIXEND         ; NEE, DAN GEEN PIXEL PLOTTEN
                CMP     DX,GWINDOW_YLO
                JA      _PIXEND
                CMP     KLEUR_EO,0      ; AND/XOR AANWEZIGE PIXEL MET KLEUR?
                JE      PIXEL_SET       ; NEE, DAN ABSOLUTE KLEUR ZETTEN
                CALL    GETPIX          ; LEES PIXELKLEUR
                AND     AL,BYTE PTR KLEUR_EO    ; AND PIXEL MET PARAMETER
                XOR     AL,BYTE PTR KLEUR_EO+1  ; XOR PIXEL MET PARAMETER
                JMP     SHORT PIXEL_SET1        ; SPRING ALTIJD
PIXEL_SET:      MOV     AL,KLEUR        ; LAADT KLEUR
PIXEL_SET1:     CALL    PUTPIX          ; PLOT PIXEL
_PIXEND:        POP     DX              ; HAAL COORDINATEN TERUG
                POP     CX
                RET                     ; EINDE SUBROUTINE
_PIXEL          ENDP
                    
BLOCK_F:        MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE
                JMP     SHORT BLOCK0    ; SPRING ALTIJD
BLOCK:          MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE
BLOCK0:         CALL    LEESBYTE        ; LEES PARAMETERS VAN ATOM
                MOV     AH,AL           ; ZET LOW BYTE IN AH
                CALL    LEESBYTE
                XCHG    AH,AL           ; WISSEL LOW EN HIGH BYTE
                MOV     TEMP[0],AX
                CALL    LEESBYTE        ; LEES PARAMETERS VAN ATOM
                MOV     AH,AL           ; ZET LOW BYTE IN AH
                CALL    LEESBYTE
                XCHG    AH,AL           ; WISSEL LOW EN HIGH BYTE
                MOV     TEMP[2],AX
                CALL    LEESBYTE        ; LEES PARAMETERS VAN ATOM
                MOV     AH,AL           ; ZET LOW BYTE IN AH
                CALL    LEESBYTE
                XCHG    AH,AL           ; WISSEL LOW EN HIGH BYTE
                MOV     TEMP[4],AX
                CALL    LEESBYTE        ; LEES PARAMETERS VAN ATOM
                MOV     AH,AL           ; ZET LOW BYTE IN AH
                CALL    LEESBYTE
                XCHG    AH,AL           ; WISSEL LOW EN HIGH BYTE
                MOV     TEMP[6],AX
_BLOCK:         CALL    DRAW_BLOCK      ; TEKEN DE RECHTHOEK
                JMP     SHAPE_END       ; EINDE ROUTINE
DRAW_BLOCK:     INC     TEMP[2]         ; VERHOOG EINDCOORDINATEN MET 1
                INC     TEMP[4]
                MOV     DX,TEMP[6]      ; LAADT Y-COORDINAAT
                MOV     DI,TEMP[2]      ; LAADT DI MET MAX_Y-1
                DEC     DI
BLOCK_Y:        MOV     CX,TEMP[0]      ; LAADT X-COORDINAAT
BLOCK_X:        CMP     BYTE PTR TEMP[8],1 ; TEST OP VULLEN
                JE      BLOCK_P         ; BIJ VULLEN ALTIJD PIXEL ZETTEN
                CMP     CX,TEMP[0]      ; TEST OP RAND VAN RECHTHOEK
                JE      BLOCK_P         ; PUNT OP DE RAND MOET GEZET WORDEN
                CMP     CX,TEMP[4]
                JE      BLOCK_P
                CMP     DX,DI
                JE      BLOCK_P
                CMP     DX,TEMP[6]
                JE      BLOCK_P
                MOV     CX,TEMP[4]      ; INDIEN NIET OP RAND
                DEC     CX              ;    X LADEN MET EINDCOORDINAAT
BLOCK_P:        CALL    _PIXEL          ; KLEUR PIXEL
                INC     CX              ; VERHOOG X-COORDINAAT
                CMP     CX,TEMP[4]      ; VERGELIJK MET EINDCOORDINAAT
                JNE     BLOCK_X         ; SPRING INDIEN NIET EINDPUNT
                INC     DX              ; VOLGENDE REGEL: VERHOOG Y-COORDINAAT
                CMP     DX,TEMP[2]      ; VERGELIJK MET EINDCOORDINAAT
                JNE     BLOCK_Y         ; SPRING INDIEN NIET EINDPUNT
                RET                     ; EINDE DRAW_BLOCK ROUTINE
HFILL:          CALL    LEESBYTE        ; LEES COORDINATEN
                MOV     CL,AL
                CALL    LEESBYTE
                MOV     CH,AL
                CALL    LEESBYTE
                MOV     DL,AL
                CALL    LEESBYTE
                MOV     DH,AL
                CALL    LEESBYTE        ; LEES GRENSKLEUR
                MOV     BL,AL           ; ZET GRENSKLEUR IN BL
                ADD     CX,OORSPRONG_X  ; PAS COORDINATEN AAN
                ADD     DX,OORSPRONG_Y  ;   AAN EV. VERSCHOVEN OORSPRONG
                CALL    _HFILL_R        ; SPRING NAAR KLEURROUTINE
                JMP     SHAPE_END       ; GA VOLGEND COMMANDO LEZEN
_HFILL_R        PROC    NEAR
                CMP     DX,GWINDOW_YLO  ; TEST OF Y-COORDINAAT IN VENSTER IS
                JA      HFILL_END_E     ; SPRING INDIEN ONDER ONDERGRENS
                CMP     DX,GWINDOW_YRB
                JB      HFILL_END_E     ; SPRING INDIEN BOVEN BOVENGRENS
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                PUSH    CX              ; BEWAAR X-COORDINAAT
HFILL_R:        CMP     CX,GWINDOW_XRB  ; TEST OP GRENS VAN GRAFISCH VENSTER
                JA      HFILL_L         ; SPRING INDIEN BOVEN RECHTERGRENS
;                MOV     AH,0DH
;                INT     10H             ; VRAAG KLEUR VAN PIXEL OP
                CALL    GETPIX          ; VRAAG KLEUR VAN PIXEL OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JE      HFILL_L         ; SPRING INDIEN RECHTER GRENS BEREIKT
                CMP     FUN_CODE,0      ; TEST OF SOLID OF PATTERN
                JE      HFILL_R1        ; SPRING INDIEN SOLID
                MOV     AX,CX           ; BEREKEN PIXEL OFFSET IN PATROON
                AND     AX,000FH        ;   d.i. CX%16+16*(DX%16)
                MOV     SI,DX
                AND     SI,000FH
                SHL     SI,1
                SHL     SI,1
                SHL     SI,1
                SHL     SI,1
                ADD     SI,AX
                MOV     AL,BP[SI]       ; LAADT PIXELKLEUR
                JMP     SHORT HFILL_R2  ; SPRING OM PIXEL TE PLOTTEN
HFILL_R1:       MOV     AL,KLEUR        ; LAADT KLEURNUMMER
HFILL_R2:       ;MOV     AH,0CH
                ;INT     10H             ; KLEUR PIXEL
                CALL    PUTPIX          ; KLEUR PIXEL
                INC     CX              ; VERHOOG X COORDINAAT, 1 PUNT RECHTS
                JMP     SHORT HFILL_R   ; SPRING VOOR VOLGEND PIXEL
HFILL_L:        MOV     TEMP[0],CX      ; BERG RECHTERGRENS OP IN WERKRUIMTE
                POP     CX              ; HAAL BEGINPUNT TERUG
                DEC     CX              ; EEN POSITIE NAAR LINKS
HFILL_L1:       CMP     CX,GWINDOW_XLO  ; TEST OP GRENS VAN GRAFISCH VENSTER
                JB      HFILL_END       ; SPRING INDIEN ONDER LINKERGRENS
;                MOV     AH,0DH
;                INT     10H             ; VRAAG KLEUR VAN PIXEL OP
                CALL    GETPIX          ; VRAAG KLEUR VAN PIXEL OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JE      HFILL_END       ; SPRING INDIEN RECHTER GRENS BEREIKT
                CMP     FUN_CODE,0      ; TEST OF SOLID OF PATTERN
                JE      HFILL_L2        ; SPRING INDIEN SOLID
                MOV     AX,CX           ; BEREKEN PIXEL OFFSET IN PATROON
                AND     AX,000FH        ;   d.i. CX%16+16*(DX%16)
                MOV     SI,DX
                AND     SI,000FH
                SHL     SI,1
                SHL     SI,1
                SHL     SI,1
                SHL     SI,1
                ADD     SI,AX
                MOV     AL,BP[SI]       ; LAADT PIXELKLEUR
                JMP     SHORT HFILL_L3  ; SPRING OM PIXEL TE PLOTTEN
HFILL_L2:       MOV     AL,KLEUR        ; LAADT KLEURNUMMER
HFILL_L3:       ;MOV     AH,0CH
                ;INT     10H             ; KLEUR PIXEL
                CALL    PUTPIX          ; KLEUR PIXEL
                DEC     CX              ; VERLAAG X COORDINAAT, 1 PUNT LINKS
                JMP     SHORT HFILL_L1  ; SPRING VOOR VOLGEND PIXEL
HFILL_END_E:    STC                     ; ZET CARRY -> Y LIGT BUITEN WINDOW
                RET
HFILL_END:      MOV     TEMP[2],CX      ; BERG LINKERGRENS OP IN WERKRUIMTE
                CLC                     ; WIS CARRY -> LIJN IS GEKLEURD
                RET                     ; EINDE ROUTINE
_HFILL_R        ENDP
VFILL:          CALL    LEESBYTE        ; LEES COORDINATEN
                MOV     CL,AL
                CALL    LEESBYTE
                MOV     CH,AL
                CALL    LEESBYTE
                MOV     DL,AL
                CALL    LEESBYTE
                MOV     DH,AL
                CALL    LEESBYTE        ; LEES GRENSKLEUR
                MOV     BL,AL           ; ZET GRENSKLEUR IN BL
                ADD     CX,OORSPRONG_X  ; PAS COORDINATEN AAN
                ADD     DX,OORSPRONG_Y  ;   AAN EV. VERSCHOVEN OORSPRONG
                CMP     CX,GWINDOW_XRB  ; TEST OF X-COORDINAAT IN VENSTER IS
                JA      HFILL_END       ; SPRING INDIEN OVER RECHTERGRENS
                CMP     CX,GWINDOW_XLO
                JB      HFILL_END       ; SPRING INDIEN ONDER LINKERGRENS
                MOV     BH,SCHERMPAG    ; LAADT SCHERMPAGINA NUMMER
                PUSH    DX              ; BEWAAR Y-COORDINAAT
VFILL_U:        CMP     DX,GWINDOW_YLO  ; TEST OF GRENS VAN VENSTER BEREIKT
                JA      VFILL_D         ; SPRING INDIEN OVER ONDERGRENS
;                MOV     AH,0DH
;                INT     10H             ; VRAAG KLEUR VAN PIXEL OP
                CALL    GETPIX          ; VRAAG KLEUR VAN PIXEL OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JE      VFILL_D         ; SPRING INDIEN ONDER GRENS BEREIKT
                MOV     AL,KLEUR        ; LAADT KLEURNUMMER
;                MOV     AH,0CH
;                INT     10H             ; KLEUR PIXEL
                CALL    PUTPIX          ; KLEUR PIXEL
                INC     DX              ; VERHOOG Y COORDINAAT, 1 PUNT OMLAAG
                JMP     SHORT VFILL_U   ; SPRING VOOR VOLGEND PIXEL
VFILL_D:        POP     DX              ; HAAL BEGINPUNT TERUG
                DEC     DX              ; EEN POSITIE OMHOOG
VFILL_D1:       CMP     DX,GWINDOW_YRB  ; TEST OF GRENS VAN VENSTER BEREIKT
                JB      VFILL_END       ; SPRING INDIEN OVER BOVENGRENS
;                MOV     AH,0DH
;                INT     10H             ; VRAAG KLEUR VAN PIXEL OP
                CALL    GETPIX          ; VRAAG KLEUR VAN PIXEL OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JE      VFILL_END       ; SPRING INDIEN BOVEN GRENS BEREIKT
                MOV     AL,KLEUR        ; LAADT KLEURNUMMER
;                MOV     AH,0CH
;                INT     10H             ; KLEUR PIXEL
                CALL    PUTPIX          ; KLEUR PIXEL
                DEC     DX              ; VERLAAG Y COORDINAAT, 1 PUNT OMHOOG
                JMP     SHORT VFILL_D1  ; SPRING VOOR VOLGEND PIXEL
VFILL_END:      JMP     SHAPE_END       ; EINDE ROUTINE
DRAWLINE:       XOR     DI,DI           ; RESET POINTER
DRAWL_1:        CALL    LEESBYTE        ; LEES LOW BYTE VAN COORDINAAT
                MOV     AH,AL           ; ZET IN AH
                CALL    LEESBYTE        ; LEES HIGH BYTE VAN COORDINAAT
                XCHG    AH,AL           ; WISSEL AH EN AL
                MOV     TEMP[DI],AX     ; ZET IN WERKRUIMTE
                INC     DI              ; VERHOOG POINTER
                INC     DI
                CMP     DI,8            ; ALLE COORDINATEN GELEZEN ?
                JNE     DRAWL_1         ; NEE, DAN VOLGENDE LEZEN
                CALL    _DRAW           ; TEKEN DE LIJN
                JMP     SHAPE_END       ; EINDE ROUTINE
_DRAW           PROC    NEAR
                MOV     AX,TEMP[4]      ; BEREKEN X_EIND - X_BEGIN
                SUB     AX,TEMP[0]
                MOV     BYTE PTR TEMP[14],AH ; ZET TEKEN IN X_SIGN
                CMP     AX,0            ; TEST OP POSITIEF OF NEGATIEF
                JNL     DRAWL_2         ; SPRING INDIEN POSITIEF
                NEG     AX              ; MAAK POSITIEF
DRAWL_2:        MOV     TEMP[10],AX     ; BERG OP IN LENGTE_X
                MOV     BX,TEMP[6]      ; BEREKEN Y_EIND - Y_BEGIN
                SUB     BX,TEMP[2]
                MOV     BYTE PTR TEMP[15],BH ; ZET TEKEN IN Y_SIGN
                CMP     BX,0            ; TEST OP POSITIEF OF NEGATIEF
                JNL     DRAWL_3         ; SPRING INDIEN POSITIEF
                NEG     BX              ; MAAK POSITIEF
DRAWL_3:        MOV     TEMP[12],BX     ; BERG OP IN LENGTE_Y
                CMP     BX,AX           ; BEREKEN LENGTE_Y - LENGTE_X
                JNG     DRAWL_X         ; SPRING INDIEN LENGTE_X GROTER IS
DRAWL_Y:        MOV     BX,TEMP[12]
                NEG     BX              ; BEREKEN -LENGTE_Y / 2
                SAR     BX,1
                MOV     TEMP[8],BX      ; ZET RESULTAAT IN E_TERM
DRAWL_4:        MOV     CX,TEMP[0]      ; LAADT COORDINATEN
                MOV     DX,TEMP[2]
                CALL    _PIXEL          ; ZET PUNT OP HET SCHERM
                CMP     DX,TEMP[6]      ; TEST OF EINDPUNT GETEKEND IS
                JE      DRAWL_END       ; JA, DAN NAAR EINDE ROUTINE
                CALL    DRAWL_UPD_Y     ; PAS E_TERM AAN
                CMP     TEMP[8],0       ; TEST TEKEN VAN E_TERM
                JNG     DRAWL_4         ; SPRING INDIEN GEEN AANPASSING X
                CALL    DRAWL_UPD_X     ; PAS X-COORDINAAT AAN
                JMP     SHORT DRAWL_4   ; PLOT DE VOLGENDE COORDINAAT
DRAWL_X:        MOV     AX,TEMP[10]
                SAR     AX,1            ; BEREKEN LENGTE_X / 2
                MOV     TEMP[8],AX      ; ZET RESULTAAT IN E_TERM
DRAWL_5:        MOV     CX,TEMP[0]      ; LAADT COORDINATEN
                MOV     DX,TEMP[2]
                CALL    _PIXEL          ; ZET PUNT OP HET SCHERM
                CMP     CX,TEMP[4]      ; TEST OF EINDPUNT GETEKEND IS
                JE      DRAWL_END       ; JA, DAN NAAR EINDE ROUTINE
                CALL    DRAWL_UPD_X     ; PAS E_TERM AAN
                CMP     TEMP[8],0       ; TEST TEKEN VAN E_TERM
                JGE     DRAWL_5         ; SPRING INDIEN GEEN AANPASSING Y
                CALL    DRAWL_UPD_Y     ; PAS Y-COORDINAAT AAN
                JMP     SHORT DRAWL_5   ; PLOT DE VOLGENDE COORDINAAT
DRAWL_END:      RET                     ; EINDE ROUTINE
_DRAW           ENDP
DRAWL_UPD_X:    MOV     AX,TEMP[8]      ; BEREKEN E_TERM - LENGTE_Y
                SUB     AX,TEMP[12]
                MOV     TEMP[8],AX      ; ZET RESULTAAT TERUG IN E_TERM
_UPD_X:         MOV     AX,TEMP[0]      ; ZET X_BEGIN IN HULPREGISTER
                CMP     BYTE PTR TEMP[14],0 ; TEST POS OF NEG PLOTTEN
                JGE     DRAWL_UPD_X1    ; SPRING INDIEN POSITIEF
                SUB     AX,1            ; X_BEGIN := X_BEGIN - 1
                JMP     SHORT DRAWL_UPD_X2
DRAWL_UPD_X1:   ADD     AX,1            ; X_BEGIN := X_BEGIN + 1
DRAWL_UPD_X2:   MOV     TEMP[0],AX      ; BERG RESULTAAT WEER OP
                RET                     ; EINDE SUBROUTINE
DRAWL_UPD_Y:    MOV     AX,TEMP[8]      ; BEREKEN E_TERM + LENGTE_X
                ADD     AX,TEMP[10]
                MOV     TEMP[8],AX      ; ZET RESULTAAT TERUG IN E_TERM
_UPD_Y:         MOV     AX,TEMP[2]      ; ZET Y_BEGIN IN HULPREGISTER
                CMP     BYTE PTR TEMP[15],0
                JGE     DRAWL_UPD_Y1    ; SPRING INDIEN POSITIEF
                SUB     AX,1            ; Y_BEGIN := Y_BEGIN - 1
                JMP     SHORT DRAWL_UPD_Y2
DRAWL_UPD_Y1:   ADD     AX,1            ; Y_BEGIN := Y_BEGIN + 1
DRAWL_UPD_Y2:   MOV     TEMP[2],AX      ; BERG RESULTAAT WEER OP
                RET                     ; EINDE SUBROUTINE
SET_LINE_STYLE: CALL    LEESBYTE        ; LEES LAGE BYTE
                MOV     AH,AL           ; ZET IN AH
                CALL    LEESBYTE        ; LEES HOGE BYTE
                XCHG    AH,AL           ; WISSEL AH EN AL OM
                MOV     LINE_STYLE,AX   ; BERG STIJL OP
                JMP     SHAPE_END       ; EINDE COMMANDO
DRIEHOEK_F:     MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE
                JMP     SHORT DRIEHOEK0 ; GEDWONGEN SPRONG
DRIEHOEK:       MOV     BYTE PTR TEMP[31],0 ; ZET FILL MODE
DRIEHOEK0:      MOV     DI,16           ; LAADT INDEX REGISTER
DRIEHOEK1:      CALL    LEESBYTE        ; LEES COORDINAAT VAN HOEKPUNT
                MOV     BL,AL           ; ZET IN HULPREGISTER
                CALL    LEESBYTE
                MOV     BH,AL
                MOV     TEMP[DI],BX     ; BERG OP IN WERKRUIMTE
                INC     DI              ; VERHOOG INDEX
                INC     DI
                CMP     DI,28           ; TEST OP DRIE COORDINATEN
                JNE     DRIEHOEK1
_DRIEHOEK:      MOV     AX,LINE_STYLE   ; BEWAAR LIJN STIJL OP STACK
                PUSH    AX
                MOV     LINE_STYLE,0FFFFH
                MOV     AX,TEMP[16]     ; ZET X-COORDINAAT BEGINPUNT
                MOV     TEMP[0],AX
                MOV     AX,TEMP[18]     ; ZET Y-COORDINAAT BEGINPUNT
                MOV     TEMP[2],AX
                MOV     AX,TEMP[20]     ; ZET X-COORDINAAT EINDPUNT
                MOV     TEMP[4],AX
                MOV     AX,TEMP[22]     ; ZET Y-COORDINAAT EINDPUNT
                MOV     TEMP[6],AX
                CALL    _DRAW           ; TEKEN EERSTE LIJN
                MOV     AX,TEMP[20]     ; ZET X-COORDINAAT BEGINPUNT
                MOV     TEMP[0],AX
                MOV     AX,TEMP[22]     ; ZET Y-COORDINAAT BEGINPUNT
                MOV     TEMP[2],AX
                MOV     AX,TEMP[24]     ; ZET X-COORDINAAT EINDPUNT
                MOV     TEMP[4],AX
                MOV     AX,TEMP[26]     ; ZET Y-COORDINAAT EINDPUNT
                MOV     TEMP[6],AX
                CALL    _DRAW           ; TEKEN TWEEDE LIJN
                MOV     AX,TEMP[24]     ; ZET X-COORDINAAT BEGINPUNT
                MOV     TEMP[0],AX
                MOV     AX,TEMP[26]     ; ZET Y-COORDINAAT BEGINPUNT
                MOV     TEMP[2],AX
                MOV     AX,TEMP[16]     ; ZET X-COORDINAAT EINDPUNT
                MOV     TEMP[4],AX
                MOV     AX,TEMP[18]     ; ZET Y-COORDINAAT EINDPUNT
                MOV     TEMP[6],AX
                CALL    _DRAW           ; TEKEN DERDE LIJN
                POP     AX              ; HERSTEL LIJN STIJL
                MOV     LINE_STYLE,AX
                CMP     BYTE PTR TEMP[31],1  ; TEST OP VULLEN
                JNE     DRIE_EIND       ; SPRING INDIEN NIET VULLEN
                MOV     CX,TEMP[16]     ; BEREKEN X-COORDINAAT VUL PUNT
                SHL     CX,1
                ADD     CX,TEMP[20]
                ADD     CX,TEMP[24]
                SAR     CX,1
                SAR     CX,1
                MOV     DX,TEMP[18]     ; BEREKEN Y-COORDINAAT VUL PUNT
                SHL     DX,1
                ADD     DX,TEMP[22]
                ADD     DX,TEMP[26]
                SAR     DX,1
                SAR     DX,1
                MOV     AL,KLEUR        ; LAADT AL MET GRENSKLEUR
                JMP     _PAINT_COL      ; GA LEKKER INKLEUREN
DRIE_EIND:      JMP     SHAPE_END       ; EINDE INDIEN NIET VULLEN
WHATCOL:        MOV     AL,KLEUR        ; LEES HUIDIGE KLEURNUMMER
                CALL    ZENDBYTE        ; STUUR NAAR ATOM
                JMP     SHAPE_END       ; DAT IS ALLES
VALID_MODE:     CALL    LEESBYTE        ; LEES TE TESTEN MODE
                CMP     AL,32           ; VANAF CLEAR 32 ONGELDIG
                JB      VALID_MOD1
                MOV     AL,0FFH         ; GEEFT ALTIJD ONGELDIGE MODE
                JMP     SHORT VALID_MOD2; SPRING ALTIJD
VALID_MOD1:     XOR     AH,AH           ; AH := 0
                SHL     AX,1            ; WORD POINTER MAKEN
                MOV     SI,AX           ; ZET POINTER
                MOV     AX,VIDEOTABEL[SI] ; LEES WAARDE UIT TABEL
VALID_MOD2:     CALL    ZENDBYTE        ; ZEND NAAR ATOM (#ff is dus ongeldig)
                JMP     SHAPE_END       ; EINDE OEFENING
PAINT:          CALL    LEESBYTE        ; LEES SUBFUNCTIE
                MOV     FUN_CODE,AL     ; ZET FUNCTIE IN WERKRUIMTE
                CMP     AL,65           ; TEST OP KLEUR OF PATROON
                JB      PAINT_COL       ; INDIEN KLEUREN DAN SPRINGEN
                CMP     AL,0FFH         ; TEST OP PATROON DEFINIEREN
                JNE     PAINT1
                JMP     PAINT_DEF       ; GA PATROON LEZEN
PAINT1:         CMP     AL,0FEH         ; TEST OP PATROON SCHRIJVEN NAAR DISK
                JNE     PAINT2
                JMP     PAINT_SAVE
PAINT2:         CMP     AL,0FDH         ; TEST OP PATROON LEZEN VAN DISK
                JNE     PAINT_ERROR
                JMP     PAINT_LOAD
PAINT_ERROR:    JMP     ERROR           ; OVERIGE FUNCTIES BESTAAN NIET
PAINT_COL:      DEC     AL              ; VERLAAG COMMANDO NUMMER
                AND     AL,00111111B    ; MASKEER HOOGSTE TWEE BITS
                MOV     AH,AL           ; AH := HOGE BYTE OFFSET PATROONADRES
                XOR     AL,AL           ; AL := LAGE BYTE OFFSET PATROONADRES
                LEA     BP,PATTERNS     ; LAADT BP MET BASISADRES PATRONEN
                ADD     BP,AX           ; BP := BEGINADRES GEKOZEN PATROON
                CALL    LEESBYTE        ; LEES COORDINATEN
                MOV     CL,AL
                CALL    LEESBYTE
                MOV     CH,AL
                CALL    LEESBYTE
                MOV     DL,AL
                CALL    LEESBYTE
                MOV     DH,AL
                CALL    LEESBYTE        ; LEES GRENSKLEUR
_PAINT_COL:     MOV     BL,AL           ; ZET GRENSKLEUR IN BL
                ADD     CX,OORSPRONG_X  ; PAS COORDINATEN AAN
                ADD     DX,OORSPRONG_Y  ;   AAN EV. VERSCHOVEN OORSPRONG
                PUSH    CX              ; BEWAAR BEGINPUNTEN OP STACK
                PUSH    DX
PAINT_COL1:     CALL    _HFILL_R        ; KLEUR LIJN
                JC      PAINT_COL2      ; SPRING INDIEN BUITEN HET WINDOW
                MOV     CX,TEMP[0]      ; BEREKEN MIDDEN VAN GRENSPUNTEN
                ADD     CX,TEMP[2]
                SHR     CX,1
                INC     DX              ; VERHOOG Y-COORDINAAT
;                MOV     AH,0DH          ; VRAAG PIXELKLEUR OP
;                INT     10H
                CALL    GETPIX          ; VRAAG PIXELKLEUR OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JNE     PAINT_COL1      ; GA VOLGENDE LIJN KLEUREN
PAINT_COL2:     POP     DX              ; HAAL BEGINPUNTEN TERUG
                POP     CX
                DEC     DX              ; VERLAAG Y-COORDINAAT
PAINT_COL3:     CALL    _HFILL_R        ; KLEUR LIJN
                JC      PAINT_COL4      ; SPRING INDIEN BUITEN HET WINDOW
                MOV     CX,TEMP[0]      ; BEREKEN MIDDEN VAN GRENSPUNTEN
                ADD     CX,TEMP[2]
                SHR     CX,1
                DEC     DX              ; VERLAAG Y-COORDINAAT
;                MOV     AH,0DH          ; VRAAG PIXELKLEUR OP
;                INT     10H
                CALL    GETPIX          ; VRAAG PIXELKLEUR OP
                CMP     AL,BL           ; TEST OP GRENSKLEUR
                JNE     PAINT_COL3      ; GA VOLGENDE LIJN KLEUREN
PAINT_COL4:     MOV     FUN_CODE,0      ; RESET FUN_CODE
                JMP     SHAPE_END       ; EINDE COMMANDO
PAINT_DEF:      LEA     BP,PATTERNS     ; LAADT BASISADRES VAN PATRONEN
                CALL    LEESBYTE        ; LEES PATROONNUMMER
                DEC     AL              ; VERLAAG PATROONNUMMER
                AND     AL,00111111B    ; MASKEER HOOGSTE TWEE BITS
                MOV     AH,AL           ; AH := HOGE BYTE OFFSET
                XOR     AL,AL           ; AL := LAGE BYTE OFFSET
                ADD     BP,AX           ; BP := BEGINADRES VAN PATROON
                MOV     CX,256          ; LAADT CX ALS TELLER
PAINT_DEF1:     CALL    LEESBYTE        ; LEES DATA
                MOV     [BP],AL         ; ZET DATA IN PATROON-OPSLAG
                INC     BP              ; VERHOOG POINTER
                LOOP    PAINT_DEF1      ; DOE DIT VOOR 256 PIXELS
                JMP     SHAPE_END       ; EINDE COMMANDO
PAINT_LOAD:     CALL    LEESNAAM        ; ZET FILENAAM IN BUFFER
                LEA     DX,FILEBUFFER   ; LAADT POINTER NAAR FILENAAM
                MOV     AX,3D00H        ; DOS FUNCTIE: BESTAND OPENEN
                INT     21H
                JC      PAINT_FILE_ERR  ; SPRING INDIEN FOUT OPGETREDEN
                MOV     BX,AX           ; ZET HANDLE IN BX
                MOV     AX,3F00H        ; DOS FUNCTIE: BESTAND LEZEN
                MOV     CX,4000H        ; AANTAL TE LEZEN BYTES
                LEA     DX,PATTERNS     ; LAADT ADRES VAN DE BUFFER
                INT     21H
                MOV     AX,3E00H        ; DOS FUNCTIE: BESTAND SLUITEN
                INT     21H
                XOR     AL,AL           ; GEEN FOUT TE MELDEN
                JMP     PAINT_FILE_ERR  ; STATUS NAAR ATOM EN EINDE COMMANDO
PAINT_SAVE:     CALL    LEESNAAM        ; ZET FILENAAM IN BUFFER
                LEA     DX,FILEBUFFER   ; LAADT POINTER NAAR FILENAAM
                XOR     CX,CX           ; ATTRIBUUT 0 -> NORMALE FILE
                MOV     AH,3CH          ; DOS FUNCTIE: BESTAND OPENEN
                INT     21H
                JC      PAINT_FILE_ERR  ; SPRING INDIEN FOUT OPGETREDEN
                MOV     BX,AX           ; ZET HANDLE IN BX
                MOV     AH,40H          ; DOS FUNCTIE: BESTAND SCHRIJVEN
                MOV     CX,4000H        ; AANTAL TE SCHRIJVEN BYTES
                LEA     DX,PATTERNS     ; ADRES VAN DE DATA
                INT     21H             ; SCHRIJF DATA NAAR DISK
                MOV     DX,AX           ; AANTAL GESCHREVEN BYTES EVEN BEWAREN
                MOV     AX,3E00H        ; DOS FUNCTIE: BESTAND SLUITEN
                INT     21H
                XOR     AX,AX           ; GEEN FOUT OPGETREDEN
                CMP     DX,CX           ; TEST OF ALLE BYTES GESCHREVEN ZIJN
                JE      PAINT_FILE_ERR  ; SPRING WANT ALLES IS GOED
                MOV     AL,1            ; LAADT FOUTCODE 'disk full'
PAINT_FILE_ERR: CALL    ZENDBYTE        ; GEEF STATUS AAN ATOM
                JMP     SHAPE_END
; ****************************************************************************
; PIXEL AND / XOR PATROON ZETTEN
; ****************************************************************************
; Om bepaalde effecten te krijgen kunnen beeldpixels bewerkt worden; bij
; de grafische commando's kan de aanwezige pixel ge-AND worden met een
; variabel masker en vervolgens ge-EXORd worden. Hiermee is o.a. inverteren
; van een rechthoek, cirkel of driehoek mogelijk (zowel AND als XOR masker
; zijn dan #FF). Onderstaand commando leest het ANDXOR masker in van de Atom
; en slaat dit op. Het effect kan uitgeschakeld worden met het masker #0000.
PIXANDXOR       PROC    NEAR
                CALL    LEESBYTE        ; LEES AND MASKER
                MOV     AH,AL           ; ZET IN AH
                CALL    LEESBYTE        ; LEES XOR MASKER
                MOV     KLEUR_EO,AX     ; SLA MASKER OP
                JMP     SHAPE_END       ; EINDE ROUTINE
PIXANDXOR       ENDP
; ****************************************************************************
; BBC MODE PLOTroutines (alleen bereikbaar via VDU 25)
; ****************************************************************************
BBCPLOTTAB:     DW      BBCPLOT0,  BBCPLOT1,  BBCPLOT2,  BBCPLOT3
                DW      BBCPLOT4,  BBCPLOT5,  BBCPLOT6,  BBCPLOT7
                DW      BBCPLOT0,  BBCPLOT1,  BBCPLOT2,  BBCPLOT3
                DW      BBCPLOT4,  BBCPLOT5,  BBCPLOT6,  BBCPLOT7
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                dw      BBCPLOT0,  BBCPLOT0,  BBCPLOT0,  BBCPLOT0
                DW      BBCPLOT0,  BBCPLOT65, BBCPLOT66, BBCPLOT67
                DW      BBCPLOT4,  BBCPLOT69, BBCPLOT70, BBCPLOT71
                
BBCPLOT0:       ; CALL    BBCSAVEPOS      ; BEWAAR OUDE COORDINATEN
                CALL    BBCGETXY        ; LEES REL. COORDINATEN IN CX,DX
                ADD     CX,BBCX2        ; BEREKEN ABSOLUTE COORDINATEN
                ADD     DX,BBCY2
                MOV     BBCX1,CX        ; BERG OP IN GEHEUGEN
                MOV     BBCY2,DX
                RET                     ; EINDE ROUTINE
BBCPLOT1:       MOV     AL,BBCFCOLG     ; LAADT GRAFISCHE VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
BBCPLOT1A:      CALL    BBCGETXY        ; LEES REL. COORDINATEN IN CX,DX
                ADD     CX,BBCX1        ; BEREKEN ABSOLUTE COORDINATEN
                ADD     DX,BBCY1
                MOV     TEMP[6],DX      ; ZET ALS EINDPUNT VAN LIJN
                MOV     TEMP[4],CX
BBCPLOT1B:      MOV     CX,BBCX2        ; LAADT GRAFISCHE CURSORPOSITIE
                MOV     DX,BBCY2
                MOV     TEMP[2],DX      ; ZET ALS BEGINPUNT VAN LIJN
                MOV     TEMP[0],CX
                CALL    _DRAW           ; TEKEN DE LIJN
                RET                     ; EINDE ROUTINE
BBCPLOT2:       MOV     AL,BBCGCOL      ; LAADT GCOL OPTIE
                PUSH    AX              ; BEWAAR DEZE OP STACK
                MOV     BBCGCOL,4       ; INVERTEER PIXELS
                CALL    BBCPLOT1        ; TEKEN DE LIJN
                POP     AX              ; HAAL GCOL OPTIE TERUG
                MOV     BBCGCOL,AL      ; HERSTEL DEZE
                RET                     ; EINDE ROUTINE
BBCPLOT3:       MOV     AL,BBCBCOLG     ; LAADT GRAFISCHE ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT1A ; TEKEN DE LIJN EN EINDE ROUTINE
BBCPLOT4:       ; CALL    BBCSAVEPOS      ; BEWAAR OUDE COORDINATEN
                CALL    BBCGETXY        ; LEES ABS. COORDINATEN IN CX,DX
BBCPLOT4A:      MOV     BBCX1,CX        ; BERG OP IN GEHEUGEN
                MOV     BBCY1,DX
                RET                     ; EINDE ROUTINE
BBCPLOT5:       MOV     AL,BBCFCOLG     ; LAADT GRAFISCHE VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
BBCPLOT5A:      CALL    BBCGETXY        ; LEES REL. COORDINATEN IN CX,DX
                MOV     TEMP[6],DX      ; ZET ALS EINDPUNT VAN LIJN
                MOV     TEMP[4],CX
                JMP     SHORT BBCPLOT1B ; TEKEN LIJN EN EINDE ROUTINE
BBCPLOT6:       MOV     AL,BBCGCOL      ; LAADT GCOL OPTIE
                PUSH    AX              ; BEWAAR DEZE OP STACK
                MOV     BBCGCOL,4       ; INVERTEER PIXELS
                CALL    BBCPLOT5        ; TEKEN DE LIJN
                POP     AX              ; HAAL GCOL OPTIE TERUG
                MOV     BBCGCOL,AL      ; HERSTEL DEZE
                RET                     ; EINDE ROUTINE
BBCPLOT7:       MOV     AL,BBCBCOLG     ; LAADT GRAFISCHE ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT5A ; TEKEN DE LIJN EN EINDE ROUTINE
BBCPLOT33:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT33A:     MOV     AL,BBCFCOLG     ; ZET VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL
BBCPLOT33B:     CALL    BBCGETXY        ; LEES COORDINATEN
                ADD     CX,BBCX2        ; BEREKEN ABSOLUTE X EN Y
                ADD     DX,BBCY2
BBCPLOT33C:     CALL    BBCPLOT33D      ; BEREKEN DE STRAAL
                JMP     _CIRCLE         ; TEKEN DE CIRKEL
BBCPLOT33D:     MOV     AX,BBCX2        ; LEES LAATSTE COORDINAAT
                MOV     TEMP[0],AX      ; ZET IN PARAMETERLIJST
                MOV     AX,BBCY2
                MOV     TEMP[2],AX
                MOV     AX,CX           ; BEREKEN X1-X2
                SUB     AX,BBCX2
                MOV     BX,AX           ; BEREKEN (X1-X2)^2
                IMUL    BX
                MOV     TEMP[4],AX      ; BERG RESULTAAT OP
                MOV     TEMP[6],DX
                MOV     AX,BBCY1        ; BEREKEN Y1-Y2
                SUB     AX,BBCY2
                MOV     BX,AX           ; BEREKEN (Y1-Y2)^2
                IMUL    BX
                ADD     AX,TEMP[4]      ; TEL KWADRATEN OP
                ADD     DX,TEMP[6]
    ;   VWK32 - zie boek pag 203
                PUSH    BP              ; BEWAAR REGISTER BP OP STACK
                PUSH    DX              ; BEWAAR BRONGETAL DX:AX OP STACK
                PUSH    AX
                MOV     BP,SP           ; BP WIJST NAAR AX OP DE STACK
                MOV     BX,200          ; BEREKEN EERSTE BENADERING
                DIV     BX              ; DEEL BRONGETAL DOOR 200
                ADD     AX,2            ; EN TEL ER 2 BIJ OP
BBCPLOT33E:     MOV     BX,AX           ; BEWAAR LAATSTE BENADERING
                MOV     AX,[BP]         ; LEES BRONGETAL WEER
                MOV     DX,[BP+2]
                DIV     BX              ; DEEL DOOR LAATSTE BENADERING
                ADD     AX,BX           ; MIDDEL DE LAATSTE TWEE BENADERINGEN
                SHR     AX,1
                CMP     AX,BX           ; ZIJN DEZE GELIJK
                JE      BBCPLOT33F      ; JA DAN KLAAR
                CMP     BX,1            ; ONDERZOEK HET VERSCHIL
                JE      BBCPLOT33F      ; VERSCHIL IS 1, OOK KLAAR
                CMP     BX,-1
                JNE     BBCPLOT33E      ; VERSCHIL <> -1, VOLGENDE BENADERING
BBCPLOT33F:     MOV     BX,AX           ; ZET LAATSTE BENADERING IN BX
                POP     AX              ; HERSTEL BRONGETAL
                POP     DX
                POP     BP              ; EN HET WERKREGISTER BP
                MOV     TEMP[4],BX      ; ZET STRAAL IN TEMP[4]
                RET                     ; EINDE ROUTINE
BBCPLOT34:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT34A:     MOV     AL,BBCGCOL      ; LEES GCOL OPTIE
                PUSH    AX              ; BEWAAR OP STACK
                MOV     BBCGCOL,4       ; LAADT GCOL 4 OPTIE
                CALL    BBCPLOT33B      ; TEKEN DE CIRKEL
                JMP     BBCPLOT82B      ; HERSTEL GCOL EN EINDE
BBCPLOT35:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT35A:     MOV     AL,BBCBCOLG     ; LAADT ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     BBCPLOT33B      ; TEKEN DE CIRKEL
BBCPLOT37:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT37A:     MOV     AL,BBCFCOLG     ; ZET VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL
BBCPLOT37B:     CALL    BBCGETXY        ; LEES COORDINATEN
                JMP     BBCPLOT33C      ; TEKEN DE CIRKEL
BBCPLOT38:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT38A:     MOV     AL,BBCGCOL      ; LEES GCOL OPTIE
                PUSH    AX              ; BEWAAR OP STACK
                MOV     BBCGCOL,4       ; LAADT GCOL 4 OPTIE
                CALL    BBCPLOT37B      ; TEKEN DE CIRKEL
BBCPLOT38B:     JMP     BBCPLOT82B      ; HERSTEL GCOL EN EINDE ROUTINE
BBCPLOT39:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT39A:     MOV     AL,BBCBCOLG     ; LAADT ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT37B; TEKEN DE CIRKEL
BBCPLOT41:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     BBCPLOT33
BBCPLOT42:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT34
BBCPLOT43:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT35
BBCPLOT45:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT37
BBCPLOT46:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT38
BBCPLOT47:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT39
BBCPLOT49:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT49A:     MOV     AL,BBCFCOLG     ; ZET VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL
BBCPLOT49B:     CALL    BBCPLOT49D      ; ZET PARAMETERS IN TEMP[x]
                CALL    BBCGETXY        ; LEES COORDINATEN
                ADD     CX,BBCX2        ; BEREKEN ABSOLUTE X EN Y
                ADD     DX,BBCY2
BBCPLOT49C:     MOV     TEMP[4],CX      ; ZET X IN PARAMETERLIJST
                MOV     TEMP[6],DX      ; ZET Y IN PARAMETERLIJST
                JMP     _BLOCK          ; TEKEN DE RECHTHOEK
BBCPLOT49D:     MOV     AX,BBCX1        ; LEES LAATSTE COORDINAAT
                MOV     TEMP[0],AX      ; ZET IN PARAMETERLIJST
                MOV     AX,BBCY1
                MOV     TEMP[2],AX
                RET                     ; EINDE ROUTINE
BBCPLOT50:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT50A:     MOV     AL,BBCGCOL      ; LEES GCOL OPTIE
                PUSH    AX              ; BEWAAR OP STACK
                MOV     BBCGCOL,4       ; LAADT GCOL 4 OPTIE
                CALL    BBCPLOT49B      ; TEKEN DE RECHTHOEK
                JMP     BBCPLOT82B      ; HERSTEL GCOL EN EINDE
BBCPLOT51:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT51A:     MOV     AL,BBCBCOLG     ; LAADT ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT49B; TEKEN DE RECHTHOEK
BBCPLOT53:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT53A:     MOV     AL,BBCFCOLG     ; ZET VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL
BBCPLOT53B:     CALL    BBCPLOT49D      ; ZET PARAMETERS IN TEMP[x]
                CALL    BBCGETXY        ; LEES COORDINATEN
                JMP     SHORT BBCPLOT49C; TEKEN DE RECHTHOEK
BBCPLOT54:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT54A:     MOV     AL,BBCGCOL      ; LEES GCOL OPTIE
                PUSH    AX              ; BEWAAR OP STACK
                MOV     BBCGCOL,4       ; LAADT GCOL 4 OPTIE
                CALL    BBCPLOT53B      ; TEKEN DE RECHTHOEK
BBCPLOT54B:     JMP     BBCPLOT82B      ; HERSTEL GCOL EN EINDE ROUTINE
BBCPLOT55:      MOV     BYTE PTR TEMP[8],1 ; ZET FILL MODE AAN
BBCPLOT55A:     MOV     AL,BBCBCOLG     ; LAADT ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     BBCPLOT53B      ; TEKEN DE RECHTHOEK
BBCPLOT57:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     BBCPLOT49
BBCPLOT58:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT50
BBCPLOT59:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT51
BBCPLOT61:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT53
BBCPLOT62:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT54
BBCPLOT63:      MOV     BYTE PTR TEMP[8],0 ; ZET FILL MODE UIT
                JMP     SHORT BBCPLOT55
BBCPLOT65:      MOV     AL,BBCFCOLG     ; LAADT GRAFISCHE VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
BBCPLOT65A:     CALL    BBCGETXY        ; LEES REL. COORDINATEN IN CX,DX
                ADD     CX,BBCX1        ; BEREKEN ABSOLUTE COORDINATEN
                ADD     DX,BBCY1
BBCPLOT65B:     MOV     LINE_STYLE,0FFFFH ; ZET LIJN TYPE OP COMPLETE LIJN
                CALL    BBCPIXEL        ; PLOT PIXEL
                RET                     ; EINDE ROUTINE
BBCPLOT66:      MOV     AL,BBCGCOL      ; LAADT GCOL OPTIE
                PUSH    AX              ; BEWAAR DEZE OP STACK
                MOV     BBCGCOL,4       ; INVERTEER PIXELS
                CALL    BBCPLOT65A      ; TEKEN DE LIJN
                POP     AX              ; HAAL GCOL OPTIE TERUG
                MOV     BBCGCOL,AL      ; HERSTEL DEZE
                RET                     ; EINDE ROUTINE
BBCPLOT67:      MOV     AL,BBCBCOLG     ; LAADT GRAFISCHE ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT65A; TEKEN DE LIJN EN EINDE ROUTINE
BBCPLOT69:      MOV     AL,BBCFCOLG     ; LAADT GRAFISCHE VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
BBCPLOT69A:     CALL    BBCGETXY        ; LEES ABS. COORDINATEN IN CX,DX
                JMP     SHORT BBCPLOT65B; TEKEN PUNT EN EINDE ROUTINE
BBCPLOT70:      MOV     AL,BBCGCOL      ; LAADT GCOL OPTIE
                PUSH    AX              ; BEWAAR DEZE OP STACK
                MOV     BBCGCOL,4       ; INVERTEER PIXELS
                CALL    BBCPLOT69       ; TEKEN DE LIJN
                POP     AX              ; HAAL GCOL OPTIE TERUG
                MOV     BBCGCOL,AL      ; HERSTEL DEZE
                RET                     ; EINDE ROUTINE
BBCPLOT71:      MOV     AL,BBCBCOLG     ; LAADT GRAFISCHE ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT69A; TEKEN PUNT EN EINDE ROUTINE
BBCPLOT81:      MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE AAN
BBCPLOT81A:     MOV     AL,BBCFCOLG     ; ZET VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL
BBCPLOT81B:     CALL    BBCPLOT81C      ; ZET PARAMETERS IN TEMP[x]
                CALL    BBCGETXY        ; LEES COORDINATEN
                ADD     CX,BBCX2        ; BEREKEN ABSOLUTE X EN Y
                ADD     DX,BBCY2
BBCPLOT81C:     MOV     TEMP[16],CX     ; ZET X IN PARAMETERLIJST
                MOV     TEMP[18],DX     ; ZET Y IN PARAMETERLIJST
                JMP     _DRIEHOEK       ; TEKEN DE DRIEHOEK
BBCPLOT81D:     MOV     AX,BBCX1        ; LEES LAATSTE COORDINAAT
                MOV     TEMP[20],AX     ; ZET IN PARAMETERLIJST
                MOV     AX,BBCY1
                MOV     TEMP[22],AX
                MOV     AX,BBCX2        ; LEES VOORLAATSTE COORDINAAT
                MOV     TEMP[24],AX     ; ZET IN PARAMETERLIJST
                MOV     AX,BBCY2
                MOV     TEMP[26],AX
                RET                     ; EINDE ROUTINE
BBCPLOT82:      MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE AAN
BBCPLOT82A:     MOV     AL,BBCGCOL      ; LEES GCOL OPTIE
                PUSH    AX              ; BEWAAR OP STACK
                MOV     BBCGCOL,4       ; LAADT GCOL 4 OPTIE
                CALL    BBCPLOT81B      ; TEKEN DE DRIEHOEK
BBCPLOT82B:     POP     AX              ; HERSTEL GCOL OPTIE
                MOV     BBCGCOL,AL
                RET                     ; EINDE ROUTINE
BBCPLOT83:      MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE AAN
BBCPLOT83A:     MOV     AL,BBCBCOLG     ; LAADT ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT81B; TEKEN DE DRIEHOEK
BBCPLOT85:      MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE AAN
BBCPLOT85A:     MOV     AL,BBCFCOLG     ; ZET VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL
BBCPLOT85B:     CALL    BBCPLOT81D      ; ZET PARAMETERS IN TEMP[x]
                CALL    BBCGETXY        ; LEES COORDINATEN
                JMP     SHORT BBCPLOT81C; TEKEN DE DRIEHOEK EN EINDE
BBCPLOT86:      MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE AAN
BBCPLOT86A:     MOV     AL,BBCGCOL      ; LEES GCOL OPTIE
                PUSH    AX              ; BEWAAR OP STACK
                MOV     BBCGCOL,4       ; LAADT GCOL 4 OPTIE
                CALL    BBCPLOT85B      ; TEKEN DE DRIEHOEK
BBCPLOT86B:     JMP     SHORT BBCPLOT82B; HERSTEL GCOL EN EINDE ROUTINE
BBCPLOT87:      MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE AAN
BBCPLOT87A:     MOV     AL,BBCBCOLG     ; LAADT ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT85B; TEKEN DE DRIEHOEK
BBCPLOT97:      MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE UIT
                JMP     BBCPLOT81A      ; TEKEN DE DRIEHOEK
BBCPLOT98:      MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE UIT
                JMP     BBCPLOT82A      ; TEKEN DE DRIEHOEK
BBCPLOT99:      MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE UIT
                JMP     BBCPLOT83A      ; TEKEN DE DRIEHOEK
BBCPLOT101:     MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE UIT
                JMP     BBCPLOT85A      ; TEKEN DE DRIEHOEK
BBCPLOT102:     MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE UIT
                JMP     BBCPLOT86A      ; TEKEN DE DRIEHOEK
BBCPLOT103:     MOV     BYTE PTR TEMP[31],1 ; ZET FILL MODE UIT
                JMP     BBCPLOT87A      ; TEKEN DE DRIEHOEK
BBCPLOT105:     MOV     AL,BBCFCOLG     ; ZET VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL
BBCPLOT105A:    CALL    BBCGETXY        ; LEES COORDINATEN
                ADD     CX,BBCX2        ; BEREKEN ABSOLUTE POSITIE
                ADD     DX,BBCY2
BBCPLOT105B:    RET                     ; HIER KOMT PAINT ROUTINE
BBCPLOT106:     MOV     AL,BBCGCOL      ; LEES GCOL OPTIE
                PUSH    AX              ; BEWAAR OP STACK
                MOV     BBCGCOL,4       ; LAADT GCOL 4 OPTIE
                CALL    BBCPLOT105A     ; PAINT
                JMP     BBCPLOT82B      ; HERSTEL GCOL EN EINDE
BBCPLOT107:     MOV     AL,BBCBCOLG     ; LAADT ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT105A; PAINT
BBCPLOT109:     MOV     AL,BBCFCOLG     ; ZET VOORGRONDKLEUR
                MOV     BBCPCOLOUR,AL
BBCPLOT109A:    CALL    BBCGETXY        ; LEES COORDINATEN
                JMP     SHORT BBCPLOT105B; PAINT
BBCPLOT110:     MOV     AL,BBCGCOL      ; LEES GCOL OPTIE
                PUSH    AX              ; BEWAAR OP STACK
                MOV     BBCGCOL,4       ; LAADT GCOL 4 OPTIE
                CALL    BBCPLOT109A     ; PAINT
                JMP     BBCPLOT82B      ; HERSTEL GCOL EN EINDE ROUTINE
BBCPLOT111:     MOV     AL,BBCBCOLG     ; LAADT ACHTERGRONDKLEUR
                MOV     BBCPCOLOUR,AL   ; ZET ALS PIXELKLEUR
                JMP     SHORT BBCPLOT105A; PAINT
BBCGETXY:       CALL    LEESBBC         ; LEES Xlow IN AL
                MOV     CL,AL
                CALL    LEESBBC         ; LEES Xhigh IN AL
                MOV     CH,AL
                CALL    LEESBBC         ; LEES Ylow IN AL
                MOV     DL,AL
                CALL    LEESBBC         ; LEES Yhigh IN AL
                MOV     DH,AL
BBCSAVEPOS:     MOV     AX,BBCX1        ; BBCX2:=BBCX1
                MOV     BBCX2,AX        
                MOV     AX,BBCY1        ; BBCY2:=BBCY1
                MOV     BBCY2,AX
                MOV     BBCX1,CX        ; SAVE LAATSTE COORDINATEN
                MOV     BBCY1,DX
                RET                     ; EINDE ROUTINE
BBCPIXEND:      POP     DX              ; HERSTEL COORDINATEN
                POP     CX
                RET                     ; EINDE ROUTINE
BBCPIXEL:       PUSH    CX              ; BEWAAR COORDINATEN OP STACK
                PUSH    DX
                ROL     LINE_STYLE,1    ; TEST OF PIXEL GEZET MOET WORDEN
                JNC     BBCPIXEND       ;   I.V.M. STIPPELLIJNEN
                CALL    BBCPLOT4A       ; ZET NIEUWE COORDINATEN
                CMP     CX,GWINDOW_XLO  ; TEST OF X BINNEN VENSTER VALT
                JL      BBCPIXEND       ; NEE, DAN GEEN PIXEL PLOTTEN
                CMP     CX,GWINDOW_XRB
                JG      BBCPIXEND
                CMP     DX,GWINDOW_YLO  ; TEST OF Y BINNEN VENSTER VALT
                JL      BBCPIXEND       ; NEE, DAN GEEN PIXEL PLOTTEN
                CMP     DX,GWINDOW_YRB
                JG      BBCPIXEND
                ADD     CX,OORSPRONG_X  ; REKEN VERSCHUIVING VAN OORSPRONG MEE
                ADD     DX,OORSPRONG_Y
                MOV     AL,BBCSCREEN    ; LAADT SCHERMMODE
                XOR     AH,AH           ; CLEAR AH
                MOV     SI,AX           ; ZET IN INDEXREGISTER
                MOV     BL,PWIDTHTAB[SI]; LEES AANTAL DOTS/ LOGISCHE PIXEL
                MOV     BH,BL           ; ZET OOK IN BH VOOR LATER GEBRUIK
                CMP     BH,4            ; TEST OP MODE 2/MODE 5 (4 pixels)
                JNE     BBCPIXEL1       ; SPRING BIJ ANDERE MODE
                DEC     BH              ; VERLAAG TELLER ALVAST
BBCPIXEL1:      SHR     CX,1            ; DEEL X COORDINAAT DOOR 2
                DEC     BH              ; VERLAAG TELLER
                CMP     BH,0            ; VOLDOENDE GEDEELD
                JNE     BBCPIXEL1       ; NEE, DAN NOGMAALS DELEN
                MOV     BH,BL           ; HERLAADT TELLER
                SHR     BH,1            ; HALVEER TELLER
BBCPIXEL2:      CMP     BH,0            ; CONTROLEER OP VERMENIGVULDIGEN
                JE      BBCPIXEL3       ; SPRING INDIEN KLAAR
                SHL     CX,1            ; VERMENIGVULDIG X COORDINAAT MET 2
                DEC     BH              ; VERLAAG TELLER
                JMP     SHORT BBCPIXEL2 ; SPRING ALTIJD
BBCPIXEL3:      SHL     DX,1            ; BEPAAL TABEL-INDEX
                MOV     DI,DX           ; ZET Y COORDINAAT IN INDEXREGISTER
                MOV     DX,WORD PTR BBCYTAB[DI]  ; LEES Y POSITIE UIT TABEL
                CMP     CX,BBCOLDX      ; TEST OF PIXEL AL GEPLOT IS
                JNE     BBCPIXEL4
                CMP     DX,BBCOLDY
                JE      BBCPIXEND
BBCPIXEL4:      MOV     BBCOLDX,CX      ; SLA NIEUWE COORDINATEN OP
                MOV     BBCOLDY,DX
                XOR     BH,BH           ; SCHERMPAGINA 0 IN BH ZETTEN
                MOV     AL,BBCPCOLOUR   ; LAADT PIXELKLEUR IN AL
BBCPIXEL5:      CMP     BBCGCOL,0       ; TEST OP PIXELBEWERKING
                JE      BBCPIXEL10
                MOV     AH,0DH          ; VRAAG PIXELKLEUR OP
                INT     10H
                MOV     AH,BBCGCOL      ; LAADT OPTIE IN AH
                CMP     AH,4            ; INVERT PIXEL
                JE      SHORT BBCPIXEL6
                CMP     AH,3            ; EXCLUSIVE OR PIXEL MET KLEUR
                JE      SHORT BBCPIXEL7
                CMP     AH,2            ; AND PIXEL MET KLEUR
                JE      SHORT BBCPIXEL8
                OR      AL,BBCPCOLOUR   ; OR PIXEL MET KLEUR
                JMP     SHORT BBCPIXEL9
BBCPIXEL6:      XOR     AL,0FFH         ; INVERTEER PIXEL
                JMP     SHORT BBCPIXEL9
BBCPIXEL7:      XOR     AL,BBCPCOLOUR   ; VOER LOGISCHE XOR UIT
                JMP     SHORT BBCPIXEL9
BBCPIXEL8:      AND     AL,BBCPCOLOUR   ; VOER LOGISCHE AND UIT
                JMP     SHORT BBCPIXEL9
BBCPIXEL9:      AND     AL,PMASKTAB[SI] ; MASKEER NIET SIGNIFICANTE BITS
BBCPIXEL10:     MOV     AH,0CH          ; LAADT FUNCTIE CODE IN AH
                PUSH    AX              ; BEWAAR PIXELKLEUR
                INT     10H             ; ZET PIXEL OP HET SCHERM
                POP     AX              ; HERSTEL PIXELKLEUR
                INC     CX              ; VERHOOG X COORDINAAT
                DEC     BL              ; VERLAAG DOT TELLER
                CMP     BL,0            ; TEST OF ALLE DOTS GEZET ZIJN
                JNE     BBCPIXEL10      ; SPRING INDIEN ER NOG DOTS VOLGEN
                JMP     BBCPIXEND       ; SPRING NAAR EINDE ROUTINE
BBCYTAB:        DW      479, 479, 479, 478, 478, 477, 477, 476
                DW      476, 475, 475, 474, 474, 473, 473, 472
                DW      472, 472, 471, 471, 470, 470, 469, 469
                DW      468, 468, 467, 467, 466, 466, 465, 465
                DW      465, 464, 464, 463, 463, 462, 462, 461
                DW      461, 460, 460, 459, 459, 458, 458, 457
                DW      457, 457, 456, 456, 455, 455, 454, 454
                DW      453, 453, 452, 452, 451, 451, 450, 450
                DW      450, 449, 449, 448, 448, 447, 447, 446
                DW      446, 445, 445, 444, 444, 443, 443, 442
                DW      442, 442, 441, 441, 440, 440, 439, 439
                DW      438, 438, 437, 437, 436, 436, 435, 435
                DW      435, 434, 434, 433, 433, 432, 432, 431
                DW      431, 430, 430, 429, 429, 428, 428, 428
                DW      427, 427, 426, 426, 425, 425, 424, 424
                DW      423, 423, 422, 422, 421, 421, 420, 420
                DW      420, 419, 419, 418, 418, 417, 417, 416
                DW      416, 415, 415, 414, 414, 413, 413, 413
                DW      412, 412, 411, 411, 410, 410, 409, 409
                DW      408, 408, 407, 407, 406, 406, 405, 405
                DW      405, 404, 404, 403, 403, 402, 402, 401
                DW      401, 400, 400, 399, 399, 398, 398, 398
                DW      397, 397, 396, 396, 395, 395, 394, 394
                DW      393, 393, 392, 392, 391, 391, 391, 390
                DW      390, 389, 389, 388, 388, 387, 387, 386
                DW      386, 385, 385, 384, 384, 383, 383, 383
                DW      382, 382, 381, 381, 380, 380, 379, 379
                DW      378, 378, 377, 377, 376, 376, 376, 375
                DW      375, 374, 374, 373, 373, 372, 372, 371
                DW      371, 370, 370, 369, 369, 368, 368, 368
                DW      367, 367, 366, 366, 365, 365, 364, 364
                DW      363, 363, 362, 362, 361, 361, 361, 360
                DW      360, 359, 359, 358, 358, 357, 357, 356
                DW      356, 355, 355, 354, 354, 354, 353, 353
                DW      352, 352, 351, 351, 350, 350, 349, 349
                DW      348, 348, 347, 347, 346, 346, 346, 345
                DW      345, 344, 344, 343, 343, 342, 342, 341
                DW      341, 340, 340, 339, 339, 339, 338, 338
                DW      337, 337, 336, 336, 335, 335, 334, 334
                DW      333, 333, 332, 332, 331, 331, 331, 330
                DW      330, 329, 329, 328, 328, 327, 327, 326
                DW      326, 325, 325, 324, 324, 324, 323, 323
                DW      322, 322, 321, 321, 320, 320, 319, 319
                DW      318, 318, 317, 317, 317, 316, 316, 315
                DW      315, 314, 314, 313, 313, 312, 312, 311
                DW      311, 310, 310, 309, 309, 309, 308, 308
                DW      307, 307, 306, 306, 305, 305, 304, 304
                DW      303, 303, 302, 302, 302, 301, 301, 300
                DW      300, 299, 299, 298, 298, 297, 297, 296
                DW      296, 295, 295, 294, 294, 294, 293, 293
                DW      292, 292, 291, 291, 290, 290, 289, 289
                DW      288, 288, 287, 287, 287, 286, 286, 285
                DW      285, 284, 284, 283, 283, 282, 282, 281
                DW      281, 280, 280, 279, 279, 279, 278, 278
                DW      277, 277, 276, 276, 275, 275, 274, 274
                DW      273, 273, 272, 272, 272, 271, 271, 270
                DW      270, 269, 269, 268, 268, 267, 267, 266
                DW      266, 265, 265, 265, 264, 264, 263, 263
                DW      262, 262, 261, 261, 260, 260, 259, 259
                DW      258, 258, 257, 257, 257, 256, 256, 255
                DW      255, 254, 254, 253, 253, 252, 252, 251
                DW      251, 250, 250, 250, 249, 249, 248, 248
                DW      247, 247, 246, 246, 245, 245, 244, 244
                DW      243, 243, 242, 242, 242, 241, 241, 240
                DW      240, 239, 239, 238, 238, 237, 237, 236
                DW      236, 235, 235, 235, 234, 234, 233, 233
                DW      232, 232, 231, 231, 230, 230, 229, 229
                DW      228, 228, 228, 227, 227, 226, 226, 225
                DW      225, 224, 224, 223, 223, 222, 222, 221
                DW      221, 220, 220, 220, 219, 219, 218, 218
                DW      217, 217, 216, 216, 215, 215, 214, 214
                DW      213, 213, 213, 212, 212, 211, 211, 210
                DW      210, 209, 209, 208, 208, 207, 207, 206
                DW      206, 205, 205, 205, 204, 204, 203, 203
                DW      202, 202, 201, 201, 200, 200, 199, 199
                DW      198, 198, 198, 197, 197, 196, 196, 195
                DW      195, 194, 194, 193, 193, 192, 192, 191
                DW      191, 191, 190, 190, 189, 189, 188, 188
                DW      187, 187, 186, 186, 185, 185, 184, 184
                DW      183, 183, 183, 182, 182, 181, 181, 180
                DW      180, 179, 179, 178, 178, 177, 177, 176
                DW      176, 176, 175, 175, 174, 174, 173, 173
                DW      172, 172, 171, 171, 170, 170, 169, 169
                DW      168, 168, 168, 167, 167, 166, 166, 165
                DW      165, 164, 164, 163, 163, 162, 162, 161
                DW      161, 161, 160, 160, 159, 159, 158, 158
                DW      157, 157, 156, 156, 155, 155, 154, 154
                DW      154, 153, 153, 152, 152, 151, 151, 150
                DW      150, 149, 149, 148, 148, 147, 147, 146
                DW      146, 146, 145, 145, 144, 144, 143, 143
                DW      142, 142, 141, 141, 140, 140, 139, 139
                DW      139, 138, 138, 137, 137, 136, 136, 135
                DW      135, 134, 134, 133, 133, 132, 132, 131
                DW      131, 131, 130, 130, 129, 129, 128, 128
                DW      127, 127, 126, 126, 125, 125, 124, 124
                DW      124, 123, 123, 122, 122, 121, 121, 120
                DW      120, 119, 119, 118, 118, 117, 117, 117
                DW      116, 116, 115, 115, 114, 114, 113, 113
                DW      112, 112, 111, 111, 110, 110, 109, 109
                DW      109, 108, 108, 107, 107, 106, 106, 105
                DW      105, 104, 104, 103, 103, 102, 102, 102
                DW      101, 101, 100, 100,  99,  99,  98,  98
                DW       97,  97,  96,  96,  95,  95,  94,  94
                DW       94,  93,  93,  92,  92,  91,  91,  90
                DW       90,  89,  89,  88,  88,  87,  87,  87
                DW       86,  86,  85,  85,  84,  84,  83,  83
                DW       82,  82,  81,  81,  80,  80,  79,  79
                DW       79,  78,  78,  77,  77,  76,  76,  75
                DW       75,  74,  74,  73,  73,  72,  72,  72
                DW       71,  71,  70,  70,  69,  69,  68,  68
                DW       67,  67,  66,  66,  65,  65,  65,  64
                DW       64,  63,  63,  62,  62,  61,  61,  60
                DW       60,  59,  59,  58,  58,  57,  57,  57
                DW       56,  56,  55,  55,  54,  54,  53,  53
                DW       52,  52,  51,  51,  50,  50,  50,  49
                DW       49,  48,  48,  47,  47,  46,  46,  45
                DW       45,  44,  44,  43,  43,  42,  42,  42
                DW       41,  41,  40,  40,  39,  39,  38,  38
                DW       37,  37,  36,  36,  35,  35,  35,  34
                DW       34,  33,  33,  32,  32,  31,  31,  30
                DW       30,  29,  29,  28,  28,  28,  27,  27
                DW       26,  26,  25,  25,  24,  24,  23,  23
                DW       22,  22,  21,  21,  20,  20,  20,  19
                DW       19,  18,  18,  17,  17,  16,  16,  15
                DW       15,  14,  14,  13,  13,  13,  12,  12
                DW       11,  11,  10,  10,   9,   9,   8,   8
                DW        7,   7,   6,   6,   5,   5,   5,   4
                DW        4,   3,   3,   2,   2,   1,   1,   0
terug.gif