programs sources added

git-svn-id: svn://kolibrios.org@31 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Andrey Halyavin (halyavin)
2006-01-03 09:43:31 +00:00
parent 4a0bec74c6
commit 065b8d32b2
667 changed files with 191000 additions and 0 deletions
+489
View File
@@ -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:
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix en >lang.inc
@fasm 15.asm 15
@pause
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm 15.asm 15
@pause
+266
View File
@@ -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
+691
View File
@@ -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:
+624
View File
@@ -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
}
+499
View File
@@ -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
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix en >lang.inc
@fasm 3dcube2.asm 3dcube2
@pause
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm 3dcube2.asm 3dcube2
@pause
+266
View File
@@ -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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+897
View File
@@ -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
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix en >lang.inc
@fasm 3detx60b.asm 3detx60b
@pause
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm 3detx60b.asm 3detx60b
@pause
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

+938
View File
@@ -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:
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix en >lang.inc
@fasm 3dtcub10.asm 3dtcub10
@pause
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm 3dtcub10.asm 3dtcub10
@pause
Binary file not shown.
+288
View File
@@ -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
File diff suppressed because it is too large Load Diff
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix en >lang.inc
@fasm ac97wav.asm ac97wav
@pause
+4
View File
@@ -0,0 +1,4 @@
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm ac97wav.asm ac97wav
@pause
+344
View File
@@ -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
+35
View File
@@ -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
+131
View File
@@ -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'
+270
View File
@@ -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
+10
View File
@@ -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
+266
View File
@@ -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
+29
View File
@@ -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
+46
View File
@@ -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
+85
View File
@@ -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.
+223
View File
@@ -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:
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

+147
View File
@@ -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
+151
View File
@@ -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
+200
View File
@@ -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
+430
View File
@@ -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
+2
View File
@@ -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
+334
View File
@@ -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
<