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