other/outdated

git-svn-id: svn://kolibrios.org@3122 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2012-12-16 20:39:33 +00:00
parent c2c84028ec
commit 7dfe6ad257
31 changed files with 6801 additions and 3765 deletions

View File

@ -1,176 +1,176 @@
@RCHER FOR MENUET v1.0 July 14, 2005 @RCHER FOR MENUET v1.0 July 14, 2005
Written in pure assembler by Ivushkin Andrey aka Willow Written in pure assembler by Ivushkin Andrey aka Willow
Deflate unpacker Deflate unpacker
Vivat assembler et MENUETOS! Vivat assembler et MENUETOS!
I tender thanks to everyone who spends his time in feasible effortsfor that I tender thanks to everyone who spends his time in feasible effortsfor that
little OS evolution. Now in my own rating the Mario79's distro named Kolibri4 little OS evolution. Now in my own rating the Mario79's distro named Kolibri4
takes 1th place. It is always pleasant to use modern software. Go on! takes 1th place. It is always pleasant to use modern software. Go on!
@RCHER is intended to view & unpack data compressed by Deflate method @RCHER is intended to view & unpack data compressed by Deflate method
(including both static and dynamic Huffman). This method (although it isn't the (including both static and dynamic Huffman). This method (although it isn't the
best already) is used by such file formats as ZIP (modern versions: PKZIP for best already) is used by such file formats as ZIP (modern versions: PKZIP for
MS-DOS can create archives using other, less effective compression methods, MS-DOS can create archives using other, less effective compression methods,
which @RCHER doesn't support), GZIP, JAR, OpenOffice files, SFX ZIP executables which @RCHER doesn't support), GZIP, JAR, OpenOffice files, SFX ZIP executables
and some others. I couldn't prevent myself to include support of PNG images and some others. I couldn't prevent myself to include support of PNG images
(they use the similar compression) and TAR and TAR+GZIP archives. (they use the similar compression) and TAR and TAR+GZIP archives.
When the program is started, a little button carrying a @ symbol appears in the When the program is started, a little button carrying a @ symbol appears in the
left top corner of screen. Clicking this button opens a SYSXTREE dialog to left top corner of screen. Clicking this button opens a SYSXTREE dialog to
select a file being unpacked. Doubleclick closes the application. @RCHER select a file being unpacked. Doubleclick closes the application. @RCHER
outputs its information messages to Debug Board. If an archive contains more outputs its information messages to Debug Board. If an archive contains more
than one file, the 1st is by default unpacked into /HD/1/OUT.TXT (you may than one file, the 1st is by default unpacked into /HD/1/OUT.TXT (you may
change the DUMPFILE constant in @RCHER.ASM) and is opened through TINYPAD change the DUMPFILE constant in @RCHER.ASM) and is opened through TINYPAD
or - if it's a PNG image - in the built-in viewer. or - if it's a PNG image - in the built-in viewer.
These are unpacking flags that may exist in a commandline before an archive These are unpacking flags that may exist in a commandline before an archive
filename: filename:
s - do not close the program after unpacking; s - do not close the program after unpacking;
n - decompress the K-th archive file, where K is the following dword in n - decompress the K-th archive file, where K is the following dword in
commandline; commandline;
N - decompress the K-th archive file, where K is ASCII number from the N - decompress the K-th archive file, where K is ASCII number from the
following 6 bytes of commandline; following 6 bytes of commandline;
R - "raw" Deflate data, without descriptors and headers; R - "raw" Deflate data, without descriptors and headers;
q - begin file parsing from offset of K, where K is following dword in q - begin file parsing from offset of K, where K is following dword in
commandline; commandline;
Q - begin file parsing from offset of K, where K is ASCII number from the Q - begin file parsing from offset of K, where K is ASCII number from the
following 6 bytes of commandline. following 6 bytes of commandline.
Commandline example: Commandline example:
cmd_string: cmd_string:
db 'sN000037q' db 'sN000037q'
dd 1465 dd 1465
db '/hd/1/png.zip',0 db '/hd/1/png.zip',0
It means to open the 34th (counting from 0) file of archive /hd/1/png.zip It means to open the 34th (counting from 0) file of archive /hd/1/png.zip
and do not terminate. Archive will be parsed starting at offset 1465. and do not terminate. Archive will be parsed starting at offset 1465.
To-Do list: To-Do list:
1. Support for interlaced PNG, alpha-channels, gamma-correction, background, 1. Support for interlaced PNG, alpha-channels, gamma-correction, background,
Significant bits and a lot of cool parts of that format. Significant bits and a lot of cool parts of that format.
2. Output of archive content through IPC or into a built-in window like SYSTREE 2. Output of archive content through IPC or into a built-in window like SYSTREE
(as we are going to decide with the respected colleagues). (as we are going to decide with the respected colleagues).
3. Searching of archive files by name and wildcards! 3. Searching of archive files by name and wildcards!
4. Unpacking into a file specified. 4. Unpacking into a file specified.
5. Means on saving memory space (now @RCHER gorges 8 Mb!): moving RAM areas, 5. Means on saving memory space (now @RCHER gorges 8 Mb!): moving RAM areas,
blocked file output. To do the last thing it is necessary to test carefully blocked file output. To do the last thing it is necessary to test carefully
the reliability of harddisk I/O, directory creation and file deletion. These the reliability of harddisk I/O, directory creation and file deletion. These
kernel capabilities aren't still documented. kernel capabilities aren't still documented.
6. Archive contents integration into SYSXTREE & MFAR filemanagers. We have to 6. Archive contents integration into SYSXTREE & MFAR filemanagers. We have to
unify the calling format (like a structure in the sysfunc 58). unify the calling format (like a structure in the sysfunc 58).
7. Add comments to source. 7. Add comments to source.
8. Correct bugs to be found 8. Correct bugs to be found
Special thanks to: Special thanks to:
Explanation of algorythm of Deflate format decoder with decoding samples Explanation of algorythm of Deflate format decoder with decoding samples
(evm.narod.ru) (evm.narod.ru)
RFC 1951 DEFLATE Compressed Data Format Specification version 1.3 RFC 1951 DEFLATE Compressed Data Format Specification version 1.3
ZIP File Format Specification version 4.5 by PKWARE Inc. ZIP File Format Specification version 4.5 by PKWARE Inc.
"An Explanation of the Deflate Algorithm" by Antaeus Feldspar "An Explanation of the Deflate Algorithm" by Antaeus Feldspar
RFC 1952 GZIP file format specification version 4.3 RFC 1952 GZIP file format specification version 4.3
TAR Format. Information from File Format List 2.0 by Max Maischein. TAR Format. Information from File Format List 2.0 by Max Maischein.
RFC 1950 ZLIB Compressed Data Format Specification version 3.3 RFC 1950 ZLIB Compressed Data Format Specification version 3.3
PNG (Portable Network Graphics) Specification version 1.0 PNG (Portable Network Graphics) Specification version 1.0
Michael Dipperstein's Huffman Code Page Michael Dipperstein's Huffman Code Page
I expect your remarks and suggestions on the @RCHER's topic, "Coding" section I expect your remarks and suggestions on the @RCHER's topic, "Coding" section
at meos.sysbin.com forum. at meos.sysbin.com forum.
See you later! See you later!
**************************************** ****************************************
**************************************** ****************************************
@RCHER „‹Ÿ MENUET v1.0 14 ¨î«ï 2005 £. @RCHER „‹Ÿ MENUET v1.0 14 ¨î«ï 2005 £.
<20> ¯¨á ­  ­  ç¨á⮬  áᥬ¡«¥à¥ ˆ¢ã誨­ë¬ €­¤à¥¥¬ (Willow) <20> ¯¨á ­  ­  ç¨á⮬  áᥬ¡«¥à¥ ˆ¢ã誨­ë¬ €­¤à¥¥¬ (Willow)
Deflate à á¯ ª®¢é¨ª Deflate à á¯ ª®¢é¨ª
Vivat assembler et MenuetOS! Vivat assembler et MenuetOS!
‚ëà ¦ î ¨áªà¥­­îî ¡« £®¤ à­®áâì ¢á¥¬ ⥬, ªâ® ­¥ ¦ «¥ï ᢮¥£® ¢à¥¬¥­¨, ‚ëà ¦ î ¨áªà¥­­îî ¡« £®¤ à­®áâì ¢á¥¬ ⥬, ªâ® ­¥ ¦ «¥ï ᢮¥£® ¢à¥¬¥­¨,
¤¥« ¥â ¯®á¨«ì­ë© ¢ª« ¤ ¢ à §¢¨â¨¥ í⮩ ¬ «¥­ìª®© Ž‘. ‘¥©ç á ¢ ¬®¥¬ ᮡá⢥­­®¬ ¤¥« ¥â ¯®á¨«ì­ë© ¢ª« ¤ ¢ à §¢¨â¨¥ í⮩ ¬ «¥­ìª®© Ž‘. ‘¥©ç á ¢ ¬®¥¬ ᮡá⢥­­®¬
३⨭£¥ 1-¥ ¬¥áâ® § ­¨¬ ¥â ¤¨áâਡã⨢ Mario79 Kolibri4. ‚ᥣ¤  ¯à¨ïâ­® ३⨭£¥ 1-¥ ¬¥áâ® § ­¨¬ ¥â ¤¨áâਡã⨢ Mario79 Kolibri4. ‚ᥣ¤  ¯à¨ïâ­®
¯®«ì§®¢ âìáï ᮢ६¥­­ë¬ <20>Ž. ’ ª ¤¥à¦ âì! ¯®«ì§®¢ âìáï ᮢ६¥­­ë¬ <20>Ž. ’ ª ¤¥à¦ âì!
@RCHER ¯à¥¤­ §­ ç¥­ ¤«ï ¯à®á¬®âà  ¨ à á¯ ª®¢ª¨ ¤ ­­ëå, ᦠâëå á ¯®¬®éìî ¬¥â®¤  @RCHER ¯à¥¤­ §­ ç¥­ ¤«ï ¯à®á¬®âà  ¨ à á¯ ª®¢ª¨ ¤ ­­ëå, ᦠâëå á ¯®¬®éìî ¬¥â®¤ 
Deflate (¢ª«îç ï áâ â¨ç¥áª¨© ¨ ¤¨­ ¬¨ç¥áª¨© • ä䬠­). „ ­­ë¬ ¬¥â®¤®¬ (å®âï ®­ Deflate (¢ª«îç ï áâ â¨ç¥áª¨© ¨ ¤¨­ ¬¨ç¥áª¨© • ä䬠­). „ ­­ë¬ ¬¥â®¤®¬ (å®âï ®­
㦥 ­¥ ¯à¥â¥­¤ã¥â ­  §¢ ­¨¥ ­ ¨«ãç襣®) ¯®«ì§ãîâáï ä®à¬ âë ä ©«®¢ ZIP 㦥 ­¥ ¯à¥â¥­¤ã¥â ­  §¢ ­¨¥ ­ ¨«ãç襣®) ¯®«ì§ãîâáï ä®à¬ âë ä ©«®¢ ZIP
(ᮢ६¥­­ë¥ ¢¥àᨨ: PKZIP ¤«ï MS-DOS ¬®¦¥â ᮧ¤ ¢ âì  à娢ë á ¤à㣨¬¨, ¬¥­¥¥ (ᮢ६¥­­ë¥ ¢¥àᨨ: PKZIP ¤«ï MS-DOS ¬®¦¥â ᮧ¤ ¢ âì  à娢ë á ¤à㣨¬¨, ¬¥­¥¥
íä䥪⨢­ë¬¨ ¬¥â®¤ ¬¨ ᦠâ¨ï, ª®â®àë¥ @RCHER ­¥ ¯®¤¤¥à¦¨¢ ¥â), GZIP, JAR, íä䥪⨢­ë¬¨ ¬¥â®¤ ¬¨ ᦠâ¨ï, ª®â®àë¥ @RCHER ­¥ ¯®¤¤¥à¦¨¢ ¥â), GZIP, JAR,
ä ©«ë OpenOffice, SFX-ZIP ¯à¨«®¦¥­¨ï ¨ àï¤ ¤à㣨å. Ÿ ­¥ ¬®£ 㤥ঠâìáï ¨ ­¥ ä ©«ë OpenOffice, SFX-ZIP ¯à¨«®¦¥­¨ï ¨ àï¤ ¤à㣨å. Ÿ ­¥ ¬®£ 㤥ঠâìáï ¨ ­¥
ᤥ« âì ¯®¤¤¥à¦ªã ¨§®¡à ¦¥­¨© ¢ ä®à¬ â¥ PNG (¨á¯®«ì§ãîé¨å தá⢥­­ë© ¬¥â®¤ ᤥ« âì ¯®¤¤¥à¦ªã ¨§®¡à ¦¥­¨© ¢ ä®à¬ â¥ PNG (¨á¯®«ì§ãîé¨å தá⢥­­ë© ¬¥â®¤
ᦠâ¨ï) ¨  à娢®¢ TAR ¨ TAR+GZIP. ᦠâ¨ï) ¨  à娢®¢ TAR ¨ TAR+GZIP.
<EFBFBD>ਠ§ ¯ã᪥ ¯à®£à ¬¬ë ¢ «¥¢®¬ ¢¥àå­¥¬ 㣫ã íªà ­  ¯®ï¢«ï¥âáï ¬ «¥­ìª ï ª­®¯ª  <EFBFBD>ਠ§ ¯ã᪥ ¯à®£à ¬¬ë ¢ «¥¢®¬ ¢¥àå­¥¬ 㣫ã íªà ­  ¯®ï¢«ï¥âáï ¬ «¥­ìª ï ª­®¯ª 
á® §­ çª®¬ @. <20>ਠ­ ¦ â¨¨ ­  ­¥¥ ®âªà뢠¥âáï ®ª­® ¢ë¡®à  ä ©«  (SYSXTREE) ¤«ï á® §­ çª®¬ @. <20>ਠ­ ¦ â¨¨ ­  ­¥¥ ®âªà뢠¥âáï ®ª­® ¢ë¡®à  ä ©«  (SYSXTREE) ¤«ï
à á¯ ª®¢ª¨. „¢®©­®© 饫箪 § ªà뢠¥â ¯à¨«®¦¥­¨¥. ˆ­ä®à¬ æ¨®­­ë¥ á®®¡é¥­¨ï à á¯ ª®¢ª¨. „¢®©­®© 饫箪 § ªà뢠¥â ¯à¨«®¦¥­¨¥. ˆ­ä®à¬ æ¨®­­ë¥ á®®¡é¥­¨ï
@RCHER ¢ë¢®¤¨â ­  ¤®áªã ®â« ¤ª¨. …᫨  à娢 ᮤ¥à¦¨â ­¥áª®«ìª® ä ©«®¢, ¯® @RCHER ¢ë¢®¤¨â ­  ¤®áªã ®â« ¤ª¨. …᫨  à娢 ᮤ¥à¦¨â ­¥áª®«ìª® ä ©«®¢, ¯®
㬮«ç ­¨î ¯¥à¢ë© ¨§ ­¨å à á¯ ª®¢ë¢ ¥âáï ­  /HD/1/OUT.TXT (¯®¬¥­ï©â¥ ¯à¨ 㬮«ç ­¨î ¯¥à¢ë© ¨§ ­¨å à á¯ ª®¢ë¢ ¥âáï ­  /HD/1/OUT.TXT (¯®¬¥­ï©â¥ ¯à¨
­¥®¡å®¤¨¬®á⨠ª®­áâ ­âã DUMPFILE ¢ @RCHER.ASM) ¨ ®âªà뢠¥âáï ç¥à¥§ TINYPAD ­¥®¡å®¤¨¬®á⨠ª®­áâ ­âã DUMPFILE ¢ @RCHER.ASM) ¨ ®âªà뢠¥âáï ç¥à¥§ TINYPAD
¨«¨ - ¢ á«ãç ¥ ª à⨭ª¨ PNG - ¢ ®ª­¥ ¢áâ஥­­®£® ¯à®á¬®âà騪 . ¨«¨ - ¢ á«ãç ¥ ª à⨭ª¨ PNG - ¢ ®ª­¥ ¢áâ஥­­®£® ¯à®á¬®âà騪 .
ª®¬ ­¤­®© áâப¥ ¯¥à¥¤ ¨¬¥­¥¬  à娢  ¬®£ãâ ¢ ¯à®¨§¢®«ì­®¬ ¯®à浪¥ 㪠§ë¢ âìáï ª®¬ ­¤­®© áâப¥ ¯¥à¥¤ ¨¬¥­¥¬  à娢  ¬®£ãâ ¢ ¯à®¨§¢®«ì­®¬ ¯®à浪¥ 㪠§ë¢ âìáï
ä« £¨ à á¯ ª®¢ª¨: ä« £¨ à á¯ ª®¢ª¨:
s - ­¥ § ªà뢠âì ¯à®£à ¬¬ã ¯®á«¥ à á¯ ª®¢ª¨; s - ­¥ § ªà뢠âì ¯à®£à ¬¬ã ¯®á«¥ à á¯ ª®¢ª¨;
n - à á¯ ª®¢ âì K-© ä ©«  à娢 , £¤¥ K - á«¥¤ãî騩 dword ¢ ª®¬ ­¤­®© áâப¥; n - à á¯ ª®¢ âì K-© ä ©«  à娢 , £¤¥ K - á«¥¤ãî騩 dword ¢ ª®¬ ­¤­®© áâப¥;
N - à á¯ ª®¢ âì K-© ä ©«  à娢 , £¤¥ K - ASCII ç¨á«® ¨§ á«¥¤ãîé¨å 6 ¡ ©â N - à á¯ ª®¢ âì K-© ä ©«  à娢 , £¤¥ K - ASCII ç¨á«® ¨§ á«¥¤ãîé¨å 6 ¡ ©â
ª®¬ ­¤­®© áâப¨; ª®¬ ­¤­®© áâப¨;
R - "áëàë¥" Deflate-¤ ­­ë¥, ¡¥§ ®¯¨á â¥«¥© ¨ § £®«®¢ª®¢; R - "áëàë¥" Deflate-¤ ­­ë¥, ¡¥§ ®¯¨á â¥«¥© ¨ § £®«®¢ª®¢;
q - ¯à®á¬®âà ä ©«  ­ ç âì ᮠᬥ饭¨ï K, £¤¥ K - á«¥¤ãî騩 dword ¢ ª®¬ ­¤­®© q - ¯à®á¬®âà ä ©«  ­ ç âì ᮠᬥ饭¨ï K, £¤¥ K - á«¥¤ãî騩 dword ¢ ª®¬ ­¤­®©
áâப¥; áâப¥;
Q - ¯à®á¬®âà ä ©«  ­ ç âì ᮠᬥ饭¨ï K, £¤¥ K - ASCII ç¨á«® ¨§ á«¥¤ãîé¨å 6 Q - ¯à®á¬®âà ä ©«  ­ ç âì ᮠᬥ饭¨ï K, £¤¥ K - ASCII ç¨á«® ¨§ á«¥¤ãîé¨å 6
¡ ©â ª®¬ ­¤­®© áâப¨. ¡ ©â ª®¬ ­¤­®© áâப¨.
<EFBFBD>ਬ¥à ª®¬ ­¤­®© áâப¨: <EFBFBD>ਬ¥à ª®¬ ­¤­®© áâப¨:
cmd_string: cmd_string:
db 'sN000037q' db 'sN000037q'
dd 1465 dd 1465
db '/hd/1/png.zip',0 db '/hd/1/png.zip',0
<EFBFBD>â® ®§­ ç ¥â, çâ® á«¥¤ã¥â ®âªàëâì 34-© (áç¨â ï ®â 0) ä ©«  à娢  /hd/1/png.zip <EFBFBD>â® ®§­ ç ¥â, çâ® á«¥¤ã¥â ®âªàëâì 34-© (áç¨â ï ®â 0) ä ©«  à娢  /hd/1/png.zip
¨ ­¥ § ¢¥àè âì à ¡®âã. <20>à®á¬®âà  à娢  ­ ç­¥âáï ᮠᬥ饭¨ï 1465. ¨ ­¥ § ¢¥àè âì à ¡®âã. <20>à®á¬®âà  à娢  ­ ç­¥âáï ᮠᬥ饭¨ï 1465.
—â® ¥é¥ ­ã¦­® ᤥ« âì: —â® ¥é¥ ­ã¦­® ᤥ« âì:
1. <20>®¤¤¥à¦ª  ç¥à¥ááâà®ç­ëå (interlaced) PNG,   â ª¦¥  «ìä -ª ­ «®¢, £ ¬¬ë, 1. <20>®¤¤¥à¦ª  ç¥à¥ááâà®ç­ëå (interlaced) PNG,   â ª¦¥  «ìä -ª ­ «®¢, £ ¬¬ë,
ä®­ , Significant bits ¨ ªãç¨ ¤àã£¨å ¯à¨¬®ç¥ª í⮣® ä®à¬ â . ä®­ , Significant bits ¨ ªãç¨ ¤àã£¨å ¯à¨¬®ç¥ª í⮣® ä®à¬ â .
2. ‚뢮¤ ᮤ¥à¦¨¬®£®  à娢®¢ ç¥à¥§ IPC ¨«¨ ¢® ¢áâ஥­­®¬ ®ª­¥ ­ ¯®¤®¡¨¥ SYSTREE 2. ‚뢮¤ ᮤ¥à¦¨¬®£®  à娢®¢ ç¥à¥§ IPC ¨«¨ ¢® ¢áâ஥­­®¬ ®ª­¥ ­ ¯®¤®¡¨¥ SYSTREE
(íâ® ª ª à¥è¨¬ á 㢠¦ ¥¬ë¬¨ ª®««¥£ ¬¨). (íâ® ª ª à¥è¨¬ á 㢠¦ ¥¬ë¬¨ ª®««¥£ ¬¨).
3. <20>®¨áª ä ©«®¢ ¢  à娢¥ ¯® ¨¬¥­¨ ¨ ¤ ¦¥ ¬ áª¥! 3. <20>®¨áª ä ©«®¢ ¢  à娢¥ ¯® ¨¬¥­¨ ¨ ¤ ¦¥ ¬ áª¥!
4. <20> á¯ ª®¢ª  ¢ 㪠§ ­­ë© ä ©«. 4. <20> á¯ ª®¢ª  ¢ 㪠§ ­­ë© ä ©«.
5. Œ¥à®¯à¨ïâ¨ï ¯® íª®­®¬¨¨ ¯ ¬ï⨠(ᥩç á @RCHER ¦à¥â 8 Œ¡!): ¯¥à¥¬¥é¥­¨¥ 5. Œ¥à®¯à¨ïâ¨ï ¯® íª®­®¬¨¨ ¯ ¬ï⨠(ᥩç á @RCHER ¦à¥â 8 Œ¡!): ¯¥à¥¬¥é¥­¨¥
ãç á⪮¢ ¯ ¬ïâ¨, ¡«®ç­ë© ¢ë¢®¤ ¢ ä ©«. „«ï ¯®á«¥¤­¥£® ­¥®¡å®¤¨¬® âé â¥«ì­® ãç á⪮¢ ¯ ¬ïâ¨, ¡«®ç­ë© ¢ë¢®¤ ¢ ä ©«. „«ï ¯®á«¥¤­¥£® ­¥®¡å®¤¨¬® âé â¥«ì­®
¯à®â¥áâ¨à®¢ âì ­ ¤¥¦­®áâì ¢®®¤ -¢ë¢®¤  ­  †„, ᮧ¤ ­¨ï ª â «®£®¢ ¨ 㤠«¥­¨ï ¯à®â¥áâ¨à®¢ âì ­ ¤¥¦­®áâì ¢®®¤ -¢ë¢®¤  ­  †„, ᮧ¤ ­¨ï ª â «®£®¢ ¨ 㤠«¥­¨ï
ä ©«®¢. <20>®ª  í⨠¢®§¬®¦­®á⨠ï¤à  ­¥ ¤®ªã¬¥­â¨à®¢ ­ë. ä ©«®¢. <20>®ª  í⨠¢®§¬®¦­®á⨠ï¤à  ­¥ ¤®ªã¬¥­â¨à®¢ ­ë.
6. ˆ­â¥£à æ¨ï  à娢­ëå ª â «®£®¢ ¢ ä ©«®¢ë¥ ¬¥­¥¤¦¥àë SYSXTREE, MFAR. 6. ˆ­â¥£à æ¨ï  à娢­ëå ª â «®£®¢ ¢ ä ©«®¢ë¥ ¬¥­¥¤¦¥àë SYSXTREE, MFAR.
<20>®âॡã¥âáï ã­¨ä¨æ¨à®¢ âì ä®à¬ â ¢ë§®¢  (­ ¯®¤®¡¨¥ áâàãªâãàë ¢ 58 ä㭪樨). <20>®âॡã¥âáï ã­¨ä¨æ¨à®¢ âì ä®à¬ â ¢ë§®¢  (­ ¯®¤®¡¨¥ áâàãªâãàë ¢ 58 ä㭪樨).
7. Žâª®¬¬¥­â¨à®¢ âì ª®¤. 7. Žâª®¬¬¥­â¨à®¢ âì ª®¤.
8. ˆá¯à ¢¨âì ¡ £¨, ª®â®àë¥, ­¥á®¬­¥­­®, ­ ©¤ãâáï ;-) 8. ˆá¯à ¢¨âì ¡ £¨, ª®â®àë¥, ­¥á®¬­¥­­®, ­ ©¤ãâáï ;-)
Žá®¡ë¥ ¡« £®¤ à­®áâ¨: Žá®¡ë¥ ¡« £®¤ à­®áâ¨:
Ž¯¨á ­¨¥  «£®à¨â¬  ¤¥ª®¤¥à  ä®à¬ â  Deflate ­  ¯à¨¬¥à å ¤¥ª®¤¨à®¢ ­¨ï Ž¯¨á ­¨¥  «£®à¨â¬  ¤¥ª®¤¥à  ä®à¬ â  Deflate ­  ¯à¨¬¥à å ¤¥ª®¤¨à®¢ ­¨ï
(evm.narod.ru) (evm.narod.ru)
RFC 1951 DEFLATE Compressed Data Format Specification version 1.3 RFC 1951 DEFLATE Compressed Data Format Specification version 1.3
ZIP File Format Specification version 4.5 by PKWARE Inc. ZIP File Format Specification version 4.5 by PKWARE Inc.
"An Explanation of the Deflate Algorithm" by Antaeus Feldspar "An Explanation of the Deflate Algorithm" by Antaeus Feldspar
RFC 1952 GZIP file format specification version 4.3 RFC 1952 GZIP file format specification version 4.3
TAR Format. Information from File Format List 2.0 by Max Maischein. TAR Format. Information from File Format List 2.0 by Max Maischein.
RFC 1950 ZLIB Compressed Data Format Specification version 3.3 RFC 1950 ZLIB Compressed Data Format Specification version 3.3
PNG (Portable Network Graphics) Specification version 1.0 PNG (Portable Network Graphics) Specification version 1.0
Michael Dipperstein's Huffman Code Page Michael Dipperstein's Huffman Code Page
†¤ã ¢ è¨å § ¬¥ç ­¨© ¨ ¯à¥¤«®¦¥­¨© ­  ®¤­®¨¬¥­­®© ¢¥âª¥ à §¤¥«  "Š®¤¨­£" ä®à㬠 †¤ã ¢ è¨å § ¬¥ç ­¨© ¨ ¯à¥¤«®¦¥­¨© ­  ®¤­®¨¬¥­­®© ¢¥âª¥ à §¤¥«  "Š®¤¨­£" ä®à㬠
meos.sysbin.com meos.sysbin.com
„® ­®¢ëå ¢áâà¥ç! „® ­®¢ëå ¢áâà¥ç!

View File

@ -1,439 +1,439 @@
; @RCHER macros and messages ; @RCHER macros and messages
; Written in pure assembler by Ivushkin Andrey aka Willow ; Written in pure assembler by Ivushkin Andrey aka Willow
macro stop macro stop
{ {
if SYS eq win & NO_STOPS eq 0 if SYS eq win & NO_STOPS eq 0
int3 int3
end if end if
} }
macro wait macro wait
{ {
if ~ SYS eq win if ~ SYS eq win
local .nodrw,.ex local .nodrw,.ex
pusha pusha
mcall 10 mcall 10
cmp eax,1 cmp eax,1
jne .nodrw jne .nodrw
call draw_window call draw_window
.nodrw: .nodrw:
mcall 17 mcall 17
.ex: .ex:
popa popa
end if end if
} }
macro rbits dest,cnt macro rbits dest,cnt
{ {
if ~ cnt eq if ~ cnt eq
mov ecx,cnt mov ecx,cnt
end if end if
if dest eq 0 if dest eq 0
xor eax,eax xor eax,eax
else else
mov eax,dest mov eax,dest
end if end if
call read_bits call read_bits
} }
macro rep_err cond_ok, result, msg macro rep_err cond_ok, result, msg
{ {
local .m local .m
j#cond_ok .m j#cond_ok .m
if ~ msg eq if ~ msg eq
Msg msg Msg msg
end if end if
mov edx,result mov edx,result
jmp .err jmp .err
.m: .m:
} }
macro memcpy_esi dest, count,_add macro memcpy_esi dest, count,_add
{ {
push esi push esi
if ~ _add eq if ~ _add eq
add esi,_add add esi,_add
end if end if
mov edi,dest mov edi,dest
mov ecx,count mov ecx,count
rep movsb rep movsb
pop esi pop esi
} }
DebugPrint: DebugPrint:
; in: edx-asciiz string ptr ; in: edx-asciiz string ptr
pusha pusha
if SYS eq win if SYS eq win
mov ecx,255 mov ecx,255
xor eax,eax xor eax,eax
mov edi,edx mov edi,edx
repne scasb repne scasb
sub edi,edx sub edi,edx
dec edi dec edi
invoke WriteConsole,[cons],edx,edi,cparam1,NULL invoke WriteConsole,[cons],edx,edi,cparam1,NULL
else else
call debug_outstr call debug_outstr
end if end if
popa popa
ret ret
macro DebugPrintDec macro DebugPrintDec
{ {
if SYS eq win if SYS eq win
call int2str call int2str
mov edx,os_work mov edx,os_work
call DebugPrint call DebugPrint
else else
call debug_outdec call debug_outdec
end if end if
} }
macro Newline macro Newline
{ {
if SYS eq win if SYS eq win
pusha pusha
invoke WriteConsole,[cons],cr_lf,2,cparam1,NULL invoke WriteConsole,[cons],cr_lf,2,cparam1,NULL
popa popa
else else
newline newline
end if end if
} }
Msgcall: Msgcall:
; edx - msg number ; edx - msg number
pusha pusha
movzx edx,word[strs+edx*2] movzx edx,word[strs+edx*2]
add edx,msgs add edx,msgs
call DebugPrint call DebugPrint
popa popa
ret ret
macro Msg num macro Msg num
{ {
if ~ num eq edx if ~ num eq edx
mov edx,num mov edx,num
end if end if
call Msgcall call Msgcall
} }
MSG_COUNT=0 MSG_COUNT=0
macro str_table [str] macro str_table [str]
{ {
forward forward
local label local label
dw label-msgs dw label-msgs
common common
msgs: msgs:
forward forward
label db str,0 label db str,0
MSG_COUNT=MSG_COUNT+1 MSG_COUNT=MSG_COUNT+1
} }
strs: strs:
if language eq ru if language eq ru
str_table \ str_table \
<'*** @RCHER - Deflate Unpacker ***',13,10>,\ ;0 <'*** @RCHER - Deflate Unpacker ***',13,10>,\ ;0
<'*** Copyright Wiland Inc., 2005 ***',13,10>,\ ;1 <'*** Copyright Wiland Inc., 2005 ***',13,10>,\ ;1
'” ©«®¢ ¢  à娢¥: ',\ ;2 '” ©«®¢ ¢  à娢¥: ',\ ;2
<'End of Directory ¤®á⨣­ãâ',13,10>,\ ;3 <'End of Directory ¤®á⨣­ãâ',13,10>,\ ;3
'<27>¥â ä ©«  á â ª¨¬ ­®¬¥à®¬',\ ;4 '<27>¥â ä ©«  á â ª¨¬ ­®¬¥à®¬',\ ;4
<'FindByNumber ŽŠ',13,10>,\ ;5 <'FindByNumber ŽŠ',13,10>,\ ;5
<'<27>¥¢¥à­ë© ID ¡«®ª  • ä䬠­ ',13,10>,\ ;6 <'<27>¥¢¥à­ë© ID ¡«®ª  • ä䬠­ ',13,10>,\ ;6
<'Žè¨¡ª  ¢ ª®¤ å • ä䬠­ !',13,10>,\ ;7 <'Žè¨¡ª  ¢ ª®¤ å • ä䬠­ !',13,10>,\ ;7
<13,10,'<27> áç¥â â ¡«¨æë CRC32',13,10>,\ ;8 <13,10,'<27> áç¥â â ¡«¨æë CRC32',13,10>,\ ;8
'.',\ ;9 '.',\ ;9
'Adler32',\ ;10 'Adler32',\ ;10
'CRC32',\ ;11 'CRC32',\ ;11
<'‡ ¢¥à襭®.',13,10>,\ ;12 <'‡ ¢¥à襭®.',13,10>,\ ;12
<'” ©« ¨¬¥¥â ­ã«¥¢ãî ¤«¨­ã, à á¯ ª®¢ª  ®â¬¥­¥­ .',13,10>,\ ;13 <'” ©« ¨¬¥¥â ­ã«¥¢ãî ¤«¨­ã, à á¯ ª®¢ª  ®â¬¥­¥­ .',13,10>,\ ;13
<'‘âà ­­ ï ¤«¨­  ä ©« -¨áâ®ç­¨ª . Žè¨¡ª  ¢ ¨¬¥­¨? Žâ¬¥­ .',13,10>,\ ;14 <'‘âà ­­ ï ¤«¨­  ä ©« -¨áâ®ç­¨ª . Žè¨¡ª  ¢ ¨¬¥­¨? Žâ¬¥­ .',13,10>,\ ;14
<'<27>¥ GZIP  à娢',13,10>,\ ;15 <'<27>¥ GZIP  à娢',13,10>,\ ;15
<'‘«¨èª®¬ ¡®«ì让 à §¬¥à ¢ë室­®£® ä ©« ',13,10>,\ ;16 <'‘«¨èª®¬ ¡®«ì让 à §¬¥à ¢ë室­®£® ä ©« ',13,10>,\ ;16
<"Žè¨¡ª  ¯à¨ à á¯ ª®¢ª¥.",13,10>,\ ; 17 <"Žè¨¡ª  ¯à¨ à á¯ ª®¢ª¥.",13,10>,\ ; 17
<'<27>¥ à¨áã­®ª PNG',13,10>,\ ; 18 <'<27>¥ à¨áã­®ª PNG',13,10>,\ ; 18
<13,10,'*¤'>,\ ;19 <13,10,'*¤'>,\ ;19
<13,10,'*á'>,\ ;20 <13,10,'*á'>,\ ;20
'<27>¥®¦¨¤ ­­ë© ª®­¥æ ¡«®ª®¢ IDAT',\ ;21 '<27>¥®¦¨¤ ­­ë© ª®­¥æ ¡«®ª®¢ IDAT',\ ;21
'„¥ä¨«ìâà æ¨ï:',\ ;22 '„¥ä¨«ìâà æ¨ï:',\ ;22
'”¨«ìâàë: None ',\ ;23 '”¨«ìâàë: None ',\ ;23
' Sub ',\ ;24 ' Sub ',\ ;24
' Up ',\ ;25 ' Up ',\ ;25
' Avg ',\ ;26 ' Avg ',\ ;26
' Paeth ',\ ;27 ' Paeth ',\ ;27
' Žè¨¡®ª: ',\ ;28 ' Žè¨¡®ª: ',\ ;28
<'—¥à¥ááâà®ç­ë© PNG',13,10>,\ ;29 <'—¥à¥ááâà®ç­ë© PNG',13,10>,\ ;29
<'<27>«®ª ¡¥§ ᦠâ¨ï',13,10>,\ ;30 <'<27>«®ª ¡¥§ ᦠâ¨ï',13,10>,\ ;30
<'’¨¯ æ¢¥â  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï',13,10>,\ ;31 <'’¨¯ æ¢¥â  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï',13,10>,\ ;31
<'‚¢¥¤¨â¥ ¯ à®«ì ¤«ï § è¨ä஢ ­­®£® ä ©« :',13,10>,\ ;32 <'‚¢¥¤¨â¥ ¯ à®«ì ¤«ï § è¨ä஢ ­­®£® ä ©« :',13,10>,\ ;32
<'<27>®¨áª ä ©« ...',13,10>,\ ;33 <'<27>®¨áª ä ©« ...',13,10>,\ ;33
'<27>¥ ¬®¤ã«ì SFX',\ ;34 '<27>¥ ¬®¤ã«ì SFX',\ ;34
' ­¥¢¥à­ ! ',\ ;35 ' ­¥¢¥à­ ! ',\ ;35
' OK: ',\ ;36 ' OK: ',\ ;36
<'‡ ¯¨áì OUT.TXT',13,10>,\ ;37 <'‡ ¯¨áì OUT.TXT',13,10>,\ ;37
' ',\ ;38 ' ',\ ;38
<'<27>®¤£®â®¢ª  ¨§®¡à ¦¥­¨ï...',13,10>,\ ;39 <'<27>®¤£®â®¢ª  ¨§®¡à ¦¥­¨ï...',13,10>,\ ;39
<'“ª ¦¨â¥ "R" ¤«ï ®¡à ¡®âª¨ áëàëå ¤ ­­ëå. Žâ¬¥­ .',13,10>,\ ;40 <'“ª ¦¨â¥ "R" ¤«ï ®¡à ¡®âª¨ áëàëå ¤ ­­ëå. Žâ¬¥­ .',13,10>,\ ;40
<'<27>¥ 墠⠥⠯ ¬ïâ¨! Žâ¬¥­ .',13,10>,\ ; 41 <'<27>¥ 墠⠥⠯ ¬ïâ¨! Žâ¬¥­ .',13,10>,\ ; 41
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' <- ­¥¨§¢¥áâ­ë© ¬¥â®¤ ᦠâ¨ï',\ ;50 ' <- ­¥¨§¢¥áâ­ë© ¬¥â®¤ ᦠâ¨ï',\ ;50
' <- § è¨ä஢ ­',\ ;51 ' <- § è¨ä஢ ­',\ ;51
<'<27>¥ ZIP  à娢',13,10> ; 52 <'<27>¥ ZIP  à娢',13,10> ; 52
else else
str_table \ str_table \
<'*** @RCHER - Deflate Unpacker ***',13,10>,\ ;0 <'*** @RCHER - Deflate Unpacker ***',13,10>,\ ;0
<'*** Copyright Wiland Inc., 2005 ***',13,10>,\ ;1 <'*** Copyright Wiland Inc., 2005 ***',13,10>,\ ;1
'Files in archive: ',\ ;2 'Files in archive: ',\ ;2
<'End of Directory reached',13,10>,\ ;3 <'End of Directory reached',13,10>,\ ;3
'No file has this number',\ ;4 'No file has this number',\ ;4
<'FindByNumber succeded',13,10>,\ ;5 <'FindByNumber succeded',13,10>,\ ;5
<'Invalid Huffman block ID',13,10>,\ ;6 <'Invalid Huffman block ID',13,10>,\ ;6
<'Error while getting Huffman codes!',13,10>,\ ;7 <'Error while getting Huffman codes!',13,10>,\ ;7
<13,10,'Rebuilding CRC32 table',13,10>,\ ;8 <13,10,'Rebuilding CRC32 table',13,10>,\ ;8
'.',\ ;9 '.',\ ;9
'Adler32',\ ;10 'Adler32',\ ;10
'CRC32',\ ;11 'CRC32',\ ;11
<'Job finished.',13,10>,\ ;12 <'Job finished.',13,10>,\ ;12
<'File of zero length, unpacking aborted.',13,10>,\ ;13 <'File of zero length, unpacking aborted.',13,10>,\ ;13
<'Source file has strange length, may be missing? Abort.',13,10>,\ ;14 <'Source file has strange length, may be missing? Abort.',13,10>,\ ;14
<'Not a GZIP archive',13,10>,\ ;15 <'Not a GZIP archive',13,10>,\ ;15
<'Destination file is too large for now',13,10>,\ ;16 <'Destination file is too large for now',13,10>,\ ;16
<"Can't unpack content.",13,10>,\ ; 17 <"Can't unpack content.",13,10>,\ ; 17
<'Not a PNG image',13,10>,\ ; 18 <'Not a PNG image',13,10>,\ ; 18
<13,10,'*d'>,\ ;19 <13,10,'*d'>,\ ;19
<13,10,'*s'>,\ ;20 <13,10,'*s'>,\ ;20
'Unexpected end of IDAT chunks',\ ;21 'Unexpected end of IDAT chunks',\ ;21
'Unfiltering:',\ ;22 'Unfiltering:',\ ;22
'Filters: None ',\ ;23 'Filters: None ',\ ;23
' Sub ',\ ;24 ' Sub ',\ ;24
' Up ',\ ;25 ' Up ',\ ;25
' Avg ',\ ;26 ' Avg ',\ ;26
' Paeth ',\ ;27 ' Paeth ',\ ;27
' Invalid ',\ ;28 ' Invalid ',\ ;28
<'Interlaced PNG',13,10>,\ ;29 <'Interlaced PNG',13,10>,\ ;29
<'Stored block',13,10>,\ ;30 <'Stored block',13,10>,\ ;30
<'Color type not supported',13,10>,\ ;31 <'Color type not supported',13,10>,\ ;31
<'Enter password for encrypted file:',13,10>,\ ;32 <'Enter password for encrypted file:',13,10>,\ ;32
<'Searching for file...',13,10>,\ ;33 <'Searching for file...',13,10>,\ ;33
'Not a SFX module',\ ;34 'Not a SFX module',\ ;34
' error! ',\ ;35 ' error! ',\ ;35
' OK: ',\ ;36 ' OK: ',\ ;36
<'Creating OUT.TXT',13,10>,\ ;37 <'Creating OUT.TXT',13,10>,\ ;37
' ',\ ;38 ' ',\ ;38
<'Preparing bitmap...',13,10>,\ ;39 <'Preparing bitmap...',13,10>,\ ;39
<'Specify "R" to force raw data. Abort.',13,10>,\ ;40 <'Specify "R" to force raw data. Abort.',13,10>,\ ;40
<'Not enough memory! Abort.',13,10>,\ ; <'Not enough memory! Abort.',13,10>,\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' ',\ ; ' ',\ ;
' <- unknown compression method',\ ;50 ' <- unknown compression method',\ ;50
' <- encrypted',\ ;51 ' <- encrypted',\ ;51
<'Not a ZIP archive',13,10> ; 52 <'Not a ZIP archive',13,10> ; 52
end if end if
macro opendialog redproc,openoff,erroff,path macro opendialog redproc,openoff,erroff,path
{ {
local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc local new_d, get_loops, dlg_pid_get, DLGPID, num_of_proc
local run_fileinfo, param local run_fileinfo, param
local getmesloop, loox, mred, mkey, mbutton, mgetmes local getmesloop, loox, mred, mkey, mbutton, mgetmes
local dlg_is_work, ready local dlg_is_work, ready
; ;
; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec, ; STEP 1 Run SYSXTREE with parametrs MYPID 4 bytes in dec,
; 1 byte space, 1 byte type of dialog (O - Open ,S - Save) ; 1 byte space, 1 byte type of dialog (O - Open ,S - Save)
; ;
cld cld
;; mov esi,path ;; mov esi,path
mov edi,path mov edi,path
xor eax,eax xor eax,eax
mov ecx,(1024+16)/4 mov ecx,(1024+16)/4
rep stosd rep stosd
;mov [get_loops],0 ;mov [get_loops],0
mov [dlg_pid_get],0 mov [dlg_pid_get],0
; Get my PID in dec format 4 bytes ; Get my PID in dec format 4 bytes
mcall 9,os_work,-1 mcall 9,os_work,-1
; convert eax bin to param dec ; convert eax bin to param dec
mov eax,dword [os_work+30] ;offset of myPID mov eax,dword [os_work+30] ;offset of myPID
mov edi,param+4-1 ;offset to 4 bytes mov edi,param+4-1 ;offset to 4 bytes
mov ecx,4 mov ecx,4
mov ebx,10 mov ebx,10
cld cld
new_d: new_d:
xor edx,edx xor edx,edx
div ebx div ebx
add dl,'0' add dl,'0'
mov [edi],dl mov [edi],dl
dec edi dec edi
loop new_d loop new_d
; write 1 byte space to param ; write 1 byte space to param
mov [param+4],byte 32 ;Space for next parametr mov [param+4],byte 32 ;Space for next parametr
; and 1 byte type of dialog to param ; and 1 byte type of dialog to param
mov [param+5],byte 'O' ;Get Open dialog (Use 'S' for Save dialog) mov [param+5],byte 'O' ;Get Open dialog (Use 'S' for Save dialog)
; ;
; STEP2 prepare IPC area for get messages ; STEP2 prepare IPC area for get messages
; ;
; prepare IPC area ; prepare IPC area
mov [path],dword 0 mov [path],dword 0
mov [path+4],dword 8 mov [path+4],dword 8
; define IPC memory ; define IPC memory
mov eax,60 mov eax,60
mov ebx,1 ; define IPC mov ebx,1 ; define IPC
mov ecx,path ; offset of area mov ecx,path ; offset of area
mov edx,1024+16 ; size mov edx,1024+16 ; size
mcall mcall
mcall 40,1000111b mcall 40,1000111b
; ;
; STEP 3 run SYSTEM XTREE with parameters ; STEP 3 run SYSTEM XTREE with parameters
; ;
mcall 70,run_fileinfo mcall 70,run_fileinfo
call redproc call redproc
mov [get_loops],0 mov [get_loops],0
getmesloop: getmesloop:
mov eax,23 mov eax,23
mov ebx,50 ;0.5 sec mov ebx,50 ;0.5 sec
mcall mcall
dec eax dec eax
jz mred jz mred
dec eax dec eax
jz mkey jz mkey
dec eax dec eax
jz mbutton jz mbutton
cmp al, 7-3 cmp al, 7-3
jz mgetmes jz mgetmes
; Get number of procces ; Get number of procces
mcall 9,os_work,-1 mcall 9,os_work,-1
mov ebp,eax mov ebp,eax
loox: loox:
mcall 9,os_work,ebp mcall 9,os_work,ebp
mov eax,[DLGPID] mov eax,[DLGPID]
cmp dword[os_work+30],eax ;IF Dialog find cmp dword[os_work+30],eax ;IF Dialog find
je dlg_is_work ;jmp to dlg_is_work je dlg_is_work ;jmp to dlg_is_work
dec ebp dec ebp
jnz loox jnz loox
jmp erroff jmp erroff
dlg_is_work: dlg_is_work:
cmp word[os_work+50],word 9 ;If slot state 9 - dialog is terminated cmp word[os_work+50],word 9 ;If slot state 9 - dialog is terminated
je erroff ;TESTODP2 terminated too je erroff ;TESTODP2 terminated too
cmp [dlg_pid_get],dword 1 cmp [dlg_pid_get],dword 1
je getmesloop je getmesloop
inc [get_loops] inc [get_loops]
cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated cmp [get_loops],4 ;2 sec if DLG_PID not get, TESTOP2 terminated
jae erroff jae erroff
jmp getmesloop jmp getmesloop
mred: mred:
call redproc call redproc
jmp getmesloop jmp getmesloop
mkey: mkey:
mcall 2 ; read (eax=2) mcall 2 ; read (eax=2)
jmp getmesloop jmp getmesloop
mbutton: mbutton:
mov eax,17 ; get id mov eax,17 ; get id
mcall mcall
cmp ah,1 ; button id=1 ? cmp ah,1 ; button id=1 ?
jne getmesloop jne getmesloop
mov eax,-1 ; close this program mov eax,-1 ; close this program
mcall mcall
mgetmes: mgetmes:
; If dlg_pid_get then second message get jmp to still ; If dlg_pid_get then second message get jmp to still
cmp [dlg_pid_get],dword 1 cmp [dlg_pid_get],dword 1
je ready je ready
; First message is number of PID SYSXTREE dialog ; First message is number of PID SYSXTREE dialog
; convert PID dec to PID bin ; convert PID dec to PID bin
movzx eax,byte [path+16] movzx eax,byte [path+16]
sub eax,48 sub eax,48
imul eax,10 imul eax,10
movzx ebx,byte [path+16+1] movzx ebx,byte [path+16+1]
add eax,ebx add eax,ebx
sub eax,48 sub eax,48
imul eax,10 imul eax,10
movzx ebx,byte [path+16+2] movzx ebx,byte [path+16+2]
add eax,ebx add eax,ebx
sub eax,48 sub eax,48
imul eax,10 imul eax,10
movzx ebx,byte [path+16+3] movzx ebx,byte [path+16+3]
add eax,ebx add eax,ebx
sub eax,48 sub eax,48
mov [DLGPID],eax mov [DLGPID],eax
; Claear and prepare IPC area for next message ; Claear and prepare IPC area for next message
mov [path],dword 0 mov [path],dword 0
mov [path+4],dword 8 mov [path+4],dword 8
mov [path+8],dword 0 mov [path+8],dword 0
mov [path+12],dword 0 mov [path+12],dword 0
mov [path+16],dword 0 mov [path+16],dword 0
; Set dlg_pid_get for get next message ; Set dlg_pid_get for get next message
mov [dlg_pid_get],dword 1 mov [dlg_pid_get],dword 1
call redproc ;show DLG_PID call redproc ;show DLG_PID
jmp getmesloop jmp getmesloop
ready: ready:
; ;
; The second message get ; The second message get
; Second message is 1024 bytes path to SAVE/OPEN file ; Second message is 1024 bytes path to SAVE/OPEN file
; shl path string on 16 bytes ; shl path string on 16 bytes
; ;
cld cld
mov esi,path+16 mov esi,path+16
mov edi,path mov edi,path
mov ecx,1024/4 mov ecx,1024/4
rep movsd rep movsd
mov [edi],byte 0 mov [edi],byte 0
jmp openoff jmp openoff
; DATA AREA ; DATA AREA
get_loops dd 0 get_loops dd 0
dlg_pid_get dd 0 dlg_pid_get dd 0
DLGPID dd 0 DLGPID dd 0
param: param:
dd 0 ; My dec PID dd 0 ; My dec PID
dd 0,0 ; Type of dialog dd 0,0 ; Type of dialog
run_fileinfo: run_fileinfo:
dd 7 dd 7
dd 0 dd 0
dd param dd param
dd 0 dd 0
dd 0 dd 0
;run_filepath ;run_filepath
db '/sys/SYSXTREE',0 db '/sys/SYSXTREE',0
} }

View File

@ -1,182 +1,182 @@
; @RCHER data area ; @RCHER data area
; Written in pure assembler by Ivushkin Andrey aka Willow ; Written in pure assembler by Ivushkin Andrey aka Willow
if SYS eq win if SYS eq win
dumpfile: dumpfile:
db 'D:\Ivushkin\projects\zip\output.dmp',0 db 'D:\Ivushkin\projects\zip\output.dmp',0
dumpf_len=$-dumpfile dumpf_len=$-dumpfile
end if end if
outfile: outfile:
if SYS eq win if SYS eq win
db 'D:\Ivushkin\projects\zip\output.raw',0 db 'D:\Ivushkin\projects\zip\output.raw',0
end if end if
dd 2 dd 2
dd 0 dd 0
dd 0 dd 0
.size dd 0 .size dd 0
.out dd output .out dd output
if ~SYS eq win if ~SYS eq win
dumpfile: dumpfile:
db DUMPFILE,0 db DUMPFILE,0
dumpf_len=$-dumpfile dumpf_len=$-dumpfile
end if end if
attrinfo: attrinfo:
dd 5 dd 5
dd 0 dd 0
dd 0 dd 0
dd 0 dd 0
dd fileattr dd fileattr
db 0 db 0
dd filename dd filename
Finfo: Finfo:
dd 0 dd 0
.block dd 0 .block dd 0
dd 0 dd 0
.count dd BUFSIZE*1024 .count dd BUFSIZE*1024
.ptr dd BUFPTR .ptr dd BUFPTR
filename: filename:
if SYS eq win if SYS eq win
db 'png\absolut0.png',0 db 'png\absolut0.png',0
;db 'fasm-1.54.tgz',0 ;db 'fasm-1.54.tgz',0
;include 'testsu~1.inc' ;include 'testsu~1.inc'
; db 'pngsuite\pngsuite.tar.gz',0 ; OK ; db 'pngsuite\pngsuite.tar.gz',0 ; OK
; db 'pngsuite\basn4a08.png',0 ; OK ; db 'pngsuite\basn4a08.png',0 ; OK
; db 'goldhill.png',0 ; beeping ; db 'goldhill.png',0 ; beeping
; db 'arl_logo.png',0 ; wrong out ; db 'arl_logo.png',0 ; wrong out
; db 'tech.png',0 ; wrong out ; db 'tech.png',0 ; wrong out
; db 'png\lena0000.png',0 ; db 'png\lena0000.png',0
; db 'arcs\' ; db 'arcs\'
; db 'NTOSKRNL.gz' ; db 'NTOSKRNL.gz'
; db 'msg_enc.zip' ; db 'msg_enc.zip'
;db 'msgplain.zip' ;db 'msgplain.zip'
; db 'c_866.gz' ; db 'c_866.gz'
; db 'zalman_2.png' ;OK ; db 'zalman_2.png' ;OK
; db 'arcs\headerbar.png',0 ;OK ; db 'arcs\headerbar.png',0 ;OK
; db 'fonts1.png' ;OK ; db 'fonts1.png' ;OK
; db 'fonts.png' ; ; db 'fonts.png' ;
; db 'skin.png' ;OK ; db 'skin.png' ;OK
; db 'JavaPowered8.png'; OK ; db 'JavaPowered8.png'; OK
; db 'opr008S8.png' ; db 'opr008S8.png'
; db 'goldhill.png' ; db 'goldhill.png'
; db 'k3b.png',0 ; db 'k3b.png',0
; db 'image0051.png' ; db 'image0051.png'
; db 'window-elements.png',0 ; db 'window-elements.png',0
; db 'WWW.zip',0 ; db 'WWW.zip',0
; db 'png.zip',0 ; db 'png.zip',0
; db 'zlib09.zip',0 ; db 'zlib09.zip',0
else else
if ~ FNAME eq if ~ FNAME eq
db FNAME db FNAME
end if end if
; db '/hd/1/zip/png.zip',0 ; db '/hd/1/zip/png.zip',0
; db '/hd/1/zip/files/opossum.png' ; db '/hd/1/zip/files/opossum.png'
; db '/rd/1/www.zip',0 ; db '/rd/1/www.zip',0
; db '/hd/1/zip/test2.zip',0 ; db '/hd/1/zip/test2.zip',0
end if end if
db 0 db 0
I_END: I_END:
rb 1024+16-($-filename) rb 1024+16-($-filename)
if SYS eq win if SYS eq win
cr_lf db 0xa,0xd cr_lf db 0xa,0xd
hnd dd ? hnd dd ?
cons dd ? cons dd ?
cons_in dd ? cons_in dd ?
cparam1 dd ? cparam1 dd ?
cparam2 dd ? cparam2 dd ?
end if end if
DKeys rd 3 DKeys rd 3
Dheader rb 12 Dheader rb 12
Dpassword rb PASSW_LEN Dpassword rb PASSW_LEN
if ~SYS eq win if ~SYS eq win
fileattr rd 40/4 fileattr rd 40/4
end if end if
png_ dd ? png_ dd ?
fat_ dd ? fat_ dd ?
fat_fnum dd ? fat_fnum dd ?
lpath dd ? lpath dd ?
lpath_len dd ? lpath_len dd ?
png_bpp dd ? png_bpp dd ?
sline_len dd ? sline_len dd ?
IDATcount dd ? IDATcount dd ?
IDATsize dd ? IDATsize dd ?
PNG_info: PNG_info:
.Width dd ? .Width dd ?
.Height dd ? .Height dd ?
.Bit_depth db ? .Bit_depth db ?
.Color_type db ? .Color_type db ?
.Compression_method db ? .Compression_method db ?
.Filter_method db ? .Filter_method db ?
.Interlace_method db ? .Interlace_method db ?
.Palette rb 3*256 .Palette rb 3*256
gpbf dw ? gpbf dw ?
file_count dd ? file_count dd ?
filters rd 6 filters rd 6
arc_base dd ? arc_base dd ?
outp dd ? outp dd ?
unp_size dd ? unp_size dd ?
CRC_check dd ? CRC_check dd ?
_CRC32_ dd ? _CRC32_ dd ?
CRC32table rd 256 CRC32table rd 256
Adler32 dd ? Adler32 dd ?
child dd ? child dd ?
clientPID dd ? clientPID dd ?
filesize dd ? filesize dd ?
bits db ? bits db ?
cur_byte dd ? cur_byte dd ?
lastblk db ? lastblk db ?
Flags dd ? Flags dd ?
tblCount dw ? tblCount dw ?
tblLen dw ? tblLen dw ?
hclen db ? hclen db ?
max_len dw ? max_len dw ?
align 4 align 4
fat: fat:
rb 4096;512 rb 4096;512
child_stack: child_stack:
rb 1024 rb 1024
child_stack_top: child_stack_top:
main_stack: main_stack:
rb 1024 rb 1024
main_stack_top: main_stack_top:
area: area:
rb INBUF rb INBUF
os_work rb 4*1024 os_work rb 4*1024
bl_count rb BITS bl_count rb BITS
next_code rw BITS next_code rw BITS
tmp_clit: tmp_clit:
rw 20 rw 20
calph: calph:
rw 20 rw 20
sorted_clit rw 20 sorted_clit rw 20
seql_c db ? seql_c db ?
seql rb BITS seql rb BITS
seqd_c db ? seqd_c db ?
seqd rb BITS seqd rb BITS
hlit dw ? hlit dw ?
Literal rw 286 Literal rw 286
Lit_c rw 286 Lit_c rw 286
hdist db ? hdist db ?
Distance rw 32 Distance rw 32
Dist_c rw 32 Dist_c rw 32
output: output:
;rb OUTBUF ;rb OUTBUF
;png_image: ;png_image:
if SYS eq win if SYS eq win
rb OUTBUF rb OUTBUF
end if end if

View File

@ -1,357 +1,357 @@
; @RCHER system-dependent and other stuff ; @RCHER system-dependent and other stuff
; Written in pure assembler by Ivushkin Andrey aka Willow ; Written in pure assembler by Ivushkin Andrey aka Willow
OpenFile: OpenFile:
mov [outp],output mov [outp],output
mov esi,area mov esi,area
and [Finfo.block],0 and [Finfo.block],0
if SYS eq win if SYS eq win
invoke CreateFile, filename, GENERIC_READ, FILE_SHARE_READ, NULL, \ invoke CreateFile, filename, GENERIC_READ, FILE_SHARE_READ, NULL, \
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL
inc eax inc eax
test eax,eax test eax,eax
jz .ex jz .ex
dec eax dec eax
mov [hnd],eax mov [hnd],eax
invoke GetFileSize,eax,NULL invoke GetFileSize,eax,NULL
.ex: .ex:
mov ebx,eax mov ebx,eax
mov [filesize],eax mov [filesize],eax
else else
and dword [attrinfo+32], 0 and dword [attrinfo+32], 0
mcall 70,attrinfo mcall 70,attrinfo
mov eax,[attrinfo+32] mov eax,[attrinfo+32]
mov [filesize],ebx mov [filesize],ebx
mcall 70,Finfo mcall 70,Finfo
end if end if
ret ret
ResetFile: ResetFile:
and [file_count],0 and [file_count],0
mov eax,[arc_base] mov eax,[arc_base]
xor ebx,ebx xor ebx,ebx
mov esi,area mov esi,area
call FileSeek call FileSeek
ret ret
FileSeek: FileSeek:
; eax - offset ; eax - offset
; esi - current pointer (in memory!) ; esi - current pointer (in memory!)
; ebx - translation method: 0 - beginning, 1 - current, 2 - end ; ebx - translation method: 0 - beginning, 1 - current, 2 - end
push eax ecx edx push eax ecx edx
sub esi,BUFPTR sub esi,BUFPTR
add esi,[Finfo.block] add esi,[Finfo.block]
cmp ebx,1 cmp ebx,1
je .cur je .cur
jb .begin jb .begin
mov esi,[filesize] mov esi,[filesize]
not eax not eax
.cur: .cur:
add eax,esi add eax,esi
.begin: .begin:
mov esi,BUFPTR mov esi,BUFPTR
mov [Finfo.block],eax mov [Finfo.block],eax
if SYS eq win if SYS eq win
invoke SetFilePointer,[hnd],eax,NULL,FILE_BEGIN invoke SetFilePointer,[hnd],eax,NULL,FILE_BEGIN
invoke ReadFile,[hnd],area,INBUF, os_work, NULL invoke ReadFile,[hnd],area,INBUF, os_work, NULL
; add [byte_count],area ; add [byte_count],area
else else
; pregs ; pregs
; wait ; wait
mov [Finfo.count],BUFSIZE*1024 mov [Finfo.count],BUFSIZE*1024
mcall 70,Finfo mcall 70,Finfo
; mov [byte_count],area+INBUF ; mov [byte_count],area+INBUF
end if end if
pop edx ecx eax pop edx ecx eax
ret ret
macro QueryFile macro QueryFile
{ {
local ex local ex
if SYS eq win if SYS eq win
invoke GetOpenFileName,ofstruc invoke GetOpenFileName,ofstruc
else else
opendialog draw_window,QFok,QFcanc,filename opendialog draw_window,QFok,QFcanc,filename
QFok: QFok:
xor eax,eax xor eax,eax
jmp ex jmp ex
ret ret
QFcanc: QFcanc:
mov eax,1 mov eax,1
end if end if
ex: ex:
} }
RunViewer: RunViewer:
test [Flags],PNG_MODE test [Flags],PNG_MODE
jz .ex jz .ex
if SYS eq win if SYS eq win
mov eax,[PNG_info.Width] mov eax,[PNG_info.Width]
call int2str call int2str
invoke WritePrivateProfileString,ini_sec,ini_rwidth,os_work,ini_file invoke WritePrivateProfileString,ini_sec,ini_rwidth,os_work,ini_file
mov eax,[PNG_info.Height] mov eax,[PNG_info.Height]
call int2str call int2str
invoke WritePrivateProfileString,ini_sec,ini_rheight,os_work,ini_file invoke WritePrivateProfileString,ini_sec,ini_rheight,os_work,ini_file
invoke CreateProcess,NULL,iview_cmd,NULL,NULL,TRUE,\ invoke CreateProcess,NULL,iview_cmd,NULL,NULL,TRUE,\
NORMAL_PRIORITY_CLASS,NULL,NULL,suinfo,pinfo NORMAL_PRIORITY_CLASS,NULL,NULL,suinfo,pinfo
invoke WaitForInputIdle,dword[pinfo],0xFFFFFFFF invoke WaitForInputIdle,dword[pinfo],0xFFFFFFFF
invoke FindWindowEx, NULL,NULL,NULL,rawwnd_txt invoke FindWindowEx, NULL,NULL,NULL,rawwnd_txt
invoke FindWindowEx, eax,NULL,NULL,ok_txt invoke FindWindowEx, eax,NULL,NULL,ok_txt
invoke SendMessage,eax,BM_CLICK,NULL,NULL invoke SendMessage,eax,BM_CLICK,NULL,NULL
else else
test [Flags],THREAD_YES test [Flags],THREAD_YES
jnz .ex jnz .ex
mcall 51,1,thread,child_stack_top;MEMORY mcall 51,1,thread,child_stack_top;MEMORY
mov [child],eax mov [child],eax
end if end if
.ex: .ex:
ret ret
if SYS eq win if SYS eq win
int2str: int2str:
; in: eax - number ; in: eax - number
; out: formatted string -> os_work ; out: formatted string -> os_work
invoke wsprintf,os_work,fmt_str,eax invoke wsprintf,os_work,fmt_str,eax
add esp,12 add esp,12
ret ret
rawwnd_txt db 'Set RAW open parameters',0 rawwnd_txt db 'Set RAW open parameters',0
ok_txt db 'OK',0 ok_txt db 'OK',0
ini_sec db 'RAW',0 ini_sec db 'RAW',0
ini_rwidth db 'RWidth',0 ini_rwidth db 'RWidth',0
ini_rheight db 'RHeight',0 ini_rheight db 'RHeight',0
ini_file db "C:\Program Files\IrfanView\i_view32.ini",0 ini_file db "C:\Program Files\IrfanView\i_view32.ini",0
fmt_str db "%d",0 fmt_str db "%d",0
iview_cmd db '"C:\Program Files\IrfanView\i_view32.exe"' iview_cmd db '"C:\Program Files\IrfanView\i_view32.exe"'
db ' "D:\Ivushkin\projects\zip\output.raw"',0 db ' "D:\Ivushkin\projects\zip\output.raw"',0
filt_str: filt_str:
db 'Pictures (*.png)',0,'*.png',0 db 'Pictures (*.png)',0,'*.png',0
db 'Archives (*.zip;*.*gz)',0,'*.zip;*.*gz',0 db 'Archives (*.zip;*.*gz)',0,'*.zip;*.*gz',0
db 'All files (*.*)',0,'*.*',0,0 db 'All files (*.*)',0,'*.*',0,0
suinfo STARTUPINFO suinfo STARTUPINFO
pinfo PROCESS_INFORMATION pinfo PROCESS_INFORMATION
cpstruc: cpstruc:
ofstruc: ofstruc:
dd ofstruc_end-ofstruc dd ofstruc_end-ofstruc
dd NULL dd NULL
dd NULL dd NULL
dd filt_str dd filt_str
dd NULL dd NULL
dd NULL dd NULL
dd 0 dd 0
dd filename dd filename
dd 256 dd 256
dd NULL dd NULL
dd 0 dd 0
dd NULL dd NULL
dd NULL dd NULL
dd NULL dd NULL
dw NULL dw NULL
dw NULL dw NULL
dd NULL dd NULL
dd NULL dd NULL
dd NULL dd NULL
dd NULL dd NULL
dd NULL dd NULL
dd NULL dd NULL
dd NULL dd NULL
ofstruc_end: ofstruc_end:
else else
mov ebx,-1 mov ebx,-1
mov ecx,ebx mov ecx,ebx
mov edx,[PNG_info.Width] mov edx,[PNG_info.Width]
add edx,10 add edx,10
mov esi,[PNG_info.Width] mov esi,[PNG_info.Width]
add esi,30 add esi,30
mcall 67 mcall 67
mcall 7,outfile,[outfile.size],10 shl 16+15 mcall 7,outfile,[outfile.size],10 shl 16+15
.ext: .ext:
ret ret
MIN_WIDTH equ 300 MIN_WIDTH equ 300
thread: thread:
.red: .red:
mcall 12,1 mcall 12,1
mov ebx,[PNG_info.Width] mov ebx,[PNG_info.Width]
cmp ebx,MIN_WIDTH cmp ebx,MIN_WIDTH
jae .more jae .more
mov ebx,MIN_WIDTH mov ebx,MIN_WIDTH
.more: .more:
add ebx,20 add ebx,20
mov ecx,[PNG_info.Height] mov ecx,[PNG_info.Height]
add ecx,30 add ecx,30
mcall 0,,,0x3808080 mcall 0,,,0x3808080
;mcall 4,<5,7>,0x10f0f0f0,filename,255 ;mcall 4,<5,7>,0x10f0f0f0,filename,255
mcall 71,1,filename,255 ;by Leency mcall 71,1,filename,255 ;by Leency
mov ecx,[PNG_info.Width] mov ecx,[PNG_info.Width]
shl ecx,16 shl ecx,16
add ecx,[PNG_info.Height] add ecx,[PNG_info.Height]
mcall 7,[png_],,10 shl 16+25 mcall 7,[png_],,10 shl 16+25
mcall 12,2 mcall 12,2
.still: .still:
mcall 10 mcall 10
cmp eax,1 cmp eax,1
je .red je .red
cmp eax,2 cmp eax,2
jne .nokey jne .nokey
mcall 2 mcall 2
cmp ah,27 ; Esc - close cmp ah,27 ; Esc - close
je .close je .close
jmp .still jmp .still
.nokey: .nokey:
cmp eax,3 cmp eax,3
jne .still jne .still
.close: .close:
and [child],0 and [child],0
mcall 64,1,MEMINIT mcall 64,1,MEMINIT
mcall -1 mcall -1
KillViewer: KillViewer:
pusha pusha
mov edi,[child] mov edi,[child]
test edi,edi test edi,edi
jz .noth jz .noth
mcall 9,os_work,-1 mcall 9,os_work,-1
mov ecx,eax mov ecx,eax
.fchild: .fchild:
push ecx push ecx
mcall 9,os_work mcall 9,os_work
cmp edi,[ebx+30] cmp edi,[ebx+30]
jne .lp jne .lp
mov ecx,[esp] mov ecx,[esp]
mcall 18,2 mcall 18,2
pop ecx pop ecx
jmp .noth jmp .noth
.lp: .lp:
pop ecx pop ecx
loop .fchild loop .fchild
.noth: .noth:
popa popa
ret ret
macro CmdLine macro CmdLine
{ {
mov esi,PARAM_PTR mov esi,PARAM_PTR
.parse: .parse:
lodsb lodsb
test al,al test al,al
jnz .noend jnz .noend
or [Flags],STAY_MODE or [Flags],STAY_MODE
jmp red jmp red
.noend: .noend:
cmp al,' ' cmp al,' '
je .stay je .stay
cmp al,'/' cmp al,'/'
jne .yespar jne .yespar
dec esi dec esi
mov ecx,255 mov ecx,255
mov edi,filename mov edi,filename
rep movsb rep movsb
jmp again;cmdl jmp again;cmdl
.yespar: .yespar:
cmp al,'N' cmp al,'N'
jne .nonum jne .nonum
call get_6ASCII_num call get_6ASCII_num
.fnum: .fnum:
mov [FileNum],eax mov [FileNum],eax
jmp .parse jmp .parse
.nonum: .nonum:
cmp al,'n' cmp al,'n'
jne .nonum2 jne .nonum2
lodsd lodsd
jmp .fnum jmp .fnum
.nonum2: .nonum2:
cmp al,'s' cmp al,'s'
jne .nostay jne .nostay
.stay: .stay:
or [Flags],STAY_MODE or [Flags],STAY_MODE
jmp .parse jmp .parse
.nostay: .nostay:
cmp al,'i' cmp al,'i'
jne .noclPID jne .noclPID
lodsd lodsd
mov [clientPID],eax mov [clientPID],eax
or [Flags],IPC_MODE or [Flags],IPC_MODE
jmp .parse jmp .parse
.noclPID: .noclPID:
cmp al,'R' cmp al,'R'
jne .noraw jne .noraw
or [Flags],RAW_MODE or [Flags],RAW_MODE
jmp .parse jmp .parse
.noraw: .noraw:
cmp al,'q' cmp al,'q'
jne .noofs jne .noofs
lodsd lodsd
.fofs: .fofs:
mov [arc_base],eax mov [arc_base],eax
jmp .parse jmp .parse
.noofs: .noofs:
cmp al,'Q' cmp al,'Q'
jne .noofs2 jne .noofs2
call get_6ASCII_num call get_6ASCII_num
jmp .fofs jmp .fofs
.noofs2: .noofs2:
cmp al,'L' cmp al,'L'
jne .nolist jne .nolist
or [Flags],LIST_MODE or [Flags],LIST_MODE
.nolist: .nolist:
jmp .parse jmp .parse
get_6ASCII_num: get_6ASCII_num:
; in: esi - str ptr, out: eax - num ; in: esi - str ptr, out: eax - num
xor edx,edx xor edx,edx
mov ebx,10 mov ebx,10
mov ecx,6 mov ecx,6
.lp: .lp:
xor eax,eax xor eax,eax
lodsb lodsb
sub al,'0' sub al,'0'
imul edx,ebx imul edx,ebx
add edx,eax add edx,eax
loop .lp loop .lp
mov eax,edx mov eax,edx
ret ret
} }
StartPad: StartPad:
pusha pusha
mov esi,[outfile.size] mov esi,[outfile.size]
; dpd esi ; dpd esi
; convert number in esi to decimal representation ; convert number in esi to decimal representation
mov ecx, 10 mov ecx, 10
push -'0' push -'0'
mov eax, esi mov eax, esi
@@: @@:
xor edx, edx xor edx, edx
div ecx div ecx
push edx push edx
test eax, eax test eax, eax
jnz @b jnz @b
mov edi, par_fsize mov edi, par_fsize
@@: @@:
pop eax pop eax
add al, '0' add al, '0'
stosb stosb
jnz @b jnz @b
mcall 70,fileinfo mcall 70,fileinfo
mov ecx,eax mov ecx,eax
mcall 5,20 mcall 5,20
mcall 60,2,,[outfile.out];output mcall 60,2,,[outfile.out];output
mcall 64,1,MEMINIT mcall 64,1,MEMINIT
popa popa
ret ret
fileinfo: fileinfo:
dd 7 dd 7
dd 0 dd 0
dd editor_par dd editor_par
dd 0 dd 0
dd 0 dd 0
db '/sys/TINYPAD',0 db '/sys/TINYPAD',0
editor_par db '*' editor_par db '*'
par_fsize rb 11 par_fsize rb 11
end if end if

View File

@ -0,0 +1,5 @@
@erase lang.inc
@echo lang fix en >lang.inc
@fasm gifview.asm gifview
@erase lang.inc
@pause

View File

@ -0,0 +1,5 @@
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm gifview.asm gifview
@erase lang.inc
@pause

View File

@ -0,0 +1,485 @@
; GIF LITE v3.0 by Willow
; Written in pure assembler by Ivushkin Andrey aka Willow
; Modified by Diamond
;
; This include file will contain functions to handle GIF image format
;
; Created: August 15, 2004
; Last changed: June 24, 2007
; Requires kglobals.inc (iglobal/uglobal macro)
; (program must 'include "kglobals.inc"' and say 'IncludeUGlobal'
; somewhere in uninitialized data area).
; Configuration: [changed from program which includes this file]
; 1. The constant COLOR_ORDER: must be one of
; PALETTE - for 8-bit image with palette (sysfunction 65)
; MENUETOS - for MenuetOS and KolibriOS color order (sysfunction 7)
; OTHER - for standard color order
; 2. Define constant GIF_SUPPORT_INTERLACED if you want to support interlaced
; GIFs.
; 3. Single image mode vs multiple image mode:
; if the program defines the variable 'gif_img_count' of type dword
; somewhere, ReadGIF will enter multiple image mode: gif_img_count
; will be initialized with image count, output format is GIF_list,
; the function GetGIFinfo retrieves Nth image info. Otherwise, ReadGIF
; uses single image mode: exit after end of first image, output is
; <dd width,height, times width*height[*3] db image>
if ~ (COLOR_ORDER in <PALETTE,MENUETOS,OTHER>)
; This message may not appear under MenuetOS, so watch...
display 'Please define COLOR_ORDER: PALETTE, MENUETOS or OTHER',13,10
end if
if defined gif_img_count
; virtual structure, used internally
struct GIF_list
NextImg rd 1
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1 ; 0 = not specified
; 1 = do not dispose
; 2 = restore to background color
; 3 = restore to previous
if COLOR_ORDER eq PALETTE
Image rd 1
end if
ends
struct GIF_info
Left rw 1
Top rw 1
Width rw 1
Height rw 1
Delay rd 1
Displacement rd 1
if COLOR_ORDER eq PALETTE
Palette rd 1
end if
ends
; ****************************************
; FUNCTION GetGIFinfo - retrieve Nth image info
; ****************************************
; in:
; esi - pointer to image list header
; ecx - image_index (0...img_count-1)
; edi - pointer to GIF_info structure to be filled
; out:
; eax - pointer to RAW data, or 0, if error
GetGIFinfo:
push esi ecx edi
xor eax,eax
jecxz .eloop
.lp:
mov esi,[esi]
test esi,esi
jz .error
loop .lp
.eloop:
lodsd
movsd
movsd
movsd
movsd
if COLOR_ORDER eq PALETTE
lodsd
mov [edi],esi
else
mov eax,esi
end if
.error:
pop edi ecx esi
ret
end if
_null fix 0x1000
; ****************************************
; FUNCTION ReadGIF - unpacks GIF image
; ****************************************
; in:
; esi - pointer to GIF file in memory
; edi - pointer to output image list
; out:
; eax - 0, all OK;
; eax - 1, invalid signature;
; eax >=8, unsupported image attributes
;
ReadGIF:
push esi edi
mov [.cur_info],edi
xor eax,eax
mov [.globalColor],eax
if defined gif_img_count
mov [gif_img_count],eax
mov [.anim_delay],eax
mov [.anim_disp],eax
end if
inc eax
cmp dword[esi],'GIF8'
jne .ex ; signature
mov ecx,[esi+0xa]
add esi,0xd
mov edi,esi
test cl,cl
jns .nextblock
mov [.globalColor],esi
call .Gif_skipmap
.nextblock:
cmp byte[edi],0x21
jne .noextblock
inc edi
if defined gif_img_count
cmp byte[edi],0xf9 ; Graphic Control Ext
jne .no_gc
movzx eax,word [edi+3]
mov [.anim_delay],eax
mov al,[edi+2]
shr al,2
and eax,7
mov [.anim_disp],eax
add edi,7
jmp .nextblock
.no_gc:
end if
inc edi
.block_skip:
movzx eax,byte[edi]
lea edi,[edi+eax+1]
test eax,eax
jnz .block_skip
jmp .nextblock
.noextblock:
mov al,8
cmp byte[edi],0x2c ; image beginning
jne .ex
if defined gif_img_count
inc [gif_img_count]
end if
inc edi
mov esi,[.cur_info]
if defined gif_img_count
add esi,4
end if
xchg esi,edi
if defined GIF_SUPPORT_INTERLACED
movzx ecx,word[esi+4]
mov [.width],ecx
movzx eax,word[esi+6]
imul eax,ecx
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
mov [.img_end],eax
inc eax
mov [.row_end],eax
and [.pass],0
test byte[esi+8],40h
jz @f
if ~(COLOR_ORDER eq PALETTE)
lea ecx,[ecx*3]
end if
mov [.row_end],ecx
@@:
end if
if defined gif_img_count
movsd
movsd
mov eax,[.anim_delay]
stosd
mov eax,[.anim_disp]
stosd
else
movzx eax,word[esi+4]
stosd
movzx eax,word[esi+6]
stosd
add esi,8
end if
push edi
mov ecx,[esi]
inc esi
test cl,cl
js .uselocal
push [.globalColor]
mov edi,esi
jmp .setPal
.uselocal:
call .Gif_skipmap
push esi
.setPal:
movzx ecx,byte[edi]
inc ecx
mov [.codesize],ecx
dec ecx
if ~(COLOR_ORDER eq PALETTE)
pop [.Palette]
end if
lea esi,[edi+1]
mov edi,.gif_workarea
xor eax,eax
lodsb ; eax - block_count
add eax,esi
mov [.block_ofs],eax
mov [.bit_count],8
mov eax,1
shl eax,cl
mov [.CC],eax
mov ecx,eax
inc eax
mov [.EOI],eax
mov eax, _null shl 16
.filltable:
stosd
inc eax
loop .filltable
if COLOR_ORDER eq PALETTE
pop eax
pop edi
push edi
scasd
push esi
mov esi,eax
mov ecx,[.CC]
@@:
lodsd
dec esi
bswap eax
shr eax,8
stosd
loop @b
pop esi
pop eax
mov [eax],edi
else
pop edi
end if
if defined GIF_SUPPORT_INTERLACED
mov [.img_start],edi
add [.img_end],edi
add [.row_end],edi
end if
.reinit:
mov edx,[.EOI]
inc edx
push [.codesize]
pop [.compsize]
call .Gif_get_sym
cmp eax,[.CC]
je .reinit
call .Gif_output
.cycle:
movzx ebx,ax
call .Gif_get_sym
cmp eax,edx
jae .notintable
cmp eax,[.CC]
je .reinit
cmp eax,[.EOI]
je .end
call .Gif_output
.add:
mov dword [.gif_workarea+edx*4],ebx
cmp edx,0xFFF
jae .cycle
inc edx
bsr ebx,edx
cmp ebx,[.compsize]
jne .noinc
inc [.compsize]
.noinc:
jmp .cycle
.notintable:
push eax
mov eax,ebx
call .Gif_output
push ebx
movzx eax,bx
call .Gif_output
pop ebx eax
jmp .add
.end:
if defined GIF_SUPPORT_INTERLACED
mov edi,[.img_end]
end if
if defined gif_img_count
mov eax,[.cur_info]
mov [eax],edi
mov [.cur_info],edi
add esi,2
xchg esi,edi
.nxt:
cmp byte[edi],0
jnz .continue
inc edi
jmp .nxt
.continue:
cmp byte[edi],0x3b
jne .nextblock
xchg esi,edi
and dword [eax],0
end if
xor eax,eax
.ex:
pop edi esi
ret
.Gif_skipmap:
; in: ecx - image descriptor, esi - pointer to colormap
; out: edi - pointer to area after colormap
and ecx,111b
inc ecx ; color map size
mov ebx,1
shl ebx,cl
lea ebx,[ebx*2+ebx]
lea edi,[esi+ebx]
ret
.Gif_get_sym:
mov ecx,[.compsize]
push ecx
xor eax,eax
.shift:
ror byte[esi],1
rcr eax,1
dec [.bit_count]
jnz .loop1
inc esi
cmp esi,[.block_ofs]
jb .noblock
push eax
xor eax,eax
lodsb
test eax,eax
jnz .nextbl
mov eax,[.EOI]
sub esi,2
add esp,8
jmp .exx
.nextbl:
add eax,esi
mov [.block_ofs],eax
pop eax
.noblock:
mov [.bit_count],8
.loop1:
loop .shift
pop ecx
rol eax,cl
.exx:
xor ecx,ecx
ret
.Gif_output:
push esi eax edx
mov edx,.gif_workarea
.next:
push word[edx+eax*4]
mov ax,word[edx+eax*4+2]
inc ecx
cmp ax,_null
jnz .next
shl ebx,16
mov bx,[esp]
.loop2:
pop ax
if COLOR_ORDER eq PALETTE
stosb
else
lea esi,[eax+eax*2]
add esi,[.Palette]
if COLOR_ORDER eq MENUETOS
mov esi,[esi]
bswap esi
shr esi,8
mov [edi],esi
add edi,3
else
movsb
movsb
movsb
end if
end if
if defined GIF_SUPPORT_INTERLACED
cmp edi,[.row_end]
jb .norowend
mov eax,[.width]
if ~(COLOR_ORDER eq PALETTE)
lea eax,[eax*3]
end if
push eax
sub edi,eax
add eax,eax
cmp [.pass],3
jz @f
add eax,eax
cmp [.pass],2
jz @f
add eax,eax
@@:
add edi,eax
pop eax
cmp edi,[.img_end]
jb .nextrow
mov edi,[.img_start]
inc [.pass]
add edi,eax
cmp [.pass],3
jz @f
add edi,eax
cmp [.pass],2
jz @f
add edi,eax
add edi,eax
@@:
.nextrow:
add eax,edi
mov [.row_end],eax
xor eax,eax
.norowend:
end if
loop .loop2
pop edx eax esi
ret
uglobal
align 4
ReadGIF.globalColor rd 1
ReadGIF.cur_info rd 1 ; image table pointer
ReadGIF.codesize rd 1
ReadGIF.compsize rd 1
ReadGIF.bit_count rd 1
ReadGIF.CC rd 1
ReadGIF.EOI rd 1
if ~(COLOR_ORDER eq PALETTE)
ReadGIF.Palette rd 1
end if
ReadGIF.block_ofs rd 1
if defined GIF_SUPPORT_INTERLACED
ReadGIF.row_end rd 1
ReadGIF.img_end rd 1
ReadGIF.img_start rd 1
ReadGIF.pass rd 1
ReadGIF.width rd 1
end if
if defined gif_img_count
ReadGIF.anim_delay rd 1
ReadGIF.anim_disp rd 1
end if
ReadGIF.gif_workarea rb 16*1024
endg

View File

@ -0,0 +1,293 @@
; GIF VIEWER FOR MENUET v1.0
; Written in pure assembler by Ivushkin Andrey aka Willow
;
; Uses GIF_LITE 2.0
;
; Created: August 31, 2004
; Last changed: August 25, 2006
;
; COMPILE WITH FASM
appname equ 'GIF VIEWER'
; input line dimensions
INP_X equ 5 shl 16+680
INP_Y equ 5 shl 16+16
INP_XY equ 10 shl 16+10
use32
org 0x0
db 'MENUET01'
dd 0x01
dd START
dd I_END
dd 0x400000
dd 0x400000
dd filename ;0x0
dd 0x0
include 'lang.inc'
include '..\..\..\macros.inc' ; decrease code size (optional)
COLOR_ORDER equ PALETTE
GIF_SUPPORT_INTERLACED = 1
include 'gif_lite.inc'
START:
cmp [filename],byte 0
jne openfile2
; jmp openfile2
openfile:
xor eax,eax
mov [entered], eax
mov [gif_img_count],eax
mov esi,fn_input
mov edi,filename
mov ecx,[inp_pos]
rep movsb
stosb
openfile2:
mov ebx,file_info
mov eax,70
mcall
cmp eax,6
je temp
test eax,eax
jnz ok2
temp:
; cmp ebx,64
; jbe ok2
xor eax,eax
mov [entered], eax
mov esi,filename
mov edi,fn_input
mov ecx,256/4 ;[filename_len]
rep movsd
mov edi,fn_input
mov ecx,256
repne scasb
sub edi,fn_input
mov [inp_pos],edi
; test eax,eax
; jnz .ok2
; cmp ebx,64
; jbe .ok2
mov esi,workarea
mov edi,Image
call ReadGIF
test eax,eax
jz .ok
and [gif_img_count], 0
.ok:
ok2:
and dword[img_index],0
mov ebx,3
mov ecx,sc
mov edx,sizeof.system_colors
mov eax,48
mcall
red:
; *********************************************
; ******* Ž<><C5BD>…„…<E280B9>ˆˆ Ž<C5BD>ˆŽŠ€ ŽŠ<C5BD>€ *******
; *********************************************
draw_window:
mov ebx,1
mov eax,12
mcall
xor eax,eax
mov ebx,50*65536+700
mov ecx,50*65536+500
mov edx,[sc.work]
or edx,0x33000000
mov edi,title
mcall
call draw_input
xor ecx,ecx
call draw_subimage
cmp [gif_img_count],1
jz @f
mov ecx,[img_index]
call draw_subimage
@@:
mov ebx,2
mov eax,12
mcall
still:
cmp [gif_img_count], 1
jbe .infinite
mov ebx, [cur_anim_delay]
test ebx, ebx
jz .infinite
mov eax, 23
mcall
jmp @f
.infinite:
mov eax, 10
mcall
@@:
dec eax
jz red
dec eax
jz key
dec eax
jz button
mov eax,[gif_img_count]
cmp eax,1
je still
inc [img_index]
cmp eax,[img_index]
jne redsub
and [img_index],0
redsub:
mov ecx,[img_index]
call draw_subimage
jmp still
key:
mov eax,2
mcall
cmp ah,13
je is_input
jmp still
button:
mcall 17
cmp ah,1
jnz wait_input
_close:
or eax,-1
mcall
is_input: ; simple input line with backspace feature
inc [entered] ; sorry - no cursor
wait_input:
call draw_input
mov eax,10
mcall
cmp al,2
jne still
mov edi,[inp_pos]
; mov eax,2
mcall
shr eax,8
cmp al,27
je still
cmp al,13
je openfile
cmp al,8
je backsp
mov [fn_input+edi],al
inc [inp_pos]
jmp wait_input
backsp:
test edi,edi
jz wait_input
dec [inp_pos]
jmp wait_input
; jmp still
;****************************************
;******* DRAW CONTENTS OF INPUT LINE ****
;****************************************
draw_input:
mov esi,0xe0e0e0
cmp [entered],0
jne highlight
mov esi,0x00aabbcc
highlight:
mov ecx,INP_Y
mov edx,2
mov ebx,INP_X
mov eax,8
mcall
mov ecx,0x00107a30
mov edx,fn_input
mov esi,[inp_pos]
mov ebx,INP_XY
mov eax,4
mcall
ret
draw_subimage:
cmp [gif_img_count],0
jz .enddraw
mov esi,Image
mov edi,gif_inf
call GetGIFinfo
test eax,eax
jz .enddraw
mov ecx, dword [edi+GIF_info.Width-2]
mov cx, [edi+GIF_info.Height]
mov ebx,eax
mov eax, [edi+GIF_info.Delay]
mov [cur_anim_delay],eax
mov edx, dword [edi+GIF_info.Left-2]
mov dx, [edi+GIF_info.Top]
add edx,5 shl 16 +25
mov esi, 8
mov edi, [edi+GIF_info.Palette]
xor ebp, ebp
mov eax, 65
mcall
.enddraw:
ret
; ‡¤¥áì ­ å®¤ïâáï ¤ ­­ë¥ ¯à®£à ¬¬ë:
title db appname,0 ; áâப  § £®«®¢ª 
inp_pos dd inp_end-fn_input
fn_input:
; db '/hd/1/gif/smileys/sm100000.gif'
db '/sys/meos.gif'
; db '/hd/1/1/tex256.gif',0
; db '/rd/1/tex256.gif'
inp_end:
rb 256-(inp_end-fn_input)
file_info:
dd 0
dd 0
dd 0
dd 0x100000;0x200000
dd workarea;0x100000
I_END: ; ª®­¥æ ¯à®£à ¬¬ë
filename:
; db '/hd/1/gif/smileys/sm112000.gif',0
; db '/hd/1/gif/test.gif',0
; db '/hd/1/gif/explode1.gif',0
; db '/hd/1/gif/tapeta.gif',0
; db '/hd/1/gif/meos.gif',0
rb 257
;filename_len dd 0
entered rd 1
sc system_colors
gif_img_count rd 1
cur_anim_delay rd 1
img_index rd 1
gif_inf GIF_info
IncludeUGlobals
workarea rb 0x100000
Image:

View File

@ -0,0 +1,5 @@
@erase lang.inc
@echo lang fix en >lang.inc
@fasm jpegview.asm jpegview
@erase lang.inc
@pause

View File

@ -0,0 +1,6 @@
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm jpegview.asm jpegview
@erase lang.inc
@kpack jpegview
@pause

View File

@ -0,0 +1,77 @@
file_handler:
.operation=0
.position=4
.reserved=8
.n_bytes=12
.bufer=16
.name=20
.st_size=20+1024
open: ;esi=name_string
;retorna eax
pushad
mov ecx,file_handler.st_size
call mallocz
mov [esp+28],edi
push edi
mov ecx,1024
add edi,file_handler.name
call movedata
pop edi
; test if file exists
lea ebx,[edi+file_handler.operation]
mov byte[ebx],5
mov dword[ebx+16],fileattr
mov eax,70
int 0x40
cmp eax,2
jz .virtual
test eax,eax
jnz close.b
@@:
clc
popad
ret
.virtual:
mov byte [fileattr], 0x10
jmp @b
close:
pushad
.b:
mov edi,[esp+28]
call free
popad
xor eax,eax
ret
read: ;(f,bufer,nbytes) eax,edi,ecx ncr
;retorna bytes leidos en ecx
pushad
lea ebx, [eax+file_handler.operation]
mov byte [ebx], 0
mov [ebx+12], ecx
mov [ebx+16], edi
mov eax, 70
int 0x40
cmp ebx, -1
sbb ebx, -1
mov eax, [esp+28]
add [eax+file_handler.position], ebx
mov [esp+24], ebx
popad
ret
ftell: mov edx,[eax+file_handler.position]
ret
lseek: ;eax=file edx=pos
mov [eax+file_handler.position],edx
ret
skip: ;eax=file edx=bytes to skip
add [eax+file_handler.position],edx
ret

View File

@ -0,0 +1,22 @@
modes:
dd mcu100,color100,8,8 ;monocromo
dd mcu111,color111,8,8
dd mcu211,color211,16,8
dd mcu411,color411,16,16
zigzag:
db 0,0, 4+1,0, 32,1, 64,1, 36,2, 8+1,0, 12+1,0, 40,4
db 68,2, 96,1, 128,1, 100,2, 72,4, 44,8, 16+1,0, 20+1,0
db 48,16, 76,8, 104,4, 132,2, 160,1, 192,1, 164,2, 136,4
db 108,8, 80,16, 52,32, 24+1,0, 28+1,0, 56,64, 84,32, 112,16
db 140,8, 168,4, 196,2, 224,1, 228,2, 200,4, 172,8, 144,16
db 116,32, 88,64, 60,128, 92,128, 120,64, 148,32, 176,16, 204,8
db 232,4, 236,8, 208,16, 180,32, 152,64, 124,128, 156,128, 184,64
db 212,32, 240,16, 244,32, 216,64, 188,128, 220,128, 248,64, 252,128
k:
dd 1.41421,1.84776,1.08239,-2.6131
k2:
dd 0.3535534,0.49039264,0.46193953,0.415734806
dd 0.3535534,0.277785116,0.191341716,0.0975451609

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,747 @@
; IMGVIEW.ASM
;
; This program displays jpeg images. The window can be resized.
;
; Version 0.0 END OF 2003
; Octavio Vega
; Version 0.1 7th March 2004
; Mike Hibbett ( very small part! )
; Version 0.11 7th April 2004
; Ville Turjanmaa ( 'set_as_bgr' function )
; Version 0.12 29th May 2004
; Ivan Poddubny (correct "set_as_bgr"+parameters+boot+...)
; Version 0.12 30 de mayo 2004
; Octavio Vega
; bugs correction and slideshow
; version 0.13 3 de junio 2004
; Octavio Vega
; unos retoques
; version 0.14 10th August 2004
; Mike Hibbett Added setting default colours
; version 0.15 24th August 2006
; diamond (rewritten to function 70)
; version 0.16 19th May 2007
; Mario79
; 1) correction for changed function 15,
; 2) use monochrome background if free memory there are less than 2 MB
; 3) use COL0 - COL9 boot parameter
; 0=black,1=white,2=green,3=lilas,4=grey
; 5=light-blue,6=blue,7=salad,8=pink,9=yellow
; version 0.17 17th June 2007
; diamond (background definition now uses shared memory)
; version 0.18 9th August 2007
; Mario79
; Open file with parameter in patch:
; Size of parameter - 4 bytes. Parameter starts with the character "\",
; the unused characters are filled by a blank (ASCII 20h).
; '\T /hd0/1/1.jpg' - set background, mode: tile
; '\S /hd0/1/1.jpg' - set background, mode: stretch
memsize=20000h
org 0
PARAMS = memsize - 1024
appname equ 'Jpegview '
version equ '0.18'
use32
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd memsize ; memory for app
dd memsize - 1024 ; esp
dd PARAMS , 0x0 ; I_Param , I_Icon
stack_size=4096 + 1024
include '..\..\..\macros.inc'
START: ; start of execution
mcall 68,11 ; initialize heap
cmp [PARAMS], byte 0
jne check_parameters
; Calculate the 'free' memory available
; to the application, and create the malloc block from it
.l1:
mov ecx,memsize-fin-stack_size
mov edi,fin
call add_mem
call colorprecalc ;inicializa tablas usadas para pasar de ybr a bgr
call draw_window
call read_string.rs_done
still:
push still
mov ebx,100 ;1 second
mov eax,23 ; wait here for event
mcall
cmp eax,1 ; redraw request ?
je draw_window
cmp eax,2 ; key in buffer ?
je read_string
cmp eax,3 ; button in buffer ?
je button
jmp display_next
button: ; BUTTON
mov eax,17
mcall
cmp ah,3
je set_as_bgr2
cmp ah,2
je slideshow
cmp ah,1 ; CLOSE PROGRAM
jne close_program.exit
close_program:
mov eax,-1
mcall
.exit:
ret
; Put a 'chunk' of the image on the window
put_image:
pushad
lea ebp,[edx+eax+7]
cmp [winxs],bp
jc .l1
lea ebp,[ecx+ebx+20+2+17]
cmp [winys],bp
jc .l1
add eax,2 ; offset for boarder
add ebx,2 ; offset for title bar
push ax ; pox
push bx ; pos
push cx ; size
push dx ; size
pop ecx
pop edx
mov ebx,edi
mov eax,7
mcall ; Put image function
.l1:
popad
ret
;******************************************************************************
check_parameters:
cmp [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler
je boot_set_background
cmp [PARAMS], word "CO"
jne @f
cmp [PARAMS+2], byte "L"
je boot_set_background
@@:
cmp byte [PARAMS], "\"
jne @f
cmp [PARAMS+1], byte "S"
jne .tile
mov [drawing_mode],2
jmp @f
.tile:
cmp [PARAMS+1], byte "T"
jne @f
mov [drawing_mode],1
@@:
cmp byte [PARAMS], 1
jz ipc_service
mov edi, name_string ; clear string with file name
mov al, 0
mov ecx, 100
rep stosb
mov ecx, 100 ; calculate length of parameter string
mov edi, PARAMS
repne scasb
sub edi, PARAMS
mov ecx, edi
mov esi, PARAMS ; copy parameters to file name
mov edi, name_string
cmp byte [PARAMS], "\"
jne @f
add esi,4
sub ecx,4
@@:
cld
rep movsb
cmp byte [PARAMS], "\"
je boot_set_background.1
jmp START.l1 ; return to beggining of the progra
;******************************************************************************
boot_set_background:
mov [drawing_mode],2
.1:
mcall 18,16
cmp eax,1024*2
jb set_mono
mov ecx,memsize-fin-stack_size ; size
mov edi,fin ; pointer
call add_mem ; mark memory from fin to 0x100000-1024 as free
call colorprecalc ; calculate colors
mov esi,name_string
call open
test eax,eax
jz close_program
call jpeg_info
mov dword [jpeg_st],ebp
call set_as_bgr2 ; set wallpaper
jmp close_program ; close the program right now
;******************************************************************************
set_mono:
mov eax, 15
mov ebx, 1
mov ecx, 1
mov edx, 1
mcall
cmp [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler
jne @f
.green:
mov ecx,mono+6
jmp .set
@@:
; cmp [PARAMS], word "CO" ; received BOOT parameter -> goto handler
; jne .green
xor ecx,ecx
mov cl,[PARAMS+3]
sub cl,0x30
cmp ecx,0
jb .green
cmp ecx,9
ja .green
imul ecx,3
add ecx,mono
.set:
mcall 15,5, ,0,3
; Stretch the image to fit
mov eax, 15
mov ebx, 4
mov ecx, 1
mcall
mov eax, 15
mov ebx, 3
mcall
jmp close_program
mono:
db 0,0,0 ; black
db 255,255,255 ; white
db 128,128,0 ; green
db 240,202,166 ; lilas
db 192,192,192 ; grey
db 255,255,0 ; light-blue
db 255,0,0 ; blue
db 192,220,192 ; salad
db 255,0,255 ; pink
db 0,255,255 ; yellow
;******************************************************************************
set_as_bgr2:
mov ebp,dword[jpeg_st]
test ebp,ebp
jz .end
mov eax, 15
mov ebx, 1
mov ecx, [ebp + x_size]
mov edx, [ebp + y_size]
mcall
mov ebx, 6
mcall
test eax, eax
jz .end
mov [ipc_mem_out], eax
mov dword [ebp+draw_ptr],put_chunk_to_mem
call jpeg_display
mov eax, 15
mov ebx, 7
mov ecx, [ipc_mem_out]
mcall
; Stretch the image to fit
mov eax, 15
mov ebx, 4
mov ecx, [drawing_mode] ;2
mcall
mov eax, 15
mov ebx, 3
mcall
.end:
ret
;******************************************************************************
ipc_service:
mov esi, PARAMS+1
xor eax, eax
xor ecx, ecx
@@:
lodsb
test al, al
jz @f
lea ecx, [ecx*5]
lea ecx, [ecx*2+eax-'0']
jmp @b
@@:
add ecx, 16
mov edx, ecx
mcall 68, 12
test eax, eax
jnz @f
.exit:
mcall -1
@@:
mov ecx, eax
and dword [ecx], 0
mov dword [ecx+4], 8
mov [ipc_mem], ecx
mcall 60, 1
mcall 40, 1 shl 6
mcall 23, 500 ; wait up to 5 seconds for IPC message
test eax, eax
jz .exit
; we got message with JPEG data, now decode it
mov eax, [ecx+12]
mov [ipc_mem_size], eax
; init JPEG decoder
mov ecx,memsize-fin-stack_size ; size
mov edi,fin ; pointer
call add_mem ; mark memory from fin to 0x100000-1024 as free
call colorprecalc ; calculate colors
; hook file functions
mov ecx, 4
call malloc
and dword [edi], 0
lea eax, [edi-file_handler.position]
mov byte [read], 0xE9
mov dword [read+1], read_from_mem - (read+5)
; decode
call jpeg_info
mov dword [jpeg_st],ebp
test ebp,ebp
jz .end
mov eax, [ebp + x_size]
mul dword [ebp + y_size]
lea eax, [eax*3+8]
mov ecx, eax
mcall 68, 12
test eax, eax
jz .end
add eax, 8
mov [ipc_mem_out], eax
mov ebx, [ebp + x_size]
mov [eax-8], ebx
mov ebx, [ebp + y_size]
mov [eax-4], ebx
mov dword [ebp+draw_ptr],put_chunk_to_mem
call jpeg_display
; IPC response
mov esi, [ebp + x_size]
imul esi, [ebp + y_size]
lea esi, [esi*3+8]
mov edx, [ipc_mem_out]
sub edx, 8
.response:
mov ecx, [ipc_mem]
mov ecx, [ecx+8]
mcall 60,2
jmp close_program ; close the program right now
.end:
mov esi, 8
mov edx, x_pointer ; points to 2 null dwords
jmp .response
read_from_mem:
; in: eax=handle, ecx=size, edi=pointer to buffer
; out: ecx=number of read bytes, buffer filled
pushad
mov esi, [ipc_mem]
add esi, 16
add esi, [eax+file_handler.position]
add ecx, [eax+file_handler.position]
cmp ecx, [ipc_mem_size]
jb @f
mov ecx, [ipc_mem_size]
@@:
sub ecx, [eax+file_handler.position]
add [eax+file_handler.position], ecx
rep movsb
popad
ret
;******************************************************************************
put_chunk_to_mem:
; in: (eax,ebx) = start coordinates of chunk
; (ecx,edx) = sizes of chunk
; edi -> chunk data
push esi edi edx
mov esi, edi
mov edi, ebx
imul edi, [ebp + x_size]
add edi, eax
lea edi, [edi*3]
add edi, [ipc_mem_out]
@@:
push ecx edi
lea ecx, [ecx*3]
rep movsb
pop edi ecx
add edi, [ebp + x_size]
add edi, [ebp + x_size]
add edi, [ebp + x_size]
dec edx
jnz @b
pop edx edi esi
ret
;******************************************************************************
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
mov eax,48
mov ebx,3
mov ecx,sc
mov edx,sizeof.system_colors
mcall
mov eax,12
mov ebx,1
mcall
; Draw the window to the appropriate size - it may have
; been resized by the user
cmp [winxs], 0
jne dw_001
; Give the screen some inital defaults
mov [winxs], 400
mov [winys], 300
mov ax, 100
mov [winxo], ax
mov [winyo], ax
jmp dw_002
dw_001:
mov eax, 9
mov ebx, memsize - 1024
mov ecx, -1
mcall
mov eax, [ebx + 34]
mov [winxo], ax
mov eax, [ebx + 38]
mov [winyo], ax
mov eax, [ebx + 42]
mov [winxs], ax
mov eax, [ebx + 46]
mov [winys], ax
dw_002:
mov ebx, dword [winxo-2]
mov bx, [winxs]
mov ecx, dword [winyo-2]
mov cx, [winys]
xor eax,eax ; DRAW WINDOW
mov edx,[sc.work]
or edx,0x33000000
mov edi,title ; WINDOW LABEL
mcall
mov eax,8 ; BUTTON 2: slideshow
mov ebx,57
mov cx, [winys]
sub cx, 39
shl ecx, 16
add ecx, 12
mov esi, [sc.work_button]
mov edx,2
mcall
mov eax,4 ; Button text
movzx ebx, word [winys]
add ebx, 3 shl 16 - 36
mov ecx,[sc.work_button_text]
mov edx,setname
mov esi,setnamelen-setname
mcall
mov eax,8 ; BUTTON 3: set as background
mov bx, [winxs]
sub bx, 65
shl ebx, 16
mov bx,55
mov cx, [winys]
sub cx, 39
shl ecx, 16
add ecx, 12
mov esi, [sc.work_button]
mov edx,3
mcall
mov eax,4 ; Button text
movzx ebx, word [winxs]
sub ebx, 63
shl ebx,16
mov bx, word [winys]
sub bx,36
mov ecx,[sc.work_button_text]
mov edx,setbgr
mov esi,setbgrlen-setbgr
mcall
call print_strings
call load_image
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
mcall
ret
; Read in the image file name.
read_string:
movzx edi,byte[name_string.cursor]
add edi,name_string
mov eax,2
mcall ; Get the key value
shr eax,8
cmp eax,13 ; Return key ends input
je .rs_done
cmp eax,8
jnz .nobsl
cmp edi,name_string
je .exit
dec edi
mov [edi],byte 0;'_'
dec byte[name_string.cursor]
jmp print_strings
.exit: ret
.nobsl:
cmp eax,31
jbe .exit
cmp eax,97
jb .keyok
sub eax,32
.keyok:
mov ah,0
stosw
cmp edi,name_string.end
jnc print_strings
inc byte[name_string.cursor]
jmp print_strings
.rs_done:
call print_strings
mov esi,name_string
call open
test eax,eax
jz .exit
call jpeg_info
test ebp,ebp
jz close
xchg [jpeg_st],ebp
call jpeg_close
load_image:
mov eax,13 ; clear picture area
movzx ebx, word [winxs]
add ebx, 1 shl 16 -10
movzx ecx, word [winys]
sub ecx, 40
add ecx, 1 shl 16
mov edx,[sc.work]
mcall
mov ebp,[jpeg_st]
test ebp,ebp
jz .exit
mov dword [ebp+draw_ptr],put_image
jmp jpeg_display
.exit: ret
print_strings:
pusha
mov eax,13 ; clear text area
movzx ebx, word [winxs]
add ebx, 59 shl 16 -125
mov cx, [winys]
sub cx, 39
shl ecx, 16
add ecx, 12
mov edx,0xffffff
mcall
mov eax,4 ;
movzx ebx, word [winys]
add ebx, 61 shl 16 - 37
mov ecx,0x000000
mov edx,name_string
mov esi,60
mcall
popa
ret
slideshow:
cmp [file_dir], 0
jnz .exit
cmp [jpeg_st], 0
jz .exit
mov esi, name_string
movzx ecx, byte [name_string.cursor]
.l1:
cmp byte [esi+ecx], '/'
jz .l2
loop .l1
.exit:
ret
.l2:
mov byte [esi+ecx], 0
call open
mov byte [esi+ecx], '/'
test eax, eax
jz .exit
test byte [fileattr], 0x10
jz .exit
mov [file_dir], eax
inc ecx
mov [name_string.cursor], cl
display_next:
mov ebx, [file_dir]
test ebx, ebx
jnz @f
ret
@@:
mov byte [ebx], 1
mov byte [ebx+12], 1
mov dword [ebx+16], dirinfo
mov eax, 70
mcall
mov eax, [file_dir]
inc dword [eax+4]
cmp ebx, 1
jz @f
mov eax, [file_dir]
and [file_dir], 0
jmp close
@@:
movzx edi, byte [name_string.cursor]
add edi, name_string
lea esi, [dirinfo+32+40]
@@:
lodsb
stosb
test al, al
jnz @b
mov ecx, name_string.end
sub ecx, edi
rep stosb
call print_strings
mov esi,name_string
call open
test eax,eax
jz display_next
call jpeg_info
test ebp,ebp
jnz .l6
call close
jmp display_next
.l6:
mov dword[ebp+draw_ptr],put_image
push ebp
xchg [jpeg_st],ebp
call jpeg_close
pop ebp
jmp jpeg_display
include 'filelib.asm'
include 'memlib.asm'
include 'jpeglib.asm'
; DATA AREA
wcolor dd 0x000000
drawing_mode dd 2
title db appname,version,0
setname db 'SLIDESHOW'
setnamelen:
setbgr db ' BGR '
setbgrlen:
x_pointer dd 0
x_offset dd 0
x_numofbytes dd 0
x_numofb2 dd 0
x_counter dd 0
winxo dw 0
winyo dw 0
winxs dw 0
winys dw 0
jpeg_st dd 0
file_dir dd 0
name_string: db '/sys/jpegview.jpg',0
rb 256
.end:
.cursor: db 19
.cursor2: db 0
align 4
rgb16: db 0,4,8,13,17,21,25,29,34,38,42,46,50,55,59,63
rgb4: db 0,21,42,63
include 'jpegdat.asm'
align 4
iniciomemoria:
dd -(iniciomemoria+4),-(iniciomemoria+4),(iniciomemoria+4),.l1,0
.l1 dd 0
I_END:
sc system_colors
ipc_mem dd ?
ipc_mem_size dd ?
ipc_mem_out dd ?
fileattr: rb 40
dirinfo: rb 32+304
fin:

View File

@ -0,0 +1,210 @@
movedata:
push eax
xor eax,eax
sub eax,edi
and eax,3
xchg ecx,eax
sub eax,ecx
jle .l1
rep movsb
mov ecx,eax
shr ecx,2
rep movsd
and eax,3
.l1: add ecx,eax
rep movsb
pop eax
ret
mallocz:
call malloc
pushad
add ecx,3
xor eax,eax
shr ecx,2
rep stosd
popad
ret
mresize1: popad
xor edi,edi
stc
mresize2: ret
mresize: ; puntero en di ncr retorna nuevo puntero en di
test edi,edi
jz malloc
cmp ecx,[edi-4]
je mresize2
call free
malloc:
mov edi,ecx
jecxz mresize2
pushad
mov esi,iniciomemoria+4
lea ebx,[ecx+3]
and ebx,-4 ;redondeo a 4
.l1: mov edi,esi
add esi,[esi]
jc mresize1
lodsd
cmp eax,ebx
jc .l1
cmp esi,[iniciomemoria+8]
jc .l2
jne mresize1
lea edx,[ebx+esi+4]
cmp edx,[iniciomemoria+12]
jnc mresize1
mov [iniciomemoria+8],edx
.l2: pop dword [esi-4]
push esi
sub eax,ebx
je .l3
sub eax,4
mov [esi+ebx],eax
jz .l3
;fragmentar
add ebx,4
add [edi],ebx
mov eax,[esi]
sub eax,ebx
mov [esi+ebx],eax
popad
ret
.l3: lodsd
add eax,4
add [edi],eax
popad
ret
realloc: test edi,edi
jz malloc
jecxz free
pushad
pop esi
mov eax,[edi-4]
call malloc
push edi
cmp ecx,eax
jc .l1
mov ecx,eax
.l1: push esi
call movedata
pop edi
call free
popad
.l2: ret
free: ;puntero en di
;no se comprueban los punteros
;retorna di=0 , ncr
test edi,edi
jz realloc.l2
pushad
pop edi
mov ebp,[edi-4]
dec ebp
and ebp,-4 ;redondeo a 4,dx=dx-4
xor edx,edx
push edx
mov edx,iniciomemoria+4
mov esi,edx
;buscar puntero libre anterior
.l1: mov ebx,esi
lodsd
add esi,eax
cmp esi,edi
jc .l1
;enlazar
mov ecx,esi
sub ecx,edi
sub eax,ecx
sub ecx,4
mov [ebx],eax
;fusionar con el anterior
cmp eax,[ebx-4]
jne .l2
cmp ebx,edx
je .l2 ;no fusionar con el primero
mov edi,ebx
add eax,4
add ecx,eax
add ebp,eax
.l2: mov ebx,ebp ;fusionar con bloques de tama¤o 0
.l3: add ebx,4
test dword [edi+ebx],-1
jz .l3
cmp ebx,ecx
jne .l4
;fusionar con el siguiente
add ebx,[esi-4]
add ecx,[esi]
add ebx,4
add ecx,4
cmp esi,[edx+4]
jne .l4
mov [edx+4],edi
.l4: mov [edi-4],ebx
mov [edi],ecx
popad
ret
add_mem: ;edi,ecx ;el ultimo bloque libre debe ser >8 bytes para poder fragmentarlo
cmp ecx,64
jc .l1
add ecx,edi
add edi,3
and edi,-4
and ecx,-4
mov eax,ecx
sub ecx,edi ;redondeo
xchg eax,[iniciomemoria+12]
cmp edi,eax
jna .l1
lea esi,[edi+4]
mov edx,esi
xchg esi,[iniciomemoria+8]
neg edx
mov [edi],edx
mov [edi+4],edx
lea edx,[edi-4]
sub edi,esi
mov [esi],edi
sub eax,4
sub eax,esi
mov [esi-4],eax
add esi,eax
sub edx,esi
mov [esi],edx
.l1: ret
check_mem: ;busqueda de errores en la memoria
;retorna edx nbloques o 0 si error,ecx memoria libre
;ncr: ebp,ebx,eax
mov edi,iniciomemoria
mov esi,edi
xor edx,edx
mov ecx,[edi]
neg ecx ;el primer bloque no cuenta
.l1: add ecx,[edi]
add edi,4
add edi,[edi]
.l2: inc edx
add esi,[esi]
jc .l4
add esi,7
jc .l3
and esi,-4
cmp esi,edi
jc .l2
je .l1
jmp .l4
.l3: test edi,edi
jnz .l4
add ecx,[iniciomemoria+12]
ret
.l4: xor edx,edx
stc
ret