Zx assembler - secțiunea 8 - reprezentarea numerelor binare-zecimale

Reprezentarea numerelor lexicale colineare lexicale.

Reprezentarea zecimală codată binar în limba engleză este abreviată ca BCD
(DECIMAL CODAT BINAR). Aceasta este o modalitate de a prezenta informații în formă zecimală.






UI.

Pentru a codifica fiecare cifră de la 0 la 9, sunt necesare doar 4 biți și 6 admisibile
codurile nu vor fi utilizate în această vizualizare.

Deoarece aveți nevoie de 4 biți pentru a codifica o cifră zecimală, fiecare octet poate fi
codificați două cifre. Aceasta se numește reprezentare zecimală codată binar.

De exemplu, 0000 0000 este o reprezentare zecimală codată binar
numărul zecimal 00
1001 1001 - reprezentare zecimală codată binar
numărul zecimal.

Operații aritmetice pe coduri binare
numere zecimale

O notație ciudată pentru reprezentarea numerelor poate duce la potențial
probleme suplimentare și scădere,
încercați să adăugați următoarele numere
BCD 08 0000 1 00
BCD 03 0000 0011

BCD ȘI 0000 1011

Veți observa că rezultatul celei de-a doua operațiuni este incorect și este inacceptabil * în
codul zecimal codificat binar. Pentru a compensa aceste dificultăți,
Utilizați o comandă specială, "DAA", numită "setări aritmetice zecimale
acțiuni "pentru a corecta rezultatul adăugării, adică adăugați 6 dacă rezultatul este mai mare decât
9 a).

Următoarea dificultate este ilustrată de același exemplu, un bit de transport va fi generat de la
cea mai mică cifră a numărului zecimal codat binar (primul) până la cifra din stânga.
Acest transfer intern trebuie să fie contabilizat și adăugat la al doilea cod binar codificat -
decimal Nogo.

Pentru a detecta acest transfer, utilizați pavilionul "half carry", "n".

ld а, 12н: încărcare literală bcd "12"
adăugați a. 24n: adăugați literal bcd "24"

daa: D rezultat reglabil

LD (ADDR), a: REZULTAT STOC
LOAD LITERAL - încărcați literal - ADĂUGAȚI LITERAL - adăugați literal; DECIMAL ADJUST RESULT -
Setarea zecimală a rezultatului REZULTAT DE STOC - stocarea rezultatului.

La programare, nu veți avea nevoie de o zecimală codificată binar
reprezentare. Dar este frumos să știm că chipul Z80 încă acceptă această viziune și
Echipa DAA face viața mai ușoară pentru un grup mic de utilizatori zecimale codificați binar.
Reprezentarea Foot.

O întrerupere este un semnal trimis către microprocesor, care poate apărea în orice
timp și, în general, pauză execuția programului curent (astfel încât programul da-
nu știe despre asta).

Z80 oferă trei mecanisme de întrerupere: cererea de magistrală (BUSRG)
Interpretare mascată (NMI) și întrerupere normală (INT).

Din punctul de vedere al programării, vom lua în considerare numai întreruperea obișnuită mascată

Comanda DI (bloc de întrerupere) este utilizată pentru resetare (mascare) și comanda EI
(deblocați întreruperea) pentru instalare (demascare).

În cazul general, o întrerupere normală va avea ca rezultat contorul de comandă curent
plasat pe stivă și gestionare (în original, este posibilă o tipografie.
Notă. per. ). Utilizarea comenzii RST va fi transferată la pagina zero a ROM-ului. Pentru a reveni
Comanda RETI (revenire din întrerupere) este necesară din întrerupere.

În condiții normale de funcționare, întreruperile "Spectrum" sunt deblocate (EI), și chiar
programul este întrerupt de 50 de ori pe secundă. Această întrerupere permite programului ROM să fie
Efectuați o scanare de tastatură.

Este posibil să fie necesar să blocați întreruperile din programul dvs., deoarece este vorba despre un an
executie ryaet. Puteți primi în continuare informații de la tastatură, în condiții
utilizați propriul program pentru acest lucru. Asigurați-vă că ați deblocat funcția de întrerupere-
când programul este terminat, în caz contrar, sistemul nu va putea să primească mesaje in-
formarea de la tastatură.

Comanda de repornire (RST)

Aceasta este cel mai probabil "rudimentele" cipului 8080, implementate în scopuri de compatibilitate. prin urmare
este puțin probabil să utilizați comanda RST în programul dvs.

Avantajul comenzii RST este că se pot apela rutine utilizate frecvent
folosind doar un octet. În plus, echipa RST ia timp,
decât comanda CALL.

Dezavantajul comenzii RST este acela că poate fi folosit numai pentru a aborda întrebările de tip one-
din cele opt celule admise de mai sus.

Deoarece toate aceste celule sunt situate în ROM, puteți profita de acest avantaj.
în propriul program. Există, totuși, posibilitatea de a utiliza subrutine
ROM. dacă știți ce fac și folosiți comenzile RST.

puteți afla mai multe despre echipele RST din cartea noastră "ÎNȚELEGEREA SPECTRUMULUI",
scris de Dr. Jan Logan.

Scrierea programelor aay "Spectrum"
Planificarea programului în limba mașinii

Programarea în limba mașinii are o flexibilitate extraordinară în sensul că
vă permite să faceți orice. '

Deoarece din toate limbile de nivel superior, în cele din urmă,
limbaj, orice puteți programa în Fortran sau Cobol, sau
oricare altul, poate fi programat în limbajul mașinii.

Un avantaj suplimentar este că programul este implementat în limbajul mașinii
mai repede.

Cu toate acestea, flexibilitatea absolută poate fi, totuși, o capcană pentru un programator neatent.
Mista. Cu o asemenea libertate totală, puteți face orice. Spre deosebire de opera-
sistemul de spectru "Spectrum" pentru limba BASIC ", de exemplu, nu există verificări de validare
cu privire la admisibilitate.

Deoarece numerele pe care le introduceți vor fi comenzi de un tip sau altul, chipul Z80 va fi
pentru a procesa totul în lume.

Dar chiar fără a lua în considerare problema validării sintaxei, trebuie remarcat,






că programarea în limbajul mașinii nu impune restricții asupra a ceea ce utilizați
logică: puteți efectua funcții, tranziții etc. ceea ce va fi absolut inacceptabil
în orice limbă de nivel superior.

Prin urmare, auto-disciplina în dezvoltarea de programe pentru mașină-
limba Dl. Este imposibil să exagerezi importanța conceptului de abordare "de sus în jos" în programare
ca întreg, dar în special aceasta se aplică programării în limbajul mașinii.

Abordarea "de sus în jos" vă forțează să împărțiți problema în unități mai mici și permite
Verificați logica dezvoltării dvs., pentru o perioadă lungă de timp, fără a scrie un singur
linii din textul programului.

Să presupunem că ați vrut să scrieți un program de aterizare pe Lună:
în primul rând, ar putea aminti ceva de genul:
INSTR emite instrucțiuni pe ecran

reveniți la INSTR până la apăsarea cheii

DRAW pentru a desena un peisaj. pentru a începe coborârea

dispozitivul din partea de sus a ecranului
Deplasarea vehiculului în coborârea LAND

dacă combustibilul este epuizat, mergeți la CRASH
Du-te înapoi la LAND dacă suprafața nu este
atins
Felicitări de imprimare GROUND

reveniți la INSTR pentru următoarea fugă
CRASH imprimă condoleanțe pe site-
cuști

Du-te înapoi la INSTR pentru următoarea fugă.

Rețineți că întregul "program" este scris în limba rusă. În acest stadiu nu există
nu s-au luat decizii dacă programul va fi scris în limba "BASIC"
limba Dl. O astfel de decizie nu trebuie acceptată - conceptul unui program de aterizare pe Lună nu este
depinde de modul în care este scris.

Acum vine pasul unui control logic.

Efectuați rolul SOM și vedeți dacă toate oportunitățile pe care ați dorit să le includeți în
program, sunt disponibile.

Există vreo tranziție la obiectele pe care ați vrut să le scrieți, dar ați uitat? Fie că este totul? nu

dacă programele redundante. Nu ar trebui ca anumite obiecte să fie transferate în subrutine.

Să ne uităm din nou la program "- oh-ooh-ooh! - Nu, ai uitat să termini cumva
Programul!

Logica descrisă mai sus poate fi perfectă pentru unele aplicații, cum ar fi
computer de jocuri, dar în programul tău te poți prinde în cap ca ar fi frumos să ai ocazia
opriți programul.

Acum schimbăm ultima parte a programului după cum urmează:
Felicitări de imprimare GROUND
du-te la

CRASH imprimă condoleanțe pe site-
cuști

Finish cereți jucătorului dacă trebuie să terminați
dacă nu, mergeți la INSTR
dacă da, STOP

Rețineți că am folosit etichete pentru a descrie anumite linii ale programului.
noi. Etichetele sunt un dispozitiv foarte valoros, mai ales dacă le alegeți pe scurt și pe
de susținere.

Când acest nivel este complet, vă deplasați la un nivel mai profund pentru a face același lucru
cel mai mult cu unul dintre corzile sau modulele enumerate mai sus.
De aceea, această abordare este numită de sus în jos.

De exemplu, putem scrie modulul FI-NISH după cum urmează:
Finalizați ecranul clar

print: "Vrei să termini?"
Interrogați tastatura în așteptarea unui răspuns
dacă răspunsul = da, atunci terminați
mergeți la INSTR

Un alt avantaj al abordării de sus în jos este că puteți testa și
să execute un modul specific în mod autonom, astfel încât să fie depanat pentru includerea în final
textul programului.

Să mergem în jos un nivel mai mult și uita-te la linia pentru a șterge ecranul mai sub-
detaliu.

În acest stadiu, trebuie să decidem în ce limbă să scriem programul, și să lăsăm
alegem limbajul mașinii "sinkler".

Dacă ați scrie un program în BASIC, atunci ar fi suficient să scrieți:
900 CLS,

dar în limbajul mașinilor, această simplă propoziție de "curățare a ecranului" se poate dovedi a fi înșelătoare.
(Deci, în original, nu există paranteze.) (Notă.)
Aș putea face astfel:
CLEAR găsiți începutul ecranului

completați următoarele 6144 de elemente rând cu spații
Încă nu a scris o singură linie a textului programului, dar, evident, abordarea se bazează pe
limbajul mașinii. Să aruncăm o privire mai atentă la ceea ce ar trebui să facă acest program
curățând ecranul și ceea ce face în realitate.

Puteți reține din ghidul "Spectrum" că ecranul este format din celule 6144 și
că există 768 de celule care descriu atributele ecranului: culoarea hârtiei, culoarea cernelei și așa mai departe.

Descrierea scurtă de mai sus a programului va elimina, desigur, o parte din ecran, dar în niciun caz
nu va afecta fișierul atribut. Dacă nu toate pozițiile ecranului au aceeași culoare ca hârtia sau
Dacă pozițiile anumitor litere au atributele intermitente sau luminozitatea incluse, atunci clare
Programul de curățare a ecranului menționat mai sus va fi clar inadecvat.

De asemenea, va trebui să procesăm fișierul atribut. (Observați cât de dificilă este
există unele probleme în limba mașinii decât în ​​limba BASIC)

Prin urmare, trebuie să extindem programul la tipul următor
găsiți începutul ecranului

umpleți următorii 6144 octeți cu spații
găsiți începutul fișierului atribut

umpleți următorii 768 octeți cu valorile necesare ale atributelor hârtiei (cerneală)
următorul nivel de mai jos este același; pe care trebuie în cele din urmă să scrieți

textul programului, așa că să vedem cum se umple ecranul în pasaje:

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

LOOP LD (ftL), D: FILL BLANK
INC HL: poziție ulterioară
DEC Su: REDUCE COUNT
LD a, în

SAU c: TEST IF bc = 0

JR NZ, LOOP: DACĂ NU SUNT SFÂRȘIT

SCREEN START - începutul ecranului; BYTES apoi CLEAR - eliminat octeți: BLANK - spațiu; FILL
BLANK - blanking: NEXT POSITION - poziția următoare; REDUCE COUNT - scade
contor; TEST - verificați; Din nou, dacă nu ENL - repetați dacă nu se ajunge la capăt.

Acum puteți lucra cu ușurință cu programe de această lungime și în acest fel
construi programe destul de mari.

Apropo, acum, fără îndoială, înțelegeți de ce programele în limbajul mașinii sunt adesea așa
mare în domeniul de aplicare și de ce oamenii au inventat programe în limbi de nivel înalt!

Există mai multe răspunsuri "corecte" - singurul test este dacă funcționează?
Cu alte cuvinte, programul face ceea ce aveți nevoie.

Cu ajutorul DJNZ ":
CLEAR LD HL, SCREEN
LD a, 0

LD in, 24: SET in = 24
BIGLOOP PUSH Sun: Salvează VALOAREA
LD în, a: SET în = 256
LITLOOP LD (ftL), a:

INC HL: Completați 256 de blocuri
DJNZ LITLOOP

pop toate: GET VALOARE BACK din IN
DJNZ BIGLOOP: Fă-l până la sfârșit

SET - set; SALVAREA VALORII - rețineți valoarea; Completați 256 BLANKS - completați 256
lacune; GET VALOAREA BACK a valorii de intrare înapoi; FACEȚI PÂNĂ LA SFÂRȘIT - efectuați până la
ajungând la final.

Nr. Ar putea folosi 24 de ori 256 (= 6144) pentru a curăța ecranul.

Trebuie remarcat următoarele:

Putem seta v = 0 pentru a trece prin ciclul DJNZ de 256 de ori. (de ce?) Această procedură este de obicei
Nu va fi folosit în program decât dacă folosim registrul c pentru
pentru alte scopuri.

CLEAR LD HL, SCREEN: SOURCE
PUSH HL
pop DE

INC DE: DEST = HL + 1
LD vs 6144: CÂȘTILE
LD (HL). 0: LAT POS = 0
LDIR: MiVE IT

SOURCE - sursă; CUM - cât de mult; LAT - prima; MOVE - peoemechenie.

Rețineți că am obținut DE = HL + 1, setând DE = HL și oferind incrementul DE.
Acest lucru se poate face mai ușor prin încărcarea directă a valorii SCREEN + 1 în DE, dar pentru woro
necesită un octet mai mult!

Motivul pentru care această comandă LDIR este declanșată este că este utilizată
faptul că în timpul procesării datele sunt suprascrise în bloc. Aici,
cu un rezultat pozitiv al problemei considerate de noi în capitolul privind blocurile în mișcare.

Dacă rezuma memoria necesară, prima metodă necesită 14 octeți,
al doilea - 16 octeți, și la ultimii 13 octeți.

Secțiunea 2 - Cum se execută programul în limba mașinii. Furculițele aluzei în ZX SPECTRUM.

Secțiunea 3 - steaguri și aplicarea acestora. Creșteți și micșorați numărul. Operațiunile aritmetice ale impozitării a 8-rith prin numere simple.

Secțiunea 4 - operatori logici. Lucrați cu numere pe 16 biți.

Secțiunea 5 - lucrul cu stiva. Operații aritmetice. Cicluri și tranziții.

Secțiunea 6 - Blocarea operațiunilor. Comenzi mai utilizate pe scară largă Z80.

Secțiunea 7 - setarea și resetarea biților. Schimburi. Intrare și ieșire.

Secțiunea 8 - reprezentarea numerelor zecimale binare. Intrerupere. Comandă de repornire (RST).

Secțiunea 9 - înseamnă "Spectrul ZX".

Secțiunea 10 - programul de monitorizare EZ COPE.

Secțiunea 11 - Programul de monitorizare pentru descărcarea textului programului în limba mașinii în formatul HEXLOAP hexazecimal.

Secțiunea 12 - tabelul pentru conversia zecimalelor.







Trimiteți-le prietenilor: