Zx assembler - 8. rész - bináris-decimális számok ábrázolása

Az lvoic-collineáris lexikai számok ábrázolása.

A bináris kódolású tizedes ábrázolás angolul rövidítve BCD
(BINÁRIS KÓDOLT DECIMÁLIS). Ez az egyik módja annak, hogy az adatokat decimális formában jelenítsük meg.
NE.

A 0-tól 9-ig terjedő számjegyek kódolásához csak 4 bitre van szükség, és 6-ra van szükség
kódok nem használhatók ebben a nézetben.

Mivel 4 bitet kell megadni egy decimális számjegy kódolásához, minden byte lehet
két számjegyet kódol. Ezt bináris kódolású decimális ábrázolásnak nevezik.

Például 0000 0000 bináris kódolt tizedes ábrázolás
decimális szám 00
1001 1001 bináris kódolt tizedes ábrázolás
decimális szám.

Számtani műveletek bináris kódolással
decimális számok

A számok ábrázolásának furcsa jelölése potenciálhoz vezethet
problémák hozzáadása és kivonása,
próbálja meg hozzáadni a következő számokat
BCD 08 0000 1 00
BCD 03 0000 0011

BCD ÉS 0000 1011

Észre fogja venni, hogy a második művelet eredménye helytelen, és elfogadhatatlan * a
bináris kódolt decimális szám. E nehézségek kompenzálása érdekében,
Használjon egy speciális parancsot, a "DAA" -t, amelyet "decimális aritmetikai beállításoknak" neveznek
műveletek "a kiegészítés eredményének kijavításához (azaz add 6, ha az eredmény nagyobb mint
9. a).

A következő nehézséget ugyanaz a példa mutatja, egy hordozót generálnak
a bináris kódolású decimális szám legalacsonyabb számjegye (legelső) a baloldali számjegyhez képest.
Ezt a "belső átvitelet el kell számolni és hozzá kell adni a második számjegyű, binárisan kódolt"
Nogo tizedes.

Az átvitel észleléséhez használja a "half carry" zászlót, "n".

ld а, 12н: betöltési literál bcd "12"
add a. 24n: add literális bcd "24"

daa: D ecimal adjustment eredmény

LD (ADDR), a: TÁROLÓ EREDMÉNY
LOAD LITERAL - literális betöltés - ADD LITERAL - adjunk hozzá literál; DECIMÁLIS ADJUST EREDMÉNY -
Az eredmény decimális beállítása TÖRLÉS EREDMÉNY - az eredmény tárolása.

Programozáskor alig lesz szükség egy bináris kódolású decimálisra
képviselet. De jó tudni, hogy a Z80 chip még mindig támogatja ezt a nézetet, és
A DAA csapat megkönnyíti az életet a bináris kódolt tizedes felhasználók egy kis csoportjához.
Foot képviselet.

A megszakítás a mikroprocesszorba küldött jel, amely bármelyikben megjelenhet
és általában megszünteti az aktuális program végrehajtását (így a program igen-
nem tud róla).

A Z80 három megszakítási mechanizmust biztosít: Bus request (BUSRG), non-
Maszkos megszakítás (NMI) és normál megszakítás (INT).

A programozás szempontjából csak a szokásos maszkos megszakítást vesszük figyelembe

A DI parancs (megszakítási blokk) a visszaállítás (maszkolás) és az EI parancs használatára szolgál
(feloldja a megszakítást) a telepítéshez (lefejtés).

Általános esetben egy normál megszakítás az aktuális parancspultot eredményezi
a veremre helyezve, és a menedzsment (az eredetiben lehet egy tököt megadni.
Megjegyzés. per. ). Az RST parancs használata átkerül a ROM nulloldalára. Visszatérés
A megszakításból a RETI parancs (visszatérés a megszakításból) szükséges.

Normál működés esetén a "Spectrum" megszakítások nyitva vannak (EI), és éppen
a program másodpercenként 50-szer megszakad. Ez a megszakítás lehetővé teszi a ROM programnak
Végezzen billentyűzettel.

Lehet, hogy meg kell akadályoznia a megszakításokat a programban, mert ez egy
ryaet végrehajtását. A billentyűzetről továbbra is információkat kaphat, feltételek mellett
ehhez saját programot használjon. Ügyeljen arra, hogy oldja fel a megszakítás-
ha a program befejeződött, ellenkező esetben a rendszer nem képes fogadni az in-
formáció a billentyűzetről.

Az újraindítás parancs (RST)

Ez valószínűleg a 8080-as chip "alapja", kompatibilitási célokra. ezért
akkor valószínűleg nem használja az RST parancsot a programban.

Az RST parancs előnye, hogy gyakran használatos rutinokat lehet hívni
csak egy byte-ot használ. Emellett az RST csapata is időt vesz igénybe,
mint a CALL parancs.

Az RST-parancs hátránya, hogy csak az egy-
a fenti nyolc engedélyezett sejt közül.

Mivel mindezek a sejtek ROM-ban találhatók, kihasználhatja ezt az előnyöket.
saját programjában. Van azonban lehetőség a szubrutinok használatára
ROM. ha tudod, mit csinálnak, és így használják az RST parancsokat.

többet tudhat meg az RST csapatokról a "A SPECTRUM MEGSZAKÍTÁSA" című könyvünkben,
írta Dr. Jan Logan.

Programok írása a "Spectrum"
A program tervezése gépi nyelven

A gépi nyelvű programozás rendkívüli rugalmasságot jelent abban az értelemben, hogy
lehetővé teszi, hogy bármit megtegyen. '

Mivel minden magasabb szintű nyelvről végső soron,
nyelv, bármi, ami Fortranban vagy Cobolban programozható, vagy
bármely más, gépi nyelven programozható.

További előnye, hogy a program a gép nyelvén valósul meg
gyorsabb.

Az abszolút rugalmasság azonban lehet egy csapda a gondtalan programozó számára.
Mista. Ilyen teljes szabadsággal bármit tehetsz. Ellentétben az opera-
például a BASIC nyelv "Spectrum" rendszere, például nincs érvényesítési ellenőrzés
az elfogadhatóságról.

Mivel az Ön által megadott számok egy vagy másik típusú parancsok lesznek, a Z80 chip lesz
hogy dolgozzon mindent a világon.

De anélkül, hogy figyelembe kellene volna venni a szintaxis érvényesítésének problémáját, meg kell jegyezni,
hogy a gépi nyelvű programozás nem korlátozza az Ön által használtakat
logika: funkciókat, átmeneteket stb. ami teljesen elfogadhatatlan
minden magasabb szintű nyelven.

Ezért önfegyelem a gépi programok fejlesztésében,
Mr. nyelvet. Nem lehet túlzó a "top-down" megközelítés koncepciójának fontossága a programozásban
egészében, de különösen ez a gépi nyelv programozására vonatkozik.

A "felülről lefelé" megközelítés arra kényszeríti Önt, hogy a problémát kisebb egységekre bontsa és lehetővé teszi
Nézd meg a fejlesztés logikáját, sokáig egyetlen írás nélkül
a program szövegének sorai.

Tegyük fel, hogy programot szeretne írni a holdra való leszállásra:
az első út emlékezhetne valamire, mint ez:
INSTR utasításokat ad ki a képernyőre

térjen vissza az INSTR-be, amíg a billentyűt lenyomja

DRAW rajzolni egy tájat. hogy elindítsa a süllyedést

a készüléket a képernyő tetején
LAND leereszkedő jármű mozgása

ha az üzemanyag kimerült, menjen a CRASH-hoz
Menj vissza a LAND-ba, ha nem a felület
elért
GROUND nyomtatott gratulálok

menj vissza az INSTR-ba a következő futamhoz
CRASH nyomtatni részvétét a sikertelen on-
ketrecek

Menjen vissza az INSTR-hoz a következő futamhoz.

Ne feledje, hogy ez az egész "program" orosz nyelven készült. Ebben a szakaszban nincs
nem hoztak döntést arról, hogy a programot a "BASIC" nyelven írják-e fel,
Mr. nyelvet. Egy ilyen döntést nem kell elfogadni - a holdra való leszállási program fogalma nem
attól függ, hogy hogyan íródott.

Most jön a logikai ellenőrzés lépése.

Ön elvégzi a SOM szerepét, és látja, hogy az összes olyan lehetőséget, amelyet be akart szerepeltetni a
program elérhető.

Vannak átmenetek olyan tárgyakra, amelyeket meg akartál írni, de elfelejtetted? Hogy minden van? nincs

akár redundáns programok. Vannak objektumok, amelyek nem kerülnek át szubrutinokra.

Nézzük meg újra a programot "- oh-ooh-ooh! - Nem. Elfelejtettem befejezni valamit
programot!

A fent leírt logika tökéletes lehet egyes alkalmazásokhoz, például
játék számítógépen, de a programban a fejébe juthat, hogy jó lenne egy lehetőség
kapcsolja ki a programot.

Most a program utolsó részét a következőképpen módosítjuk:
GROUND nyomtatott gratulálok
megy

CRASH nyomtatni részvétét a sikertelen on-
ketrecek

FINISH kérje meg a játékost, ha befejezni
ha nem, akkor menjen az INSTR
ha igen, STOP

Ne feledje, hogy címkéket használtunk a program egyes sorainak leírására.
mi is. A címkék nagyon értékes eszközök, különösen akkor, ha rövidebb és gyors választást választanak
támogató.

Amikor ez a szint befejeződik, akkor mélyebbre lépsz, hogy ugyanezt tegye
leginkább a fent felsorolt ​​karakterláncokkal vagy modulokkal.
Ezért hívják ezt a megközelítést felülről lefelé.

Például a FI-NISH modult a következőképpen írhatjuk:
FINISH világos képernyő

nyomtatás: "Befejezni akarja?"
Kérdezze meg a billentyűzetet várakozás közben
ha a válasz = igen, akkor fejezze be
menjen az INSTR

A top-down megközelítés másik előnye, hogy tesztelhet és
hogy egy adott modult autonóm módon futtathasson, így hibás lesz a zárójelbe való beillesztésre
a program szövege.

Menjünk még egy szintre, és nézzük meg a sort, hogy kitisztítsuk a képernyőt,
részletességgel.

Ebben a szakaszban el kell dönteni, hogy melyik nyelven fogjuk írni a programot, és légy
a "sinkler" gép nyelvét választjuk.

Ha egy BASIC-ban programot írt volna, elég lenne írni:
900 CLS,

de a gépi nyelvben ez a "tisztítás" egyszerű mondata kiderülhet, hogy megtévesztő.
(Tehát az eredetiben nincsenek zárójelek.) (Megjegyzés.)
Így tehetnénk ilyesmit:
CLEAR találja meg a képernyő elejét

töltse ki az alábbi 6144 sort tartalmazó sorokat
Még mindig nem írtak egyetlen programsorozatot, de természetesen a megközelítés alapja
gépi nyelv. Nézzük meg közelebbről, hogy mit kell ez a program
a képernyő tisztázása és tényleg.

A "Spectrum" útmutatóból arra lehet következtetni, hogy a képernyő 6144 cellából áll és
hogy 768 sejt található, amelyek leírják a képernyő tulajdonságait: a papír színe, a tinta színe stb.

A fenti rövid leírás természetesen tisztázni fogja a képernyőt, de semmiképpen sem
nem befolyásolja az attribútumfájlt. Ha nem mindegyik képernyő pozíciója ugyanolyan színű, mint a papír vagy
Ha egyes betűk pozíciói tartalmazzák a villogó vagy fényerő tulajdonságokat, akkor tiszta
A fent megadott képernyő tisztítóprogram egyértelműen nem megfelelő.

Az attribútumfájlt is feldolgoznunk kell. (Megjegyzés: mennyire nehezebb
a gépi nyelvben vannak problémák, mint a BASIC nyelvben)

Ezért a programot a következő típusra kell kiterjesztenünk
keresse meg a képernyő elejét

töltse ki a következő 6144 bájtot szóközökkel
keresse meg az attribútumfájl kezdetét

töltse ki a következő 768 bájtot a papír (tinta) tulajdonságainak előírt értékével,
a következő szint az alábbiak szerint ugyanaz; amelyen végre meg kell írni

a program szövege, ezért nézzük meg, hogy a képernyő hogyan tölti be a szakaszokat:

CLEAR LD HL, SCREEN: SCREEN START
LD vs, 6144: BYTES majd CLEAR
LD D, 0: D = BLANK

LOOP LD (ftL), D: FILL BLANK
INC HL: NEXT POZÍCIÓ
DEC Su: CSÖKKENTÉS COUNT
LD a, in

VAGY c: VIZSGÁLAT, HA bc = 0

JR NZ, LOOP: AMENNYIBEN NEM VÉGRE VAN

SCREEN START - a képernyő kezdete; BYTES, majd CLEAR - törölt bájtok: BLANK - space; TÖLTSE
BLANK - blank: NEXT POSITION - következő pozíció; CSÖKKENTÉS COUNT - csökkenés
számláló; TESZT - ellenőrzés; AGAIN IF NEM ENL - ismételje meg, ha a végét nem érte el.

Most már könnyedén dolgozhat a hosszúságú és ilyen módon működő programokkal
elég nagy programok létrehozása.

By the way, most már kétségtelenül érti, miért programokat a gépi nyelv gyakran így
nagy a hatóköre, és miért találtak rá az emberek a magas szintű nyelveken!

Több "helyes" válasz is létezik - az egyetlen teszt az, hogy működik-e?
Más szóval, a program megteszi, amire szüksége van.

A DJNZ segítségével ":
CLEAR LD HL, SCREEN
LD a, 0

LD in, 24: SET in = 24
BIGLOOP PUSH V.: ÉRTÉK MEGMENTÉSE
LD in, a: SET in = 256
LITLOOP LD (ftL), a:

INC HL: FILL IN 256 BLANKS
DJNZ LITLOOP

pop all: VISSZA AZ INNÁK VISSZAÁLLÍTÁSA
DJNZ BIGLOOP: VAGY MEGVALÓSÍTJA

SET - készlet; ÉRTÉK MEGMENTÉSE - emlékezzetek az értékre; FILL IN 256 BLANKS - töltse ki 256-ot
hiányosságokat; VISSZA ÉRVÉNYÉNEK VISSZAÁLLÍTÁSA - visszaadni az értéket; VIGYÁZZA MEG A VÁLASZT - Végezze el
elérte a végét.

Nem használhatja 24-szer 256 (= 6144) a képernyő tisztításához.

Meg kell jegyezni a következőket:

Beállíthatjuk a в = 0 értéket, hogy átkerüljünk a ciklusba DJNZ 256 alkalommal. (miért?) Ez az eljárás általában
Nem használható a programban, hacsak nem használjuk a c regisztert
más célokra.

CLEAR LD HL, KÉPERNYŐ: FORRÁS
PUSH HL
pop DE

INC DE: DEST = HL + 1
LD vs, 6144: HOGYAN
LD (HL). 0: LAT POS = 0
LDIR: MiVE IT

FORRÁS - forrás; HOW - mennyit; LAT - az első; MOVE - peoemechenie.

Figyeljük meg, hogy megkapjuk a DE = HL + 1 értéket, DE = HL értéket adunk, és megadjuk a DE növekményt.
Ezt könnyebbé teheti a SCREEN + 1 értékének DE-ben való betöltése, de a woro esetében
több bájtot igényel!

Az ok, amiért ez az LDIR parancs kiváltásra kerül, hogy használják
az a tény, hogy az adatok feldolgozása során az adatok felülíródnak a blokkban. Itt a
pozitív eredménnyel a problémát, amelyet a mozgó blokkokról szóló fejezetben megvizsgálunk.

Ha összefoglalja a szükséges memóriát, az első módszer 14 bájtot igényel,
a második - 16 bájt, és az utolsó 13 bájt.

2. rész - hogyan kell végrehajtani a programot gépi nyelven? A ZX SPECTRUM alvászusainak villái.

3. szakasz - zászlók és azok alkalmazása. Számok növelése és csökkentése. A 8-rith adózás számtani műveletei puszta számokkal.

4. szakasz - logikai szereplők. 16 bites számokkal dolgozni.

5. rész - a kötegeléssel foglalkozik. Számtani műveletek. Ciklusok és átmenetek.

6. szakasz - Blokk műveletek. A szélesebb körben használt Z80 parancsok.

7. rész - bitek beállítása és visszaállítása. Műszakban. Bemenet és kimenet.

8. rész - bináris-tizedes számok ábrázolása. Megszakítása. Indítsa újra a parancsot (RST).

9. szakasz - a "ZX Spectrum" kifejezést jelenti.

10. szakasz - monitorozza az EZ COPE programot.

11. szakasz - Monitor program a program szövegének gépi nyelven történő letöltésére a hexadecimális HEXLOAP formátumban.

12. rész - táblázat a tizedesjegyek konvertálásához.