QuidoScr
Z PMD 85 Infoserver
QuidoScr | |
Autor: | Roman Bórik |
---|---|
Verzia: | v1.1 (03/2011) |
Operačný systém: | windows | unix |
Lokalizácia: | angličtina |
Licencia: | Copyright © 2011 RM-TEAM |
Download: | quidoscr11.zip - ZIP archív obsahujúci binárky pre win32 konzolu a Linux + zdrojové texty Quida a zdrojové texty rozpakovacích rutín |
Obsah |
QuidoScr je PC utilita určená pre pakovanie obrázkov z PMD 85, alebo ich častí. QuidoScr môže ku spakovaným dátam pripojiť aj rozpakovaciu rutinu a vytvoriť súbor pásky pre emulátory.
Základné vlastnosti
QuidoScr používa rovnaké komprimačné algoritmy ako Quido. Tie sú však upravené pre vlastnosti VideoRAM PMD 85.
- súbor s obrázkom musí mať veľkosť 16384 bytov, teda celá VideoRAM vrátane zápisníkovej oblasti - QuidoScr zápisníkovú oblasť pri pakovaní vynecháva a rozpakovacie rutiny do zápisníkovej oblasti nezasahujú
- QuidoScr pakuje celé byty vo VRAM, teda vrátane atribútov, na rozdiel od GREDu, ktorý atribúty ignoruje
- 4 voliteľné módy pakovania - pokiaľ sa užívateľ nerozhodne inak, QuidoScr vyskúša všetky 4 módy a použije ten, ktorý vyšiel najlepšie
- možnosť pakovať iba časť obrázku - užívateľ môže určiť číslo mikroriadku, od ktorého a do ktorého sa má pakovať (nie je teda možné pakovať ľubovoľný výrez, ale iba skupinu súvislých mikroriadkov). Rozpakovacia rutina umiestni zvolenú časť obrázku na pôvodné miesto.
- možnosť uložiť spakované dáta osobitne alebo vrátane rozpakovacej rutiny
- uloženie výsledku do súboru pásky PTP (PMD 85)
Použitie
QuidoScr je konzolová utilita, takže sa dá s výhodou použíť v dávkových súboroch. Požadované chovanie utility sa volí príslušnými prepínačmi. V hranatých zátvorkách sú uvedené defaultné hodnoty parametrov, pokiaľ sa daný prepínač nepoužije.
Príkazový riadok: quidoscr [prepinace] vstupny_subor.ext
- -o vystup.ext
určuje názov výstupného súboru. Pokiaľ sa neuvedie, výstupný súbor bude mať názov podľa vstupného súboru a prípona sa zmení na "pck" alebo "ptp", podľa toho, či sa má vytvoriť súbor pásky alebo nie. - -append
spôsobí, že výsledok sa pripojí na koniec výstupného súboru. Pokiaľ nie je uvedený, existujúci výstupný súbor sa prepíše. - -m 1234
umožňuje voľbu módov pakovania. Za prepínačom môže byť akákoľvek kombinácia číslic 1 až 4. QuidoScr použije na pakovanie iba uvedené módy. [1234] - -lf prvy_mikroriadok
číslo prvého mikroriadku, ktorý sa bude pakovať [0] - -ll posledny_mikroriadok
číslo posledného mikroriadku, ktorý sa bude pakovať [255] - -a adresa
vloží pred dáta rozpakovciu rutinu a zároveň určuje adresu, od ktorej sa spúšťa samotné rozpakovanie - -ptp
výsledok sa uloží do PTP súboru pásky pre Emulátor PMD 85. - -vb
QuidoScr bude pri pakovaní "ukecanejší". - -h
zobrazí "help" - -v
zobrazí verziu programu
Všetky číselné hodnoty je možné zadávať v týchto troch číselných sústavách:
- desiatkovo (decimal): 12345
- osmičkovo (octal): 01234
- šestnástkovo (hexadecimal): 0x1234
Módy pakovania
QuidoStr pakuje štyroma módmi, ktoré sa líšia smerom pakovania a vlastnosťami algoritmu Implod:
- pakuje sa spätne od posledného mikroriadku, veľkosť Implod okna sú 4kB a maximálna dĺžka hľadanej frázy je 10 bytov
- pakuje sa spätne od posledného mikroriadku, veľkosť Implod okna sú 2kB a maximálna dĺžka hľadanej frázy je 18 bytov
- pakuje sa dopredu od prvého mikroriadku, veľkosť Implod okna sú 4kB a maximálna dĺžka hľadanej frázy je 10 bytov
- pakuje sa dopredu od prvého mikroriadku, veľkosť Implod okna sú 2kB a maximálna dĺžka hľadanej frázy je 18 bytov
Shrink je pre všetky módy rovnaký. Shrink blok môže mať maximálne 48 opakujúcich sa bytov, teda šírku mikroriadku v bytoch. Minimálna dĺžka Implod frázy, resp. minimálny počet opakujúcich sa bytov je 3.
Formát pakovaných dát
Formát pakovaných dát je rovnaký ako to má Quido, nie je však využitý "dlhý shrink", ktorý v tomto prípade nemá význam. Dáta sú uvodené svojou dĺžkou (2 byty).
Rozpakovacia rutina
Rozpakovacia rutina a jej dĺžka sa líši podľa módu pakovavania (116 bytov v módoch 1 a 2, 110 bytov v módoch 3 a 4). Gro rutiny je vždy rovnaké, rozdiel je iba v interpretovaní flag bytu pre Implod a smer rozpakovania.
Nasleduje výpis rozpakovacej rutiny pre mód 1. Všetky rozpakovacie rutiny sú v priloženom archíve.
; I: HL=adresa dát - dáta musia začínať dvoma bytami s dĺžkou spakovaných dát ; DE=adresa prvého horného mikroriadku (49152 + N * 64) M1: LXI H,M1End ; adresa dát LXI D,0C000h + 0 * 64 ; adresa prvého horného mikroriadku MOV C,M ; do BC dĺžku dát INX H MOV B,M INX H PUSH H DAD B ; HL=koniec spakovaných dát SHLD M1EndAdr+1 ; adresa pre test konca rozpakovania POP H M1NextByte: MOV A,M ; vezmi flag byte RLC ; je to Implod ? RRC JC M1NoImplod ; nie, skoč ďalej ANI 15 ; odmaskuj vyššie 4 bity offsetu ku kopírovanej fráze MOV B,A ; ulož do B MOV A,M ; dĺžku frázy presuň do A RRC RRC RRC RRC ANI 7 ADI 3 ; uprav na správny rozsah 3 až 10 MOV C,A ; a ulož do C INX H ; posuň ukazateľ na nižší byte offsetu frázy MOV A,E ; odpočítaj nižší byte offsetu SUB M INX H ; posuň ukazateľ na spakované dáta PUSH H ; a odlož si ho MOV L,A ; ulož nižší byte adresy zdrojovej frázy MOV A,D ; a odpočítaj aj vyšší byte offsetu SBB B MOV H,A ; HL=zdrojová adresa frázy, C=dĺžka frázy JMP M1FillBlock M1NoImplod: INX H ; posuň ukazateľ na spakované dáta CPI 192 ; je to krátky Shrink ? JNC M1LitBlock ; áno, skoč ďalej ANI 63 MOV C,A ; sú to nepakovateľné dáta - BC=počet CALL M1Move ; presuň na cieľovú adresu v DE JMP M1CheckEnd ; otestuj koniec mikroriadku alebo pakovania M1LitBlock: ANI 63 ; počet rovnakých bytov ADI 3-1 ; uprav počet na 3 až 48 - bez jedného, ktorý MOV C,A ; sa predpripraví, C=počet MOV A,M ; skopíruj opakujúci sa byte INX H STAX D PUSH H ; odpamätaj ukazateľ spakovaných dát MOV H,D ; budeme vyplňovať MOV L,E INX D ; DE=HL+1, C=počet-1 M1FillBlock: CALL M1Move ; prekopíruj/vyplň blok POP H ; obnov ukazateľ na spakované dáta M1CheckEnd: MOV A,E ; test na prechod na nasledujúci mikroriadok ANI 3Fh CPI 30h JNZ M1NextByte ; nebol prechod, skoč spracovať ďalší flag MOV A,E ; preskoč zápisník vedľa VRAM ADI 10h MOV E,A MOV A,D ADC C MOV D,A M1EndAdr: LXI B,0 ; adresa začiatku dát MOV A,B ; test na koniec rozpakovania CMP H JNZ M1NextByte ; opakuj pre celý blok MOV A,C CMP L JNZ M1NextByte ; opakuj pre celý blok RET ; Rutina pre presun/kopírovanie/vypĺňanie M1Move: MOV A,M STAX D INX H INX D DCR C JNZ M1Move RET ; začiatok pakovaných dát M1End: DW LLL ; LLL = dĺžka pakovaných dát DS LLL