; ASMTEXT.ASM: Schreibt einen Text in den Grafik-Bildschirm ; ; Autor: Frank Riemenschneider ; ; Eingabe: AX = X-Koordinate (0-239) ; BX = Y-Koordinate (0-63) ; SI = Offsetadresse des Textes ; Ausgabe: keine DATASEG CharSetSeg = 0b000h CharSetOfs = 007d0h extrn Farbe : word extrn zu : word extrn zl : word extrn su : word extrn sl : word extrn zch : word extrn spt : word extrn xver : word; extrn yver : word; CODESEG PROC AsmText push ax ; Erst mal alle Register retten, die push bx ; nicht schnell genug in den n„chsten push cx ; Stack kommen push dx push es push si push di mov dx, CharSetSeg ; Segment der Zeichentabelle in mov es, dx ; ES laden push ds mov cx, [TextSeg] ; Segment Text holen mov ds,cx mov cl, [si] ; L„nge des Textes holen xor ch, ch pop ds inc si ; Zeiger auf ersten Buchstaben TextLoop1: push ax push bx push cx ; Zeichenz„hler retten push ds ; Datensegment Pascal retten mov cx, [TextSeg] ; Segment Text holen mov ds,cx mov cl, [si] ; ASCII-Code des Buchstabens holen pop ds push bx xor ch, ch shl cx, 1 ; Zeichenmatrix beginnt innerhalb der mov bx, cx shl cx, 1 ; Tabelle an der Adresse (ASCII-Code * 6) add cx, bx pop bx mov di, CharSetOfs ; Offset der Zeichentabelle laden add di, cx ; ES:DI auf erste Zeile der Matrix mov cx, 6 ; Spaltenz„hler laden TextLoop2: push cx ; Spaltenz„hler retten mov cx, [xver] ; Vergr”áerungsfaktor X TextLoop5: mov dl, [es:di] ; Zeile der Zeichenmatrix holen push cx push ax ; Koordinaten merken push bx ; von Ausgangspunkt Spalte push di ; Zeiger auf Zeichentabelle retten push es mov cx, 8 ; Pixelz„hler laden TextLoop3: push cx ; Pixelz„hler retten mov dh,1 ; Annahme : Punkt gesetzt shr dl, 1 ; Pixel ins Carry schieben jc TextLab1 ; Punkt gesetzt -> in Vordergrundfarbe setzen mov dh, 0 ; Punkt in Hintergrundfarbe setzen TextLab1: mov cx, [yver] TextLoop4: cmp dh,0 je TextLab6 call AsmPlot ; Punkt setzen TextLab6: add bx, [zu] ; Y-Koordinate weiterz„hlen add ax, [zl] ; X-Koordinate weiterz„hlen loop TextLoop4 pop cx ; Pixelz„hler wieder laden loop TextLoop3 ; Weitere Punkte setzen pop es ; Zeiger auf Zeichentabelle wieder laden pop di pop bx ; Y-Koordinate zurcksetzen pop ax ; X-Koordinate zurcksetzen add ax, [sl] ; N„chste Spalte bearbeiten add bx, [su] pop cx loop TextLoop5; pop cx ; Spaltenz„hler wieder laden inc di loop TextLoop2 pop cx ; Zeichenz„hler wieder laden pop bx pop ax add ax, [zch] ; Naechstes Zeichen add bx, [spt] inc si ; plotten loop TextLoop1 pop di ; Alle Register wieder von den B„umen, pop si ; „h, Stack herunterholen pop es pop dx pop cx pop bx pop ax ret ; Back home ENDP ; TEXT.ASM: Regelt die Parameterbernahme von Turbo Pascal aus fr ; die ASMTEXT-Routine in Turbo Assembler ; ; Autor: Frank Riemenschneider ; ; Eingabe: Parameter der TEXT-Prozedur auf dem Stack ; TestPixel( X, Y, TextSeg, TextOfs : WORD ); ; Ausgabe: keine CODESEG PROC Text FAR Xkoord:WORD, Ykoord:WORD, TextSeg:WORD, TextOfs:WORD PUBLIC Text mov ax, [TextOfs] mov si, ax mov ax, [Xkoord] ; X- und Y-Koordinaten in die mov bx, [Ykoord] ; entsprechenden Register bringen call AsmText ; Text-Routine aufrufen TextExit: ret ; Back home ENDP