Files

452 lines
8.1 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; BGI Font Test
;
; Written in pure assembler by Ivushkin Andrey aka Willow
;
; Created: December 20, 2004
;
; Last changed: February 2, 2005
;
BGIFONT_PATH equ '/sys/FONTS/'
_X equ 340
_Y equ 240
BGI_WINDOW_CLIP equ 1
BGI_PRC_INFO equ pinfo
macro ListFonts
{
mov eax,lf_head
call PixelPrint
mov ebx,20 shl 16+60
mov ecx,(BGIfont_names_end-BGIfont_names)/4
mov esi,BGIfont_names
.l1:
pusha
pusha
mcall 4,,0x10777fac,esi,4
popa
mov edx,[esi]
BGIfont_GetID
mov dword[_BGIfont_Prepare.font],edx
mov ecx,eax
add ebx,140 shl 16
mov edx,ebx
mcall 47,0x80100,,,0x10ffffff
jecxz .nofont
lea ebx,[edx+80 shl 16+12]
mov edx,_BGIfont_Prepare.fontfullname
mov esi,_BGIfont_Prepare.fontattr-1
sub esi,edx
add ecx,0x3b800b8
BGIfont_Outtext
sub ebx,155 shl 16+12
mcall 4,,0x1000f000,load_ok,load_fail-load_ok
jmp .pop
.nofont:
lea ebx,[edx-80 shl 16]
mcall 4,,0x10f00010,load_fail,font_msg-load_fail
.pop:
popa
add esi,4
add ebx,39
loop .l2
jmp .ex
.l2:
jmp .l1
.ex:
}
use32
org 0x0
db 'MENUET01'
dd 0x01
dd START
dd I_END
dd 0x100000
dd 0x100000
dd 0x0
not1strun dd 0x0
include 'lang.inc'
include '..\..\..\..\macros.inc'
;include 'debug.inc'
include 'bgifont.inc'
START:
mov [help],0
mov ecx,(BGIfont_names_end-BGIfont_names)/4
mov esi,BGIfont_names
mov edi,I_END
BGIfont_Init
reset:
mov esi,[BGIfont_Ptr]
inc esi
mov edi,freeconst
movsd
mov esi,freeconst
mov edi,freetest
mov ecx,36
rep movsb
red:
mov eax,[freetest]
mov dword[title+19],eax
call draw_window
cmp [not1strun],0
jnz still
mcall 5,300
not [not1strun]
inc [help]
jmp red
still:
mov eax,10
mcall
cmp eax,1
je red
cmp eax,2
je key
cmp eax,3
je button
jmp still
button:
mov eax,17
mcall
cmp ah,1
jnz noclose
close:
xor eax,eax
dec eax
mcall
noclose:
jmp still
key:
mov eax,2
mcall
shr eax,8
cmp al,27 ; esc - close
je close
cmp al,32 ; Space - help
jne .noh
inc [help]
cmp [help],3
jne red
and [help],0
jmp red
.noh:
cmp [help],2
jne still
cmp al,50
jb .noff
cmp al,57
ja .noff
sub al,46
.gn:
movzx ecx,al
shl ecx,28
call BGIfont_GetName
mov [freetest],edx
jmp red
.noff:
mov ecx,4
mov edi,Fkeys
.fkey:
cmp al,[edi]
je .fndkey
inc edi
loop .fkey
jmp .notfnd
.fndkey:
lea eax,[edi-Fkeys+0xc]
jmp .gn
.notfnd:
cmp al,114 ; r - reset
je reset
cmp al,176
jne .nol ; left
sub dword[freetest+8],5
jmp red
.nol:
cmp al,179
jne .nor ; right
add dword[freetest+8],5
jmp red
.nor:
cmp al,105 ; i -italic
jne .noi
xor dword[freetest+32],BGI_ITALIC
jmp red
.noi:
cmp al,98 ; b -bold
jne .nob
xor dword[freetest+32],BGI_BOLD
jmp red
.nob:
mov ecx,2
mov esi,ali
.ol2:
cmp al,[esi]
jne .othl2
mov ax,[freetest+32]
add ax,[esi+3]
mov bx,ax
mov dx,[esi+1]
and bx,dx
cmp bx,dx
jne .ok
not dx
and ax,dx
.ok:
mov [freetest+32],ax
jmp red
.othl2:
add esi,5
loop .ol2
.other:
mov esi,delt
mov ecx,4
.ol:
cmp al,[esi]
jne .othl
fld dword[esi+1]
movzx eax,byte[esi+5]
fadd dword[freetest+eax]
fstp dword[freetest+eax]
jmp red
.othl:
add esi,6
loop .ol
jmp still
draw_window:
mov eax,48
mov ebx,3
mov ecx,sc
mov edx,sizeof.system_colors
mcall
mov eax,12
mov ebx,1
mcall
xor eax,eax
mov ebx,10*65536+_X*2+30
mov ecx,100*65536+_Y*2
mov edx,0x04261212
mov esi,0x805080d0
mov edi,0x005080d0
mcall
mov eax,4
mov ebx,8*65536+8
mov ecx,[sc.grab_text]
or ecx,0x10000000
mov edx,title
mov esi,title_end-title
cmp [help],2
je .int
sub esi,12
.int:
mcall
cmp [help],0
jnz .help
cmp byte[I_END],0
jnz .fontsok
mov eax,font_msg
call PixelPrint
.fontsok:
ListFonts
jmp .eod
.help:
cmp [help],1
jne .nohelp
mov eax,helptxt
cmp byte[I_END],0
jnz .fontsok2
mov word[eax+2],_X-80
call PixelPrint
jmp .eod
.fontsok2:
mov word[eax+2],_X
call Print
jmp .eod
.nohelp:
mov edi,cross
mov eax,38
mov edx,0x4b331a
mov ebx,[edi]
mov ecx,[edi+4]
mcall
mov ebx,[edi+8]
mov ecx,[edi+12]
mcall
mov ebx,freetest
BGIfont_Freetext
.eod:
mov eax,12
mov ebx,2
mcall
ret
Print: ; eax-pointer to _txt struc
pusha
mov ebx,[eax]
movzx ecx,byte[eax+12]
lea edx,[eax+13]
mov edi,eax
.nextstr:
mov esi,[edx]
add edx,4
push ecx
mov ecx,[edi+8]
BGIfont_Outtext
add ebx,[edi+4]
pop ecx
and esi,0xfff
add edx,esi
loop .nextstr
popa
ret
PixelPrint: ; eax-pointer to _txt struc, but used differently
pusha
mov ebp,eax
mov ebx,[ebp]
movzx ecx,byte[ebp+12]
mov eax,4
lea edx,[ebp+17]
.l:
mov esi,[edx-4]
and esi,0xfff
push ecx
mov ecx,[ebp+8]
mcall
pop ecx
lea edx,[esi+edx+4]
add ebx,[ebp+4]
loop .l
popa
ret
macro _txt _xy,_vert,_color,_opt,[_str]
{
common
_counter=0
forward
_counter=_counter+1
common
dd _xy ; 0
dd _vert ; 4
dd _color ; 8
db _counter ;_str_count ; 12
forward
local .str_beg,.str_end
dd (.str_end-.str_beg) or _opt ; 13
.str_beg:
db _str ;17
.str_end:
}
title db 'BGIFONT.INC demo - FONT font'
title_end:
_M equ 30
cross dd _M shl 16+_X*2-_M,_Y shl 16+_Y,_X shl 16+_X,_M shl 16+_Y*2-_M
helptxt:
if lang eq ru_RU
_txt _X shl 16+60,40,0x434ba010,BGI_HACENTER,\
"ƒŽ<EFBFBD>Ÿˆ Šˆ˜ˆ:",\
"<EFBFBD>஡¥« - èà¨äâë/íâ®â ⥪áâ/¤¥¬ª ;",\
"<-> áâ५ª¨ - ¢à é¥­¨¥ áâப¨;",\
"V - ¢ëà ¢­¨¢ ­¨¥ ¯® ¢¥à⨪ «¨;",\
"H - ¢ëà ¢­¨¢ ­¨¥ ¯® £®à¨§®­â «¨;",\
"[,] - ¬ áèâ ¡ ¯® ®á¨ X;",\
"A,Z - ¬ áèâ ¡ ¯® ®á¨ Y;",\
"B,I - ¯®«ã¦¨à­ë© èà¨äâ ¨ ªãàᨢ;",\
"R - á¡à®á ¯ à ¬¥â஢ èà¨äâ ;",\
"F1..F12 - ¢ë¡®à èà¨äâ ;",\
"Esc - § ªàëâì ¯à®£ã :-("
alpha:
db "‚®â ¯à¨¬¥à ⥪áâ !"
lf_head:
_txt 10 shl 16+30,85 shl 16,0x6e00f7,0,"ˆ¬ï èà¨äâ ","‘â âãá","ID",\
"<EFBFBD>ãâì ª ä ©«ã"
load_ok:
db "§ £à㦥­"
load_fail:
db "­¥ ­ ©¤¥­"
font_msg:
_txt (_X+20) shl 16+180,25,0x10ff0000,0,\
"Š á®¦ «¥­¨î, ­¥ ­ ©¤¥­® ­¨ ®¤­®£®",\
"¢¥ªâ®à­®£® èà¨äâ  *.CHR. ®§¬®¦­®,",\
"¢ ¬ á«¥¤ã¥â ¨á¯à ¢¨âì ª®­áâ ­âã",\
"BGIFONT_PATH ¢ ­ ç «¥ ä ©«  BGITEST.ASM",\
"¨ ¯¥à¥ª®¬¯¨«¨à®¢ âì ¥£® :-("
else
_txt _X shl 16+60,40,0x434ba010, BGI_HACENTER,\
"HOT KEYS:",\
"Space - font list/this message/demo;",\
"<-> arrows - rotate text string;",\
"V - toggle vertical alignment;",\
"H - toggle horizontal alignment;",\
"[,] - scale on X axis;",\
"A,Z - scale on Y axis;",\
"B,I - toggle bold & italic mode;",\
"R - reset font options;",\
"F1..F12 - select font;",\
"Esc - close demo :-("
alpha:
db 'This is a Sample text!'
; db 'ABCDEFGHIGKLMNOPQRSTUVWXWZ'
lf_head:
_txt 10 shl 16+30,85 shl 16,0x6e00f7,0,"Font name","Status","ID",\
"Filename"
load_ok:
db "loaded"
load_fail:
db "not found"
font_msg:
_txt (_X+20) shl 16+180,25,0x10ff0000,0,\
"Sorry, no vector font *.CHR found.",\
"Maybe you should correct BGIFONT_PATH",\
"constant at the beginning of file",\
"BGITEST.ASM and recompile it :-("
end if
macro Deltas _key,_scale,_ofs
{
db _key
dd _scale
db _ofs
}
delt:
Deltas 91, -0.15,12
Deltas 93, 0.15,12
Deltas 97, 0.15,16
Deltas 122,-0.15,16
Fkeys db 48,49,68,255
macro Aligns _key,_mask,_add
{
db _key
dw _mask,_add
}
ali:
Aligns 118,BGI_VAMASK,BGI_VATOP
Aligns 104,BGI_HAMASK,BGI_HARIGHT
freeconst BGIfree 'FONT',_X shl 16+_Y,0, 1.0, 1.0, alpha,\
lf_head-alpha,0xb800e7,\
BGI_VACENTER or BGI_HACENTER
freetest BGIfree ?,?,?,?,?,?,?,?,?
help db ?
pinfo:
times 1024 db ?
sc system_colors
I_END: