; ***************************************************************************
; 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
|