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