;**********************************************************************; ;* H E R C U L E S G R A P H I C R A M F O N T *; ;*--------------------------------------------------------------------*; ;* doel : Maakt het mogelijk om tekst af te drukken in *; ;* de grafische mode van een Hercules-kaart; het *; ;* ramfont kan van disk geladen worden. *; ;*--------------------------------------------------------------------*; ;* opm : De routine PIXEL uit de file HERCULES.ASM moet *; ;* vanuit het hoofdprogramma mee geassembleerd en *; ;* beschikbaar zijn. *; ;*--------------------------------------------------------------------*; ;* auteur : Roland Leurs *; ;* ontwikkeld : 29-1-92 *; ;*--------------------------------------------------------------------*; ;* gebruik : Als include-file meenemen in het programma; de *; ;* functies kunnen als subroutines aangeroepen *; ;* worden. *; ;**********************************************************************; ;*********************************************************************** ; Opslag van data: ;*********************************************************************** RAMFONT DB 4096 DUP (0) ; OPSLAG VAN FONT SCALE_X DW 1 ; HORIZONTALE SCHAAL FACTOR SCALE_Y DW 1 ; VERTIKALE SCHAAL FACTOR SCALE_X8 DW ? ; HOR. SCHAAL FACTOR * 8 ;*********************************************************************** ; Font inladen. Aanroepen met het adres van de filenaam van het font in ; het registerpaar DS:DX. ; Uitvoer : carry = 0 -> font geladen ; carry = 1 -> error, foutcode in AX ;*********************************************************************** LOADFONT PROC NEAR MOV AX,3D00H ; DOS FUNCTIE: BESTAND OPENEN INT 21H JC ENDLOAD ; SPRING INDIEN FOUT OPGETREDEN MOV BX,AX ; ZET HANDLE IN BX MOV AX,3F00H ; DOS FUNCTIE: BESTAND LEZEN MOV CX,4096 ; AANTAL TE LEZEN BYTES LEA DX,RAMFONT ; LAADT ADRES VAN DE BUFFER INT 21H MOV AX,3E00H ; DOS FUNCTIE: BESTAND SLUITEN INT 21H ENDLOAD: RET ; EINDE ROUTINE LOADFONT ENDP ;*********************************************************************** ; Karakter op het scherm schrijven. De coordinaten staan in de registers ; BX,DX. Het karakter zelf staat in AX. Voor het plotten van een pixel ; wordt de routine PIXEL uit HERCULES.ASM aangeroepen. ; De registers BX,DX geven na afloop de coordinaten voor een volgend ; karakter. AX blijft ongewijzigd; de overige registers kunnen veranderen. ;*********************************************************************** WRITE PROC NEAR PUSH AX ; SAVE GEBRUIKTE REGISTERS PUSH DX INC AL ; VERHOOG KARAKTER WAARDE MOV CL,4 ; VERMENIGVULDIG KARAKTER MET 16 SHL AX,CL MOV SI,AX ; ZET WEG ALS INDEX DEC CL ; VERLAAG VERM.FACTOR MOV AX,SCALE_X ; BEREKEN X-SCHAAL * 8 SHL AX,CL MOV SCALE_X8,AX ; BERG OP IN WERKRUIMTE XOR BP,BP ; WERK IN SCHERMPAGINA 0 MOV CX,10H ; LAADT AANTAL REGELS PER KARAKTER WRITE_TEKEN: DEC SI ; VERLAAG TABELINDEX MOV AH,RAMFONT[SI] ; LEES REGEL VAN KARAKTER PUSH CX ; BEWAAR REGELTELLER MOV CX,8 ; LAADT AANTAL BITS PER REGEL REGEL: MOV AL,1 ; LAADT PIXEL BEWERKING (zet pixel) SHL AH,1 ; SCHUIF KARAKTER PIXEL IN CARRY JC WRITE1 ; SPRING INDIEN PIXEL ZETTEN MOV AL,3 ; ANDERS LAADT PIXEL WISSEN OPDRACHT WRITE1: PUSH CX ; BEWAAR BITTELLER MOV CX,SCALE_Y ; LAADT VERTIKALE SCHAAL KOLOM: PUSH CX ; BEWAAR VERTIKALE TELLER MOV CX,SCALE_X ; LAADT HORIZONTALE SCHAAL PLOTPIXEL: CALL PIXEL ; ZET/WIS PIXEL INC BX ; VERHOOG X-COORDINAAT LOOP PLOTPIXEL ; HERHAAL TOT SCHAAL FACTOR X BEREIKT POP CX ; HAAL VERTIKALE TELLER TERUG SUB BX,SCALE_X ; VERLAAG X-COORDINAAT INC DX ; VERHOOG Y-COORDINAAT LOOP KOLOM ; HERHAAL TOT SCHAAL FACTOR Y BEREIKT SUB DX,SCALE_Y ; VERLAAG Y-COORDINAAT ADD BX,SCALE_X ; X-COORDINAAT VOOR VOLGEND KAR.PIXEL POP CX ; HAAL BITTELLER TERUG LOOP REGEL ; HERHAAL TOT EEN KARAKTERREGEL AF IS SUB BX,SCALE_X8 ; ZET X NAAR BEGIN VAN KARAKTER ADD DX,SCALE_Y ; ZET Y EEN KARAKTERREGEL OMHOOG POP CX ; HAAL REGELTELLER TERUG LOOP WRITE_TEKEN ; HERHAAL TOT KARAKTER GETEKEND IS ADD BX,SCALE_X8 ; ZET X AAN BEGIN VAN VOLGEND KARAKTER INC BX POP DX ; ZET Y AAN BEGIN VAN VOLGEND KARAKTER POP AX ; HAAL KARAKTER TERUG VAN STACK RET ; EINDE ROUTINE WRITE ENDP ;*********************************************************************** ; De volgende routine drukt een gehele string af in grafische mode. Dit ; gebeurt door het herhaald aanroepen van de voorgaande routine. Het adres ; van de af te drukken string dient in DS:DI gegeven te worden. De string ; eindigt met de code 00. ; Hierbij worden geen registers gewijzigd. ;*********************************************************************** WRITELN PROC NEAR PUSHF ; SAVE VLAGGETJES PUSH AX ; SAVE ALLE REGISTERS PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI MOV AH,00H ; AH MOET STEEDS 0 ZIJN WRITELN1: MOV AL,[DI] ; LAADT KARAKTER CMP AL,00H ; TEST OP EINDE STRING JE WRITELN2 ; SPRING INDIEN EINDE STRING PUSH DI ; SAVE DI CALL WRITE ; DRUK KARAKTER AF POP DI ; HERSTEL DI INC DI ; VERHOOG INDEX JMP SHORT WRITELN1 ; SPRING VOOR VOLGEND KARAKTER WRITELN2: POP SI ; HERSTEL GEBRUIKTE REGISTERS POP DI POP DX POP CX POP BX POP AX POPF ; HERSTEL VLAGGEN RET ; EINDE ROUTINE WRITELN ENDP ;*********************************************************************** ; Tenslotte nog enkele macro's om fonts te laden, de schaalfactoren in ; te stellen en een karakter resp. string af te drukken. ;*********************************************************************** H_SIZE MACRO X MOV SCALE_X,X ; ZET HORIZONTALE SCHAAL FACTOR ENDM V_SIZE MACRO Y MOV SCALE_Y,Y ; ZET VERTIKALE SCHAAL FACTOR ENDM GPRINTC MACRO T MOV AX,T ; LAADT AF TE DRUKKEN TEKEN CALL WRITE ; PRINT KARAKTER ENDM GPRINT MACRO STR LEA DI,STR ; LAADT ADRES VAN STRING CALL WRITELN ; PRINT STRING ENDM INITFONT MACRO FONTNAAM LEA DX,FONTNAAM ; ZET ADRES VAN FNAAM IN DX CALL LOADFONT ; LAADT HET FONT ENDM MOVETO MACRO KOLOM,REGEL IFNB MOV BX,KOLOM ENDIF IFNB MOV DX,REGEL ENDIF ENDM