programs sources added
git-svn-id: svn://kolibrios.org@31 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -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:
|
||||
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm 15.asm 15
|
||||
@pause
|
||||
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm 15.asm 15
|
||||
@pause
|
||||
@@ -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
|
||||
@@ -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:
|
||||
@@ -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
|
||||
|
||||
}
|
||||
@@ -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
|
||||
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm 3dcube2.asm 3dcube2
|
||||
@pause
|
||||
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm 3dcube2.asm 3dcube2
|
||||
@pause
|
||||
@@ -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
@@ -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
|
||||
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm 3detx60b.asm 3detx60b
|
||||
@pause
|
||||
@@ -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 |
@@ -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:
|
||||
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm 3dtcub10.asm 3dtcub10
|
||||
@pause
|
||||
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm 3dtcub10.asm 3dtcub10
|
||||
@pause
|
||||
Binary file not shown.
@@ -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
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm ac97wav.asm ac97wav
|
||||
@pause
|
||||
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm ac97wav.asm ac97wav
|
||||
@pause
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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 |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
| < | ||||