/programs/15/trunk/15.ASM |
---|
0,0 → 1,489 |
; |
; The famous game 15 |
; Author: Lloyd, coded by Ivushkin Andrey |
; Compile with FASM |
; |
include 'lang.inc' |
include 'macros.inc' ; decreases program size (not required) |
BgdColor equ 0x02aabbcc |
StatusColor equ 0x02ffffff |
StatusColor2 equ 0x02dc1e14 |
BgdColor equ 0x03aabbcc |
; Main window dimensions |
XXwindow equ 200 shl 16+276 |
YYwindow equ 200 shl 16+300 |
; Status bar |
XYstatus equ 35 shl 16+283 |
XXbar equ 35 shl 16+136 |
YYbar equ 280 shl 16+15 |
; Buttons |
BtnTop equ 28 |
BtnLeft equ 13 |
BtnSize equ 60 |
BtnColor equ 0xafbb55 |
BtnColor2 equ 0x0228c314 |
NumColor equ 0x10000000 |
; Number shifting for nice look |
NumShift equ 24 shl 16+27 |
NumShift2 equ 4 shl 16 |
; Shuffle button |
XXSh equ 202 shl 16+60 |
YYSh equ 280 shl 16+12 |
XYShText equ 212 shl 16+283 |
; Conf button |
XXCnf equ 13 shl 16+13 |
YYCnf equ 280 shl 16+12 |
XYCnfText equ 18 shl 16+283 |
; Position of the 'hole' |
null equ (curconf+16) |
; Amount of moves to perform shuffle |
SH_CYCLES equ 400 |
; (Amount of tasks)-1 |
CONF_COUNT equ 2 |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd START |
dd I_END |
dd 0x2000 ; 8 Kb |
dd 0x2000 |
dd 0x0 |
dd 0x0 |
START: |
mov [cptr],CONF_COUNT ; number of task |
mov eax,3 |
int 0x40 |
mov cl,16 |
ror eax,cl |
mov [generator],eax ; random generator from Tetris |
init: |
mov ecx,17 |
movzx eax,[cptr] |
inc eax |
cmp eax,CONF_COUNT |
jna init_ok |
xor eax,eax ; cycling 0..CONF_COUNT |
init_ok: |
mov [cptr],al |
mov esi,eax |
shl esi,4 |
add esi,conf |
add esi,eax |
add al,0x31 |
mov [lenTitle-1],al ;task number to program title |
mov [task],esi |
mov edi,curconf |
rep movsb ; initial configuration |
mov [sts],4 |
jmp red |
SHUF: |
call shuffle ; immediate shuffle |
red: ; window redraw |
call draw_window |
still: ; MAIN PROGRAM CYCLE |
mov eax,10 ; wait for event |
int 0x40 |
cmp eax,1 ; redraw? - |
je red ; goto red |
cmp eax,2 ; key pressed? - |
je key ; goto key |
cmp eax,3 ; button pressed? - |
je button ; goto button |
jmp still ; no more events to process |
key: ; Key pressed |
mov eax,2 |
int 0x40 |
shr eax,8 |
cmp eax,32 ; <Space> = Shuffle |
je SHUF |
cmp eax,13 ; <Enter> = Choose task |
je init |
cmp eax,176 |
jl still |
sub eax,176 |
cmp eax,3 |
ja still |
movzx eax,byte [eax+correct] ; 'delta' value from correct[] |
jmp m_check |
button: ; Button pressed |
mov eax,17 |
int 0x40 |
shr eax,8 |
sub eax,2 |
cmp eax,-1 ; id == 1 (closeme)? |
jne noclose |
int 0x40 |
noclose: |
jl SHUF ; Shuffle (id=0) pressed |
cmp eax,18 |
je init ; Conf button pressed |
sub al,byte [null] |
mov edi,correct |
mov ecx,4 |
repne scasb ; checking for valid move-part 1 |
jne fail |
m_check: |
cmp byte[sts],4 ; puzzle completed, blocking buttons |
ja still |
call move_check ; checking for valid move-part 2 |
jnc fail |
inc [move_count] |
call draw_moves |
fail: |
jmp still ; ¢®§¢à é ¥¬áï |
; ******************************* |
; ******* WINDOW DRAWING ******* |
; ******************************* |
draw_window: |
mov eax,12 |
mov ebx,1 ; begin draw |
int 0x40 |
; CREATING WINDOW |
mov eax,0 |
mov ebx,XXwindow |
mov ecx,YYwindow |
mov edx,BgdColor |
mov esi,0x805080d0 |
mov edi,0x005080d0 |
int 0x40 |
; PROGRAM TITLE |
mov eax,4 |
mov ebx,8*65536+8 |
mov ecx,0x10ddeeff |
mov edx,txtTitle |
mov esi,lenTitle-txtTitle |
int 0x40 |
mov eax,8 ; SHUFFLE BUTTON |
mov ebx,XXSh |
mov ecx,YYSh |
xor edx,edx |
mov esi,BtnColor |
int 0x40 |
mov ebx,XXCnf ; CONF BUTTON |
mov ecx,YYCnf |
mov edx,20 |
mov esi,BtnColor |
int 0x40 |
mov ebx, XYShText ; SHUFFLE TEXT |
mov ecx, StatusColor |
mov edx,txtSh |
mov esi,lenSh-txtSh |
mov eax,4 |
int 0x40 |
mov ebx, XYCnfText ; CONF TEXT |
mov edx,lenVictory-1 |
mov esi,1 |
int 0x40 |
mov ecx, 16 ; FIELD BUTTONS |
dbut: |
call draw_button |
loop dbut |
call draw_moves |
mov eax,12 |
mov ebx,2 ; end of drawing |
int 0x40 |
ret |
; ********************************************* |
; ******* DRAWING A FIELD BUTTON ************** |
; ********************************************* |
; ECX - button number |
draw_button: |
pusha |
dec ecx |
; calculating button dimensions |
mov edi, ecx |
lea edx,[ecx+2] |
mov ebx,ecx |
and ebx,11b |
shr ecx,2 |
imul ebx,BtnSize+3 |
add ebx,BtnLeft |
shl ebx,16 |
add ebx,BtnSize |
imul ecx,BtnSize+3 |
add ecx,BtnTop |
shl ecx,16 |
add ecx,BtnSize |
movzx eax,byte [null] |
cmp eax,edi |
jne no_hole |
pusha |
inc ebx |
inc ecx |
mov edx,BgdColor |
mov eax,13 ; clearing - 'hole' |
int 0x40 |
popa |
or edx,0x80000000 ; and removing button under it |
no_hole: |
mov al,byte[edi+curconf] |
mov esi,[task] |
cmp al,byte[edi+esi] |
je highlight |
mov esi,BtnColor |
jmp s_rbutton |
highlight: |
mov esi,BtnColor2 |
s_rbutton: |
mov eax,8 ; set/remove button |
int 0x40 |
movzx eax,byte [null] |
cmp eax,edi |
je no_text ; no digits - that's hole |
mov edx,ebx |
shr ecx,16 |
mov dx,cx |
add edx,NumShift |
mov ebx,0x20000 |
movzx ecx,byte [edi+curconf] |
cmp ecx,9 |
ja two_num |
add edx,NumShift2 ; shift to center digits |
sub ebx,0x10000 |
two_num: |
mov esi,NumColor |
mov eax,47 |
int 0x40 |
no_text: |
popa |
ret |
; ********************************************* |
; ******* DRAWING STATUS LINE ***************** |
; ********************************************* |
draw_moves: |
mov eax, 13 ; clear area |
mov ebx, XXbar |
mov ecx, YYbar |
mov edx, BgdColor |
int 0x40 |
mov eax, 4 |
mov ebx, XYstatus |
mov ecx, StatusColor |
cmp ax, [sts] |
jl report_victory |
jne report_moves |
mov edx,txtCnf ; prompt to choose configuration |
mov esi,lenCnf-txtCnf |
jmp e_dm |
report_moves: |
mov edx,txtMoves ; how many moves done |
mov esi,lenMoves-txtMoves |
mov eax,4 |
int 0x40 |
mov esi,ecx |
mov edx,ebx |
add edx, 40 shl 16 |
mov ebx,0x030000 |
movzx ecx, byte[move_count] |
mov eax,47 |
jmp e_dm |
report_victory: ; puzzle completed |
mov ecx,StatusColor2 |
mov edx,txtVictory |
mov esi,lenVictory-txtVictory |
e_dm: |
int 0x40 |
ret |
; ********************************************* |
; ********* SHUFFLE *************************** |
; ********************************************* |
shuffle: |
xor eax,eax |
mov [sts],ax |
mov [move_count],ax ; reset moves to 0 |
mov [sh_off],al |
mov eax, [generator] |
mov ecx,SH_CYCLES |
sh_cycle: |
sub eax,0x43ab45b5 ; next random number |
ror eax,1 |
xor eax,0x32c4324f |
ror eax,1 |
mov [generator],eax |
push eax |
and eax,11b ; direction 0..3 |
movzx eax,byte [eax+correct] |
call move_check |
pop eax |
jnc sh_cycle ; if fails then retry |
loop sh_cycle |
inc byte[sh_off] ; shuffling complete |
ret |
; ********************************************* |
; ********* MOVE VALIDITY CHECK *************** |
; ********************************************* |
; AL - 'DELTA' DIRECTION |
move_check: |
pusha |
mov ah,byte [null] |
mov bx,ax |
cmp bh,3 |
ja no_top |
cmp al,-4 ; top of field |
je no_move |
no_top: |
cmp bh,12 |
jb no_bottom |
cmp al,4 ; bottom of field |
je no_move |
no_bottom: |
and bh,11b |
cmp bh,0 |
jnz no_left |
cmp al,-1 ; left of field |
je no_move |
no_left: |
cmp bh,11b |
jnz ok |
cmp al,1 ; right of field |
je no_move |
ok: |
mov bx,ax |
add bh,bl ; bh-new hole |
mov byte [null],bh |
movzx ecx,ah |
mov al,byte[ecx+curconf] |
movzx edx,bh |
mov bl,byte[edx+curconf] ; swapping button & hole |
mov byte[ecx+curconf],bl |
mov byte[edx+curconf],al |
cmp byte[sh_off],0 ; if shuffle in progress, |
jz no_win ; then no redraw |
; drawing button & hole |
inc ecx |
call draw_button |
movzx ecx,bh |
inc ecx |
call draw_button |
; testing if task completed |
mov esi,[task] |
mov edi,curconf |
mov ecx,16 |
repe cmpsb |
cmp ecx,0 |
jne no_win |
mov word[sts],6 ; puzzle done. Victory! |
no_win: |
popa |
stc |
ret |
no_move: |
popa |
clc |
ret |
; this is deprecated debug routine |
;ud: |
; ud2 |
; These are data used by program |
correct db 1,-4,4,-1 |
conf db 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,15 |
db 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0 |
db 1,2,3,4,12,13,14,5,11,0,15,6,10,9,8,7,9 |
txtMoves: |
if lang eq ru |
db '®¤®¢:' |
else |
db 'Moves:' |
end if |
lenMoves: |
txtSh: |
if lang eq ru |
db ' ᮢª ' |
else |
db 'Shuffle' |
end if |
lenSh: |
txtCnf: |
if lang eq ru |
db 'ë¡¥à¨â¥ § ¤ çã ¨ ¦¬¨â¥->' |
else |
db 'Select task, then press ->' |
end if |
lenCnf: |
txtTitle: ; áâப § £®«®¢ª |
if lang eq ru |
db '£à 15 - § ¤ ç X' |
else |
db 'Game 15 - puzzle X' |
end if |
lenTitle: ; ¨ ¥ñ ª®¥æ |
txtVictory: |
if lang eq ru |
db 'ë à¥è¨«¨ § ¤ çã! ¦¬¨â¥->' |
else |
db 'Puzzle completed! Press->' |
end if |
lenVictory: |
arrow equ lenVictory-2 |
I_END: ; ª®¥æ ¯à®£à ¬¬ë |
;null db ? |
move_count dw ? |
cptr db ? |
sts dw ? |
sh_off db ? |
task dd ? |
generator dd ? |
curconf: |
/programs/15/trunk/build_en.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix en >lang.inc |
@fasm 15.asm 15 |
@pause |
/programs/15/trunk/build_ru.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix ru >lang.inc |
@fasm 15.asm 15 |
@pause |
/programs/15/trunk/macros.inc |
---|
0,0 → 1,266 |
; new application structure |
macro meos_app_start |
{ |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd __start |
dd __end |
dd __memory |
dd __stack |
if used __params & ~defined __params |
dd __params |
else |
dd 0x0 |
end if |
dd 0x0 |
} |
MEOS_APP_START fix meos_app_start |
macro code |
{ |
__start: |
} |
CODE fix code |
macro data |
{ |
__data: |
} |
DATA fix data |
macro udata |
{ |
if used __params & ~defined __params |
__params: |
db 0 |
__end: |
rb 255 |
else |
__end: |
end if |
__udata: |
} |
UDATA fix udata |
macro meos_app_end |
{ |
align 32 |
rb 2048 |
__stack: |
__memory: |
} |
MEOS_APP_END fix meos_app_end |
; macro for defining multiline text data |
struc mstr [sstring] |
{ |
forward |
local ssize |
virtual at 0 |
db sstring |
ssize = $ |
end virtual |
dd ssize |
db sstring |
common |
dd -1 |
} |
; strings |
macro sz name,[data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if used name |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
macro lsz name,[lng,data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if (used name)&(lang eq lng) |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
; easy system call macro |
macro mpack dest, hsrc, lsrc |
{ |
if (hsrc eqtype 0) & (lsrc eqtype 0) |
mov dest, (hsrc) shl 16 + lsrc |
else |
if (hsrc eqtype 0) & (~lsrc eqtype 0) |
mov dest, (hsrc) shl 16 |
add dest, lsrc |
else |
mov dest, hsrc |
shl dest, 16 |
add dest, lsrc |
end if |
end if |
} |
macro __mov reg,a,b { ; mike.dld |
if (~a eq)&(~b eq) |
mpack reg,a,b |
else if (~a eq)&(b eq) |
mov reg,a |
end if |
} |
macro mcall a,b,c,d,e,f { ; mike.dld |
__mov eax,a |
__mov ebx,b |
__mov ecx,c |
__mov edx,d |
__mov esi,e |
__mov edi,f |
int 0x40 |
} |
; optimize the code for size |
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp> |
macro add arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
inc arg1 |
else |
add arg1,arg2 |
end if |
else |
add arg1,arg2 |
end if |
} |
macro sub arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
dec arg1 |
else |
sub arg1,arg2 |
end if |
else |
sub arg1,arg2 |
end if |
} |
macro mov arg1,arg2 |
{ |
if (arg1 in __regs) & (arg2 eqtype 0) |
if (arg2) = 0 |
xor arg1,arg1 |
else if (arg2) = 1 |
xor arg1,arg1 |
inc arg1 |
else if (arg2) = -1 |
or arg1,-1 |
else if (arg2) > -128 & (arg2) < 128 |
push arg2 |
pop arg1 |
else |
mov arg1,arg2 |
end if |
else |
mov arg1,arg2 |
end if |
} |
macro struct name |
{ |
virtual at 0 |
name name |
sizeof.#name = $ - name |
end virtual |
} |
; structures used in MeOS |
struc process_information |
{ |
.cpu_usage dd ? ; +0 |
.window_stack_position dw ? ; +4 |
.window_stack_value dw ? ; +6 |
.not_used1 dw ? ; +8 |
.process_name rb 12 ; +10 |
.memory_start dd ? ; +22 |
.used_memory dd ? ; +26 |
.PID dd ? ; +30 |
.x_start dd ? ; +34 |
.y_start dd ? ; +38 |
.x_size dd ? ; +42 |
.y_size dd ? ; +46 |
.slot_state dw ? ; +50 |
rb (1024-52) |
} |
struct process_information |
struc system_colors |
{ |
.frame dd ? |
.grab dd ? |
.grab_button dd ? |
.grab_button_text dd ? |
.grab_text dd ? |
.work dd ? |
.work_button dd ? |
.work_button_text dd ? |
.work_text dd ? |
.work_graph dd ? |
} |
struct system_colors |
; constants |
; events |
EV_IDLE = 0 |
EV_TIMER = 0 |
EV_REDRAW = 1 |
EV_KEY = 2 |
EV_BUTTON = 3 |
EV_EXIT = 4 |
EV_BACKGROUND = 5 |
EV_MOUSE = 6 |
EV_IPC = 7 |
EV_STACK = 8 |
; event mask bits for function 40 |
EVM_REDRAW = 1b |
EVM_KEY = 10b |
EVM_BUTTON = 100b |
EVM_EXIT = 1000b |
EVM_BACKGROUND = 10000b |
EVM_MOUSE = 100000b |
EVM_IPC = 1000000b |
EVM_STACK = 10000000b |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/3dcube2/trunk/3DCUBE2.ASM |
---|
0,0 → 1,691 |
; |
; 3D POLYGONAL CUBE - ASCL |
; |
; Pavlushin Evgeni |
; mail: waptap@mail.ru site: www.deck4.narod.ru |
; |
; Create on base 3D test sample |
; Mikolaj Felix mfelix@polbox.com |
; |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd 0x30000 ; memory for app |
dd 0x30000 ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
MAX_POINTS equ 8 |
MAX_TRIANGLES equ 12 |
SCREEN_X equ 320 |
SCREEN_Y equ 200 |
include 'lang.inc' |
include 'ascl.inc' |
include 'ascgl.inc' |
include 'macros.inc' |
START: |
call draw_window |
call init_sin_cos |
still: |
; mov eax,23 ; wait for system event with 10 ms timeout |
; mov ebx,1 ; wait 10 ms, then continue |
; int 0x40 |
mov eax,11 |
int 0x40 |
dec eax |
; cmp eax,1 ; window redraw request ? |
jz red |
dec eax |
; cmp eax,2 ; key in buffer ? |
jz key |
dec eax |
; cmp eax,3 ; button in buffer ? |
jz button |
fps 280,8,cl_White,cl_Black |
main_loop: |
mov esi,object |
mov edi,object_rotated |
mov ecx,MAX_POINTS*3 |
cld |
rep movsw |
mov esi,angle_x |
mov edi,object_rotated |
mov ecx,MAX_POINTS |
call rotate_points |
mov esi,object_rotated |
mov edi,object_translated |
mov ecx,MAX_POINTS |
call translate_points |
call draw_faces |
call clear_screen_buffer |
add [angle_x],2 |
add [angle_y],3 |
add [angle_z],1 |
jmp still |
red: |
call draw_window |
jmp still |
key: |
mov eax,2 |
int 0x40 |
jmp still |
button: |
mov eax,17 |
int 0x40 |
cmp ah,1 |
jne still |
exit: |
mov eax,-1 |
int 0x40 |
;Draw window |
draw_window: |
mov eax,12 ;Start |
mov ebx,1 |
int 0x40 |
mov eax,0 ;Draw window |
mov ebx,100*65536+(SCREEN_X+9) ;x start*65536+x size |
mov ecx,100*65536+(SCREEN_Y+26) ;y start*65536+y size |
mov edx,0x03000000 ;0x03 use skinned window |
int 0x40 |
mov eax,4 ;Out Text |
mov ebx,8*65536+8 ;x start*65536+y start |
mov ecx,0x00ffffff ;color White |
mov edx,head_label |
mov esi,hl_end-head_label |
int 0x40 |
mov eax,12 ;End |
mov ebx,2 |
int 0x40 |
ret |
head_label: db "3D TEST SAMPLE FOR MENUETOS" |
hl_end: |
; Draw faces procedure |
draw_faces: |
mov esi,link |
mov ecx,MAX_TRIANGLES |
df_draw: |
push ecx |
mov ecx,3 |
mov edi,@@tx1 ;bp |
df_get_point: |
xor bh,bh |
mov bl,byte [esi] |
shl bx,2 |
mov ax,word [object_translated+bx] |
mov word [edi],ax |
mov ax,word [object_translated+bx+2] |
mov word [edi+2],ax |
inc esi |
add edi,4 |
dec ecx |
jnz df_get_point |
mov ax,[@@ty1] |
sub ax,[@@ty3] |
mov bx,[@@tx2] |
sub bx,[@@tx1] |
imul bx |
shl edx,16 |
mov dx,ax |
push edx |
mov ax,[@@tx1] |
sub ax,[@@tx3] |
mov bx,[@@ty2] |
sub bx,[@@ty1] |
imul bx |
shl edx,16 |
mov dx,ax |
pop ebx |
sub ebx,edx |
or ebx,ebx |
jge df_next |
xor ah,ah |
mov al,byte [si] |
mov [@@xcol],ax |
call filled_triangle |
df_next: |
inc si |
pop ecx |
dec ecx |
jnz df_draw |
ret |
;modify |
;include graphlib.asm |
clear_screen_buffer: |
;outscrbuf |
mov ebx,scrbuf |
mov ecx,SCREEN_X*65536+SCREEN_Y |
mov edx,5*65536+22 |
mov ax,7 |
int 0x40 |
;White background |
mov edi,scrbuf |
mov ecx,(SCREEN_X*SCREEN_Y*3)/4 |
mov eax,0xffffffff |
cld |
rep stosd |
ret |
;include triangle.asm |
; Mikolaj Felix 14/5/2001 |
; mfelix@polbox.com |
;filled trangle procedure |
@@tx1 dw 0 |
@@ty1 dw 0 |
@@tx2 dw 0 |
@@ty2 dw 0 |
@@tx3 dw 0 |
@@ty3 dw 0 |
@@xcol dw 0 |
@@dx12 dw 0 |
@@dx13 dw 0 |
@@dx23 dw 0 |
filled_triangle: |
mov ax,[@@xcol] ;trnsforming color |
mov bl,al ;byte bbbggrrx |
mov dl,al ;to 3 byte |
mov dh,al ;bbbxxxxx ggxxxxxx rrxxxxxx |
and dh,00000001b |
and al,11100000b |
and bl,00011000b |
and dl,00000110b |
shl bl,3 |
shl dl,5 |
cmp dh,1 |
jne no_bitup |
or al,00011111b |
or bl,00111111b |
or dl,00111111b |
no_bitup: |
shl eax,8 ;puck colors |
mov al,bl |
shl eax,8 |
mov al,dl |
mov dword [@@rgb],eax |
mov eax,0 ; for 16 bit instructions |
mov ax,[@@ty1] |
cmp ax,[@@ty3] |
jb ft_check1 |
xchg ax,[@@ty3] |
mov [@@ty1],ax |
mov ax,[@@tx1] |
xchg ax,[@@tx3] |
mov [@@tx1],ax |
ft_check1: |
mov ax,[@@ty2] |
cmp ax,[@@ty3] |
jb ft_check2 |
xchg ax,[@@ty3] |
mov [@@ty2],ax |
mov ax,[@@tx2] |
xchg ax,[@@tx3] |
mov [@@tx2],ax |
ft_check2: |
mov ax,[@@ty1] |
cmp ax,[@@ty2] |
jb ft_check3 |
xchg ax,[@@ty2] |
mov [@@ty1],ax |
mov ax,[@@tx1] |
xchg ax,[@@tx2] |
mov [@@tx1],ax |
ft_check3: |
mov bx,[@@ty2] |
sub bx,[@@ty1] |
jnz ft_dx12_make |
mov [@@dx12],word 0 |
jmp ft_dx12_done |
ft_dx12_make: |
mov ax,[@@tx2] |
sub ax,[@@tx1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@dx12],ax ; dx12 = (x2-x1)/(y2-y1) |
ft_dx12_done: |
mov bx,[@@ty3] |
sub bx,[@@ty1] |
jnz ft_dx13_make |
mov [@@dx13],word 0 |
jmp ft_dx13_done |
ft_dx13_make: |
mov ax,[@@tx3] |
sub ax,[@@tx1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@dx13],ax ; dx13 = (x3-x1)/(y3-y1) |
ft_dx13_done: |
mov bx,[@@ty3] |
sub bx,[@@ty2] |
jnz ft_dx23_make |
mov [@@dx23],word 0 |
jmp ft_dx23_done |
ft_dx23_make: |
mov ax,[@@tx3] |
sub ax,[@@tx2] |
shl ax,7 |
cwd |
idiv bx |
mov [@@dx23],ax ; dx23 = (x3-x2)/(y3-y2) |
ft_dx23_done: |
mov ax,[@@tx1] |
shl ax,7 |
mov bx,ax |
mov cx,[@@ty1] |
ft_loop1: |
pushad |
mov [@@ly],cx |
mov dx,bx |
shr dx,7 |
mov [@@lx2],dx |
mov dx,ax |
shr dx,7 |
mov [@@lx1],dx |
mov ax,[@@xcol] |
mov [@@lcol],ax |
call horizontal_line |
popad |
add ax,[@@dx13] |
add bx,[@@dx12] |
inc cx |
cmp cx,[@@ty2] |
jb ft_loop1 |
mov bx,[@@tx2] |
shl bx,7 |
mov cx,[@@ty2] |
ft_loop2: |
pushad |
mov [@@ly],cx |
mov dx,bx |
shr dx,7 |
mov [@@lx2],dx |
mov dx,ax |
shr dx,7 |
mov [@@lx1],dx |
mov ax,[@@xcol] |
mov [@@lcol],ax |
call horizontal_line |
popad |
add ax,[@@dx13] |
add bx,[@@dx23] |
inc ecx |
cmp cx,[@@ty3] |
jb ft_loop2 |
ret |
;horizontal line subproc |
@@lx1 dw 0 |
@@lx2 dw 0 |
@@ly dw 0 |
@@lcol dw 0 |
@@rgb dd 0 |
horizontal_line: |
mov ecx,0 |
mov cx,[@@lx1] |
cmp cx,[@@lx2] |
ja x12 |
je ext |
; ret |
mov cx,[@@lx2] |
sub cx,[@@lx1] |
mov edi,3 |
jmp xx |
x12: |
mov cx,[@@lx1] |
sub cx,[@@lx2] |
mov edi,-3 |
jmp xx |
ext: |
mov ecx,-1 ;1 |
; sub ebp,3 |
xx: |
mov eax,0 |
mov ax,[@@ly] |
mov ebx,SCREEN_X ;320 |
mul ebx |
mov ebp,0 |
mov bp,[@@lx1] ;for correct 16 bit size |
add eax,ebp |
mov ebx,3 |
mul ebx |
mov ebp,eax |
sub ebp,3 ;for delete white dots |
add ecx,2 |
loo: |
mov eax,dword [@@rgb] |
mov bl,al |
shr eax,8 ;puck colors |
mov byte [scrbuf+ebp],ah |
mov byte [scrbuf+ebp+1],al |
mov byte [scrbuf+ebp+2],bl |
add ebp,edi |
dec ecx |
jnz loo |
ret |
;include fixed3d.asm |
; Mikolaj Felix 25/5/2001 |
; mfelix@polbox.com |
;------------------------------------------------------------ |
; ds:si - offset to angles |
; ds:di - offset to 3d points |
; cx - number of points |
;------------------------------------------------------------ |
@@sin_x dw 0 |
@@cos_x dw 0 |
@@sin_y dw 0 |
@@cos_y dw 0 |
@@sin_z dw 0 |
@@cos_z dw 0 |
@@px equ word [edi] |
@@py equ word [edi+2] |
@@pz equ word [edi+4] |
rotate_points: |
push edi |
mov edi,@@sin_x |
mov edx,3 |
rp_sin_cos: |
mov bx,word [esi] |
and bx,511 |
shl bx,1 |
mov ax,word [sin_table+bx] |
mov word [edi],ax |
mov ax,word [cos_table+bx] |
mov word [edi+2],ax |
add esi,2 |
add edi,4 |
dec edx |
jnz rp_sin_cos |
pop edi |
rp_rotate: |
; rotate around x-axis |
mov ax,@@py |
imul [@@cos_x] |
mov bx,ax |
mov si,dx |
mov ax,@@pz |
imul [@@sin_x] |
sub bx,ax |
sbb si,dx |
shrd bx,si,14 |
push bx |
mov ax,@@py |
imul [@@sin_x] |
mov bx,ax |
mov si,dx |
mov ax,@@pz |
imul [@@cos_x] |
add bx,ax |
adc si,dx |
shrd bx,si,14 |
pop @@py |
mov @@pz,bx |
; rotate around y-axis |
mov ax,@@px |
imul [@@cos_y] |
mov bx,ax |
mov si,dx |
mov ax,@@pz |
imul [@@sin_y] |
sub bx,ax |
sbb si,dx |
shrd bx,si,14 |
push bx |
mov ax,@@px |
imul [@@sin_y] |
mov bx,ax |
mov si,dx |
mov ax,@@pz |
imul [@@cos_y] |
add bx,ax |
adc si,dx |
shrd bx,si,14 |
pop @@px |
mov @@pz,bx |
; rotate around z-axis |
mov ax,@@px |
imul [@@cos_z] |
mov bx,ax |
mov si,dx |
mov ax,@@py |
imul [@@sin_z] |
sub bx,ax |
sbb si,dx |
shrd bx,si,14 |
push bx |
mov ax,@@px |
imul [@@sin_z] |
mov bx,ax |
mov si,dx |
mov ax,@@py |
imul [@@cos_z] |
add bx,ax |
adc si,dx |
shrd bx,si,14 |
pop @@px |
mov @@py,bx |
add edi,6 |
dec ecx |
jnz rp_rotate |
ret |
;------------------------------------------------------------ |
; ds:si - offset to 3d points |
; es:di - offset to 2d points |
; cx - number of points |
;------------------------------------------------------------ |
mx dw 0 |
my dw 0 |
translate_points: |
pushad |
mov eax,37 |
mov ebx,1 |
int 0x40 |
mov ebx,eax |
shr eax,16 |
and ebx,0xffff |
cmp ax,SCREEN_X |
jna x_n |
mov ax,0 ;SCREEN_X |
x_n: |
cmp bx,SCREEN_Y |
jna y_n |
mov bx,0 ;SCREEN_Y |
y_n: |
mov [mx],ax |
mov [my],bx |
popad |
mov ebx,0 ;? |
mov bx,word [esi+4] |
mov ax,[my] |
cmp ax,0 |
jng no_m |
shl ax,3 |
add bx,ax |
no_m: |
add bx,256 ; Z factor (zoom) |
mov eax,0 ;? |
mov ax,word [esi] |
shl ax,8 |
cwd |
idiv bx; bx |
add ax,(SCREEN_X/2) ;160 ;X factor (center X) |
stosw |
mov eax,0 ;? |
mov ax,word [esi+2] |
shl ax,8 |
cwd |
idiv bx |
add ax,(SCREEN_Y/2) ;100 ;Y factor (center Y) |
stosw |
add esi,6 |
dec ecx |
jnz translate_points |
ret |
init_sin_cos: |
finit |
fldz |
fstp [temp] |
xor edi,edi |
mov ecx,512 |
isc_make: |
fld [temp] |
fld st0 |
fld st0 |
fsin |
fmul [fixed_point_const] |
fistp word [sin_table+edi] |
fcos |
fmul [fixed_point_const] |
fistp word [cos_table+edi] |
fadd [inc_angle] |
fstp [temp] |
add edi,2 |
loop isc_make |
ret |
temp dd 0 |
fixed_point_const dd 16384.0 |
inc_angle dd 0.01227184630309 ; pi/256 |
angle_x dw 0 |
angle_y dw 0 |
angle_z dw 0 |
object dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50 |
dw -50,-50, 50, 50,-50, 50, 50,50, 50, -50,50, 50 |
link: |
db 0,1,2,10000011b, 0,2,3,10000011b ;purpure side |
db 5,4,7,00000111b, 5,7,6,00000111b ;soft-red side |
db 1,5,6,00011000b, 1,6,2,00011000b ;soft-lime side |
db 4,0,3,11100001b, 4,3,7,11100001b ;soft-blue side |
db 4,5,1,00011111b, 1,0,4,00011111b ;yellow side |
db 3,2,6,00000000b, 3,6,7,00000000b ;black side |
sin_table: |
rw 512 |
cos_table: |
rw 512 |
object_rotated: |
rw MAX_POINTS*3 |
object_translated: |
rw MAX_POINTS*2 |
scrbuf: |
I_END: |
/programs/3dcube2/trunk/ascgl.inc |
---|
0,0 → 1,624 |
lang equ ru |
; |
; Assembler |
; SMALL |
; CODE |
; Graphics |
; Libary |
; |
; Ver 0.10 By Pavlushin Evgeni (RUSSIA) |
; www.waptap@mail.ru |
;InfoList |
;0.01 LoadImage |
;0.02 SetBmp |
;0.03 Bmptoimg, Setimg ~01.03.2004 |
;0.04 Bug deleted, copyimg ~03.05.2004 |
;0.05 fullimg, collimg ~05.05.2004 |
;0.06 getimg ~09.05.2004 |
;0.07 convbmp ~13.05.2004 |
;0.08 fps ~14.05.2004 |
;0.09 drawfbox ~03.06.2004 |
;0.10 all macros optimized by halyavin, add at ~07.06.2004 |
;DrawBox |
macro drawfbox x,y,xs,ys,color |
{ |
mov ecx,y |
mov ebx,x |
shl ebx,16 |
add ebx,xs |
shl ecx,16 |
add ecx,ys |
mov edx,color |
mov eax,13 |
int 0x40 |
} |
; FPS - Set Frame Per Second Display |
fps_show_frequency=40 |
macro fps x,y,color,delcolor |
{ |
local spdat,savetime,new_time,fps,fps_cntr,out_fps,new_time,ttt |
local no_out_fps |
jmp spdat |
savetime dd 0 |
fps_cntr dd 0 |
fps dd 0 |
ttt dd 0 |
spdat: |
get_time: |
mov eax,3 |
int 0x40 |
cmp eax,[savetime] |
jne new_time |
inc [fps_cntr] |
cmp dword [ttt],0 |
je out_fps |
dec dword [ttt] |
jmp no_out_fps |
new_time: |
mov [savetime],eax |
mov ebx,[fps_cntr] |
mov [fps],ebx |
mov [fps_cntr],0 |
out_fps: |
if ~(delcolor eq ) |
mov ebx,x*65536+30 |
mov ecx,y*65536+7 |
mov edx,delcolor |
mov eax,13 |
int 0x40 |
end if |
mov dword [ttt],fps_show_frequency |
mov eax,47 |
mov ebx,5*65536 |
; mov bl,0 |
mov edx,x*65536+y |
mov esi,color |
mov ecx,[fps] |
int 0x40 |
no_out_fps: |
} |
; COLLIMG - Collusion image's |
_ldbounce_count=0; |
macro collimg img1_off,x1,y1,img2_off,x2,y2,otv |
{ |
local bounce,exit,_1dbounce,anot,bc,nbc |
mov esi,[img1_off] ;xs1 |
mov edi,[img2_off] ;ys2 |
mov eax,x1 ; |
mov ebx,x2 ; |
call _1dbounce |
mov edx,ecx |
mov esi,[img1_off+4] ;ys1 |
mov edi,[img2_off+4] ;ys2 |
mov eax,y1 ; |
mov ebx,y2 ; |
call _1dbounce |
add edx,ecx |
cmp edx,2 |
je bounce |
mov otv,0 |
jmp exit |
_ldbounce_count=_ldbounce_count+1 |
if (_ldbounce_count = 1) |
_1dbounce: |
cmp ebx,eax |
jnae anot |
add eax,esi |
cmp eax,ebx |
jna nbc |
jmp bc |
anot: |
add ebx,edi |
cmp ebx,eax |
jna nbc |
bc: |
mov ecx,1 |
ret |
nbc: |
mov ecx,0 |
ret |
end if |
bounce: |
mov otv,1 |
exit: |
} |
; SETBMP - Set bmp to window |
; (SYNTAX) SETBMP dd xstart ,dd ystart ,BMP_offset,dd soi |
; (SAMPLE) SETBMP dword [xt],dword [yt],I_END,dword [tsoi] |
; SETBMP 15,10,I_END,dword [tsoi] |
; ( NOTE ) SOI - Start of image |
macro setbmp arg1,arg2,arg3,arg4 |
{ |
local nodi |
cmp word [arg3],word 'BM' |
jne nodi |
mov eax,7 |
mov ebx,arg4 ;[soi] |
mov ecx,dword [arg3+18] |
shl ecx,16 |
add ecx,dword [arg3+22] |
if (arg1 eqtype 0) & (arg2 eqtype 0) |
mov edx,arg1*65536+arg2 |
else |
mov edx,arg1 |
shl edx,16 |
add edx,arg2 |
end if |
int 0x40 |
nodi: |
} |
macro setimg arg1,arg2,arg3 |
{ |
local nodi |
mov eax,7 |
mov ebx,arg3 |
add ebx,8 |
mov ecx,dword [arg3] |
shl ecx,16 |
add ecx,dword [arg3+4] |
if (arg1 eqtype 0) & (arg2 eqtype 0) |
mov edx,arg1*65536+arg2 |
else |
mov edx,arg1 |
shl edx,16 |
add edx,arg2 |
end if |
int 0x40 |
} |
;Not optimiz |
macro getimg imgsrc,x,y,xs,ys,imgdest |
{ |
local cyc |
mov eax,xs |
mov dword [imgdest],eax |
mov eax,ys |
mov dword [imgdest+4],eax |
mov eax,dword [imgsrc] ;getx size |
mov edi,eax |
mov ebx,y |
mul ebx |
add eax,x |
mov ebx,3 |
mul ebx ;eax=offset on imsrc |
mov ecx,0 |
mov ebx,0 |
mov ebp,eax |
mov esi,0 |
add esi,8 |
add ebp,8 |
cyc: |
mov al,byte [imgsrc+ebp] |
mov [imgdest+esi],al |
mov al,byte [imgsrc+ebp+1] |
mov [imgdest+esi+1],al |
mov al,byte [imgsrc+ebp+2] |
mov [imgdest+esi+2],al |
add esi,3 |
add ebp,3 |
inc ecx |
cmp ecx,xs |
jne cyc |
add ebp,edi |
add ebp,edi |
add ebp,edi |
sub ebp,xs |
sub ebp,xs |
sub ebp,xs |
mov ecx,0 |
inc ebx |
cmp ebx,ys |
jne cyc |
} |
; |
macro bmptoimg bmp_off,soi,img_off |
{ |
local nodix,conv |
cmp word [bmp_off],word 'BM' |
jne nodix |
mov eax,dword [bmp_off+18] |
mov ebx,dword [bmp_off+22] |
mov dword [img_off],eax |
mov dword [img_off+4],ebx |
mul ebx |
lea ecx,[eax+2*eax] |
lea edi,[img_off+8] |
mov esi,dword [soi] |
cld |
rep movsb |
nodix: |
} |
macro copyimg img2_off,img1_off |
{ |
local cop |
mov eax,dword [img1_off] |
mov ebx,dword [img1_off+4] |
mul ebx |
lea ecx,[eax+2*eax] |
lea esi,[img1_off+8] |
lea edi,[img2_off+8] |
cld |
rep movsb |
} |
macro fullimg img_off,xs,ys,color |
{ |
local cop |
mov eax,xs |
mov ebx,ys |
mov dword [img_off],eax |
mov dword [img_off+4],ebx |
mul ebx |
lea ebp,[eax+2*eax] |
mov esi,color |
if color eqtype 0 |
mov ecx,color/65536 |
else |
mov ecx,esi |
shr ecx,16 |
end if |
xor edi,edi |
cop: |
mov word [img_off+8+edi],si |
add edi,2 |
mov byte [img_off+8+edi],cl |
inc edi |
cmp edi,ebp |
jne cop |
} |
macro convbmp bmp_load_area,bmp_soi |
{ |
local status,bps,dwps,soi,sop,eop,eos,process,fileinfo,string,end_bmp |
local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2 |
local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize |
local noaddword |
;local qwe,bmpfn |
; convert: |
movzx eax,word [bmp_load_area+28] |
mul dword [bmp_load_area+18] |
mov ebx,32 |
div ebx |
test edx,edx |
je noaddword |
inc eax |
noaddword: |
mov dword [dwps],eax ;dwps-doublewords per string |
shl eax,2 |
mov dword [bps],eax ;bps-bytes per string |
cmp dword [bmp_load_area+34],0 |
jne yespicsize ;if picture size is defined |
mul dword [bmp_load_area+22] |
mov dword [bmp_load_area+34],eax |
yespicsize: |
mov eax,bmp_load_area |
mov ebx,eax |
add ebx, [bmp_load_area+2];file size |
inc ebx |
mov dword [bmp_soi],ebx ;soi-start of image area for drawing |
add eax, [bmp_load_area+10] |
mov dword [sop],eax ;sop-start of picture in file |
add eax, [bmp_load_area+34] |
mov dword [eop],eax ;eop-end of picture in file |
mov eax, [bmp_load_area+18] |
lea eax,[eax+2*eax] ;3x pixels in eax |
mov edi,dword [bmp_soi] ;initializing |
mov esi,dword [eop] |
sub esi,dword [bps] |
nextstring: |
push edi |
cmp word [bmp_load_area+28],24 |
jne convertno32 |
mov ecx,[dwps] |
cld |
rep movsd |
convert1: |
pop edi |
sub esi,dword [bps] |
sub esi,dword [bps] |
cmp esi,dword [sop] |
jb end_bmp;nomorestring |
add edi,eax |
jmp nextstring |
; nomorestring: |
; jmp end_bmp |
convertno32: |
mov ebx,bmp_load_area |
add ebx, [bmp_load_area+14] |
add ebx,14 ;start of color table |
push esi |
add esi,dword [bps] |
mov dword [eos],esi |
pop esi |
nextelem: |
push eax |
movzx eax,byte [esi] |
cmp word [bmp_load_area+28],4 |
je convert4bpp |
cmp word [bmp_load_area+28],1 |
je convert1bpp |
call converttable |
convert2: |
pop eax |
inc esi |
cmp esi,dword [eos] |
jae convert1 |
add edi,3 |
jmp nextelem |
convert4bpp: |
shl ax,4 |
shr al,4 |
push ax |
movzx eax,ah |
call converttable |
add edi,3 |
pop ax |
movzx eax,al |
call converttable |
jmp convert2 |
convert1bpp: |
mov ecx,eax |
mov edx,7 |
nextbit: |
xor eax,eax |
bt ecx,edx |
jnc noaddelem |
inc eax |
noaddelem: |
push edx |
call converttable |
pop edx |
dec edx |
cmp edx,0xffffffff |
je convert2 |
add edi,3 |
jmp nextbit |
converttable: |
shl eax,2 |
add eax,ebx |
mov edx, dword [eax] |
mov dword [edi],edx |
ret |
; DATA AREA |
;status dd 0 ;bit0=1 if file thread is created |
bps dd 0 |
dwps dd 0 |
;soi dd 0 |
sop dd 0 |
eop dd 0 |
eos dd 0 |
;process dd 0 |
end_bmp: |
; mov eax,dword [soi] |
; mov dword [bmp_soi],eax |
} |
; LOADBMP - Load bmp image from file |
; (SYNTAX) LOADBMP 'file_path',temp_area(rb 0x10000),load_area,dd soi |
; (SAMPLE) LOADBMP '/rd/1/menuet.bmp',temp_area,I_END,tsoi |
; ( NOTE ) Macros create on Base of |
; Picture browser by lisovin@26.ru & Ivan Poddubny |
; SOI - Start of image |
macro loadbmp bmp_file_name,bmp_temp_area,bmp_load_area,bmp_soi |
{ |
local status,bps,dwps,soi,sop,eop,eos,process,fileinfo,string,end_bmp |
local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2 |
local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize |
local noaddword |
;local qwe,bmpfn |
mov dword [fileinfo+8],1 ; how many blocks to read (1) |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
mov eax,[bmp_load_area+2] |
shr eax,9 ; ¯®¤¥«¨¬ 512 ¨ ¯à¨¡ ¢¨¬ 1 - ¯®«ã稬 ç¨á«® ¡«®ª®¢ |
inc eax |
mov dword [fileinfo+8],eax |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
; jmp qwe |
;bmpfn db bmp_file_name |
;qwe: |
; mov eax,6 |
; mov ebx,bmpfn |
; mov ecx,0 |
; mov edx,0xFFFFFF |
; mov esi,bmp_load_area |
; mov edi,0 |
; int 0x40 |
; convert: |
movzx eax,word [bmp_load_area+28] |
mul dword [bmp_load_area+18] |
mov ebx,32 |
div ebx |
test edx,edx |
je noaddword |
inc eax |
noaddword: |
mov dword [dwps],eax ;dwps-doublewords per string |
shl eax,2 |
mov dword [bps],eax ;bps-bytes per string |
cmp dword [bmp_load_area+34],0 |
jne yespicsize ;if picture size is defined |
mul dword [bmp_load_area+22] |
mov dword [bmp_load_area+34],eax |
yespicsize: |
mov eax,bmp_load_area |
push eax |
add eax, [bmp_load_area+2];file size |
inc eax |
mov dword [soi],eax ;soi-start of image area for drawing |
pop eax |
add eax, [bmp_load_area+10] |
mov dword [sop],eax ;sop-start of picture in file |
add eax, [bmp_load_area+34] |
mov dword [eop],eax ;eop-end of picture in file |
mov eax, [bmp_load_area+18] |
mov ebx,3 |
mul ebx ;3x pixels in eax |
mov edi,dword [soi] ;initializing |
mov esi,dword [eop] |
sub esi,dword [bps] |
nextstring: |
push edi |
cmp word [bmp_load_area+28],24 |
jne convertno32 |
mov ecx,[dwps] |
cld |
rep movsd |
convert1: |
pop edi |
sub esi,dword [bps] |
sub esi,dword [bps] |
cmp esi,dword [sop] |
jb nomorestring |
add edi,eax |
jmp nextstring |
nomorestring: |
jmp end_bmp |
convertno32: |
mov ebx,bmp_load_area |
add ebx, [bmp_load_area+14] |
add ebx,14 ;start of color table |
push esi |
add esi,dword [bps] |
mov dword [eos],esi |
pop esi |
nextelem: |
push eax |
movzx eax,byte [esi] |
cmp word [bmp_load_area+28],4 |
je convert4bpp |
cmp word [bmp_load_area+28],1 |
je convert1bpp |
call converttable |
convert2: |
pop eax |
inc esi |
cmp esi,dword [eos] |
jae convert1 |
add edi,3 |
jmp nextelem |
convert4bpp: |
shl ax,4 |
shr al,4 |
push ax |
movzx eax,ah |
call converttable |
add edi,3 |
pop ax |
movzx eax,al |
call converttable |
jmp convert2 |
convert1bpp: |
mov ecx,eax |
mov edx,7 |
nextbit: |
xor eax,eax |
bt ecx,edx |
jnc noaddelem |
inc eax |
noaddelem: |
push edx |
call converttable |
pop edx |
dec edx |
cmp edx,0xffffffff |
je convert2 |
add edi,3 |
jmp nextbit |
converttable: |
shl eax,2 |
add eax,ebx |
mov edx, dword [eax] |
mov dword [edi],edx |
ret |
; DATA AREA |
;status dd 0 ;bit0=1 if file thread is created |
bps dd 0 |
dwps dd 0 |
soi dd 0 |
sop dd 0 |
eop dd 0 |
eos dd 0 |
;process dd 0 |
; DATA AREA |
fileinfo: |
dd 0 |
dd 0 |
dd 1 ;number of blocks of 512 bytes |
dd bmp_load_area |
dd bmp_temp_area |
string: |
db bmp_file_name,0 |
db ' ' |
db ' ' |
db ' ' |
db ' ',0 |
end_bmp: |
mov eax,dword [soi] |
mov dword [bmp_soi],eax |
} |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/3dcube2/trunk/ascl.inc |
---|
0,0 → 1,499 |
lang equ ru ; ru en fr ge fi |
; |
; Assembler |
; SMALL |
; CODE |
; Libary |
; |
; Ver 0.09 By Pavlushin Evgeni (RUSSIA) |
; www.waptap@mail.ru |
;InfoList |
;0.01 scank,putpix,puttxt |
;0.02 label,random,colors |
;0.03 window,startwd,endwd,attributes |
;0.04 close,delay,scevent ~30.04.2004 |
;0.05 small random, ~04.05.2004 |
;0.06 wtevent ~09.05.2004 |
;0.07 timeevent ~23.05.2004 |
;0.08 txtput ~14.06.2004 |
;0.09 opendialog,savedialog ~20.06.2004 |
macro opendialog redproc,openoff,erroff,path,testtime |
{ |
local still, dlg_file, clip_file, redwait |
local button, key, red, zzz, still, zzz2, incf, file_is_open, zzz3 |
mov ecx,200 |
zzz3: |
mov byte [path+ecx-1],0 |
loop zzz3 |
dec byte [clip_file+7] |
incf: |
inc byte [clip_file+7] |
mov eax,6 |
mov ebx,clip_file |
mov ecx,0 |
mov edx,-1 |
mov esi,path |
int 0x40 |
cmp byte [clip_file+7],'Z' |
je erroff |
cmp eax,0xffffffff |
jne incf |
mov ecx,200 |
zzz2: |
mov byte [path+ecx],0 |
loop zzz2 |
mov ebx,clip_file |
mov ecx,path |
mov edx,100 |
mov esi,0 |
mov eax,33 |
int 0x40 |
mov ebx,dlg_file |
mov ecx,clip_file |
mov eax,19 |
int 0x40 |
still: |
scevent red,key,button |
cmp byte [path],0 |
jne file_is_open |
cmp dword [redwait],testtime ;20 |
jnae zzz |
mov eax,6 |
mov ebx,clip_file |
mov ecx,0 |
mov edx,-1 |
mov esi,path |
int 0x40 |
cmp eax,0xffffffff |
je erroff ;errexit |
mov dword [redwait],0 |
zzz: |
delay 5 |
inc dword [redwait] |
jmp still |
file_is_open: |
mov eax,32 |
mov ebx,clip_file |
int 0x40 |
jmp openoff |
key: ; key |
int 0x40 ; read (eax=2) |
jmp still |
button: ; button |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 ; button id=1 ? |
jne still |
mov eax,-1 ; close this program |
int 0x40 |
red: |
call redproc |
jmp still |
dlg_file db 'SYSXTREE ' |
clip_file db 'OPENCLPACLP' |
db 'O' ;Dialog type O-open S-save |
db 0 ;Marker |
redwait dd 0 |
} |
macro savedialog redproc,openoff,erroff,path,testtime |
{ |
local still, dlg_file, clip_file, redwait, zzz3 |
local button, key, red, zzz, still, zzz2, incf, file_is_open |
mov ecx,200 |
zzz3: |
mov byte [path+ecx-1],0 |
loop zzz3 |
dec byte [clip_file+7] |
incf: |
inc byte [clip_file+7] |
mov eax,6 |
mov ebx,clip_file |
mov ecx,0 |
mov edx,-1 |
mov esi,path |
int 0x40 |
cmp byte [clip_file+7],'Z' |
je erroff |
cmp eax,0xffffffff |
jne incf |
mov ecx,200 |
zzz2: |
mov byte [path+ecx],0 |
loop zzz2 |
mov ebx,clip_file |
mov ecx,path |
mov edx,100 |
mov esi,0 |
mov eax,33 |
int 0x40 |
mov ebx,dlg_file |
mov ecx,clip_file |
mov eax,19 |
int 0x40 |
still: |
scevent red,key,button |
cmp byte [path],0 |
jne file_is_open |
cmp dword [redwait],testtime ;20 |
jnae zzz |
mov eax,6 |
mov ebx,clip_file |
mov ecx,0 |
mov edx,-1 |
mov esi,path |
int 0x40 |
cmp eax,0xffffffff |
je erroff ;errexit |
mov dword [redwait],0 |
zzz: |
delay 5 |
inc dword [redwait] |
jmp still |
file_is_open: |
mov eax,32 |
mov ebx,clip_file |
int 0x40 |
jmp openoff |
key: ; key |
int 0x40 ; read (eax=2) |
jmp still |
button: ; button |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 ; button id=1 ? |
jne still |
mov eax,-1 ; close this program |
int 0x40 |
red: |
call redproc |
jmp still |
dlg_file db 'SYSXTREE ' |
clip_file db 'SAVECLPACLP' |
db 'S' ;Dialog type O-open S-save |
db 0 ;Marker |
redwait dd 0 |
} |
; RANDOM - generate random count (small) |
; (SYNTAX) RANDOM MaxCount,OutArgument |
; (SAMPLE) RANDOM 10000,eax |
; ( NOTE ) Maxint<65536 ; use random 65536,eax for more combinations |
randomuse = 0 |
macro random arg1,arg2 |
{ |
local rxproc |
randomuse = randomuse + 1 |
jmp rxproc |
if defined randomuse & randomuse = 1 |
randomproc: |
jmp rnj |
rsx1 dw 0x4321 |
rsx2 dw 0x1234 |
rnj: |
; mov eax,arg1 |
push bx |
push cx |
push dx |
push si |
push di |
mov cx,ax |
mov ax,word ptr rsx1 |
mov bx,word ptr rsx2 |
mov si,ax |
mov di,bx |
mov dl,ah |
mov ah,al |
mov al,bh |
mov bh,bl |
xor bl,bl |
rcr dl,1 |
rcr ax,1 |
rcr bx,1 |
add bx,di |
adc ax,si |
add bx,0x62e9 |
adc ax,0x3619 |
mov word ptr rsx1,bx |
mov word ptr rsx2,ax |
xor dx,dx |
cmp ax,0 |
je nodiv |
cmp cx,0 |
je nodiv |
div cx |
nodiv: |
mov ax,dx |
pop di |
pop si |
pop dx |
pop cx |
pop bx |
; mov arg2,0 |
; mov arg2,eax |
ret |
end if |
rxproc: |
mov eax,arg1 |
call randomproc |
mov arg2,0 |
mov arg2,eax |
} |
macro scank |
{ |
mov eax,10 |
int 0x40 |
} |
macro putpix x,y,color |
{ |
mov ebx,x |
mov ecx,y |
mov edx,color |
mov eax,1 |
int 0x40 |
} |
macro puttxt x,y,offs,size,color |
{ |
mov ebx,x |
shl ebx,16 |
add ebx,y |
mov ecx,color |
mov edx,offs |
mov esi,size |
mov eax,4 |
int 0x40 |
} |
;_ equ '____' |
;macro libtest x,y,color |
;{ |
;if x = as dword |
; mov ebx,x |
;end if |
; mov ecx,y |
; mov edx,color |
; mov eax,1 |
; int 0x40 |
;} |
macro outcount data, x, y, color, numtype |
{ |
mov ecx,data |
mov ebx,numtype |
mov bl,0 |
mov edx,x*65536+y |
mov esi,color |
mov eax,47 |
int 0x40 |
} |
; SCEVENT - Scan event |
macro scevent red,key,but |
{ |
mov eax,11 |
int 0x40 |
dec eax |
jz red |
dec eax |
jz key |
dec eax |
jz but |
} |
; WTEVENT - Wait event |
macro wtevent red,key,but |
{ |
mov eax,10 |
int 0x40 |
dec eax |
jz red |
dec eax |
jz key |
dec eax |
jz but |
} |
; TIMEEVENT - Wite for event with timeout |
macro timeevent xfps,noevent,red,key,but |
{ |
mov eax,23 |
mov ebx,xfps |
int 0x40 |
cmp eax,0 |
je noevent |
dec eax |
jz red |
dec eax |
jz key |
dec eax |
jz but |
} |
; CLOSE - Close program |
macro close |
{ |
mov eax,-1 |
int 0x40 |
} |
; DELAY - Create delay 1/100 sec |
; (SYNTAX) Delay time |
; (SAMPLE) Delay 100 ;delay 2 sec 1/100*200=2 sec |
macro delay arg1 |
{ |
mov eax,5 |
mov ebx,arg1 |
int 0x40 |
} |
; WINDOW - Draw window |
; (SYNTAX) WINDOW Xstart,Ystart,'Text',Color |
; (SAMPLE) WINDOW 10,10,640+8,480+24,window_Skinned |
macro window arg1,arg2,arg3,arg4,arg5 |
{ |
mov ebx,arg1*65536+arg3 |
mov ecx,arg2*65536+arg4 |
mov edx,arg5 |
mov eax,0 |
int 0x40 |
} |
macro colorwindow arg1,arg2,arg3,arg4,arg5,arg6,arg7 |
{ |
mov ebx,arg1*65536+arg3 |
mov ecx,arg2*65536+arg4 |
mov edx,arg5 |
mov esi,arg6 |
mov edi,arg7 |
mov eax,0 |
int 0x40 |
} |
; STARTWD - Start of window draw |
macro startwd |
{ |
mov eax,12 |
mov ebx,1 |
int 0x40 |
} |
; ENDWD - End window draw |
macro endwd |
{ |
mov eax,12 |
mov ebx,2 |
int 0x40 |
} |
; LABEL - Put text to frame |
; (SYNTAX) LABEL Xstart,Ystart,'Text',Color |
; (SAMPLE) LABEL 10,12,'Hello World!',cl_Green+font_Big |
macro label arg1,arg2,arg3,arg4 |
{ |
local asd,lab |
jmp asd |
lab db arg3 ;arg label |
asd: |
mov ebx,arg1 ;arg1=y arg2=x |
shl ebx,16 |
add ebx,arg2 |
mov ecx,arg4 ;arg4 color |
mov edx,lab |
mov esi,asd-lab ;calc size |
mov eax,4 |
int 0x40 |
} |
;Key's |
key_Up equ 178 |
key_Down equ 177 |
key_Right equ 179 |
key_Left equ 176 |
key_Esc equ 27 |
key_Space equ 32 |
key_Enter equ 13 |
key_Bspace equ 8 |
key_F1 equ 50 |
key_F2 equ 51 |
key_F3 equ 52 |
key_F4 equ 53 |
key_F5 equ 54 |
key_F6 equ 55 |
key_F7 equ 56 |
key_F8 equ 57 |
key_F9 equ 48 |
key_F10 equ 49 |
key_F11 equ 68 |
key_F12 equ 255 |
key_Home equ 180 |
key_End equ 181 |
key_PgUp equ 184 |
key_PgDown equ 183 |
;Attributes |
;Window Attributes |
window_Skinned equ 0x03000000 |
window_Type2 equ 0x02000000 |
window_Type1 equ 0x00000000 |
window_Reserve equ 0x01000000 |
;Font Attributes |
font_Big equ 0x10000000 |
;Colors |
cl_White equ 0x00ffffff |
cl_Black equ 0x00000000 |
cl_Grey equ 0x00888888 |
cl_Red equ 0x00ff0000 |
cl_Lime equ 0x0000ff00 |
cl_Green equ 0x0000af00 |
cl_Blue equ 0x000000ff |
cl_Purple equ 0x008080ff |
cl_Violet equ 0x008040ff |
cl_Cyan equ 0x0040e0ff |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/3dcube2/trunk/build_en.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix en >lang.inc |
@fasm 3dcube2.asm 3dcube2 |
@pause |
/programs/3dcube2/trunk/build_ru.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix ru >lang.inc |
@fasm 3dcube2.asm 3dcube2 |
@pause |
/programs/3dcube2/trunk/macros.inc |
---|
0,0 → 1,266 |
; new application structure |
macro meos_app_start |
{ |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd __start |
dd __end |
dd __memory |
dd __stack |
if used __params & ~defined __params |
dd __params |
else |
dd 0x0 |
end if |
dd 0x0 |
} |
MEOS_APP_START fix meos_app_start |
macro code |
{ |
__start: |
} |
CODE fix code |
macro data |
{ |
__data: |
} |
DATA fix data |
macro udata |
{ |
if used __params & ~defined __params |
__params: |
db 0 |
__end: |
rb 255 |
else |
__end: |
end if |
__udata: |
} |
UDATA fix udata |
macro meos_app_end |
{ |
align 32 |
rb 2048 |
__stack: |
__memory: |
} |
MEOS_APP_END fix meos_app_end |
; macro for defining multiline text data |
struc mstr [sstring] |
{ |
forward |
local ssize |
virtual at 0 |
db sstring |
ssize = $ |
end virtual |
dd ssize |
db sstring |
common |
dd -1 |
} |
; strings |
macro sz name,[data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if used name |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
macro lsz name,[lng,data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if (used name)&(lang eq lng) |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
; easy system call macro |
macro mpack dest, hsrc, lsrc |
{ |
if (hsrc eqtype 0) & (lsrc eqtype 0) |
mov dest, (hsrc) shl 16 + lsrc |
else |
if (hsrc eqtype 0) & (~lsrc eqtype 0) |
mov dest, (hsrc) shl 16 |
add dest, lsrc |
else |
mov dest, hsrc |
shl dest, 16 |
add dest, lsrc |
end if |
end if |
} |
macro __mov reg,a { ; mike.dld |
if ~a eq |
mov reg,a |
end if |
} |
macro mcall a,b,c,d,e,f { ; mike.dld |
__mov eax,a |
__mov ebx,b |
__mov ecx,c |
__mov edx,d |
__mov esi,e |
__mov edi,f |
int 0x40 |
} |
; language for programs |
lang fix ru ; ru en fr ge fi |
; optimize the code for size |
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp> |
macro add arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
inc arg1 |
else |
add arg1,arg2 |
end if |
else |
add arg1,arg2 |
end if |
} |
macro sub arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
dec arg1 |
else |
sub arg1,arg2 |
end if |
else |
sub arg1,arg2 |
end if |
} |
macro mov arg1,arg2 |
{ |
if (arg1 in __regs) & (arg2 eqtype 0) |
if (arg2) = 0 |
xor arg1,arg1 |
else if (arg2) = 1 |
xor arg1,arg1 |
inc arg1 |
else if (arg2) = -1 |
or arg1,-1 |
else if (arg2) > -128 & (arg2) < 128 |
push arg2 |
pop arg1 |
else |
mov arg1,arg2 |
end if |
else |
mov arg1,arg2 |
end if |
} |
macro struct name |
{ |
virtual at 0 |
name name |
sizeof.#name = $ - name |
end virtual |
} |
; structures used in MeOS |
struc process_information |
{ |
.cpu_usage dd ? ; +0 |
.window_stack_position dw ? ; +4 |
.window_stack_value dw ? ; +6 |
.not_used1 dw ? ; +8 |
.process_name rb 12 ; +10 |
.memory_start dd ? ; +22 |
.used_memory dd ? ; +26 |
.PID dd ? ; +30 |
.x_start dd ? ; +34 |
.y_start dd ? ; +38 |
.x_size dd ? ; +42 |
.y_size dd ? ; +46 |
.slot_state dw ? ; +50 |
rb (1024-52) |
} |
struct process_information |
struc system_colors |
{ |
.frame dd ? |
.grab dd ? |
.grab_button dd ? |
.grab_button_text dd ? |
.grab_text dd ? |
.work dd ? |
.work_button dd ? |
.work_button_text dd ? |
.work_text dd ? |
.work_graph dd ? |
} |
struct system_colors |
; constants |
; events |
EV_IDLE = 0 |
EV_TIMER = 0 |
EV_REDRAW = 1 |
EV_KEY = 2 |
EV_BUTTON = 3 |
EV_EXIT = 4 |
EV_BACKGROUND = 5 |
EV_MOUSE = 6 |
EV_IPC = 7 |
EV_STACK = 8 |
; event mask bits for function 40 |
EVM_REDRAW = 1b |
EVM_KEY = 10b |
EVM_BUTTON = 100b |
EVM_EXIT = 1000b |
EVM_BACKGROUND = 10000b |
EVM_MOUSE = 100000b |
EVM_IPC = 1000000b |
EVM_STACK = 10000000b |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/3detx60b/trunk/3DETX60B.ASM |
---|
0,0 → 1,2539 |
; |
; 3D 3D TEXTURED ENGINE |
; : ¢«îè¨ ¢£¥¨© AUTOR: Pavlushin Evgeni |
; |
; ®¬¯¨«¨àã¥âáï á ¯®¬®éìî FASM áᥬ¡«¥à ¤«ï MenuetOS |
; Compile with FASM assembler for MenuetOS |
; |
; 20.11.04 Fast point calc & triangle draw |
; Little matrix no (trangle massive) |
; Fast triangle, del triangle out of screen |
; 16.12.04 Fast triangle with MMX |
; 20.12.04 Out triangle fatal bug's deleted, "black zones" deleted |
; Matrix move support |
; 24.12.04 Fast keyboard scanning |
; Z-ground level map work |
; Texture draw correction deleted "black zones" |
; 04.01.05 Moveing texture |
; 05.01.05 Water dynamic texture |
; 06.01.05 Texture pack (many textures in one file) |
; 07.01.05 Z-sorting |
; 08.01.05 Triangle good clipping calculating (speed up) |
; 4 byte Z-sorting, more dynamic of water |
; 09.01.05 Texture map from 256 color bmp file |
; Pixel Z-buffer, good speed! |
; 21.01.05 Models buffer add. |
; 25.01.05 Models buffer update, Add 2 new models. |
; 29.01.05 Dynamic model array |
; 01.02.05 1 picture MipMap calculation |
; 04.02.05 All picture MipMap calculation, proc speed up. |
; Simple Triangel MipMap chose. |
; 05.02.05 Normal Triangel MipMap chose. |
; 12.02.05 Best QUALITY of Textured TRIANGEL! |
; 13.02.05 add new models. All camera axis calculating |
; 16.02.05 Simple model turning |
; 17.02.05 Advanced model turning, model tmpoints massive deleted |
; New map size 128, add new models. |
; 25.02.05 Left side clipping bug deleted |
; 26.02.05 Optimization of textured line algorythm |
; 24.04.05 Test pixel z-buffer it's work. Use new textri algorythm |
; 30.04.05 Fast Y-clipping |
use32 |
SCREEN_X equ 800 ;320 ;Screen size easy change |
SCREEN_Y equ 600 ;200 |
DSCREEN_X equ SCREEN_X-1 ;320 ;For triangle clipping |
DSCREEN_Y equ SCREEN_Y-1 ;200 |
MATRIX_XSIZE equ 64;32;64;100 ;Ground matrix size |
MATRIX_YSIZE equ 64;32;64;100 |
SECTOR_SIZE equ 100 ;Size of matrix sector |
MAP_XSIZE equ 128 ;Rezolution of map file |
MAP_YSIZE equ 128 |
org 0x0 |
db 'MENUET01' ; 8 ¡ ©â ¨â¤¥ä¨ª â®à |
dd 0x01 ; ¢¥àá¨ï § £®«®¢ª |
dd START ; ¤à¥áá ç « ª®¤ |
dd I_END ; à §¬¥à ¯à®£à ¬¬ë |
dd I_END+(SCREEN_X*SCREEN_Y*3+50000) ; à §¬¥à ¯ ¬ï⨠¤«ï ¯à®££à ¬¬ë |
dd I_END+(SCREEN_X*SCREEN_Y*3+10000) ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
include 'lang.inc' |
include 'ascgl.inc' |
include 'ascl.inc' |
START: ; ç «® ¯à¨«®¦¥¨ï |
; Draw window at first |
call draw_window |
; Decoding groud texture and ground level map |
gif_hash_offset = gif_hash_area |
;texture's |
giftoimg texpack_gif,texpack_img-8 |
;ground level map |
giftoimg gif_file_area5,glm_img_area |
;get 8bitmap from 256 colors bmp file |
mov ebp,128;64 |
mov esi,0x043a+128*128-4;64*64-4 |
sub esi,128;64 |
mov edi,0 |
mov ecx,128;64 |
texmap_unp: |
mov al,[bmp_texmap+esi] |
mov [img_area+edi],al |
inc esi |
inc edi |
dec ecx |
jnz texmap_unp |
mov ecx,128;64 |
sub esi,256;128 |
dec ebp |
jnz texmap_unp |
;Unpack textures |
mov esi,texpack_img |
mov edi,texture_img |
mov edx,16 |
mov ecx,16 |
tpuckloop: |
pushad |
call unpuck |
popad |
add esi,32*3 |
add edi,4095 |
dec ecx |
jnz tpuckloop |
add esi,31*32*16*3 |
mov ecx,16 |
dec edx |
jnz tpuckloop |
; |
; Unpuck one texture procendure |
; |
jmp skip_unpuck |
unpuck: |
mov ecx,32 |
mov edx,32 |
tunploop: |
mov ax,[esi] |
mov [edi],ax |
mov al,[esi+2] |
mov [edi+2],al |
add esi,3 |
add edi,3 |
dec ecx |
jnz tunploop |
mov ecx,32 |
add esi,(32*16*3)-(32*3) |
dec edx |
jnz tunploop |
ret |
skip_unpuck: |
;calculating all mipmaps |
mov esi,texture_img |
mov ecx,256 ;quantity of textures |
mmaploop: |
mov ebp,32 ;max mipmap texture |
pusha |
call texgen |
popa |
add esi,4095 ;next mipmap block |
dec ecx |
jnz mmaploop |
jmp skip_texgen |
;******************************** |
; MIPMAP TEXTURE GENERATION |
; |
; in put: |
; esi - offset to texture |
; ebp - mipmap max size (32 for this sample) |
;******************************** |
texgen: |
push esi |
mov eax,ebp |
imul eax,ebp |
imul eax,3 |
add eax,esi |
mov edi,eax |
mov eax,ebp |
shr eax,1 |
mov dh,al |
mov dl,al |
mov cl,dl |
mov ecx,ebp |
mov eax,ebp |
shl eax,1 |
add ecx,eax |
miploop: |
; Red |
xor bx,bx ;for add |
xor ax,ax ;for add |
mov al,[esi+0] |
add bx,ax |
mov al,[esi+3+0] |
add bx,ax |
mov al,[esi+ecx+0] |
add bx,ax |
mov al,[esi+ecx+3+0] |
add bx,ax |
shr bx,2 ;/4 |
mov [edi+0],bl |
;Green |
xor bx,bx ;for add |
xor ax,ax ;for add |
mov al,[esi+1] |
add bx,ax |
mov al,[esi+3+1] |
add bx,ax |
mov al,[esi+ecx+1] |
add bx,ax |
mov al,[esi+ecx+3+1] |
add bx,ax |
shr bx,2 ;/4 |
mov [edi+1],bl |
;Blue |
xor bx,bx ;for add |
xor ax,ax ;for add |
mov al,[esi+2] |
add bx,ax |
mov al,[esi+3+2] |
add bx,ax |
mov al,[esi+ecx+2] |
add bx,ax |
mov al,[esi+ecx+3+2] |
add bx,ax |
shr bx,2 ;/4 |
mov [edi+2],bl |
add esi,6 |
add edi,3 |
dec dl |
jnz miploop |
mov ax,bp |
shr ax,1 |
mov dl,al |
add esi,ecx |
dec dh |
jnz miploop |
pop esi |
mov eax,ebp |
imul eax,ebp |
imul eax,3 |
add esi,eax |
shr ebp,1 |
cmp ebp,1 |
jne texgen |
ret |
skip_texgen: |
;Copy dynamic water texture |
; ???????????? |
mov ecx,32*32*3 |
mov esi,texture_img+4095 ;32*32*3 |
mov edi,texture_limg |
cld |
rep movsb |
; init sine wave for dynamic water texture |
finit |
mov edi,sinwave |
mov ecx,32;256 |
isv_loop: |
fld [angle] |
fld st |
fsin |
fmul [mul_wave] |
fistp word [edi] |
fadd [d_angle] |
fstp [angle] |
add edi,2 |
dec ecx |
jnz isv_loop |
;Initalize keyboard |
mov eax,66 |
mov ebx,1 |
mov ecx,1 |
int 0x40 |
mov eax,26 |
mov ebx,2 |
mov ecx,1 |
mov edx,keymap+100 |
int 0x40 |
;Build triangle matrix |
mov esi,points |
mov eax,-(MATRIX_XSIZE/2)*SECTOR_SIZE |
mov ebx,-(MATRIX_YSIZE/2)*SECTOR_SIZE |
mov ebp,img_area+8 |
loomat: |
mov [esi],eax ;x-set |
mov [esi+4],ebx ;y-set |
mov [esi+8],ecx ;z-set |
add ebp,3 |
add esi,4*3 |
add eax,SECTOR_SIZE |
cmp eax,((MATRIX_YSIZE/2)+1)*SECTOR_SIZE |
jnge loomat |
mov eax,-(MATRIX_YSIZE/2)*SECTOR_SIZE |
add ebx,SECTOR_SIZE |
cmp ebx,((MATRIX_XSIZE/2)+1)*SECTOR_SIZE |
jnge loomat |
; Create z-ground good algorythm not already yet (64x64 map) |
mov esi,glm_img_area+8 |
mov edi,ground_level_map |
loox: |
; draw_courner_points |
mov eax,[esi] |
call get_z |
; mov [edi],eax |
mov eax,[esi+((MATRIX_XSIZE-1)*4)] |
call get_z |
; mov [edi+((MATRIX_XSIZE)*4)],eax |
mov eax,[esi+(((MATRIX_XSIZE)*(MATRIX_YSIZE-1)+1)*4)] |
call get_z |
; mov [edi+(((MATRIX_XSIZE+1)*(MATRIX_YSIZE)-0)*4)],eax |
mov eax,[esi+(((MATRIX_XSIZE)*(MATRIX_YSIZE)-1)*4)] |
call get_z |
; mov [edi+(((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)-1)*4)],eax |
jmp skip_gz |
get_z: |
xor ebx,ebx |
xor ecx,ecx |
mov bl,al |
add ecx,ebx |
mov bl,ah |
add ecx,ebx |
shr eax,16 |
mov bl,al |
add ecx,ebx |
mov eax,ecx |
xor edx,edx |
mov ebx,3 |
cdq |
div ebx |
neg eax |
ret |
skip_gz: |
; z-ground livel facking method (65x65 map) |
mov esi,glm_img_area+8 |
mov edi,ground_level_map |
mov ebp,(MAP_XSIZE+1)*(MAP_YSIZE+1) |
looglm: |
mov eax,[esi] |
; and eax,0x000000ff |
call get_z |
mov [edi],eax |
add esi,3 |
add edi,1 |
dec ebp |
jnz looglm |
;Fill model massive |
mov ecx,[model_mas_start] |
imul ecx,8 |
add ecx,4 |
mov esi,model_mas_start |
mov edi,model_mas |
cld |
rep movsd |
jmp skip_moddata |
model_mas_start: |
dd 12 ;quantity of models |
dd 0,0,-150,0,0,0,0,bunker |
dd 60,-250,-190,0,0,64,0,tank |
dd 0,180,-150,0,0,0,0,cannon |
dd 0,480,-150,0,0,0,0,outpost |
dd 260,60,-150,0,0,0,0,bunker |
dd 60,260,-150,0,0,0,0,outpost |
dd 210,410,-150,0,0,0,0,cannon |
dd 160,260,-150,0,0,0,0,tree |
dd 100,-360,-150,0,0,192,0,gqfa |
dd 10,580,-150,0,0,0,0,repear |
dd 460,160,-100,0,0,0,0,red_flag |
dd 60,360,-170,0,0,40,0,cannon |
skip_moddata: |
;Main loop |
still: ; ®á®¢®© 横« |
mov eax,11 ; ¯à®¢¥àª á®áâ®ï¨ï ®ª |
int 0x40 |
cmp eax,1 ; ®ª® ᤢ¨ã«¨ ¥£® 㦮 ¯¥à¥à¨á®¢ âì |
je red |
cmp eax,2 ; ¦ â ª« ¢¨è ª« ¢¨ âãॠ|
je key |
cmp eax,3 ; ¦ â ª®¯ª ¢ ®ª¥ |
je button |
; delay 10 |
; cmp [autorot],0 ;frize no fps show when autorot off |
; je still |
cycle: |
call clrscr ; clear screen buffer |
call clrzbuf ; clear z-buffer |
call render_scene ; calculating scene |
call dispimg ; show buffer |
fps_show_frequency=0 |
fps 10,10,cl_White,cl_Black |
;turn model on z-axis |
inc dword [model_mas+4*6] |
and dword [model_mas+4*6],011111111b |
; Sin wave dynamic texture for water |
; jmp ndt |
xor edi,edi |
mov dx,32 |
mov bp,word [sin_pos] |
dp_ver: |
mov cx,32 ;320 |
mov si,word [sin_pos] |
dp_hor: |
and ebp,0000ffffh |
mov ax,word [sinwave+ebp] |
add ax,cx |
and ax,31 |
and esi,0000ffffh |
mov bx,word [sinwave+esi] |
add bx,dx |
and bx,31 |
shl bx,5 |
add bx,ax |
push bx |
imul bx,3 |
and ebx,0000ffffh |
mov ax,[texture_limg+ebx] |
mov [texture_img2+edi],ax |
mov al,[texture_limg+ebx+2] |
mov [texture_img2+edi+2],al |
pop bx |
add edi,3 |
add si,2 |
and si,63;511 |
dec cx |
jnz dp_hor |
add bp,2 |
and bp,63;511 |
dec dx |
jnz dp_ver |
; update sine position for next frame |
add word [sin_pos],2 |
and word [sin_pos],63;511 |
;Move water texture |
jmp ndt |
mov esi,texture_limg |
mov ecx,32*32-1 |
loodt: |
mov al,byte [esi] |
mov bl,byte [esi+1] |
mov dl,byte [esi+2] |
mov ah,byte [esi+3] |
mov bh,byte [esi+4] |
mov dh,byte [esi+5] |
mov byte [esi],ah |
mov byte [esi+1],bh |
mov byte [esi+2],dh |
mov byte [esi+3],al |
mov byte [esi+4],bl |
mov byte [esi+5],dl |
add esi,3 |
dec ecx |
jnz loodt |
ndt: |
;Creat mipmap pack for dynamic texture |
mov ebp,32 |
mov esi,texture_img+4095 |
call texgen |
mov eax,4 ; function 4 : write text to window |
mov ebx,8*65536+8 ; [x start] *65536 + [y start] |
mov ecx,0x0000ff00 ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,keymap ; pointer to text beginning |
mov esi,100 ; text length |
int 0x40 |
add edx,100 |
add ebx,10 |
mov esi,60 ; text length |
mov ecx,0x00dddddd ; font 1 & color ( 0xF0RRGGBB ) |
int 0x40 |
mov edx,usemap |
mov esi,60 ; text length |
mov ecx,0x0000ff00 |
int 0x40 |
jmp rx |
;01234567890123456789012345678901234567890123456789 |
usemap db ' E wer u [] asd zxc ' |
db ' ' |
rx: |
cmp byte [keymap+1],0 |
je n_esc |
jmp exit |
n_esc: |
cmp byte [keymap+22],0 |
je n_u |
mov [Xangle],0 |
mov [Yangle],0 |
mov [Zangle],0 |
n_u: |
; t,y - mipmap cntrol |
cmp byte [keymap+20],0 |
je n_t |
inc [mipzoom] |
n_t: |
cmp byte [keymap+21],0 |
je n_y |
dec [mipzoom] |
n_y: |
cmp byte [keymap+23],0 |
je n_i |
mov byte [keymap+23],0 ; reset key |
cmp [mipmapwork],1 |
je i_1 |
i_0: |
mov [mipmapwork],1 |
jmp n_i |
i_1: |
mov [mipmapwork],0 |
n_i: |
cmp byte [keymap+26],0 |
je n_lsk |
add [Xcam],1 |
n_lsk: |
cmp byte [keymap+27],0 |
je n_rsk |
sub [Xcam],1 |
n_rsk: |
cmp byte [keymap+18],0 |
je n_e |
add [Yangle],1 |
n_e: |
cmp byte [keymap+45],0 |
je n_x |
sub [Yangle],1 |
n_x: |
cmp byte [keymap+31],0 |
je n_s |
add [Xangle],1 |
n_s: |
cmp byte [keymap+32],0 |
je n_d |
sub [Xangle],1 |
n_d: |
cmp byte [keymap+44],0 |
je n_z |
add [Zangle],1 |
n_z: |
cmp byte [keymap+46],0 |
je n_c |
sub [Zangle],1 |
n_c: |
cmp byte [keymap+17],0 |
je n_w |
add [Zcam],25 ;250 |
n_w: |
cmp byte [keymap+19],0 |
je n_r |
sub [Zcam],25 ;250 |
n_r: |
cmp byte [keymap+75],0 |
je n_lk |
add [Zcamangle],1 |
and [Zcamangle],011111111b |
n_lk: |
cmp byte [keymap+77],0 |
je n_rk |
sub [Zcamangle],1 |
and [Zcamangle],011111111b |
n_rk: |
cmp byte [keymap+79],0 |
je n_num1 |
add [Xcamangle],1 |
and [Xcamangle],011111111b |
n_num1: |
cmp byte [keymap+81],0 |
je n_num3 |
sub [Xcamangle],1 |
and [Xcamangle],011111111b |
n_num3: |
cmp byte [keymap+71],0 |
je n_num7 |
add [Ycamangle],1 |
and [Ycamangle],011111111b |
n_num7: |
cmp byte [keymap+73],0 |
je n_num9 |
sub [Ycamangle],1 |
and [Ycamangle],011111111b |
n_num9: |
cmp byte [keymap+30],0 |
je n_a |
mov byte [keymap+30],0 ; reset key |
cmp [autorot],1 |
je a_1 |
a_0: |
mov [autorot],1 |
jmp n_a |
a_1: |
mov [autorot],0 |
n_a: |
; for camera |
; mov ebx,[Xcamangle] |
; call GetSinCos |
; mov [Xcamsin],eax |
; mov [Xcamcos],ebx |
; mov ebx,[Ycamangle] |
; call GetSinCos |
; mov [Ycamsin],eax |
; mov [Ycamcos],ebx |
mov ebx,[Zcamangle] |
call GetSinCos |
mov [Zcamsin],eax |
mov [Zcamcos],ebx |
mov eax,[Zcamsin] |
mov ebx,[Zcamcos] |
; mov ecx,[Xcamsin] |
; mov edx,[Xcamcos] |
; mov esi,[Ycamsin] |
; mov edi,[Ycamcos] |
sar eax,4 |
sar ebx,4 |
; sar ecx,4 |
; sar edx,4 |
; sar esi,4 |
; sar edi,4 |
cmp byte [keymap+72],0 |
je n_uk |
sub [Xcam],eax |
sub [Ycam],ebx |
; sub [Zcam],ecx |
; sub [Ycam],edx |
; sub [Xcam],esi |
; add [Zcam],edi |
n_uk: |
cmp byte [keymap+80],0 |
je n_dk |
add [Xcam],eax |
add [Ycam],ebx |
; add [Zcam],ecx |
; add [Ycam],edx |
; add [Xcam],esi |
; sub [Zcam],edi |
n_dk: |
xor ebp,ebp |
move_test: |
cmp [Xcam],-SECTOR_SIZE/2 |
jnl ok1 |
add [Xcam],SECTOR_SIZE |
dec [Xmap] |
jmp move_test |
ok1: |
cmp [Xcam],SECTOR_SIZE/2 |
jng ok2 |
sub [Xcam],SECTOR_SIZE |
inc [Xmap] |
jmp ok1 |
ok2: |
cmp [Ycam],-SECTOR_SIZE/2 |
jnl ok3 |
add [Ycam],SECTOR_SIZE |
dec [Ymap] |
jmp ok2 |
ok3: |
cmp [Ycam],SECTOR_SIZE/2 |
jng ok4 |
sub [Ycam],SECTOR_SIZE |
inc [Ymap] |
jmp ok3 |
ok4: |
and [Xangle],011111111b |
and [Yangle],011111111b |
and [Zangle],011111111b |
jmp still |
red: ; redraw |
call draw_window |
jmp still |
key: ; key |
mov eax,2 ; just read it and ignore |
int 0x40 |
shr eax,8 |
and eax,0xff |
mov ah,al |
mov ebx,0 |
mov bl,ah |
cmp bl,224 |
je noisa ; ignore Ext code |
cmp bl,170 |
je noisa ; ignore Key Up code |
cmp bl,128 |
ja isa |
mov [keymap+ebx],byte 'X' ; set press marker to key id |
jmp noisa |
isa: |
sub bl,128 |
mov [keymap+ebx],byte 0 ; reset key marker |
noisa: |
jmp n_a |
jmp still ; cycle |
button: ; button |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 |
jz exit |
jmp cycle |
exit: |
mov eax,-1 |
int 0x40 |
; ********************************************* |
; ******* WINDOW DEFINITIONS AND DRAW ******** |
; ********************************************* |
draw_window: |
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,1 ; 1, start of draw |
int 0x40 |
; DRAW WINDOW |
mov eax,0 ; function 0 : define and draw window |
mov ebx,0*65536+SCREEN_X-1 ; [x start] *65536 + [x size] |
mov ecx,0*65536+SCREEN_Y-1 ; [y start] *65536 + [y size] |
mov edx,0x03ffffff ; color of work area RRGGBB,8->color gl |
mov esi,0x005080d0 ; color of grab bar RRGGBB,8->color gl |
mov edi,0x005080d0 ; color of frames RRGGBB |
int 0x40 |
; WINDOW LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,8*65536+8 ; [x start] *65536 + [y start] |
mov ecx,0x10ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelt ; pointer to text beginning |
mov esi,labellen-labelt ; text length |
int 0x40 |
mov eax,12 |
mov ebx,2 |
int 0x40 |
ret |
dispimg: |
mov eax,7 |
mov ebx,I_END ;zbuffer |
mov ecx,SCREEN_X*65536+SCREEN_Y |
xor edx,edx ;0*65536+0 |
int 0x40 |
; ret |
mov eax,8 |
mov ebx,(SCREEN_X-30)*65536+20 |
mov ecx,10*65536+20 |
mov edx,1 |
mov esi,0x0000aa00 |
int 0x40 |
ret |
clrscr: ; clear screen buffer |
; cld |
; mov edi,I_END |
; xor eax,eax |
; mov ecx,SCREEN_X*SCREEN_Y*3/4 |
; rep stosd |
; ret |
; clear screen buffer with MMX technology +1,5 fps |
mov edi,I_END |
mov ecx,SCREEN_X*SCREEN_Y*3/32 |
xor eax,eax |
movd mm0,eax |
movd mm1,eax |
movd mm2,eax |
movd mm3,eax |
csloo: |
movq qword [edi],mm0 |
movq qword [edi+8],mm1 |
movq qword [edi+16],mm2 |
movq qword [edi+24],mm3 |
add edi,32 |
dec ecx |
jnz csloo |
ret |
clrzbuf: ; clear zbuf |
cld |
mov edi,zbuffer |
mov eax,-1 |
mov ecx,SCREEN_X*SCREEN_Y*3/4 |
rep stosd |
ret |
; mov [@@atx1],dword 0xffffffff |
; mov [@@aty1],dword 0xffffffff |
; movq mm0,qword [@@atx1] |
; movq mm1,qword [@@atx1] |
; movq mm2,qword [@@atx1] |
; movq mm3,qword [@@atx1] |
;czbloo: |
; movq qword [edi],mm0 |
; movq qword [edi+8],mm1 |
; movq qword [edi+16],mm2 |
; movq qword [edi+24],mm3 |
; add edi,32 |
; dec ecx |
; jnz czbloo |
ret |
@@atx1: dd 0 |
@@aty1: dd 0 |
;=========================================================================== |
; |
; 3D-system example. Use the following formulas to rotate a point: |
; |
; Rotate around x-axis |
; Y = Y * COS(xang) - Z * SIN(xang) / 256 |
; Z = Y * SIN(xang) + Z * COS(xang) / 256 |
; |
; Rotate around y-axis |
; X = X * COS(yang) - Z * SIN(yang) / 256 |
; Z = X * SIN(yang) + Z * COS(yang) / 256 |
; |
; Rotate around z-axis |
; X = X * COS(zang) - Y * SIN(zang) / 256 |
; Y = X * SIN(zang) + Y * COS(zang) / 256 |
; |
; Divide by 256 coz we have multiplyd our sin values with 256 too. |
; This example isn't too fast right now but it'll work just fine. |
; |
;=========================================================================== |
;*************************************************************************** |
; \\\ MAIN 3D LOOP /// |
; ****************** |
render_scene: |
;******************** |
; Turn matrix points |
;******************** |
cmp [autorot],0 |
je no_autorot |
call UpdateAngles ; Calculate new angles |
no_autorot: |
call SetRotation ; Find sine & cosine of those angles |
mov edi,tpoints |
mov esi,points |
mov [mapoff],-1 ;-1 at start |
mov ebp,[Ymap] |
imul ebp,MAP_XSIZE+1 |
mov eax,[Xmap] |
add ebp,eax |
mov ecx,(MATRIX_XSIZE+1)*(MATRIX_YSIZE+1) |
ShowLoop: |
push ecx |
push esi |
mov eax,[esi] |
sub eax,[Xcam] |
mov [X],eax |
mov eax,[esi+4] |
sub eax,[Ycam] |
mov [Y],eax |
mov eax,[ebp+ground_level_map] ;color |
and eax,0x000000ff |
sub eax,[Zcam] |
mov [Z],eax |
push ebp |
push edi |
call TranslatePoint ; Rotates the point using above formulas |
pop edi |
mov [edi],ebp ;x |
mov [edi+4],eax ;y |
mov eax,[Z] ;z |
add eax,[Zoff] |
mov [edi+8],eax |
pop ebp |
pop esi |
pop ecx |
add esi,4*3 ;next in point |
add edi,4*3 ;next out point |
inc [mapoff] |
cmp [mapoff],MATRIX_XSIZE+1 |
jne no_shift_glm |
mov [mapoff],dword 0 |
add ebp,(MAP_XSIZE-MATRIX_XSIZE) |
no_shift_glm: |
add ebp,1 |
dec ecx |
jnz ShowLoop |
; Show, how many polygons on screen. |
outcount [massize],50,10,cl_White,8*65536 |
;***************** |
; out triangles |
;***************** |
mov [mapoff],-1 ;-1 at start |
mov [massize],0 ;restet triangle massive counter |
mov ebp,[Ymap] |
imul ebp,MAP_XSIZE;64;3*64 ;MAP_XSIZE |
mov eax,[Xmap] |
add ebp,eax |
mov edi,tpoints |
mov ecx,MATRIX_YSIZE ;64 |
lootpy: |
push ecx |
mov ecx,MATRIX_XSIZE ;64 |
lootpx: |
;draw four angle (two triangles) |
Z_MAX = 10 ;maximal z range for triangles |
; get texture offset at start |
inc [mapoff] |
cmp [mapoff],MATRIX_XSIZE |
jne no_shift |
mov [mapoff],dword 0 |
add ebp,(MAP_XSIZE-MATRIX_XSIZE) |
no_shift: |
xor eax,eax |
mov al,[ebp+img_area];+8] |
inc ebp |
imul eax,4095;32*32*3 |
add eax,texture_img |
mov ebx,eax |
;first triangle |
mov eax,[edi+8] ;z1 |
cmp eax,Z_MAX |
jl no_add1 |
mov [@@tz1],eax |
mov eax,[edi+8+12] ;z2 |
cmp eax,Z_MAX |
jl no_add1 |
mov [@@tz2],eax |
mov eax,[edi+8+(4*3*(MATRIX_XSIZE+2))] ;z3 |
cmp eax,Z_MAX |
jl no_add1 |
mov [@@tz3],eax |
cmp dword [edi],SCREEN_X |
ja p11 |
cmp dword [edi+4],SCREEN_Y |
jna yes_add1 |
p11: |
cmp dword [edi+12],SCREEN_X |
ja p12 |
cmp dword [edi+4+12],SCREEN_Y |
jna yes_add1 |
p12: |
cmp dword [edi+(4*3*(MATRIX_XSIZE+2))],SCREEN_X |
ja p13 |
cmp dword [edi+4+(4*3*(MATRIX_XSIZE+2))],SCREEN_Y |
jna yes_add1 |
p13: |
jmp no_add1 |
yes_add1: |
movq mm0,qword [edi] ;x1 |
movq mm1,qword [edi+12] ;x2 |
movq mm2,qword [edi+(4*3*(MATRIX_XSIZE+2))] ;x3 |
movq qword [@@tx1],mm0 |
movq qword [@@tx2],mm1 |
movq qword [@@tx3],mm2 |
mov eax,ebx;+1 shl 31;[ebp] |
mov [@@tex_off],eax ;0x0000ff00 |
inc [massize] |
pushad |
mov [@@tex_x1],0 |
mov [@@tex_y1],0 |
mov [@@tex_x3],(32 shl 16) -1;128 |
mov [@@tex_y3],(32 shl 16) -1;128 |
mov [@@tex_x2],0 |
mov [@@tex_y2],(32 shl 16) -1;128 |
call textured_triangle |
popad |
no_add1: |
;second triangle |
mov eax,[edi+8] ;z1 |
cmp eax,Z_MAX |
jl no_add2 |
mov [@@tz1],eax |
mov eax,[edi+8+(4*3*(MATRIX_XSIZE+1))] ;z2 |
cmp eax,Z_MAX |
jl no_add2 |
mov [@@tz2],eax |
mov eax,[edi+8+(4*3*(MATRIX_XSIZE+2))] ;z3 |
cmp eax,Z_MAX |
jl no_add2 |
mov [@@tz3],eax |
cmp dword [edi],SCREEN_X |
ja p21 |
cmp dword [edi+4],SCREEN_Y |
jna yes_add2 |
p21: |
cmp dword [edi+(4*3*(MATRIX_XSIZE+1))],SCREEN_X |
ja p22 |
cmp dword [edi+4+(4*3*(MATRIX_XSIZE+1))],SCREEN_Y |
jna yes_add2 |
p22: |
cmp dword [edi+(4*3*(MATRIX_XSIZE+2))],SCREEN_X |
ja p23 |
cmp dword [edi+4+(4*3*(MATRIX_XSIZE+2))],SCREEN_Y |
jna yes_add2 |
p23: |
jmp no_add2 |
yes_add2: |
movq mm0,qword [edi] ;x1 |
movq mm1,qword [edi+(4*3*(MATRIX_XSIZE+1))] ;x2 |
movq mm2,qword [edi+(4*3*(MATRIX_XSIZE+2))] ;x3 |
movq qword [@@tx1],mm0 |
movq qword [@@tx2],mm1 |
movq qword [@@tx3],mm2 |
mov eax,ebx |
mov [@@tex_off],eax ;0x0000ff00 |
inc [massize] |
; add esi,4*10 |
pushad |
mov [@@tex_x1],0 |
mov [@@tex_y1],0 |
mov [@@tex_x3],(32 shl 16) -1;128 |
mov [@@tex_y3],(32 shl 16) -1;128 |
mov [@@tex_x2],(32 shl 16) -1 |
mov [@@tex_y2],0 |
call textured_triangle |
popad |
no_add2: |
add edi,4*3 ;next triangle |
dec ecx |
jnz lootpx |
add edi,4*3 ;next string |
pop ecx |
dec ecx |
jnz lootpy |
;********************************** |
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
;********************************** |
; For good models quality -5% speed |
; call clrzbuf |
jmp skip_modmas |
mmcnt dd 0 ;counter of model read number |
modeloff dd 0 ;offset of model structure |
modelmoff dd 0 ;offset in model mas |
modeltmpoff dd 0 ;tmpoints offset |
; massive of models |
; format: X,Y,Z coordoinats,offset to model structure |
skip_modmas: |
; Rendering models on map |
mov eax,[model_mas] |
mov [mmcnt],eax |
ModelRenderLoop: |
mov ebx,[mmcnt] |
dec ebx |
imul ebx,4*8 |
add ebx,model_mas+4 |
mov ebp,ebx ;edi=model offset X,Y,Z,Xturn,Yturn,Zturn,zero,modeloff |
mov ebx,[ebp+4*3];[Xangle] ; Grab angle |
call GetSinCos ; Get the sine&cosine |
mov [Xsin],eax ; Save sin |
mov [Xcos],ebx ; Save cos |
mov ebx,[ebp+4*4];[Yangle] |
call GetSinCos |
mov [Ysin],eax |
mov [Ycos],ebx |
mov ebx,[ebp+4*5];[Zangle] |
call GetSinCos |
mov [Zsin],eax |
mov [Zcos],ebx |
mov ebx,[mmcnt] |
imul ebx,4*8 |
add ebx,model_mas+4-4 |
mov eax,[ebx] |
mov [modeloff],eax |
sub ebx,4*7;3 |
mov [modelmoff],ebx |
mov edi,modelpoints |
mov esi,eax ;bunker+8 |
add esi,8 |
mov ecx,[eax] ;[bunker] ;MODEL_POINTS |
TurnModelLoop: |
push ecx |
push esi |
mov eax,[esi] |
mov [X],eax |
mov eax,[esi+4] |
mov [Y],eax |
mov eax,[esi+8] |
mov [Z],eax |
push ebp |
push edi |
;RotatePoint |
mov esi,[Y] |
mov ebx,[Xcos] |
mov edi,[Z] |
mov ecx,[Xsin] |
call math |
mov [Y],esi |
mov [Z],edi |
mov esi,[X] |
mov ebx,[Ycos] |
mov ecx,[Ysin] |
call math |
mov [X],esi |
mov [Z],edi |
mov ebx,[Zcos] |
mov edi,[Y] |
mov ecx,[Zsin] |
call math |
mov [X],esi |
mov [Y],edi |
pop edi |
mov eax,[X] |
mov [edi],eax |
mov eax,[Y] |
mov [edi+4],eax |
mov eax,[Z] ;z |
; add eax,[Zoff] |
mov [edi+8],eax |
pop ebp |
pop esi |
pop ecx |
add esi,4*3 ;next in point |
add edi,4*3 ;next out point |
dec ecx |
jnz TurnModelLoop |
modxxx: |
;Turn model off map |
call SetRotation |
mov ebx,[mmcnt] |
imul ebx,4*8 |
add ebx,model_mas+4-4 |
mov eax,[ebx] |
mov [modeloff],eax |
sub ebx,4*7;3 |
mov [modelmoff],ebx |
mov edi,modelpoints |
mov ecx,[eax] ;[bunker] ;MODEL_POINTS |
ShowModelLoop: |
push ecx |
mov eax,[edi] ;esi] |
mov ebx,[modelmoff] |
sub eax,[ebx] ;[Xmod] |
sub eax,[Xcam] |
mov ebx,[Xmap] |
imul ebx,SECTOR_SIZE |
sub eax,ebx |
mov [X],eax |
mov eax,[edi+4] ;esi+4] |
mov ebx,[modelmoff] |
sub eax,[ebx+4] ;[Ymod] |
sub eax,[Ycam] |
mov ebx,[Ymap] |
imul ebx,SECTOR_SIZE |
sub eax,ebx |
mov [Y],eax |
mov eax,[edi+8];esi+8] |
mov ebx,[modelmoff] |
sub eax,[ebx+8] ;[Zmod] |
sub eax,[Zcam] |
mov [Z],eax |
push ebp |
push edi |
call TranslatePoint ; Rotates the point using above formulas |
pop edi |
mov [edi],ebp ;x |
mov [edi+4],eax ;y |
mov eax,[Z] ;z |
add eax,[Zoff] |
mov [edi+8],eax |
pop ebp |
pop ecx |
add edi,4*3 ;next out point |
dec ecx |
jnz ShowModelLoop |
; add [model_mas+8],dword 3 |
mov esi,[massize] |
imul esi,4*10 |
mov eax,[modeloff] |
mov ecx,[eax+4] ;MODEL_TRIANGELS |
;calc tmpoints offset |
mov edi,modelpoints |
mov [modeltmpoff],edi |
;calc postlink offset |
mov edi,[eax] |
imul edi,3*4;*2 ;X,Y,Z (3) points dd format (4) 2 masives (2) |
add edi,eax |
add edi,8 ;skip dd points, dd triangels |
msloo: |
mov ebx,[edi] |
imul ebx,4*3 |
add ebx,[modeltmpoff] ;tmpoints |
mov eax,[ebx] |
mov [@@tx1],eax |
mov eax,[ebx+4] |
mov [@@ty1],eax |
mov eax,[ebx+8] |
mov [@@tz1],eax |
mov ebx,[edi+4] |
imul ebx,4*3 |
add ebx,[modeltmpoff] ;tmpoints |
mov eax,[ebx] |
mov [@@tx2],eax |
mov eax,[ebx+4] |
mov [@@ty2],eax |
mov eax,[ebx+8] |
mov [@@tz2],eax |
mov ebx,[edi+8] |
imul ebx,4*3 |
add ebx,[modeltmpoff] ;tmpoints |
mov eax,[ebx] |
mov [@@tx3],eax |
mov eax,[ebx+4] |
mov [@@ty3],eax |
mov eax,[ebx+8] |
mov [@@tz3],eax |
cmp dword [@@tz1],Z_MAX |
jl no_add |
cmp dword [@@tz2],Z_MAX |
jl no_add |
cmp dword [@@tz3],Z_MAX |
jl no_add |
cmp dword [@@tx1],SCREEN_X |
ja pm1 |
cmp dword [@@ty1],SCREEN_Y |
jna yes_madd |
pm1: |
cmp dword [@@tx2],SCREEN_X |
ja pm2 |
cmp dword [@@ty2],SCREEN_Y |
jna yes_madd |
pm2: |
cmp dword [@@tx3],SCREEN_X |
ja pm3 |
cmp dword [@@ty3],SCREEN_Y |
jna yes_madd |
pm3: |
jmp no_add |
yes_madd: |
mov ebx,[edi+12] |
dec ebx |
js ttex |
mov eax,1 shl 31 |
jmp posit |
ttex: |
add ebx,2 |
mov eax,0 |
neg ebx |
posit: |
imul ebx,4095;32*32*3 |
add ebx,texture_img |
mov [@@tex_off],ebx |
pushad |
mov [@@tex_x1],0 |
mov [@@tex_y1],0 |
mov [@@tex_x3],(32 shl 16) -1;128 |
mov [@@tex_y3],(32 shl 16) -1;128 |
cmp eax,0 |
je nez |
mov [@@tex_x2],0 |
mov [@@tex_y2],(32 shl 16) -1 |
jmp isz |
nez: |
mov [@@tex_x2],(32 shl 16) -1 |
mov [@@tex_y2],0 |
isz: |
call textured_triangle |
popad |
; mov [esi+8+24+4],eax |
; add esi,4*10 |
inc [massize] |
no_add: |
add edi,4*4; *9 |
dec ecx |
jnz msloo |
dec [mmcnt] |
jnz ModelRenderLoop |
jmp skip_mdata |
bunker: |
dd 8 ;model points |
dd 10 ;model triagels |
;mpoints: |
dd -105,-105,0, -105,105,0, 105,105,0, 105,-105,0 |
dd -70,-70,-50, -70,70,-50, 70,70,-50, 70,-70,-50 |
; 4-------7 Points structure |
; |\0---3/| |
; | | | | |
; | | | | |
; |/1---2\| |
; 5-------6 |
;pointslink: |
;dd 0,1,2, -3, 0,3,2, 3 ;far side |
dd 4,0,1, -5, 4,5,1, 5 ;left side |
dd 6,2,3, -5, 6,7,3, 5 ;right side |
dd 4,0,3, -5, 4,7,3, 5 ;up side |
dd 5,1,2, -5, 5,6,2, 5 ;down side |
dd 4,5,6, -6, 4,7,6, 6 ;far side |
;model 2 outpost |
outpost: |
dd 8 ;model points |
dd 10 ;model triagels |
;mpoints: |
dd -45,-45,0, -45,45,0, 45,45,0, 45,-45,0 |
dd -30,-30,-20, -30,30,-20, 30,30,-20, 30,-30,-20 |
;pointslink: |
;dd 0,1,2, -3, 0,3,2, 3 ;far side |
dd 4,0,1, -8, 4,5,1, 8 ;left side |
dd 6,2,3, -8, 6,7,3, 8 ;right side |
dd 4,0,3, -8, 4,7,3, 8 ;up side |
dd 5,1,2, -8, 5,6,2, 8 ;down side |
dd 4,5,6, -7, 4,7,6, 7 ;near side |
;model 3 cannon |
cannon: |
dd 12 ;model points |
dd 12 ;model triagels |
;mpoints: |
dd -10,-20,0, -10,20,0, 10,20,0, 10,-20,0 |
dd -10,-10,-15, -10,10,-15, 10,10,-15, 10,-10,-15 |
dd -2,15,-8, 2,15,-8, -2,45,-8, 2,45,-8 |
;pointslink: |
;dd 0,1,2, -3, 0,3,2, 3 ;far side |
dd 4,0,1, -10, 4,5,1, 10 ;left side |
dd 6,2,3, -10, 6,7,3, 10 ;right side |
dd 4,0,3, -10, 4,7,3, 10 ;up side |
dd 5,1,2, -10, 5,6,2, 10 ;down side |
dd 4,5,6, -11, 4,7,6, 11 ;near side |
dd 8,9,10,-10, 9,10,11,10 ;cannon 1 |
;model 4 red flag |
red_flag: |
dd 12 ;model points |
dd 6*2 ;model triagels |
;mpoints: |
dd -1,-1,0, -1,1,0, 1,1,0, 1,-1,0 |
dd -1,-1,-30, -1,1,-30, 1,1,-30, 1,-1,-30 |
dd 1,1,-30, 10,1,-30, 10,1,-20, 1,1,-20 |
;pointslink: |
dd 4,0,1, -10, 4,5,1, 15 ;left side |
dd 6,2,3, -10, 6,7,3, 15 ;right side |
dd 4,0,3, -10, 4,7,3, 15 ;up side |
dd 5,1,2, -10, 5,6,2, 15 ;down side |
dd 4,5,6, -10, 4,7,6, 15 ;near side |
dd 8,11,10,-49, 8,9,10,49 ;flag |
repear: |
dd 8 ;model points |
dd 10 ;model triagels |
;mpoints: |
dd -45,-45,0, -45,45,0, 45,45,0, 45,-45,0 |
dd -30,-30,-20, -30,30,-20, 30,30,-20, 30,-30,-20 |
;pointslink: |
dd 4,0,1, -5, 4,5,1, 5 ;left side |
dd 6,2,3, -5, 6,7,3, 5 ;right side |
dd 4,0,3, -5, 4,7,3, 5 ;up side |
dd 5,1,2, -5, 5,6,2, 5 ;down side |
dd 4,5,6, -3, 4,7,6, 3 ;far side |
;model 5 tree (elka) |
tree: |
dd 16 ;model points |
dd 8*2 ;model triagels |
;mpoints: |
dd -2,-2,0, -2,2,0, 2,2,0, 2,-2,0 |
dd -1,-1,-8, -1,1,-8, 1,1,-8, 1,-1,-8 |
dd -10,-10,-8, -10,10,-8, 10,10,-8, 10,-10,-8 |
dd -1,-1,-40, -1,1,-40, 1,1,-40, 1,-1,-40 |
;pointslink: |
dd 4,0,1, -16, 4,5,1, 16 ;left side |
dd 6,2,3, -16, 6,7,3, 16 ;right side |
dd 4,0,3, -16, 4,7,3, 16 ;up side |
dd 5,1,2, -16, 5,6,2, 16 ;down side |
dd 12,8,9, -14, 12,13,9, 14 ;left side |
dd 14,10,11, -14, 14,15,11, 14 ;right side |
dd 12,8,11, -14, 12,15,11, 14 ;up side |
dd 13,9,10, -14, 13,14,10, 14 ;down side |
;model tank |
tank: |
dd 20 ;model points |
dd 12+10 ;model triagels |
;mpoints: |
dd -10,-20,-10, -10,20,-10, 10,20,-10, 10,-20,-10 |
dd -10,-10,-20, -10,10,-20, 10,10,-20, 10,-10,-20 |
dd -2,15,-15, 2,15,-15, -2,45,-15, 2,45,-15 |
dd -20,-20,0, -20,20,0, 20,20,0, 20,-20,0 |
dd -20,-30,-10, -20,30,-10, 20,30,-10, 20,-30,-10 |
;pointslink: |
;dd 0,1,2, -3, 0,3,2, 3 ;far side |
dd 4,0,1, -10, 4,5,1, 10 ;left side |
dd 6,2,3, -10, 6,7,3, 10 ;right side |
dd 4,0,3, -10, 4,7,3, 10 ;up side |
dd 5,1,2, -10, 5,6,2, 10 ;down side |
dd 4,5,6, -11, 4,7,6, 11 ;near side |
dd 8,9,10,-10, 9,10,11,10 ;cannon 1 |
dd 16,12,13, -11, 16,17,13, 11 ;left side |
dd 18,14,15, -11, 18,19,15, 11 ;right side |
dd 16,12,15, -11, 16,19,15, 11 ;up side |
dd 17,13,14, -11, 17,18,14, 11 ;down side |
dd 16,17,18, -11, 16,19,18, 11 ;near side |
;Test model |
gqfa: ;Good quality four angle |
dd 5 ;model points |
dd 4 ;model triagels |
;mpoints: |
;dd -45,-145,0, -45,145,0, 45,45,0, 45,-45,0 |
dd -0,-105,0, -0,105,0, 45,45,0, 45,-45,0 |
dd 30,0,0 |
;pointslink: |
dd 1,4,0, 50 ;left side |
dd 1,4,2, 51 ;right side |
dd 3,4,2, -50 ;up side |
dd 3,4,0, -51 ;down side |
skip_mdata: |
;*************** |
; Add new models |
;*************** |
; jmp no_addmodel |
random 20,eax |
sub eax,10 |
imul eax,SECTOR_SIZE |
add eax,SECTOR_SIZE/2 |
mov [temp1],eax |
random 20,eax |
sub eax,10 |
imul eax,SECTOR_SIZE |
add eax,SECTOR_SIZE/2 |
mov [temp2],eax |
mov eax,dword [model_mas] |
cmp eax,40;00 |
jae no_addmodel |
imul eax,4*8; |
add eax,4+model_mas |
inc dword [model_mas] |
mov ebx,[temp1] |
mov [eax],ebx |
mov ebx,[temp2] |
mov [eax+4],ebx |
mov [eax+8],dword -170 |
mov ebx,0 |
mov [eax+12],ebx |
mov [eax+16],ebx |
mov [eax+20],ebx |
mov ebx,tree;red_flag |
mov [eax+28],ebx |
jmp skip_mdata ;use for auto filling at start |
no_addmodel: |
ret |
UpdateAngles: |
; Calculates new x,y,z angles |
; to autorotate around |
mov eax,[Xangle] ; Load current angles |
mov ebx,[Yangle] |
mov ecx,[Zangle] |
add eax,[DeltaX] ; Add velocity |
and eax,011111111b ; Range from 0..255 |
mov [Xangle],eax ; Update X |
add ebx,[DeltaY] ; Add velocity |
and ebx,011111111b ; Range from 0..255 |
mov [Yangle],ebx ; Update Y |
add ecx,[DeltaZ] ; Add velocity |
and ecx,011111111b ; Range from 0..255 |
mov [Zangle],ecx ; Update Z |
ret |
GetSinCos: |
; Needed : bx=angle (0..255) |
; Returns: ax=Sin bx=Cos |
push ebx ; Save angle (use as pointer) |
shl ebx,2 ; Grab a word so bx=bx*2 |
mov eax,[SinCos + ebx] ; Get sine |
pop ebx ; Restore pointer into bx |
push eax ; Save sine on stack |
add ebx,64 ; Add 64 to get cosine |
and ebx,11111111b ; Range from 0..255 |
shl ebx,2 ; *2 coz it's a word |
mov eax,[SinCos + ebx] ; Get cosine |
mov ebx,eax ; Save it bx=Cos |
pop eax ; Restore ax=Sin |
ret |
; Get sin & cos of x,y,z angle |
SetRotation: |
mov ebx,[Xangle] ; Grab angle |
call GetSinCos ; Get the sine&cosine |
mov [Xsin],eax ; Save sin |
mov [Xcos],ebx ; Save cos |
mov ebx,[Yangle] |
call GetSinCos |
mov [Ysin],eax |
mov [Ycos],ebx |
mov ebx,[Zangle] |
call GetSinCos |
mov [Zsin],eax |
mov [Zcos],ebx |
; for camera |
mov ebx,[Xcamangle] |
call GetSinCos |
mov [Xcamsin],eax |
mov [Xcamcos],ebx |
mov ebx,[Ycamangle] |
call GetSinCos |
mov [Ycamsin],eax |
mov [Ycamcos],ebx |
mov ebx,[Zcamangle] |
call GetSinCos |
mov [Zcamsin],eax |
mov [Zcamcos],ebx |
ret |
TranslatePoint: ; Rotates the point around x,y,z |
; Gets original x,y,z values |
; This can be done elsewhere |
mov esi,[X] |
mov edi,[Y] |
mov ebx,[Zcamcos] |
mov ecx,[Zcamsin] |
call math |
mov [X],esi |
mov [Y],edi |
mov esi,[Y] |
mov edi,[Z] |
mov ebx,[Xcamcos] |
mov ecx,[Xcamsin] |
call math |
mov [Y],esi |
mov [Z],edi |
mov esi,[X] |
mov edi,[Z] |
mov ebx,[Ycamcos] |
mov ecx,[Ycamsin] |
call math |
mov [X],esi |
mov [Z],edi |
mov esi,[Y] |
mov ebx,[Xcos] |
mov edi,[Z] |
mov ecx,[Xsin] |
call math |
mov [Y],esi |
mov [Z],edi |
mov esi,[X] |
mov ebx,[Ycos] |
mov ecx,[Ysin] |
call math |
mov [X],esi |
mov [Z],edi |
mov ebx,[Zcos] |
mov edi,[Y] |
mov ecx,[Zsin] |
call math |
;************* |
; ShowPoint |
;************* |
; Calculates screenposition and |
; plots the point on the screen |
mov eax,[Xoff] ; Xoff*X / Z+Zoff = screen x |
mov ecx,esi |
imul ecx |
mov ebx,[Z] |
add ebx,[Zoff] ; Distance |
cmp ebx,0 |
je notout |
idiv ebx |
add eax,[Mx] ; Center on screen |
mov ebp,eax ;ebp =Xp |
mov eax,[Yoff] ; Yoff*Y / Z+Zoff = screen y |
mov ecx,edi |
imul ecx |
cmp ebx,0 |
je notout |
idiv ebx ;eax =Yp |
add eax,[My] ; Center on screen |
notout: |
ret |
math: |
mov eax,esi |
imul ebx ; ax = X * Cos(zang) |
mov ebp,eax |
mov eax,edi |
imul ecx ; ax = Y * Sin(zang) |
sub ebp,eax ; bp = X * Cos(zang) - Y * Sin(zang) |
sar ebp,8 ; bp = X * Cos(zang) - Y * Sin(zang) / 256 |
mov eax,esi |
mov esi,ebp |
imul ecx ; ax = X * Sin(zang) |
mov ebp,eax |
mov eax,edi |
imul ebx ; ax = Y * Cos(zang) |
add ebp,eax ; bp = X * SIN(zang) + Y * COS(zang) |
sar ebp,8 ; bp = X * SIN(zang) + Y * COS(zang) / 256 |
mov edi,ebp |
ret |
SinCos: |
dd 0,6,13,19,25,31,38,44,50,56 |
dd 62,68,74,80,86,92,98,104,109,115 |
dd 121,126,132,137,142,147,152,157,162,167 |
dd 172,177,181,185,190,194,198,202,206,209 |
dd 213,216,220,223,226,229,231,234,237,239 |
dd 241,243,245,247,248,250,251,252,253,254 |
dd 255,255,256,256,256,256,256,255,255,254 |
dd 253,252,251,250,248,247,245,243,241,239 |
dd 237,234,231,229,226,223,220,216,213,209 |
dd 206,202,198,194,190,185,181,177,172,167 |
dd 162,157,152,147,142,137,132,126,121,115 |
dd 109,104,98,92,86,80,74,68,62,56 |
dd 50,44,38,31,25,19,13,6,0,-6 |
dd -13,-19,-25,-31,-38,-44,-50,-56,-62,-68 |
dd -74,-80,-86,-92,-98,-104,-109,-115,-121,-126 |
dd -132,-137,-142,-147,-152,-157,-162,-167,-172,-177 |
dd -181,-185,-190,-194,-198,-202,-206,-209,-213,-216 |
dd -220,-223,-226,-229,-231,-234,-237,-239,-241,-243 |
dd -245,-247,-248,-250,-251,-252,-253,-254,-255,-255 |
dd -256,-256,-256,-256,-256,-255,-255,-254,-253,-252 |
dd -251,-250,-248,-247,-245,-243,-241,-239,-237,-234 |
dd -231,-229,-226,-223,-220,-216,-213,-209,-206,-202 |
dd -198,-194,-190,-185,-181,-177,-172,-167,-162,-157 |
dd -152,-147,-142,-137,-132,-126,-121,-115,-109,-104 |
dd -98,-92,-86,-80,-74,-68,-62,-56,-50,-44 |
dd -38,-31,-25,-19,-13,-6 |
mipzoom dd 0 |
mipmapwork dd 0 |
temp1 dd 0 |
temp2 dd 0 |
; 4.24.2005 Textured triangle algorythm |
; created by Pavlushin Evgeni waptap[at]mail.ru |
; on base tex3 from Mikolaj Felix mfelix@polbox.com |
align 512 |
@@tx1 dd 0 ;equ [bp+4] |
@@ty1 dd 0 ;equ [bp+6] |
align 512 |
@@tx2 dd 0 ;equ [bp+8] |
@@ty2 dd 0 ;equ [bp+10] |
align 512 |
@@tx3 dd 0 ;equ [bp+12] |
@@ty3 dd 0 ;equ [bp+14] |
@@tz1 dd 0 |
@@tz2 dd 0 |
@@tz3 dd 0 |
@@z_dy12 dd 0 |
@@z_dy13 dd 0 |
@@z_dy23 dd 0 |
@@tex_off dd 0 ;equ [bp+16] |
@@tex_x1 dd 0 ;equ [bp+18] |
@@tex_y1 dd 0 ;equ [bp+20] |
@@tex_x2 dd 0 ;equ [bp+22] |
@@tex_y2 dd 0 ;equ [bp+24] |
@@tex_x3 dd 0 ;equ [bp+26] |
@@tex_y3 dd 0 ;equ [bp+28] |
@@dx12 dd 0 ;equ [bp-2] |
@@dx13 dd 0 ;equ [bp-4] |
@@dx23 dd 0 ;equ [bp-6] |
@@tex_dx12 dd 0 ;equ [bp-8] |
@@tex_dy12 dd 0 ;equ [bp-10] |
@@tex_dx13 dd 0 ;equ [bp-12] |
@@tex_dy13 dd 0 ;equ [bp-14] |
@@tex_dx23 dd 0 ;equ [bp-16] |
@@tex_dy23 dd 0 ;equ [bp-18] |
@@scan_x1 dd 0 |
@@scan_y1 dd 0 |
@@scan_x2 dd 0 |
@@scan_y2 dd 0 |
@@scan_z1 dd 0 |
@@scan_z2 dd 0 |
SHIFT=16 |
textured_triangle: |
mov eax,[@@ty1] |
cmp eax,[@@ty3] |
jle tt_check1 |
xchg eax,[@@ty3] |
mov [@@ty1],eax |
mov eax,[@@tx1] |
xchg eax,[@@tx3] |
mov [@@tx1],eax |
mov eax,[@@tz1] |
xchg eax,[@@tz3] |
mov [@@tz1],eax |
mov eax,[@@tex_y1] |
xchg eax,[@@tex_y3] |
mov [@@tex_y1],eax |
mov eax,[@@tex_x1] |
xchg eax,[@@tex_x3] |
mov [@@tex_x1],eax |
tt_check1: |
mov eax,[@@ty2] |
cmp eax,[@@ty3] |
jle tt_check2 |
xchg eax,[@@ty3] |
mov [@@ty2],eax |
mov eax,[@@tx2] |
xchg eax,[@@tx3] |
mov [@@tx2],eax |
mov eax,[@@tz2] |
xchg eax,[@@tz3] |
mov [@@tz2],eax |
mov eax,[@@tex_y2] |
xchg eax,[@@tex_y3] |
mov [@@tex_y2],eax |
mov eax,[@@tex_x2] |
xchg eax,[@@tex_x3] |
mov [@@tex_x2],eax |
tt_check2: |
mov eax,[@@ty1] |
cmp eax,[@@ty2] |
jle tt_check3 |
xchg eax,[@@ty2] |
mov [@@ty1],eax |
mov eax,[@@tx1] |
xchg eax,[@@tx2] |
mov [@@tx1],eax |
mov eax,[@@tz1] |
xchg eax,[@@tz2] |
mov [@@tz1],eax |
mov eax,[@@tex_y1] |
xchg eax,[@@tex_y2] |
mov [@@tex_y1],eax |
mov eax,[@@tex_x1] |
xchg eax,[@@tex_x2] |
mov [@@tex_x1],eax |
tt_check3: |
mov ebx,[@@ty2] |
sub ebx,[@@ty1] |
jnz tt_dx12_make |
mov [@@dx12],0 |
mov [@@tex_dx12],0 |
mov [@@tex_dy12],0 |
mov [@@z_dy12],0 |
jmp tt_dx12_done |
tt_dx12_make: |
mov eax,[@@tx2] |
sub eax,[@@tx1] |
shl eax,SHIFT |
cdq |
idiv ebx |
mov [@@dx12],eax ; dx12 = (x2-x1)/(y2-y1) |
mov eax,[@@tex_x2] |
sub eax,[@@tex_x1] |
cdq |
idiv ebx |
mov [@@tex_dx12],eax ; tex_dx12 = (tex_x2-tex_x1)/(y2-y1) |
mov eax,[@@tex_y2] |
sub eax,[@@tex_y1] |
cdq |
idiv ebx |
mov [@@tex_dy12],eax ; tex_dy12 = (tex_y2-tex_y1)/(y2-y1) |
mov eax,[@@tz2] |
sub eax,[@@tz1] |
shl eax,SHIFT |
cdq |
idiv ebx |
mov [@@z_dy12],eax |
tt_dx12_done: |
mov ebx,[@@ty3] |
sub ebx,[@@ty1] |
jnz tt_dx13_make |
mov [@@dx13],0 |
mov [@@tex_dx13],0 |
mov [@@tex_dy13],0 |
mov [@@z_dy13],0 |
jmp tt_dx13_done |
tt_dx13_make: |
mov eax,[@@tx3] |
sub eax,[@@tx1] |
shl eax,SHIFT |
cdq |
idiv ebx |
mov [@@dx13],eax ; dx13 = (x3-x1)/(y3-y1) |
mov eax,[@@tex_x3] |
sub eax,[@@tex_x1] |
cdq |
idiv ebx |
mov [@@tex_dx13],eax ; tex_dx13 = (tex_x3-tex_x1)/(y3-y1) |
mov eax,[@@tex_y3] |
sub eax,[@@tex_y1] |
cdq |
idiv ebx |
mov [@@tex_dy13],eax ; tex_dy13 = (tex_y3-tex_x1)/(y3-y1) |
mov eax,[@@tz3] |
sub eax,[@@tz1] |
shl eax,SHIFT |
cdq |
idiv ebx |
mov [@@z_dy13],eax |
tt_dx13_done: |
mov ebx,[@@ty3] |
sub ebx,[@@ty2] |
jnz tt_dx23_make |
mov [@@dx23],0 |
mov [@@tex_dx23],0 |
mov [@@tex_dy23],0 |
mov [@@z_dy23],0 |
jmp tt_dx23_done |
tt_dx23_make: |
mov eax,[@@tx3] |
sub eax,[@@tx2] |
shl eax,SHIFT |
cdq |
idiv ebx |
mov [@@dx23],eax ; dx23 = (x3-x2)/(y3-y2) |
mov eax,[@@tex_x3] |
sub eax,[@@tex_x2] |
cdq |
idiv ebx |
mov [@@tex_dx23],eax ; tex_dx23 = (tex_x3-tex_x2)/(y3-y2) |
mov eax,[@@tex_y3] |
sub eax,[@@tex_y2] |
cdq |
idiv ebx |
mov [@@tex_dy23],eax ; tex_dy23 = (tex_y3-tex_y2)/(y3-y2) |
mov eax,[@@tz3] |
sub eax,[@@tz2] |
shl eax,SHIFT |
cdq |
idiv ebx |
mov [@@z_dy23],eax |
tt_dx23_done: |
mov eax,[@@tx1] |
shl eax,SHIFT |
mov ebx,eax |
mov ecx,[@@ty1] |
mov edx,[@@tz1] |
shl edx,SHIFT |
mov [@@scan_z1],edx |
mov [@@scan_z2],edx |
mov edx,[@@tex_x1] |
mov [@@scan_x1],edx |
mov [@@scan_x2],edx |
mov edx,[@@tex_y1] |
mov [@@scan_y1],edx |
mov [@@scan_y2],edx |
; **************** |
mov edx,[@@ty1] ;skip equals |
cmp [@@ty2],edx |
je tt_loop1_end |
mov ebp,[@@ty1] |
cmp ebp,0 |
jg no_up_clip |
neg ebp |
mov edx,[@@ty2] |
cmp edx,0 |
jg no_sbx |
neg edx |
sub ebp,edx |
no_sbx: |
mov edx,[@@tex_dx13] |
imul edx,ebp |
add [@@scan_x1],edx |
mov edx,[@@tex_dx12] |
imul edx,ebp |
add [@@scan_x2],edx |
mov edx,[@@tex_dy13] |
imul edx,ebp |
add [@@scan_y1],edx |
mov edx,[@@tex_dy12] |
imul edx,ebp |
add [@@scan_y2],edx |
mov edx,[@@z_dy13] |
imul edx,ebp |
add [@@scan_z1],edx |
mov edx,[@@z_dy12] |
imul edx,ebp |
add [@@scan_z2],edx |
mov edx,[@@dx13] |
imul edx,ebp |
add eax,edx |
mov edx,[@@dx12] |
imul edx,ebp |
add ebx,edx |
add ecx,ebp |
no_up_clip: |
cmp [@@ty2],0 |
jl tt_loop1_end |
tt_loop1: |
cmp ecx,SCREEN_Y |
jge tt_loop2_end |
pushad |
mov edx,[@@scan_y2] |
mov [@@tex_ly2],edx ;push dx |
mov edx,[@@scan_x2] |
mov [@@tex_lx2],edx ;push dx |
mov edx,[@@scan_y1] |
mov [@@tex_ly1],edx ;push dx |
mov edx,[@@scan_x1] |
mov [@@tex_lx1],edx ;push dx |
mov edx,[@@scan_z1] |
mov [@@lz1],edx |
mov edx,[@@scan_z2] |
mov [@@lz2],edx |
mov [@@ly],ecx ;push cx |
mov edx,ebx |
sar edx,SHIFT |
mov [@@lx2],edx ;push dx |
mov edx,eax |
sar edx,SHIFT |
mov [@@lx1],edx ; push dx |
call textured_horizontal_line |
popad |
mov edx,[@@tex_dx13] |
add [@@scan_x1],edx |
mov edx,[@@tex_dx12] |
add [@@scan_x2],edx |
mov edx,[@@tex_dy13] |
add [@@scan_y1],edx |
mov edx,[@@tex_dy12] |
add [@@scan_y2],edx |
mov edx,[@@z_dy13] |
add [@@scan_z1],edx |
mov edx,[@@z_dy12] |
add [@@scan_z2],edx |
add eax,[@@dx13] |
add ebx,[@@dx12] |
inc ecx |
cmp ecx,[@@ty2] |
jl tt_loop1 |
tt_loop1_end: |
mov ebx,[@@tx2] |
shl ebx,SHIFT |
mov ecx,[@@ty2] |
mov edx,[@@tz2] |
shl edx,SHIFT |
mov [@@scan_z2],edx |
mov edx,[@@tex_x2] |
mov [@@scan_x2],edx |
mov edx,[@@tex_y2] |
mov [@@scan_y2],edx |
mov ebp,[@@ty2] |
cmp ebp,0 |
jg no_down_clip |
neg ebp |
dec ebp |
mov edx,[@@tex_dx13] |
imul edx,ebp |
add [@@scan_x1],edx |
mov edx,[@@tex_dx23] |
imul edx,ebp |
add [@@scan_x2],edx |
mov edx,[@@tex_dy13] |
imul edx,ebp |
add [@@scan_y1],edx |
mov edx,[@@tex_dy23] |
imul edx,ebp |
add [@@scan_y2],edx |
mov edx,[@@z_dy13] |
imul edx,ebp |
add [@@scan_z1],edx |
mov edx,[@@z_dy23] |
imul edx,ebp |
add [@@scan_z2],edx |
mov edx,[@@dx13] |
imul edx,ebp |
add eax,edx |
mov edx,[@@dx23] |
imul edx,ebp |
add ebx,edx |
add ecx,ebp |
no_down_clip: |
tt_loop2: |
cmp ecx,SCREEN_Y |
jge tt_loop2_end |
pushad |
mov edx,[@@scan_y2] |
mov [@@tex_ly2],edx ;push dx |
mov edx,[@@scan_x2] |
mov [@@tex_lx2],edx ;push dx |
mov edx,[@@scan_y1] |
mov [@@tex_ly1],edx ;push dx |
mov edx,[@@scan_x1] |
mov [@@tex_lx1],edx ;push dx |
mov edx,[@@scan_z1] |
mov [@@lz1],edx |
mov edx,[@@scan_z2] |
mov [@@lz2],edx |
mov [@@ly],ecx ;push cx |
mov edx,ebx |
sar edx,SHIFT |
mov [@@lx2],edx ;push dx |
mov edx,eax |
sar edx,SHIFT |
mov [@@lx1],edx ; push dx |
call textured_horizontal_line |
popad |
mov edx,[@@tex_dx13] |
add [@@scan_x1],edx |
mov edx,[@@tex_dx23] |
add [@@scan_x2],edx |
mov edx,[@@tex_dy13] |
add [@@scan_y1],edx |
mov edx,[@@tex_dy23] |
add [@@scan_y2],edx |
mov edx,[@@z_dy13] |
add [@@scan_z1],edx |
mov edx,[@@z_dy23] |
add [@@scan_z2],edx |
add eax,[@@dx13] |
add ebx,[@@dx23] |
inc ecx |
cmp ecx,[@@ty3] |
jl tt_loop2 |
tt_loop2_end: |
ret |
align 512 |
@@lx1 dd 0 |
align 512 |
@@lx2 dd 0 |
align 512 |
@@ly dd 0 |
@@lz1 dd 0 |
@@lz2 dd 0 |
@@z_dx dd 0 |
align 512 |
@@tex_loff dd 0 ;equ [bp+10] |
@@tex_lx1 dd 0 ;equ [bp+12] |
@@tex_ly1 dd 0 ;equ [bp+14] |
@@tex_lx2 dd 0 ;equ [bp+16] |
@@tex_ly2 dd 0 ;equ [bp+18] |
align 512 |
@@tex_ldx dd 0 ;equ [bp-2] |
@@tex_ldy dd 0 ;equ [bp-4] |
align 1024 |
textured_horizontal_line: |
mov eax,[@@lx1] |
cmp eax,[@@lx2] |
je thl_quit |
jl thl_ok |
xchg eax,[@@lx2] |
mov [@@lx1],eax |
mov eax,[@@lz1] |
xchg eax,[@@lz2] |
mov [@@lz1],eax |
mov eax,[@@tex_lx1] |
xchg eax,[@@tex_lx2] |
mov [@@tex_lx1],eax |
mov eax,[@@tex_ly1] |
xchg eax,[@@tex_ly2] |
mov [@@tex_ly1],eax |
thl_ok: |
cmp [@@lx2],0 |
jle thl_quit |
mov eax,SCREEN_X |
cmp [@@lx1],eax |
jge thl_quit |
mov ecx,[@@lx2] |
sub ecx,[@@lx1] |
; Uneversal method |
mov edi,[@@ly] |
mov eax,SCREEN_X ;di = ly*320+lx1 |
imul edi |
add eax,[@@lx1] |
imul eax,3 |
mov edi,eax |
add edi,I_END |
;Right side clipping |
mov eax,SCREEN_X |
cmp [@@lx2],eax |
jnge x1ok |
mov edx,SCREEN_X |
dec edx |
sub edx,[@@lx1] |
cmp edx,0 |
jle thl_quit |
mov ecx,edx |
x1ok: |
;Left side clipping |
cmp [@@lx1],0 |
jg x2ok |
mov ecx,[@@lx2] ;cmp lx2 screen x if above cut (for future) |
mov edi,[@@ly] |
mov eax,SCREEN_X |
imul edi,eax |
imul edi,3 |
add edi,I_END |
x2ok: |
mov ebx,[@@lx2] |
sub ebx,[@@lx1] |
mov eax,[@@tex_lx2] |
sub eax,[@@tex_lx1] |
cdq |
idiv ebx |
mov [@@tex_ldx],eax ; tex_dx = (tex_x2-tex_x1)/(x2-x1) |
mov eax,[@@tex_ly2] |
sub eax,[@@tex_ly1] |
cdq |
idiv ebx |
mov [@@tex_ldy],eax ; tex_dy = (tex_y2-tex_y1)/(x2-x1) |
mov eax,[@@lz2] |
sub eax,[@@lz1] |
cdq |
idiv ebx |
mov [@@z_dx],eax ; tex_dx = (tex_x2-tex_x1)/(x2-x1) |
; Left clipping post correction |
cmp [@@lx1],0 |
jg no_lcpc |
mov eax,[@@lx1] |
neg eax |
mov ebp,[@@tex_ldx] |
imul ebp,eax |
add [@@tex_lx1],ebp |
mov ebp,[@@tex_ldy] |
imul ebp,eax |
add [@@tex_ly1],ebp |
mov ebp,[@@z_dx] |
imul ebp,eax |
add [@@lz1],ebp |
no_lcpc: |
inc ecx ;for equal correction |
mov edx,[@@tex_lx1] |
mov ebx,[@@tex_ly1] |
mov esi,[@@lz1] |
thl_loop: |
mov ebp,esi |
shr ebp,SHIFT |
mov eax,dword [edi-I_END+zbuffer] |
cmp ax,bp |
jb no_set |
mov [edi-I_END+zbuffer],bp |
mov eax,edx |
; and eax,0x0fff0000 |
ror ebx,16 |
mov ax,bx |
ror ebx,16 |
shl ax,11 ; 8 for 256*256, 9 for 128*128 ... |
shr eax,11 |
lea eax,[eax*2+eax] ; equ imul eax,3 |
add eax,[@@tex_off] |
mov ebp,eax |
mov ax,word [ebp] |
mov [edi],ax |
mov al,byte [ebp+2] |
mov [edi+2],al |
no_set: |
add edi,3 |
add esi,[@@z_dx] |
add edx,[@@tex_ldx] |
add ebx,[@@tex_ldy] |
dec ecx |
jnz thl_loop |
thl_quit: |
ret |
@@rgb dd 0 |
@@rgbax dw 0 |
@@rgbbl db 0 |
; === DATA === |
d_angle dd 0.19634954 ;pi/16 |
angle dd 0.0 |
mul_wave dd 1.5 |
sin_pos dw 0 |
sinwave rw 256 |
Xmap dd 0 |
Ymap dd 0 |
mapoff dd 0 |
Xcam dd 0 |
Ycam dd 0 |
Zcam dd -400 |
Xcamangle dd 0 |
Ycamangle dd 0 |
Zcamangle dd 0 |
Xcamsin dd 0 |
Xcamcos dd 0 |
Ycamsin dd 0 |
Ycamcos dd 0 |
Zcamsin dd 0 |
Zcamcos dd 0 |
X dd ? ; X,Y,Z variable for formula |
Y dd ? |
Z dd ? |
Xp dd ? |
Yp dd ? |
Xangle dd 0 ; Angle to rotate around x |
Yangle dd 0 |
Zangle dd 0 |
DeltaX dd 1 ; x,y,z rotation angle |
DeltaY dd 1 |
DeltaZ dd 1 |
Xoff dd 256 ; x-cord |
Yoff dd 256 ; y-cord |
Zoff dd 0;800 ; Distance from viewer |
Xsin dd ? ; Sine and cosine of angle to rotate around |
Xcos dd ? |
Ysin dd ? |
Ycos dd ? |
Zsin dd ? |
Zcos dd ? |
Mx dd SCREEN_X/2 ; Center of the screen |
My dd SCREEN_Y/2 |
autorot db 0 ;Auto rotation flag |
massize dd 0 ;Size of triangle massive |
id dd 0 |
temp dd 0 |
; DATA AREA |
labelt: |
db '3D TEXTURED ENGINE' |
labellen: |
;Texture pusck 32*32 256 |
texpack_gif: |
file 'TEXPACK.gif' |
rb 50 |
;Ground texture |
bmp_texmap: |
file 'TEXMAP.bmp' |
rb 50 |
; Ground livel map |
gif_file_area5: |
file 'MAP.gif' ;level map |
rb 50 |
rb 8 |
texture_limg: |
rb 4095 |
texture_img: |
rb 4095 |
texture_img2: |
rb 4095 |
rb (4095)*16*16 |
img_area: |
rb 128*128*3+8 |
glm_img_area: |
rb (MAP_XSIZE+1)*(MAP_YSIZE+1)*3+8 |
rb 8 |
texpack_img: |
rb 512*512*3+8 |
keymap: |
rb 1000 |
model_mas: |
rb 4+8*100 |
; Hash area for decoding GIF |
gif_hash_area: |
rd 4096+1 |
MAX_MODEL_POINTS = 100 |
modelpoints: |
rb MAX_MODEL_POINTS*3*4 |
; Matrix points massive |
points: |
; Massive of turn matrix points |
tpoints=points+((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)*3*4) |
; Ground level map massive |
ground_level_map=tpoints+((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)*3*4) |
; zbuffer |
zbuffer=ground_level_map+((MAP_XSIZE+1)*(MAP_YSIZE+1)*4) |
I_END=zbuffer+(SCREEN_X*SCREEN_Y)*3 |
/programs/3detx60b/trunk/ascgl.inc |
---|
0,0 → 1,1385 |
lang equ ru |
; |
; Assembler |
; SMALL |
; CODE |
; Graphics |
; Libary |
; |
; Ver 0.18 By Pavlushin Evgeni (RUSSIA) |
; www.waptap@mail.ru |
;InfoList |
;0.01 LoadImage |
;0.02 SetBmp |
;0.03 Bmptoimg, Setimg ~01.03.2004 |
;0.04 Bug deleted, copyimg ~03.05.2004 |
;0.05 fullimg, collimg ~05.05.2004 |
;0.06 getimg ~09.05.2004 |
;0.07 convbmp ~13.05.2004 |
;0.08 fps ~14.05.2004 |
;0.09 drawfbox ~03.06.2004 |
;0.10 all macros optimized by Halyavin A., add at ~07.06.2004 |
;0.11 many macros optimized by Halyavin A., add at ~30.08.2004 |
;0.12 bmptoimg ~07.09.2004 |
;0.13 imgtoimg ~08.09.2004 |
;0.14 imgtoimg modify not brake bmp pict! ~09.09.2004 |
;0.15 giftoimg, giftoani ~10.09.2004 |
;0.16 setframe, rgbtobgr, setbmp deleted ~20.09.2004 |
;0.17 modification giftoimg, giftoani, getframeoff ~01.10.2004 |
;0.18 aframetoimg,aimgtoimg,frametoimg ~03.10.2004 |
aframetoimg_use_count=0 |
macro aframetoimg img, x, y, canvas,acol |
{ |
local loo,loo2,acolor |
aframetoimg_use_count=aframetoimg_use_count+1 |
if aframetoimg_use_count = 1 |
jmp end_aframetoimg_proc |
acolor dd 0 |
aframetoimg_proc: |
;getout coord |
mov [acolor],ebp |
mov edx,ebx ;img ;xsize |
movzx eax,word [edx] |
add eax,esi ;y cor |
; mov eax,esi ;y cor |
mul dword [ecx] ;canvas xsize |
add eax,edi ;x cor |
mov ebp,ebx ;img ;xsize |
movzx edx,word [ebp] |
add eax,edx |
mov ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,ecx ;canvas+8;start |
add ebp,8 |
;get img size |
add ebx,4 |
mov eax,ebx ;img ;xsize |
movzx esi,word [eax] |
movzx edi,word [eax+2] |
add ebx,4 |
mov edx,ebx ;img+8 |
loo2: |
push esi |
loo: |
;test on alpha color |
mov eax,[edx] |
shl eax,8 |
shr eax,8 |
cmp eax,[acolor] |
jne yx |
add edx,3 |
add ebp,3 |
jmp nx |
yx: |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
nx: |
dec esi |
jnz loo |
pop esi |
sub ebp,3 |
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) |
sub eax,esi |
add ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,3 |
dec edi |
jnz loo2 |
ret |
end_aframetoimg_proc: |
end if |
push img |
push canvas |
push x |
push y |
push acol |
pop ebp |
pop esi |
pop edi |
pop ecx |
pop ebx |
call aframetoimg_proc |
} |
frametoimg_use_count=0 |
macro frametoimg img, x, y, canvas |
{ |
local loo,loo2 |
frametoimg_use_count=frametoimg_use_count+1 |
if frametoimg_use_count = 1 |
jmp end_frametoimg_proc |
frametoimg_proc: |
;getout coord |
mov edx,ebx ;img ;xsize |
movzx eax,word [edx] |
add eax,esi ;y cor |
; mov eax,esi ;y cor |
mul dword [ecx] ;canvas xsize |
add eax,edi ;x cor |
mov ebp,ebx ;img ;xsize |
movzx edx,word [ebp] |
add eax,edx |
mov ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,ecx ;canvas+8;start |
add ebp,8 |
;get img size |
add ebx,4 |
mov eax,ebx ;img ;xsize |
movzx esi,word [eax] |
movzx edi,word [eax+2] |
add ebx,4 |
mov edx,ebx ;img+8 |
loo2: |
push esi |
loo: |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
dec esi |
jnz loo |
pop esi |
sub ebp,3 |
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) |
sub eax,esi |
add ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,3 |
dec edi |
jnz loo2 |
ret |
end_frametoimg_proc: |
end if |
push img |
push canvas |
push x |
push y |
pop esi |
pop edi |
pop ecx |
pop ebx |
call frametoimg_proc |
} |
aimgtoimg_use_count=0 |
macro aimgtoimg img, x, y, canvas,acol |
{ |
local loo,loo2,acolor |
aimgtoimg_use_count=aimgtoimg_use_count+1 |
if aimgtoimg_use_count = 1 |
jmp end_aimgtoimg_proc |
acolor dd 0 |
aimgtoimg_proc: |
;getout coord |
mov [acolor],ebp |
mov eax,esi ;y cor |
mul dword [ecx] ;canvas xsize |
add eax,edi ;x cor |
mov ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,ecx ;canvas+8;start |
add ebp,8 |
;get img size |
mov eax,ebx ;img ;xsize |
mov esi,[eax] |
add ebx,4 |
mov eax,ebx ; img+4 ;ysize |
mov edi,[eax] |
add ebx,4 |
mov edx,ebx ;img+8 |
loo2: |
push esi |
loo: |
;test on alpha color |
mov eax,[edx] |
shl eax,8 |
shr eax,8 |
cmp eax,[acolor] |
jne yx |
add edx,3 |
add ebp,3 |
jmp nx |
yx: |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
nx: |
dec esi |
jnz loo |
pop esi |
sub ebp,3 |
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) |
sub eax,esi |
add ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,3 |
dec edi |
jnz loo2 |
ret |
end_aimgtoimg_proc: |
end if |
push img |
push canvas |
push x |
push y |
push acol |
pop ebp |
pop esi |
pop edi |
pop ecx |
pop ebx |
call aimgtoimg_proc |
} |
imgtoimg_use_count=0 |
macro imgtoimg img, x, y, canvas |
{ |
local loo,loo2 |
imgtoimg_use_count=imgtoimg_use_count+1 |
if imgtoimg_use_count = 1 |
jmp end_imgtoimg_proc |
imgtoimg_proc: |
;getout coord |
mov eax,esi ;y cor |
mul dword [ecx] ;canvas xsize |
add eax,edi ;x cor |
mov ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,ecx ;canvas+8;start |
add ebp,8 |
;get img size |
mov eax,ebx ;img ;xsize |
mov esi,[eax] |
add ebx,4 |
mov eax,ebx ; img+4 ;ysize |
mov edi,[eax] |
add ebx,4 |
mov edx,ebx ;img+8 |
loo2: |
push esi |
loo: |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
dec esi |
jnz loo |
pop esi |
sub ebp,3 |
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) |
sub eax,esi |
add ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,3 |
dec edi |
jnz loo2 |
ret |
end_imgtoimg_proc: |
end if |
push img |
push canvas |
push x |
push y |
pop esi |
pop edi |
pop ecx |
pop ebx |
call imgtoimg_proc |
} |
;DrawBox |
macro drawfbox x,y,xs,ys,color |
{ |
words2reg ebx,x,xs ;x*65536+xs |
words2reg ecx,y,ys ;y*65536+ys |
mov edx,color |
mov eax,13 |
int 0x40 |
} |
; FPS - Set Frame Per Second Display |
fps_show_frequency=40 |
macro fps x,y,color,delcolor |
{ |
local spdat,savetime,new_time,fps,fps_cntr,out_fps,new_time,ttt |
local no_out_fps |
jmp spdat |
savetime dd 0 |
fps_cntr dd 0 |
fps dd 0 |
ttt dd 0 |
spdat: |
get_time: |
mov eax,3 |
int 0x40 |
cmp eax,[savetime] |
jne new_time |
inc [fps_cntr] |
cmp dword [ttt],0 |
je out_fps |
dec dword [ttt] |
jmp no_out_fps |
new_time: |
mov [savetime],eax |
mov ebx,[fps_cntr] |
mov [fps],ebx |
mov [fps_cntr],0 |
out_fps: |
if ~(delcolor eq ) |
mov ebx,x*65536+36 |
mov ecx,y*65536+7 |
mov edx,delcolor |
mov eax,13 |
int 0x40 |
end if |
mov dword [ttt],fps_show_frequency |
mov eax,47 |
mov ebx,6*65536 |
; mov bl,0 |
mov edx,x*65536+y |
mov esi,color |
mov ecx,[fps] |
int 0x40 |
no_out_fps: |
} |
; COLLIMG - Collusion image's |
_1dbounce_count=0; |
macro collimg img1_off,x1,y1,img2_off,x2,y2,otv |
{ |
local bounce,exit,anot,bc,nbc |
mov esi,[img1_off] ;xs1 |
mov edi,[img2_off] ;ys2 |
mov eax,x1 ; |
mov ebx,x2 ; |
call _1dbounce |
mov edx,ecx |
mov esi,[img1_off+4] ;ys1 |
mov edi,[img2_off+4] ;ys2 |
mov eax,y1 ; |
mov ebx,y2 ; |
call _1dbounce |
add edx,ecx |
cmp edx,2 |
je bounce |
mov otv,0 |
jmp exit |
_1dbounce_count=_1dbounce_count+1 |
if _1dbounce_count = 1 |
_1dbounce: |
cmp ebx,eax |
jb anot |
add eax,esi |
cmp eax,ebx |
jbe nbc |
bc: |
mov ecx,1 |
ret |
anot: |
add ebx,edi |
cmp ebx,eax |
ja bc |
nbc: |
xor ecx,ecx |
ret |
end if |
bounce: |
mov otv,1 |
exit: |
} |
macro rgbtobgr image |
{ |
local loo |
mov eax,[image] |
mul dword [image+4] |
mov ecx,eax |
mov esi,image+8 |
; add esi,8 |
loo: |
mov al,[esi] |
mov bl,[esi+2] |
mov [esi],bl |
mov [esi+2],al |
add esi,3 |
dec ecx |
jnz loo |
} |
macro setimg x , y ,arg3 |
{ |
mov eax,7 |
mov ebx,arg3 |
add ebx,8 |
mov cx,[arg3] |
shl ecx,16 |
add cx,[arg3+4] |
; wordstoreg ecx,[arg3],[arg3+4] |
words2reg edx, x , y ;arg1*65536+arg2 |
int 0x40 |
} |
macro setframe x , y ,arg3 |
{ |
mov eax,7 |
mov ebx,arg3 |
add ebx,8 |
words2reg edx, x , y ;arg1*65536+arg2 |
add edx,dword [arg3] |
mov ecx,dword [arg3+4] |
int 0x40 |
} |
macro getimg imgsrc,x,y,xs,ys,imgdest |
{ |
local cyc |
if xs eqtype 0 |
mov dword [imgdest],xs |
else |
mov eax,xs |
mov dword [imgdest],eax |
end if |
if ys eqtype 0 |
mov dword [imgdest+4],ys |
else |
mov eax,ys |
mov dword [imgdest+4],eax |
end if |
mov eax,dword [imgsrc] ;getx size |
; lea ecx,[eax+2*eax] |
mov ecx,eax |
shl ecx,1 |
add ecx,eax |
mov ebx,y |
mul ebx |
add eax,x |
mov edx,ecx |
lea eax,[eax+2*eax] ;eax=offset on imsrc |
; mov ebp,eax |
; shl eax,1 |
; add eax,ebp |
mov ecx,xs |
mov ebx,ys |
mov edi,8+imgdest |
lea esi,[eax+8+imgsrc] |
; mov esi,eax |
; add esi,8 |
; add esi,imgsrc |
cld |
cyc: |
movsw |
movsb |
dec ecx |
jne cyc |
add esi,edx |
mov ecx,xs |
sub esi,ecx |
sub esi,ecx |
sub esi,ecx |
dec ebx |
jne cyc |
} |
macro copyimg img2_off,img1_off |
{ |
mov eax,dword [img1_off] |
mov ebx,dword [img1_off+4] |
mul ebx |
lea ecx,[eax+2*eax] |
lea esi,[img1_off+8] |
lea edi,[img2_off+8] |
cld |
rep movsb |
} |
macro fullimg img_off,xs,ys,color |
{ |
local cop |
mov eax,xs |
mov ebx,ys |
mov dword [img_off],eax |
mov dword [img_off+4],ebx |
mul ebx |
lea ebp,[eax+2*eax] |
mov esi,color |
if color eqtype 0 |
mov ecx,color/65536 |
else |
mov ecx,esi |
shr ecx,16 |
end if |
xor edi,edi |
cop: |
mov word [img_off+8+edi],si |
add edi,2 |
mov byte [img_off+8+edi],cl |
inc edi |
cmp edi,ebp |
jne cop |
} |
; number of frame in ecx |
; callculatin offset of raw data |
macro getframeoff num_of_frame,offset_of_animation,offset_of_frame |
{ |
local loo,setpic |
mov ebp,num_of_frame ;ecx |
mov esi,offset_of_animation;Image |
loo: |
cmp ebp,0 |
je setpic |
movzx eax,word [esi+4] |
movzx ebx,word [esi+6] |
mul ebx ;dword [esi+4] |
mov ebx,3 |
mul ebx |
add eax,8 |
add esi,eax |
dec ebp |
jmp loo |
setpic: |
mov dword offset_of_frame,esi |
} |
; BMPTOIMG -Convert BMP format TO IMG format |
; (SYNTAX) BMPTOIMG BMP_source_offset,IMG_dest_ofset |
; (SAMPLE) View BMPLS.ASM sample. |
; ( NOTE ) This is macros is not brake bmp structure! Tested in 32,8,4 bits |
bmptoimg_data_area_count=0 |
macro bmptoimg bmp_load_area,img_dest_area |
{ |
local fileinfo,string,end_bmp,nodix |
local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2 |
local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize |
;local qwe,bmpfn |
; convert: |
movzx eax,word [bmp_load_area+28] |
mul dword [bmp_load_area+18] |
add eax,31 |
shr eax,5 |
mov dword [bmptoimg_data_area_dwps],eax ;dwps-doublewords per string |
shl eax,2 |
mov dword [bmptoimg_data_area_bps],eax ;bps-bytes per string |
cmp dword [bmp_load_area+34],0 |
jne yespicsize ;if picture size is defined |
mul dword [bmp_load_area+22] |
mov dword [bmp_load_area+34],eax |
yespicsize: |
mov ebp,img_dest_area+8 |
mov eax,bmp_load_area |
mov ebx,eax |
add ebx, [bmp_load_area+2];file size |
inc ebx |
mov dword [bmptoimg_soi],ebx ;soi-start of image area for drawing |
add eax, [bmp_load_area+10] |
mov dword [bmptoimg_data_area_sop],eax ;sop-start of picture in file |
add eax, [bmp_load_area+34] |
mov dword [bmptoimg_data_area_eop],eax ;eop-end of picture in file |
mov eax, [bmp_load_area+18] |
lea eax,[eax+2*eax] ;3x pixels in eax |
mov edi,dword [bmptoimg_soi] ;initializing |
mov esi,dword [bmptoimg_data_area_eop] |
sub esi,dword [bmptoimg_data_area_bps] |
nextstring: |
push edi |
push ebp |
cmp word [bmp_load_area+28],24 |
jne convertno32 |
mov edi,ebp |
mov ecx,[bmptoimg_data_area_dwps] |
cld |
rep movsd |
convert1: |
pop ebp |
pop edi |
sub esi,dword [bmptoimg_data_area_bps] |
sub esi,dword [bmptoimg_data_area_bps] |
cmp esi,dword [bmptoimg_data_area_sop] |
jb end_bmp |
add edi,eax |
add ebp,eax |
jmp nextstring |
convertno32: |
mov ebx,bmp_load_area |
add ebx, [bmp_load_area+14] |
add ebx,14 ;start of color table |
push esi |
add esi,dword [bmptoimg_data_area_bps] |
mov dword [bmptoimg_data_area_eos],esi |
pop esi |
nextelem: |
push eax |
movzx eax,byte [esi] |
cmp word [bmp_load_area+28],4 |
je convert4bpp |
cmp word [bmp_load_area+28],1 |
je convert1bpp |
call converttable |
convert2: |
pop eax |
inc esi |
cmp esi,dword [bmptoimg_data_area_eos] |
jae convert1 |
add edi,3 |
add ebp,3 |
jmp nextelem |
convert4bpp: |
shl ax,4 |
shr al,4 |
push ax |
movzx eax,ah |
call converttable |
add edi,3 |
add ebp,3 |
pop ax |
movzx eax,al |
call converttable |
jmp convert2 |
convert1bpp: |
mov ecx,eax |
mov edx,7 |
nextbit: |
xor eax,eax |
bt ecx,edx |
jnc noaddelem |
inc eax |
noaddelem: |
push edx |
call converttable |
pop edx |
dec edx |
js convert2 |
add edi,3 |
add ebp,3 |
jmp nextbit |
converttable: |
shl eax,2 |
add eax,ebx |
mov edx, dword [eax] |
; mov dword [edi],edx |
mov [ebp],edx |
ret |
bmptoimg_data_area_count=bmptoimg_data_area_count+1 |
if bmptoimg_data_area_count = 1 |
; DATA AREA |
bmptoimg_soi dd 0 |
bmptoimg_data_area_bps dd 0 |
bmptoimg_data_area_dwps dd 0 |
bmptoimg_data_area_sop dd 0 |
bmptoimg_data_area_eop dd 0 |
bmptoimg_data_area_eos dd 0 |
end if |
end_bmp: |
mov eax,dword [bmp_load_area+18] |
mov ebx,dword [bmp_load_area+22] |
mov dword [img_dest_area],eax |
mov dword [img_dest_area+4],ebx |
} |
; For convert RGB to BGR |
COLOR_ORDER equ MENUETOS |
macro giftoani gifsrc,imgsrc,num_of_frames |
{ |
local hasharea, ReadGIF, nextblock,_null |
local globalColor, img_count, cur_info, img_start |
local codesize, compsize, bit_count, CC, EOI, Palette |
local block_ofs, table_ptr, gifmacend |
local no_gc, block_skip, no_comm, noextblock, uselocal |
local setPal, filltable, reinit, cycle, zadd, noinc |
local notintable, er, zend, nxt, continue, ex, Gif_skipmap |
local Gif_get_sym, shift, nextbl, noblock, loop1, exx |
local Gif_output, next, loop2 |
_null equ 0x1000 ; 0x1000 |
; jmp sss |
; if defined gif_hash_offset |
; else |
; hasharea: |
; times 4096 dd 0 ;4096 |
; end if |
;sss: |
mov esi,gifsrc ;ª § ⥫ì ä ¨« ¢ ¯ ¬ï⨠|
mov edi,imgsrc ;ª § ⥫ì ᯨ᮪ ª à⨮ª |
if defined gif_hash_offset |
mov eax,gif_hash_offset ; ¡®ç ï ®¡« áâì ¬¨¨¬ã¬ 4096*4 ¡ ©â |
else |
mov eax,hasharea ; ¡®ç ï ®¡« áâì ¬¨¨¬ã¬ 4096*4 ¡ ©â |
end if |
call ReadGIF |
push ecx |
pop dword num_of_frames |
jmp gifmacend |
if defined gif_hash_offset |
else |
hasharea: |
times 4096 dd 0 ;4096 |
end if |
ReadGIF: |
push esi edi |
mov [table_ptr],eax |
mov [cur_info],edi |
xor eax,eax |
mov [globalColor],eax |
mov [img_count],eax |
inc eax |
cmp dword[esi],'GIF8' |
jne er ; signature |
mov ecx,[esi+0xa] |
inc eax |
add esi,0xd |
mov edi,esi |
bt ecx,7 |
jnc nextblock |
mov [globalColor],esi |
call Gif_skipmap |
nextblock: |
cmp byte[edi],0x21 |
jne noextblock |
inc edi |
cmp byte[edi],0xf9 ; Graphic Control Ext |
jne no_gc |
add edi,7 |
jmp nextblock |
no_gc: |
cmp byte[edi],0xfe ; Comment Ext |
jne no_comm |
inc edi |
block_skip: |
movzx eax,byte[edi] |
lea edi,[edi+eax+1] |
cmp byte[edi],0 |
jnz block_skip |
inc edi |
jmp nextblock |
no_comm: |
cmp byte[edi],0xff ; Application Ext |
jne nextblock |
add edi,13 |
jmp block_skip |
noextblock: |
cmp byte[edi],0x2c ; image beginning |
jne er |
inc [img_count] |
inc edi |
mov esi,[cur_info] |
xchg esi,edi |
movsd |
movsd |
push edi |
movzx ecx,word[esi] |
inc esi |
bt ecx,7 |
jc uselocal |
push [globalColor] |
mov edi,esi |
jmp setPal |
uselocal: |
call Gif_skipmap |
push esi |
setPal: |
movzx ecx,byte[edi] |
inc ecx |
mov [codesize],ecx |
dec ecx |
pop [Palette] |
lea esi,[edi+1] |
mov edi,[table_ptr] |
xor eax,eax |
cld |
lodsb ; eax - block_count |
add eax,esi |
mov [block_ofs],eax |
mov [bit_count],8 |
mov eax,1 |
shl eax,cl |
mov [CC],eax |
inc eax |
mov [EOI],eax |
lea ecx,[eax-1] |
mov eax, _null shl 16 |
filltable: |
stosd |
inc eax |
loop filltable |
pop edi |
mov [img_start],edi |
reinit: |
mov edx,[EOI] |
inc edx |
push [codesize] |
pop [compsize] |
call Gif_get_sym |
cmp eax,[CC] |
je reinit |
call Gif_output |
cycle: |
movzx ebx,ax |
call Gif_get_sym |
cmp eax,edx |
jae notintable |
cmp eax,[CC] |
je reinit |
cmp eax,[EOI] |
je zend |
call Gif_output |
zadd: |
push eax |
mov eax,[table_ptr] |
mov [eax+edx*4],ebx |
pop eax |
cmp edx,0xFFF |
jae cycle |
inc edx |
bsr ebx,edx |
cmp ebx,[compsize] |
jne noinc |
inc [compsize] |
noinc: |
jmp cycle |
notintable: |
push eax |
mov eax,ebx |
call Gif_output |
push ebx |
movzx eax,bx |
call Gif_output |
pop ebx eax |
jmp zadd |
er: |
pop edi |
jmp ex |
zend: |
; mov eax,[.cur_info] ; skip offset to next frame |
; mov [eax],edi |
mov [cur_info],edi |
add esi,2 |
xchg esi,edi |
nxt: |
cmp byte[edi],0 |
jnz continue |
inc edi |
jmp nxt |
continue: |
cmp byte[edi],0x3b ;read next frame |
jne nextblock |
xor eax,eax |
stosd |
mov ecx,[img_count] |
ex: |
pop edi esi |
ret |
Gif_skipmap: |
; in: ecx - image descriptor, esi - pointer to colormap |
; out: edi - pointer to area after colormap |
and ecx,111b |
inc ecx ; color map size |
mov ebx,1 |
shl ebx,cl |
lea ebx,[ebx*2+ebx] |
lea edi,[esi+ebx] |
ret |
Gif_get_sym: |
mov ecx,[compsize] |
push ecx |
xor eax,eax |
shift: |
ror byte[esi],1 |
rcr eax,1 |
dec [bit_count] |
jnz loop1 |
inc esi |
cmp esi,[block_ofs] |
jb noblock |
push eax |
xor eax,eax |
lodsb |
test eax,eax |
jnz nextbl |
mov eax,[EOI] |
sub esi,2 |
add esp,8 |
jmp exx |
nextbl: |
add eax,esi |
mov [block_ofs],eax |
pop eax |
noblock: |
mov [bit_count],8 |
loop1: |
loop shift |
pop ecx |
rol eax,cl |
exx: |
xor ecx,ecx |
ret |
Gif_output: |
push esi eax edx |
mov edx,[table_ptr] |
next: |
push word[edx+eax*4] |
mov ax,word[edx+eax*4+2] |
inc ecx |
cmp ax,_null |
jnz next |
shl ebx,16 |
mov bx,[esp] |
loop2: |
pop ax |
lea esi,[eax+eax*2] |
add esi,[Palette] |
if COLOR_ORDER eq MENUETOS |
mov esi,[esi] |
bswap esi |
shr esi,8 |
mov [edi],esi |
add edi,3 |
else |
movsw |
movsb |
end if |
loop loop2 |
pop edx eax esi |
ret |
globalColor dd 1 |
img_count dd 1 |
cur_info dd 1 ; image table pointer |
img_start dd 1 |
codesize dd 1 |
compsize dd 1 |
bit_count dd 1 |
CC dd 1 |
EOI dd 1 |
Palette dd 1 |
block_ofs dd 1 |
table_ptr dd 1 |
gifmacend: |
} |
macro giftoimg gifsrc,imgsrc |
{ |
local hasharea, ReadGIF, nextblock,_null |
local globalColor, img_count, cur_info, img_start |
local codesize, compsize, bit_count, CC, EOI, Palette |
local block_ofs, table_ptr, gifmacend |
local no_gc, block_skip, no_comm, noextblock, uselocal |
local setPal, filltable, reinit, cycle, zadd, noinc |
local notintable, er, zend, nxt, continue, ex, Gif_skipmap |
local Gif_get_sym, shift, nextbl, noblock, loop1, exx |
local Gif_output, next, loop2 |
_null equ 0x1000 ; 0x1000 |
mov esi,gifsrc ;ª § ⥫ì ä ¨« ¢ ¯ ¬ï⨠|
mov edi,imgsrc ;ª § ⥫ì ᯨ᮪ ª à⨮ª |
if defined gif_hash_offset |
mov eax,gif_hash_offset ; ¡®ç ï ®¡« áâì ¬¨¨¬ã¬ 4096*4 ¡ ©â |
else |
mov eax,hasharea ; ¡®ç ï ®¡« áâì ¬¨¨¬ã¬ 4096*4 ¡ ©â |
end if |
call ReadGIF |
jmp gifmacend |
if defined gif_hash_offset |
else |
hasharea: |
times 4096 dd 0 ;4096 |
end if |
ReadGIF: |
push esi edi |
mov [table_ptr],eax |
mov [cur_info],edi |
xor eax,eax |
mov [globalColor],eax |
mov [img_count],eax |
inc eax |
cmp dword[esi],'GIF8' |
jne er ; signature |
mov ecx,[esi+0xa] |
inc eax |
add esi,0xd |
mov edi,esi |
bt ecx,7 |
jnc nextblock |
mov [globalColor],esi |
call Gif_skipmap |
nextblock: |
cmp byte[edi],0x21 |
jne noextblock |
inc edi |
cmp byte[edi],0xf9 ; Graphic Control Ext |
jne no_gc |
add edi,7 |
jmp nextblock |
no_gc: |
cmp byte[edi],0xfe ; Comment Ext |
jne no_comm |
inc edi |
block_skip: |
movzx eax,byte[edi] |
lea edi,[edi+eax+1] |
cmp byte[edi],0 |
jnz block_skip |
inc edi |
jmp nextblock |
no_comm: |
cmp byte[edi],0xff ; Application Ext |
jne nextblock |
add edi,13 |
jmp block_skip |
noextblock: |
cmp byte[edi],0x2c ; image beginning |
jne er |
inc [img_count] |
inc edi |
mov esi,[cur_info] |
xchg esi,edi |
; movsd |
; movsd |
mov bp,word[esi+4] |
movzx ebx,bp |
mov [edi],ebx |
mov bp,word[esi+6] |
movzx ebx,bp |
mov [edi+4],ebx |
add edi,8 |
add esi,8 |
push edi |
movzx ecx,word[esi] |
inc esi |
bt ecx,7 |
jc uselocal |
push [globalColor] |
mov edi,esi |
jmp setPal |
uselocal: |
call Gif_skipmap |
push esi |
setPal: |
movzx ecx,byte[edi] |
inc ecx |
mov [codesize],ecx |
dec ecx |
pop [Palette] |
lea esi,[edi+1] |
mov edi,[table_ptr] |
xor eax,eax |
cld |
lodsb ; eax - block_count |
add eax,esi |
mov [block_ofs],eax |
mov [bit_count],8 |
mov eax,1 |
shl eax,cl |
mov [CC],eax |
inc eax |
mov [EOI],eax |
lea ecx,[eax-1] |
mov eax, _null shl 16 |
filltable: |
stosd |
inc eax |
loop filltable |
pop edi |
mov [img_start],edi |
reinit: |
mov edx,[EOI] |
inc edx |
push [codesize] |
pop [compsize] |
call Gif_get_sym |
cmp eax,[CC] |
je reinit |
call Gif_output |
cycle: |
movzx ebx,ax |
call Gif_get_sym |
cmp eax,edx |
jae notintable |
cmp eax,[CC] |
je reinit |
cmp eax,[EOI] |
je zend |
call Gif_output |
zadd: |
push eax |
mov eax,[table_ptr] |
mov [eax+edx*4],ebx |
pop eax |
cmp edx,0xFFF |
jae cycle |
inc edx |
bsr ebx,edx |
cmp ebx,[compsize] |
jne noinc |
inc [compsize] |
noinc: |
jmp cycle |
notintable: |
push eax |
mov eax,ebx |
call Gif_output |
push ebx |
movzx eax,bx |
call Gif_output |
pop ebx eax |
jmp zadd |
er: |
pop edi |
jmp ex |
zend: |
; mov eax,[.cur_info] ; skip offset to next frame |
; mov [eax],edi |
mov [cur_info],edi |
add esi,2 |
xchg esi,edi |
nxt: |
cmp byte[edi],0 |
jnz continue |
inc edi |
jmp nxt |
continue: |
; cmp byte[edi],0x3b ;read next frame |
; jne nextblock |
xor eax,eax |
stosd |
mov ecx,[img_count] |
ex: |
pop edi esi |
ret |
Gif_skipmap: |
; in: ecx - image descriptor, esi - pointer to colormap |
; out: edi - pointer to area after colormap |
and ecx,111b |
inc ecx ; color map size |
mov ebx,1 |
shl ebx,cl |
lea ebx,[ebx*2+ebx] |
lea edi,[esi+ebx] |
ret |
Gif_get_sym: |
mov ecx,[compsize] |
push ecx |
xor eax,eax |
shift: |
ror byte[esi],1 |
rcr eax,1 |
dec [bit_count] |
jnz loop1 |
inc esi |
cmp esi,[block_ofs] |
jb noblock |
push eax |
xor eax,eax |
lodsb |
test eax,eax |
jnz nextbl |
mov eax,[EOI] |
sub esi,2 |
add esp,8 |
jmp exx |
nextbl: |
add eax,esi |
mov [block_ofs],eax |
pop eax |
noblock: |
mov [bit_count],8 |
loop1: |
loop shift |
pop ecx |
rol eax,cl |
exx: |
xor ecx,ecx |
ret |
Gif_output: |
push esi eax edx |
mov edx,[table_ptr] |
next: |
push word[edx+eax*4] |
mov ax,word[edx+eax*4+2] |
inc ecx |
cmp ax,_null |
jnz next |
shl ebx,16 |
mov bx,[esp] |
loop2: |
pop ax |
lea esi,[eax+eax*2] |
add esi,[Palette] |
if COLOR_ORDER eq MENUETOS |
mov esi,[esi] |
bswap esi |
shr esi,8 |
mov [edi],esi |
add edi,3 |
else |
movsw |
movsb |
end if |
loop loop2 |
pop edx eax esi |
ret |
globalColor dd 1 |
img_count dd 1 |
cur_info dd 1 ; image table pointer |
img_start dd 1 |
codesize dd 1 |
compsize dd 1 |
bit_count dd 1 |
CC dd 1 |
EOI dd 1 |
Palette dd 1 |
block_ofs dd 1 |
table_ptr dd 1 |
gifmacend: |
} |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/3detx60b/trunk/ascl.inc |
---|
0,0 → 1,897 |
lang equ ru ; ru en fr ge fi |
; |
; Assembler |
; SMALL |
; CODE |
; Libary |
; |
; Ver 0.14 By Pavlushin Evgeni (RUSSIA) |
; www.waptap@mail.ru |
;Please compile aplications on FASM ver1.54 or higer!!! |
;InfoList |
;0.01 scank,putpix,puttxt |
;0.02 label,random,colors |
;0.03 window,startwd,endwd,attributes |
;0.04 close,delay,scevent ~30.04.2004 |
;0.05 small random, ~04.05.2004 |
;0.06 wtevent ~09.05.2004 |
;0.07 timeevent ~23.05.2004 |
;0.08 txtput ~14.06.2004 |
;0.09 opendialog,savedialog ~20.06.2004 |
;0.10 wordstoreg by halyavin, add at ~30.08.2004 |
; random bug deleted eax is use. |
;0.11 loadfile from me +puttxt bug del ~07.09.2004 |
;0.12 open/save dialog ~13.09.2004 |
;0.13 dialogs bugs deleted |
;0.14 drawlbut ~03.10.2004 |
;0.15 extendet label! |
; LOADFILE |
; (SYNTAX) LOADFILE 'full_path_to_file',file_load_area,file_temp_area |
; (SAMPLE) LOADFILE '/rd/1/clock.bmp',load_area,temp_area |
macro loadfile file_name,file_load_area,file_temp_area |
{ |
local open,fileinfo,string |
jmp open |
fileinfo: |
dd 0 |
dd 0 |
dd 1 |
dd file_load_area |
dd file_temp_area |
string: |
db file_name,0 |
open: |
mov dword [fileinfo+8],1 ; how many blocks to read (1) |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
mov eax,[file_load_area+2] |
shr eax,9 ; ¯®¤¥«¨¬ 512 ¨ ¯à¨¡ ¢¨¬ 1 - ¯®«ã稬 ç¨á«® ¡«®ª®¢ |
inc eax |
mov dword [fileinfo+8],eax |
mov eax,58 |
mov ebx,fileinfo |
int 0x40 |
} |
;macro wordstoreg reg,hiword,loword |
;{ |
;if hiword eqtype 0 & loword eqtype 0 |
; mov reg,dword hiword*65536+loword |
;else if hiword eqtype 12 & loword eqtype eax |
; mov reg,dword hiword*65536 |
; add reg,dword loword |
;else if hiword eqtype 12 & loword eqtype [123] |
; mov reg,dword hiword*65536 |
; add reg,dword loword |
;else |
; mov reg,dword hiword |
; shl reg,16 |
; add reg,dword loword |
;end if |
;} |
macro dword2reg reg,doubleword |
{ |
if doubleword eq |
; not changes |
else |
mov reg,dword doubleword |
end if |
} |
macro words2reg reg,hiword,lowword |
{ |
if hiword eq |
if lowword eq |
; not changes |
else |
if lowword eqtype 12 |
and reg,dword 0xffff0000 |
add reg,dword lowword |
else |
and reg,dword 0xffff0000 |
add reg,dword lowword |
end if |
end if |
else |
if lowword eq |
if hiword eqtype 12 |
and reg,dword 0x0000ffff |
add reg,dword hiword*65536 |
else |
shl reg,16 |
add reg,dword hiword |
ror reg,16 |
end if |
else |
if lowword eqtype 12 & hiword eqtype 12 |
if lowword eq 0 & hiword eq 0 |
xor reg,reg |
else |
mov reg,dword hiword*65536+lowword |
end if |
else |
mov reg,dword hiword |
shl reg,16 |
add reg,dword lowword |
end if |
end if |
end if |
} |
; DRAW BUTTON with label |
macro drawlbut x,y,xs,ys,text,id,bcolor,tcolor |
{ |
local asd,lab |
jmp asd |
lab db text ;arg label |
asd: |
words2reg ebx,x,xs |
words2reg ecx,y,ys |
mov edx,id |
mov esi,bcolor |
mov eax,8 |
int 0x40 |
mov eax,asd-lab ;calc size |
mov ebx,6 |
mul ebx |
mov esi,eax |
mov eax,xs |
sub eax,esi |
shr eax,1 |
add eax,x |
mov edx,ys |
sub edx,7 |
shr edx,1 |
add edx,y |
mov ebx,eax |
shl ebx,16 |
add ebx,edx |
mov ecx,tcolor ;arg4 color |
mov edx,lab |
mov esi,asd-lab ;calc size |
mov eax,4 |
int 0x40 |
} |
macro opendialog redproc,openoff,erroff,path |
{ |
local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc |
local run_fileinfo, param |
local getmesloop, loox, mred, mkey, mbutton, mgetmes |
local dlg_is_work, ready, procinfo |
; |
; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec, |
; 1 byte space, 1 byte type of dialog (O - Open ,S - Save) |
; |
cld |
;; mov esi,path |
mov edi,path |
mov eax,0 |
mov ecx,200 |
rep stosb |
;mov [get_loops],0 |
mov [dlg_pid_get],0 |
; Get my PID in dec format 4 bytes |
mov eax,9 |
mov ebx,procinfo |
mov ecx,-1 |
int 0x40 |
; convert eax bin to param dec |
mov eax,dword [procinfo+30] ;offset of myPID |
mov edi,param+4-1 ;offset to 4 bytes |
mov ecx,4 |
mov ebx,10 |
cld |
new_d: |
xor edx,edx |
div ebx |
add dl,'0' |
mov [edi],dl |
dec edi |
loop new_d |
; wirite 1 byte space to param |
mov [param+4],byte 32 ;Space for next parametr |
; and 1 byte type of dialog to param |
mov [param+5],byte 'O' ;Get Open dialog (Use 'S' for Save dialog) |
; |
; STEP2 prepare IPC area for get messages |
; |
; prepare IPC area |
mov [path],dword 0 |
mov [path+4],dword 8 |
; define IPC memory |
mov eax,60 |
mov ebx,1 ; define IPC |
mov ecx,path ; offset of area |
mov edx,150 ; size 150 bytes |
int 0x40 |
; change wanted events list 7-bit IPC event |
mov eax,40 |
mov ebx,01000111b |
int 0x40 |
; |
; STEP 3 run SYSTEM XTREE with parameters |
; |
mov eax,58 |
mov ebx,run_fileinfo |
int 0x40 |
call redproc |
mov [get_loops],0 |
getmesloop: |
mov eax,23 |
mov ebx,50 ;0.5 sec |
int 0x40 |
cmp eax,1 |
je mred |
cmp eax,2 |
je mkey |
cmp eax,3 |
je mbutton |
cmp eax,7 |
je mgetmes |
; Get number of procces |
mov ebx,procinfo |
mov ecx,-1 |
mov eax,9 |
int 0x40 |
mov ebp,eax |
loox: |
mov eax,9 |
mov ebx,procinfo |
mov ecx,ebp |
int 0x40 |
mov eax,[DLGPID] |
cmp [procinfo+30],eax ;IF Dialog find |
je dlg_is_work ;jmp to dlg_is_work |
dec ebp |
jnz loox |
jmp erroff |
dlg_is_work: |
cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated |
je erroff ;TESTODP2 terminated too |
cmp [dlg_pid_get],dword 1 |
je getmesloop |
inc [get_loops] |
cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated |
jae erroff |
jmp getmesloop |
mred: |
call redproc |
jmp getmesloop |
mkey: |
mov eax,2 |
int 0x40 ; read (eax=2) |
jmp getmesloop |
mbutton: |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 ; button id=1 ? |
jne getmesloop |
mov eax,-1 ; close this program |
int 0x40 |
mgetmes: |
; If dlg_pid_get then second message get jmp to still |
cmp [dlg_pid_get],dword 1 |
je ready |
; First message is number of PID SYSXTREE dialog |
; convert PID dec to PID bin |
movzx eax,byte [path+16] |
sub eax,48 |
imul eax,10 |
movzx ebx,byte [path+16+1] |
add eax,ebx |
sub eax,48 |
imul eax,10 |
movzx ebx,byte [path+16+2] |
add eax,ebx |
sub eax,48 |
imul eax,10 |
movzx ebx,byte [path+16+3] |
add eax,ebx |
sub eax,48 |
mov [DLGPID],eax |
; Claear and prepare IPC area for next message |
mov [path],dword 0 |
mov [path+4],dword 8 |
mov [path+8],dword 0 |
mov [path+12],dword 0 |
mov [path+16],dword 0 |
; Set dlg_pid_get for get next message |
mov [dlg_pid_get],dword 1 |
call redproc ;show DLG_PID |
jmp getmesloop |
ready: |
; |
; The second message get |
; Second message is 100 bytes path to SAVE/OPEN file |
; shl path string on 16 bytes |
; |
cld |
mov esi,path+16 |
mov edi,path |
mov ecx,200 |
rep movsb |
mov [edi],byte 0 |
jmp openoff |
; DATA AREA |
get_loops dd 0 |
dlg_pid_get dd 0 |
DLGPID dd 0 |
param: |
dd 0 ; My dec PID |
dd 0,0 ; Type of dialog |
run_fileinfo: |
dd 16 |
dd 0 |
dd param |
dd 0 |
dd procinfo ; 0x10000 |
;run_filepath |
db '/RD/1/SYSXTREE',0 |
procinfo: |
times 1024 db 0 |
} |
macro savedialog redproc,openoff,erroff,path |
{ |
local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc |
local run_fileinfo, run_filepath, param |
local getmesloop, loox, mred, mkey, mbutton, mgetmes |
local dlg_is_work, ready, procinfo |
; |
; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec, |
; 1 byte space, 1 byte type of dialog (O - Open ,S - Save) |
; |
cld |
;; mov esi,path |
mov edi,path |
mov eax,0 |
mov ecx,200 |
rep stosb |
;mov [get_loops],0 |
mov [dlg_pid_get],0 |
; Get my PID in dec format 4 bytes |
mov eax,9 |
mov ebx,procinfo |
mov ecx,-1 |
int 0x40 |
; convert eax bin to param dec |
mov eax,dword [procinfo+30] ;offset of myPID |
mov edi,param+4-1 ;offset to 4 bytes |
mov ecx,4 |
mov ebx,10 |
cld |
new_d: |
xor edx,edx |
div ebx |
add dl,'0' |
mov [edi],dl |
dec edi |
loop new_d |
; wirite 1 byte space to param |
mov [param+4],byte 32 ;Space for next parametr |
; and 1 byte type of dialog to param |
mov [param+5],byte 'S' ;Get Open dialog (Use 'S' for Save dialog) |
; |
; STEP2 prepare IPC area for get messages |
; |
; prepare IPC area |
mov [path],dword 0 |
mov [path+4],dword 8 |
; define IPC memory |
mov eax,60 |
mov ebx,1 ; define IPC |
mov ecx,path ; offset of area |
mov edx,150 ; size 150 bytes |
int 0x40 |
; change wanted events list 7-bit IPC event |
mov eax,40 |
mov ebx,01000111b |
int 0x40 |
; |
; STEP 3 run SYSTEM XTREE with parameters |
; |
mov eax,58 |
mov ebx,run_fileinfo |
int 0x40 |
call redproc |
mov [get_loops],0 |
getmesloop: |
mov eax,23 |
mov ebx,50 ;0.5 sec |
int 0x40 |
cmp eax,1 |
je mred |
cmp eax,2 |
je mkey |
cmp eax,3 |
je mbutton |
cmp eax,7 |
je mgetmes |
; Get number of procces |
mov ebx,procinfo |
mov ecx,-1 |
mov eax,9 |
int 0x40 |
mov ebp,eax |
loox: |
mov eax,9 |
mov ebx,procinfo |
mov ecx,ebp |
int 0x40 |
mov eax,[DLGPID] |
cmp [procinfo+30],eax ;IF Dialog find |
je dlg_is_work ;jmp to dlg_is_work |
dec ebp |
jnz loox |
jmp erroff |
dlg_is_work: |
cmp [procinfo+50],word 9 ;If slot state 9 - dialog is terminated |
je erroff ;TESTODP2 terminated too |
cmp [dlg_pid_get],dword 1 |
je getmesloop |
inc [get_loops] |
cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated |
jae erroff |
jmp getmesloop |
mred: |
call redproc |
jmp getmesloop |
mkey: |
mov eax,2 |
int 0x40 ; read (eax=2) |
jmp getmesloop |
mbutton: |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 ; button id=1 ? |
jne getmesloop |
mov eax,-1 ; close this program |
int 0x40 |
mgetmes: |
; If dlg_pid_get then second message get jmp to still |
cmp [dlg_pid_get],dword 1 |
je ready |
; First message is number of PID SYSXTREE dialog |
; convert PID dec to PID bin |
movzx eax,byte [path+16] |
sub eax,48 |
imul eax,10 |
movzx ebx,byte [path+16+1] |
add eax,ebx |
sub eax,48 |
imul eax,10 |
movzx ebx,byte [path+16+2] |
add eax,ebx |
sub eax,48 |
imul eax,10 |
movzx ebx,byte [path+16+3] |
add eax,ebx |
sub eax,48 |
mov [DLGPID],eax |
; Claear and prepare IPC area for next message |
mov [path],dword 0 |
mov [path+4],dword 8 |
mov [path+8],dword 0 |
mov [path+12],dword 0 |
mov [path+16],dword 0 |
; Set dlg_pid_get for get next message |
mov [dlg_pid_get],dword 1 |
call redproc ;show DLG_PID |
jmp getmesloop |
ready: |
; |
; The second message get |
; Second message is 100 bytes path to SAVE/OPEN file |
; shl path string on 16 bytes |
; |
cld |
mov esi,path+16 |
mov edi,path |
mov ecx,200 |
rep movsb |
mov [edi],byte 0 |
jmp openoff |
; DATA AREA |
get_loops dd 0 |
dlg_pid_get dd 0 |
DLGPID dd 0 |
param: |
dd 0 ; My dec PID |
dd 0,0 ; Type of dialog |
run_fileinfo: |
dd 16 |
dd 0 |
dd param |
dd 0 |
dd procinfo |
;run_filepath: |
db '/RD/1/SYSXTREE',0 |
procinfo: |
times 1024 db 0 |
} |
; RANDOM - generate random count (small) |
; (SYNTAX) RANDOM MaxCount,OutArgument |
; (SAMPLE) RANDOM 10000,eax |
; ( NOTE ) Maxint<65536 ; use random 65536,eax for more combinations |
randomuse = 0 |
macro random arg1,arg2 |
{ |
local rxproc |
randomuse = randomuse + 1 |
jmp rxproc |
if defined randomuse & randomuse = 1 |
randomproc: |
jmp rnj |
rsx1 dw 0x4321 |
rsx2 dw 0x1234 |
rnj: |
; mov eax,arg1 |
push bx |
push cx |
push dx |
push si |
push di |
mov cx,ax |
mov ax,word ptr rsx1 |
mov bx,word ptr rsx2 |
mov si,ax |
mov di,bx |
mov dl,ah |
mov ah,al |
mov al,bh |
mov bh,bl |
xor bl,bl |
rcr dl,1 |
rcr ax,1 |
rcr bx,1 |
add bx,di |
adc ax,si |
add bx,0x62e9 |
adc ax,0x3619 |
mov word ptr rsx1,bx |
mov word ptr rsx2,ax |
xor dx,dx |
cmp ax,0 |
je nodiv |
cmp cx,0 |
je nodiv |
div cx |
nodiv: |
mov ax,dx |
pop di |
pop si |
pop dx |
pop cx |
pop bx |
and eax,0000ffffh |
; mov arg2,0 |
; mov arg2,eax |
ret |
end if |
rxproc: |
mov eax,arg1 |
call randomproc |
mov arg2,eax |
} |
macro scank |
{ |
mov eax,10 |
int 0x40 |
} |
macro putpix x,y,color |
{ |
mov ebx,x |
mov ecx,y |
mov edx,color |
mov eax,1 |
int 0x40 |
} |
macro puttxt x,y,offs,size,color |
{ |
; mov ebx,x |
; shl ebx,16 |
; add ebx,y |
words2reg ebx,x,y |
dword2reg ecx,color |
dword2reg edx,offs |
dword2reg esi,size |
; mov ecx,color |
; mov edx,offs |
; mov esi,size |
mov eax,4 |
int 0x40 |
} |
macro outcount data, x, y, color, numtype |
{ |
mov ecx,data |
mov ebx,numtype |
mov bl,0 |
; mov edx,x*65536+y |
words2reg edx,x,y |
mov esi,color |
mov eax,47 |
int 0x40 |
} |
; SCEVENT - Scan event |
macro scevent red,key,but |
{ |
mov eax,11 |
int 0x40 |
dec eax |
jz red |
dec eax |
jz key |
dec eax |
jz but |
} |
; WTEVENT - Wait event |
macro wtevent red,key,but |
{ |
mov eax,10 |
int 0x40 |
dec eax |
jz red |
dec eax |
jz key |
dec eax |
jz but |
} |
; TIMEEVENT - Wite for event with timeout |
macro timeevent xfps,noevent,red,key,but |
{ |
mov eax,23 |
mov ebx,xfps |
int 0x40 |
cmp eax,0 |
je noevent |
dec eax |
jz red |
dec eax |
jz key |
dec eax |
jz but |
} |
; CLOSE - Close program |
macro close |
{ |
mov eax,-1 |
int 0x40 |
} |
; DELAY - Create delay 1/100 sec |
; (SYNTAX) Delay time |
; (SAMPLE) Delay 100 ;delay 2 sec 1/100*200=2 sec |
macro delay arg1 |
{ |
mov eax,5 |
mov ebx,arg1 |
int 0x40 |
} |
; WINDOW - Draw window |
; (SYNTAX) WINDOW Xstart,Ystart,'Text',Color |
; (SAMPLE) WINDOW 10,10,640+8,480+24,window_Skinned |
macro window arg1,arg2,arg3,arg4,arg5 |
{ |
; mov ebx,arg1*65536+arg3 |
; mov ecx,arg2*65536+arg4 |
words2reg ebx,arg1,arg3 |
words2reg ecx,arg2,arg4 |
mov edx,arg5 |
mov eax,0 |
int 0x40 |
} |
macro colorwindow arg1,arg2,arg3,arg4,arg5,arg6,arg7 |
{ |
mov ebx,arg1*65536+arg3 |
mov ecx,arg2*65536+arg4 |
mov edx,arg5 |
mov esi,arg6 |
mov edi,arg7 |
mov eax,0 |
int 0x40 |
} |
; STARTWD - Start of window draw |
macro startwd |
{ |
mov eax,12 |
mov ebx,1 |
int 0x40 |
} |
; ENDWD - End window draw |
macro endwd |
{ |
mov eax,12 |
mov ebx,2 |
int 0x40 |
} |
; LABEL - Put text to frame |
; (SYNTAX) LABEL Xstart,Ystart,'Text',Color |
; (SAMPLE) LABEL 10,12,'Hello World!',cl_Green+font_Big |
macro label arg1,arg2,arg3,arg4 |
{ |
local asd,lab |
jmp asd |
lab db arg3 ;arg label |
asd: |
; mov ebx,arg1 ;arg1=y arg2=x |
; shl ebx,16 |
; add ebx,arg2 |
words2reg ebx,arg1,arg2 |
dword2reg ecx,arg4 |
mov edx,lab |
mov esi,asd-lab ;calc size |
mov eax,4 |
int 0x40 |
} |
;Key's |
key_Up equ 178 |
key_Down equ 177 |
key_Right equ 179 |
key_Left equ 176 |
key_Esc equ 27 |
key_Space equ 32 |
key_Enter equ 13 |
key_Bspace equ 8 |
key_F1 equ 50 |
key_F2 equ 51 |
key_F3 equ 52 |
key_F4 equ 53 |
key_F5 equ 54 |
key_F6 equ 55 |
key_F7 equ 56 |
key_F8 equ 57 |
key_F9 equ 48 |
key_F10 equ 49 |
key_F11 equ 68 |
key_F12 equ 255 |
key_Home equ 180 |
key_End equ 181 |
key_PgUp equ 184 |
key_PgDown equ 183 |
;Attributes |
;Window Attributes |
window_Skinned equ 0x03000000 |
window_Type2 equ 0x02000000 |
window_Type1 equ 0x00000000 |
window_Reserve equ 0x01000000 |
;Font Attributes |
font_Big equ 0x10000000 |
;Colors |
cl_White equ 0x00ffffff |
cl_Black equ 0x00000000 |
cl_Grey equ 0x00888888 |
cl_Red equ 0x00ff0000 |
cl_Lime equ 0x0000ff00 |
cl_Green equ 0x0000af00 |
cl_Blue equ 0x000000ff |
cl_Purple equ 0x008080ff |
cl_Violet equ 0x008040ff |
cl_Cyan equ 0x0040e0ff |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/3detx60b/trunk/build_en.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix en >lang.inc |
@fasm 3detx60b.asm 3detx60b |
@pause |
/programs/3detx60b/trunk/build_ru.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix ru >lang.inc |
@fasm 3detx60b.asm 3detx60b |
@pause |
/programs/3detx60b/trunk/map.gif |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/3detx60b/trunk/texmap.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/3detx60b/trunk/texpack.gif |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/3dtcub10/trunk/3DTCUB10.ASM |
---|
0,0 → 1,938 |
; |
; 9 Ver Screen saver |
; 5 Ver 24 bit texture. |
; 23/8/2004 |
; Pavlushin Evgeni 3d cube screen saver |
; mail: waptap@mail.ru site: www.deck4.narod.ru |
; |
; This programm develop on sample text3d to Mikolaj Felix 25/5/2001 |
; mfelix@polbox.com |
; |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd 0x200000 ; memory for app |
dd 0x200000 ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
include 'lang.inc' |
MAX_DEGS equ 512 ;quantity of angels 2^n.Minimize for speedup |
MAX_POINTS equ 8 ;quantity of points |
MAX_FACES equ 6 ;quantity of points |
START: |
finit |
call draw_window |
call clear_screen |
call init_sincos |
still: |
mov eax,23 ; wait for system event with 2 ms timeout |
mov ebx,2 ; wait 2 ms, then continue |
int 0x40 |
; mov eax,11 ;If you want maximum speed! :) |
; int 0x40 |
dec eax ; window redraw request ? |
je red |
dec eax ; key in buffer ? |
je key |
dec eax ; button in buffer ? |
je button |
main_loop: |
call fade_texture |
mov esi,cube |
mov edi,cube_rotated |
mov ecx,MAX_POINTS*3 |
copy_object: |
fild word [esi] |
fstp dword [edi] |
add esi,2 |
add edi,4 |
dec ecx |
jnz copy_object |
mov esi,angle_x |
mov edi,cube_rotated |
mov ecx,MAX_POINTS |
call rotate_points |
mov esi,cube_rotated |
mov edi,coord2d |
mov ecx,MAX_POINTS |
call translate_points |
call draw_textured_faces |
call clear_screen_buffer |
add [angle_x],1 |
add [angle_y],3 |
add [angle_z],1 |
jmp still |
red: |
call draw_window |
jmp still |
key: |
mov eax,2 |
jmp exit |
button: |
mov eax,17 |
int 0x40 |
cmp ah,1 |
jne still |
exit: |
mov eax,-1 |
int 0x40 |
;Draw window |
draw_window: |
mov eax,12 ;Start |
mov ebx,1 |
int 0x40 |
mov eax,0 ;Draw window |
mov ebx,0*65536+(799) ;x start*65536+x size |
mov ecx,0*65536+(599) ;y start*65536+y size |
mov edx,0x00000000 ;0x03 use skinned window |
int 0x40 |
call clear_screen |
mov eax,12 ;End |
mov ebx,2 |
int 0x40 |
ret |
head_label: db "3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR MENUETOS. USE " |
db "800x600 SCREEN MODE FROM VIEW. PRESS ANY KEY FOR EXIT" |
hl_end: |
;FADE IN FADE OUT TEXTURE |
x_step db 0 |
x_num db 1 |
fade_texture: |
mov ecx,0 |
loox: |
mov al,[file_texture+ecx] |
mov [texture+ecx],al |
inc ecx |
cmp ecx,128*128*3 |
jnae loox |
mov ecx,0 |
loox2: |
mov al,[file_texture+ecx] |
cmp [x_step],al |
jae xxx |
sub al,[x_step] |
jmp nnn |
xxx: |
mov al,0 |
nnn: |
mov [texture+ecx],al |
inc ecx |
cmp ecx,128*128*3 |
jnae loox2 |
cmp [x_step],255 |
jne no_max |
mov [x_num],-1 |
no_max: |
cmp [x_step],0 |
jne no_min |
mov [x_num],1 |
no_min: |
mov al,[x_num] |
add [x_step],al |
ret |
; Clear Screen |
clear_screen: |
mov eax,13 |
mov ebx,0*65536+800 |
mov ecx,0*65536+600 |
mov edx,0 |
int 40h |
mov eax,4 ;Out Text |
mov ebx,8*65536+8 ;x start*65536+y start |
mov ecx,0x00ffffff ;color White |
mov edx,head_label |
mov esi,hl_end-head_label |
int 0x40 |
ret |
clear_screen_buffer: |
mov ebx,scrbuf |
mov ecx,800*65536+(600-40) ;sub 40 for antiflickering title |
mov edx,0*65536+40 |
mov eax,7 |
int 0x40 |
mov eax,4 ;Out Text |
mov ebx,8*65536+580 ;x start*65536+y start |
mov ebp,[n_step] |
shl ebp,16 |
sub ebx,ebp |
mov ecx,0x0000ff00 ;color White |
mov edx,move_text |
add edx,[step] |
mov esi,130 ;mt_end-move_text |
int 0x40 |
inc [n_step] |
cmp [n_step],6 |
jna t_ok |
mov [n_step],0 |
inc [step] |
cmp [step],mt_end-move_text-130 |
jng t_ok |
mov [step],0 |
t_ok: |
mov edi,scrbuf |
mov eax,0 ;black background |
mov ecx,800*600*3/4 ; 16000 |
cld |
rep stosd |
ret |
n_step dd 0 |
step dd 0 |
move_text: db " " |
db " " |
db " " |
db "***** 3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR " |
db "MENUET OS. SET 800x600 SCREEN MODE FROM VIEW THIS SCREEN " |
db "SAVER ***** " |
db "SITE OF THE RUSSIAN DEVELOPERS TO MENUETOS: " |
db "www.menuet.narod.ru " |
db "RUSSIAN MENUET APLICATION ARCHIVE PAGE ON: " |
db "www.meosfiles.narod.ru " |
db "AUTOR OF THIS SCREEN SAVER Pavlushin Evgeni " |
db "MY SITE: www.deck4.narod.ru (Slow update) " |
db "AND MAIL BOX: waptap@mail.ru " |
db "THANK YOU FOR USE! " |
db " " |
db " " |
db " " |
mt_end: |
;include graphlib.asm Mikolaj Felix 9/12/2000 mfelix@polbox.com |
;Draw textured faces proc |
@@rx1 dw 0 ;equ [bp-2] |
@@ry1 dw 0 ;equ [bp-4] |
@@rx2 dw 0 ;equ [bp-6] |
@@ry2 dw 0 ;equ [bp-8] |
@@rx3 dw 0 ;equ [bp-10] |
@@ry3 dw 0 ;equ [bp-12] |
@@rx4 dw 0 ;equ [bp-14] |
@@ry4 dw 0 ;equ [bp-16] |
draw_textured_faces: |
mov esi,link |
mov ecx,MAX_FACES |
dtf_loop: |
push ecx |
xor ebx,ebx |
mov bl,byte [esi] ; point 1 |
shl bx,2 |
mov eax,dword [coord2d+bx] ;COPY 1 FOURANGLE POINT |
mov dword [@@rx1],eax |
xor ebx,ebx |
mov bl,byte [esi+1] ; point 2 |
shl bx,2 |
mov eax,dword [coord2d+bx] ;COPY 2 FOURANGLE POINT |
mov dword [@@rx2],eax |
xor ebx,ebx |
mov bl,byte [esi+2] ; point 3 |
shl bx,2 |
mov eax,dword [coord2d+bx] ;COPY 3 FOURANGLE POINT |
mov dword [@@rx3],eax |
xor bh,bh ; point 4 |
mov bl,byte [esi+3] |
shl bx,2 |
mov eax,dword [coord2d+bx] ;COPY 4 FOURANGLE POINT |
mov dword [@@rx4],eax |
mov ax,[@@ry1] |
sub ax,[@@ry3] |
mov bx,[@@rx2] |
sub bx,[@@rx1] |
imul bx |
shl edx,16 |
mov dx,ax |
push edx |
mov ax,[@@rx1] |
sub ax,[@@rx3] |
mov bx,[@@ry2] |
sub bx,[@@ry1] |
imul bx |
shl edx,16 |
mov dx,ax |
pop ebx |
sub ebx,edx ; normal_z = (y1-y3)*(x2-x1)-(x1-x3)*(y2-y1) |
or ebx,ebx |
jl dtf_next_face ; normal_z < 0 |
; FIRST PICE OF FOUR ANGLE |
; Set 3 triangel puts for texture ycoord*65536+xcoord |
mov dword [@@tex_x3],127*65536+127 ;3 point |
mov dword [@@tex_x2],0*65536+127 ;2 point |
mov dword [@@tex_x1],0*65536+0 ;1 point |
; Set texture bitmap offset |
mov [@@tex_off],texture |
; Set 3 triangel puts coordinates |
mov eax,dword [@@rx3] |
mov dword [@@x3],eax |
mov eax,dword [@@rx2] |
mov dword [@@x2],eax |
mov eax,dword [@@rx1] |
mov dword [@@x1],eax |
call textured_triangle |
; SECOND PICE OF FOUR ANGLE |
; Set 3 triangel puts for texture ycoord*65536+xcoord |
mov dword [@@tex_x3],127*65536+0 ;3 point |
mov dword [@@tex_x2],127*65536+127 ;2 point |
mov dword [@@tex_x1],0*65536+0 ;1 point |
; Set texture bitmap offset |
mov [@@tex_off],texture |
; Set 3 triangel puts coordinates |
mov eax,dword [@@rx4] |
mov dword [@@x3],eax |
mov eax,dword [@@rx3] |
mov dword [@@x2],eax |
mov eax,dword [@@rx1] |
mov dword [@@x1],eax |
call textured_triangle |
dtf_next_face: |
add esi,4 |
pop ecx |
dec ecx |
jnz dtf_loop |
ret |
;include tex3.asm Mikolaj Felix 15/5/2001 mfelix@polbox.com |
@@x1 dw 0 ;equ [bp+4] |
@@y1 dw 0 ;equ [bp+6] |
@@x2 dw 0 ;equ [bp+8] |
@@y2 dw 0 ;equ [bp+10] |
@@x3 dw 0 ;equ [bp+12] |
@@y3 dw 0 ;equ [bp+14] |
@@tex_off dd 0 ;equ [bp+16] |
@@tex_x1 dw 0 ;equ [bp+18] |
@@tex_y1 dw 0 ;equ [bp+20] |
@@tex_x2 dw 0 ;equ [bp+22] |
@@tex_y2 dw 0 ;equ [bp+24] |
@@tex_x3 dw 0 ;equ [bp+26] |
@@tex_y3 dw 0 ;equ [bp+28] |
@@dx12 dw 0 ;equ [bp-2] |
@@dx13 dw 0 ;equ [bp-4] |
@@dx23 dw 0 ;equ [bp-6] |
@@tex_dx12 dw 0 ;equ [bp-8] |
@@tex_dy12 dw 0 ;equ [bp-10] |
@@tex_dx13 dw 0 ;equ [bp-12] |
@@tex_dy13 dw 0 ;equ [bp-14] |
@@tex_dx23 dw 0 ;equ [bp-16] |
@@tex_dy23 dw 0 ;equ [bp-18] |
@@scan_x1 dw 0 ;equ [bp-20] |
@@scan_y1 dw 0 ;equ [bp-22] |
@@scan_x2 dw 0 ;equ [bp-24] |
@@scan_y2 dw 0 ;equ [bp-26] |
textured_triangle: |
mov ax,[@@y1] |
cmp ax,[@@y3] |
jb tt_check1 |
xchg ax,[@@y3] |
mov [@@y1],ax |
mov ax,[@@x1] |
xchg ax,[@@x3] |
mov [@@x1],ax |
mov ax,[@@tex_y1] |
xchg ax,[@@tex_y3] |
mov [@@tex_y1],ax |
mov ax,[@@tex_x1] |
xchg ax,[@@tex_x3] |
mov [@@tex_x1],ax |
tt_check1: |
mov ax,[@@y2] |
cmp ax,[@@y3] |
jb tt_check2 |
xchg ax,[@@y3] |
mov [@@y2],ax |
mov ax,[@@x2] |
xchg ax,[@@x3] |
mov [@@x2],ax |
mov ax,[@@tex_y2] |
xchg ax,[@@tex_y3] |
mov [@@tex_y2],ax |
mov ax,[@@tex_x2] |
xchg ax,[@@tex_x3] |
mov [@@tex_x2],ax |
tt_check2: |
mov ax,[@@y1] |
cmp ax,[@@y2] |
jb tt_check3 |
xchg ax,[@@y2] |
mov [@@y1],ax |
mov ax,[@@x1] |
xchg ax,[@@x2] |
mov [@@x1],ax |
mov ax,[@@tex_y1] |
xchg ax,[@@tex_y2] |
mov [@@tex_y1],ax |
mov ax,[@@tex_x1] |
xchg ax,[@@tex_x2] |
mov [@@tex_x1],ax |
tt_check3: |
mov bx,[@@y2] |
sub bx,[@@y1] |
jnz tt_dx12_make |
mov word [@@dx12],0 |
mov word [@@tex_dx12],0 |
mov word [@@tex_dy12],0 |
jmp tt_dx12_done |
tt_dx12_make: |
mov ax,[@@x2] |
sub ax,[@@x1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@dx12],ax ; dx12 = (x2-x1)/(y2-y1) |
mov ax,[@@tex_x2] |
sub ax,[@@tex_x1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@tex_dx12],ax ; tex_dx12 = (tex_x2-tex_x1)/(y2-y1) |
mov ax,[@@tex_y2] |
sub ax,[@@tex_y1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@tex_dy12],ax ; tex_dy12 = (tex_y2-tex_y1)/(y2-y1) |
tt_dx12_done: |
mov bx,[@@y3] |
sub bx,[@@y1] |
jnz tt_dx13_make |
mov word [@@dx13],0 |
mov word [@@tex_dx13],0 |
mov word [@@tex_dy13],0 |
jmp tt_dx13_done |
tt_dx13_make: |
mov ax,[@@x3] |
sub ax,[@@x1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@dx13],ax ; dx13 = (x3-x1)/(y3-y1) |
mov ax,[@@tex_x3] |
sub ax,[@@tex_x1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@tex_dx13],ax ; tex_dx13 = (tex_x3-tex_x1)/(y3-y1) |
mov ax,[@@tex_y3] |
sub ax,[@@tex_y1] |
shl ax,7 |
cwd |
idiv bx |
mov [@@tex_dy13],ax ; tex_dy13 = (tex_y3-tex_x1)/(y3-y1) |
tt_dx13_done: |
mov bx,[@@y3] |
sub bx,[@@y2] |
jnz tt_dx23_make |
mov word [@@dx23],0 |
mov word [@@tex_dx23],0 |
mov word [@@tex_dy23],0 |
jmp tt_dx23_done |
tt_dx23_make: |
mov ax,[@@x3] |
sub ax,[@@x2] |
shl ax,7 |
cwd |
idiv bx |
mov [@@dx23],ax ; dx23 = (x3-x2)/(y3-y2) |
mov ax,[@@tex_x3] |
sub ax,[@@tex_x2] |
shl ax,7 |
cwd |
idiv bx |
mov [@@tex_dx23],ax ; tex_dx23 = (tex_x3-tex_x2)/(y3-y2) |
mov ax,[@@tex_y3] |
sub ax,[@@tex_y2] |
shl ax,7 |
cwd |
idiv bx |
mov [@@tex_dy23],ax ; tex_dy23 = (tex_y3-tex_y2)/(y3-y2) |
tt_dx23_done: |
mov ax,[@@x1] |
shl ax,7 |
mov bx,ax |
mov cx,[@@y1] |
mov dx,[@@tex_x1] |
shl dx,7 |
mov [@@scan_x1],dx |
mov [@@scan_x2],dx |
mov dx,[@@tex_y1] |
shl dx,7 |
mov [@@scan_y1],dx |
mov [@@scan_y2],dx |
tt_loop1: |
pushad |
; push ax |
; push bx |
; push cx |
mov dx,[@@scan_y2] |
shr dx,7 |
mov [@@tex_ly2],dx ;push dx |
mov dx,[@@scan_x2] |
shr dx,7 |
mov [@@tex_lx2],dx ;push dx |
mov dx,[@@scan_y1] |
shr dx,7 |
mov [@@tex_ly1],dx ;push dx |
mov dx,[@@scan_x1] |
shr dx,7 |
mov [@@tex_lx1],dx ;push dx |
mov ebp,dword [@@tex_off] ;push word ptr @@tex_off |
mov [@@tex_loff],ebp |
mov [@@ly],cx ;push cx |
mov dx,bx |
shr dx,7 |
mov [@@lx2],dx ;push dx |
mov dx,ax |
shr dx,7 |
mov [@@lx1],dx ; push dx |
call textured_horizontal_line |
; pop cx |
; pop bx |
; pop ax |
popad |
mov dx,[@@tex_dx13] |
add [@@scan_x1],dx |
mov dx,[@@tex_dx12] |
add [@@scan_x2],dx |
mov dx,[@@tex_dy13] |
add [@@scan_y1],dx |
mov dx,[@@tex_dy12] |
add [@@scan_y2],dx |
add ax,[@@dx13] |
add bx,[@@dx12] |
inc cx |
cmp cx,[@@y2] |
jb tt_loop1 |
mov bx,[@@x2] |
shl bx,7 |
mov cx,[@@y2] |
mov dx,[@@tex_x2] |
shl dx,7 |
mov [@@scan_x2],dx |
mov dx,[@@tex_y2] |
shl dx,7 |
mov [@@scan_y2],dx |
tt_loop2: |
pushad |
; push ax |
; push bx |
; push cx |
mov dx,[@@scan_y2] |
shr dx,7 |
mov [@@tex_ly2],dx ;push dx |
mov dx,[@@scan_x2] |
shr dx,7 |
mov [@@tex_lx2],dx ;push dx |
mov dx,[@@scan_y1] |
shr dx,7 |
mov [@@tex_ly1],dx ;push dx |
mov dx,[@@scan_x1] |
shr dx,7 |
mov [@@tex_lx1],dx ;push dx |
mov ebp,dword [@@tex_off] ;push word ptr @@tex_off |
mov [@@tex_loff],ebp |
mov [@@ly],cx ;push cx |
mov dx,bx |
shr dx,7 |
mov [@@lx2],dx ;push dx |
mov dx,ax |
shr dx,7 |
mov [@@lx1],dx ; push dx |
call textured_horizontal_line |
; pop cx |
; pop bx |
; pop ax |
popad |
mov dx,[@@tex_dx13] |
add [@@scan_x1],dx |
mov dx,[@@tex_dx23] |
add [@@scan_x2],dx |
mov dx,[@@tex_dy13] |
add [@@scan_y1],dx |
mov dx,[@@tex_dy23] |
add [@@scan_y2],dx |
add ax,[@@dx13] |
add bx,[@@dx23] |
inc cx |
cmp cx,[@@y3] |
jb tt_loop2 |
ret |
@@lx1 dw 0 ;equ [bp+4] |
@@lx2 dw 0 ;equ [bp+6] |
@@ly dw 0 ;equ [bp+8] |
@@tex_loff dd 0 ;equ [bp+10] |
@@tex_lx1 dw 0 ;equ [bp+12] |
@@tex_ly1 dw 0 ;equ [bp+14] |
@@tex_lx2 dw 0 ;equ [bp+16] |
@@tex_ly2 dw 0 ;equ [bp+18] |
@@tex_ldx dw 0 ;equ [bp-2] |
@@tex_ldy dw 0 ;equ [bp-4] |
textured_horizontal_line: |
mov ax,[@@lx1] |
cmp ax,[@@lx2] |
je thl_quit |
jb thl_ok |
xchg ax,[@@lx2] |
mov [@@lx1],ax |
mov ax,[@@tex_lx1] |
xchg ax,[@@tex_lx2] |
mov [@@tex_lx1],ax |
mov ax,[@@tex_ly1] |
xchg ax,[@@tex_ly2] |
mov [@@tex_ly1],ax |
thl_ok: |
; Fast method |
; mov edi,0 |
; mov di,[@@ly] ;edi = calculating start of line |
; mov ax,di |
; shl di,6 ;ly*64 |
; shl ax,8 ;ly*256 |
; add di,ax ;di = (ly*64)+(ly*256) |
; add di,[@@lx1] ;di = ly*320+lx1 |
; mov eax,edi |
; shl eax,1 |
; add edi,eax |
; add edi,scrbuf |
; Uneversal method |
movsx edi,[@@ly] |
mov eax,800 ;di = ly*320+lx1 |
mul edi |
movsx ebx,[@@lx1] |
add eax,ebx ;[@@lx1] |
mov edi,3 |
mul edi |
mov edi,eax |
add edi,scrbuf |
mov cx,[@@lx2] |
sub cx,[@@lx1] |
mov ax,[@@tex_lx2] |
sub ax,[@@tex_lx1] |
shl ax,7 |
cwd |
idiv cx |
mov [@@tex_ldx],ax ; tex_dx = (tex_x2-tex_x1)/(x2-x1) |
mov ax,[@@tex_ly2] |
sub ax,[@@tex_ly1] |
shl ax,7 |
cwd |
idiv cx |
mov [@@tex_ldy],ax ; tex_dy = (tex_y2-tex_y1)/(x2-x1) |
cld |
inc cx |
mov ax,[@@tex_lx1] |
shl ax,7 |
mov bx,[@@tex_ly1] |
shl bx,7 |
thl_loop: |
mov dx,ax |
push bx |
and bx,0ff80h |
shr ax,7 |
add bx,ax |
mov ebp,0 |
mov bp,bx |
mov eax,ebp |
shl eax,1 |
add ebp,eax |
add ebp,[@@tex_loff] |
mov al,byte [ebp+2] |
stosb |
mov al,byte [ebp+1] |
stosb |
mov al,byte [ebp] |
stosb |
pop bx |
mov ax,dx |
add ax,[@@tex_ldx] |
add bx,[@@tex_ldy] |
dec cx |
jnz thl_loop |
thl_quit: |
ret |
;include math3d_2.asm |
; Mikolaj Felix 20/06/2001 |
; mfelix@polbox.com |
;------------------------------------------------------------ |
; ds:si - offset to angles (int) |
; ds:di - offset to array of 3d points |
; cx - number of points |
;------------------------------------------------------------ |
@@sin_x dd 0 ;equ dword ptr [bp-4] |
@@cos_x dd 0 ;equ dword ptr [bp-8] |
@@sin_y dd 0 ;equ dword ptr [bp-12] |
@@cos_y dd 0 ;equ dword ptr [bp-16] |
@@sin_z dd 0 ;equ dword ptr [bp-20] |
@@cos_z dd 0 ;equ dword ptr [bp-24] |
@@x equ dword [edi] |
@@y equ dword [edi+4] |
@@z equ dword [edi+8] |
rotate_points: |
push edi |
mov edi,@@sin_x |
mov edx,3 |
rp_sin_cos: |
mov bx,word [esi] |
and bx,MAX_DEGS-1 |
shl bx,2 |
mov eax,dword [sintab+bx] |
mov dword [edi],eax |
mov eax,dword [costab+bx] |
mov dword [edi+4],eax |
add edi,8 |
add esi,2 |
dec edx |
jnz rp_sin_cos |
pop edi |
rp_rotate: |
fld @@y |
fmul [@@cos_x] |
fld @@z |
fmul [@@sin_x] |
fsubp st1,st |
fld @@y |
fxch st1 |
fstp @@y ; Yrotated = Cos (A)*Y - Sin (A)*Z |
fmul [@@sin_x] |
fld @@z |
fmul [@@cos_x] |
faddp st1,st |
fstp @@z ; Zrotated = Sin (A)*Y + Cos (A)*Z |
fld @@x |
fmul [@@cos_y] |
fld @@z |
fmul [@@sin_y] |
fsubp st1,st |
fld @@x |
fxch st1 |
fstp @@x ; Xrotated = Cos (A)*X - Sin (A)*Z |
fmul [@@sin_y] |
fld @@z |
fmul [@@cos_y] |
faddp st1,st |
fstp @@z ; Zrotated = Sin (A)*X + Cos (A)*Z |
fld @@x |
fmul [@@cos_z] |
fld @@y |
fmul [@@sin_z] |
fsubp st1,st |
fld @@x |
fxch st1 |
fstp @@x ; Xrotated = Cos (A)*X - Sin (A)*Y |
fmul [@@sin_z] |
fld @@y |
fmul [@@cos_z] |
faddp st1,st |
fstp @@y ; Yrotated = Sin (A)*X + Cos (A)*Y |
add edi,12 |
dec ecx |
jnz rp_rotate |
ret |
;------------------------------------------------------------ |
; ds:si - offset to array of 3d points |
; ds:di - offset to 2d points |
; cx - number of points |
;------------------------------------------------------------ |
translate_points: |
fld dword [esi+8] |
fadd [perspective] |
fld dword [esi] |
fmul [perspective] |
fdiv st,st1 |
fadd [correct_x] |
fistp word [edi] ; x2d = (x*persp)/(z+persp)+correct_x |
fld dword [esi+4] |
fmul [perspective] |
fdivrp st1,st |
fadd [correct_y] |
fistp word [edi+2] ; y2d = (y*persp)/(z+persp)+correct_y |
add esi,12 |
add edi,4 |
dec ecx |
jnz translate_points |
ret |
; initalize SIN&COS table |
@@temp1 dd 0 ;dword ptr [bp-4] |
@@temp2 dd 0 ;dword ptr [bp-8] |
init_sincos: |
mov [@@temp1],0 |
fldpi |
mov [@@temp2],MAX_DEGS/2 |
fidiv [@@temp2] |
fstp [@@temp2] |
xor edi,edi |
mov ecx,MAX_DEGS |
isc_loop: |
fld [@@temp1] |
fld st0 |
fld st0 |
fsin |
fstp dword [sintab+edi] |
fcos |
fstp dword [costab+edi] |
fadd [@@temp2] |
fstp [@@temp1] |
add edi,4 |
dec ecx |
jnz isc_loop |
ret |
perspective dd 256.0 |
correct_x dd 400.0 |
correct_y dd 300.0 |
angle_x dw 0 |
angle_y dw 0 |
angle_z dw 0 |
file_texture: |
file 'texture.raw' |
cube dw -50,-50,50, 50,-50,50, 50,50,50, -50,50,50 |
dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50 |
link db 0,1,2,3, 5,4,7,6, 1,5,6,2, 4,0,3,7, 4,5,1,0, 3,2,6,7 |
sintab: |
rd MAX_DEGS |
costab: |
rd MAX_DEGS |
cube_rotated: |
rd MAX_POINTS*3 |
coord2d: |
rw MAX_POINTS*2 |
texture: |
rb 128*128*3 |
scrbuf: |
I_END: |
/programs/3dtcub10/trunk/build_en.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix en >lang.inc |
@fasm 3dtcub10.asm 3dtcub10 |
@pause |
/programs/3dtcub10/trunk/build_ru.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix ru >lang.inc |
@fasm 3dtcub10.asm 3dtcub10 |
@pause |
/programs/3dtcub10/trunk/texture.raw |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/ac97wav/trunk/ac97.inc |
---|
0,0 → 1,288 |
; Vendor ids |
INTEL_VID = 0x8086 |
SIS_VID = 0x1039 |
NVIDIA_VID = 0x10DE |
AMD_VID = 0x1022 |
; Device ids |
ICH_DID = 0x2415 |
ICH0_DID = 0x2425 |
ICH2_DID = 0x2445 |
ICH3_DID = 0x2485 |
ICH4_DID = 0x24C5 |
ICH5_DID = 0x24D5 |
MX440_DID = 0x7195 |
SI7012_DID = 0x7012 |
NFORCE_DID = 0x01B1 |
NFORCE2_DID = 0x006A |
AMD8111_DID = 0x764D |
AMD768_DID = 0x7445 |
NAMBAR_REG = 0x10 ; native audio mixer BAR |
NAM_SIZE = 256 ; 256 bytes required. |
NABMBAR_REG = 0x14 ; native audio bus mastering BAR |
NABM_SIZE = 64 ; 64 bytes |
IRQ_REG = 0x3c ; IRQ holder for PCI |
INT_REG = 0x3d ; INT pin |
ICH4_CFG_REG = 0x41 ; ICH4 config register |
; BUS master registers, accessed via NABMBAR+offset |
; ICH supports 3 different types of register sets for three types of things |
; it can do, thus: |
; |
; PCM in (for recording) aka PI |
; PCM out (for playback) aka PO |
; MIC in (for recording) aka MC |
PI_BDBAR_REG = 0 ; PCM in buffer descriptor BAR |
PO_BDBAR_REG = 10h ; PCM out buffer descriptor BAR |
MC_BDBAR_REG = 20h ; MIC in buffer descriptor BAR |
; each buffer descriptor BAR holds a pointer which has entries to the buffer |
; contents of the .WAV file we're going to play. Each entry is 8 bytes long |
; (more on that later) and can contain 32 entries total, so each BAR is |
; 256 bytes in length, thus: |
BDL_SIZE = 32*8 ; Buffer Descriptor List size |
INDEX_MASK = 31 ; indexes must be 0-31 |
PI_CIV_REG = 4 ; PCM in current Index value (RO) |
PO_CIV_REG = 14h ; PCM out current Index value (RO) |
MC_CIV_REG = 24h ; MIC in current Index value (RO) |
;8bit read only |
; each current index value is simply a pointer showing us which buffer |
; (0-31) the codec is currently processing. Once this counter hits 31, it |
; wraps back to 0. |
; this can be handy to know, as once it hits 31, we're almost out of data to |
; play back or room to record! |
PI_LVI_REG = 5 ; PCM in Last Valid Index |
PO_LVI_REG = 15h ; PCM out Last Valid Index |
MC_LVI_REG = 25h ; MIC in Last Valid Index |
;8bit read/write |
; The Last Valid Index is a number (0-31) to let the codec know what buffer |
; number to stop on after processing. It could be very nasty to play audio |
; from buffers that aren't filled with the audio we want to play. |
PI_SR_REG = 6 ; PCM in Status register |
PO_SR_REG = 16h ; PCM out Status register |
MC_SR_REG = 26h ; MIC in Status register |
;16bit read/write |
; status registers. Bitfields follow: |
FIFO_ERR = BIT4 ; FIFO Over/Underrun W1TC. |
BCIS = BIT3 ; buffer completion interrupt status. |
; Set whenever the last sample in ANY |
; buffer is finished. Bit is only |
; set when the Interrupt on Complete |
; (BIT4 of control reg) is set. |
LVBCI = BIT2 ; Set whenever the codec has processed |
; the last buffer in the buffer list. |
; Will fire an interrupt if IOC bit is |
; set. Probably set after the last |
; sample in the last buffer is |
; processed. W1TC |
CELV = BIT1 ; Current buffer == last valid. |
; Bit is RO and remains set until LVI is |
; cleared. Probably set up the start |
; of processing for the last buffer. |
DCH = BIT0 ; DMA controller halted. |
; set whenever audio stream is stopped |
; or something else goes wrong. |
PI_PICB_REG = 8 ; PCM in position in current buffer(RO) |
PO_PICB_REG = 18h ; PCM out position in current buffer(RO) |
MC_PICB_REG = 28h ; MIC in position in current buffer (RO) |
;16bit read only |
; position in current buffer regs show the number of dwords left to be |
; processed in the current buffer. |
; |
PI_PIV_REG = 0ah ; PCM in Prefected index value |
PO_PIV_REG = 1ah ; PCM out Prefected index value |
MC_PIV_REG = 2ah ; MIC in Prefected index value |
;8bit, read only |
; Prefetched index value register. |
; tells which buffer number (0-31) has be prefetched. I'd imagine this |
; value follows the current index value fairly closely. (CIV+1) |
; |
PI_CR_REG = 0bh ; PCM in Control Register |
PO_CR_REG = 1bh ; PCM out Control Register |
MC_CR_REG = 2bh ; MIC in Control Register |
; 8bit |
; Control register *MUST* only be accessed as an 8bit value. |
; Control register. See bitfields below. |
; |
IOCE = BIT4 ; interrupt on complete enable. |
; set this bit if you want an intrtpt |
; to fire whenever LVBCI is set. |
FEIFE = BIT3 ; set if you want an interrupt to fire |
; whenever there is a FIFO (over or |
; under) error. |
LVBIE = BIT2 ; last valid buffer interrupt enable. |
; set if you want an interrupt to fire |
; whenever the completion of the last |
; valid buffer. |
RR = BIT1 ; reset registers. Nukes all regs |
; except bits 4:2 of this register. |
; Only set this bit if BIT 0 is 0 |
RPBM = BIT0 ; Run/Pause |
; set this bit to start the codec! |
GLOB_CNT_REG = 2ch ; Global control register |
SEC_RES_EN = BIT5 ; secondary codec resume event |
; interrupt enable. Not used here. |
PRI_RES_EN = BIT4 ; ditto for primary. Not used here. |
ACLINK_OFF = BIT3 ; Turn off the AC97 link |
ACWARM_RESET = BIT2 ; Awaken the AC97 link from sleep. |
; registers preserved, bit self clears |
ACCOLD_RESET = BIT1 ; Reset everything in the AC97 and |
; reset all registers. Not self clearin |
;g |
GPIIE = BIT0 ; GPI Interrupt enable. |
; set if you want an interrupt to |
; fire upon ANY of the bits in the |
; GPI (general pursose inputs?) not used |
;. |
GLOB_STS_REG = 30h ; Global Status register (RO) |
MD3 = BIT17 ; modem powerdown status (yawn) |
AD3 = BIT16 ; Audio powerdown status (yawn) |
RD_COMPLETE_STS = BIT15 ; Codec read timed out. 0=normal |
BIT3SLOT12 = BIT14 ; shadowed status of bit 3 in slot 12 |
BIT2SLOT12 = BIT13 ; shadowed status of bit 2 in slot 12 |
BIT1SLOT12 = BIT12 ; shadowed status of bit 1 in slot 12 |
SEC_RESUME_STS = BIT11 ; secondary codec has resumed (and irqed) |
PRI_RESUME_STS = BIT10 ; primary codec has resumed (and irqed) |
SEC_CODEC_RDY = BIT9 ; secondary codec is ready for action |
PRI_CODEC_RDY = BIT8 ; Primary codec is ready for action |
; software must check these bits before |
; starting the codec! |
MIC_IN_IRQ = BIT7 ; MIC in caused an interrupt |
PCM_OUT_IRQ = BIT6 ; One of the PCM out channels IRQed |
PCM_IN_IRQ = BIT5 ; One of the PCM in channels IRQed |
MODEM_OUT_IRQ = BIT2 ; modem out channel IRQed |
MODEM_IN_IRQ = BIT1 ; modem in channel IRQed |
GPI_STS_CHANGE = BIT0 ; set whenever GPI's have changed. |
; BIT0 of slot 12 also reflects this. |
ACC_SEMA_REG = 34h ; Codec write semiphore register |
CODEC_BUSY = BIT0 ; codec register I/O is happening |
; self clearing |
; |
; Buffer Descriptors List |
; As stated earlier, each buffer descriptor list is a set of (up to) 32 |
; descriptors, each 8 bytes in length. Bytes 0-3 of a descriptor entry point |
; to a chunk of memory to either play from or record to. Bytes 4-7 of an |
; entry describe various control things detailed below. |
; |
; Buffer pointers must always be aligned on a Dword boundry. |
; |
; |
IOC = BIT31 ; Fire an interrupt whenever this |
; buffer is complete. |
BUP = BIT30 ; Buffer Underrun Policy. |
; if this buffer is the last buffer |
; in a playback, fill the remaining |
; samples with 0 (silence) or not. |
; It's a good idea to set this to 1 |
; for the last buffer in playback, |
; otherwise you're likely to get a lot |
; of noise at the end of the sound. |
; |
; Bits 15:0 contain the length of the buffer, in number of samples, which |
; are 16 bits each, coupled in left and right pairs, or 32bits each. |
; Luckily for us, that's the same format as .wav files. |
; |
; A value of FFFF is 65536 samples. Running at 44.1Khz, that's just about |
; 1.5 seconds of sample time. FFFF * 32bits is 1FFFFh bytes or 128k of data. |
; |
; A value of 0 in these bits means play no samples. |
; |
;***************************************************************************** |
;* AC97 Codec registers include (based on Jeff Leyda AC97 wav player SDK :-) |
;***************************************************************************** |
; Not all codecs are created =al. Refer to the spec for your specific codec. |
; All registers are 16bits wide. Access to codec registers over the AC97 link |
; is defined by the OEM. |
; Secondary codec's are accessed by ORing in BIT7 of all register accesses. |
; each codec/mixer register is 16bits |
CODEC_RESET_REG = 00 ; reset codec |
CODEC_MASTER_VOL_REG = 02 ; master volume |
CODEC_HP_VOL_REG = 04 ; headphone volume |
CODEC_MASTER_MONO_VOL_REG = 06 ; master mono volume |
CODEC_MASTER_TONE_REG = 08 ; master tone (R+L) |
CODEC_PCBEEP_VOL_REG = 0ah ; PC beep volume |
CODEC_PHONE_VOL_REG = 0ch ; phone volume |
CODEC_MIC_VOL_REG = 0eh ; MIC volume |
CODEC_LINE_IN_VOL_REG = 10h ; line input volume |
CODEC_CD_VOL_REG = 12h ; CD volume |
CODEC_VID_VOL_REG = 14h ; video volume |
CODEC_AUX_VOL_REG = 16h ; aux volume |
CODEC_PCM_OUT_REG = 18h ; PCM output volume |
CODEC_RECORD_SELECT_REG = 1ah ; record select input |
CODEC_RECORD_VOL_REG = 1ch ; record volume |
CODEC_RECORD_MIC_VOL_REG = 1eh ; record mic volume |
CODEC_GP_REG = 20h ; general purpose |
CODEC_3D_CONTROL_REG = 22h ; 3D control |
; 24h is reserved |
CODEC_POWER_CTRL_REG = 26h ; powerdown control |
CODEC_EXT_AUDIO_REG = 28h ; extended audio |
CODEC_EXT_AUDIO_CTRL_REG = 2ah ; extended audio control |
CODEC_PCM_FRONT_DACRATE_REG = 2ch ; PCM out sample rate |
CODEC_PCM_SURND_DACRATE_REG = 2eh ; surround sound sample rate |
CODEC_PCM_LFE_DACRATE_REG = 30h ; LFE sample rate |
CODEC_LR_ADCRATE_REG = 32h ; PCM in sample rate |
CODEC_MIC_ADCRATE_REG = 34h ; mic in sample rate |
; registers 36-7a are reserved on the ICH |
CODEC_VENDORID1_REG = 7ch ; codec vendor ID 1 |
CODEC_VENDORID2_REG = 7eh ; codec vendor ID 2 |
; When 2 codecs are present in the system, use BIT7 to access the 2nd |
; set of registers, ie 80h-feh |
SECONDARY_CODEC = BIT7 ; 80-8f registers for 2nda |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/ac97wav/trunk/ac97wav.asm |
---|
0,0 → 1,1084 |
;--------------------------------------------------------------------- |
; |
; MenuetOS AC97 WAV Player |
; |
; 0.03 November 10, 2004 doesn't halt if file not found |
; 0.04 November 11, 2004 better positioning (with mouse) |
; 0.05 November 14, 2004 internals clean up |
; fixed cutting sound at the edges |
; 0.06 November 17, 2004 fixed many bugs |
; 0.07 Nov 20, 2004 deactivates text box when 'play' pressed |
; stops playing before closing a window |
; 0.08 Nov 24, 2004 added support for 8bit and mono modes |
; +variable rate for some chipsets |
; |
; Use [flat assembler 1.56] to compile. |
; |
;--------------------------------------------------------------------- |
use32 ; turn on 32 bit mode |
org 0x0 ; the program is placed at 0 offset |
db 'MENUET01' ; 8-byte identifier of MenuetOS application |
dd 0x01 ; header version (always 1) |
dd START ; address of the beginning of the code |
dd IMAGE_END ; size of the program's image |
dd MEMORY_END ; how much memory does it need |
dd STACK_P ; a pointer to the top of the stack |
dd textbox_string |
; dd 0x0 ; address of buffer for parameters (not used) |
dd 0x0 ; reserved |
;--------------------------------------------------------------------- |
include "lang.inc" |
include "macros.inc" ; standart macros & constants |
include "meosfunc.inc" ; MenuetOS API functions names |
include "debug.inc" ; printing to debug board |
include "constant.inc" ; BIT?? constants |
include "ac97.inc" ; AC'97 constants |
include "pci.inc" ; PCI interface |
include "codec.inc" ; functions for configuring codec |
include "frontend.inc" ; main window |
;--------------------------------------------------------------------- |
; Uncomment these strings if you don't want to receive debug messages: |
; macro dps str {} ; dps prints a string without CRLF |
; macro dpd num {} ; prints unsigned decimal number |
; macro pregs {} ; outputs EAX, EBX, ECX, EDX |
; macro newline {} ; CRLF |
; macro print str {} ; output a string with CRLF |
; macro dph arg {} ; print hex number |
;--------------------------------------------------------------------- |
;macro device id, addr { dd id, addr } |
macro devices [id, str] |
{ |
common |
label supported_devices dword |
forward |
local string |
dd id |
dd string |
forward |
string db str |
db 0 |
} |
devices \ |
(ICH_DID shl 16) + INTEL_VID, "ICH" ,\ |
(ICH0_DID shl 16) + INTEL_VID, "ICH0" ,\ |
(ICH2_DID shl 16) + INTEL_VID, "ICH2" ,\ |
(ICH3_DID shl 16) + INTEL_VID, "ICH2" ,\ |
(ICH4_DID shl 16) + INTEL_VID, "ICH4" ,\ |
(ICH5_DID shl 16) + INTEL_VID, "ICH5" ,\ |
(MX440_DID shl 16) + INTEL_VID, "440MX" ,\ |
(SI7012_DID shl 16) + SIS_VID, "SI7012" ,\ |
(NFORCE_DID shl 16) + NVIDIA_VID, "NForce" ,\ |
(NFORCE2_DID shl 16) + NVIDIA_VID, "NForce2",\ |
(AMD8111_DID shl 16) + AMD_VID, "AMD8111",\ |
(AMD768_DID shl 16) + AMD_VID, "AMD768" |
dd 0 |
;--------------------------------------------------------------------- |
;--- MAIN PROGRAM -------------------------------------------------- |
;--------------------------------------------------------------------- |
START: |
; Print PCI version (for example, 2.16) |
; mcall MF_PCI, 0 |
; mov bl, al |
; movzx eax, ah |
; dps "PCI version: " |
; dpd eax |
; movzx eax, bl |
; dpd eax |
; newline |
; Check PCI access mechanism (must be 1 or 2) |
mcall MF_PCI, 2 |
dec al |
cmp al, 1 |
jna @f |
print "Error: cannot access PCI bus." |
jmp exit |
; dps "PCI returned " |
; movzx eax, al |
; dpd eax |
; newline |
@@: |
; Get last bus & then check all buses & devices |
mcall MF_PCI, 1 |
mov [lastbus], al |
; looking for a compatible device |
mov [bus], -1 |
.next_bus: |
inc [bus] |
mov al, [lastbus] |
cmp al, [bus] |
jb .device_not_found |
mov [devfn], 0 |
.next_devfn: |
mov cl, 0 |
call pciRegRead32 |
mov edi, supported_devices |
@@: |
mov ebx, [edi] |
test ebx, ebx |
jz @f |
cmp eax, ebx |
jnz .skip |
add edi, 4 |
mov [device_id], eax |
mov edx, [edi] |
call debug_outstr |
jmp proceed |
.skip: |
add edi, 8 |
jmp @b |
@@: |
inc [devfn] |
cmp [devfn], 255 |
jb .next_devfn |
jmp .next_bus |
.device_not_found: |
print "Could not find Intel AC'97 compatible codec!" |
print "1) Check if it's enabled in BIOS." |
print "2) Check if your device is included in the device list." |
jmp exit |
proceed: |
print " integrated AC97 audio codec detected." |
mov eax, [device_id] |
cmp eax, (ICH4_DID shl 16) + INTEL_VID |
je .newich |
cmp eax, (ICH5_DID shl 16) + INTEL_VID |
jne .nonewich |
.newich: |
mov [AC97ICH4], 1 |
.nonewich: |
cmp eax, (SI7012_DID shl 16) + SIS_VID |
jne @f |
mov [SI7012], 1 |
@@: |
;--------------------------------------------------------------------- |
; Get NAMBAR register base port address & save it |
mov cl, NAMBAR_REG |
call pciRegRead16 |
and eax, 0xFFFE |
mov [NAMBAR], ax |
test eax, eax |
jnz .mixer_base_ok |
print "Error: Intel ICH based AC97 audio codec disabled in BIOS!" |
jmp exit |
.mixer_base_ok: |
dps "NAMBAR: " |
dph eax |
; Get NABMBAR & save it |
mov cl, NABMBAR_REG |
call pciRegRead16 |
and eax, 0xFFC0 |
mov [NABMBAR], ax |
test eax, eax |
jnz .bm_base_ok |
print "Error: Intel ICH based AC97 audio codec disabled in BIOS!" |
jmp exit |
.bm_base_ok: |
dps " NABMBAR: " |
dph eax |
newline |
;--------------------------------------------------------------------- |
; Get IRQ (not used) |
mov cl, IRQ_REG |
call pciRegRead8 |
mov [AC97IRQ], al |
; Get Interrupt pin (not used) |
mov cl, INT_REG |
call pciRegRead8 |
mov [AC97INT], al |
; AC97ICH4 should work then... |
cmp [AC97ICH4], 1 |
jne .skip_ich4_init |
mov cl, ICH4_CFG_REG ; 0x41 |
call pciRegRead8 |
or al, 0x1 |
mov dl, al |
call pciRegWrite8 |
mov cl, 0x54 |
call pciRegRead16 |
and eax, 0xFFFF |
dps "Power Control & Status: " |
dph eax |
newline |
.skip_ich4_init: |
;--------------------------------------------------------------------- |
mov cl, PCI_CMD_REG |
call pciRegRead16 ; read PCI command register |
mov dx, ax |
or dx, IO_ENA+BM_ENA+BIT10 ; enable IO and bus master + disable |
; interrupts |
call pciRegWrite16 |
;--------------------------------------------------------------------- |
print "Enabling access to ports..." |
movzx ecx, [NAMBAR] |
mov edx, ecx |
add edx, NAM_SIZE |
mcall MF_PORTS, PRT_RESERVE |
test eax, eax |
jz @f |
print "Error: couldn't enable access to ports" |
jmp exit |
@@: |
movzx ecx, [NABMBAR] |
mov edx, ecx |
add edx, NABM_SIZE |
mcall MF_PORTS, PRT_RESERVE |
test eax, eax |
jz @f |
print "Error: couldn't enable access to ports" |
jmp exit |
@@: |
;--------------------------------------------------------------------- |
; setup the Codec |
mov eax, 48000 |
call codecConfig ; unmute codec, set rates. |
test eax, eax |
jnz @f |
print "Error: cannot initialize AC97 device." |
jmp fpexit |
@@: |
print "Congrutalations! Your device has been initialized properly!" |
call print_info |
;--------------------------------------------------------------------- |
; register reset the DMA engine. |
mov edx, PO_CR_REG ; PCM out control register |
mov al, RR ; reset |
call NABMBAR_write_byte |
;start fix for MM (1) |
mcall MF_INTERNAL_SERVICES,ALLOC_PHYS_MEM,120*1024 |
test eax,eax |
jz no_phys_buffers ;not enough memory |
mov [phys_wav_buffer1],eax |
add eax,60*1024 |
mov [phys_wav_buffer2],eax |
mcall MF_INTERNAL_SERVICES,ALLOC_PHYS_MEM,32*8 |
test eax,eax |
jnz @f |
mcall MF_INTERNAL_SERVICES,FREE_PHYS_MEM,[phys_wav_buffer1] |
jmp no_phys_buffers |
@@: |
mov [phys_bdl_buffer],eax |
;end fix for MM (1) |
; create Buffer Descriptors List |
call prepare_BDL |
; open player's window |
mcall MF_THREAD, THR_CREATE, thread, thread_stack |
; wait for command |
.new_check: |
cmp [status], ST_PLAY |
jne @f |
call play |
@@: |
cmp [status], ST_STOP |
jne @f |
call stop |
@@: |
cmp [status], ST_EXIT |
je stopexit |
mcall MF_DELAY, 10 |
jmp .new_check |
stopexit: |
call stop |
fpexit: |
; free ports |
movzx ecx, [NAMBAR] |
mov edx, ecx |
add edx, NAM_SIZE |
mcall MF_PORTS, PRT_FREE |
movzx ecx, [NABMBAR] |
mov edx, ecx |
add edx, NABM_SIZE |
mcall MF_PORTS, PRT_FREE |
;--------------------------------------------------------------------- |
;start fix for MM (2) |
mcall MF_INTERNAL_SERVICES,FREE_PHYS_MEM,[phys_bdl_buffer] |
mcall MF_INTERNAL_SERVICES,FREE_PHYS_MEM,[phys_wav_buffer1] |
;end fix for MM (2) |
exit: |
mcall MF_EXIT |
no_phys_buffers: |
print "allocation of physical buffers failed" |
jmp exit |
;--------------------------------------------------------------------- |
;--- FUNCTIONS ----------------------------------------------------- |
;--------------------------------------------------------------------- |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; prepare_BDL - initializes BUFFER DESCRIPTORS LIST |
prepare_BDL: |
mov ecx, 32 / 2 ; make 32 entries in BDL |
mov edi, BDL_BUFFER |
; call get_my_address |
mov ebx, 30*1024 |
cmp [SI7012], 1 |
jne @f |
add ebx, ebx |
@@: |
; set buf. desc. 0 to start of data file in memory |
push eax |
; add eax, WAV_BUFFER1 |
;start fix for MM (6) |
mov eax,[phys_wav_buffer1] |
;end fix for MM (6) |
stosd |
; set length to 60k samples. 1 sample is 16 bit or 2 bytes. |
mov eax, ebx ;60*1024 ; number of samples |
or eax, BUP |
stosd |
mov eax, [esp] |
; add eax, WAV_BUFFER2 |
;start fix for MM (7) |
mov eax,[phys_wav_buffer2] |
;end fix for MM (7) |
stosd |
mov eax, ebx ;60*1024 |
or eax, BUP |
stosd |
pop eax |
loop @b |
; tell the DMA engine where to find our list of Buffer Descriptors. |
; eax = base addr! |
;start fix for MM (3) |
;copy to physical memory |
mcall MF_INTERNAL_SERVICES,SET_PHYS_BUFFER,[phys_bdl_buffer],BDL_BUFFER,32*8 |
;physical address of bdl |
mov eax,[phys_bdl_buffer] |
;end fix for MM (3) |
mov edx, PO_BDBAR_REG |
; add eax, BDL_BUFFER |
call NABMBAR_write_dword |
ret |
;--------------------------------------------------------------------- |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; stop - stops current music |
;; in: nothing |
;; out: nothing |
stop: |
; print "STOP!" |
push eax edx |
mcall MF_DELAY, 10 |
mov edx, PO_CR_REG |
mov al, 0 |
call NABMBAR_write_byte |
cmp [status], ST_STOP |
jne .exit |
mov [status], ST_DONE |
.exit: |
pop edx eax |
ret |
;--------------------------------------------------------------------- |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; play - plays wav file! |
;; in: nothing |
;; out: nothing (but sound :) !corrupts registers! |
play: |
; at first, reset file |
mov [fileinfo.first_block], 0 |
mcall MF_SYSTREE, fileinfo ; load a block, returns error code in eax |
; and size of the file in ebx |
test eax, eax ; 0 - successful |
jz @f |
print "AC97: File not found!" |
mov [status], ST_STOP |
jmp .exit |
@@: |
shr ebx, 9 ; size_of_file / 512 = number_of_blocks |
mov [file_size], ebx |
mov al, [LOAD_BUFFER+32] ; bytes per sample |
dec al |
jz @f |
cmp al, 3 |
je @f |
sub al, [LOAD_BUFFER+22] ; channels |
add al, 2 |
@@: |
mov [wav_mode], al |
pusha |
movzx ebx,word [LOAD_BUFFER+24] |
mov eax,48000 |
xor edx,edx |
div ebx |
mov [difference_of_frequency],al |
; dph eax |
mov ecx,edx |
imul eax,ecx,10 |
xor edx,edx |
div ebx |
mov ecx,edx |
imul ecx,10 |
push eax |
mov eax,ecx |
xor edx,edx |
div ebx |
; dph eax |
cmp eax,5 |
jl .temp_15 |
pop eax |
; dph eax |
inc eax |
jmp .temp_16 |
.temp_15: |
pop eax |
.temp_16: |
mov [difference_of_frequency_1],al |
; dph eax |
xor edx,edx |
movzx ebx,[difference_of_frequency] |
imul ebx,10 |
add bl,[difference_of_frequency_1] |
mov [difference_of_frequency_2],bl |
; dph ebx |
popa |
movzx eax, word [LOAD_BUFFER+24] |
;dps "Freq: " |
;dpd eax |
;newline |
call set_sample_rate |
; change the last_valid_index to the (current_index-1) |
; the LVI register tells the DMA engine where to stop playing |
call updateLVI |
; if current index is odd, load buffer 1 then 0, jump to tuneLoop |
; if it is even, buffers 0 then 1; tuneLoop1 |
call getCurrentIndex |
and eax, BIT0 |
mov esi, eax |
push eax |
call update_next_buffer |
pop eax |
xor eax, 1 |
call update_next_buffer |
; start playing! |
mov edx, PO_CR_REG |
mov al, RPBM |
call NABMBAR_write_byte |
jmp [jumpto+esi*4] |
.tuneLoop: |
; wait while the current_index is even |
@@: |
; dps "a" |
mcall MF_DELAY, 7 |
call getCurrentIndex |
test al, BIT0 |
jz @b ; loop if not ready yet |
; print "fa" |
call updateLVI |
mov eax, 0 |
call update_next_buffer |
test al, al |
jnz .exit_wait |
cmp [status], ST_PLAY |
jne .exit |
test [volume], 0x10000000 ; test volume_changed bit |
je @f |
mov al, byte [volume] |
call setVolume |
and [volume], 0x0FFFFFFF ; clear vloume_changed bit |
@@: |
.tuneLoop1: |
@@: |
; dps "b" |
mcall MF_DELAY, 7 |
call getCurrentIndex |
test al, BIT0 |
jnz @b ; loop if not ready yet |
; print "fb" |
cmp [status], ST_PLAY |
jne .exit |
call updateLVI |
mov eax, 1 |
call update_next_buffer |
test al, al |
jnz .exit_wait |
jmp .tuneLoop |
.exit_wait: |
mcall MF_DELAY, 30 ; a little pause - let the player finish |
.exit: |
ret |
attempts db 0 |
buffers dd WAV_BUFFER1, WAV_BUFFER2 |
jumpto dd play.tuneLoop, play.tuneLoop1 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; update_first_buffer - load a chunk into the first buffer, increments offset |
;; in: eax = number - 0 or 1 |
;; out: error code, 0 - successful |
update_next_buffer: |
push esi edi |
movzx edx, byte [wav_mode] |
mov ecx, [blocks + edx * 4] |
mov [fileinfo.blocks], ecx |
mov esi, LOAD_BUFFER |
mov edi, [buffers+eax*4] |
push eax ;save buffer index |
start_attempts: |
mcall MF_SYSTREE, fileinfo |
test eax, eax |
jz @f |
cmp [attempts],100 |
je @f |
inc [attempts] |
jmp start_attempts |
dpd eax |
newline |
dpd [fileinfo.first_block] |
newline |
@@: |
; print " loaded!" |
push eax ebx edx |
mov eax,ecx |
xor edx,edx |
imul eax,10 |
movzx ebx,[difference_of_frequency_2] |
div ebx |
mov ecx,eax |
; mov ebx,10 |
; mov eax,edx |
; xor edx,edx |
; div ebx |
; cmp edx,5 |
; jb temp_12_7 |
; inc ecx |
; temp_12_7: |
cmp edx,0 |
je temp_12_7 |
inc ecx |
temp_12_7: |
pop edx ebx |
mov eax,[esp+4] ;restore buffer index |
add [fileinfo.first_block], ecx ; +60Kb |
call [convert + edx * 4] |
;start fix for MM (4) |
mov eax,[esp+4] ;restore buffer index |
test eax,not 1 |
jz .ok |
print "buffer index out of range" |
dpd eax |
jmp .ret |
.ok: |
push ebp |
mov ebp,[phys_wav_buffer1+eax*4] |
mov edi,[buffers+eax*4] |
mcall MF_INTERNAL_SERVICES,SET_PHYS_BUFFER,ebp,edi,60*1024 |
pop ebp |
.ret: |
pop eax |
add esp,4 ;pop buffer index |
;end fix for MM (4) |
pop edi esi |
ret |
c8mono: |
mov [type_of_conversion],1 |
jmp for_all_type |
c8mono_1: |
lodsb |
call c8mono_2 |
push ax |
shl eax,16 |
pop ax |
push eax |
mov al,[esi] |
call c8mono_2 |
push ax |
shl eax,16 |
pop ax |
mov ebx,eax |
pop eax |
jmp for_all_type_1 |
c8mono_2: |
sub al, 0x80 |
cbw |
imul ax, 255 |
ret |
c8stereo: |
mov [type_of_conversion],2 |
jmp for_all_type |
c8stereo_1: |
lodsb |
call c8stereo_2 |
shl eax,16 |
lodsb |
call c8stereo_2 |
push eax |
mov al,[esi] |
call c8stereo_2 |
shl eax,16 |
mov al,[esi+1] |
call c8stereo_2 |
mov ebx,eax |
pop eax |
jmp for_all_type_1 |
c8stereo_2: |
sub al, 0x80 |
cbw |
imul ax, 255 |
ret |
c16mono: |
mov [type_of_conversion],3 |
jmp for_all_type |
c16mono_1: |
lodsw |
push ax |
shl eax,16 |
pop ax |
mov bx,[esi] |
shl ebx,16 |
mov bx,[esi] |
jmp for_all_type_1 |
c16stereo: |
for_all_type: |
xor edx,edx |
mov eax, 15*1024*10 |
movzx ebx,[difference_of_frequency_2] |
xor edx,edx |
div ebx |
mov ecx,eax |
; mov ebx,10 |
; mov eax,edx |
; xor edx,edx |
; div ebx |
; cmp edx,5 |
; jb temp_12_6 |
; inc ecx |
; temp_12_6: |
cmp edx,0 |
je temp_12_6 |
inc ecx |
temp_12_6: |
c16stereo_1: |
mov [znak],0 |
cmp [type_of_conversion],1 |
je c8mono_1 |
cmp [type_of_conversion],2 |
je c8stereo_1 |
cmp [type_of_conversion],3 |
je c16mono_1 |
lodsd |
mov ebx,[esi] |
for_all_type_1: |
cmp eax,ebx |
jne c16stereo_2 |
inc [znak] |
c16stereo_2: |
push eax |
push ecx |
sub eax,ebx |
push eax |
shl eax,16 |
movzx ebx,[difference_of_frequency] |
inc ebx |
xor edx,edx |
div ebx |
shr eax,16 |
mov ecx,eax |
pop eax |
xor ax,ax |
xor edx,edx |
div ebx |
shl eax,16 |
mov cx,ax |
mov ebx,ecx |
pop ecx |
pop eax |
mov dl,[difference_of_frequency] |
inc dl |
@@: |
temp_12: |
cmp [difference_of_frequency_1],0 |
je temp_12_3 |
cmp [difference_of_frequency_1],5 |
jne temp_12_4 |
cmp [difference_of_frequency_4],2 |
jne temp_12_3 |
jmp temp_12_5 |
temp_12_4: |
cmp [difference_of_frequency_4],10 |
jne temp_12_3 |
temp_12_5: |
cmp [znak],0 |
jne temp_12_5_1 |
sub eax,ebx |
jmp temp_12_5_2 |
temp_12_5_1: |
add eax,ebx |
temp_12_5_2: |
stosd |
inc [schetchik] |
mov [difference_of_frequency_4],0 |
temp_12_3: |
cmp [znak],0 |
jne temp_13 |
sub eax,ebx |
jmp temp_14 |
temp_13: |
add eax,ebx |
temp_14: |
cld |
dec dl |
jz temp_14_1 |
stosd |
inc [schetchik] |
inc [difference_of_frequency_4] |
jmp temp_12 |
temp_14_1: |
dec ecx |
cmp ecx,0 |
; jnz c16stereo_1 |
jg c16stereo_1 |
newline |
dph [schetchik] |
temp_14_2: |
cmp [schetchik],15360 |
jge temp_14_3 |
stosd |
inc [schetchik] |
jmp temp_14_2 |
temp_14_3: |
newline |
dph [schetchik] |
cmp [schetchik],15360 |
je temp_14_4 |
; mov [edi-4],dword 0 |
sub edi,4 |
; sub esi,4 |
temp_14_4: |
mov [schetchik],0 |
ret |
difference_of_frequency db 0 |
difference_of_frequency_1 db 0 |
difference_of_frequency_2 db 0 |
difference_of_frequency_4 db 0 |
schetchik dd 0 |
znak db 0 |
type_of_conversion db 0 |
convert dd c8mono, c8stereo, c16mono, c16stereo |
blocks dd 30, 60, 60, 120 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; get_my_address - get base address of the program in physical memory |
;; in: nothing |
;; out: eax = address |
;start fix for MM (8) |
;function shouldn't used. |
;get_my_address: |
; pushad |
; mcall MF_PROCINFO, procinfo, PN_MYSELF |
; popad |
; mov eax, [procinfo.memory_start] |
;ret |
;end fix for MM (8) |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; set the last valid index to something other than we're currently playing |
;; so that we never end |
;; |
;; this routine just sets the last valid index to 1 less than the index |
;; that we're currently playing, thus keeping it in and endless loop |
;; input: none |
;; output: none |
updateLVI: |
push eax |
call getCurrentIndex |
; dps "index " |
; dpd eax |
; newline |
dec al |
and al, INDEX_MASK |
call setLastValidIndex |
pop eax |
ret |
;--------------------------------------------------------------------- |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; returns AL = current index value |
getCurrentIndex: |
push edx |
mov edx, PO_CIV_REG |
call NABMBAR_read_byte |
pop edx |
ret |
;--------------------------------------------------------------------- |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; input AL = index # to stop on |
setLastValidIndex: |
push edx |
mov edx, PO_LVI_REG |
call NABMBAR_write_byte |
pop edx |
ret |
;--------------------------------------------------------------------- |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; print_info - outputs debug information |
;; in: nothing |
;; out: nothing |
print_info: |
dps "BUS: " |
movzx eax, [bus] |
dph eax |
dps " DEVFN: " |
movzx eax, [devfn] |
dph eax |
dps " IRQ: " |
movzx eax, [AC97IRQ] |
dpd eax |
newline |
dps "CODEC_POWER_CTRL: " |
mov edx, CODEC_POWER_CTRL_REG |
call NAMBAR_read_word |
dph eax |
dps " (bits 0-3 should be set)" |
newline |
mov edx, 0x28 |
call NAMBAR_read_word |
dph eax |
dps " - supported features" |
newline |
mov edx, 0x2A |
call NAMBAR_read_word |
dph eax |
dps " - config" |
newline |
mov edx, 0x2C |
call NAMBAR_read_word |
dph eax |
dps " - PCM rate" |
newline |
ret |
;--------------------------------------------------------------------- |
;--- DATA OF PROGRAM ----------------------------------------------- |
;--------------------------------------------------------------------- |
volume dd 15 |
fileinfo: |
.mode dd 0 ; READ |
.first_block dd 0 |
.blocks dd 120 ; 120 Kb |
.dest dd LOAD_BUFFER ;file_data |
.work dd work_area |
; db "/HD/1/WINDOWS/MEDIA/WICEB7~1.WAV",0 |
;sz textbox_string, "/hd/1/testmuz/menuet11.wav",0 |
sz textbox_string, " ",0 |
; rb 256 |
;--------------------------------------------------------------------- |
IMAGE_END: ; end of program's image |
rb 100-textbox_string.size |
; textbox_string.size |
;--------------------------------------------------------------------- |
device_id dd ? ; (device_id << 16) + vendor_id |
lastbus db ? ; pci coordinates |
bus db ? |
devfn db ? |
AC97ICH4 db ? ; Intel ICH4 codec flag |
SI7012 db ? ; SiS SI7012 codec flag |
NAMBAR dw ? ; Audio Mixers Registers (base) |
NABMBAR dw ? ; Bus Master Registers (base) |
AC97IRQ db ? ; Interrupt request |
AC97INT db ? ; Interrupt pin |
wav_mode db ? ; bits per sample & channels |
;--------------------------------------------------------------------- |
ST_DONE = 0x0 ; for interacting with player's window |
ST_PLAY = 0x1 |
ST_EXIT = 0x2 |
ST_STOP = 0x4 |
status db ? |
;--------------------------------------------------------------------- |
phys_bdl_buffer rd 1 |
phys_wav_buffer1 rd 1 |
phys_wav_buffer2 rd 1 |
align 32 |
; Buffer Descriptors List |
; ___________________________ |
; | physical address | dword |
; |_________________________| |
; | attr | length | dword max. length = 65535 samples |
; |_________________________| |
BDL_BUFFER: |
rb 32*8 ; 32 descriptors, 8 bytes each |
;--------------------------------------------------------------------- |
file_data: |
WAV_BUFFER1: |
rb 60 * 1024 ; 60 Kb |
WAV_BUFFER2: |
rb 60 * 1024 |
LOAD_BUFFER: |
rb 60 * 1024 |
;--------------------------------------------------------------------- |
procinfo process_information |
work_area: |
rb 0x10000 |
;--------------------------------------------------------------------- |
rb 0x800 |
thread_stack: |
rb 0x1000 ; for stack |
STACK_P: |
MEMORY_END: |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/ac97wav/trunk/build_en.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix en >lang.inc |
@fasm ac97wav.asm ac97wav |
@pause |
/programs/ac97wav/trunk/build_ru.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix ru >lang.inc |
@fasm ac97wav.asm ac97wav |
@pause |
/programs/ac97wav/trunk/codec.inc |
---|
0,0 → 1,344 |
NAMBAR_read_byte: |
add dx, [NAMBAR] |
in al, dx |
ret |
NAMBAR_read_word: |
add dx, [NAMBAR] |
in ax, dx |
ret |
NAMBAR_read_dword: |
add dx, [NAMBAR] |
in eax, dx |
ret |
NAMBAR_write_byte: |
add dx, [NAMBAR] |
out dx, al |
ret |
NAMBAR_write_word: |
add dx, [NAMBAR] |
out dx, ax |
ret |
NAMBAR_write_dword: |
add dx, [NAMBAR] |
out dx, eax |
ret |
NABMBAR_read_byte: |
add dx, [NABMBAR] |
in al, dx |
ret |
NABMBAR_read_word: |
add dx, [NABMBAR] |
in ax, dx |
ret |
NABMBAR_read_dword: |
add dx, [NABMBAR] |
in eax, dx |
ret |
NABMBAR_write_byte: |
add dx, [NABMBAR] |
out dx, al |
ret |
NABMBAR_write_word: |
add dx, [NABMBAR] |
out dx, ax |
ret |
NABMBAR_write_dword: |
add dx, [NABMBAR] |
out dx, eax |
ret |
semaphore: |
push ecx edx |
mov edx, GLOB_STS_REG ; 0x30 global status register |
call NABMBAR_read_dword |
and eax, PRI_CODEC_RDY ; 100h primary codec ready |
jz .success ; exit if codec not ready !!! |
; mov ecx, 1024 ; try 1024 times |
mov ecx, 0ffffh ; try 65535 times |
.wait: |
mov edx, ACC_SEMA_REG ; 0x34 codec write semaphore |
call NABMBAR_read_byte |
and al, CODEC_BUSY ; 01h codec access semaphore |
jz .success ; exit if codec not busy !!! |
dec ecx |
jnz .wait |
pop edx ecx |
mov eax, 0 |
jmp .exit |
.success: |
pop edx ecx |
mov eax, 1 |
.exit: |
ret |
codecStop: |
push eax ebx edx |
mov edx, PO_CR_REG ; 0x1B control register |
mov al, 0 ; stop all PCM out data |
call NABMBAR_write_byte |
mcall MF_DELAY, eax ; ebx = (eax = MF_DELAY = 5); wait 50 ms |
mov edx, PO_CR_REG ; 0x1B control register |
mov al, RR ; reset PCM out regs |
call NABMBAR_write_byte |
mcall MF_DELAY, eax |
pop edx ebx eax |
ret |
; set voulme |
; in ax = volume level |
setVolume: |
push eax edx |
push eax |
call semaphore |
mov edx, CODEC_RESET_REG ; 0 |
xor eax, eax ; register reset the codec |
call NAMBAR_write_word |
call semaphore |
pop eax |
imul ax, 0101h ; set volume for both chn |
mov edx, CODEC_MASTER_VOL_REG ; 2 |
call NAMBAR_write_word |
push eax |
call semaphore |
pop eax ; set volume for both chn |
mov edx, CODEC_HP_VOL_REG ; 4 |
call NAMBAR_write_word |
push eax |
call semaphore |
mov edx, CODEC_CD_VOL_REG ; 12h |
pop eax ; set volume for both chn |
shr eax, 2 ; adjust CD VOL |
call NAMBAR_write_word |
call semaphore |
mov edx, CODEC_PCM_OUT_REG ; 18h |
mov ax, 0808h ; standard PCM out volume |
call NAMBAR_write_word |
pop edx eax |
ret |
samplerate dw 0 |
; enable codec, unmute stuff, set output to desired rate |
; in : ax = desired sample rate |
; out: ax = true or false |
; |
codecConfig: |
pushad |
mov [samplerate], ax ; save sample rate |
; mov edx, GLOB_STS_REG ; 30h global status register |
; call NABMBAR_read_dword |
; and eax, PRI_CODEC_RDY ; 0100h primary codec ready |
; jnz skip_init ; skip init if codec ready !!! |
; stop the codec if currently playing |
;;; call codecStop |
; mov edx, GLOB_STS_REG |
; call NABMBAR_read_dword |
; dps "GLOB_STA = " |
; dph eax |
; newline |
; mov edx, GLOB_CNT_REG |
; call NABMBAR_read_dword |
; dps "GLOB_CNT = " |
; dph eax |
; newline |
; mcall 5, 10 |
;; test eax, ACCOLD_RESET |
;; jnz .skip_cold_reset |
; print "cold reset" |
; do a cold reset |
mov edx, GLOB_CNT_REG ; 2ch global control register |
xor eax, eax |
call NABMBAR_write_dword ; enable (AC Link off clear) |
; print "wait" |
mcall 5, 5 |
; print "alive!" |
;; .skip_cold_reset: |
mov edx, GLOB_CNT_REG ; 2ch global control register |
mov eax, ACCOLD_RESET + PRI_RES_EN ; cold reset + primary resume |
call NABMBAR_write_dword ; 2 channels & 16 bit samples |
mov edx, GLOB_CNT_REG ; 2ch global control register |
call NABMBAR_read_dword |
and eax, ACCOLD_RESET ; cold reset |
jz init_error ; INIT FAILED !!! |
; print "cold reset finished" |
; wait for primary codec ready status |
mov ecx, 128 |
codec_ready_loop: |
mov edx, GLOB_STS_REG ; 30h global status register |
call NABMBAR_read_dword |
and eax, PRI_CODEC_RDY ; 0100h primary codec ready |
jnz codec_ready_exit ; move on if codec ready !!! |
mcall 5, 1 |
dec ecx |
jnz codec_ready_loop |
;dps "~" |
codec_ready_exit: |
; wait until codec init ready (*** replaces warm reset wait ***) |
mcall 5, 60 |
; test if codec ready bit is finally set |
mov edx, GLOB_STS_REG ; 30h global status register |
call NABMBAR_read_dword |
and eax, PRI_CODEC_RDY ; 0100h primary codec ready |
jnz codec_ready_bit_set ; move on if codec ready !!! |
cmp [AC97ICH4], 1 |
jne init_error |
; je codec_ready_bit_set ; ignore codec ready for ICH4 |
; jmp init_error ; codec ready bit not set !!! |
codec_ready_bit_set: |
; clear semaphore flag |
mov edx, CODEC_RESET_REG ; 0h codec reset register |
call NAMBAR_read_word |
; check if codec sections ready |
call semaphore |
test eax, eax |
jz init_error |
mov edx, CODEC_POWER_CTRL_REG ; 26h codec powerdown ctrl |
call NAMBAR_read_word |
and eax, 01111b |
cmp eax, 01111b |
jne init_error ; codec sections not ready |
; disable interrupts |
mov al, 0 |
mov edx, PI_CR_REG ; 0Bh PCM in control register |
call NABMBAR_write_byte |
mov edx, PO_CR_REG ; 1Bh PCM out control register |
call NABMBAR_write_byte |
mov edx, MC_CR_REG ; 2Bh MIC in control register |
call NABMBAR_write_byte |
; reset channels |
mov al, RR ; 02h reset Bus master regs |
mov edx, PI_CR_REG ; 0Bh PCM in control register |
call NABMBAR_write_byte |
mov edx, PO_CR_REG ; 1Bh PCM out control register |
call NABMBAR_write_byte |
mov edx, MC_CR_REG ; 2Bh MIC in control register |
call NABMBAR_write_byte |
; set default volume |
mov eax, 15 ; set average volume level |
call setVolume |
; set VRA and clear DRA (if not supported will be skipped) |
call semaphore |
test eax, eax |
jz init_error |
mov edx, CODEC_EXT_AUDIO_CTRL_REG ; register 2ah |
call NAMBAR_read_word ; get ext audio ctl |
mov ebx, eax |
call semaphore |
test eax, eax |
jz init_error |
mov eax, ebx |
and eax, 0FFFFh - BIT1 ; clear DRA (BIT1) |
or eax, BIT0 ; set VRA (BIT0) |
mov edx, CODEC_EXT_AUDIO_CTRL_REG ; register 2ah |
call NAMBAR_write_word ; write ext audio ctl |
; set desired sample rate |
skip_init: |
call semaphore |
test eax, eax |
jz init_error |
; mov edx, CODEC_PCM_FRONT_DACRATE_REG |
; call NAMBAR_read_word |
; and eax, 0xFFFF |
; newline |
; dps "old PCM OUT RATE: " |
; dpd eax |
; newline |
mov ax, [samplerate] ; restore sample rate |
; mov edx, CODEC_PCM_FRONT_DACRATE_REG ; register 2ch |
; call NAMBAR_write_word |
call set_sample_rate |
popad |
mov eax, 1 ; exit with success |
jmp exit_config |
init_error: |
popad |
xor eax, eax ; exit with error |
exit_config: |
ret |
set_sample_rate: ; rate in ax |
mov edx, CODEC_PCM_FRONT_DACRATE_REG ; 0x2C reg |
call NAMBAR_write_word |
ret |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/ac97wav/trunk/constant.inc |
---|
0,0 → 1,35 |
;constants of stuff that seem hard to remember at times. |
BIT0 EQU 1 |
BIT1 EQU 2 |
BIT2 EQU 4 |
BIT3 EQU 8 |
BIT4 EQU 10h |
BIT5 EQU 20h |
BIT6 EQU 40h |
BIT7 EQU 80h |
BIT8 EQU 100h |
BIT9 EQU 200h |
BIT10 EQU 400h |
BIT11 EQU 800h |
BIT12 EQU 1000h |
BIT13 EQU 2000h |
BIT14 EQU 4000h |
BIT15 EQU 8000h |
BIT16 EQU 10000h |
BIT17 EQU 20000h |
BIT18 EQU 40000h |
BIT19 EQU 80000h |
BIT20 EQU 100000h |
BIT21 EQU 200000h |
BIT22 EQU 400000h |
BIT23 EQU 800000h |
BIT24 EQU 1000000h |
BIT25 EQU 2000000h |
BIT26 EQU 4000000h |
BIT27 EQU 8000000h |
BIT28 EQU 10000000h |
BIT29 EQU 20000000h |
BIT30 EQU 40000000h |
BIT31 EQU 80000000h |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/ac97wav/trunk/debug.inc |
---|
0,0 → 1,131 |
macro debug_print str |
{ |
local ..string, ..label |
jmp ..label |
..string db str,0 |
..label: |
pushf |
pushad |
mov edx,..string |
call debug_outstr |
popad |
popf |
} |
dps fix debug_print |
macro debug_print_dec arg |
{ |
pushf |
pushad |
if ~arg eq eax |
mov eax,arg |
end if |
call debug_outdec |
popad |
popf |
} |
dpd fix debug_print_dec |
;--------------------------------- |
debug_outdec: ;(eax - num, edi-str) |
push 10 ;2 |
pop ecx ;1 |
push -'0' ;2 |
.l0: |
xor edx,edx ;2 |
div ecx ;2 |
push edx ;1 |
test eax,eax ;2 |
jnz .l0 ;2 |
.l1: |
pop eax ;1 |
add al,'0' ;2 |
call debug_outchar ; stosb |
jnz .l1 ;2 |
ret ;1 |
;--------------------------------- |
debug_outchar: ; al - char |
pushf |
pushad |
mov cl,al |
mov eax,63 |
mov ebx,1 |
int 0x40 |
popad |
popf |
ret |
debug_outstr: |
mov eax,63 |
mov ebx,1 |
@@: |
mov cl,[edx] |
test cl,cl |
jz @f |
int 40h |
inc edx |
jmp @b |
@@: |
ret |
macro newline |
{ |
dps <13,10> |
} |
macro print message |
{ |
dps message |
newline |
} |
macro pregs |
{ |
dps "EAX: " |
dpd eax |
dps " EBX: " |
dpd ebx |
newline |
dps "ECX: " |
dpd ecx |
dps " EDX: " |
dpd edx |
newline |
} |
macro debug_print_hex arg |
{ |
pushf |
pushad |
if ~arg eq eax |
mov eax, arg |
end if |
call debug_outhex |
popad |
popf |
} |
dph fix debug_print_hex |
debug_outhex: |
; eax - number |
mov edx, 8 |
.new_char: |
rol eax, 4 |
movzx ecx, al |
and cl, 0x0f |
mov cl, [__hexdigits + ecx] |
pushad |
mcall 63, 1 |
popad |
dec edx |
jnz .new_char |
ret |
__hexdigits: |
db '0123456789ABCDEF' |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/ac97wav/trunk/frontend.inc |
---|
0,0 → 1,270 |
thread: |
call draw_window |
call main_loop |
mov [status], ST_EXIT |
mcall MF_EXIT |
;--------------------------------------------------------------------- |
main_loop: |
cmp [status], ST_PLAY |
je @f |
mcall MF_WAIT_EVENT |
jmp .handle_event |
@@: |
call draw_progress_bar |
mcall MF_WAIT_EVENT_TIMEOUT, 80 |
.handle_event: |
cmp eax, EV_REDRAW |
je redraw |
cmp eax, EV_BUTTON |
je button |
cmp eax, EV_KEY |
je key |
jmp main_loop |
redraw: |
call draw_window |
jmp main_loop |
key: |
mcall MF_GETKEY |
cmp [textbox_active], 1 |
jne main_loop |
cmp ah, 13 |
je .enter |
cmp ah, 8 |
je .backspace |
movzx ecx, [textbox_position] |
cmp ecx, 47 |
jae .enter |
mov [textbox_string + ecx], ah |
inc [textbox_position] |
call textbox_draw |
jmp main_loop |
.enter: |
mov [textbox_active], 0 |
call textbox_draw |
jmp main_loop |
.backspace: |
movzx ecx, [textbox_position] |
test ecx, ecx |
jz main_loop |
mov [textbox_string + ecx], byte 0 |
dec [textbox_position] |
call textbox_draw |
jmp main_loop |
button: |
mcall MF_GETBUTTON |
cmp ah, 0x10 |
je play_button |
cmp ah, 0x11 |
je stop_button |
cmp ah, 0x12 |
je decr_button |
cmp ah, 0x13 |
je incr_button |
cmp ah, 0x14 |
je volm_button |
cmp ah, 0x15 |
je volp_button |
cmp ah, 0x20 |
je activate_textbox |
cmp ah, 0x30 |
je progressbar_click |
cmp ah, 1 |
jne main_loop |
; mov [status], ST_STOP |
; mcall MF_DELAY, 40 |
ret |
play_button: |
xor eax, eax |
xchg al, [textbox_active] |
cmp al, 0 |
je @f |
call textbox_draw |
@@: |
mov [status], ST_PLAY |
jmp main_loop |
stop_button: |
mov [status], ST_STOP |
jmp main_loop |
decr_button: |
; mov [status], ST_STOP |
; @@: |
; mcall 5, 1 |
; cmp [status], ST_DONE |
; jne @b |
; movzx esi, [textbox_position] |
; add esi, textbox_string |
; @@: |
; cmp byte [esi], '/' |
; je @f |
; dec esi |
; jmp @b |
; @@: |
; mov byte [esi+1], 0 |
; mov [fileinfo.first_block], 0 |
; mov [fileinfo.dest], WAV_BUFFER1 |
; mcall 58, fileinfo |
; add ebx, WAV_BUFFER1 |
; mov esi, WAV_BUFFER1+8 |
; .next_file: |
; cmp ebx, esi |
; jbe .fin |
; cmp word [esi], "WA" |
; jne .next_file |
; cmp byte [esi+1], "V" |
; jne .next_file |
; .fin: |
;mov eax, [fileinfo.first_block] |
;cmp eax, 1000 |
;jnl @f |
;mov [fileinfo.first_block], 0 |
;jmp main_loop |
;@@: |
;sub [fileinfo.first_block], 1000 |
;jmp main_loop |
incr_button: |
;add [fileinfo.first_block], 1000 |
jmp main_loop |
volm_button: |
inc byte [volume] |
and byte [volume], 0x1f |
jz volp_button |
or [volume], 0x10000000 |
jmp _print_volume |
; jmp main_loop |
volp_button: |
dec byte [volume] |
and byte [volume], 0x1f |
jz volm_button |
or [volume], 0x10000000 |
; jmp main_loop |
_print_volume: |
movzx eax, byte [volume] |
neg eax |
add eax, 31 |
dps "Volume: " |
dpd eax |
newline |
jmp main_loop |
activate_textbox: |
cmp [status], ST_DONE |
jne main_loop |
mov [textbox_active], 1 |
call textbox_draw |
jmp main_loop |
progressbar_click: |
;print "click on progress bar" |
cmp [status], ST_DONE |
je main_loop |
mcall MF_GETMOUSE, MS_COORDS_WINDOW |
shr eax, 16 ; get mouse.x |
sub eax, 7 |
test eax, eax |
jz @f |
imul eax, [file_size] |
mov ebx, 286 |
cdq |
div ebx |
@@: |
;dps "block: " |
;dpd eax |
;newline |
mov [fileinfo.first_block], eax |
call draw_progress_bar |
jmp main_loop |
ret |
;--------------------------------------------------------------------- |
PBAR_WIDTH = 286 |
draw_window: |
mcall MF_DRAWSTATUS, DS_BEGIN |
mcall MF_WINDOW, <100,299>, <100,72>, 0x03404040 |
; create six buttons |
mov edi, 6 |
mpack ebx, 7, 45 |
mpack ecx, 24, 13 |
mov edx, 0x10 |
mov esi, 0xA0A0A0 |
@@: |
mcall MF_BUTTON |
add ebx, 48 shl 16 |
inc edx |
dec edi |
jnz @b |
mcall MF_TEXT, <8,8>, 0x10FFFFFF, header, header.size |
mcall ,<13,28>, 0x404040, buttons_text, buttons_text.size |
sub ebx, 0x00010001 |
mov ecx, 0xFFFFFF |
mcall |
call draw_progress_bar |
call textbox_draw |
mcall MF_DRAWSTATUS, DS_END |
ret |
;--------------------------------------------------------------------- |
textbox_draw: |
mcall MF_BUTTON, <7,285>, <55,10>, 0x60000020 |
mov edx, 0x808080 |
cmp [textbox_active], 1 |
jne @f |
mov edx, 0xA0A0A0 |
@@: |
mcall MF_BAR, <7,286>, <55,11> |
movzx esi, [textbox_position] |
mcall MF_TEXT, <10,56>, 0x404040, textbox_string |
ret |
;--------------------------------------------------------------------- |
draw_progress_bar: |
pushad |
imul eax, [fileinfo.first_block], PBAR_WIDTH |
cdq |
div [file_size] |
push eax |
mcall MF_BAR, <7,286>, <41,11>, 0x808080 |
mcall MF_BUTTON, , , 0x60000030 |
pop eax |
mov bx, ax |
mov edx, 0xA0A0A0 |
mcall MF_BAR |
popad |
ret |
;--------------------------------------------------------------------- |
sz header, "AC'97 WAV player - all PCM audio" |
sz buttons_text, " Play Stop << >> Vol- Vol+" |
textbox_active db 0 |
textbox_position db textbox_string.size-1 |
file_size dd 100 |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/ac97wav/trunk/includes.inc |
---|
0,0 → 1,10 |
include "MACROS.INC" |
include "DEBUG.INC" |
include "CONSTANT.INC" |
include "AC97.INC" |
include "PCI.INC" |
include "CODEC.INC" |
include "FRONTEND.INC" |
MF_PCI = 62 |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/ac97wav/trunk/macros.inc |
---|
0,0 → 1,266 |
; new application structure |
macro meos_app_start |
{ |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd __start |
dd __end |
dd __memory |
dd __stack |
if used __params & ~defined __params |
dd __params |
else |
dd 0x0 |
end if |
dd 0x0 |
} |
MEOS_APP_START fix meos_app_start |
macro code |
{ |
__start: |
} |
CODE fix code |
macro data |
{ |
__data: |
} |
DATA fix data |
macro udata |
{ |
if used __params & ~defined __params |
__params: |
db 0 |
__end: |
rb 255 |
else |
__end: |
end if |
__udata: |
} |
UDATA fix udata |
macro meos_app_end |
{ |
align 32 |
rb 2048 |
__stack: |
__memory: |
} |
MEOS_APP_END fix meos_app_end |
; macro for defining multiline text data |
struc mstr [sstring] |
{ |
forward |
local ssize |
virtual at 0 |
db sstring |
ssize = $ |
end virtual |
dd ssize |
db sstring |
common |
dd -1 |
} |
; strings |
macro sz name,[data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if used name |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
macro lsz name,[lng,data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if (used name)&(lang eq lng) |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
; easy system call macro |
macro mpack dest, hsrc, lsrc |
{ |
if (hsrc eqtype 0) & (lsrc eqtype 0) |
mov dest, (hsrc) shl 16 + lsrc |
else |
if (hsrc eqtype 0) & (~lsrc eqtype 0) |
mov dest, (hsrc) shl 16 |
add dest, lsrc |
else |
mov dest, hsrc |
shl dest, 16 |
add dest, lsrc |
end if |
end if |
} |
macro __mov reg,a,b { ; mike.dld |
if (~a eq)&(~b eq) |
mpack reg,a,b |
else if (~a eq)&(b eq) |
mov reg,a |
end if |
} |
macro mcall a,b,c,d,e,f { ; mike.dld |
__mov eax,a |
__mov ebx,b |
__mov ecx,c |
__mov edx,d |
__mov esi,e |
__mov edi,f |
int 0x40 |
} |
; optimize the code for size |
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp> |
macro add arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
inc arg1 |
else |
add arg1,arg2 |
end if |
else |
add arg1,arg2 |
end if |
} |
macro sub arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
dec arg1 |
else |
sub arg1,arg2 |
end if |
else |
sub arg1,arg2 |
end if |
} |
macro mov arg1,arg2 |
{ |
if (arg1 in __regs) & (arg2 eqtype 0) |
if (arg2) = 0 |
xor arg1,arg1 |
else if (arg2) = 1 |
xor arg1,arg1 |
inc arg1 |
else if (arg2) = -1 |
or arg1,-1 |
else if (arg2) > -128 & (arg2) < 128 |
push arg2 |
pop arg1 |
else |
mov arg1,arg2 |
end if |
else |
mov arg1,arg2 |
end if |
} |
macro struct name |
{ |
virtual at 0 |
name name |
sizeof.#name = $ - name |
end virtual |
} |
; structures used in MeOS |
struc process_information |
{ |
.cpu_usage dd ? ; +0 |
.window_stack_position dw ? ; +4 |
.window_stack_value dw ? ; +6 |
.not_used1 dw ? ; +8 |
.process_name rb 12 ; +10 |
.memory_start dd ? ; +22 |
.used_memory dd ? ; +26 |
.PID dd ? ; +30 |
.x_start dd ? ; +34 |
.y_start dd ? ; +38 |
.x_size dd ? ; +42 |
.y_size dd ? ; +46 |
.slot_state dw ? ; +50 |
rb (1024-52) |
} |
struct process_information |
struc system_colors |
{ |
.frame dd ? |
.grab dd ? |
.grab_button dd ? |
.grab_button_text dd ? |
.grab_text dd ? |
.work dd ? |
.work_button dd ? |
.work_button_text dd ? |
.work_text dd ? |
.work_graph dd ? |
} |
struct system_colors |
; constants |
; events |
EV_IDLE = 0 |
EV_TIMER = 0 |
EV_REDRAW = 1 |
EV_KEY = 2 |
EV_BUTTON = 3 |
EV_EXIT = 4 |
EV_BACKGROUND = 5 |
EV_MOUSE = 6 |
EV_IPC = 7 |
EV_STACK = 8 |
; event mask bits for function 40 |
EVM_REDRAW = 1b |
EVM_KEY = 10b |
EVM_BUTTON = 100b |
EVM_EXIT = 1000b |
EVM_BACKGROUND = 10000b |
EVM_MOUSE = 100000b |
EVM_IPC = 1000000b |
EVM_STACK = 10000000b |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/ac97wav/trunk/meosfunc.inc |
---|
0,0 → 1,29 |
MF_WINDOW = 0 |
MF_GETKEY = 2 |
MF_TEXT = 4 |
MF_DELAY = 5 |
MF_BUTTON = 8 |
MF_PROCINFO = 9 |
PN_MYSELF = -1 |
MF_WAIT_EVENT = 10 |
MF_DRAWSTATUS = 12 |
DS_BEGIN = 1 |
DS_END = 2 |
MF_BAR = 13 |
MF_GETBUTTON = 17 |
MF_WAIT_EVENT_TIMEOUT = 23 |
MF_GETMOUSE = 37 |
MS_COORDS_WINDOW = 1 |
MF_PORTS = 46 |
PRT_RESERVE = 0 |
PRT_FREE = 1 |
MF_THREAD = 51 |
THR_CREATE = 1 |
MF_SYSTREE = 58 |
MF_PCI = 62 |
MF_EXIT = -1 |
MF_INTERNAL_SERVICES = 68 |
ALLOC_PHYS_MEM =5 |
FREE_PHYS_MEM =6 |
SET_PHYS_BUFFER =7 |
GET_PHYS_BUFFER =8 |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/ac97wav/trunk/pci.inc |
---|
0,0 → 1,46 |
PCI_CMD_REG = 04h ; reg 04, command reg |
IO_ENA = 0x00000001 ; i/o decode enable |
MEM_ENA = 0x00000002 ; memory decode enable |
BM_ENA = 0x00000004 ; bus master enable |
pciRegRead8: ; register in CL! |
mov bl, 4 |
mov bh, [bus] |
mov ch, [devfn] |
mcall MF_PCI |
ret |
pciRegRead16: |
mov bl, 5 |
mov bh, [bus] |
mov ch, [devfn] |
mcall MF_PCI |
ret |
pciRegRead32: |
mov bl, 6 |
mov bh, [bus] |
mov ch, [devfn] |
mcall MF_PCI |
ret |
pciRegWrite8: ; value in DL! |
mov bl, 8 |
mov bh, [bus] |
mov ch, [devfn] |
mcall MF_PCI |
ret |
pciRegWrite16: |
mov bl, 9 |
mov bh, [bus] |
mov ch, [devfn] |
mcall MF_PCI |
ret |
pciRegWrite32: |
mov bl, 10 |
mov bh, [bus] |
mov ch, [devfn] |
mcall MF_PCI |
ret |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/Readme.txt |
---|
0,0 → 1,85 |
AClock 1.1 |
Copyright (c) 2002,2003 Thomas Mathys |
killer@vantage.ch |
what the hell is this ? |
----------------------- |
this is aclock, a silly analog clock application |
for menuetos (http://www.menuetos.org). |
why do i need it ? |
------------------ |
well, this is certainly one of the last programs on |
earth you'd ever need. anyway, it demonstrates how |
how to do certain things: |
- writing menuet apps that parse the command line. |
includes a strtok-like function that you might |
want to use in own projects. or maybe rather not. |
- writing menuet apps that are aware of the current |
window size and that have no problems with different |
skin heights. |
- how to write menuet apps with nasm instead of fasm |
(there should be a gas version aswell, don't you think ?) |
and how to write kick-ass code with nasm in general =) |
compiling instructions |
---------------------- |
yes, it's still written for nasm. |
i really can't be bothered to work with fasm. |
oh yes, you wanted to know how to compile aclock: |
nasm -t -f bin -o aclock aclock.asm |
if you get error messages like |
nasm: unrecognised option `-t |
type `nasm -h' for help |
then you've got an old version of nasm. |
get a newer version (0.98.36 or later) from |
http://nasm.sourceforge.net |
configuration |
------------- |
you might want to change some of the constants defined |
somewhere at the top of aclock.asm. the following might |
be useful: |
- DEFAULT_XPOS |
- DEFAULT_YPOS |
- DEFAULT_WIDTH |
- DEFAULT_HEIGHT |
- MIN_WIDTH |
- MIN_HEIGHT |
for more info about DEFAULT_XPOS/DEFAULT_YPOS see next |
section. |
usage |
----- |
this version of AClock introduces command line parameters. |
here's an example command line: |
aclock w128 h128 x20 y-20 |
this creates a window that is 128 pixels wide and 128 pixels |
high (that's for the work area, without border/title bar). |
the window is placed at x=20, y=screen resolution-20 |
(because of the minus sign after the y). |
all parameters are optional and may appear in any order. |
you can't have any whitespaces in a parameter, e.g. |
"w 128" is an invalid parameter (which will simply be ignored). |
the command line parser is case sensitive. |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/aclock.asm |
---|
0,0 → 1,223 |
; aclock 1.1 |
; Copyright (c) 2002 Thomas Mathys |
; killer@vantage.ch |
; |
; 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; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
bits 32 |
%include 'mos.inc' |
section .text |
;******************************************************************** |
; configuration stuff |
;******************************************************************** |
%define APPNAME "AClock 1.1" |
%define STACKSIZE 1024 |
; default window position/dimensions (work area) |
%define DEFAULT_XPOS -20 |
%define DEFAULT_YPOS 20 |
%define DEFAULT_WIDTH 80 |
%define DEFAULT_HEIGHT 80 |
; minimal size (horizontal and vertical) of work area |
%define MIN_WIDTH 80 |
%define MIN_HEIGHT 80 |
;******************************************************************** |
; header |
;******************************************************************** |
MOS_HEADER01 main,image_end,memory_end,stacktop-4,cmdLine,0 |
; these includes introduce code and thus mustn't stand |
; before the menuet header =) |
%include 'dbgboard.inc' |
%include 'strlen.inc' |
%include 'str2dwrd.inc' |
%include 'strtok.inc' |
%include 'cmdline.inc' |
%include 'adjstwnd.inc' |
%include 'draw.inc' |
;******************************************************************** |
; main program |
;******************************************************************** |
main: |
call getDefaultWindowColors |
call parseCommandLine |
; check minimal window dimensions |
cmp dword [wndWidth],MIN_WIDTH |
jae .widthok |
mov dword [wndWidth],MIN_WIDTH |
.widthok: |
cmp dword [wndHeight],MIN_HEIGHT |
jae .heightok |
mov dword [wndHeight],MIN_HEIGHT |
.heightok: |
; adjust window dimensions |
mov eax,ADJSTWND_TYPE_SKINNED |
mov ebx,[wndXPos] |
mov ecx,[wndYPos] |
mov edx,[wndWidth] |
mov esi,[wndHeight] |
call adjustWindowDimensions |
mov [wndXPos],ebx |
mov [wndYPos],ecx |
mov [wndWidth],edx |
mov [wndHeight],esi |
call drawWindow |
.msgpump: |
call drawClock |
; wait up to a second for next event |
mov eax,MOS_SC_WAITEVENTTIMEOUT |
mov ebx,100 |
int 0x40 |
cmp eax,MOS_EVT_REDRAW |
je .redraw |
cmp eax,MOS_EVT_KEY |
je .key |
cmp eax,MOS_EVT_BUTTON |
je .button |
jmp .msgpump |
.redraw: |
call drawWindow |
jmp .msgpump |
.key: |
mov eax,MOS_SC_GETKEY |
int 0x40 |
jmp .msgpump |
.button: |
mov eax,MOS_SC_EXIT |
int 0x40 |
jmp .msgpump |
;******************************************************************** |
; get default window colors |
; input : nothing |
; output : wndColors contains default colors |
; destroys : nothing |
;******************************************************************** |
getDefaultWindowColors: |
pushad |
pushfd |
mov eax,MOS_SC_WINDOWPROPERTIES |
mov ebx,3 |
mov ecx,wndColors |
mov edx,MOS_WNDCOLORS_size |
int 0x40 |
popfd |
popad |
ret |
;******************************************************************** |
; define and draw window |
; input nothing |
; output nothing |
; destroys flags |
;******************************************************************** |
align 4 |
drawWindow: |
pusha |
; start window redraw |
mov eax,MOS_SC_REDRAWSTATUS |
mov ebx,1 |
int 0x40 |
; create window |
mov eax,MOS_SC_DEFINEWINDOW |
mov ebx,[wndXPos] |
shl ebx,16 |
or ebx,[wndWidth] |
mov ecx,[wndYPos] |
shl ecx,16 |
or ecx,[wndHeight] |
mov edx,[wndColors+MOS_WNDCOLORS.work] |
or edx,0x03000000 |
mov esi,[wndColors+MOS_WNDCOLORS.grab] |
mov edi,[wndColors+MOS_WNDCOLORS.frame] |
int 0x40 |
; draw window label |
mov eax,MOS_SC_WRITETEXT |
mov ebx,MOS_DWORD(8,8) |
mov ecx,[wndColors+MOS_WNDCOLORS.grabText] |
mov edx,label |
mov esi,LABEL_LEN |
int 0x40 |
call drawClock |
; end window redraw |
mov eax,MOS_SC_REDRAWSTATUS |
mov ebx,2 |
int 0x40 |
popa |
ret |
;******************************************************************** |
; initialized data |
;******************************************************************** |
; window position and dimensions. |
; dimensions are for work area only. |
wndXPos dd DEFAULT_XPOS |
wndYPos dd DEFAULT_YPOS |
wndWidth dd DEFAULT_WIDTH |
wndHeight dd DEFAULT_HEIGHT |
; window label |
label db APPNAME,0 |
LABEL_LEN equ ($-label-1) |
; token delimiter list for command line |
delimiters db 9,10,11,12,13,32,0 |
; don't insert anything after this label |
image_end: |
;******************************************************************** |
; uninitialized data |
;******************************************************************** |
section .bss |
wndColors resb MOS_WNDCOLORS_size |
procInfo resb MOS_PROCESSINFO_size |
; space for command line. at the end we have an additional |
; byte for a terminating zero, just to be sure... |
cmdLine resb 257 |
alignb 4 |
stack resb STACKSIZE |
stacktop: |
; don't insert anything after this label |
memory_end: |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/aclock.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/aclock/trunk/adjstwnd.inc |
---|
0,0 → 1,147 |
; adjustWindowDimensions |
; adjust menut window dimensions to get a certain work area size. |
; or so. who on earth cares anyway, i certinaly don't, i'm just |
; writing this code because i've got to kill time somehow... |
; |
; Copyright (c) 2002 Thomas Mathys |
; killer@vantage.ch |
; |
; 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; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
; |
%ifndef _ADJSTWND_INC |
%define _ADJSTWND_INC |
;window types |
ADJSTWND_TYPE_SKINNED equ 0 |
;******************************************************************** |
; adjust window dimensions to get a certain work area size |
; |
; - first the window width and height are adjusted |
; and clamped if they're too large for the screen. |
; - then the window positions are adjusted, if the |
; window goes out of the screen. |
; |
; input: |
; eax window type, one of the ADJSTWND_TYPE_xxx constants |
; ebx window x position |
; ecx window y position |
; edx desired work area width |
; esi desired work area height |
; |
; output: |
; eax return code. 0 = ok, -1 = invalid window type |
; ebx adjusted window x position |
; ecx adjusted window y position |
; edx window width to get desired work area width |
; esi window height to get desired work area height |
; |
; destroys: |
; nothing |
; |
; normally x and y are the upper left corner of the window, |
; relative to the upper left corner of the screen. |
; if you pass a negative x or y it will be treated as the |
; lower right corner of the window, relative to the lower |
; right corner of the screen. |
;******************************************************************** |
adjustWindowDimensions: |
push edi |
push ebp |
pushfd |
; adjust window dimensions, depending on the window type |
cmp eax,ADJSTWND_TYPE_SKINNED |
je .adjust_skinned |
mov eax,-1 ; invalid window type, |
jmp .bye ; return error code |
; clamp window dimensions |
.clamp: |
mov eax,MOS_SC_GETSCREENMAX ; get screen dimensions |
int 0x40 |
mov edi,eax ; edi = screen width |
shr edi,16 |
mov ebp,eax ; ebp = screen height |
and ebp,0xffff |
cmp edx,edi ; window width > screen width ? |
jna .widthok |
mov edx,edi ; yes -> use screen width |
.widthok: |
cmp esi,ebp ; wnd height > screen height ? |
jna .heightok |
mov esi,ebp ; yes -> use screen height |
.heightok: |
; adjust x position |
or ebx,ebx ; do the lower right corner |
jns .foo ; stuff if x is negative. |
add ebx,edi |
sub ebx,edx |
.foo: |
or ebx,ebx ; x < 0 ? |
jns .xnotnegative |
xor ebx,ebx ; yes -> x = 0 |
.xnotnegative: |
mov eax,ebx ; x + width > screen width ? |
add eax,edx |
cmp eax,edi |
jna .xok |
sub eax,edi ; yes -> adjust |
sub ebx,eax |
.xok: |
; adjust y position |
or ecx,ecx ; do the lower right corner |
jns .bar ; stuff if y is negative. |
add ecx,ebp |
sub ecx,esi |
.bar: |
or ecx,ecx ; y < 0 ? |
jns .ynotnegative |
xor ecx,ecx ; yes -> y = 0 |
.ynotnegative: |
mov eax,ecx ; y + height > screen height ? |
add eax,esi |
cmp eax,ebp |
jna .yok |
sub eax,ebp ; yes -> adjust |
sub ecx,eax |
.yok: |
.done: |
xor eax,eax |
.bye: |
popfd |
pop ebp |
pop edi |
ret |
.adjust_skinned: |
; adjust width (edx) |
add edx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT |
; adjust height (esi). we need the skin height to do this. |
push ebx |
mov eax,MOS_SC_WINDOWPROPERTIES |
mov ebx,4 |
int 0x40 |
lea esi,[esi+eax+MOS_WND_SKIN_BORDER_BOTTOM] |
pop ebx |
jmp .clamp |
%endif |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/cmdline.inc |
---|
0,0 → 1,151 |
; command line parsing code for aclock |
; |
; Copyright (c) 2003 Thomas Mathys |
; killer@vantage.ch |
; |
; 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; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
; |
%ifndef _CMDLINE_INC |
%define _CMDLINE_INC |
;******************************************************************** |
; parse the command line |
; input : nothing |
; output : wndXPos, wndYPos, wndWidth, wndHeight |
; are changed. |
; destroys : nothing |
;******************************************************************** |
parseCommandLine: |
pushad |
pushfd |
; terminate command line, just to be sure |
mov byte [cmdLine + 256],0 |
; go through all tokens |
mov eax,cmdLine ; eax -> command line |
.parseloop: |
mov ebx,delimiters ; ebx -> token delimiter list |
call strtok ; get next parameter |
or eax,eax ; no more parameters ? |
jz .nomoretokens |
mov cl,[eax] ; get 1st char of parameter |
cmp cl,'x' ; which parameter is it ? |
je .param_x |
cmp cl,'y' |
je .param_y |
cmp cl,'w' |
je .param_w |
cmp cl,'h' |
je .param_h |
; if we reach this line it's an unknown parameter, ignore it |
.nextparam: |
xor eax,eax ; set eax = 0 to continue |
jmp .parseloop ; after last token. |
.nomoretokens: |
DBG_BOARD_PRINTDWORD [wndXPos] |
DBG_BOARD_PRINTCHAR 32 |
DBG_BOARD_PRINTDWORD [wndYPos] |
DBG_BOARD_PRINTCHAR 32 |
DBG_BOARD_PRINTDWORD [wndWidth] |
DBG_BOARD_PRINTCHAR 32 |
DBG_BOARD_PRINTDWORD [wndHeight] |
DBG_BOARD_PRINTNEWLINE |
popfd |
popad |
ret |
; eax -> first character of the parameter |
.param_x: |
push eax |
call parsePositionParam |
mov [wndXPos],eax |
pop eax |
jmp .nextparam |
; eax -> first character of the parameter |
.param_y: |
push eax |
call parsePositionParam |
mov [wndYPos],eax |
pop eax |
jmp .nextparam |
; eax -> first character of the parameter |
.param_w: |
push eax |
call parseSizeParam |
mov [wndWidth],eax |
pop eax |
jmp .nextparam |
; eax -> first character of the parameter |
.param_h: |
push eax |
call parseSizeParam |
mov [wndHeight],eax |
pop eax |
jmp .nextparam |
; parse position parameter |
; input : eax = address of first character of parameter |
; output : eax contains position |
; destroys : nothing |
parsePositionParam: |
push ebx |
push esi |
pushfd |
; is the second char of the parameter a '-' ? |
inc eax |
xor ebx,ebx ; assume it isn't |
cmp byte [eax],'-' |
jne .nominus |
mov ebx,1 ; yes -> set flag... |
inc eax ; ...and move to next char |
.nominus: |
; convert rest of parameter to doubleword |
mov esi,eax |
call string2dword |
; negate if necessary |
or ebx,ebx |
jz .rotationshyperboloid |
neg eax |
.rotationshyperboloid: |
popfd |
pop esi |
pop ebx |
ret |
; parse dimension parameter |
; input : eax = address of first char of parameter |
; output : eax contains dimension |
; destroys : nothing |
parseSizeParam: |
push esi |
pushfd |
lea esi,[eax + 1] ; esi -> 2nd char of parameter |
call string2dword |
popfd |
pop esi |
ret |
%endif |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/dbgboard.inc |
---|
0,0 → 1,200 |
; macros to write stuff to menuet's debug message board. |
; the macros don't change any registers, not even flags. |
; they take only effect if DEBUG is defined. |
; |
; Copyright (c) 2003 Thomas Mathys |
; killer@vantage.ch |
; |
; 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; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
; |
%ifndef _DBGBOARD_INC |
%define _DBGBOARD_INC |
%ifdef DEBUG |
;******************************************************************** |
; print newline |
; no input |
;******************************************************************** |
%macro DBG_BOARD_PRINTNEWLINE 0 |
call dbg_board_printnewline |
%endm |
;******************************************************************** |
; print a character |
; |
; examples : DBG_BOARD_PRINTCHAR '?' |
; DBG_BOARD_PRINTCHAR 65 |
; DBG_BOARD_PRINTCHAR cl |
; DBG_BOARD_PRINTCHAR [esi] |
; DBG_BOARD_PRINTCHAR [somevariable] |
;******************************************************************** |
%macro DBG_BOARD_PRINTCHAR 1 |
push ecx |
mov cl,byte %1 |
call dbg_board_printchar |
pop ecx |
%endm |
;******************************************************************** |
; print a dword (in hex) |
; |
; examples: DBG_BOARD_PRINTDWORD esp |
; DBG_BOARD_PRINTDWORD 0xdeadbeef |
; DBG_BOARD_PRINTDWORD [somevariable] |
;******************************************************************** |
%macro DBG_BOARD_PRINTDWORD 1 |
push dword %1 |
call dbg_board_printdword |
%endm |
;******************************************************************** |
; print a string literal |
; a terminating zero is automagically appended to the string. |
; |
; examples DBG_BOARD_PRINTSTRINGLITERAL "foo",0 |
; DBG_BOARD_PRINTSTRINGLITERAL "bar",10,13,0 |
;******************************************************************** |
%macro DBG_BOARD_PRINTSTRINGLITERAL 1+ |
jmp %%bar |
%%foo db %1, 0 ; terminate string, just to be sure |
%%bar: |
push dword %%foo |
call dbg_board_printstring |
%endm |
;******************************************************************** |
; print a string (asciiz) |
; |
; examples DBG_BOARD_PRINTSTRING addressofstring |
; DBG_BOARD_PRINTSTRING esi |
; DBG_BOARD_PRINTSTRING [ebx] |
;******************************************************************** |
%macro DBG_BOARD_PRINTSTRING 1 |
push dword %1 |
call dbg_board_printstring |
%endm |
; no input |
dbg_board_printnewline: |
pushad |
pushfd |
mov eax,MOS_SC_DEBUGBOARD |
mov ebx,1 |
mov ecx,10 |
int 0x40 |
mov ecx,13 |
int 0x40 |
popfd |
popad |
ret |
; input : cl = character to print |
dbg_board_printchar: |
pushad |
pushfd |
mov eax,MOS_SC_DEBUGBOARD |
mov ebx,1 |
and ecx,0xff |
int 0x40 |
popfd |
popad |
ret |
; input : dword to print on stack |
dbg_board_printdword: |
enter 0,0 |
pushad |
pushfd |
mov eax,MOS_SC_DEBUGBOARD |
mov ebx,1 |
mov ecx,'0' ; print 0x prefix |
int 0x40 |
mov ecx,'x' |
int 0x40 |
mov edx,[ebp + 8] ; get dword to print |
mov esi,8 ; iterate through all nibbles |
.loop: |
mov ecx,edx ; display hex digit |
shr ecx,28 |
movzx ecx,byte [dbg_board_printdword_digits + ecx] |
int 0x40 |
shl edx,4 ; next nibble |
dec esi |
jnz .loop |
popfd |
popad |
leave |
ret 4 |
dbg_board_printdword_digits: |
db '0','1','2','3','4','5','6','7' |
db '8','9','a','b','c','d','e','f' |
; input : address of string (asciiz) to print on stack |
dbg_board_printstring: |
enter 0,0 |
pushad |
pushfd |
cld |
mov esi,[ebp + 8] ; esi -> string |
mov ebx,1 |
.loop: |
lodsb ; get character |
or al,al ; zero ? |
je .done ; yeah -> get outta here |
movzx ecx,al ; nope -> display character |
mov eax,MOS_SC_DEBUGBOARD |
int 0x40 |
jmp .loop |
.done: |
popfd |
popad |
leave |
ret 4 |
%else |
%macro DBG_BOARD_PRINTNEWLINE 0 |
%endm |
%macro DBG_BOARD_PRINTCHAR 1 |
%endm |
%macro DBG_BOARD_PRINTDWORD 1 |
%endm |
%macro DBG_BOARD_PRINTSTRINGLITERAL 1+ |
%endm |
%macro DBG_BOARD_PRINTSTRING 1 |
%endm |
%endif |
%endif |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/draw.inc |
---|
0,0 → 1,430 |
; drawing code for aclock |
; |
; Copyright (c) 2003 Thomas Mathys |
; killer@vantage.ch |
; |
; 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; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
; |
%ifndef _DRAW_INC |
%define _DRAW_INC |
TMR1_FACTOR dd 0.45 |
TMR2_FACTOR dd 0.426315789 |
SECR_FACTOR dd 0.378947368 |
MINR_FACTOR dd 0.355263158 |
HOURR_FACTOR dd 0.189473684 |
DATE_FACTOR dd 0.1 |
monthNames: |
db "Jan" |
db "Feb" |
db "Mar" |
db "Apr" |
db "May" |
db "Jun" |
db "Jul" |
db "Aug" |
db "Sep" |
db "Oct" |
db "Nov" |
db "Dec" |
;******************************************************************** |
; draws the clock |
; input : nothing |
; output : nothing |
; destroys : nothing |
;******************************************************************** |
drawClock: |
%push drawClock_context |
%stacksize flat |
%assign %$localsize 0 |
%local i:dword, \ |
TMR1X:dword, \ |
TMR1Y:dword, \ |
TMR2X:dword, \ |
TMR2Y:dword, \ |
SECRX:dword, \ |
SECRY:dword, \ |
MINRX:dword, \ |
MINRY:dword, \ |
HOURRX:dword, \ |
HOURRY:dword, \ |
workwidth:dword, \ |
workheight:dword, \ |
foo:dword |
enter %$localsize,0 |
pushad |
pushfd |
; get window dimensions |
mov eax,MOS_SC_GETPROCESSINFO |
mov ebx,procInfo |
mov ecx,-1 |
int 0x40 |
; calculate work area size (width/height = ecx/edx) |
; if the work area is too small (maybe the window is shaded) |
; we don't draw anything. |
mov eax,MOS_SC_WINDOWPROPERTIES |
mov ebx,4 ; get skin height (eax) |
int 0x40 |
mov ecx,[procInfo + MOS_PROCESSINFO.wndWidth] |
sub ecx,MOS_WND_SKIN_BORDER_LEFT+MOS_WND_SKIN_BORDER_RIGHT |
mov edx,[procInfo + MOS_PROCESSINFO.wndHeight] |
sub edx,eax |
sub edx,MOS_WND_SKIN_BORDER_BOTTOM |
cmp ecx,0 ; width too small ? |
jle .bye |
cmp edx,0 ; height too small ? |
jnle .continue |
.bye: |
jmp .byebye |
.continue: |
mov [workwidth],ecx ; save for later (for fpu) |
mov [workheight],edx |
; calculate center of clock (x/y = esi/edi) |
mov esi,[procInfo + MOS_PROCESSINFO.wndWidth] |
shr esi,1 |
mov edi,[procInfo + MOS_PROCESSINFO.wndHeight] |
sub edi,MOS_WND_SKIN_BORDER_BOTTOM |
sub edi,eax |
shr edi,1 |
add edi,eax |
; clear work area |
pushad |
mov ebx,(MOS_WND_SKIN_BORDER_LEFT)*0x10000 ; x start |
or ebx,ecx ; width |
mov ecx,eax ; y start |
shl ecx,16 ; (=skin height) |
or ecx,edx ; height |
mov edx,[wndColors + MOS_WNDCOLORS.work] |
mov eax,MOS_SC_DRAWBAR |
int 0x40 |
popad |
; calculate second hand radii |
fild dword [workwidth] |
fmul dword [SECR_FACTOR] |
fstp dword [SECRX] |
fild dword [workheight] |
fmul dword [SECR_FACTOR] |
fstp dword [SECRY] |
; calculate minute hand radii |
fild dword [workwidth] |
fmul dword [MINR_FACTOR] |
fstp dword [MINRX] |
fild dword [workheight] |
fmul dword [MINR_FACTOR] |
fstp dword [MINRY] |
; calculate hour hand radii |
fild dword [workwidth] |
fmul dword [HOURR_FACTOR] |
fstp dword [HOURRX] |
fild dword [workheight] |
fmul dword [HOURR_FACTOR] |
fstp dword [HOURRY] |
; calculate tick mark radii |
fild dword [workwidth] |
fmul dword [TMR1_FACTOR] |
fstp dword [TMR1X] |
fild dword [workheight] |
fmul dword [TMR1_FACTOR] |
fstp dword [TMR1Y] |
fild dword [workwidth] |
fmul dword [TMR2_FACTOR] |
fstp dword [TMR2X] |
fild dword [workheight] |
fmul dword [TMR2_FACTOR] |
fstp dword [TMR2Y] |
; get system clock (edx) |
mov eax,MOS_SC_GETSYSCLOCK |
int 0x40 |
mov edx,eax |
; draw second hand |
push edx |
mov eax,edx |
shr eax,16 |
call bcdbin |
mov ecx,eax ; save seconds for later |
push ecx |
push eax |
fpush32 0.104719755 ; 2*pi/60 |
push dword [SECRX] |
push dword [SECRY] |
push esi |
push edi |
call getHandCoords |
mov eax,MOS_SC_DRAWLINE |
shl ebx,16 |
or ebx,esi |
shl ecx,16 |
or ecx,edi |
mov edx,[wndColors + MOS_WNDCOLORS.workText] |
int 0x40 |
pop ecx |
pop edx |
; draw minute hand |
push edx |
mov eax,edx |
shr eax,8 |
call bcdbin |
mov edx,60 |
mul edx |
add eax,ecx |
mov ecx,eax ; save for later |
push ecx |
push eax |
fpush32 0.001745329 ; 2*pi/60/60 |
push dword [MINRX] |
push dword [MINRY] |
push esi |
push edi |
call getHandCoords |
mov eax,MOS_SC_DRAWLINE |
shl ebx,16 |
or ebx,esi |
shl ecx,16 |
or ecx,edi |
mov edx,[wndColors + MOS_WNDCOLORS.workText] |
int 0x40 |
pop ecx |
pop edx |
; draw hour hand |
push edx |
mov eax,edx |
call bcdbin |
cmp eax,11 ; % 12 (just to be sure) |
jnae .hoursok |
sub eax,12 |
.hoursok: |
mov edx,60*60 |
mul edx |
add eax,ecx |
push eax |
fpush32 0.000145444 ; 2*pi/60/60/12 |
push dword [HOURRX] |
push dword [HOURRY] |
push esi |
push edi |
call getHandCoords |
mov eax,MOS_SC_DRAWLINE |
shl ebx,16 |
or ebx,esi |
shl ecx,16 |
or ecx,edi |
mov edx,[wndColors + MOS_WNDCOLORS.workText] |
int 0x40 |
pop edx |
; draw tick marks |
mov dword [i],11 ; draw 12 marks |
.drawtickmarks: |
push dword [i] ; calculate start point |
fpush32 0.523598776 ; 2*pi/12 |
push dword [TMR1X] |
push dword [TMR1Y] |
push esi |
push edi |
call getHandCoords |
mov eax,ebx ; save in eax and edx |
mov edx,ecx |
push dword [i] |
fpush32 0.523598776 ; 2*pi/12 |
push dword [TMR2X] |
push dword [TMR2Y] |
push esi |
push edi |
call getHandCoords |
shl eax,16 |
shl edx,16 |
or ebx,eax ; ebx = x start and end |
or ecx,edx ; ecx = y start and end |
mov edx,[wndColors + MOS_WNDCOLORS.workText] |
mov eax,MOS_SC_DRAWLINE |
int 0x40 |
dec dword [i] |
jns .drawtickmarks |
%define DATE_WIDTH 48 |
; calculate text start position |
mov eax,[procInfo+MOS_PROCESSINFO.wndWidth] |
sub eax,DATE_WIDTH ; x = (wndwidth-textwidth)/2 |
shr eax,1 ; eax = x |
fild dword [workheight] ; y = DATE_FACTOR*workheight... |
fmul dword [DATE_FACTOR] |
mov [foo],edi ; ... + y_clockcenter |
fiadd dword [foo] |
fistp dword [foo] |
mov ebx,[foo] ; ebx = y |
; draw text at all ? |
cmp dword [workwidth],DATE_WIDTH ; text too wide ? |
jb .goodbye |
mov ecx,ebx ; text too high ? |
add ecx,10-1 |
mov edx,[procInfo+MOS_PROCESSINFO.wndHeight] |
sub edx,MOS_WND_SKIN_BORDER_BOTTOM |
cmp ecx,edx |
jnae .yousuck |
.goodbye: |
jmp .bye |
.yousuck: |
; ebx = (x << 16) | y |
shl eax,16 |
or ebx,eax |
; get date (edi) |
mov eax,MOS_SC_GETDATE |
int 0x40 |
mov edi,eax |
; display month |
mov eax,edi ; get month |
shr eax,8 |
call bcdbin |
; ebx contains already position |
mov ecx,[wndColors+MOS_WNDCOLORS.workText] |
lea edx,[monthNames-3+eax*2+eax]; -3 because eax = 1..12 =] |
mov esi,3 ; text length |
mov eax,MOS_SC_WRITETEXT |
int 0x40 |
; display date |
add ebx,MOS_DWORD(3*6+3,0) |
mov eax,edi ; get date |
shr eax,16 |
call bcdbin |
mov edx,ebx ; position must be in edx |
mov ebx,0x00020000 ; number, display two digits |
mov ecx,eax ; number to display |
mov esi,[wndColors+MOS_WNDCOLORS.workText] |
mov eax,MOS_SC_WRITENUMBER |
int 0x40 |
; display year. the way we avoid the y2k bug is even |
; simpler, yet much better than in the last version: |
; now we simply display the last two digits and let the |
; user decide wether it's the year 1903 or 2003 =] |
add edx,MOS_DWORD(2*6+3,0) |
mov eax,edi ; get year |
call bcdbin |
mov ebx,0x00020000 ; number, display two digits |
mov ecx,eax ; number to display |
; edx contains already position |
mov esi,[wndColors+MOS_WNDCOLORS.workText] |
mov eax,MOS_SC_WRITENUMBER |
int 0x40 |
.byebye: |
popfd |
popad |
leave |
ret |
%pop |
;********************************************************** |
; bcdbin |
; converts a 8 bit bcd number into a 32 bit binary number |
; |
; in al = 8 bit bcd number |
; out eax = 32 bit binary number |
; destroys dl,flags |
;********************************************************** |
bcdbin: |
push edx |
pushfd |
mov dl,al ; save bcd number |
shr al,4 ; convert upper nibble |
mov ah,10 |
mul ah |
and dl,15 ; add lower nibble |
add al,dl |
and eax,255 ; ! |
popfd |
pop edx |
ret |
;******************************************************************** |
; getHandCoords |
; calculates the end point of a hand |
; |
; input (on stack, push from top to bottom): |
; ANGLE angle (integer) |
; DEG2RAD conversion factor for ANGLE (32 bit real) |
; RADIUSX x radius (32 bit real) |
; RADIUSY y radius (32 bit real) |
; CENTERX x center of the clock (integer) |
; CENTERY y center of the clock (integer) |
; |
; output: |
; ebx x coordinate in bits 0..15, bits 16..31 are zero |
; ecx y coordinate in bits 0..15, bits 16..31 are zero |
; |
; destroys: |
; nothing |
;******************************************************************** |
getHandCoords: |
ANGLE equ 28 |
DEG2RAD equ 24 |
RADIUSX equ 20 |
RADIUSY equ 16 |
CENTERX equ 12 |
CENTERY equ 8 |
enter 0,0 |
pushfd |
fild dword [ebp+ANGLE] ; get angle |
fmul dword [ebp+DEG2RAD] ; convert to radians |
fsincos |
fmul dword [ebp+RADIUSY] ; -y * radius + clockcy |
fchs |
fiadd dword [ebp+CENTERY] |
fistp dword [ebp+CENTERY] |
fmul dword [ebp+RADIUSX] ; x * radius + clockcx |
fiadd dword [ebp+CENTERX] |
fistp dword [ebp+CENTERX] |
mov ebx,[ebp+CENTERX] |
mov ecx,[ebp+CENTERY] |
popfd |
leave |
ret 4*6 |
%endif |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/make.bat |
---|
0,0 → 1,2 |
@rem nasm -t -f bin -o aclock -l aclock.lst aclock.asm -DDEBUG |
nasm -t -f bin -o aclock aclock.asm |
/programs/aclock/trunk/mos.inc |
---|
0,0 → 1,334 |
; mos.inc 0.03 |
; Copyright (c) 2002 Thomas Mathys |
; killer@vantage.ch |
; |
; 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; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
; |
%ifndef _MOS_INC |
%define _MOS_INC |
;********************************************************** |
; generates a menuetos 01 header |
; takes 6 parameters: |
; |
; MOS_HEADER01 start, end, appmem, esp, i_param, i_icon |
;********************************************************** |
%macro MOS_HEADER01 6 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd %1 ; start of code |
dd %2 ; image size |
dd %3 ; application memory |
dd %4 ; esp |
dd %5 ; i_param |
dd %6 ; i_icon |
%endmacro |
;********************************************************** |
; MOS_DWORD |
; packs 2 words into a double word |
;********************************************************** |
%define MOS_DWORD(hi,lo) ((((hi) & 0xffff) << 16) + ((lo) & 0xffff)) |
;********************************************************** |
; MOS_RGB |
; creates a menuet os compatible color (0x00RRGGBB) |
;********************************************************** |
%define MOS_RGB(r,g,b) ((((r) & 255) << 16) + (((g) & 255) << 8) + ((b) & 255)) |
;********************************************************** |
; window stuff |
;********************************************************** |
; default window colors |
struc MOS_WNDCOLORS |
.frame: resd 1 |
.grab: resd 1 |
.grabButton: resd 1 |
.grabButtonText: resd 1 |
.grabText: resd 1 |
.work: resd 1 |
.workButton: resd 1 |
.workButtonText: resd 1 |
.workText: resd 1 |
.workGraphics: resd 1 |
endstruc |
; skinned window borders |
MOS_WND_SKIN_BORDER_LEFT equ 5 |
MOS_WND_SKIN_BORDER_RIGHT equ 5 |
MOS_WND_SKIN_BORDER_BOTTOM equ 5 |
;********************************************************** |
; process info structure |
;********************************************************** |
struc MOS_PROCESSINFO |
.CPUUsage: resd 1 |
.windowStackPos: resw 1 |
.windowStackVal: resw 1 |
.reserved1: resw 1 |
.processName: resb 12 |
.memStart: resd 1 |
.memUsed: resd 1 |
.pid: resd 1 |
.wndXPos resd 1 |
.wndYPos resd 1 |
.wndWidth resd 1 |
.wndHeight resd 1 |
.reserved2: resb (1024 - 50) |
endstruc |
;********************************************************** |
; system call numbers |
;********************************************************** |
MOS_SC_EXIT equ -1 |
MOS_SC_DEFINEWINDOW equ 0 |
MOS_SC_PUTPIXEL equ 1 |
MOS_SC_GETKEY equ 2 |
MOS_SC_GETSYSCLOCK equ 3 |
MOS_SC_WRITETEXT equ 4 |
MOS_SC_DELAY equ 5 |
MOS_SC_OPENFILEFLOPPY equ 6 ; obsolete |
MOS_SC_PUTIMAGE equ 7 |
MOS_SC_DEFINEBUTTON equ 8 |
MOS_SC_GETPROCESSINFO equ 9 |
MOS_SC_WAITEVENT equ 10 |
MOS_SC_CHECKEVENT equ 11 |
MOS_SC_REDRAWSTATUS equ 12 |
MOS_SC_DRAWBAR equ 13 |
MOS_SC_GETSCREENMAX equ 14 |
MOS_SC_SETBACKGROUND equ 15 |
MOS_SC_GETPRESSEDBUTTON equ 17 |
MOS_SC_SYSTEMSERVICE equ 18 |
MOS_SC_STARTPROGRAM equ 19 ; obsolete |
MOS_SC_MIDIINTERFACE equ 20 |
MOS_SC_DEVICESETUP equ 21 |
MOS_SC_WAITEVENTTIMEOUT equ 23 |
MOS_SC_CDAUDIO equ 24 |
MOS_SC_SB16MIXER1 equ 25 |
MOS_SC_GETDEVICESETUP equ 26 |
MOS_SC_WSS equ 27 |
MOS_SC_SB16MIXER2 equ 28 |
MOS_SC_GETDATE equ 29 |
MOS_SC_READHD equ 30 ; obsolete |
MOS_SC_STARTPROGRAMHD equ 31 ; obsolete |
MOS_SC_DELETEFILEFLOPPY equ 32 |
MOS_SC_SAVEFILERAMDISK equ 33 ; obsolete |
MOS_SC_READDIRRAMDISK equ 34 ; obsolete |
MOS_SC_GETSCREENPIXEL equ 35 |
MOS_SC_GETMOUSEPOSITION equ 37 |
MOS_SC_DRAWLINE equ 38 |
MOS_SC_GETBACKGROUND equ 39 |
MOS_SC_SETEVENTMASK equ 40 |
MOS_SC_GETIRQOWNER equ 41 |
MOS_SC_GETDATAREADBYIRQ equ 42 |
MOS_SC_SENDDATATODEVICE equ 43 |
MOS_SC_PROGRAMIRQS equ 44 |
MOS_SC_RESERVEFREEIRQ equ 45 |
MOS_SC_RESERVEFREEPORTS equ 46 |
MOS_SC_WRITENUMBER equ 47 |
MOS_SC_WINDOWPROPERTIES equ 48 |
MOS_SC_SHAPEDWINDOWS equ 50 |
MOS_SC_CREATETHREAD equ 51 |
MOS_SC_STACKDRIVERSTATE equ 52 |
MOS_SC_SOCKETINTERFACE equ 53 |
MOS_SC_SOUNDINTERFACE equ 55 |
MOS_SC_WRITEFILEHD equ 56 ; obsolete |
MOS_SC_DELETEFILEHD equ 57 |
MOS_SC_SYSTREEACCESS equ 58 |
MOS_SC_SYSCALLTRACE equ 59 |
MOS_SC_IPC equ 60 |
MOS_SC_DIRECTGRAPHICS equ 61 |
MOS_SC_PCI equ 62 |
MOS_SC_DEBUGBOARD equ 63 |
;********************************************************** |
; event numbers |
;********************************************************** |
MOS_EVT_NONE equ 0 |
MOS_EVT_REDRAW equ 1 |
MOS_EVT_KEY equ 2 |
MOS_EVT_BUTTON equ 3 |
;********************************************************** |
; event bits |
;********************************************************** |
MOS_EVTBIT_REDRAW equ (1 << 0) |
MOS_EVTBIT_KEY equ (1 << 1) |
MOS_EVTBIT_BUTTON equ (1 << 2) |
MOS_EVTBIT_ENDREQUEST equ (1 << 3) |
MOS_EVTBIT_BGDRAW equ (1 << 4) |
MOS_EVTBIT_MOUSECHANGE equ (1 << 5) |
MOS_EVTBIT_IPCEVENT equ (1 << 6) |
MOS_EVTBIT_IRQ0 equ (1 << 16) |
MOS_EVTBIT_IRQ1 equ (1 << 17) |
MOS_EVTBIT_IRQ2 equ (1 << 18) |
MOS_EVTBIT_IRQ3 equ (1 << 19) |
MOS_EVTBIT_IRQ4 equ (1 << 20) |
MOS_EVTBIT_IRQ5 equ (1 << 21) |
MOS_EVTBIT_IRQ6 equ (1 << 22) |
MOS_EVTBIT_IRQ7 equ (1 << 23) |
MOS_EVTBIT_IRQ8 equ (1 << 24) |
MOS_EVTBIT_IRQ9 equ (1 << 25) |
MOS_EVTBIT_IRQ10 equ (1 << 26) |
MOS_EVTBIT_IRQ11 equ (1 << 27) |
MOS_EVTBIT_IRQ12 equ (1 << 28) |
MOS_EVTBIT_IRQ13 equ (1 << 29) |
MOS_EVTBIT_IRQ14 equ (1 << 30) |
MOS_EVTBIT_IRQ15 equ (1 << 31) |
;********************************************************** |
; exit application (syscall -1) |
;********************************************************** |
; exit application |
%macro MOS_EXIT 0 |
mov eax,MOS_SC_EXIT |
int 0x40 |
%endmacro |
; exit application, smaller version |
%macro MOS_EXIT_S 0 |
xor eax,eax |
dec eax |
int 0x40 |
%endmacro |
;********************************************************** |
; wait event stuff |
; (MOS_SC_WAITEVENT, syscall 10) |
;********************************************************** |
; wait for event |
; destroys : nothing |
; returns : eax = event type |
%macro MOS_WAITEVENT 0 |
mov eax,MOS_SC_WAITEVENT |
int 0x40 |
%endmacro |
; wait for event, smaller version |
; destroys : flags |
; returns : eax = event type |
%macro MOS_WAITEVENT_S 0 |
xor eax,eax |
mov al,MOS_SC_WAITEVENT |
int 0x40 |
%endmacro |
;********************************************************** |
; window redraw status stuff |
; (MOS_SC_REDRAWSTATUS, syscall 12) |
;********************************************************** |
MOS_RS_STARTREDRAW equ 1 |
MOS_RS_ENDREDRAW equ 2 |
; start window redraw |
; destroys: eax,ebx |
%macro MOS_STARTREDRAW 0 |
mov ebx,MOS_RS_STARTREDRAW |
mov eax,MOS_SC_REDRAWSTATUS |
int 0x40 |
%endmacro |
; start window redraw, smaller version |
; destroys: eax,ebx,flags |
%macro MOS_STARTREDRAW_S 0 |
xor ebx,ebx |
inc ebx |
xor eax,eax |
mov al,MOS_SC_REDRAWSTATUS |
int 0x40 |
%endmacro |
; end window redraw |
; destroys: eax,ebx |
%macro MOS_ENDREDRAW 0 |
mov ebx,MOS_RS_ENDREDRAW |
mov eax,MOS_SC_REDRAWSTATUS |
int 0x40 |
%endmacro |
; end window redraw, smaller version |
; destroys: eax,ebx,flags |
%macro MOS_ENDREDRAW_S 0 |
xor ebx,ebx |
mov bl,MOS_RS_ENDREDRAW |
xor eax,eax |
mov al,MOS_SC_REDRAWSTATUS |
int 0x40 |
%endmacro |
;********************************************************** |
; get screen max stuff (syscall 14) |
;********************************************************** |
; get screen dimensions in eax |
; destroys: nothing |
%macro MOS_GETSCREENMAX 0 |
mov eax,MOS_SC_GETSCREENMAX |
int 0x40 |
%endmacro |
; get screen dimensions in eax, smaller version |
; destroys: flags |
%macro MOS_GETSCREENMAX_S 0 |
xor eax,eax |
mov al,MOS_SC_GETSCREENMAX |
int 0x40 |
%endmacro |
;******************************************************************** |
; opcode hacks |
;******************************************************************** |
; nasm refuses to assemble stuff like |
; push dword 4.44 |
; with the following macro this becomes possible: |
; fpush32 9.81 |
; don't forget to use a decimal point. things like |
; fpush32 1 |
; will probably not do what you expect. instead, write: |
; fpush32 1.0 |
%macro fpush32 1 |
db 0x68 ; push imm32 |
dd %1 |
%endm |
%endif |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/str2dwrd.inc |
---|
0,0 → 1,92 |
; string2dword - a useless string to double word conversion routine |
; |
; Copyright (c) 2003 Thomas Mathys |
; killer@vantage.ch |
; |
; 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; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
; |
;******************************************************************** |
; converts an asciiz string into an unsigned doubleword. |
; (base 10 is assumed) |
; |
; - first, leading whitespaces are skipped |
; - then the function converts the string, until it |
; finds the terminating zero, another character it |
; cannot convert or the number becomes too large. |
; |
; input : esi = pointer to string |
; output : eax = unsigned doubleword |
; the function tries to convert as |
; many digits as possible, before it |
; stops. if the value of the dword |
; becomes too large, 0xffffffff is |
; returned. |
; destroys : nothing |
;******************************************************************** |
string2dword: |
push ebx |
push ecx |
push edx |
push esi |
pushfd |
xor ebx,ebx ; ebx : dword |
; skip leading whitespaces |
.skipspaces: |
lodsb |
cmp al,32 ; space |
je .skipspaces |
cmp al,12 ; ff |
je .skipspaces |
cmp al,10 ; lf |
je .skipspaces |
cmp al,13 ; cr |
je .skipspaces |
cmp al,9 ; ht |
je .skipspaces |
cmp al,11 ; vt |
je .skipspaces |
; convert string |
dec esi ; esi -> 1st non-whitespace |
.convert: |
xor eax,eax ; get character |
lodsb |
sub al,'0' ; convert to digit |
cmp al,9 ; is digit in range [0,9] ? |
ja .done ; nope -> stop conversion |
mov ecx,eax ; save new digit |
mov eax,10 ; dword = dword * 10 |
mul ebx |
jc .overflow |
add eax,ecx ; + new digit |
jc .overflow |
mov ebx,eax |
jmp .convert |
.overflow: |
mov ebx,0xffffffff |
.done: |
mov eax,ebx |
popfd |
pop esi |
pop edx |
pop ecx |
pop ebx |
ret |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/strlen.inc |
---|
0,0 → 1,49 |
; strlen function |
; |
; Copyright (c) 2003 Thomas Mathys |
; killer@vantage.ch |
; |
; 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; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
; |
%ifndef _STRLEN_INC |
%define _STRLEN_INC |
;******************************************************************** |
; returns the length of an asciiz string |
; input : esi = pointer to string |
; output : eax = string length |
; destroys : nothing |
;******************************************************************** |
strlen: |
push ecx |
push edi |
pushfd |
cld ; ! |
mov ecx,-1 |
mov edi,esi ; find terminating zero |
xor al,al |
repne scasb |
mov eax,edi ; calculate string length |
sub eax,esi |
dec eax |
popfd |
pop edi |
pop ecx |
ret |
%endif |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/aclock/trunk/strtok.inc |
---|
0,0 → 1,125 |
; some strtok-like function |
; |
; Copyright (c) 2003 Thomas Mathys |
; killer@vantage.ch |
; |
; 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; if not, write to the Free Software |
; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
; |
%ifndef _STRTOK_INC |
%define _STRTOK_INC |
;******************************************************************** |
; strtok |
; this function works like strtok from a c runtime library. |
; note that it is not threadsafe. it would be an easy task |
; to make it threadsafe, though: |
; .adx must be removed, instead the last search address is |
; stored at some location provided by the user (passed as |
; a third parameter in ecx or so) |
; |
; input: |
; |
; eax : address of string to be searched (asciiz), or |
; 0 to get the next token of the current string |
; ebx : address of delimiter list (asciiz) |
; |
; output: |
; |
; eax : pointer to the next token, or 0 if there |
; aren't any tokens anymore. |
; |
; destroys: nothing |
; |
;******************************************************************** |
strtok: |
pushad |
pushfd |
; get start address |
; if the new start address is 0, and the old address (.adx) |
; is also 0, then there's nothing to do and we return 0. |
or eax,eax ; new address = 0 ? |
jz .nonewstring ; nope -> use old string |
mov [.adx],eax ; yeah -> store new string adx |
.nonewstring: |
mov esi,[.adx] ; load string address |
or esi,esi ; 0 ? |
jnz .startadxok ; nope -> ok |
xor eax,eax ; yeah -> return 0 |
je .bye |
.startadxok: |
; skip leading delimiters |
.skipdelimiters: |
lodsb ; read character |
mov edi,ebx ; edi -> delimiter list |
.foo: |
mov cl,[edi] ; get delimiter |
inc edi |
or cl,cl ; end of delimiter list |
jz .endofdelimiterlist |
cmp al,cl ; if AL is a delimiter, then |
je .skipdelimiters ; we need to skip it too... |
jmp .foo ; otherwise try next delimiter |
.endofdelimiterlist: |
; end of string reached without finding any non-delimiters ? |
or al,al ; character = 0 ? |
jnz .bar ; nope -> continue |
mov dword [.adx],0 ; yeah -> remember this |
xor eax,eax ; and return 0 |
jmp .bye |
.bar: |
; found the start of a token, let's store its address |
mov edx,esi |
dec edx ; edx = start address of token |
; find the end of the token |
.abraham: |
lodsb ; get character |
mov edi,ebx ; edi -> delimiter list |
.bebraham: |
mov cl,[edi] ; get delimiter |
inc edi |
cmp al,cl ; is AL a delimiter ? |
jne .cebraham ; nope -> continue |
or al,al ; terminating zero found ? |
jnz .argle |
xor esi,esi ; yeah -> remember this |
jmp .bargle |
.argle: |
mov byte [esi-1],0 ; nope -> mark end of token |
.bargle: |
mov [.adx],esi ; remember search address |
mov eax,edx ; return token address |
jmp .bye |
.cebraham: |
or cl,cl ; end of delimiter list ? |
jnz .bebraham ; nope -> try next delimiter |
jmp .abraham |
; write return value into stack, so that when popad |
; gets executed, eax will receive the return value. |
.bye: |
mov [esp+4*8],eax |
popfd |
popad |
ret |
.adx dd 0 |
%endif |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/airc/trunk/airc.asm |
---|
0,0 → 1,2359 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; IRC CLIENT for MenuetOS ;; |
;; ;; |
;; License: GPL / See file COPYING for details ;; |
;; Copyright 2004 (c) Ville Turjanmaa ;; |
;; ;; |
;; Compile with FASM for Menuet ;; |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
version equ '0.3' |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; required os |
dd START ; program start |
dd I_END ; program image size |
dd 0x100000 ; required amount of memory |
dd 0x100000 |
dd 0,0 |
include "lang.inc" |
include "macros.inc" |
irc_server_ip db 192,168,1,1 |
user_nick dd 4 ; length |
db 'airc ' ; string |
user_real_name dd 8 ; length |
db 'Joe User ' ; string |
START: ; start of execution |
mov eax,40 |
mov ebx,10000111b |
int 0x40 |
mov edi,I_END |
mov ecx,60*120 |
mov eax,32 |
cld |
rep stosb |
mov eax,[rxs] |
imul eax,11 |
mov [pos],eax |
mov ebp,0 |
mov edx,I_END |
call draw_window ; at first, draw the window |
still: |
inc [cursor_on_off] |
mov eax,5 |
mov ebx,1 |
int 0x40 |
mov eax,11 ; wait here for event |
int 0x40 |
call print_status |
cmp eax,1 ; redraw |
je redraw |
cmp eax,2 ; key |
je main_window_key |
cmp eax,3 ; button |
je button |
cmp [I_END+120*60],byte 1 |
jne no_main_update |
mov [I_END+120*60],byte 0 |
mov edx,I_END |
call draw_channel_text |
no_main_update: |
call read_incoming_data |
call send_data_to_server |
test [cursor_on_off],0x3f |
jnz nopri |
inc [blink] |
call blink_cursor |
call print_channel_list |
nopri: |
jmp still |
redraw: ; redraw |
call draw_window |
jmp still |
button: ; button |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 ; close program |
jne noclose |
mov eax,-1 |
int 0x40 |
noclose: |
call socket_commands |
jmp still |
print_status: |
pusha |
mov eax,53 |
mov ebx,6 |
mov ecx,[socket] |
int 0x40 |
mov [status],eax |
cmp [old_status],eax |
je nopr |
mov [old_status],eax |
push eax |
mov eax,13 |
mov ebx,450*65536+30 |
mov ecx,231*65536+10 |
mov edx,0xffffff |
int 0x40 |
pop ecx |
mov eax,47 |
mov ebx,2*65536 |
mov edx,450*65536+231 |
mov esi,0x000000 |
int 0x40 |
nopr: |
popa |
ret |
status dd 0 |
old_status dd 0 |
socket_commands: |
cmp ah,22 ; open socket |
jnz tst3 |
mov eax,3 |
int 0x40 |
mov ecx,eax |
mov eax,53 |
mov ebx,5 |
mov edx,6667 |
mov esi,dword [irc_server_ip] |
mov edi,1 |
int 0x40 |
mov [socket], eax |
ret |
tst3: |
cmp ah,23 ; write userinfo |
jnz tst4 |
mov eax,53 ; user |
mov ebx,7 |
mov ecx,[socket] |
mov edx,string0l-string0 |
mov esi,string0 |
int 0x40 |
mov eax,53 ; |
mov ebx,7 |
mov ecx,[socket] |
mov edx,[user_real_name] |
mov esi,user_real_name+4 |
int 0x40 |
mov eax,53 ; |
mov ebx,7 |
mov ecx,[socket] |
mov edx,2 |
mov esi,line_feed |
int 0x40 |
mov eax,5 |
mov ebx,10 |
int 0x40 |
mov eax,53 ; nick |
mov ebx,7 |
mov ecx,[socket] |
mov edx,string1l-string1 |
mov esi,string1 |
int 0x40 |
mov eax,53 ; |
mov ebx,7 |
mov ecx,[socket] |
mov edx,[user_nick] |
mov esi,user_nick+4 |
int 0x40 |
mov eax,53 ; |
mov ebx,7 |
mov ecx,[socket] |
mov edx,2 |
mov esi,line_feed |
int 0x40 |
ret |
line_feed: db 13,10 |
tst4: |
cmp ah,24 ; close socket |
jnz no_24 |
mov eax,53 |
mov ebx,8 |
mov ecx,[socket] |
int 0x40 |
ret |
no_24: |
ret |
main_window_key: |
mov eax,2 |
int 0x40 |
shr eax,8 |
cmp eax,8 |
jne no_bks2 |
cmp [xpos],0 |
je still |
dec [xpos] |
call print_entry |
jmp still |
no_bks2: |
cmp eax,20 |
jbe no_character2 |
mov ebx,[xpos] |
mov [send_string+ebx],al |
inc [xpos] |
cmp [xpos],80 |
jb noxposdec |
mov [xpos],79 |
noxposdec: |
call print_entry |
jmp still |
no_character2: |
cmp eax,13 |
jne no_send |
cmp [xpos],0 |
je no_send2 |
cmp [send_string],byte '/' ; server command |
jne no_send2 |
mov [send_to_server],1 |
jmp still |
no_send2: |
jmp still |
print_channel_list: |
pusha |
mov eax,13 |
mov ebx,415*65536+6*13 |
mov ecx,27*65536+12*10 |
mov edx,0xffffff |
int 0x40 |
mov eax,4 |
mov ebx,415*65536+27 |
mov ecx,[index_list_1] |
mov edx,channel_list+32 |
newch: |
movzx esi,byte [edx+31] |
and esi,0x1f |
int 0x40 |
add edx,32 |
add ebx,12 |
cmp edx,channel_list+32*10 |
jbe newch |
no_channel_list: |
popa |
ret |
print_user_list: |
pusha |
newtry: |
mov edx,ebp |
imul edx,120*80 |
add edx,120*60+8+I_END |
cmp [edx],byte 1 |
je nonp |
mov edx,ebp |
imul edx,120*80 |
add edx,120*70+I_END |
mov edi,edx |
mov eax,[edx-8] |
mov ebx,[edx-4] |
add ebx,edx |
sub ebx,3 |
inc eax |
dec edx |
newnss: |
inc edx |
dec eax |
jz startuu |
asdf: |
cmp [edx],word ' ' |
jne nodouble |
inc edx |
nodouble: |
cmp [edx],byte ' ' |
je newnss |
inc edx |
cmp edx,ebx |
jbe asdf |
dec dword [edi-8] |
popa |
ret |
startuu: |
cmp [edx],byte ' ' |
jne startpr |
inc edx |
startpr: |
pusha |
mov eax,13 |
mov ebx,415*65536+6*13 |
mov ecx,27*65536+12*10 |
mov edx,0xffffff |
int 0x40 |
popa |
mov eax,4 |
mov ebx,415*65536+27 |
mov ebp,0 |
newuser: |
mov esi,0 |
newusers: |
cmp [edx+esi],byte ' ' |
je do_print |
inc esi |
cmp esi,20 |
jbe newusers |
do_print: |
mov ecx,[index_list_1] |
cmp [edx],byte '@' |
jne no_op |
mov ecx,[index_list_2] |
no_op: |
int 0x40 |
inc ebp |
cmp ebp,10 |
je nonp |
add ebx,12 |
add edx,esi |
inc edx |
cmp [edx],byte ' ' |
jne newuser |
inc edx |
jmp newuser |
nonp: |
popa |
ret |
start_user_list_at dd 0x0 |
send_data_to_server: |
pusha |
cmp [send_to_server],1 |
jne sdts_ret |
mov eax,[xpos] |
mov [send_string+eax+0],byte 13 |
mov [send_string+eax+1],byte 10 |
mov eax,[rxs] |
imul eax,11 |
mov [pos],eax |
mov eax,[send_to_channel] |
imul eax,120*80 |
add eax,I_END |
mov [text_start],eax |
cmp [send_string],byte '/' ; server command |
je server_command |
mov bl,13 |
call print_character |
mov bl,10 |
call print_character |
mov bl,'<' |
call print_character |
mov esi,user_nick+4 |
mov ecx,[user_nick] |
newnp: |
mov bl,[esi] |
call print_character |
inc esi |
loop newnp |
mov bl,'>' |
call print_character |
mov bl,' ' |
call print_character |
mov ecx,[xpos] |
mov esi,send_string |
newcw: |
mov bl,[esi] |
call print_character |
inc esi |
loop newcw |
mov eax,dword [send_to_channel] |
shl eax,5 |
add eax,channel_list |
mov esi,eax |
mov edi,send_string_header+8 |
movzx ecx,byte [eax+31] |
cld |
rep movsb |
mov [edi],word ' :' |
mov esi, send_string_header |
mov edx,10 |
movzx ebx,byte [eax+31] |
add edx,ebx |
mov eax, 53 ; write channel |
mov ebx, 7 |
mov ecx, [socket] |
int 0x40 |
mov esi,send_string |
mov edx,[xpos] |
inc edx |
mov eax, 53 ; write message |
mov ebx, 7 |
mov ecx, [socket] |
int 0x40 |
jmp send_done |
server_command: |
cmp [send_string+1],dword 'anic' |
jne no_set_nick |
mov ecx,[xpos] |
sub ecx,7 |
mov [user_nick],ecx |
mov esi,send_string+7 |
mov edi,user_nick+4 |
cld |
rep movsb |
pusha |
mov edi,text+70*1+15 |
mov eax,32 |
mov ecx,15 |
cld |
rep stosb |
popa |
mov esi,user_nick+4 |
mov edi,text+70*1+15 |
mov ecx,[user_nick] |
cld |
rep movsb |
call draw_window |
mov [xpos],0 |
mov [send_to_server],0 |
popa |
ret |
no_set_nick: |
cmp [send_string+1],dword 'area' |
jne no_set_real_name |
mov ecx,[xpos] |
sub ecx,7 |
mov [user_real_name],ecx |
mov esi,send_string+7 |
mov edi,user_real_name+4 |
cld |
rep movsb |
pusha |
mov edi,text+70*0+15 |
mov eax,32 |
mov ecx,15 |
cld |
rep stosb |
popa |
mov esi,user_real_name+4 |
mov edi,text+70*0+15 |
mov ecx,[xpos] |
sub ecx,7 |
cld |
rep movsb |
call draw_window |
mov [xpos],0 |
mov [send_to_server],0 |
popa |
ret |
no_set_real_name: |
cmp [send_string+1],dword 'aser' |
jne no_set_server |
pusha |
mov edi,irc_server_ip |
mov esi,send_string+7 |
mov eax,0 |
mov edx,[xpos] |
add edx,send_string-1 |
newsip: |
cmp [esi],byte '.' |
je sipn |
cmp esi,edx |
jg sipn |
movzx ebx,byte [esi] |
inc esi |
imul eax,10 |
sub ebx,48 |
add eax,ebx |
jmp newsip |
sipn: |
mov [edi],al |
xor eax,eax |
inc esi |
cmp esi,send_string+30 |
jg sipnn |
inc edi |
cmp edi,irc_server_ip+3 |
jbe newsip |
sipnn: |
popa |
mov ecx,[xpos] |
sub ecx,7 |
pusha |
mov edi,text+70*2+15 |
mov eax,32 |
mov ecx,15 |
cld |
rep stosb |
popa |
mov esi,send_string+7 |
mov edi,text+70*2+15 |
cld |
rep movsb |
call draw_window |
mov [xpos],0 |
mov [send_to_server],0 |
popa |
ret |
no_set_server: |
cmp [send_string+1],dword 'quer' |
jne no_query_create |
mov edi,I_END+120*80 |
mov eax,1 ; create channel window - search for empty slot |
newse2: |
mov ebx,eax |
shl ebx,5 |
cmp dword [channel_list+ebx],dword ' ' |
je free_found2 |
add edi,120*80 |
inc eax |
cmp eax,[max_windows] |
jb newse2 |
free_found2: |
mov edx,send_string+7 |
mov ecx,[xpos] |
sub ecx,7 |
mov [channel_list+ebx+31],cl |
call create_channel_name |
push edi |
push eax |
mov [edi+120*60+8],byte 1 ; query window |
mov eax,32 |
mov ecx,120*60 |
cld |
rep stosb |
pop eax |
pop edi |
; eax has the free position |
mov [thread_screen],edi |
call create_channel_window |
mov [xpos],0 |
mov [send_to_server],0 |
popa |
ret |
no_query_create: |
mov esi, send_string+1 |
mov edx, [xpos] |
add edx,1 |
mov eax, 53 ; write server command |
mov ebx, 7 |
mov ecx, [socket] |
int 0x40 |
send_done: |
mov [xpos],0 |
mov [send_to_server],0 |
cmp [send_string+1],dword 'quit' |
jne no_quit_server |
mov eax,5 |
mov ebx,200 |
int 0x40 |
mov eax, 53 ; close socket |
mov ebx, 8 |
mov ecx, [socket] |
int 0x40 |
mov ecx,[max_windows] |
mov edi,I_END |
newclose: |
mov [edi+120*60+4],byte 1 |
add edi,120*80 |
loop newclose |
popa |
ret |
no_quit_server: |
sdts_ret: |
popa |
ret |
read_incoming_data: |
pusha |
read_new_byte: |
call read_incoming_byte |
cmp ecx,-1 |
je no_data_in_buffer |
cmp bl,10 |
jne no_start_command |
mov [cmd],1 |
no_start_command: |
cmp bl,13 |
jne no_end_command |
mov eax,[cmd] |
mov [eax+command-2],byte 0 |
call analyze_command |
mov edi,command |
mov ecx,250 |
mov eax,0 |
cld |
rep stosb |
mov [cmd],0 |
no_end_command: |
mov eax,[cmd] |
cmp eax,512 |
jge still |
mov [eax+command-2],bl |
inc [cmd] |
jmp read_new_byte |
no_data_in_buffer: |
popa |
ret |
create_channel_name: |
pusha |
search_first_letter: |
cmp [edx],byte ' ' |
jne first_letter_found |
inc edx |
jmp search_first_letter |
first_letter_found: |
mov esi,edx |
mov edi,channel_list |
add edi,ebx |
mov ecx,30 |
xor eax,eax |
newcase: |
mov al,[esi] |
cmp eax,'a' |
jb nocdec |
cmp eax,'z' |
jg nocdec |
sub al,97-65 |
nocdec: |
mov [edi],al |
inc esi |
inc edi |
loop newcase |
popa |
ret |
create_channel_window: |
pusha |
mov [cursor_on_off],0 |
mov [thread_nro],eax |
mov eax,51 |
mov ebx,1 |
mov ecx,channel_thread |
mov edx,[thread_stack] |
int 0x40 |
mov eax,5 |
mov ebx,10 |
int 0x40 |
add [thread_stack],0x4000 |
add [thread_screen],120*80 |
popa |
ret |
print_entry: |
pusha |
mov eax,13 |
mov ebx,8*65536+6*80 |
mov ecx,151*65536+13 |
mov edx,0xffffff |
int 0x40 |
mov eax,4 |
mov ebx,8*65536+154 |
mov ecx,0x000000 |
mov edx,send_string |
mov esi,[xpos] |
int 0x40 |
popa |
ret |
blink dd 0x0 |
blink_cursor: |
pusha |
mov eax,9 |
mov ebx,0xe0000 |
mov ecx,-1 |
int 0x40 |
mov edx,[blink] |
and edx,1 |
sub edx,1 |
and edx,0xffffff |
; mov edx,0 |
cmp ax,word [0xe0000+4] |
jne no_blink |
call print_entry |
mov ebx,[xpos] |
imul ebx,6 |
add ebx,8 |
mov cx,bx |
shl ebx,16 |
mov bx,cx |
mov ecx,151*65536+163 |
mov eax,38 |
int 0x40 |
popa |
ret |
no_blink: |
mov eax,13 |
mov ebx,8*65536+6*60 |
mov ecx,151*65536+13 |
mov edx,0xffffff |
int 0x40 |
popa |
ret |
set_channel: |
pusha |
; UPPER / LOWER CASE CHECK |
mov esi,eax |
mov edi,channel_temp |
mov ecx,40 |
xor eax,eax |
newcase2: |
mov al,[esi] |
cmp eax,'#' |
jb newcase_over2 |
cmp eax,'a' |
jb nocdec2 |
cmp eax,'z' |
jg nocdec2 |
sub al,97-65 |
nocdec2: |
mov [edi],al |
inc esi |
inc edi |
loop newcase2 |
newcase_over2: |
sub edi,channel_temp |
mov [channel_temp_length],edi |
mov eax,channel_temp |
mov [text_start],I_END+120*80 |
mov ebx,channel_list+32 |
mov eax,[eax] |
mov edx,[channel_temp_length] |
stcl1: |
cmp dl,[ebx+31] |
jne notfound |
pusha |
xor eax,eax |
xor edx,edx |
mov ecx,0 |
stc4: |
mov dl,[ebx+ecx] |
mov al,[channel_temp+ecx] |
cmp eax,edx |
jne notfound2 |
inc ecx |
cmp ecx,[channel_temp_length] |
jb stc4 |
popa |
jmp found |
notfound2: |
popa |
notfound: |
add [text_start],120*80 |
add ebx,32 |
cmp ebx,channel_list+19*32 |
jb stcl1 |
mov [text_start],I_END |
found: |
popa |
ret |
channel_temp: times 100 db 0 |
channel_temp_length dd 0x0 |
print_nick: |
pusha |
mov eax,command+1 |
mov dl,'!' |
call print_text |
popa |
ret |
analyze_command: |
pusha |
mov [text_start],I_END |
mov ecx,[rxs] |
imul ecx,11 |
mov [pos],ecx |
mov bl,13 |
; call print_character |
mov bl,10 |
; call print_character |
mov ecx,[cmd] |
sub ecx,2 |
mov esi,command+0 |
newcmdc: |
mov bl,[esi] |
; call print_character |
inc esi |
loop newcmdc |
mov edx,I_END |
; call draw_channel_text |
cmp [cmd],20 |
jge cmd_len_ok |
mov [cmd],0 |
popa |
ret |
cmd_len_ok: |
cmp [command],dword 'PING' ; ping response |
jne no_ping_responce |
call print_command_to_main |
mov [command],dword 'PONG' |
call print_command_to_main |
mov eax,4 |
mov ebx,100*65536+3 |
mov ecx,0xffffff |
mov edx,command |
mov esi,[cmd] |
mov [command+esi-1],word '**' |
; int 0x40 |
mov eax,53 |
mov ebx,7 |
mov ecx,[socket] |
mov edx,[cmd] |
sub edx,2 |
and edx,255 |
mov esi,command |
int 0x40 |
mov eax,53 |
mov ebx,7 |
mov ecx,[socket] |
mov edx,2 |
mov esi,linef |
int 0x40 |
popa |
ret |
linef db 13,10 |
no_ping_responce: |
mov eax,[rxs] |
imul eax,11 |
mov [pos],eax |
mov [command],byte '<' |
mov eax,command |
mov ecx,100 |
new_blank: |
cmp [eax],byte ' ' |
je bl_found |
inc eax |
loop new_blank |
mov eax,50 |
bl_found: |
inc eax |
mov [command_position],eax |
mov esi,eax |
mov edi,irc_command |
mov ecx,8 |
cld |
rep movsb |
cmp [irc_command],'PRIV' ; message to channel |
jne no_privmsg |
; compare nick |
mov eax,[command_position] |
add eax,8 |
call compare_to_nick |
cmp [cresult],0 |
jne no_query_msg |
mov eax,command+1 |
no_query_msg: |
call set_channel |
mov ecx,100 ; [cmd] |
mov eax,command+10 |
acl3: |
cmp [eax],byte ':' |
je acl4 |
inc eax |
loop acl3 |
mov eax,10 |
acl4: |
inc eax |
cmp [eax+1],dword 'ACTI' |
jne no_action |
push eax |
mov eax,action_header_short |
mov dl,0 |
call print_text |
mov eax,command+1 |
mov dl,'!' |
call print_text |
mov bl,' ' |
call print_character |
pop eax |
add eax,8 |
mov dl,0 |
call print_text |
popa |
ret |
no_action: |
push eax |
mov bl,10 |
call print_character |
mov eax,command |
mov dl,'!' |
call print_text |
mov bl,'>' |
call print_character |
mov bl,' ' |
call print_character |
pop eax |
mov dl,0 |
call print_text |
popa |
ret |
no_privmsg: |
cmp [irc_command],'PART' ; channel leave |
jne no_part |
; compare nick |
mov eax,command+1 |
call compare_to_nick |
cmp [cresult],0 |
jne no_close_window |
mov eax,[command_position] |
add eax,5 |
call set_channel |
mov eax,[text_start] |
mov [eax+120*60+4],byte 1 |
popa |
ret |
no_close_window: |
mov eax,[command_position] |
add eax,5 |
call set_channel |
mov eax,action_header_red |
mov dl,0 |
call print_text |
mov eax,command+1 |
mov dl,'!' |
mov cl,' ' |
call print_text |
mov eax,has_left_channel |
mov dl,0 |
call print_text |
mov eax,[command_position] |
add eax,5 |
mov dl,' ' |
call print_text |
popa |
ret |
no_part: |
cmp [irc_command],'JOIN' ; channel join |
jne no_join |
; compare nick |
mov eax,command+1 |
call compare_to_nick |
cmp [cresult],0 |
jne no_new_window |
mov edi,I_END+120*80 |
mov eax,1 ; create channel window - search for empty slot |
newse: |
mov ebx,eax |
shl ebx,5 |
cmp dword [channel_list+ebx],dword ' ' |
je free_found |
add edi,120*80 |
inc eax |
cmp eax,[max_windows] |
jb newse |
free_found: |
mov edx,[command_position] |
add edx,6 |
push eax |
push edx |
mov ecx,0 |
finde: |
inc ecx |
inc edx |
movzx eax,byte [edx] |
cmp eax,'#' |
jge finde |
mov [channel_list+ebx+31],cl |
pop edx |
pop eax |
call create_channel_name |
push edi |
push eax |
mov [edi+120*60+8],byte 0 ; channel window |
mov eax,32 |
mov ecx,120*60 |
cld |
rep stosb |
pop eax |
pop edi |
; eax has the free position |
mov [thread_screen],edi |
call create_channel_window |
no_new_window: |
mov eax,[command_position] |
add eax,6 |
call set_channel |
mov eax,action_header_blue |
mov dl,0 |
call print_text |
mov eax,command+1 |
mov dl,'!' |
mov cl,' ' |
call print_text |
mov eax,joins_channel |
mov dl,0 |
call print_text |
mov eax,[command_position] |
add eax,6 |
mov dl,0 |
call print_text |
popa |
ret |
no_join: |
cmp [irc_command],'NICK' ; nick change |
jne no_nick_change |
mov [text_start],I_END |
add [text_start],120*80 |
new_all_channels3: |
mov eax,action_header_short |
mov dl,0 |
call print_text |
mov eax,command+1 |
mov dl,'!' |
call print_text |
mov eax,is_now_known_as |
mov dl,0 |
call print_text |
mov eax,[command_position] |
add eax,6 |
mov dl,0 |
call print_text |
add [text_start],120*80 |
cmp [text_start],I_END+120*80*20 |
jb new_all_channels3 |
popa |
ret |
no_nick_change: |
cmp [irc_command],'KICK' ; kick |
jne no_kick |
mov [text_start],I_END |
add [text_start],120*80 |
mov eax,[command_position] |
add eax,5 |
call set_channel |
; new_all_channels4: |
mov eax,action_header_short |
mov dl,0 |
call print_text |
mov eax,command+1 |
mov dl,'!' |
call print_text |
mov eax,kicked |
mov dl,0 |
call print_text |
mov eax,[command_position] |
add eax,5 |
mov dl,0 |
call print_text |
; add [text_start],120*80 |
; cmp [text_start],I_END+120*80*20 |
; jb new_all_channels4 |
popa |
ret |
no_kick: |
cmp [irc_command],'QUIT' ; irc quit |
jne no_quit |
mov [text_start],I_END |
add [text_start],120*80 |
new_all_channels2: |
mov eax,action_header_red |
mov dl,0 |
call print_text |
mov eax,command+1 |
mov dl,'!' |
call print_text |
mov eax,has_quit_irc |
mov dl,0 |
call print_text |
add [text_start],120*80 |
cmp [text_start],I_END+120*80*20 |
jb new_all_channels2 |
popa |
ret |
no_quit: |
cmp [irc_command],dword 'MODE' ; channel mode change |
jne no_mode |
mov [text_start],I_END |
add [text_start],120*80 |
mov eax,[command_position] |
add eax,5 |
call set_channel |
new_all_channels: |
mov eax,action_header_short |
mov dl,0 |
call print_text |
call print_nick |
mov eax,sets_mode |
mov dl,0 |
call print_text |
mov eax,[command_position] |
add eax,5 |
mov dl,0 |
call print_text |
; add [text_start],120*80 |
; cmp [text_start],I_END+120*80*20 |
; jb new_all_channels |
popa |
ret |
no_mode: |
cmp [irc_command],dword '353 ' ; channel user names |
jne no_user_list |
mov eax,[command_position] |
finde2: |
inc eax |
cmp [eax],byte '#' |
jne finde2 |
call set_channel |
finde3: |
inc eax |
cmp [eax],byte ':' |
jne finde3 |
pusha |
cmp [user_list_pos],0 |
jne no_clear_user_list |
mov edi,[text_start] |
add edi,120*70 |
mov [edi-8],dword 0 |
mov [edi-4],dword 0 |
mov eax,32 |
mov ecx,1200 |
cld |
rep stosb |
no_clear_user_list: |
popa |
push eax |
mov esi,eax |
inc esi |
mov edi,[text_start] |
add edi,120*70 |
add edi,[user_list_pos] |
mov edx,edi |
mov ecx,command |
add ecx,[cmd] |
sub ecx,[esp] |
sub ecx,3 |
and ecx,0xfff |
cld |
rep movsb |
pop eax |
mov ebx,command |
add ebx,[cmd] |
sub ebx,eax |
sub ebx,2 |
mov [edx+ebx-1],dword ' ' |
add [user_list_pos],ebx |
mov eax,[user_list_pos] |
mov ebx,[text_start] |
add ebx,120*70 |
mov [ebx-4],eax |
popa |
ret |
user_list_pos dd 0x0 |
no_user_list: |
cmp [irc_command],dword '366 ' ; channel user names end |
jne no_user_list_end |
mov [user_list_pos],0 |
popa |
ret |
no_user_list_end: |
mov [command],byte '-' |
call print_command_to_main |
popa |
ret |
cresult db 0 |
compare_to_nick: |
; input : eax = start of compare |
; output : [cresult] = 0 if match, [cresult]=1 if no match |
pusha |
mov esi,eax |
mov edi,0 |
new_nick_compare: |
mov bl,byte [esi] |
mov cl,byte [user_nick+4+edi] |
cmp bl,cl |
jne nonickm |
add esi,1 |
add edi,1 |
cmp edi,[user_nick] |
jb new_nick_compare |
movzx eax,byte [esi] |
cmp eax,40 |
jge nonickm |
popa |
mov [cresult],0 |
ret |
nonickm: |
popa |
mov [cresult],1 |
ret |
print_command_to_main: |
pusha |
mov [text_start],I_END |
mov ecx,[rxs] |
imul ecx,11 |
mov [pos],ecx |
mov bl,13 |
call print_character |
mov bl,10 |
call print_character |
mov ecx,[cmd] |
sub ecx,2 |
mov esi,command |
newcmdc2: |
mov bl,[esi] |
call print_character |
inc esi |
loop newcmdc2 |
mov edx,I_END |
call draw_channel_text |
popa |
ret |
print_text: |
pusha |
mov ecx,command-2 |
add ecx,[cmd] |
ptr2: |
mov bl,[eax] |
cmp bl,dl |
je ptr_ret |
cmp bl,0 |
je ptr_ret |
call print_character |
inc eax |
cmp eax,ecx |
jbe ptr2 |
ptr_ret: |
mov eax,[text_start] |
mov [eax+120*60],byte 1 |
popa |
ret |
print_character: |
pusha |
cmp bl,13 ; line beginning |
jne nobol |
mov ecx,[pos] |
add ecx,1 |
boll1: |
sub ecx,1 |
mov eax,ecx |
xor edx,edx |
mov ebx,[rxs] |
div ebx |
cmp edx,0 |
jne boll1 |
mov [pos],ecx |
jmp newdata |
nobol: |
cmp bl,10 ; line down |
jne nolf |
addx1: |
add [pos],dword 1 |
mov eax,[pos] |
xor edx,edx |
mov ecx,[rxs] |
div ecx |
cmp edx,0 |
jnz addx1 |
mov eax,[pos] |
jmp cm1 |
nolf: |
no_lf_ret: |
cmp bl,15 ; character |
jbe newdata |
mov eax,[irc_data] |
shl eax,8 |
mov al,bl |
mov [irc_data],eax |
mov eax,[pos] |
call draw_data |
mov eax,[pos] |
add eax,1 |
cm1: |
mov ebx,[scroll+4] |
imul ebx,[rxs] |
cmp eax,ebx |
jb noeaxz |
mov esi,[text_start] |
add esi,[rxs] |
mov edi,[text_start] |
mov ecx,ebx |
cld |
rep movsb |
mov esi,[text_start] |
mov ecx,[rxs] |
imul ecx,61 |
add esi,ecx |
mov edi,[text_start] |
mov ecx,[rxs] |
imul ecx,60 |
add edi,ecx |
mov ecx,ebx |
cld |
rep movsb |
mov eax,ebx |
sub eax,[rxs] |
noeaxz: |
mov [pos],eax |
newdata: |
mov eax,[text_start] |
mov [eax+120*60],byte 1 |
popa |
ret |
draw_data: |
pusha |
and ebx,0xff |
cmp bl,0xe4 ; finnish a |
jne noe4 |
mov bl,0xc1 |
noe4: |
cmp bl,0xc4 ; ? |
jne noc4 |
mov bl,0xc9 |
noc4: |
cmp ebx,229 ; swedish a |
jne no_swedish_a |
mov bl,192 |
no_swedish_a: |
add eax,[text_start] |
mov [eax],bl |
popa |
ret |
read_incoming_byte: |
mov eax, 53 |
mov ebx, 2 |
mov ecx, [socket] |
int 0x40 |
mov ecx,-1 |
cmp eax,0 |
je no_more_data |
mov eax, 53 |
mov ebx, 3 |
mov ecx, [socket] |
int 0x40 |
mov ecx,0 |
no_more_data: |
ret |
draw_window: |
pusha |
mov eax,12 |
mov ebx,1 |
int 0x40 |
mov [old_status],300 |
mov eax,0 ; draw window |
mov ebx,5*65536+499 |
mov ecx,5*65536+345 |
mov edx,[wcolor] |
add edx,0x03ffffff |
mov esi,0x80555599 |
mov edi,0x00ffffff |
int 0x40 |
mov eax,4 ; label |
mov ebx,9*65536+8 |
mov ecx,0x10ffffff |
mov edx,labelt |
mov esi,labellen-labelt |
int 0x40 |
mov eax,8 ; button: open socket |
mov ebx,43*65536+22 |
mov ecx,229*65536+10 |
mov edx,22 |
mov esi,[main_button] |
int 0x40 |
mov eax,8 ; button: send userinfo |
mov ebx,180*65536+22 |
mov ecx,229*65536+10 |
mov edx,23 |
int 0x40 |
mov eax,8 ; button: close socket |
mov ebx,317*65536+22 |
mov ecx,229*65536+10 |
mov edx,24 |
int 0x40 |
mov eax,38 ; line |
mov ebx,5*65536+494 |
mov ecx,148*65536+148 |
mov edx,[main_line] |
int 0x40 |
add ecx,1*65536+1 |
; mov edx,0x5555cc |
; int 0x40 |
mov eax,38 ; line |
mov ebx,5*65536+494 |
mov ecx,166*65536+166 |
int 0x40 |
add ecx,1*65536+1 |
; mov edx,0x5555cc |
; int 0x40 |
mov eax,38 ; line |
mov ebx,410*65536+410 |
mov ecx,22*65536+148 |
int 0x40 |
add ebx,1*65536+1 |
; mov edx,0x5555cc |
; int 0x40 |
mov ebx,25*65536+183 ; info text |
mov ecx,0x000000 |
mov edx,text |
mov esi,70 |
newline: |
mov eax,4 |
int 0x40 |
add ebx,12 |
add edx,70 |
cmp [edx],byte 'x' |
jne newline |
mov edx,I_END ; text from server |
call draw_channel_text |
mov eax,12 |
mov ebx,2 |
int 0x40 |
popa |
ret |
main_line dd 0x000000 |
main_button dd 0x6565cc |
text: |
db ' Real name : Joe User - change with eg /areal Jill User ' |
db ' Nick : AIRC - change with eg /anick Jill ' |
db ' Server : 192.168.1.1 - change with eg /aserv 192.168.1.24 ' |
db ' ' |
db ' 1) Open socket 2) Send userinfo Close socket ' |
db ' ' |
db ' Commands after established connection: ' |
db ' ' |
db ' /join #ChannelName - eg /join #menuet ' |
db ' /part #ChannelName - eg /part #linux ' |
db ' /query Nickname - eg /query Mary ' |
db ' /quit - Quit server and Close socket ' |
db 'x <- END MARKER, DONT DELETE ' |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; |
; CHANNEL THREADS |
; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
channel_thread: |
mov ebp,[thread_nro] |
mov eax,ebp |
shl eax,14 |
add eax,0x80000 |
mov esp,eax |
mov edi,ebp ; clear thread memory |
imul edi,120*80 |
add edi,I_END |
mov ecx,120*80 |
mov eax,32 |
cld |
; rep stosb |
mov edx,[thread_screen] |
call thread_draw_window |
w_t: |
mov esi,ebp |
imul esi,120*80 |
add esi,I_END |
cmp [esi+120*60+4],byte 1 |
jne no_channel_leave |
mov [esi+120*60+4],byte 0 |
mov edi,ebp |
shl edi,5 |
mov dword [channel_list+edi],dword ' ' |
mov byte [channel_list+edi+31],byte 1 |
mov eax,-1 |
int 0x40 |
no_channel_leave: |
call check_mouse |
mov eax,23 |
mov ebx,1 |
int 0x40 |
cmp eax,1 |
jne no_draw_window |
call thread_draw_window |
call draw_channel_text |
call print_user_list |
no_draw_window: |
cmp eax,2 |
je thread_key |
cmp eax,3 |
jne no_end |
mov eax,17 |
int 0x40 |
mov eax,ebp |
imul eax,120*80 |
add eax,I_END |
cmp [eax+120*60+8],byte 0 ; channel window |
je not_close |
mov eax,ebp |
shl eax,5 |
add eax,channel_list |
mov [eax],dword ' ' |
mov [eax+31],byte 1 |
mov eax,-1 |
int 0x40 |
not_close: |
mov [text_start],eax |
mov eax,nocl |
newcc: |
mov bl,[eax] |
call print_character |
inc eax |
cmp [eax],byte 0 |
jne newcc |
call draw_channel_text |
jmp w_t |
nocl: db 13,10,'To exit channel, use PART or QUIT command.',0 |
no_end: |
cmp [edx+120*60],byte 1 |
jne no_update |
mov [edx+120*60],byte 0 |
call draw_channel_text |
no_update: |
test [cursor_on_off],0x3f |
jnz nopri2 |
call blink_cursor |
call print_user_list |
nopri2: |
jmp w_t |
check_mouse: |
pusha |
mov eax,37 |
mov ebx,1 |
int 0x40 |
mov ebx,eax |
shr eax,16 |
and ebx,0xffff |
cmp eax,420 |
jb no_mouse |
cmp eax,494 |
jg no_mouse |
cmp ebx,145 |
jg no_mouse |
cmp ebx,23 |
jb no_mouse |
cmp ebx,100 |
jb no_plus |
mov eax,ebp |
imul eax,120*80 |
add eax,120*70+I_END |
inc dword [eax-8] |
call print_user_list |
mov eax,5 |
mov ebx,8 |
int 0x40 |
jmp no_mouse |
no_plus: |
cmp ebx,80 |
jg no_mouse |
mov eax,ebp |
imul eax,120*80 |
add eax,120*70+I_END |
cmp dword [eax-8],dword 0 |
je no_mouse |
dec dword [eax-8] |
call print_user_list |
mov eax,5 |
mov ebx,8 |
int 0x40 |
no_minus: |
no_mouse: |
popa |
ret |
thread_key: |
mov eax,2 |
int 0x40 |
shr eax,8 |
cmp eax,8 |
jne no_bks |
cmp [xpos],0 |
je w_t |
dec [xpos] |
call print_entry |
jmp w_t |
no_bks: |
cmp eax,20 |
jbe no_character |
mov ebx,[xpos] |
mov [send_string+ebx],al |
inc [xpos] |
cmp [xpos],80 |
jb xpok |
mov [xpos],79 |
xpok: |
call print_entry |
jmp w_t |
no_character: |
cmp eax,13 |
jne no_send |
cmp [xpos],0 |
je no_send |
mov dword [send_to_channel],ebp |
mov [send_to_server],1 |
wait_for_sending: |
mov eax,5 |
mov ebx,1 |
int 0x40 |
cmp [send_to_server],1 |
je wait_for_sending |
call draw_channel_text |
call print_entry |
jmp w_t |
no_send: |
jmp w_t |
draw_channel_text: |
pusha |
mov eax,4 |
mov ebx,10*65536+26 |
mov ecx,12 |
mov esi,[rxs] |
dct: |
pusha |
mov cx,bx |
shl ecx,16 |
mov cx,9 |
mov eax,13 |
mov ebx,10*65536 |
mov bx,word [rxs] |
imul bx,6 |
mov edx,0xffffff |
int 0x40 |
popa |
push ecx |
mov eax,4 |
mov ecx,0 |
cmp [edx],word '* ' |
jne no_red |
mov ecx,0x0000ff |
no_red: |
cmp [edx],word '**' |
jne no_light_blue |
cmp [edx+2],byte '*' |
jne no_light_blue |
mov ecx,0x0000ff |
no_light_blue: |
cmp [edx],byte '#' |
jne no_blue |
mov ecx,0x0000ff |
no_blue: |
int 0x40 |
add edx,[rxs] |
add ebx,10 |
pop ecx |
loop dct |
popa |
ret |
thread_draw_window: |
pusha |
mov eax,12 |
mov ebx,1 |
int 0x40 |
mov ebx,ebp ; draw window |
shl ebx,16+4 |
mov eax,0 |
mov ecx,ebx |
mov bx,499 |
mov cx,170 |
; mov edx,ebp ; draw window |
; imul edx,120*80 |
; add edx,I_END+120*60+8 |
; movzx edx,byte [edx] |
; imul edx,88 |
; sub bx,dx |
mov edx,[wcolor] |
add edx,0x03ffffff |
mov esi,0x80555599 |
mov edi,0x00ffffff |
int 0x40 |
mov eax,ebp ; label |
add eax,48 |
mov [labelc+14],al |
mov eax,ebp |
shl eax,5 |
add eax,channel_list |
mov esi,eax |
mov edi,labelc+17 |
movzx ecx,byte [eax+31] |
cld |
rep movsb |
mov esi,17 ; print label |
movzx ebx,byte [eax+31] |
add esi,ebx |
mov eax,4 |
mov ebx,9*65536+8 |
mov ecx,0x00ffffff |
mov edx,labelc |
int 0x40 |
mov eax,38 ; line |
mov ebx,5*65536+494 |
mov ecx,148*65536+148 |
mov edx,[channel_line_sun] |
int 0x40 |
add ecx,1*65536+1 |
mov edx,[channel_line_shadow] |
int 0x40 |
mov eax,38 ; line |
mov ebx,410*65536+410 |
mov ecx,22*65536+148 |
mov edx,[channel_line_sun] |
int 0x40 |
add ebx,1*65536+1 |
mov edx,[channel_line_shadow] |
int 0x40 |
mov eax,12 |
mov ebx,2 |
int 0x40 |
popa |
ret |
; DATA AREA |
socket dd 0x0 |
bgc dd 0x000000 |
dd 0x000000 |
dd 0x00ff00 |
dd 0x0000ff |
dd 0x005500 |
dd 0xff00ff |
dd 0x00ffff |
dd 0x770077 |
tc dd 0xffffff |
dd 0xff00ff |
dd 0xffffff |
dd 0xffffff |
dd 0xffffff |
dd 0xffffff |
dd 0xffffff |
dd 0xffffff |
channel_line_sun dd 0x9999ff |
channel_line_shadow dd 0x666699 |
cursor_on_off dd 0x0 |
max_windows dd 20 |
thread_stack dd 0x9fff0 |
thread_nro dd 1 |
thread_screen dd I_END+120*80*1 |
action_header_blue db 10,'*** ',0 |
action_header_red db 10,'*** ',0 |
action_header_short db 10,'* ',0 |
has_left_channel db ' left channel ',0 |
joins_channel db ' joined channel ',0 |
is_now_known_as db ' is now known as ',0 |
has_quit_irc db ' has quit irc',0 |
sets_mode db ' sets mode ',0 |
kicked db ' kicked from ',0 |
index_list_1 dd 0x0000bb |
index_list_2 dd 0x0000ff |
posx dd 0x0 |
incoming_pos dd 0x0 |
incoming_string: times 128 db 0 |
pos dd 0x0 |
text_start dd I_END |
irc_data dd 0x0 |
print db 0x0 |
cmd dd 0x0 |
rxs dd 66 |
res: db 0,0 |
command: times 600 db 0x0 |
nick dd 0,0,0 |
irc_command dd 0,0 |
command_position dd 0x0 |
counter dd 0 |
send_to_server db 0 |
channel_list: times 32*20 db 32 |
send_to_channel dd 0x0 |
send_string_header: db 'privmsg #eax :' |
times 100 db 0x0 |
send_string: times 100 db 0x0 |
xpos dd 0 |
string0: db 'USER guest ser1 ser2 :' |
string0l: |
string1: db 'nick ' |
string1l: |
attribute dd 0 |
scroll dd 1 |
dd 12 |
numtext db ' ' |
wcolor dd 0x000000 |
labelc db 'AIRC - WINDOW X: #xxx ' |
labelt db 'IRC client ',version |
labellen: |
;; |
;; Channel data at I_END |
;; |
;; 120*80 * channel window (1+) |
;; |
;; At Size |
;; |
;; 00 , 120*60 window text 120 characters per row |
;; 120*60 , 1 text is updated |
;; 120*60+4 , 1 close yourself |
;; 120*60+8 , 1 0 = channel window : 1 = private chat |
;; 120*61 , 256 channel name |
;; 120*61+254 , 254 channel entry text from user |
;; 120*61+255 , 1 length of entry text |
;; 120*69+248 , 4 display names from n:th name |
;; 120*69+252 , 4 length of names string |
;; 120*70 , 1200 names separated with space |
;; |
I_END: ;; |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/airc/trunk/build_en.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix en >lang.inc |
@fasm airc.asm airc |
@pause |
/programs/airc/trunk/build_ru.bat |
---|
0,0 → 1,4 |
@erase lang.inc |
@echo lang fix ru >lang.inc |
@fasm airc.asm airc |
@pause |
/programs/airc/trunk/macros.inc |
---|
0,0 → 1,266 |
; new application structure |
macro meos_app_start |
{ |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd __start |
dd __end |
dd __memory |
dd __stack |
if used __params & ~defined __params |
dd __params |
else |
dd 0x0 |
end if |
dd 0x0 |
} |
MEOS_APP_START fix meos_app_start |
macro code |
{ |
__start: |
} |
CODE fix code |
macro data |
{ |
__data: |
} |
DATA fix data |
macro udata |
{ |
if used __params & ~defined __params |
__params: |
db 0 |
__end: |
rb 255 |
else |
__end: |
end if |
__udata: |
} |
UDATA fix udata |
macro meos_app_end |
{ |
align 32 |
rb 2048 |
__stack: |
__memory: |
} |
MEOS_APP_END fix meos_app_end |
; macro for defining multiline text data |
struc mstr [sstring] |
{ |
forward |
local ssize |
virtual at 0 |
db sstring |
ssize = $ |
end virtual |
dd ssize |
db sstring |
common |
dd -1 |
} |
; strings |
macro sz name,[data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if used name |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
macro lsz name,[lng,data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if (used name)&(lang eq lng) |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
; easy system call macro |
macro mpack dest, hsrc, lsrc |
{ |
if (hsrc eqtype 0) & (lsrc eqtype 0) |
mov dest, (hsrc) shl 16 + lsrc |
else |
if (hsrc eqtype 0) & (~lsrc eqtype 0) |
mov dest, (hsrc) shl 16 |
add dest, lsrc |
else |
mov dest, hsrc |
shl dest, 16 |
add dest, lsrc |
end if |
end if |
} |
macro __mov reg,a,b { ; mike.dld |
if (~a eq)&(~b eq) |
mpack reg,a,b |
else if (~a eq)&(b eq) |
mov reg,a |
end if |
} |
macro mcall a,b,c,d,e,f { ; mike.dld |
__mov eax,a |
__mov ebx,b |
__mov ecx,c |
__mov edx,d |
__mov esi,e |
__mov edi,f |
int 0x40 |
} |
; optimize the code for size |
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp> |
macro add arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
inc arg1 |
else |
add arg1,arg2 |
end if |
else |
add arg1,arg2 |
end if |
} |
macro sub arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
dec arg1 |
else |
sub arg1,arg2 |
end if |
else |
sub arg1,arg2 |
end if |
} |
macro mov arg1,arg2 |
{ |
if (arg1 in __regs) & (arg2 eqtype 0) |
if (arg2) = 0 |
xor arg1,arg1 |
else if (arg2) = 1 |
xor arg1,arg1 |
inc arg1 |
else if (arg2) = -1 |
or arg1,-1 |
else if (arg2) > -128 & (arg2) < 128 |
push arg2 |
pop arg1 |
else |
mov arg1,arg2 |
end if |
else |
mov arg1,arg2 |
end if |
} |
macro struct name |
{ |
virtual at 0 |
name name |
sizeof.#name = $ - name |
end virtual |
} |
; structures used in MeOS |
struc process_information |
{ |
.cpu_usage dd ? ; +0 |
.window_stack_position dw ? ; +4 |
.window_stack_value dw ? ; +6 |
.not_used1 dw ? ; +8 |
.process_name rb 12 ; +10 |
.memory_start dd ? ; +22 |
.used_memory dd ? ; +26 |
.PID dd ? ; +30 |
.x_start dd ? ; +34 |
.y_start dd ? ; +38 |
.x_size dd ? ; +42 |
.y_size dd ? ; +46 |
.slot_state dw ? ; +50 |
rb (1024-52) |
} |
struct process_information |
struc system_colors |
{ |
.frame dd ? |
.grab dd ? |
.grab_button dd ? |
.grab_button_text dd ? |
.grab_text dd ? |
.work dd ? |
.work_button dd ? |
.work_button_text dd ? |
.work_text dd ? |
.work_graph dd ? |
} |
struct system_colors |
; constants |
; events |
EV_IDLE = 0 |
EV_TIMER = 0 |
EV_REDRAW = 1 |
EV_KEY = 2 |
EV_BUTTON = 3 |
EV_EXIT = 4 |
EV_BACKGROUND = 5 |
EV_MOUSE = 6 |
EV_IPC = 7 |
EV_STACK = 8 |
; event mask bits for function 40 |
EVM_REDRAW = 1b |
EVM_KEY = 10b |
EVM_BUTTON = 100b |
EVM_EXIT = 1000b |
EVM_BACKGROUND = 10000b |
EVM_MOUSE = 100000b |
EVM_IPC = 1000000b |
EVM_STACK = 10000000b |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/arcanii/trunk/arcanii.asm |
---|
0,0 → 1,921 |
VERSION equ 'ARCANOID II v. 0.30' |
; by jj |
; (jacek jerzy malinowski) |
; |
; contact: 4nic8@casiocalc.org |
;---------------------------------------- |
; Compile with FASM for Menuet |
;---------------------------------------- |
include 'lang.inc' |
include 'ascl.inc' |
include 'ascgl.inc' |
include 'asjc.inc' |
X_SIZE equ 400 |
Y_SIZE equ 300 |
MAX_LEVEL equ 5 |
BACK_CL equ 0x00EFEF ; background color |
; THE MAIN PROGRAM: |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd 0x200000 ; memory for app |
dd 0x7fff0 ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
START: ; start of execution |
bmptoimg bmp_file,img_bmp ; loading ... ;] |
getimg img_bmp,0,0,10,10,img_ball |
getimg img_bmp,20,0,20,10,img_bonus |
getimg img_bmp,0,10,40,20,img_brick1 |
getimg img_bmp,0,30,40,20,img_brick2 |
getimg img_bmp,0,50,40,20,img_brick3 |
getimg img_bmp,0,70,40,20,img_brick4 |
call draw_window |
still: |
if_e dword [level],0,.no_intro |
call intro |
jmp .no_game |
.no_intro: |
if_e dword [mode],2,.end_if1 |
call level_info |
jmp .no_game |
.end_if1: |
if_e dword [mode],4,.end_if2 |
call game_over |
jmp .no_game |
.end_if2: |
call fast_gfx ; <-- the main engine |
.no_game: |
mov eax,11 |
int 0x40 |
cmp eax,1 ; redraw request ? |
je red |
cmp eax,2 ; key in buffer ? |
je key |
cmp eax,3 ; button in buffer ? |
je button |
jmp still |
red: ; redraw |
call draw_window |
jmp still |
key: ; key |
mov eax,2 ; just read it and ignore |
int 0x40 |
cmp ah,key_Esc ; if Esc ? |
jne .no_q |
mov eax,-1 |
int 0x40 |
.no_q: |
if_e dword [mode],4,.end_if6 |
jmp still |
.end_if6: |
cmp ah,key_Space |
jne .no_space |
if_e dword [mode],2,.end_if1 |
mov dword [mode],0 |
jmp .no_space |
.end_if1: |
mov dword [mode],1 |
call fast_gfx |
.no_space: |
xor ebx,ebx |
mov bl,ah |
if_e ebx,key_F1,.no_f1 |
inc dword [del] |
.no_f1: |
if_e ebx,key_F2,.no_f2 |
if_a dword [del],0,.end_if3 |
dec dword [del] |
.end_if3: |
.no_f2: |
jmp still |
button: ; button |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 ; button id=1 ? |
jne noclose |
mov eax,-1 ; close this program |
int 0x40 |
noclose: |
jmp still |
; ********************************************* |
; ******* VIRTUAL SCREEN FUNCTIONS ************ |
; ********************************************* |
show_screen: ; flips the virtual screen to the window |
push_abc |
mov eax,7 |
mov ebx,screen |
mov ecx,X_SIZE*65536+Y_SIZE |
mov edx,4*65536+20 |
int 0x40 |
pop_abc |
ret |
put_bmp_screen: ; eax - y , ebx - x, esi - bmp |
cmp ebx,X_SIZE-5 |
jb .ok1 |
ret |
.ok1: |
cmp eax,Y_SIZE-5 |
jb .ok2 |
ret |
.ok2: |
push_abc |
xor ecx,ecx |
xor edx,edx |
mov edi,screen |
mov ecx,3 |
mul ecx ; xx = 3*y*X_SIZE+3*x |
mov ecx,X_SIZE |
mul ecx |
push eax ; #> 1 |
mov eax,ebx |
mov ecx,3 |
mul ecx |
mov ebx,eax |
pop edx ; #< 1 |
add edx,ebx |
add edi,edx ; sets the pointer to x,y of the screen |
mov cx,[si] ; loops 1 |
xor ebx,ebx |
mov ax,cx |
mov dx,3 |
mul dx |
mov bx,ax |
push ebx ;#>4 |
add si,4 |
mov ax,[si] ; loops 2 |
mov cx,[si] |
;shr ax,2 |
mov dx,3 ; dx = ax *3 |
mul dx |
mov bx,ax |
add si,4 |
pop ebx ;#<4 |
.l_y: |
mov ax,cx |
cld |
mov cx,bx |
rep movs byte [edi],[esi] |
add edi,X_SIZE |
add edi,X_SIZE |
add edi,X_SIZE |
sub edi,ebx |
mov cx,ax |
loop .l_y |
pop_abc |
ret |
rect_screen: ; eax - y , ebx - x, ecx - size x, edx - size y, si -color |
mov edi,ebx |
add ebx,ecx |
cmp ebx,X_SIZE |
jb .ok1 |
ret |
.ok1: |
mov ebx,edi |
mov edi,eax |
add eax,edx |
cmp eax,Y_SIZE |
jb .ok2 |
ret |
.ok2: |
mov eax,edi |
push_abc |
push ecx ;#>2 |
push edx ;#>3 |
xor ecx,ecx |
xor edx,edx |
mov edi,screen |
mov ecx,3 |
mul ecx ; xx = 3*y*X_SIZE+3*x |
mov ecx,X_SIZE |
mul ecx |
push eax ; #> 1 |
mov eax,ebx |
mov ecx,3 |
mul ecx |
mov ebx,eax |
pop edx ; #< 1 |
add edx,ebx |
add edi,edx ; sets the pointer to x,y of the screen |
pop ecx ; #<3 |
pop edx ; #<4 |
mov eax,esi |
.l_y: |
;mov ax,cx |
push ecx |
cld |
mov ecx,edx |
.l_x: |
;rep movs byte [edi],[esi] |
mov word [edi],ax |
push eax |
shr eax,16 |
mov byte [edi+2],al |
add edi,3 |
pop eax |
loop .l_x |
add edi,X_SIZE |
add edi,X_SIZE |
add edi,X_SIZE |
sub edi,edx |
sub edi,edx |
sub edi,edx |
;mov cx,ax |
pop ecx |
loop .l_y |
pop_abc |
ret |
grad_rect_screen: ; eax - y , ebx - x, ecx - size x, edx - size y, si -color, d |
push edi ;#>0 |
mov edi,ebx |
add ebx,ecx |
cmp ebx,X_SIZE |
jb .ok1 |
pop edi ;#<0 |
ret |
.ok1: |
mov ebx,edi |
mov edi,eax |
add eax,edx |
cmp eax,Y_SIZE |
jb .ok2 |
pop edi ;#<0 |
ret |
.ok2: |
mov eax,edi |
pop edi ;#<0 |
push_abc |
push edi ;#>5 |
push ecx ;#>2 |
push edx ;#>3 |
xor ecx,ecx |
xor edx,edx |
mov edi,screen |
mov ecx,3 |
mul ecx ; xx = 3*y*X_SIZE+3*x |
mov ecx,X_SIZE |
mul ecx |
push eax ; #> 1 |
mov eax,ebx |
mov ecx,3 |
mul ecx |
mov ebx,eax |
pop edx ; #< 1 |
add edx,ebx |
add edi,edx ; sets the pointer to x,y of the screen |
pop ecx ; #<3 |
pop edx ; #<2 |
mov eax,esi |
pop esi ; #<5 |
.l_y: |
;mov ax,cx |
push ecx |
cld |
mov ecx,edx |
.l_x: |
;rep movs byte [edi],[esi] |
mov word [edi],ax |
push eax |
shr eax,16 |
mov byte [edi+2],al |
add edi,3 |
pop eax |
loop .l_x |
add edi,X_SIZE |
add edi,X_SIZE |
add edi,X_SIZE |
sub edi,edx |
sub edi,edx |
sub edi,edx |
add eax,esi |
;mov cx,ax |
pop ecx |
loop .l_y |
pop_abc |
ret |
fill_screen: ; eax - screen color ( 0x00RRGGBB ) |
push_abc |
mov edi,screen |
cld |
mov ecx,X_SIZE*Y_SIZE |
.lab1: |
mov [edi],eax |
add edi,3 |
loop .lab1 |
pop_abc |
ret |
grad_fill_screen: ; eax - screen color ( 0x00RRGGBB ), ebx - mack |
push_abc |
mov edi,screen |
cld |
mov ecx,Y_SIZE |
mov dl,0 |
.lab1: |
push ecx |
mov ecx,X_SIZE |
.lab2: |
mov [edi],eax |
add edi,3 |
loop .lab2 |
mov dh,1 ; dl = 1 - dl |
sub dh,dl |
mov dl,dh |
cmp dl,0 |
jne .no_ch ; if (dl==0) |
add eax,ebx ; change gradient |
.no_ch: |
pop ecx |
loop .lab1 |
pop_abc |
ret |
bmp_fill_screen: ; esi - pointer to a backgroung bmp |
push_abc |
mov edi,screen |
cld |
mov ecx,X_SIZE*Y_SIZE |
rep movs dword [edi],[esi] |
pop_abc |
ret |
;___________________ |
intro: ; INTRO ; |
label 140,200,VERSION,0x100000FF |
label 120,220,'by jj (jacek jerzy malinowski)',0x050505 |
label 100,240,'press SPACE to start a new game',0x10FF0800 |
label 15,240,'F1 + delay',0xFFA8FF |
label 15,260,'F2 + delay',0xFFA8FF |
delay 10 |
ret |
;___________________ |
level_info: |
label 170,230,'L E V E L',0x100000FF |
outcount [level],195,250,0x100000FF,2*65536 |
label 100,270,'press SPACE to start the level',0x10FF0800 |
delay 10 |
ret |
;_________________________ |
game_over: ; GAME OVER ; |
mov eax,0x00FF00 |
mov ebx,0xFF01 |
.g_ok: |
call grad_fill_screen |
call show_screen ; flips the screen |
label 120,150,'G A M E O V E R',0x10050505 |
label 140,200,'Thanks for playing',0x0FFF800 |
delay 20 |
ret |
;-----------------------------; |
; THE MAIN THE GAME'S ENGINE ; |
;-----------------------------; |
fast_gfx: |
; the background gradient |
if_e dword [level],0,.no_0 |
mov eax,0xFF |
mov ebx,0xFEFF |
jmp .g_ok |
.no_0: |
if_e dword [level],1,.no_1 |
mov eax,BACK_CL |
mov ebx,0xFFFF |
jmp .g_ok |
.no_1: |
if_e dword [level],2,.no_2 |
mov eax,0xFF0000 |
mov ebx,0xFF00FF |
jmp .g_ok |
.no_2: |
mov eax,BACK_CL |
mov ebx,0xFFFF |
.g_ok: |
call grad_fill_screen |
mov eax,37 ; get mouse position |
mov ebx,1 |
int 0x40 |
shr eax,16 |
mov [x],eax |
add eax,[s_x] |
cmp eax,X_SIZE ; controls if the pad is in the screen |
jb .ok |
cmp eax,0x7FFF ; if < 0 |
jb .upper |
mov [x],0 |
jmp .ok |
.upper: ; if > X_SIZE - pad size |
mov dword [x],X_SIZE-1 |
mov eax,[s_x] |
sub dword [x],eax |
.ok: |
mov ebx,[x] |
mov eax,[y] |
mov ecx,[s_x] |
mov edx,15 |
mov esi,0xFF0000 |
mov edi,0xF0000F |
call grad_rect_screen |
call draw_level |
cmp dword [mode],1 |
jne .no_go ; is the game started ? |
mov eax,[v_x] |
add dword [b_x],eax |
mov eax,[v_y] |
add dword [b_y],eax |
jmp .go |
.no_go: |
mov eax,[x] ; b_x = x + x_s/2 |
mov ebx,[s_x] |
shr ebx,1 |
add eax,ebx |
mov dword [b_x],eax |
mov eax,[y] ; b_y = y - 10 |
sub eax,10 |
mov dword [b_y],eax |
mov dword [v_x],1 |
mov dword [v_y],-1 |
.go: |
;TEST WHERE IS THE BALL: |
cmp dword [b_x],0x7FFFFFFF |
jb .b_ok2 ; if out of the screen (left) |
mov dword [b_x],0 |
mov eax,0 |
sub eax,[v_x] |
mov [v_x],eax |
.b_ok2: |
cmp dword [b_x],X_SIZE-10 |
jb .b_ok1 ; if out of the screen (right) |
mov dword [b_x],X_SIZE-11 |
mov eax,0 |
sub eax,[v_x] |
mov [v_x],eax |
.b_ok1: |
cmp dword [b_y],0x7FFFFFFF |
jb .b_ok3 ; if out of the screen (up) |
mov dword [b_y],0 |
mov eax,0 |
sub eax,[v_y] |
mov [v_y],eax |
.b_ok3: |
cmp dword [b_y],Y_SIZE-10 |
jb .b_ok4 ; if out of the screen (down) |
mov dword [mode],0 |
if_e dword [lives],0,.end_if5 |
mov dword [mode],4 ; GAME OVER |
jmp still |
.end_if5: |
dec dword [lives] |
.end_else4: |
call draw_window |
.b_ok4: |
imgtoimg img_ball,dword [b_x],dword [b_y],screen_img |
call show_screen ; flips the screen |
delay dword [del] |
call do_tests ; does all needed tests |
ret |
;----------------------; |
; BALL & BRICKS EVENTS ; |
;----------------------; |
MAX_SPEED equ 3 |
do_tests: |
; BALL <-> PAD |
mov eax,[b_x] |
add eax,10 |
cmp eax,[x] ; if (b_x+10)>[pad x] |
jb .skip ; && |
mov eax,[b_x] |
mov ebx,[s_x] |
add ebx,[x] |
cmp eax,ebx ; if b_x < x + s_x |
ja .skip ; && |
mov eax,[b_y] |
add eax,10 |
cmp eax,[y] ; if (b_y+10) > y |
jb .skip |
sub eax,15 |
cmp eax,[y] ; if b_y < y+15 |
ja .skip |
cmp dword [v_y],0x7FFFFF ; if v_y > 0 |
ja .skip |
cmp dword [v_y],MAX_SPEED; speedup: |
ja .skip_s |
inc dword [speed_t] |
cmp dword [speed_t],5 |
jb .skip_s |
inc dword [v_y] |
mov dword [speed_t],0 |
.skip_s: |
inc dword [speed_t] |
mov eax,0 |
sub eax,[v_y] |
mov [v_y],eax |
;counting v_x:-------- |
mov eax,[b_x] |
sub eax,[x] |
sub eax,5 |
mov ecx,eax |
if_a eax,100,.end_if3 |
mov eax,0 |
sub eax,[v_x] |
mov [v_x],eax |
jmp .skip |
.end_if3: |
if_a eax,20,.end_if2 |
sub eax,20 |
shr eax,2 |
mov [v_x],eax |
jmp .skip |
.end_if2: |
mov ebx,20 |
sub ebx,ecx |
shr ebx,2 |
mov dword [v_x],0 |
sub dword [v_x],ebx |
.skip: |
; BALL <-> BRICK |
mov dword [coliz],0 |
call colision |
if_e dword [coliz],1,.end_if6 |
;abs dword [v_y] |
;abs dword [v_x] |
ret |
.end_if6: |
add dword [b_x],10 |
call colision |
sub dword [b_x],10 |
if_e dword [coliz],1,.end_if7 |
;abs dword [v_y] |
;abs dword [v_x] |
ch_sign dword [v_x] |
ret |
.end_if7: |
add dword [b_y],10 |
call colision |
sub dword [b_y],10 |
if_e dword [coliz],1,.end_if8 |
;abs dword [v_y] |
;abs dword [v_x] |
;ch_sign dword [v_y] |
ret |
.end_if8: |
add dword [b_x],10 |
add dword [b_y],10 |
call colision |
sub dword [b_x],10 |
sub dword [b_y],10 |
if_e dword [coliz],1,.end_if9 |
;abs dword [v_y] |
;abs dword [v_x] |
;ch_sign dword [v_x] |
;ch_sign dword [v_y] |
ret |
.end_if9: |
ret |
colision: |
mov esi,levels |
mov eax,[level] ; eax = levels*100 |
mov bx,100 |
mul bx |
add esi,eax |
;-------------- |
xor edx,edx |
mov eax,[b_x] |
mov ebx,40 |
div ebx |
mov ecx,eax |
push edx ;#>1 |
xor edx,edx |
mov eax,[b_y] |
mov ebx,20 |
div ebx |
push edx ;#>2 |
cmp eax,9 ; out of the bricks board |
ja .ok2 |
mov ebx,10 |
mul ebx |
add eax,ecx |
add esi,eax |
cmp byte [esi],0 ; 0 - no brick |
je .ok2 |
if_ne byte [esi],4,.end_if1 |
dec byte [esi] |
.end_if1: |
mov dword [coliz],1 |
pop ebx ;#<2 |
pop eax ;#<1 |
cmp ecx,8 ; x < 5 || x >35 - x inv |
jb .inv |
cmp ecx,33 |
ja .inv |
jmp .no_inv |
.inv: |
mov eax,0 |
sub eax,[v_x] |
mov [v_x],eax |
;jmp .no_ok |
.no_inv: |
cmp ebx,6 ; if y < 5 || y>15 - y inv |
jb .inv_y |
cmp ebx,14 |
ja .inv_y |
jmp .no_ok |
.inv_y: |
mov eax,0 |
sub eax,[v_y] |
mov [v_y],eax |
.no_ok: |
jmp .ok |
.ok2: |
pop eax ;#<1 |
pop eax ;#<2 |
.ok: |
ret |
;-----------------------------------; |
; DRAWS CURRENT LEVEL ON THE SCREEN ; |
;-----------------------------------; |
draw_level: |
mov esi,levels |
mov eax,[level] ; eax = levels*100 |
mov bx,100 |
mul bx |
add esi,eax |
mov ecx,10 |
mov eax,0 |
mov dword [l_end],1 |
.l_y: |
push ecx ;#>1 |
mov ebx,0 |
mov ecx,10 |
.l_x: |
cmp byte [esi],1 ; if 1 ? |
push esi;#>2 |
jne .no_1 |
mov esi,img_brick1 |
call put_bmp_screen |
mov dword [l_end],0 |
.no_1: |
cmp byte [esi],2 ; if 2 ? |
jne .no_2 |
mov esi,img_brick2 |
call put_bmp_screen |
mov dword [l_end],0 |
.no_2: |
cmp byte [esi],3 ; if 3 ? |
jne .no_3 |
mov esi,img_brick3 |
call put_bmp_screen |
mov dword [l_end],0 |
.no_3: |
cmp byte [esi],4 ; if 4 ? |
jne .no_4 |
mov esi,img_brick4 |
call put_bmp_screen |
.no_4: |
add ebx,40 |
pop esi ;#<2 |
inc esi |
loop .l_x |
add eax,20 ;#<1 |
pop ecx |
loop .l_y |
;---------------- |
; NEXT LEVEL |
if_e dword [l_end],1,.end_if ; all bricks are taken |
if_e dword [mode],1,.end_if |
add dword [level],1 |
if_a dword [level],MAX_LEVEL,.end_if2 |
mov dword [mode],4 ; game over |
jmp still |
.end_if2: |
call fast_gfx |
mov dword [mode],2 |
.end_if: |
ret |
; ********************************************* |
; ******* WINDOW DEFINITIONS AND DRAW ******** |
; ********************************************* |
draw_window: |
startwd |
window 100,100,X_SIZE+8,Y_SIZE+21,0x03ffffff |
label 8,8,VERSION,cl_White+font_Big |
label 200,8,'LIVES:',0x10ddeeff |
outcount dword [lives],250,8,0x10ddeeff,65536 |
call fast_gfx |
endwd |
ret |
;-----------;#################### |
; DATA AREA ;#################### |
;-----------;#################### |
lives dd 5 |
mode dd 0 |
l_end dd 0 ; if 1 the level is over |
; PAD x: |
x dd 20 |
y dd Y_SIZE-20 |
; PAD length: |
s_x dd 40 |
; the ball stuff ;-) |
b_x dd 100 |
b_y dd 250 |
v_y dd 0 |
v_x dd 3 |
speed_t dd 0 ; 1/10 times speedup |
del dd 1 ; delay |
coliz dd 0 ; if 1 then colizion with a brick |
; LEVELS: |
level dd 0 |
levels: |
;LEVEL 0: |
db 0,0,0,0,0,0,0,0,0,0 |
db 0,4,0,0,4,4,0,0,0,4 |
db 4,0,4,0,4,0,4,0,4,0 |
db 4,0,4,0,4,0,4,0,4,0 |
db 4,4,4,0,4,4,0,0,4,0 |
db 4,0,4,0,4,0,4,0,4,0 |
db 4,0,4,0,4,0,4,0,0,4 |
db 0,0,0,0,0,0,0,0,0,0 |
db 0,0,0,0,0,0,0,0,0,0 |
db 0,0,0,0,0,0,0,0,0,0 |
;LEVEL 1: |
db 1,1,1,1,1,1,1,1,1,1 |
db 0,3,0,0,3,3,0,0,0,3 |
db 3,0,3,0,3,0,3,0,3,0 |
db 3,0,3,0,3,0,3,0,3,0 |
db 3,3,3,0,3,3,0,0,3,0 |
db 3,0,3,0,3,0,3,0,3,0 |
db 3,0,3,0,3,0,3,0,0,3 |
db 2,2,2,2,2,2,2,2,2,2 |
db 1,1,1,1,1,1,1,1,1,1 |
db 1,1,1,1,1,1,1,1,1,1 |
;LEVEL 2: |
db 3,3,3,3,0,0,3,3,3,3 |
db 3,1,1,1,0,0,1,1,1,3 |
db 3,1,2,1,3,3,1,2,1,3 |
db 0,1,0,1,3,3,1,0,1,0 |
db 2,1,2,1,1,1,1,2,1,2 |
db 0,1,0,1,2,2,1,0,1,0 |
db 2,1,2,1,1,1,1,2,1,2 |
db 0,1,0,1,1,1,1,0,1,0 |
db 0,0,0,1,0,0,1,0,0,0 |
db 0,0,0,1,0,0,1,0,0,0 |
;LEVEL 3: |
db 1,2,3,1,2,3,1,3,2,1 |
db 2,3,1,2,3,1,3,3,1,2 |
db 3,1,2,3,1,2,3,1,2,3 |
db 1,2,3,1,2,3,1,3,2,1 |
db 2,3,1,2,3,1,3,3,1,2 |
db 3,1,2,3,1,2,3,1,2,3 |
db 1,2,1,2,1,2,1,2,1,2 |
db 1,0,1,0,1,0,1,0,1,0 |
db 0,0,3,0,0,0,0,3,0,0 |
db 0,0,3,0,0,0,0,3,0,0 |
;LEVEL 4: |
db 0,0,0,1,1,1,1,0,0,0 |
db 0,0,1,2,2,2,2,1,0,0 |
db 1,1,1,2,2,2,2,1,1,1 |
db 1,0,1,0,2,2,0,1,0,1 |
db 0,1,1,2,2,2,2,1,1,0 |
db 0,0,1,2,2,2,2,1,0,0 |
db 0,0,1,2,2,2,2,1,0,0 |
db 0,0,1,2,3,3,2,1,0,0 |
db 0,0,1,2,2,2,2,1,0,0 |
db 0,0,0,1,1,1,1,0,0,0 |
;LEVEL 5: |
db 1,1,1,1,1,1,1,1,1,1 |
db 1,2,0,0,3,2,0,0,2,1 |
db 1,2,0,0,2,3,0,0,2,1 |
db 2,2,0,0,3,2,0,0,2,2 |
db 0,0,0,0,2,3,0,0,0,0 |
db 0,0,0,1,1,1,1,0,0,0 |
db 0,0,1,1,0,0,1,1,0,0 |
db 0,0,1,1,0,0,1,1,0,0 |
db 2,1,2,1,2,1,2,1,2,1 |
db 1,2,1,2,1,2,1,2,1,2 |
; BITMAPs and IMAGEs |
bmp_file: |
file 'arcanii.bmp' |
img_bmp: |
rb 40*90*3+8 |
img_brick1: |
rb 40*20*3+8 |
img_brick2: |
rb 40*20*3+8 |
img_brick3: |
rb 40*20*3+8 |
img_brick4: |
rb 40*20*3+8 |
img_ball: |
rb 10*10*3+8 |
img_bonus: |
rb 20*10*3+8 |
screen_img: |
dd X_SIZE |
dd Y_SIZE |
screen: |
rb X_SIZE*Y_SIZE*3 |
I_END: |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/programs/arcanii/trunk/arcanii.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/arcanii/trunk/ascgl.inc |
---|
0,0 → 1,1387 |
lang equ ru |
; |
; Assembler |
; SMALL |
; CODE |
; Graphics |
; Libary |
; |
; Ver 0.18 By Pavlushin Evgeni (RUSSIA) |
; www.waptap@mail.ru |
;InfoList |
;0.01 LoadImage |
;0.02 SetBmp |
;0.03 Bmptoimg, Setimg ~01.03.2004 |
;0.04 Bug deleted, copyimg ~03.05.2004 |
;0.05 fullimg, collimg ~05.05.2004 |
;0.06 getimg ~09.05.2004 |
;0.07 convbmp ~13.05.2004 |
;0.08 fps ~14.05.2004 |
;0.09 drawfbox ~03.06.2004 |
;0.10 all macros optimized by Halyavin A., add at ~07.06.2004 |
;0.11 many macros optimized by Halyavin A., add at ~30.08.2004 |
;0.12 bmptoimg ~07.09.2004 |
;0.13 imgtoimg ~08.09.2004 |
;0.14 imgtoimg modify not brake bmp pict! ~09.09.2004 |
;0.15 giftoimg, giftoani ~10.09.2004 |
;0.16 setframe, rgbtobgr, setbmp deleted ~20.09.2004 |
;0.17 modification giftoimg, giftoani, getframeoff ~01.10.2004 |
;0.18 aframetoimg,aimgtoimg,frametoimg ~03.10.2004 |
aframetoimg_use_count=0 |
macro aframetoimg img, x, y, canvas,acol |
{ |
local loo,loo2,acolor |
aframetoimg_use_count=aframetoimg_use_count+1 |
if aframetoimg_use_count = 1 |
jmp end_aframetoimg_proc |
acolor dd 0 |
aframetoimg_proc: |
;getout coord |
mov [acolor],ebp |
mov edx,ebx ;img ;xsize |
movzx eax,word [edx] |
add eax,esi ;y cor |
; mov eax,esi ;y cor |
mul dword [ecx] ;canvas xsize |
add eax,edi ;x cor |
mov ebp,ebx ;img ;xsize |
movzx edx,word [ebp] |
add eax,edx |
mov ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,ecx ;canvas+8;start |
add ebp,8 |
;get img size |
add ebx,4 |
mov eax,ebx ;img ;xsize |
movzx esi,word [eax] |
movzx edi,word [eax+2] |
add ebx,4 |
mov edx,ebx ;img+8 |
loo2: |
push esi |
loo: |
;test on alpha color |
mov eax,[edx] |
shl eax,8 |
shr eax,8 |
cmp eax,[acolor] |
jne yx |
add edx,3 |
add ebp,3 |
jmp nx |
yx: |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
nx: |
dec esi |
jnz loo |
pop esi |
sub ebp,3 |
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) |
sub eax,esi |
add ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,3 |
dec edi |
jnz loo2 |
ret |
end_aframetoimg_proc: |
end if |
push img |
push canvas |
push x |
push y |
push acol |
pop ebp |
pop esi |
pop edi |
pop ecx |
pop ebx |
call aframetoimg_proc |
} |
frametoimg_use_count=0 |
macro frametoimg img, x, y, canvas |
{ |
local loo,loo2 |
frametoimg_use_count=frametoimg_use_count+1 |
if frametoimg_use_count = 1 |
jmp end_frametoimg_proc |
frametoimg_proc: |
;getout coord |
mov edx,ebx ;img ;xsize |
movzx eax,word [edx] |
add eax,esi ;y cor |
; mov eax,esi ;y cor |
mul dword [ecx] ;canvas xsize |
add eax,edi ;x cor |
mov ebp,ebx ;img ;xsize |
movzx edx,word [ebp] |
add eax,edx |
mov ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,ecx ;canvas+8;start |
add ebp,8 |
;get img size |
add ebx,4 |
mov eax,ebx ;img ;xsize |
movzx esi,word [eax] |
movzx edi,word [eax+2] |
add ebx,4 |
mov edx,ebx ;img+8 |
loo2: |
push esi |
loo: |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
dec esi |
jnz loo |
pop esi |
sub ebp,3 |
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) |
sub eax,esi |
add ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,3 |
dec edi |
jnz loo2 |
ret |
end_frametoimg_proc: |
end if |
push img |
push canvas |
push x |
push y |
pop esi |
pop edi |
pop ecx |
pop ebx |
call frametoimg_proc |
} |
aimgtoimg_use_count=0 |
macro aimgtoimg img, x, y, canvas,acol |
{ |
local loo,loo2,acolor |
aimgtoimg_use_count=aimgtoimg_use_count+1 |
if aimgtoimg_use_count = 1 |
jmp end_aimgtoimg_proc |
acolor dd 0 |
aimgtoimg_proc: |
;getout coord |
mov [acolor],ebp |
mov eax,esi ;y cor |
mul dword [ecx] ;canvas xsize |
add eax,edi ;x cor |
mov ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,ecx ;canvas+8;start |
add ebp,8 |
;get img size |
mov eax,ebx ;img ;xsize |
mov esi,[eax] |
add ebx,4 |
mov eax,ebx ; img+4 ;ysize |
mov edi,[eax] |
add ebx,4 |
mov edx,ebx ;img+8 |
loo2: |
push esi |
loo: |
;test on alpha color |
mov eax,[edx] |
shl eax,8 |
shr eax,8 |
cmp eax,[acolor] |
jne yx |
add edx,3 |
add ebp,3 |
jmp nx |
yx: |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
nx: |
dec esi |
jnz loo |
pop esi |
sub ebp,3 |
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) |
sub eax,esi |
add ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,3 |
dec edi |
jnz loo2 |
ret |
end_aimgtoimg_proc: |
end if |
push img |
push canvas |
push x |
push y |
push acol |
pop ebp |
pop esi |
pop edi |
pop ecx |
pop ebx |
call aimgtoimg_proc |
} |
imgtoimg_use_count=0 |
macro imgtoimg img, x, y, canvas |
{ |
local loo,loo2 |
imgtoimg_use_count=imgtoimg_use_count+1 |
if imgtoimg_use_count = 1 |
jmp end_imgtoimg_proc |
imgtoimg_proc: |
;getout coord |
mov eax,esi ;y cor |
mul dword [ecx] ;canvas xsize |
add eax,edi ;x cor |
mov ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,ecx ;canvas+8;start |
add ebp,8 |
;get img size |
mov eax,ebx ;img ;xsize |
mov esi,[eax] |
add ebx,4 |
mov eax,ebx ; img+4 ;ysize |
mov edi,[eax] |
add ebx,4 |
mov edx,ebx ;img+8 |
loo2: |
push esi |
loo: |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
mov al,byte [edx] |
mov byte [ebp],al |
inc ebp |
inc edx |
dec esi |
jnz loo |
pop esi |
sub ebp,3 |
mov eax,[ecx] ;offset = offset+((canxsize-imgxsize)*3) |
sub eax,esi |
add ebp,eax |
shl eax,1 |
add ebp,eax |
add ebp,3 |
dec edi |
jnz loo2 |
ret |
end_imgtoimg_proc: |
end if |
push img |
push canvas |
push x |
push y |
pop esi |
pop edi |
pop ecx |
pop ebx |
call imgtoimg_proc |
} |
;DrawBox |
macro drawfbox x,y,xs,ys,color |
{ |
words2reg ebx,x,xs ;x*65536+xs |
words2reg ecx,y,ys ;y*65536+ys |
mov edx,color |
mov eax,13 |
int 0x40 |
} |
; FPS - Set Frame Per Second Display |
fps_show_frequency=40 |
macro fps x,y,color,delcolor |
{ |
local spdat,savetime,new_time,fps,fps_cntr,out_fps,new_time,ttt |
local no_out_fps |
jmp spdat |
savetime dd 0 |
fps_cntr dd 0 |
fps dd 0 |
ttt dd 0 |
spdat: |
get_time: |
mov eax,3 |
int 0x40 |
cmp eax,[savetime] |
jne new_time |
inc [fps_cntr] |
cmp dword [ttt],0 |
je out_fps |
dec dword [ttt] |
jmp no_out_fps |
new_time: |
mov [savetime],eax |
mov ebx,[fps_cntr] |
mov [fps],ebx |
mov [fps_cntr],0 |
out_fps: |
if ~(delcolor eq ) |
mov ebx,x*65536+36 |
mov ecx,y*65536+7 |
mov edx,delcolor |
mov eax,13 |
int 0x40 |
end if |
mov dword [ttt],fps_show_frequency |
mov eax,47 |
mov ebx,6*65536 |
; mov bl,0 |
mov edx,x*65536+y |
mov esi,color |
mov ecx,[fps] |
int 0x40 |
no_out_fps: |
} |
; COLLIMG - Collusion image's |
_1dbounce_count=0; |
macro collimg img1_off,x1,y1,img2_off,x2,y2,otv |
{ |
local bounce,exit,anot,bc,nbc |
mov esi,[img1_off] ;xs1 |
mov edi,[img2_off] ;ys2 |
mov eax,x1 ; |
mov ebx,x2 ; |
call _1dbounce |
mov edx,ecx |
mov esi,[img1_off+4] ;ys1 |
mov edi,[img2_off+4] ;ys2 |
mov eax,y1 ; |
mov ebx,y2 ; |
call _1dbounce |
add edx,ecx |
cmp edx,2 |
je bounce |
mov otv,0 |
jmp exit |
_1dbounce_count=_1dbounce_count+1 |
if _1dbounce_count = 1 |
_1dbounce: |
cmp ebx,eax |
jb anot |
add eax,esi |
cmp eax,ebx |
jbe nbc |
bc: |
mov ecx,1 |
ret |
anot: |
add ebx,edi |
cmp ebx,eax |
ja bc |
nbc: |
xor ecx,ecx |
ret |
end if |
bounce: |
mov otv,1 |
exit: |
} |
macro rgbtobgr image |
{ |
local loo |
mov eax,[image] |
mul dword [image+4] |
mov ecx,eax |
mov esi,image+8 |
; add esi,8 |
loo: |
mov al,[esi] |
mov bl,[esi+2] |
mov [esi],bl |
mov [esi+2],al |
add esi,3 |
dec ecx |
jnz loo |
} |
macro setimg x , y ,arg3 |
{ |
mov eax,7 |
mov ebx,arg3 |
add ebx,8 |
mov cx,[arg3] |
shl ecx,16 |
add cx,[arg3+4] |
; wordstoreg ecx,[arg3],[arg3+4] |
; wordstoreg edx,x,y |
words2reg edx, x , y ;arg1*65536+arg2 |
int 0x40 |
} |
macro setframe x , y ,arg3 |
{ |
mov eax,7 |
mov ebx,arg3 |
add ebx,8 |
words2reg edx, x , y ;arg1*65536+arg2 |
add edx,dword [arg3] |
mov ecx,dword [arg3+4] |
int 0x40 |
} |
macro getimg imgsrc,x,y,xs,ys,imgdest |
{ |
local cyc |
if xs eqtype 0 |
mov dword [imgdest],xs |
else |
mov eax,xs |
mov dword [imgdest],eax |
end if |
if ys eqtype 0 |
mov dword [imgdest+4],ys |
else |
mov eax,ys |
mov dword [imgdest+4],eax |
end if |
mov eax,dword [imgsrc] ;getx size |
; lea ecx,[eax+2*eax] |
mov ecx,eax |
shl ecx,1 |
add ecx,eax |
mov ebx,y |
mul ebx |
add eax,x |
mov edx,ecx |
lea eax,[eax+2*eax] ;eax=offset on imsrc |
; mov ebp,eax |
; shl eax,1 |
; add eax,ebp |
mov ecx,xs |
mov ebx,ys |
mov edi,8+imgdest |
lea esi,[eax+8+imgsrc] |
; mov esi,eax |
; add esi,8 |
; add esi,imgsrc |
cld |
cyc: |
movsw |
movsb |
dec ecx |
jne cyc |
add esi,edx |
mov ecx,xs |
sub esi,ecx |
sub esi,ecx |
sub esi,ecx |
dec ebx |
jne cyc |
} |
macro copyimg img2_off,img1_off |
{ |
mov eax,dword [img1_off] |
mov ebx,dword [img1_off+4] |
mul ebx |
lea ecx,[eax+2*eax] |
lea esi,[img1_off+8] |
lea edi,[img2_off+8] |
cld |
rep movsb |
} |
macro fullimg img_off,xs,ys,color |
{ |
local cop |
mov eax,xs |
mov ebx,ys |
mov dword [img_off],eax |
mov dword [img_off+4],ebx |
mul ebx |
lea ebp,[eax+2*eax] |
mov esi,color |
if color eqtype 0 |
6 |
else |
mov ecx,esi |
shr ecx,16 |
end if |
xor edi,edi |
cop: |
mov word [img_off+8+edi],si |
add edi,2 |
mov byte [img_off+8+edi],cl |
inc edi |
cmp edi,ebp |
jne cop |
} |
; number of frame in ecx |
; callculatin offset of raw data |
macro getframeoff num_of_frame,offset_of_animation,offset_of_frame |
{ |
local loo,setpic |
mov ebp,num_of_frame ;ecx |
mov esi,offset_of_animation;Image |
loo: |
cmp ebp,0 |
je setpic |
movzx eax,word [esi+4] |
movzx ebx,word [esi+6] |
mul ebx ;dword [esi+4] |
mov ebx,3 |
mul ebx |
add eax,8 |
add esi,eax |
dec ebp |
jmp loo |
setpic: |
mov dword offset_of_frame,esi |
} |
; BMPTOIMG -Convert BMP format TO IMG format |
; (SYNTAX) BMPTOIMG BMP_source_offset,IMG_dest_ofset |
; (SAMPLE) View BMPLS.ASM sample. |
; ( NOTE ) This is macros is not brake bmp structure! Tested in 32,8,4 bits |
bmptoimg_data_area_count=0 |
macro bmptoimg bmp_load_area,img_dest_area |
{ |
local fileinfo,string,end_bmp,nodix |
local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2 |
local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize |
;local qwe,bmpfn |
; convert: |
movzx eax,word [bmp_load_area+28] |
mul dword [bmp_load_area+18] |
add eax,31 |
shr eax,5 |
mov dword [bmptoimg_data_area_dwps],eax ;dwps-doublewords per string |
shl eax,2 |
mov dword [bmptoimg_data_area_bps],eax ;bps-bytes per string |
cmp dword [bmp_load_area+34],0 |
jne yespicsize ;if picture size is defined |
mul dword [bmp_load_area+22] |
mov dword [bmp_load_area+34],eax |
yespicsize: |
mov ebp,img_dest_area+8 |
mov eax,bmp_load_area |
mov ebx,eax |
add ebx, [bmp_load_area+2];file size |
inc ebx |
mov dword [bmptoimg_soi],ebx ;soi-start of image area for drawing |
add eax, [bmp_load_area+10] |
mov dword [bmptoimg_data_area_sop],eax ;sop-start of picture in file |
add eax, [bmp_load_area+34] |
mov dword [bmptoimg_data_area_eop],eax ;eop-end of picture in file |
mov eax, [bmp_load_area+18] |
lea eax,[eax+2*eax] ;3x pixels in eax |
mov edi,dword [bmptoimg_soi] ;initializing |
mov esi,dword [bmptoimg_data_area_eop] |
sub esi,dword [bmptoimg_data_area_bps] |
nextstring: |
push edi |
push ebp |
cmp word [bmp_load_area+28],24 |
jne convertno32 |
mov edi,ebp |
mov ecx,[bmptoimg_data_area_dwps] |
cld |
rep movsd |
convert1: |
pop ebp |
pop edi |
sub esi,dword [bmptoimg_data_area_bps] |
sub esi,dword [bmptoimg_data_area_bps] |
cmp esi,dword [bmptoimg_data_area_sop] |
jb end_bmp |
add edi,eax |
add ebp,eax |
jmp nextstring |
convertno32: |
mov ebx,bmp_load_area |
add ebx, [bmp_load_area+14] |
add ebx,14 ;start of color table |
push esi |
add esi,dword [bmptoimg_data_area_bps] |
mov dword [bmptoimg_data_area_eos],esi |
pop esi |
nextelem: |
push eax |
movzx eax,byte [esi] |
cmp word [bmp_load_area+28],4 |
je convert4bpp |
cmp word [bmp_load_area+28],1 |
je convert1bpp |
call converttable |
convert2: |
pop eax |
inc esi |
cmp esi,dword [bmptoimg_data_area_eos] |
jae convert1 |
add edi,3 |
add ebp,3 |
jmp nextelem |
convert4bpp: |
shl ax,4 |
shr al,4 |
push ax |
movzx eax,ah |
call converttable |
add edi,3 |
add ebp,3 |
pop ax |
movzx eax,al |
call converttable |
jmp convert2 |
convert1bpp: |
mov ecx,eax |
mov edx,7 |
nextbit: |
xor eax,eax |
bt ecx,edx |
jnc noaddelem |
inc eax |
noaddelem: |
push edx |
call converttable |
pop edx |
dec edx |
js convert2 |
add edi,3 |
add ebp,3 |
jmp nextbit |
converttable: |
shl eax,2 |
add eax,ebx |
mov edx, dword [eax] |
; mov dword [edi],edx |
mov [ebp],edx |
ret |
bmptoimg_data_area_count=bmptoimg_data_area_count+1 |
if bmptoimg_data_area_count = 1 |
; DATA AREA |
bmptoimg_soi dd 0 |
bmptoimg_data_area_bps dd 0 |
bmptoimg_data_area_dwps dd 0 |
bmptoimg_data_area_sop dd 0 |
bmptoimg_data_area_eop dd 0 |
bmptoimg_data_area_eos dd 0 |
end if |
end_bmp: |
mov eax,dword [bmp_load_area+18] |
mov ebx,dword [bmp_load_area+22] |
mov dword [img_dest_area],eax |
mov dword [img_dest_area+4],ebx |
} |
; For convert RGB to BGR |
COLOR_ORDER equ MENUETOS |
macro giftoani gifsrc,imgsrc,num_of_frames |
{ |
local hasharea, ReadGIF, nextblock,_null |
local globalColor, img_count, cur_info, img_start |
local codesize, compsize, bit_count, CC, EOI, Palette |
local block_ofs, table_ptr, gifmacend |
local no_gc, block_skip, no_comm, noextblock, uselocal |
local setPal, filltable, reinit, cycle, zadd, noinc |
local notintable, er, zend, nxt, continue, ex, Gif_skipmap |
local Gif_get_sym, shift, nextbl, noblock, loop1, exx |
local Gif_output, next, loop2 |
_null fix 0x1000 ; 0x1000 |
; jmp sss |
; if defined gif_hash_offset |
; else |
; hasharea: |
; times 4096 dd 0 ;4096 |
; end if |
;sss: |
mov esi,gifsrc ;ª § ⥫ì ä ¨« ¢ ¯ ¬ï⨠|
mov edi,imgsrc ;ª § ⥫ì ᯨ᮪ ª à⨮ª |
if defined gif_hash_offset |
mov eax,gif_hash_offset ; ¡®ç ï ®¡« áâì ¬¨¨¬ã¬ 4096*4 ¡ ©â |
else |
mov eax,hasharea ; ¡®ç ï ®¡« áâì ¬¨¨¬ã¬ 4096*4 ¡ ©â |
end if |
call ReadGIF |
push ecx |
pop dword num_of_frames |
jmp gifmacend |
if defined gif_hash_offset |
else |
hasharea: |
times 4096 dd 0 ;4096 |
end if |
ReadGIF: |
push esi edi |
mov [table_ptr],eax |
mov [cur_info],edi |
xor eax,eax |
mov [globalColor],eax |
mov [img_count],eax |
inc eax |
cmp dword[esi],'GIF8' |
jne er ; signature |
mov ecx,[esi+0xa] |
inc eax |
add esi,0xd |
mov edi,esi |
bt ecx,7 |
jnc nextblock |
mov [globalColor],esi |
call Gif_skipmap |
nextblock: |
cmp byte[edi],0x21 |
jne noextblock |
inc edi |
cmp byte[edi],0xf9 ; Graphic Control Ext |
jne no_gc |
add edi,7 |
jmp nextblock |
no_gc: |
cmp byte[edi],0xfe ; Comment Ext |
jne no_comm |
inc edi |
block_skip: |
movzx eax,byte[edi] |
lea edi,[edi+eax+1] |
cmp byte[edi],0 |
jnz block_skip |
inc edi |
jmp nextblock |
no_comm: |
cmp byte[edi],0xff ; Application Ext |
jne nextblock |
add edi,13 |
jmp block_skip |
noextblock: |
cmp byte[edi],0x2c ; image beginning |
jne er |
inc [img_count] |
inc edi |
mov esi,[cur_info] |
xchg esi,edi |
movsd |
movsd |
push edi |
movzx ecx,word[esi] |
inc esi |
bt ecx,7 |
jc uselocal |
push [globalColor] |
mov edi,esi |
jmp setPal |
uselocal: |
call Gif_skipmap |
push esi |
setPal: |
movzx ecx,byte[edi] |
inc ecx |
mov [codesize],ecx |
dec ecx |
pop [Palette] |
lea esi,[edi+1] |
mov edi,[table_ptr] |
xor eax,eax |
cld |
lodsb ; eax - block_count |
add eax,esi |
mov [block_ofs],eax |
mov [bit_count],8 |
mov eax,1 |
shl eax,cl |
mov [CC],eax |
inc eax |
mov [EOI],eax |
lea ecx,[eax-1] |
mov eax, _null shl 16 |
filltable: |
stosd |
inc eax |
loop filltable |
pop edi |
mov [img_start],edi |
reinit: |
mov edx,[EOI] |
inc edx |
push [codesize] |
pop [compsize] |
call Gif_get_sym |
cmp eax,[CC] |
je reinit |
call Gif_output |
cycle: |
movzx ebx,ax |
call Gif_get_sym |
cmp eax,edx |
jae notintable |
cmp eax,[CC] |
je reinit |
cmp eax,[EOI] |
je zend |
call Gif_output |
zadd: |
push eax |
mov eax,[table_ptr] |
mov [eax+edx*4],ebx |
pop eax |
cmp edx,0xFFF |
jae cycle |
inc edx |
bsr ebx,edx |
cmp ebx,[compsize] |
jne noinc |
inc [compsize] |
noinc: |
jmp cycle |
notintable: |
push eax |
mov eax,ebx |
call Gif_output |
push ebx |
movzx eax,bx |
call Gif_output |
pop ebx eax |
jmp zadd |
er: |
pop edi |
jmp ex |
zend: |
; mov eax,[.cur_info] ; skip offset to next frame |
; mov [eax],edi |
mov [cur_info],edi |
add esi,2 |
xchg esi,edi |
nxt: |
cmp byte[edi],0 |
jnz continue |
inc edi |
jmp nxt |
continue: |
cmp byte[edi],0x3b ;read next frame |
jne nextblock |
xor eax,eax |
stosd |
mov ecx,[img_count] |
ex: |
pop edi esi |
ret |
Gif_skipmap: |
; in: ecx - image descriptor, esi - pointer to colormap |
; out: edi - pointer to area after colormap |
and ecx,111b |
inc ecx ; color map size |
mov ebx,1 |
shl ebx,cl |
lea ebx,[ebx*2+ebx] |
lea edi,[esi+ebx] |
ret |
Gif_get_sym: |
mov ecx,[compsize] |
push ecx |
xor eax,eax |
shift: |
ror byte[esi],1 |
rcr eax,1 |
dec [bit_count] |
jnz loop1 |
inc esi |
cmp esi,[block_ofs] |
jb noblock |
push eax |
xor eax,eax |
lodsb |
test eax,eax |
jnz nextbl |
mov eax,[EOI] |
sub esi,2 |
add esp,8 |
jmp exx |
nextbl: |
add eax,esi |
mov [block_ofs],eax |
pop eax |
noblock: |
mov [bit_count],8 |
loop1: |
loop shift |
pop ecx |
rol eax,cl |
exx: |
xor ecx,ecx |
ret |
Gif_output: |
push esi eax edx |
mov edx,[table_ptr] |
next: |
push word[edx+eax*4] |
mov ax,word[edx+eax*4+2] |
inc ecx |
cmp ax,_null |
jnz next |
shl ebx,16 |
mov bx,[esp] |
loop2: |
pop ax |
lea esi,[eax+eax*2] |
add esi,[Palette] |
if COLOR_ORDER eq MENUETOS |
mov esi,[esi] |
bswap esi |
shr esi,8 |
mov [edi],esi |
add edi,3 |
else |
movsw |
movsb |
end if |
loop loop2 |
pop edx eax esi |
ret |
globalColor dd 1 |
img_count dd 1 |
cur_info dd 1 ; image table pointer |
img_start dd 1 |
codesize dd 1 |
compsize dd 1 |
bit_count dd 1 |
CC dd 1 |
EOI dd 1 |
Palette dd 1 |
block_ofs dd 1 |
table_ptr dd 1 |
gifmacend: |
} |
macro giftoimg gifsrc,imgsrc |
{ |
local hasharea, ReadGIF, nextblock,_null |
local globalColor, img_count, cur_info, img_start |
local codesize, compsize, bit_count, CC, EOI, Palette |
local block_ofs, table_ptr, gifmacend |
local no_gc, block_skip, no_comm, noextblock, uselocal |
local setPal, filltable, reinit, cycle, zadd, noinc |
local notintable, er, zend, nxt, continue, ex, Gif_skipmap |
local Gif_get_sym, shift, nextbl, noblock, loop1, exx |
local Gif_output, next, loop2 |
_null fix 0x1000 ; 0x1000 |
mov esi,gifsrc ;ª § ⥫ì ä ¨« ¢ ¯ ¬ï⨠|
mov edi,imgsrc ;ª § ⥫ì ᯨ᮪ ª à⨮ª |
if defined gif_hash_offset |
mov eax,gif_hash_offset ; ¡®ç ï ®¡« áâì ¬¨¨¬ã¬ 4096*4 ¡ ©â |
else |
mov eax,hasharea ; ¡®ç ï ®¡« áâì ¬¨¨¬ã¬ 4096*4 ¡ ©â |
end if |
call ReadGIF |
jmp gifmacend |
if defined gif_hash_offset |
else |
hasharea: |
times 4096 dd 0 ;4096 |
end if |
ReadGIF: |
push esi edi |
mov [table_ptr],eax |
mov [cur_info],edi |
xor eax,eax |
mov [globalColor],eax |
mov [img_count],eax |
inc eax |
cmp dword[esi],'GIF8' |
jne er ; signature |
mov ecx,[esi+0xa] |
inc eax |
add esi,0xd |
mov edi,esi |
bt ecx,7 |
jnc nextblock |
mov [globalColor],esi |
call Gif_skipmap |
nextblock: |
cmp byte[edi],0x21 |
jne noextblock |
inc edi |
cmp byte[edi],0xf9 ; Graphic Control Ext |
jne no_gc |
add edi,7 |
jmp nextblock |
no_gc: |
cmp byte[edi],0xfe ; Comment Ext |
jne no_comm |
inc edi |
block_skip: |
movzx eax,byte[edi] |
lea edi,[edi+eax+1] |
cmp byte[edi],0 |
jnz block_skip |
inc edi |
jmp nextblock |
no_comm: |
cmp byte[edi],0xff ; Application Ext |
jne nextblock |
add edi,13 |
jmp block_skip |
noextblock: |
cmp byte[edi],0x2c ; image beginning |
jne er |
inc [img_count] |
inc edi |
mov esi,[cur_info] |
xchg esi,edi |
; movsd |
; movsd |
mov bp,word[esi+4] |
movzx ebx,bp |
mov [edi],ebx |
mov bp,word[esi+6] |
movzx ebx,bp |
mov [edi+4],ebx |
add edi,8 |
add esi,8 |
push edi |
movzx ecx,word[esi] |
inc esi |
bt ecx,7 |
jc uselocal |
push [globalColor] |
mov edi,esi |
jmp setPal |
uselocal: |
call Gif_skipmap |
push esi |
setPal: |
movzx ecx,byte[edi] |
inc ecx |
mov [codesize],ecx |
dec ecx |
pop [Palette] |
lea esi,[edi+1] |
mov edi,[table_ptr] |
xor eax,eax |
cld |
lodsb ; eax - block_count |
add eax,esi |
mov [block_ofs],eax |
mov [bit_count],8 |
mov eax,1 |
shl eax,cl |
mov [CC],eax |
inc eax |
mov [EOI],eax |
lea ecx,[eax-1] |
mov eax, _null shl 16 |
filltable: |
stosd |
inc eax |
loop filltable |
pop edi |
mov [img_start],edi |
reinit: |
mov edx,[EOI] |
inc edx |
push [codesize] |
pop [compsize] |
call Gif_get_sym |
cmp eax,[CC] |
je reinit |
call Gif_output |
cycle: |
movzx ebx,ax |
call Gif_get_sym |
cmp eax,edx |
jae notintable |
cmp eax,[CC] |
je reinit |
cmp eax,[EOI] |
je zend |
call Gif_output |
zadd: |
push eax |
mov eax,[table_ptr] |
mov [eax+edx*4],ebx |
pop eax |
cmp edx,0xFFF |
jae cycle |
inc edx |
bsr ebx,edx |
cmp ebx,[compsize] |
jne noinc |
inc [compsize] |
noinc: |
jmp cycle |
notintable: |
push eax |
mov eax,ebx |
call Gif_output |
push ebx |
movzx eax,bx |
call Gif_output |
pop ebx eax |
jmp zadd |
er: |
pop edi |
jmp ex |
zend: |
; mov eax,[.cur_info] ; skip offset to next frame |
; mov [eax],edi |
mov [cur_info],edi |
add esi,2 |
xchg esi,edi |
nxt: |
cmp byte[edi],0 |
jnz continue |
inc edi |
jmp nxt |
continue: |
; cmp byte[edi],0x3b ;read next frame |
; jne nextblock |
xor eax,eax |
stosd |
mov ecx,[img_count] |
ex: |
pop edi esi |
ret |
Gif_skipmap: |
; in: ecx - image descriptor, esi - pointer to colormap |
; out: edi - pointer to area after colormap |
and ecx,111b |
inc ecx ; color map size |
mov ebx,1 |
shl ebx,cl |
lea ebx,[ebx*2+ebx] |
lea edi,[esi+ebx] |
ret |
Gif_get_sym: |
mov ecx,[compsize] |
push ecx |
xor eax,eax |
shift: |
ror byte[esi],1 |
rcr eax,1 |
dec [bit_count] |
jnz loop1 |
inc esi |
cmp esi,[block_ofs] |
jb noblock |
push eax |
xor eax,eax |
lodsb |
test eax,eax |
jnz nextbl |
mov eax,[EOI] |
sub esi,2 |
add esp,8 |
jmp exx |
nextbl: |
add eax,esi |
mov [block_ofs],eax |
pop eax |
noblock: |
mov [bit_count],8 |
loop1: |
loop shift |
pop ecx |
rol eax,cl |
exx: |
xor ecx,ecx |
ret |
Gif_output: |
push esi eax edx |
mov edx,[table_ptr] |
next: |
push word[edx+eax*4] |
mov ax,word[edx+eax*4+2] |
inc ecx |
cmp ax,_null |
jnz next |
shl ebx,16 |
mov bx,[esp] |
loop2: |
pop ax |
lea esi,[eax+eax*2] |
add esi,[Palette] |
if COLOR_ORDER eq MENUETOS |
mov esi,[esi] |
bswap esi |
shr esi,8 |
mov [edi],esi |
add edi,3 |
else |
movsw |
movsb |
end if |
loop loop2 |
pop edx eax esi |
ret |
globalColor dd 1 |
img_count dd 1 |
cur_info dd 1 ; image table pointer |
img_start dd 1 |
codesize dd 1 |
compsize dd 1 |
bit_count dd 1 |
CC dd 1 |
EOI dd 1 |
Palette dd 1 |
block_ofs dd 1 |
table_ptr dd 1 |
gifmacend: |
} |