QuidoScr

Z PMD 85 Infoserver

QuidoScr


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:

  1. 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
  2. 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
  3. 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
  4. 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