|
Info Guide
#07
31 мая 2005 |
|
Inferno - Ошибки в предыдущих номерах.

Работа над ошибками IG #6 В описание ALASM4.47 вкрался абзац из длинных строк. Вы легко можете исправить этот текст и перепаковать журнал, получив неко─ торый невредный опыт в использовании пакета ZXRar + ZXUnRar :) Другая ошибка в этом описании: текущее смещение DISP опреде─ ляется на самом деле так: a ORG 0 ENT shift ORG a+shift DISP a ;shift=org-disp IG #5 Shiru Otaku (Александр Семёнов) сообщает дополнения к своей статье про рейкастинг: 1. Нигде не сказано, что sin, cos, tan в статье подразумевают значения в градусах на входе и выходе. 2. Указан параметр скорости движения Pspd, но в формулах напи─ сано *10, а не *Pspd. IG#5 (прислано Hrumer'ом) Hrust 1.x: По-моему, Сергей Муллин мне в свое время писал, что код дехруста позволяет и "сужать" коды - если переполнить регистр, который отвечает за хранение длины кодов. Hужно просто вставить подряд несколько кодов расширения, и получим сужение. Hо я не проверял :) Можно это было бы использовать при резкой смене содержимого - код - графика - текст. Если снова встретилась, например, графика - расширяем код. Hrust 2.x: 000xxxx - disp12 (#e200-#f0ff), xxxx=0001 (а было по ошибке напечатано 0000 ) соответствует #e2. LC 4.x: Сейчас сделал распаковщик на Си LC4, в твоем описании неточ─ ность: 11xxxx01, байт: не 1..15 одинаковых байт - должно быть 2..16. Нашел неточность потому, что по твоему описанию формата делал распаковщик :) LC4 более эффективно сохраняет большие последовательности "непакуемых байтов". LC 5.x: В журнале написано, что в LC5.x исчезли копирования "задом наперед". Это неверно. Флаг берётся вот этим кодом: DLC3 EXA SLA D JR NZ,$+6 LD D,(HL) INC HL SLI D DJNZ DLC7 С переходом на DLC7. После получения -dispH из битового потока извлекается признак направления копирования: 0 - последовательное копирование байтов; 1 - обратное копирование байтов, и помещается в CF. Кусок кода, где используется это значение в дальнейшем: JR NC,$+4 DEC HL DEC HL INC HL Далее из байтового потока извлекается -dispL. Как уже было отмечено, при disp>768 увеличивается puts. Надо исправить так: ──────────────────────────────────────────────────────────────── Битовый поток: %1 - взять байт из байтового потока; %0, -puts, -dispH, %x (признак направления копирования: 0 - как обычно, 1 - в обратном порядке), -dispL (из байтового потока) - ссылка назад с копированием. Коды для disp и puts приведены в таблице выше. При disp=1 и признаке направления = 0, очеви─ дно, происходит повторение предыдущего байта... ──────────────────────────────────────────────────────────────── //Распаковщик картинок LaserCompact5.2. // Си версия: Hrumer & HalfElf. 25.02.2005 typedef unsigned char BYTE; typedef unsigned short WORD; BYTE *lc_d_input; BYTE lc_d_tagbyte; BYTE lc_d_index; // преобразование 000СгСтолбРядЛин в 000СгЛинРядСтолб WORD getrealadr(WORD virtadr, WORD lb, WORD sc) { WORD realadr; if (virtadr < lb) { WORD Lin = (virtadr & 0x0007) << 8; WORD Ryd = (virtadr & 0x0038) << 2; WORD Stolb = (virtadr & 0x07C0) >> 6; WORD Sg = virtadr & 0x1800; realadr = Sg | Lin | Ryd | Stolb; } else { realadr = virtadr + sc; } return realadr; } BYTE lc_d_getbit(void) { BYTE bit[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; if (lc_d_index == 0) lc_d_tagbyte = *lc_d_input++; BYTE tmp = (lc_d_tagbyte & bit[lc_d_index]) == 0 ? 0 : 1; lc_d_index = (lc_d_index + 1) % 8; return tmp; } BYTE getcode(void) { BYTE tmp = 0xFE; for( int i = 0; i < 3; ++i) { if( lc_d_getbit() ) return tmp+1; tmp = (tmp << 1) | lc_d_getbit(); } return ((tmp << 1) | lc_d_getbit()) + 9; } BYTE getlen(void) { BYTE len = getcode(); if (len == 0x100 - 7) { len = *lc_d_input++; --len; } else { if (len > 0x100 - 7) --len; } return len; } int delc52(BYTE* source, BYTE* destination) { lc_d_index = 0; BYTE *lc_d_output = destination; lc_d_input = source + source[7] + 9 ; WORD sc = (lc_d_input[-1]) << 8; WORD to = (sc & 0x0300) << 3; WORD lb = (sc ^ 0x1800) & 0xFC00; lc_d_output[getrealadr(to++, lb, sc)] = *lc_d_input++; while(true) { if (lc_d_getbit()) { lc_d_output[getrealadr(to++, lb, sc)] = *lc_d_input++; } else { BYTE len = getlen(); if (len == 0xFF) break; WORD dist = getcode() << 8; BYTE napr = lc_d_getbit(); dist |= *lc_d_input++; len = -len; dist = -dist; if (dist > 768) ++len; WORD from = to-dist; do { lc_d_output[getrealadr(to++, lb, sc)] = lc_d_output[getrealadr(from, lb, sc)]; from += napr ? -1 : 1; --len; } while (len>0); } } return 0; }
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3