; *************************************************************************** ; 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. ; *************************************************************************** ; 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 ; --------------------------------------------------------------------------- ; CIRCLE - tekent een circle. Als parameters worden gegeven de x en y ; coordinaten en de straal. Er wordt rekening gehouden met een ; verschoven oorsprong. ; De cirkel-routine wordt berekend volgens het Bressenham- ; algoritme (zie AN7-1). ; --------------------------------------------------------------------------- DB 'HIER BEGINT CIRKELROUTINE' CIRCLE: MOV DI,0 ; RESET POINTER/TELLER 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 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 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 AL,KLEUR ; ZET KLEUR IN AL MOV AH,0CH ; VIDEO FUNCTIE: PUNT PLOTTEN MOV BP,AX ; ZET AX IN BP XOR BX,BX ; BEELDPAGINA 0 MOV SI,CX ; ZET X EN Y IN HULPREGISTERS MOV DI,DX ADD CX,TEMP ; PLOT P+X,Q+Y ADD DX,TEMP+2 INT 10H MOV CX,TEMP ; PLOT P-X,Q-Y SUB CX,SI MOV DX,TEMP+2 SUB DX,DI MOV AX,BP ; VIDEOFUNCTIE UITVOEREN INT 10H MOV CX,TEMP ; PLOT P+Y,Q-X ADD CX,DI MOV DX,TEMP+2 SUB DX,SI MOV AX,BP ; VIDEOFUNCTIE UITVOEREN INT 10H MOV CX,TEMP ; PLOT P-Y,Q+X SUB CX,DI MOV DX,TEMP+2 ADD DX,SI MOV AX,BP ; VIDEOFUNCTIE UITVOEREN INT 10H CMP SI,0 ; IF X=0 OR X=Y GOTO ENDPOINT JE ENDPOINT CMP SI,DI JE ENDPOINT MOV CX,TEMP ; PLOT P+Y,Q+X ADD CX,DI MOV DX,TEMP+2 ADD DX,SI MOV AX,BP ; VIDEOFUNCTIE UITVOEREN INT 10H MOV CX,TEMP ; PLOT P-X,Q+Y SUB CX,SI MOV DX,TEMP+2 ADD DX,DI MOV AX,BP ; VIDEOFUNCTIE UITVOEREN INT 10H MOV CX,TEMP ; PLOT P+X,Q-Y ADD CX,SI MOV DX,TEMP+2 SUB DX,DI MOV AX,BP ; VIDEOFUNCTIE UITVOEREN INT 10H MOV CX,TEMP ; PLOT P-Y,Q-X SUB CX,DI MOV DX,TEMP+2 SUB DX,SI MOV AX,BP ; VIDEOFUNCTIE UITVOEREN INT 10H ENDPOINT: POP DX ; REGISTERS HERSTELLEN POP CX POP BX POP AX RET ; EINDE ROUTINE SETPOINTS ENDP