; *************************************************************************** ; 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. ; *************************************************************************** ; Auteur : Roland Leurs ; Datum : 25 maart 1994 ; *************************************************************************** ; --------------------------------------------------------------------------- ; 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 video tabel string ; subfunctie 10: opvragen geldigheid van video mode ; --------------------------------------------------------------------------- SHAPES: CALL LEESBYTE ; LEES SUBFUNCTIE NUMMER CMP AL,09 ; 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 JMP WORD PTR SHAPETAB[BX] ; SPRING NAAR SUBFUNCTIE SHAPETAB: DW CIRCLE, CIRCLE_F, BLOCK, BLOCK_F DW DRIEHOEK, DRIEHOEK_F, SET_LINE_STYLE DW DRAWLINE, WHATCOL, VALID_MODE ; --------------------------------------------------------------------------- ; 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 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 LEESCOM ; 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 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 MOV AH,0CH ; LAADT AH MET PLOT FUNCTIE MOV AL,KLEUR ; LAADT KLEUR XOR BH,BH ; SCHERMPAGINA 0 INT 10H ; TEKEN 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 ADD AX,OORSPRONG_X ; PAS AAN BIJ VERSCHOVEN OORSPRONG 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 ADD AX,OORSPRONG_Y ; PAS AAN BIJ VERSCHOVEN OORSPRONG 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 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 JMP LEESCOM ; EINDE 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 LEESCOM ; 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 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 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 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 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 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 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 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 DEC DX ; VERLAAG Y COORDINAAT, 1 PUNT OMHOOG JMP SHORT VFILL_D1 ; SPRING VOOR VOLGEND PIXEL VFILL_END: JMP LEESCOM ; 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 LEESCOM ; 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 LEESCOM ; 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 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 LEESCOM ; EINDE INDIEN NIET VULLEN WHATCOL: MOV AL,KLEUR ; LEES HUIDIGE KLEURNUMMER CALL ZENDBYTE ; STUUR NAAR ATOM JMP LEESCOM ; DAT IS ALLES VALID_MODE: CALL LEESBYTE ; LEES TE TESTEN MODE CMP AL,32 ; VANAF CLEAR 32 ONGELDIG JB VALID_MOD1 MOV AL,15 ; GEEFT ALTIJD ONGELDIGE MODE 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 CALL ZENDBYTE ; ZEND NAAR ATOM (#ff is dus ongeldig) JMP LEESCOM ; 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 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 CMP AL,BL ; TEST OP GRENSKLEUR JNE PAINT_COL3 ; GA VOLGENDE LIJN KLEUREN PAINT_COL4: MOV FUN_CODE,0 ; RESET FUN_CODE JMP LEESCOM ; 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 LEESCOM ; 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 LEESCOM