.code
align 4
g_putch proc,x:dword,y:dword,char:byte
pushad
mov edi,_v_buffer
xor eax,eax
mov al,char
mul fontcharsiz
mov esi,eax
add esi,font
add esi,sizeof g_fnthead
mov eax,y
mul _v_xb
add edi,eax
mov eax,x
mul _v_bypp
add edi,eax
mov eax,fontx
mov ecx,eax
mul _v_bypp
mov ebx,fonty
mov edx,_v_xb
sub edx,eax
mov eax,fontclr
.if _v_bypp==1
topa:
push cx
gputch_1a:
cmp bptr[esi],0
.if zero?
inc esi
inc edi
jmp gputch_2a
.endif
.if !fonttyp
movsb
jmp gputch_2a
.endif
inc esi
stosb
gputch_2a:
dec cx
jnz gputch_1a
pop cx
add edi,edx
dec ebx
jnz topa
popad
ret
.endif
.if _v_bypp==2
topb:
push cx
gputch_1b:
cmp wptr[esi],0
.if zero?
inc esi
inc esi
inc edi
inc edi
jmp gputch_2b
.endif
.if !fonttyp
movsw
jmp gputch_2b
.endif
inc esi
inc esi
stosw
gputch_2b:
dec cx
jnz gputch_1b
pop cx
add edi,edx
dec ebx
jnz topb
popad
ret
.endif
.if _v_bypp==3 ;24bit
topc:
push cx
gputch_1c:
cmp wptr[esi],0
jnz @f
cmp bptr[esi+2],0
.if zero?
add esi,3
add edi,3
jmp gputch_2c
.endif
@@:
.if !fonttyp
movsw
movsb
jmp gputch_2c
.endif
add esi,3
stosw
ror eax,16
stosb
ror eax,16
gputch_2c:
dec cx
jnz gputch_1c
pop cx
add edi,edx
dec ebx
jnz topc
popad
ret
.endif
;32bit
topd:
push cx
gputch_1d:
cmp dptr[esi],0
.if zero?
add esi,4
add edi,4
jmp gputch_2d
.endif
.if !fonttyp
movsd
jmp gputch_2d
.endif
add esi,4
stosd
gputch_2d:
dec cx
jnz gputch_1d
pop cx
add edi,edx
dec ebx
jnz topd
popad
ret
g_putch endp
align 4
g_printxy proc,x:dword,y:dword,s:dword
pushad
mov esi,s
mov ebx,x
mov ecx,y
jmp gputstr_1
gputstr_2:
callp g_putch,ebx,ecx,dl
add ebx,fontx
inc esi
gputstr_1:
mov dl,[esi]
cmp dl,13
jz enter1
cmp dl,10
jz ignore
cmp dl,0
jnz gputstr_2
popad
ret
enter1:
inc s
mov x,0
mov eax,fonty
add y,eax
jmp gputstr_1
ignore:
inc s
jmp gputstr_1
g_printxy endp
align 4
g_printf proc,x:dword,y:dword,str1:dword,argv:vararg
local siz:dword
pushad
lea eax,argv
callp _vprintf_siz,str1,eax
mov siz,eax
sub esp,eax
lea eax,argv
mov edi,esp
callp vsprintf,edi,str1,eax
callp g_printxy,x,y,esp
callp strlen,esp
mov ecx,fontx
mul ecx
add x,eax
add esp,siz
popad
xor eax,eax
ret
g_printf endp
align 4
g_hline proc,x1:dword,y1:dword,x2:dword,col:dword
local l:dword
pushad
mov eax,x2
.if x1>eax
xchg eax,x1
mov x2,eax
.endif
sub eax,x1
inc eax
mov l,eax
mov edi,_v_buffer
mov eax,y1
mul _v_xb
add edi,eax
mov eax,x1
mul _v_bypp
add edi,eax
.if wptr[_v_bypp]==1
mov ecx,l
mov al,bptr[col]
rep stosb
.elseif wptr[_v_bypp]==2
mov ecx,l
mov ax,wptr[col]
rep stosw
.elseif wptr[_v_bypp]==4 ;;added in v2.03:Beta #5
mov ecx,l
mov eax,col
rep stosd
.else
mov eax,l
mov ebx,_v_bypp
@@:
lea esi,col ;;FIX : v2.03 Beta #5 : this was above the @@:
mov ecx,ebx
rep movsb
sub esi,ebx
dec eax
jnz @b
.endif
popad
ret
g_hline endp
align 4
g_vline proc,x1:dword,y1:dword,y2:dword,col:dword
pushad
mov eax,y2
.if y1>eax
xchg eax,y1
mov y2,eax
.endif
sub eax,y1
inc eax
mov ebx,eax
mov edi,_v_buffer
mov eax,y1
mul _v_xb
add edi,eax
mov eax,x1
mul _v_bypp
add edi,eax
lea esi,col
mov edx,_v_bypp
@@:
mov ecx,edx
rep movsb
sub esi,edx
add edi,_v_xb
sub edi,edx
dec ebx
jnz @b
popad
ret
g_vline endp
align 4
g_box proc,x1:dword,y1:dword,x2:dword,y2:dword,col:dword
callp g_hline,x1,y1,x2,col
callp g_vline,x1,y1,y2,col
callp g_vline,x2,y1,y2,col
callp g_hline,x1,y2,x2,col
ret
g_box endp
align 4
g_boxfill proc,x1:dword,y1:dword,x2:dword,y2:dword,col:dword
local xl:dword,yl:dword
pushad
mov eax,x2
.if x1>eax
xchg eax,x1
mov x2,eax
.endif
sub eax,x1
inc eax
mul _v_bypp
mov xl,eax
mov eax,y2
.if y1>eax
xchg eax,y1
mov y2,eax
.endif
sub eax,y1
inc eax
mov yl,eax
mov edi,_v_buffer
mov eax,y1
mul _v_xb ;FIX : v2.03 Beta #5
add edi,eax
mov eax,x1
mul _v_bypp
add edi,eax
mov eax,_v_x
sub eax,xl
mul _v_bypp ;FIX : v2.03 Beta #5
mov ebx,yl
top:
mov edx,xl
@@:
lea esi,col
mov ecx,_v_bypp
rep movsb
dec edx
jnz @b
add edi,eax
dec ebx
jnz top
popad
ret
g_boxfill endp