pst-lzma.h 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. | TIGCC Program Starter - LZMA decompression support
  2. | Copyright (C) 1999-2004 Igor Pavlov
  3. | Copyright (C) 2004-2005 Kevin Kofler
  4. |
  5. | LICENSE
  6. | -------
  7. |
  8. | LZMA SDK is licensed under two licenses:
  9. |
  10. | 1) GNU Lesser General Public License (GNU LGPL)
  11. | 2) Common Public License (CPL)
  12. |
  13. | It means that you can select one of these two licenses and
  14. | follow rules of that license.
  15. |
  16. | SPECIAL EXCEPTION
  17. | Igor Pavlov, as the author of this code, expressly permits you
  18. | to statically or dynamically link your code (or bind by name)
  19. | to the files from LZMA SDK without subjecting your linked
  20. | code to the terms of the CPL or GNU LGPL.
  21. | Any modifications or additions to files from LZMA SDK, however,
  22. | are subject to the GNU LGPL or CPL terms.
  23. | Expected LZMA compression options: -lc0 -pb1 -mfbt2
  24. | GET_UNCOMPRESSED_SIZE inline function
  25. | INPUT: %a3.l: pointer to compressed data
  26. | OUTPUT: %d6.l: uncompressed size
  27. | SIDE EFFECTS: throws a Data Type error if not a valid compressed program
  28. | may throw a Memory error
  29. | may advance %a3 for later decompression
  30. | DESTROYS: %d0-%d2/%a0-%a1
  31. .macro GET_UNCOMPRESSED_SIZE
  32. | Get the length of the variable.
  33. moveq.l #0,%d6
  34. move.w (%a3)+,%d6
  35. | Get a pointer to the data type of the variable.
  36. lea.l -1(%a3,%d6.l),%a0
  37. | Check if it has type "LZMA".
  38. cmp.b #0xf8,(%a0)
  39. jbne invalid_archive
  40. tst.b -(%a0)
  41. jbne invalid_archive
  42. cmp.b #'A',-(%a0)
  43. jbne invalid_archive
  44. cmp.b #'M',-(%a0)
  45. jbne invalid_archive
  46. cmp.b #'Z',-(%a0)
  47. jbne invalid_archive
  48. cmp.b #'L',-(%a0)
  49. jbne invalid_archive
  50. tst.b -(%a0)
  51. jbne invalid_archive
  52. cmp.l #0x2d000080,(%a3)+
  53. jbne invalid_archive
  54. tst.b (%a3)+
  55. jbeq valid_archive
  56. invalid_archive:
  57. .word 0xA000+210 | ER_DATATYPE
  58. valid_archive:
  59. | Get the uncompressed size.
  60. move.b (%a3)+,%d1
  61. move.w (%a3)+,%d6
  62. tst.b %d6
  63. jbne invalid_archive
  64. move.b %d1,%d6
  65. tst.l (%a3)+
  66. jbne invalid_archive
  67. tst.b (%a3)+
  68. jbne invalid_archive
  69. .endm
  70. | MEM_TO_MEM_DECOMPRESS inline function
  71. | INPUT: %a3.l: pointer to compressed data
  72. | %a0.l: pointer to buffer for uncompressed data
  73. | %d6.l: uncompressed size
  74. | OUTPUT: %a4.l: pointer to uncompressed data
  75. | SIDE EFFECTS: may throw a Memory or Data Type error
  76. | DESTROYS: %d0-%d2/%a0-%a2
  77. .macro MEM_TO_MEM_DECOMPRESS
  78. | LzmaDecode(src,dest,OutSize)
  79. move.l %d6,-(%a7) | OutSize
  80. pea.l (%a0) | dest
  81. pea.l (%a3) | src
  82. | Satisfy output constraint
  83. movea.l %a0,%a4
  84. jbsr LzmaDecode
  85. lea.l 12(%a7),%a7
  86. | Check return value
  87. tst.w %d0
  88. jbne invalid_archive
  89. .endm
  90. .text
  91. .even
  92. RangeDecoderBitDecode:
  93. movm.l #0x1c30,-(%sp)
  94. move.l %a0,%a3
  95. move.l %a1,%a2
  96. move.l 4(%a1),%d5
  97. move.l %d5,%d0
  98. moveq.l #11,%d1
  99. lsr.l %d1,%d0
  100. move.w (%a0),%d3
  101. move.w %d3,-(%sp)
  102. clr.w -(%sp)
  103. move.l %d0,-(%sp)
  104. jbsr __mulsi3
  105. addq.l #8,%sp
  106. move.l %d0,%d1
  107. move.l 8(%a2),%d4
  108. cmp.l %d4,%d0
  109. jbls .L2
  110. move.l %d0,4(%a2)
  111. move.w #2048,%d0
  112. sub.w %d3,%d0
  113. lsr.w #5,%d0
  114. add.w %d0,%d3
  115. move.w %d3,(%a3)
  116. cmp.l #16777215,%d1
  117. jbhi .L3
  118. lsl.l #8,%d4
  119. move.l (%a2),%a0
  120. or.b (%a0),%d4
  121. move.l %d4,8(%a2)
  122. addq.l #1,(%a2)
  123. move.l %d1,%d0
  124. lsl.l #8,%d0
  125. move.l %d0,4(%a2)
  126. .L3:
  127. clr.w %d0
  128. jbra .L1
  129. .even
  130. .L2:
  131. move.l %d5,%d2
  132. sub.l %d0,%d2
  133. move.l %d2,4(%a2)
  134. sub.l %d0,%d4
  135. move.l %d4,%d1
  136. move.l %d4,8(%a2)
  137. move.w %d3,%d0
  138. lsr.w #5,%d0
  139. sub.w %d0,%d3
  140. move.w %d3,(%a3)
  141. cmp.l #16777215,%d2
  142. jbhi .L5
  143. lsl.l #8,%d1
  144. move.l (%a2),%a0
  145. or.b (%a0),%d1
  146. move.l %d1,8(%a2)
  147. addq.l #1,(%a2)
  148. lsl.l #8,%d2
  149. move.l %d2,4(%a2)
  150. .L5:
  151. moveq.l #1,%d0
  152. .L1:
  153. movm.l (%sp)+,#0xc38
  154. rts
  155. .even
  156. RangeDecoderBitTreeDecode:
  157. movm.l #0x1f00,-(%sp)
  158. move.l %a0,%d7
  159. move.w %d0,%d5
  160. move.l %a1,%d6
  161. moveq.l #1,%d1
  162. move.w %d0,%d4
  163. jbra .L7
  164. .even
  165. .L11:
  166. move.w %d1,%d3
  167. add.w %d1,%d3
  168. move.w %d1,%a0
  169. add.l %a0,%a0
  170. move.l %d6,%a1
  171. lea (%a0,%d7.l),%a0
  172. jbsr RangeDecoderBitDecode
  173. move.w %d3,%d1
  174. add.w %d0,%d1
  175. subq.w #1,%d4
  176. .L7:
  177. tst.w %d4
  178. jbgt .L11
  179. moveq.l #1,%d0
  180. lsl.w %d5,%d0
  181. sub.w %d0,%d1
  182. move.w %d1,%d0
  183. movm.l (%sp)+,#0xf8
  184. rts
  185. .even
  186. LzmaLenDecode:
  187. movm.l #0x1820,-(%sp)
  188. move.l %a0,%a2
  189. move.l %a1,%d3
  190. move.w %d0,%d4
  191. jbsr RangeDecoderBitDecode
  192. tst.w %d0
  193. jbne .L13
  194. move.w %d4,%d1
  195. ext.l %d1
  196. lsl.l #4,%d1
  197. move.l %d3,%a1
  198. moveq.l #3,%d0
  199. lea 4(%a2,%d1.l),%a0
  200. jbsr RangeDecoderBitTreeDecode
  201. jbra .L12
  202. .even
  203. .L13:
  204. move.l %d3,%a1
  205. lea (2,%a2),%a0
  206. jbsr RangeDecoderBitDecode
  207. tst.w %d0
  208. jbne .L14
  209. move.w %d4,%d1
  210. ext.l %d1
  211. lsl.l #4,%d1
  212. move.l %d3,%a1
  213. moveq.l #3,%d0
  214. lea 36(%a2,%d1.l),%a0
  215. jbsr RangeDecoderBitTreeDecode
  216. addq.w #8,%d0
  217. jbra .L12
  218. .even
  219. .L14:
  220. move.l %d3,%a1
  221. moveq.l #8,%d0
  222. lea (68,%a2),%a0
  223. jbsr RangeDecoderBitTreeDecode
  224. add.w #16,%d0
  225. .L12:
  226. movm.l (%sp)+,#0x418
  227. rts
  228. .even
  229. .globl LzmaDecode
  230. LzmaDecode:
  231. lea (-3692,%sp),%sp
  232. movm.l #0x1f3a,-(%sp)
  233. clr.w 50(%sp)
  234. clr.w 48(%sp)
  235. moveq.l #1,%d7
  236. move.l %d7,44(%sp)
  237. move.l %d7,40(%sp)
  238. move.l %d7,36(%sp)
  239. sub.l %a6,%a6
  240. moveq.l #0,%d0
  241. lea (64,%sp),%a0
  242. jbra .L16
  243. .even
  244. .L20:
  245. move.w #1024,(%a0)+
  246. addq.l #1,%d0
  247. .L16:
  248. cmp.l #1830,%d0
  249. jbcs .L20
  250. lea (52,%sp),%a1
  251. move.l 3732(%sp),(%a1)
  252. clr.l 8(%a1)
  253. moveq.l #-1,%d0
  254. move.l %d0,4(%a1)
  255. moveq.l #4,%d1
  256. jbra .L21
  257. .even
  258. .L25:
  259. move.l 8(%a1),%d0
  260. lsl.l #8,%d0
  261. move.l (%a1),%a0
  262. or.b (%a0),%d0
  263. move.l %d0,8(%a1)
  264. addq.l #1,(%a1)
  265. subq.w #1,%d1
  266. .L21:
  267. tst.w %d1
  268. jbge .L25
  269. jbra .L102
  270. .even
  271. .L101:
  272. move.w %a6,%d5
  273. and.w #1,%d5
  274. lea (52,%sp),%a4
  275. move.w 50(%sp),%d3
  276. ext.l %d3
  277. move.l %d3,%d4
  278. add.l %d3,%d4
  279. move.w %d5,%a3
  280. lea (%a3,%d4.l),%a0
  281. add.l %a0,%a0
  282. moveq.l #64,%d6
  283. add.l %sp,%d6
  284. move.l %a4,%a1
  285. add.l %d6,%a0
  286. jbsr RangeDecoderBitDecode
  287. tst.w %d0
  288. jbne .L30
  289. move.l %sp,%d6
  290. add.l #2188,%d6
  291. cmp.w #3,50(%sp)
  292. jbgt .L31
  293. clr.w 50(%sp)
  294. jbra .L32
  295. .even
  296. .L31:
  297. cmp.w #9,50(%sp)
  298. jbgt .L33
  299. subq.w #3,50(%sp)
  300. jbra .L32
  301. .even
  302. .L33:
  303. subq.w #6,50(%sp)
  304. .L32:
  305. moveq.l #1,%d0
  306. tst.w 48(%sp)
  307. jbeq .L47
  308. move.l %a6,%d0
  309. sub.l %d7,%d0
  310. move.l 3736(%sp),%a0
  311. move.b (%a0,%d0.l),%d5
  312. moveq.l #1,%d4
  313. .L36:
  314. move.b %d5,%d3
  315. lsr.b #7,%d3
  316. and.w #1,%d3
  317. lsl.b #1,%d5
  318. addq.w #1,%d3
  319. move.w %d3,%d0
  320. ext.l %d0
  321. subq.w #1,%d3
  322. lsl.l #8,%d0
  323. move.l %d0,%a1
  324. lea (%a1,%d4.w),%a0
  325. add.l %a0,%a0
  326. move.l %a4,%a1
  327. add.l %d6,%a0
  328. jbsr RangeDecoderBitDecode
  329. lsl.w #1,%d4
  330. or.w %d0,%d4
  331. cmp.w %d3,%d0
  332. jbeq .L38
  333. jbra .L40
  334. .even
  335. .L43:
  336. move.w %d4,%d3
  337. add.w %d4,%d3
  338. move.w %d4,%a0
  339. add.l %a0,%a0
  340. move.l %a4,%a1
  341. lea (%a0,%d6.l),%a0
  342. jbsr RangeDecoderBitDecode
  343. move.w %d3,%d4
  344. or.w %d0,%d4
  345. .L40:
  346. cmp.w #255,%d4
  347. jble .L43
  348. jbra .L37
  349. .even
  350. .L38:
  351. cmp.w #255,%d4
  352. jble .L36
  353. .L37:
  354. move.b %d4,%d3
  355. clr.w 48(%sp)
  356. jbra .L46
  357. .even
  358. .L47:
  359. move.w %d0,%d3
  360. add.w %d0,%d3
  361. move.w %d0,%a0
  362. add.l %a0,%a0
  363. move.l %a4,%a1
  364. lea (%a0,%d6.l),%a0
  365. jbsr RangeDecoderBitDecode
  366. or.w %d3,%d0
  367. cmp.w #255,%d0
  368. jble .L47
  369. move.b %d0,%d3
  370. .L46:
  371. move.l 3736(%sp),%d0
  372. move.b %d3,(%a6,%d0.l)
  373. jbra .L104
  374. .even
  375. .L30:
  376. move.w #1,48(%sp)
  377. move.l %d6,%a2
  378. add.l %d4,%a2
  379. move.l %a4,%a1
  380. lea (48,%a2),%a0
  381. jbsr RangeDecoderBitDecode
  382. tst.w %d0
  383. jbeq .L53
  384. move.l %a4,%a1
  385. lea (72,%a2),%a0
  386. jbsr RangeDecoderBitDecode
  387. tst.w %d0
  388. jbne .L54
  389. lsl.l #2,%d3
  390. move.l %d6,%d0
  391. add.l %d3,%d0
  392. lea (%a3,%a3.l),%a0
  393. lea (%a0,%d0.l),%a0
  394. move.l %a4,%a1
  395. lea (144,%a0),%a0
  396. jbsr RangeDecoderBitDecode
  397. tst.w %d0
  398. jbne .L59
  399. moveq.l #1,%d0
  400. cmp.w #0,%a6
  401. jbeq .L15
  402. moveq.l #9,%d0
  403. cmp.w #6,50(%sp)
  404. jble .L58
  405. moveq.l #11,%d0
  406. .L58:
  407. move.w %d0,50(%sp)
  408. move.l %a6,%d0
  409. sub.l %d7,%d0
  410. move.l 3736(%sp),%a0
  411. move.b (%a0,%d0.l),(%a6,%a0.l)
  412. .L104:
  413. addq.l #1,%a6
  414. jbra .L102
  415. .even
  416. .L54:
  417. move.l %a4,%a1
  418. lea (96,%a2),%a0
  419. jbsr RangeDecoderBitDecode
  420. move.l 44(%sp),%d1
  421. tst.w %d0
  422. jbeq .L61
  423. move.l %a4,%a1
  424. lea (120,%a2),%a0
  425. jbsr RangeDecoderBitDecode
  426. move.l 40(%sp),%d1
  427. tst.w %d0
  428. jbeq .L63
  429. move.l 36(%sp),%d1
  430. move.l 40(%sp),36(%sp)
  431. .L63:
  432. move.l 44(%sp),40(%sp)
  433. .L61:
  434. move.l %d7,44(%sp)
  435. move.l %d1,%d7
  436. .L59:
  437. move.w %d5,%d0
  438. move.l %a4,%a1
  439. lea (1608,%sp),%a0
  440. jbsr LzmaLenDecode
  441. move.w %d0,%d5
  442. moveq.l #8,%d0
  443. cmp.w #6,50(%sp)
  444. jble .L65
  445. moveq.l #11,%d0
  446. .L65:
  447. move.w %d0,50(%sp)
  448. jbra .L66
  449. .even
  450. .L53:
  451. move.l 40(%sp),36(%sp)
  452. move.l 44(%sp),40(%sp)
  453. move.l %d7,44(%sp)
  454. moveq.l #7,%d0
  455. cmp.w #6,50(%sp)
  456. jble .L68
  457. moveq.l #10,%d0
  458. .L68:
  459. move.w %d0,50(%sp)
  460. move.w %d5,%d0
  461. move.l %a4,%a1
  462. lea (1028,%sp),%a0
  463. jbsr LzmaLenDecode
  464. move.w %d0,%d5
  465. cmp.w #3,%d0
  466. jble .L69
  467. moveq.l #3,%d0
  468. .L69:
  469. ext.l %d0
  470. lsl.l #7,%d0
  471. move.l %d6,%a0
  472. add.l %d0,%a0
  473. move.l %a4,%a1
  474. moveq.l #6,%d0
  475. lea (192,%a0),%a0
  476. jbsr RangeDecoderBitTreeDecode
  477. move.w %d0,%d2
  478. move.w %d0,%d1
  479. ext.l %d1
  480. move.l %d1,%d7
  481. cmp.w #3,%d0
  482. jble .L93
  483. move.w %d0,%d4
  484. asr.w #1,%d4
  485. move.w %d4,%a3
  486. subq.w #1,%a3
  487. moveq.l #1,%d7
  488. and.l %d1,%d7
  489. moveq.l #2,%d0
  490. or.l %d0,%d7
  491. clr.l %d0
  492. move.w %a3,%d0
  493. lsl.l %d0,%d7
  494. cmp.w #13,%d2
  495. jbgt .L71
  496. move.l %d7,%d0
  497. add.l %d7,%d0
  498. add.l %d6,%d0
  499. add.l %d1,%d1
  500. sub.l %d1,%d0
  501. move.l %d0,%a2
  502. lea (702,%a2),%a2
  503. moveq.l #1,%d3
  504. clr.w %d6
  505. clr.w %d4
  506. jbra .L72
  507. .even
  508. .L76:
  509. move.w %d3,%a0
  510. add.l %a0,%a0
  511. move.l %a4,%a1
  512. lea (%a2,%a0.l),%a0
  513. jbsr RangeDecoderBitDecode
  514. add.w %d3,%d3
  515. add.w %d0,%d3
  516. lsl.w %d4,%d0
  517. or.w %d0,%d6
  518. addq.w #1,%d4
  519. .L72:
  520. cmp.w %a3,%d4
  521. jblt .L76
  522. jbra .L103
  523. .even
  524. .L71:
  525. move.l 4(%a4),%d0
  526. move.l 8(%a4),%d1
  527. moveq.l #0,%d3
  528. move.w %d4,%d2
  529. subq.w #5,%d2
  530. jbra .L79
  531. .even
  532. .L85:
  533. lsr.l #1,%d0
  534. add.l %d3,%d3
  535. cmp.l %d1,%d0
  536. jbhi .L83
  537. sub.l %d0,%d1
  538. moveq.l #1,%d4
  539. or.l %d4,%d3
  540. .L83:
  541. cmp.l #16777215,%d0
  542. jbhi .L81
  543. lsl.l #8,%d0
  544. lsl.l #8,%d1
  545. move.l (%a4),%a0
  546. or.b (%a0),%d1
  547. addq.l #1,(%a4)
  548. .L81:
  549. subq.w #1,%d2
  550. .L79:
  551. tst.w %d2
  552. jbgt .L85
  553. move.l %d0,4(%a4)
  554. move.l %d1,8(%a4)
  555. lsl.l #4,%d3
  556. add.l %d3,%d7
  557. lea (996,%sp),%a2
  558. moveq.l #1,%d3
  559. clr.w %d6
  560. clr.w %d4
  561. jbra .L87
  562. .even
  563. .L91:
  564. move.w %d3,%a0
  565. add.l %a0,%a0
  566. move.l %a4,%a1
  567. lea (%a2,%a0.l),%a0
  568. jbsr RangeDecoderBitDecode
  569. add.w %d3,%d3
  570. add.w %d0,%d3
  571. lsl.w %d4,%d0
  572. or.w %d0,%d6
  573. addq.w #1,%d4
  574. .L87:
  575. cmp.w #4,%d4
  576. jblt .L91
  577. .L103:
  578. move.l %d7,%a0
  579. lea (%a0,%d6.w),%a0
  580. move.l %a0,%d7
  581. .L93:
  582. addq.l #1,%d7
  583. .L66:
  584. tst.l %d7
  585. jbeq .L28
  586. moveq.l #1,%d0
  587. cmp.l %d7,%a6
  588. jbcs .L15
  589. addq.w #2,%d5
  590. move.l 3736(%sp),%a0
  591. sub.l %d7,%a0
  592. lea (%a6,%a0.l),%a0
  593. .L96:
  594. move.l 3736(%sp),%a1
  595. move.b (%a0)+,(%a6,%a1.l)
  596. addq.l #1,%a6
  597. subq.w #1,%d5
  598. tst.w %d5
  599. jble .L102
  600. cmp.l 3740(%sp),%a6
  601. jbcs .L96
  602. .L102:
  603. cmp.l 3740(%sp),%a6
  604. jbcs .L101
  605. .L28:
  606. clr.w %d0
  607. .L15:
  608. movm.l (%sp)+,#0x5cf8
  609. lea (3692,%sp),%sp
  610. rts