; This file is part of Advanced Strategic Command; http://www.asc-hq.de ; Copyright (C) 1994-1999 Martin Bickel and Marc Schellenberger ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; see the file COPYING. If not, write to the ; Free Software Foundation, Inc., 59 Temple Place, Suite 330, ; Boston, MA 02111-1307 USA IFNDEF WATCOM .386 MODEL flat,Cpp ENDIF .DATA INCLUDE BASEMACR.INC fontoffset DD ? stringoffset DD ? mempos DD 256 DUP (?) stringlen DB ? ; in Zeichen stringpixlen DD ? ; in Pixeln height DB ? spacelength DD ? charlen DD 256 DUP (?) ; L„nge der einzelnen Buchstaben abstand DD 256 DUP (?) extraheight DB ? rightextralength DW ? leftextralength DD ? bytestoprocess DW ? negkernwidth DW ? temp1 DW ? temp2 DW ? .CODE charsize EQU 8 ; gr”áe eines Characters charpos EQU 8 charmempos EQU 4 ; charlength EQU 0 fontheight EQU 6 fontkerning EQU 2056 ; nlengthpos EQU 307+ 110 *12 ; leerzeichen entspricht L„nge von n tfont STRUC fontname DD ? fontcolor DB ? fontcaps DB ? fnt_height DW ? fntcharacter DB 2048 DUP (?) fntkernchartable DB 65536 DUP (?) fontpalette DD ? fontgroundline DB ? ENDS SETBYTESLW2 MACRO LOCAL LB1,lb2,LB5 mov temp1, di mov temp2, di add temp1, cx jc LB5 ; change virtual page setbytes jmp LB1 LB5: ;xor ecx,ecx sub cx, temp1 setbytes SetNextVirtualPage2 mov edi, _ActiveGraphModeParameters.LinearAddress movzx ecx, temp1 setbytes LB1: ENDM SETSPACELENGTH MACRO LOCAL NOBSW add di,WORD PTR spacelength jnc NOBSW SetNextVirtualPage2 NOBSW: ENDM PUBLIC showtext2_ showtext2_ PROC NEAR LOCALS push ebp ; cmp _activefontsettings.fntcompMode,0 ; jz @@CompatiblityMode mov leftextralength, 0 mov extraheight,0 @@COMPATIBLITYMODE: cmp _ActiveGraphModeParameters.windowstatus,100 jz @@LINEARFRAMEBUFFERINIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; 64 kb Video Window ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mul WORD PTR _ActiveGraphModeParameters.ScanLineLength add ax, bx adc dx,0 cmp dl, byte ptr _hardwaregraphmodeparameters.actsetpage jz @@COMMONINIT push eax push ebx push ecx mov byte ptr _hardwaregraphmodeparameters.pagetoset,dl SetVirtualPage pop ecx pop ebx pop eax jmp @@COMMONINIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; Linear Frame Buffer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@LINEARFRAMEBUFFERINIT: movzx edx, WORD PTR _ActiveGraphModeParameters.ScanLineLength mul edx add eax, ebx ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; Common ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@COMMONINIT: mov negkernwidth,0 add eax,_ActiveGraphModeParameters.LinearAddress mov edi, eax mov ebp, ecx ; String ab jetzt in EBP mov stringoffset, ecx mov ebx, DWORD PTR _activefontsettings cmp ebx,0 ; activefontsettings.font == NULL ? jz @@ENDE mov fontoffset, ebx ; Addresse von activefontsettings.font mov dl, [ebx + fontheight] mov dh, _activefontsettings.fntheight cmp dh,0 jz @@USENORMALHEIGHT cmp dh,dl jb @@LESSHEIGHT sub dh,dl mov extraheight, dh jmp @@USENORMALHEIGHT @@LESSHEIGHT: mov dl,dh @@USENORMALHEIGHT: mov height, dl mov ebx,0 mov stringlen,0 mov stringpixlen,0 ; Berechnen der Speicherpositionen der einzelnen Buchstaben ; in bx Position innerhalb des Strings, in 4er Schritten mov ecx,0 mov edx, fontoffset @@CHARSTART: movzx eax, word ptr [ebp] ; Zeichen in al, bern„chstes in ah cmp al,0 ; Ende des Strings ? jz @@LENGTHCALC movsx ecx, byte ptr [ edx + eax + fontkerning ] ; Kerning in ecx cmp ah, 0 ; n„chstes Zeichen berhaupt vorhanden ?? jz @@keinabstand add ecx, 2 ; Standartm„áiger Zeichenabstand @@keinabstand: and eax, 0ffh lea esi, [ eax * charsize + edx + charpos ] cmp WORD PTR [esi+2],0 ; size jz @@CharDoesNotExist ; wenn 0, dann Zeichen nicht vorhanden mov eax, [esi+4] ; Pointer auf Bilddaten -> EAX add eax,2 ; im ersten Word: L„nge => wird bersprungen mov [mempos + ebx], eax ; im lokalen Array ablegen movzx eax, WORD PTR [esi] ; L„nge des Buchstabens add stringpixlen, eax mov [charlen + ebx], eax add stringpixlen, ecx ; Abstand zum n„chsten Buchstaben draufaddieren mov [abstand + ebx], ecx inc stringlen add ebx,4 @@CharDoesNotExist: inc ebp jmp @@CHARSTART @@LENGTHCALC: mov bx,_activefontsettings.fntlength cmp bx,0 mov rightextralength,0 mov leftextralength,0 jz @@USENORMALLENGTH cmp bx,WORD PTR stringpixlen jb @@LESSLENGTH sub bx,WORD PTR stringpixlen inc bx cmp _activefontsettings.fntjustify,1 ja @@GREATERLENGTHRIGHT jb @@GREATERLENGTHLEFT mov ax,bx shr bx,1 sub ax,bx mov rightextralength,bx mov WORD PTR leftextralength,ax jmp @@LengthCalcFinished @@GREATERLENGTHLEFT: mov rightextralength, bx jmp @@LengthCalcFinished @@GREATERLENGTHRIGHT: mov WORD PTR leftextralength, bx jmp @@LengthCalcFinished @@LESSLENGTH: ; inc bx mov WORD PTR stringpixlen,bx @@USENORMALLENGTH: cmp stringpixlen,0 jz @@ende @@LengthCalcFinished: ; Eigentliche Anzeigeroutine ; benutzt die gerade Berechneten Werte fr Speicherposition und Kerning cmp _ActiveGraphModeParameters.windowstatus,100 jz @@LINDISPSTART ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; 64 kb Video Window ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@DISPSTART: mov dh, _activefontsettings.fntbackground mov eax, _ActiveGraphModeParameters.ScanLineLength sub eax, stringpixlen cmp dh,254 ja @@DISPSTARTNOBACKGR sub ax, rightextralength sub ax, WORD PTR leftextralength jmp @@DISPSTARTNOBACKGRNOLEFTT @@DISPSTARTNOBACKGR: add di, WORD PTR leftextralength jnc @@DISPSTARTNOBACKGRNOLEFTT setnextvirtualpage2 @@DISPSTARTNOBACKGRNOLEFTT: mov spacelength, eax mov dl, _activefontsettings.fntcolor @@DISPLINESTART: cmp dh,255 jz @@NOLEFTSPACE mov ecx,0 mov cx, WORD PTR leftextralength cmp cx,0 jz @@NOLEFTSPACE mov al,dh mov ah,dh SETBYTESLW2 @@NOLEFTSPACE: mov ebx,0 mov ax,WORD PTR stringpixlen cmp ax,0 jle @@LINEFINISHED2 mov bytestoprocess,ax ; in line movzx eax, stringlen @@DISPCHARSTART: mov ebp, [mempos+ebx] mov ecx, [charlen+ebx] @@CHARLOOP: inc negkernwidth cmp BYTE PTR [ebp],0 jz @@SETNOPIX mov [edi], dl jmp @@CONTINUEPIXSET @@SETNOPIX: cmp negkernwidth,0 jl @@CONTINUEPIXSET cmp dh,255 jz @@CONTINUEPIXSET mov [edi], dh @@CONTINUEPIXSET: inc ebp add di,1 jnc @@PIXNOBANKSWITCH SetNextVirtualPage2 @@PIXNOBANKSWITCH: dec bytestoprocess cmp bytestoprocess,0 jle @@LINEFINISHED2 dec cx jnz @@CHARLOOP ; -------------- Kerning --------------- mov ecx,[abstand+ebx] cmp ecx,0 jz @@NAECHSTESZEICHEN jl @@NEGATIV ; --------- Positives Kerning ---------- sub bytestoprocess, cx jnc @@positiv add cx, bytestoprocess @@POSITIV: cmp dh,255 jz @@NOBACKGRKERN mov [edi],dh @@NOBACKGRKERN: add di,1 jnc @@K1NOBANKSWITCH setnextvirtualpage2 @@K1NOBANKSWITCH: dec ecx jnz @@POSITIV jmp @@NAECHSTESZEICHEN ; ------------ Negatives Kerning --------- @@NEGATIV: sub bytestoprocess, cx cmp dh,255 jz @@NOBACKGRNDNEGKERN mov negkernwidth,cx dec negkernwidth @@NOBACKGRNDNEGKERN: add di,cx jc @@NAECHSTESZEICHEN SetPrivVirtualPage2 ; ------------ Kerning fertig -------------- @@NAECHSTESZEICHEN: mov [mempos+ebx],ebp add ebx,4 cmp bytestoprocess,0 jle @@LINEFINISHED dec eax jnz @@DISPCHARSTART jmp @@LINEFINISHED @@LINEFINISHED2: ; Durch zu kurze L„nge abgeschnitten dec ecx add ebp,ecx mov [mempos+ebx],ebp @@LINEFINISHED: cmp dh,255 jz @@EXTRASPACENOBANKSWITCH mov ecx,0 mov cx, rightextralength cmp cx,0 jz @@EXTRASPACENOBANKSWITCH mov al,dh mov ah,dh SETBYTESLW2 @@EXTRASPACENOBANKSWITCH: SETSPACELENGTH dec height jnz @@DISPLINESTART cmp extraheight,0 jz @@ENDE cmp dh,255 jz @@ENDE mov bx, WORD PTR stringpixlen add bx, rightextralength add bx, WORD PTR leftextralength mov al,dh mov ah,dh @@EXTRAHEIGHTLOOPSTART: movzx ecx, bx SETBYTESLW2 SETSPACELENGTH dec extraheight jnz @@EXTRAHEIGHTLOOPSTART jmp @@ENDE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; Linear Frame Buffer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@LINDISPSTART: mov dh, _activefontsettings.fntbackground mov eax, _ActiveGraphModeParameters.ScanLineLength sub eax, stringpixlen cmp dh,254 ja @@LINDISPSTARTNOBACKGR sub ax, rightextralength sub ax, WORD PTR leftextralength jmp @@LINDISPSTARTNOBACKGRNOEEXTRALEFT @@LINDISPSTARTNOBACKGR: add edi, leftextralength @@LINDISPSTARTNOBACKGRNOEEXTRALEFT: mov spacelength, eax mov dl, _activefontsettings.fntcolor @@LINDISPLINESTART: cmp dh,255 jz @@LINNOLEFTSPACE mov ecx,0 mov cx, WORD PTR leftextralength cmp cx,0 jz @@LINNOLEFTSPACE mov al,dh mov ah,dh SetBytes @@LINNOLEFTSPACE: mov ebx,0 mov ax,WORD PTR stringpixlen cmp ax,0 jle @@LINLINEFINISHED2 mov bytestoprocess,ax ; in line movzx eax, stringlen @@LINDISPCHARSTART: mov ebp, [mempos+ebx] mov ecx, [charlen+ebx] @@LINCHARLOOP: inc negkernwidth cmp BYTE PTR [ebp],0 jz @@LINSETNOPIX mov [edi], dl jmp @@LINCONTINUEPIXSET @@LINSETNOPIX: cmp negkernwidth,0 jl @@LINCONTINUEPIXSET cmp dh,255 jz @@LINCONTINUEPIXSET mov [edi], dh @@LINCONTINUEPIXSET: inc ebp inc edi dec bytestoprocess cmp bytestoprocess,0 jle @@LINLINEFINISHED2 dec cx jnz @@LINCHARLOOP ; -------------- Kerning --------------- mov ecx,[abstand+ebx] cmp ecx,0 jz @@LINNAECHSTESZEICHEN jl @@LINNEGATIV ; --------- Positives Kerning ---------- sub bytestoprocess, cx jnc @@LINPOSNoOverflow add cx, bytestoprocess @@LINPOSNoOverflow: cmp dh,255 jz @@LinPosKernNochBackGround @@LINPOSKERNBACK: mov [edi],dh inc edi dec ecx jnz @@LINPOSKERNBACK jmp @@LINNAECHSTESZEICHEN @@LinPosKernNochBackGround: add edi, ecx jmp @@LINNAECHSTESZEICHEN ; ------------ Negatives Kerning --------- @@LINNEGATIV: mov negkernwidth,cx dec negkernwidth sub bytestoprocess, cx add edi,ecx ; ------------ Kerning fertig -------------- @@LINNAECHSTESZEICHEN: mov [mempos+ebx],ebp add ebx,4 cmp bytestoprocess,0 jle @@LINLINEFINISHED dec eax jnz @@LINDISPCHARSTART jmp @@LINLINEFINISHED @@LINLINEFINISHED2: ; Durch zu kurze L„nge abgeschnitten dec ecx add ebp,ecx mov [mempos+ebx],ebp @@LINLINEFINISHED: cmp dh,255 jz @@LINEXTRASPACENOBANKSWITCH mov ecx,0 mov cx, rightextralength cmp ecx,0 jz @@LINEXTRASPACENOBANKSWITCH mov al,dh mov ah,dh SetBytes @@LINEXTRASPACENOBANKSWITCH: add edi, spacelength dec height jnz @@LINDISPLINESTART cmp extraheight,0 jz @@ENDE cmp dh,255 jz @@ENDE mov bx, WORD PTR stringpixlen add bx, rightextralength add bx, WORD PTR leftextralength mov al,dh mov ah,dh @@LINEXTRAHEIGHTLOOPSTART: movzx ecx, bx SetBytes add edi, spacelength dec extraheight jnz @@LINEXTRAHEIGHTLOOPSTART @@ENDE: pop ebp ret ENDP PUBLIC showtext2c_ showtext2c_ PROC NEAR LOCALS push ebp ; cmp _activefontsettings.fntcompMode,0 ; jz @@CompatiblityMode mov leftextralength, 0 mov extraheight,0 @@COMPATIBLITYMODE: cmp _ActiveGraphModeParameters.windowstatus,100 jz @@LINEARFRAMEBUFFERINIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; 64 kb Video Window ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mul WORD PTR _ActiveGraphModeParameters.ScanLineLength add ax, bx adc dx,0 cmp dl, byte ptr _hardwaregraphmodeparameters.actsetpage jz @@COMMONINIT push eax push ebx push ecx mov byte ptr _hardwaregraphmodeparameters.pagetoset,dl SetVirtualPage pop ecx pop ebx pop eax jmp @@COMMONINIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; Linear Frame Buffer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@LINEARFRAMEBUFFERINIT: movzx edx, WORD PTR _ActiveGraphModeParameters.ScanLineLength mul edx add eax, ebx ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; Common ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@COMMONINIT: mov negkernwidth,0 add eax,_ActiveGraphModeParameters.LinearAddress mov edi, eax mov ebp, ecx ; String ab jetzt in EBP mov stringoffset, ecx mov ebx, DWORD PTR _activefontsettings cmp ebx,0 ; activefontsettings.font == NULL ? jz @@ENDE mov fontoffset, ebx ; Addresse von activefontsettings.font mov dl, [ebx + fontheight] mov dh, _activefontsettings.fntheight cmp dh,0 jz @@USENORMALHEIGHT cmp dh,dl jb @@LESSHEIGHT sub dh,dl mov extraheight, dh jmp @@USENORMALHEIGHT @@LESSHEIGHT: mov dl,dh @@USENORMALHEIGHT: mov height, dl mov ebx,0 mov stringlen,0 mov stringpixlen,0 ; Berechnen der Speicherpositionen der einzelnen Buchstaben ; in bx Position innerhalb des Strings, in 4er Schritten mov ecx,0 mov edx, fontoffset @@CHARSTART: movzx eax, word ptr [ebp] ; Zeichen in al, bern„chstes in ah cmp al,0 ; Ende des Strings ? jz @@LENGTHCALC movsx ecx, byte ptr [ edx + eax + fontkerning ] ; Kerning in ecx cmp ah, 0 ; n„chstes Zeichen berhaupt vorhanden ?? jz @@keinabstand add ecx, 2 ; Standartm„áiger Zeichenabstand @@keinabstand: and eax, 0ffh lea esi, [ eax * charsize + edx + charpos ] cmp WORD PTR [esi+2],0 ; size jz @@CharDoesNotExist ; wenn 0, dann Zeichen nicht vorhanden mov eax, [esi+4] ; Pointer auf Bilddaten -> EAX add eax,2 ; im ersten Word: L„nge => wird bersprungen mov [mempos + ebx], eax ; im lokalen Array ablegen movzx eax, WORD PTR [esi] ; L„nge des Buchstabens add stringpixlen, eax mov [charlen + ebx], eax add stringpixlen, ecx ; Abstand zum n„chsten Buchstaben draufaddieren mov [abstand + ebx], ecx inc stringlen add ebx,4 @@CharDoesNotExist: inc ebp jmp @@CHARSTART @@LENGTHCALC: mov bx,_activefontsettings.fntlength cmp bx,0 mov rightextralength,0 mov leftextralength,0 jz @@USENORMALLENGTH cmp bx,WORD PTR stringpixlen jb @@LESSLENGTH sub bx,WORD PTR stringpixlen inc bx cmp _activefontsettings.fntjustify,1 ja @@GREATERLENGTHRIGHT jb @@GREATERLENGTHLEFT mov ax,bx shr bx,1 sub ax,bx mov rightextralength,bx mov WORD PTR leftextralength,ax jmp @@LengthCalcFinished @@GREATERLENGTHLEFT: mov rightextralength, bx jmp @@LengthCalcFinished @@GREATERLENGTHRIGHT: mov WORD PTR leftextralength, bx jmp @@LengthCalcFinished @@LESSLENGTH: ; inc bx mov WORD PTR stringpixlen,bx @@USENORMALLENGTH: cmp stringpixlen,0 jz @@ende @@LengthCalcFinished: ; Eigentliche Anzeigeroutine ; benutzt die gerade Berechneten Werte fr Speicherposition und Kerning cmp _ActiveGraphModeParameters.windowstatus,100 jz @@LINDISPSTART ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; 64 kb Video Window ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@DISPSTART: mov dh, _activefontsettings.fntbackground mov eax, _ActiveGraphModeParameters.ScanLineLength sub eax, stringpixlen cmp dh,254 ja @@DISPSTARTNOBACKGR sub ax, rightextralength sub ax, WORD PTR leftextralength jmp @@DISPSTARTNOBACKGRNOLEFTT @@DISPSTARTNOBACKGR: add di, WORD PTR leftextralength jnc @@DISPSTARTNOBACKGRNOLEFTT setnextvirtualpage2 @@DISPSTARTNOBACKGRNOLEFTT: mov spacelength, eax @@DISPLINESTART: cmp dh,255 jz @@NOLEFTSPACE mov ecx,0 mov cx, WORD PTR leftextralength cmp cx,0 jz @@NOLEFTSPACE mov al,dh mov ah,dh SETBYTESLW2 @@NOLEFTSPACE: mov ebx,0 mov ax,WORD PTR stringpixlen cmp ax,0 jle @@LINEFINISHED2 mov bytestoprocess,ax ; in line movzx eax, stringlen @@DISPCHARSTART: mov ebp, [mempos+ebx] mov ecx, [charlen+ebx] @@CHARLOOP: inc negkernwidth mov dl,BYTE PTR [ebp] cmp dl,0 jz @@SETNOPIX mov [edi], dl jmp @@CONTINUEPIXSET @@SETNOPIX: cmp negkernwidth,0 jl @@CONTINUEPIXSET cmp dh,255 jz @@CONTINUEPIXSET mov [edi], dh @@CONTINUEPIXSET: inc ebp add di,1 jnc @@PIXNOBANKSWITCH SetNextVirtualPage2 @@PIXNOBANKSWITCH: dec bytestoprocess cmp bytestoprocess,0 jle @@LINEFINISHED2 dec cx jnz @@CHARLOOP ; -------------- Kerning --------------- mov ecx,[abstand+ebx] cmp ecx,0 jz @@NAECHSTESZEICHEN jl @@NEGATIV ; --------- Positives Kerning ---------- sub bytestoprocess, cx jnc @@positiv add cx, bytestoprocess @@POSITIV: cmp dh,255 jz @@NOBACKGRKERN mov [edi],dh @@NOBACKGRKERN: add di,1 jnc @@K1NOBANKSWITCH setnextvirtualpage2 @@K1NOBANKSWITCH: dec ecx jnz @@POSITIV jmp @@NAECHSTESZEICHEN ; ------------ Negatives Kerning --------- @@NEGATIV: sub bytestoprocess, cx cmp dh,255 jz @@NOBACKGRNDNEGKERN mov negkernwidth,cx dec negkernwidth @@NOBACKGRNDNEGKERN: add di,cx jc @@NAECHSTESZEICHEN SetPrivVirtualPage2 ; ------------ Kerning fertig -------------- @@NAECHSTESZEICHEN: mov [mempos+ebx],ebp add ebx,4 cmp bytestoprocess,0 jle @@LINEFINISHED dec eax jnz @@DISPCHARSTART jmp @@LINEFINISHED @@LINEFINISHED2: ; Durch zu kurze L„nge abgeschnitten dec ecx add ebp,ecx mov [mempos+ebx],ebp @@LINEFINISHED: cmp dh,255 jz @@EXTRASPACENOBANKSWITCH mov ecx,0 mov cx, rightextralength cmp cx,0 jz @@EXTRASPACENOBANKSWITCH mov al,dh mov ah,dh SETBYTESLW2 @@EXTRASPACENOBANKSWITCH: SETSPACELENGTH dec height jnz @@DISPLINESTART cmp extraheight,0 jz @@ENDE cmp dh,255 jz @@ENDE mov bx, WORD PTR stringpixlen add bx, rightextralength add bx, WORD PTR leftextralength mov al,dh mov ah,dh @@EXTRAHEIGHTLOOPSTART: movzx ecx, bx SETBYTESLW2 SETSPACELENGTH dec extraheight jnz @@EXTRAHEIGHTLOOPSTART jmp @@ENDE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; Linear Frame Buffer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@LINDISPSTART: mov dh, _activefontsettings.fntbackground mov eax, _ActiveGraphModeParameters.ScanLineLength sub eax, stringpixlen cmp dh,254 ja @@LINDISPSTARTNOBACKGR sub ax, rightextralength sub ax, WORD PTR leftextralength jmp @@LINDISPSTARTNOBACKGRNOEEXTRALEFT @@LINDISPSTARTNOBACKGR: add edi, leftextralength @@LINDISPSTARTNOBACKGRNOEEXTRALEFT: mov spacelength, eax @@LINDISPLINESTART: cmp dh,255 jz @@LINNOLEFTSPACE mov ecx,0 mov cx, WORD PTR leftextralength cmp cx,0 jz @@LINNOLEFTSPACE mov al,dh mov ah,dh SetBytes @@LINNOLEFTSPACE: mov ebx,0 mov ax,WORD PTR stringpixlen cmp ax,0 jle @@LINLINEFINISHED2 mov bytestoprocess,ax ; in line movzx eax, stringlen @@LINDISPCHARSTART: mov ebp, [mempos+ebx] mov ecx, [charlen+ebx] @@LINCHARLOOP: inc negkernwidth mov dl,BYTE PTR [ebp] cmp dl,0 jz @@LINSETNOPIX mov [edi], dl jmp @@LINCONTINUEPIXSET @@LINSETNOPIX: cmp negkernwidth,0 jl @@LINCONTINUEPIXSET cmp dh,255 jz @@LINCONTINUEPIXSET mov [edi], dh @@LINCONTINUEPIXSET: inc ebp inc edi dec bytestoprocess cmp bytestoprocess,0 jle @@LINLINEFINISHED2 dec cx jnz @@LINCHARLOOP ; -------------- Kerning --------------- mov ecx,[abstand+ebx] cmp ecx,0 jz @@LINNAECHSTESZEICHEN jl @@LINNEGATIV ; --------- Positives Kerning ---------- sub bytestoprocess, cx jnc @@LINPOSNoOverflow add cx, bytestoprocess @@LINPOSNoOverflow: cmp dh,255 jz @@LinPosKernNochBackGround @@LINPOSKERNBACK: mov [edi],dh inc edi dec ecx jnz @@LINPOSKERNBACK jmp @@LINNAECHSTESZEICHEN @@LinPosKernNochBackGround: add edi, ecx jmp @@LINNAECHSTESZEICHEN ; ------------ Negatives Kerning --------- @@LINNEGATIV: mov negkernwidth,cx dec negkernwidth sub bytestoprocess, cx add edi,ecx ; ------------ Kerning fertig -------------- @@LINNAECHSTESZEICHEN: mov [mempos+ebx],ebp add ebx,4 cmp bytestoprocess,0 jle @@LINLINEFINISHED dec eax jnz @@LINDISPCHARSTART jmp @@LINLINEFINISHED @@LINLINEFINISHED2: ; Durch zu kurze L„nge abgeschnitten dec ecx add ebp,ecx mov [mempos+ebx],ebp @@LINLINEFINISHED: cmp dh,255 jz @@LINEXTRASPACENOBANKSWITCH mov ecx,0 mov cx, rightextralength cmp ecx,0 jz @@LINEXTRASPACENOBANKSWITCH mov al,dh mov ah,dh SetBytes @@LINEXTRASPACENOBANKSWITCH: add edi, spacelength dec height jnz @@LINDISPLINESTART cmp extraheight,0 jz @@ENDE cmp dh,255 jz @@ENDE mov bx, WORD PTR stringpixlen add bx, rightextralength add bx, WORD PTR leftextralength mov al,dh mov ah,dh @@LINEXTRAHEIGHTLOOPSTART: movzx ecx, bx SetBytes add edi, spacelength dec extraheight jnz @@LINEXTRAHEIGHTLOOPSTART @@ENDE: pop ebp ret ENDP PUBLIC expand_ expand_ PROC NEAR LOCALS pusha mov esi, eax mov edi, ebx mov ax, [esi] mov [edi],ax mov dx,1 add esi,2 add edi,2 @STRT: mov al,[esi] inc esi ; mov dx,ax mov bx,1 ror bx,1 @SRT2: rol bx,1 test al,bl jnz @SRT3 mov [edi],dh ; stosb 0 jmp @SRT4 @SRT3: mov [edi],dl ; stosb 1 @SRT4: inc edi dec ecx jz @@ENDE cmp bx,80h jnz @SRT2 jmp @STRT @@ENDE: popa ret ENDP END