kolibrios/programs/system/docpack/trunk/docpack.asm

228 lines
4.3 KiB
NASM
Raw Normal View History

;---------------------------------------------------------------------
;
; DOCPAK FOR KOLIBRI v1.2
; Written in pure assembly by Ivushkin Andrey aka Willow
;
;---------------------------------------------------------------------
FILE_COUNT=0
DEF_FILE equ 'g'
macro embed_docdir_file fn
{
forward
local label,label2,label3
dd label2-label
dd label-label3
label3:
db fn
label:
file '%DOCDIR%' # fn
label2:
FILE_COUNT=FILE_COUNT+1
}
macro embed_local_file fn
{
forward
local label,label2,label3
dd label2-label
dd label-label3
label3:
db fn
label:
file fn
label2:
FILE_COUNT=FILE_COUNT+1
}
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd start ; start of code
dd I_END ; size of image
dd I_END+0x400 ; memory for app
dd I_END+0x400 ; esp
dd my_param , 0x0 ; I_Param , I_Icon
include '../../../macros.inc'
include 'lang.inc'
start:
cmp [my_param],0
je red
cmp [my_param],'a'
jb .par_a
cmp [my_param],'z'
jbe .ok2
.par_a:
mov [my_param],DEF_FILE
.ok2:
movzx ecx,[my_param]
mov [my_param],'*'
.open:
sub ecx,'a'-1
mov edx,embedded
xor esi,esi
.list:
lea edx,[edx+esi+8]
mov esi,[edx-8]
add edx,[edx-4]
test esi,esi
jz .close
loop .list
push edx
; convert number in esi to decimal representation
mov ecx, 10
push -'0'
mov eax, esi
@@:
xor edx, edx
div ecx
push edx
test eax, eax
jnz @b
mov edi, fsize
@@:
pop eax
add al, '0'
stosb
jnz @b
mcall 70,fileinfo
mov ecx,eax
mcall 5,20
pop edx
mcall 60,2
cmp [my_param],'*'
jne still
.close:
mcall -1
red:
mov [my_param],'a'
mcall 48, 3, sc, sizeof.system_colors
mcall 12,1
BTN_H equ 21
mov edx,[sc.work]
or edx,0x34000000
mcall 0, <220,141>, <30,FILECOUNT*(BTN_H+3)+37>, , ,title
mov ecx,FILECOUNT
mov ebx,23 shl 16+100
mov esi,[sc.work_button]
mov edi,5 shl 16+BTN_H
mov edx,10
mov eax,8
.btnlp:
push ecx
mcall ,,edi
add edi,(BTN_H+3) shl 16
inc edx
pop ecx
loop .btnlp
mov ecx,FILECOUNT
mov edx,embedded
xor edi,edi
mov ebx,30 shl 16+8
mov eax,4
.list:
lea edx,[edx+edi+8]
mov edi,[edx-8]
pusha
sub ebx,20 shl 16
mov ecx, [sc.work_text]
or ecx, 0x30000000
mcall ,,,my_param,1
inc [my_param]
popa
push ecx
mov esi, [edx-4]
sub esi, 4 ;remove .txt extension
mov ecx, [sc.work_button_text]
or ecx, 0x30000000
mcall
pop ecx
add esi, 4
add edx, esi
add ebx,(BTN_H+3)
loop .list
mcall 12,2
still:
mcall 10
cmp eax,1
je red
cmp eax,2
jne .nokey
mcall 2
cmp ah,27 ;Esc
je start.close
cmp ah,'a'
jb still
cmp ah,'a'+FILECOUNT
jae still
jmp .cxax
.nokey:
mcall 17
cmp ah,1
je start.close
sub ah,10-'a'
.cxax:
movzx ecx,ah
jmp start.open
fileinfo:
dd 7
dd 0
dd param
dd 0 ,0
db '/sys/TINYPAD',0
param db '*'
fsize:
times 10 db '0'
db 0
embedded:
; Please use only filenames w/o path!
; -- Start of embedding area ------
embed_docdir_file 'CREDITS.TXT' ;a
if lang eq ru_RU
embed_docdir_file 'GNU.TXT' ;b
else
embed_docdir_file 'COPYING.TXT' ;b
end if
embed_docdir_file 'HOT_KEYS.TXT' ;c
embed_local_file 'FASM.TXT' ;d
embed_docdir_file 'MTDBG.TXT' ;e
if lang eq ru_RU
embed_local_file 'SYSFUNCR.TXT' ;f
else
embed_local_file 'SYSFUNCS.TXT' ;f
end if
embed_local_file 'STACK.TXT' ;g
embed_docdir_file 'KFAR_KEYS.TXT' ;h
embed_docdir_file 'INI.TXT' ;i
embed_docdir_file 'OPENDIAL.TXT' ;j
; -- End of embedding area -------
dd 0
FILECOUNT = FILE_COUNT
if ~ FILECOUNT>0
error 'No embedded files'
end if
my_param db 0
rb 256
I_END:
title db 'Doc Pack',0
sc system_colors