Text Machine

 Programy  Komentáře nejsou povolené u textu s názvem Text Machine
Úno 152005
 

Naskenoval jsem Chipovi manuál a diskety od TEXT MACHINE. Pokud je taky někdo chcete, tak jsou tady: Celý článek »

Úno 092005
 

Pro napsání první samostatné aplikace nám ještě schází si vysvětlit, jak funguje vstup od uživatele: z klávesnice. Jestli jste četli Assembler a ZX Spectrum 1, tak dnešní díl nepřinese nic nového, většinou budu čerpat z této publikace a nakonec si ukážeme na ROM nezávislý program na čtení klávesnice, který je v MDOS3. Celý článek »

UTULITY pro PC

 Programy  Komentáře nejsou povolené u textu s názvem UTULITY pro PC
Led 122005
 

V taputils.zip najdete hlavně programy Tapto0 a 0totap na převody z formátů .000 a .TAP (to se může hodit) pro DOS od Busyho, taputils_1.04a_linux.tar.bz2 je pro Linux od Tritola.

Utility pro Realspec (tap2mbd, tap2d80, d802tap). V souboru tools-realspec_win32.zip jsou programy pro Windows, v souboru tools-realspec_linux.tar.bz2 jsou zdrojové kódy a MakeFile pro Linux.

Programy TAP2MBD a TA2D80 převádí TAP soubory do image disket pro MB-02 a D80 ve formátu pro emulátor RealSpec. Opačně pak D802TAP pak provádí převod z D80 image do TAP souboru. Autorem těchto programů je Marek Zima, pro moderní překladače přizpůsobil Tritol.

Pokec k TAP2D80: Program bere jednotlivé bloky z TAP souboru a láduje je do existujícího image. Pokud image neexistuje, založí ho. Jméno diskety je voleno podle výstupního souboru. Syntaxe příkazu je: tap2d80 tapfile.tap d80file.d80 p/P (parametr P je PAUSE, pokud budete prg. spouštět jako já z příkazové řádky Windows Commanderu, tak se vám automaticky nezavře, ale bude čekat, až si prohlídnete, co se na obrazovce dělo). Pokud program narazí ve FAT na vadný sektor, skončí. Image s vadnými sektory je na nic. Existující image je kontrolován na značku DOSu a formát diskety (musí být SDOS a 80x9x2). Bezhlavičkové soubory jsou převáděny na soubory s příponou H které mají flag byte uložen v adresáři na místě 19.byte (před atributy). To umožňuje programům MASTERcopy, TOOLS 128 a D802TAP je uložit na TAPE nebo do TAPu opět bez hlavičky a se správným flagem. Atributy jsou vytvářeny výchozí jako u Basicu a to
RWED.

Pokec k D802TAP: co k němu dodat. Přečtěte si odstavec výše a všechno si otočte. Snad jen, že nepřevádí Snapy a seQuence a jiné Basicem nepodporované přípony. Výjimku tvoří H (bezhlavičky).

Pokec k TAP2MBD: Bude časem, zatím z toho nevěšte hlavy ani sebe.

Stažení:

bin2tap
kompiler AS

Led 092005
 

Vidíte, že použití programů z ROM nemusí být zrovna to pravé ořechové, proto si ukážeme vlastní program na tisk znaků, který si můžete ještě nějak vylepšit. Výhoda je třeba v tom, že se nemusíme starat o otevírání správného kanálu nebo si můžeme definovat vlastní font a nemusíme být odkázání na font v ROM.

Vyzkoušejte tento základní prográmek a studujte rozdělení obrazovky:

        cpu     z80undoc
        relaxed on

        org     25000
        ld      hl,16384    ;nastav pozici
        ld      (POZICE),hl ;uloz ji do promenne
        ld      a,'A'       ;znak A
        call    znak        ;vytiskni
        ld      a,'B'       ;znak B
        call    znak        ;vytiskni
        ret                 ;vrat se

ZNAK    sub     32         ;odecti tak aby znak byl od nuly
        ld      l,a        ;pismenko je nyní v HL
        ld      h,0        ;horni  byte na nula
        add     hl,hl      ;nasob 2x
        add     hl,hl      ;nasob 4x
        add     hl,hl      ;nasob 8x
        ld      de,FONT    ;adresa fontu
        add     hl,de      ;adresa predlohy pismenka = font + (8*(znak-32))

        ld      de,(POZICE) ;adresa pozice na obrazovce
        push    de          ;musi byt presne v atributu

        ld      b,8        ;smycka s 8 pruchody
znak1   ld      a,(hl)     ;vezmi predlohu znaku
        ld      (de),a     ;dej ji do obrazovky
        inc     hl         ;pozun se na dalsi byte predlohy
        inc     d          ;posun se o byte dolu
        djnz    znak1      ;opakuj 8x - vykresli cele pismenko

        pop     de         ;vyzvedni adresu pozice
        inc     e          ;posun ji o jeden znak vpravo
        jr      nz,znak2   ;pokud neni prekrocena tretina, tak je to OK
        ld      a,d        ;vyssi bajt adresy do A
        add     a,8        ;pricti tretinu obrazovky
        ld      d,a        ;a dej ji zpet
        cp      88         ;pokud by presahla treti tretinu,
        jr      c,ZNAK2    ;nepresahne, skok
        ld      d,64       ;tady presahne, tak nastav prvni tretinu

ZNAK2   ld      (POZICE),de ;uloz pozici na priste
        ret                ;navrat zpet

POZICE  dw      16384       ;zde se uklada pozice
FONT    equ     15616       ;zde je definovan font

Jesti tedy někdo touží po vlastním fontu, musí si jej nakreslit (třeba v Art studiu) a ve zdrojáku na něj odkázat třeba: FONT binclude font.bin nebo jej může mít definován jako blok čísel pomocí db, asi takto:FONT db 0,60,66,….

Zde se hodí vysvětlit, jak jsme došli k adrese, kde je uložena předloha toho konkrétního písmenka: Na adrese 15616 začíná předloha znaku “ “ (mezera). Tento znak má kód 32 (dekadicky). Každé písmenko má 8 bajtů dlouhou předlohu, tedy musíme od písmenka odečíst číslo 32 (aby se to vyrovnalo), vynásobit 8x a přičíst 15616.

Tento prográmek je možné ještě vylepšit. třeba výpočet adresy předlohy by šel zkrátit tak, že se nebude odečítat 32 a místo adresy FONT se zadá FONT-(32*8). Program tiskne tak, že to, co bylo na obrazovce jako podklad, se smaže a písmenko se vykreslí. Toto by se dalo taky velice snadno zařídit:

        ld      b,8        ;smycka s 8 pruchody
znak1   ld      a,(de)     ;vezmi byte z obrovky
        or      (hl)       ;pridej k nemu predlohu
        ld      (de),a     ;dej to vsechno do obrazovky
        inc     hl         ;pozun se na dalsi byte predlohy
        inc     d          ;posun se o byte dolu
        djnz    znak1      ;opakuj 8x - vykresli cele pismenko

Zkuste instrukci or (hl) nahradit xor (hl) nebo and (hl).

Taky vidíme, že zadání polohy na obrazovce není nic moc. Zadávat přímou adresu a navíc tak, aby byla vždy do atributu není zrovna to pravé. Takže zkusíme někde vyšťourat program, který nám adresu vypočte podle souřadnic (řádek,sloupec) zadaných v registrech b a c (b=řádek 0-23, c=sloupec 0-31):

ADRSET  ld    a,c      ;sloupec
        add   a,a      ;nasob 8x
        add   a,a
        add   a,a      ;dostaneme pixelovou pozici
        ld    c,a
        ld    a,b      ;radek
        add   a,a
        add   a,a
        add   a,a      ;opet pixel
        call  $22B0    ;prepocet pixelovych souradnic na adresu v pameti
        ld    (POZICE),hl ;uloz do promenne
        ret

Takze volani programu by mohlo vypadat asi takto:

START    ld    b,10      ;b=radek, c=sloupec
         ld    c,5       ;nebo kratsi zapis  (ld  bc,10*256+5)
         call  ADRSET    ;nastav pozici
         ld    a,'A'     ;znak k vytisteni
         call  ZNAK      ;vytiskni
         ret

Další vychytávkou by mohlo být nastavení barev. Musíme tedy adresu atributu na obrazovce vypočítat. Počítání je celkem jednoduché, dolní byte adresy se nemění, horní upravíme na číslo třetiny a k němu přičteme horní byte adresy začátku atributů ($5800).

ATTRIB  ld     hl,(pozice)    ;precti adresu pozice
        ld     a,h
        sub    $40            ;posunuti pocatku adresy do nuly
        rrca                  ;deleni 8
        rrca
        rrca
        and    3              ;v A je nyni cislo tretiny
        add    a,$58          ;posun do attributu
        ld     h,a            ;do vyssiho bajtu, nizsi je stejny
        ld     a,(COLOR)      ;uloz do promenne
        ld     (hl),a
        ret
COLOR   db     0

Úprava programu je pak asi taková, že po vykreslení znaku (po instrukci djnz znak1 napíšte call ATTRIB a je to hotové.

Domácí úkol bude dnes o hodně složitější a budu trvat na tom, aby jej alepoň někdo, kdo měl zájem na tomto seriálu, splnil. Rutina ZNAK umí tiskat do attributových souřadnic. Navrhněte řešení, které by umělo tiskat písmenko s dvojitou výškou do libovolné polohy po ose y (po ose x ne, to by vyžadovalo mnohem více prostoru). Tedy tak, abych programu ADRSET zadal číslo řádku od 0 do 184 a číslo sloupce od 0 do 31 a on dokázal na tuto pozici znak vytisknout (bez atributů). A aby to nebylo zas tak složité, napíši sem rutinu, která posune registr de o bajt níže v obrazovce, nehledě na její rozložení třetin.

DOWNDE  inc   d       ;posun v ramci textoveho radku
        ld    a,d     ;je jednoduchy
        and   7       ;neni-li prekrocen
        ret   nz      ;vrat se zpet
        ld    a,e     ;prechod mezi textovymi radky
        add   a,32    ;pokud pri pricitani dojde k preteceni
        ld    e,a     ;je to signal, že doslo k prechodu
        ld    a,d     ;mezi tretinami
        jr    c,DOWNDE2 ;hotovo a tedy odskok
        sub   8       ;jeste zbyva uprava horniho bytu
        ld    d,a     ;pri prechodu mezi tretinami
DOWNDE2 cp    88      ;test opusteni obrazovky
        ret   c       ;nedoslo, navrat
        ld    d,64    ;doslo, uprav na zacatek
        ret           ;navrat

O splnění úkolu mě informujte mailem a poštete mi zdrojový kód řešení.

pismo 2 vyska