ZX a SIF

V poslednej dobe sa tak trosku hram so sifom.

Zacalo to sindikatom, na ktorom Z00m vytiahol temu SIFROM (Cygnusova uprava ISOROM, na pouzitie sifu miesto kazetaka na load/save programov/hier). Z00m vtedy upravoval nejaku +3jku a jedna z poziadavok bola, miesto klasickej ROM pouzit ROM s dvojnasobnou kapacitou, kde sa do jednej casti da klasicka ROM a do druhej SIFROM a prepinat sa budu prepinacom.

Mna vsak zaujala myslienka pouzitia sifrom patchu bez nutnosti zasahu do pocitaca.

Samozrejme, do standardnej ROM sa neda zapisovat nejakymi POKE z BASICu a dokonca ani zo strojoveho kodu, avsak vydobytky modernej doby nam to umoznia velmi jednoducho. Mam na mysli DivIDE. Bezne sa DivIDE sice pouziva na pripojenie velkokapacitnych datovych ulozisk ako su harddisky, ci CF karty, cize miesto magnetofonu, ale aj k takemuto pouzitiu divide potrebuje vlastnu pamat v ktorej bude obsluzny program (firmware) a jeho data (aby interface co najmenej zasahoval do pamati zx spectra, a aby tak islo nahrat co najviac programov povodne nahravanych z kazety). No a kedze systemovy konektor, na ktory sa DivIDE pripaja, nema signal /RAMCS, ktorym by vedelo odpojit zx RAM, tak musi pouzit signal /ROMCS a svoju pamat tak pouzivat v oblasti, kde ma zx ROM. A prave toto nam hra do karat a tak jedinym problemom, ktory na prevadzkovanie sifrom bez zasahu do pocitaca je, ako dostat upravenu ROM do pamate DivIDE.

Na divide existuje niekolko roznych firmware. Kazdy z nich ma svoje vlastnosti, ktorymi su napriklad pouzity suborovy system, schopnost data na disk aj ukladat ci moznost zobrazovat dlhe nazvy v pripade pouzitia suboroveho systemu FAT. Nam vsak bude stacit jedna vlastnost, ktoru maju vsetky bezne pouzivane firmware (demfir, esxdos, fatware, mdos3…) a tou je nahrat do pamati zx spectra kratky program, ktory upravi ROM a nasledne ju zapise do pamati divide (co nam samozrejme znemozni nadalej pouzivat firmware divide na citanie/ukladanie dat, ale o to nam teraz nejde, naviac, je to samozrejme docasne znemoznenie, pocitac staci vypnut a zapnut a uz je zasa vsetko ako bolo).

Do urcitej miery jednoduchsie to maju pouzivatelia MDOS3. System MDOS3 sa sklada z dvoch casti, prva cast je bootloader, ktory sa spusti pri zapnuti pocitaca a ma za ulohu nacitat konfiguracny subor, v ktorom su popisane systemy instalovane na bootdiskete a druha cast je uz samotny MDOS3, ktory je rozdeleny na niekolko suborov (po 8kb), ktore bootloader po vybere systemu MDOS3 nahra do pamate divide a nasledne spusti. Takto vie bootloader nahravat aj ine systemy (aj ked samozrejme s obmedzeniami, ale tie nas teraz nebudu trapit, lebo pre nase ucely nie su podstatne), napriklad uz spominany demfir, esxdos ci fatware, alebo aj T-Bios (system, ktory si asi nikto nenapali priamo do eeprom divide ;]). No a my tuto vlastnost pouzijeme na nahratie sifrom.

Najprv si vsak ukazeme univerzalny sposob, ktory bude pouzitelny vo vsetkych beznych firmwaroch (tu samozrejme neratam systemy T-Bios a Azorados ;]).

Prve co potrebujeme je skompilovat instalator sifrom patchu. Ten stiahneme z Cygnusovej stranky z baliku http://cygnus.speccy.cz/download/utility/sifrompatch/2014-05-05_sif-rom_patch.tar.bz2 . Tento instalator predpoklada, ze mame v pocitaci ISOROM, do ktorej sa da povolit zapis, co nemame. Mame ale divide, takze upravime install.za, asi takto:

        cpu    z80undoc
        org    32768

ROMINRAM    equ    49152    ;0xC000

INSTALL_START
        ;load standard ROM to RAM
        ld    hl,0
        ld    de,ROMINRAM
        ld    bc,16384
        ldir

        ; write patches to RAM copy of ROM
        ld    hl,SIF_SAVE_PATCH
        ld    de,ROMINRAM+1218            ; 0x04c2 = 1218        SA-BYTES
        ld    bc,SIF_SAVE_PATCH_LN
        ldir

        ld    hl,SIF_INIT_PATCH
        ld    de,ROMINRAM+1294            ; RANDOMIZE USR 1294    INITIALIZE SIF
        ld    bc,SIF_INIT_PATCH_LN
        ldir

        ld    hl,SIF_LOAD_PATCH
        ld    de,ROMINRAM+1366            ; 0x0556 = 1366        LD-BYTES
        ld    bc,SIF_LOAD_PATCH_LN
        ldir

        ld    hl,SIF_CLR_PATCH
        ld    de,ROMINRAM+1494            ; RANDOMIZE USR 1494    CLEAR BUFFERS
        ld    bc,SIF_CLR_PATCH_LN
        ldir
        
;teraz budeme robit zlobu, a tak nechceme aby nas pri tom niekto vyrusoval
        di
        
;pozor, tu uz niet navratu, prepisujeme firmware v divide RAM
        ld    a,128    ;conmem+bank0
        out    (227),a
        ld    hl,ROMINRAM+8192
        ld    de,8192
        ld    bc,8192
        ldir

        ld    a,129    ;conmem+bank1
        out    (227),a
        ld    hl,ROMINRAM+8192
        ld    de,8192
        ld    bc,8192
        ldir

        ld    a,130    ;conmem+bank2
        out    (227),a
        ld    hl,ROMINRAM+8192
        ld    de,8192
        ld    bc,8192
        ldir

        ld    a,131    ;conmem+bank3
        out    (227),a
        ld    hl,ROMINRAM
        ld    de,8192
        ld    bc,8192
        ldir

        ld    a,64    ;mapram+bank0
        out    (227),a
        jp    0

        ret

SIF_SAVE_PATCH
        include        "save.za"
SIF_SAVE_PATCH_LN = $ - SIF_SAVE_PATCH

SIF_INIT_PATCH                    ; init po SAVE, protoŸe tam na nìj zbyde místo
        include        "init.za"
SIF_INIT_PATCH_LN = $ - SIF_INIT_PATCH

SIF_LOAD_PATCH
        include        "load.za"
SIF_LOAD_PATCH_LN = $ - SIF_LOAD_PATCH

SIF_CLR_PATCH
        include        "clear.za"
SIF_CLR_PATCH_LN = $ - SIF_CLR_PATCH

Skompilovanim ziskame takuto tapku: sifrom_install.tap

A toto je tapka, ktora po nahrati lubovolnym firmwarom nainstaluje sifrom do pamati divide. Takze si ju uz len ulozime na pamatove medium a po jej nahrati a spusteni sa nam „resetne“ pocitac, avsak uz bude aktivna sifrom, ktorej pouzitie najdete na Cygnusovych strankach: http://cygnus.speccy.cz/popis_sif_zxrom_patch.php

Teraz si ukazeme druhy sposob, ktory je vylucne pre MDOS3 pouzivatelov. Zacneme podobne, akurat install.za upravime tak, ze len vytvori obraz upravenej ROM v pamati a neulozi ho hned do divide. Uprava je jednoduchsia:

        cpu    z80undoc
        org    32768

ROMINRAM    equ    49152    ;0xC000

INSTALL_START
        ;load standard ROM to RAM
        ld    hl,0
        ld    de,ROMINRAM
        ld    bc,16384
        ldir

        ; write patches to RAM copy of ROM
        ld    hl,SIF_SAVE_PATCH
        ld    de,ROMINRAM+1218            ; 0x04c2 = 1218        SA-BYTES
        ld    bc,SIF_SAVE_PATCH_LN
        ldir

        ld    hl,SIF_INIT_PATCH
        ld    de,ROMINRAM+1294            ; RANDOMIZE USR 1294    INITIALIZE SIF
        ld    bc,SIF_INIT_PATCH_LN
        ldir

        ld    hl,SIF_LOAD_PATCH
        ld    de,ROMINRAM+1366            ; 0x0556 = 1366        LD-BYTES
        ld    bc,SIF_LOAD_PATCH_LN
        ldir

        ld    hl,SIF_CLR_PATCH
        ld    de,ROMINRAM+1494            ; RANDOMIZE USR 1494    CLEAR BUFFERS
        ld    bc,SIF_CLR_PATCH_LN
        ldir
        
        ret

SIF_SAVE_PATCH
        include        "save.za"
SIF_SAVE_PATCH_LN = $ - SIF_SAVE_PATCH

SIF_INIT_PATCH                    ; init po SAVE, protoŸe tam na nìj zbyde místo
        include        "init.za"
SIF_INIT_PATCH_LN = $ - SIF_INIT_PATCH

SIF_LOAD_PATCH
        include        "load.za"
SIF_LOAD_PATCH_LN = $ - SIF_LOAD_PATCH

SIF_CLR_PATCH
        include        "clear.za"
SIF_CLR_PATCH_LN = $ - SIF_CLR_PATCH


Skompilovanim dostaneme tapku: sifrom_create_mdos3.tap

Tuto tapku musime nejakym sposobom nahrat do pocitaca, ked uz mame MDOS3 nabootovany a do virtualnej mechaniky vlozeny bootdisk. To mozme docielit bud nejakou PC utilitou napr. mdos3_tool, ktora nam umozni import tap suboru do virtualnej diskety, alebo pomocou tape2wav (z baliku fuse-utils) tapku prevedieme na wav a „vypiskame“ do zx napriklad z PC zvukovej karty (na zx spectrum +2 mozno pouzit Mikeho kliniec ;]).

Ked uz instalator mame v pamati zx a po spusteni vytvori sifrom v pamati na adrese 49152, ulozime subory pre bootloader prikazmi:

 SAVE *"sifrom0" CODE 49152, 8192
 SAVE *"sifrom1" CODE 49152+8192, 8192

No a nakoniec musime zapisat novy system do bootconf.b . Toto je ta najzlozitejsia vec, ktora nas v pripade MDOS3 caka. Kedze ziaden editor na bootconf nemame, musime sa nejako vynajst. Jedna moznost je, vyexportovat ho do PC (uz spominanym mdos3_toolom), tam ho nejakou utilitou (napriklad hexeditom) zmenit a potom importnut naspat na bootdisk. Uznavam, celkom hardcore sposob, a tak skusime druhu moznost: pozriet sa ako vypada struktura konfiguracneho suboru http://ci5.speccy.cz/files/bootconf_cz.txt a konfiguracny subor upravit priamo na zx.

Bootconf je strukturovany celkom jednoducho. Cely subor sa sklada zo zaznamov o jednotlivych systemoch a je ukonceny bajtom 0. Kazdy zaznam obsahuje popisny text systemu, ktory sa vypise v menu pri boote a mena suborov, ktore su potrebne na nahratie systemu do pamate divide. Cize, my potrebujeme pripisat na koniec konfiguracneho suboru (pozor, nie na posledny bajt suboru, ale na ukoncovaci znak s kodom 0) popis povedzme text „SIFROM“ a ako mena suborov zapisat sifrom0 a sifrom1 s prislusnymi cislami divide ram baniek. A kedze clovek je tvor lenivy a pocitace su od toho aby mu robotu ulahcovali, napiseme si na to program v BASICu. Pamatate este doby, ked sa programy do pocitaca prepisovali napriklad z FIFA? Tak si tuto situaciu pripomenieme ;] :

 10 CLEAR 32767
 20 LOAD *"bootconf" CODE 32768
 30 LET addr=32768
 40 IF PEEK addr=0 THEN GO TO 100
 50 LET addr=addr+32: REM preskocime popis systemu
 60 REM teraz este musime preskocit subory
 70 IF PEEK addr<128 THEN LET addr=addr+11: GO TO 70
 80 LET addr=addr+1: REM a nakoniec preskocime ukoncovaci znak
 90 GO TO 40
 100 DIM a$(32)
 105 REM najskor zapiseme popis systemu
 110 LET a$="SIFROM"
 120 FOR i=1 TO 32
 130 POKE addr,CODE a$(i)
 140 LET addr=addr+1
 150 NEXT i
 155 REM a teraz zapiseme mena suborov
 160 LET c$="sifrom1"
 170 FOR i=0 TO 3
 180 POKE addr,i
 190 LET addr=addr+1
 200 IF i=3 THEN LET c$="sifrom0"
 210 FOR j=1 TO LEN(c$)
 220 POKE addr,CODE c$(j)
 230 LET addr=addr+1
 240 NEXT j
 250 FOR j=LEN(c$)+1 TO 10
 260 POKE addr,0
 270 LET addr=addr+1
 280 NEXT j
 290 NEXT i
 300 POKE addr,255: REM ukoncovaci znak systemu
 310 LET addr=addr+1
 320 POKE addr,0: REM ukoncovaci znak configu
 330 REM teraz vypocitame novu dlzku bootconfu
 340 REM dlzku zaokruhlime na sektory smerom nahor
 350 LET size=addr-32768
 360 LET size=size+511: LET size=512*INT(size/512)
 370 REM config ulozime
 380 SAVE *"bootconf" CODE 32768,size

 

Po spusteni tohto programu sa nacita bootconf.b do pamate, program najde koniec definicie suborov a na toto miesto zapise novy system. Bootconf nasledne opat ulozi na disk. Ak sme spravili vsetko tak ako sme mali, tak staci vypnut a zapnut pocitac a uz by sa nam mala v menu ukazat polozka „SIFROM“ a po jej vybere by mal pocitac „nabootovat“ do sifrom, ktorej pouzitie opat najdete na Cygnusovych strankach: http://cygnus.speccy.cz/popis_sif_zxrom_patch.php

 

Pozor, v oboch pripadoch (aj v specialnom pre mdos3, aj v univerzalnom pre lubovolny firmware) zostava vrchna cast „rom“ zapisovatelna, tak si davajte pozor co a kam zapisujete ;], nakoniec, je takto mozne overit uspesnost instalacie sifrom do divide. Po nainstalovani sifrom do divide, zadame jednoduchy prikaz:

POKE 15616,255

Ak bola sifrom uspesne instalovana, zmeni sa prvy bajt znakoveho fontu (konkretne znaku medzera), co by malo byt vidiet ihned po vypisani „0 OK, 0:1“

 

Povodne som chcel napisat co to aj o dalsej utilitke pre sif, ale to uz necham na niektory dalsi clanok ;]

-ub

3 názory na “ZX a SIF

  1. Ahojte, a jak to pak funguje v praxi? Chápu, že linuxáci asi podrstčí z dialogového řádku takto upravené SIFROM svou TAP. Jak je to u Windows? Nebo se load/save deje pres FTP?

  2. Proč je zde možnost komentáře, když mi nikdo neodpoví? Nicméně, vyřešeno již na pandoře. Hood

  3. Prepac Hood, zabudol som adminovat hlavne pocas dovolenky. Zial spamu chodi viac ako efektivnych komentarov a preto je zapnute aktivne schvalovanie admina.

Pridaj komentár