Ratkaisuja täydellisen online-tietokanta- ja Internet-urakurssin luvun 4 ongelmiin alusta alkaen

Ratkaisuja Taydellisen Online Tietokanta Ja Internet Urakurssin Luvun 4 Ongelmiin Alusta Alkaen



Ongelmat ja niiden ratkaisut

1) Kirjoita konekieliohjelma, joka alkaa 0200 dollarista 6502 µP:lle ja lisää 2A94:n etumerkittömät luvut H (lisää) 2ABF:ään H (augend). Olkoon tulot ja lähdöt muistissa. Valmista myös koottu ohjelmadokumentti käsin.







Ratkaisu:



CLC
LDA 0213 dollaria
ADC 0215 dollaria
STA 0217 dollaria
LDA 0214 dollaria
ADC 0216 dollaria
STA 0218 dollaria



Koottu ohjelma:





2) Kirjoita konekieliohjelma, joka alkaa 0200 dollarista 6502 µP:lle ja vähentää etumerkittömät luvut, 1569 H (alaosa) 2ABF:stä H (minuendi). Olkoon tulot ja lähdöt muistissa. Valmista myös koottu ohjelmadokumentti käsin.



Ratkaisu:

SEC
LDA 0213 dollaria
SBC 0215 dollaria
STA 0217 dollaria
LDA 0214 dollaria
SBC 0216 dollaria
STA 0218 dollaria

Koottu ohjelma:

3) Kirjoita konekieliohjelma 6502 µP:lle, joka laskee $00:sta $09:ään silmukan avulla. Ohjelman pitäisi alkaa 0200 dollarista. Valmista myös koottu ohjelmadokumentti käsin.

Ratkaisu:

LDA #$09
STA $0220 ; X:n ja 09 dollarin vertailuun
LDX #$00
silmukka INX
CPX 0220 dollaria
BNE silmukka

Koottu ohjelma:

4) Kirjoita konekieliohjelma, joka alkaa 0200 dollarista 6502 µP:lle. Ohjelmassa on kaksi aliohjelmaa. Ensimmäinen aliohjelma lisää 0203:n etumerkittömät numerot H (augend) ja 0102 H (lisää). Toinen aliohjelma lisää summan ensimmäisestä aliohjelmasta, joka on 0305 H numeroon 0006 H (augend). Lopputulos tallennetaan muistiin. Kutsu ensimmäinen aliohjelma, joka on FSTSUB, ja toinen alirutiini, joka on SECSUB. Olkoon tulot ja lähdöt muistissa. Tuota myös koottu ohjelmadokumentti koko ohjelmalle käsin.

Ratkaisu:

SECSUB CLC
LDA $021A
ADC 0234 dollaria
STA 0236 dollaria
LDA 021 miljardia dollaria
ADC 0235 dollaria
STA 0237 dollaria
RTS

FSTSUB CLC
LDA 0216 dollaria
ADC 0218 dollaria
STA $021A
LDA 0217 dollaria
ADC 0219 dollaria
STA 021 miljardia dollaria
RTS

JSR FSTSUB

Koottu ohjelma:

5) Ottaen huomioon, että an ¯IRQ Käsittelijä lisää 02 dollaria 01 dollariin akussa ydinkäsittelynä ¯NMI on myönnetty, ja ydinkäsittely ¯NMI lisää $05 - $04 akussa, kirjoita kokoonpanokieli molemmille käsittelijöille mukaan lukien heidän kutsunsa. Puhelu osoitteeseen ¯IRQ Käsittelijän tulee olla osoitteessa 0200 dollaria. The ¯IRQ Käsittelijän pitäisi alkaa osoitteesta $0300. The ¯NMI Käsittelijän pitäisi alkaa osoitteesta $0400. Tulos ¯IRQ Käsittelijä tulee laittaa osoitteeseen $0500, ja tulos ¯NMI Käsittelijä tulee laittaa osoitteeseen $0501.

Ratkaisu:

NMISR PHA; NMI-rutiini alkaa tästä 0400 dollarin osoitteesta
PHX
PHY
;
LDA #$04
ADC #$05
STA 0501 dollaria
;
PLY
PLX
PLA
RTI

ISR PHA ; tämä ohje on osoitteessa $0300
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR: kommentoi, koska se ei ole osa rutiinia
STA $ 0500 ; menee pinoon
;
PLY
PLX
PLA
RTI
;
JMP ISR ; tämä ohje on $0200 osoitteessa

6) Selitä lyhyesti, kuinka BRK-käskyä käytetään ohjelmistokeskeytyksen tuottamiseen 65C02-tietokoneessa.

Ratkaisu:

Pääasiallinen tapa saada ohjelmistokeskeytys 65C02 µP:lle on käyttää BRK-implisiittistä osoitekäskyä. Oletetaan, että pääohjelma on käynnissä ja se kohtaa BRK-käskyn. Siitä lähtien PC:n seuraavan käskyn osoite tulee lähettää pinoon, kun nykyinen käsky valmistuu. Seuraavaksi tulee kutsua aliohjelma, joka käsittelee ohjelmiston ohjeita. Tämän keskeytysaliohjelman pitäisi työntää A-, X- ja Y-rekisterin sisältö pinoon. Kun aliohjelman ydin on suoritettu, A-, X- ja Y-rekisterien sisältö tulee vetää takaisin pinosta rekistereihinsä suorittavan aliohjelman toimesta. Rutiinin viimeinen lause on RTI. PC:n sisältö myös vedetään takaisin pinosta PC:lle automaattisesti RTI:n takia.

7) Luo taulukko, joka vertaa ja vertaa normaalia aliohjelmaa keskeytyspalvelurutiiniin.

Ratkaisu:

8) Selitä lyhyesti 65C02 µP:n tärkeimmät osoitusmuodot kokoonpanokielen ohjeesimerkkien perusteella.

Ratkaisu:

Jokainen käsky 6502:lle on yksi tavu, jota seuraa nolla tai useampi operandi.

Välitön osoitetila
Välittömässä osoitetilassa operandin jälkeen on arvo eikä muistiosoite. Arvoa edeltää #. Jos arvo on heksadesimaali, '#' on seurattava '$'. Välittömät osoitusohjeet 65C02:lle ovat: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Lukijan tulee tutustua 65C02 µP:n asiakirjoihin saadakseen tietää, kuinka käyttää tässä lueteltuja ohjeita, joita ei ole selitetty tässä luvussa. Esimerkki ohjeesta on:

LDA #77 dollaria

Absoluuttinen osoitetila
Absoluuttisella osoitemoodilla on yksi operandi. Tämä operandi on muistissa olevan arvon osoite (yleensä heksadesimaalimuodossa tai etiketissä). Muistiosoitteita 6502 µP on 64K10 = 65 53610. Tyypillisesti yksitavuinen arvo on jossakin näistä osoitteista. 65C02:n absoluuttiset osoiteohjeet ovat: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , STX, STY, STZ, TRB, TSB. Lukijan tulee tutustua 65C02 µP:n asiakirjoihin saadakseen tietää, kuinka tässä lueteltuja ohjeita ja muita osoitemuotoja, joita ei ole selitetty tässä luvussa, käytetään. Esimerkki ohjeesta on:

Ne ovat 1234 dollaria

Implisiittinen osoitetila
Implisiittisessä osoitemoodissa ei ole operandia. Ohje sisältää kaikki µP-rekisterit. 65C02:n oletetut osoiteohjeet ovat: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, TAX, TAY, TSX, TXA, TXS, TYA. Esimerkki ohjeesta on:

DEX: Pienennä X-rekisteriä yhdellä yksiköllä.

Suhteellinen osoitetila
Suhteellinen osoitetila käsittelee vain haarakäskyjä. Suhteellisessa osoitetilassa on vain yksi operandi. Se on arvo välillä -12810 - +12710. Tätä arvoa kutsutaan offsetiksi. Etumerkin perusteella tämä arvo lisätään tai vähennetään ohjelmalaskurin seuraavasta käskystä aiotun seuraavan käskyn osoitteen tulokseen. Suhteelliset osoitemoodin ohjeet ovat: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Ohjeesimerkit ovat:

BNE $7F : (haara, jos Z = 0 tilarekisterissä, P)

joka lisää 127 nykyiseen ohjelmalaskuriin (suoritettava osoite) ja aloittaa käskyn suorittamisen kyseisestä osoitteesta. Samalla lailla:

BEQ $F9 : (haara, jos Z = : tilarekisterissä, P)

joka lisää -7 nykyiseen ohjelmalaskuriin ja käynnistää suorituksen uudesta ohjelmalaskurin osoitteesta. Operandi on kahden komplementtiluku.

Absoluuttinen indeksiosoitus
Absoluuttisella indeksiosoitteella X- tai Y-rekisterin sisältö lisätään annettuun absoluuttiseen osoitteeseen (mihin tahansa $0000 - $FFFF, eli 010 - 6553610), jotta saadaan oikea osoite. Tätä annettua absoluuttista osoitetta kutsutaan perusosoitteeksi. Jos X-rekisteriä käytetään, kokoonpanoohje on jotain tällaista:

LDA $ C453,X

Jos Y-rekisteriä käytetään, se olisi jotain tällaista:

LDA $C453,Y

X- tai Y-rekisterin arvoa kutsutaan laskenta- tai indeksiarvoksi, ja se voi olla missä tahansa välillä $ 00 (010) - $ FF (25010). Sitä ei kutsuta offsetiksi.

Absoluuttiset indeksin osoiteohjeet ovat: ADC, AND, ASL (vain X), BIT (akun ja muistin kanssa, vain X:n kanssa), CMP, DEC (vain muisti ja X), EOR, INC (vain muisti ja X), LDA , LDX, LDY, LSR (vain X), ORA, ROL (vain X), ROR (vain X), SBC, STA, STZ (vain X).

Absoluuttinen epäsuora osoitus
Tätä käytetään vain hyppykäskyn kanssa. Tällä annetulla absoluuttisella osoitteella on osoitinosoite. Osoitinosoite koostuu kahdesta tavusta. Kaksitavuinen osoitin osoittaa (on osoite) kohdetavun arvoon muistissa. Assembly-kielen ohje on siis seuraava:

JMP (3456 dollaria)

Suluissa ja $13 $3456-osoitteessa, kun $EB on $3457 (= $3456 + 1) -osoitteessa, kohdeosoite on $13EB ja $13EB on osoitin. Absoluuttinen $3456 on ohjeen suluissa.

9) a) Kirjoita 6502 konekielinen ohjelma kirjoittaaksesi 'Rakastan sinua!' ASCII-koodien merkkijono muistissa alkaen $0300-osoitteesta merkkijonon pituudella. Ohjelman pitäisi alkaa 0200 dollarin osoitteesta. Hanki jokainen hahmo akkumulaattorista olettaen, että jokin aliohjelma lähettää ne yksitellen sinne. Kokoa ohjelma myös käsin. (Jos haluat tietää 'I love you!' ASCII-koodit, tässä ne ovat: 'I':4916, välilyönti : 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 ja '!':2116. Huomaa: kukin koodi vie 1 tavun).

b) Kirjoita 6502 konekielinen ohjelma kirjoittaaksesi 'Rakastan sinua!' ASCII-koodien merkkijono muistissa, alkaen $0300-osoitteesta ilman merkkijonon pituutta, mutta päättyen numeroon 0016. Ohjelman tulee alkaa $0200-osoitteesta. Hanki jokainen hahmo akusta olettaen, että jokin aliohjelma lähettää ne sinne yksitellen. Kokoa ohjelma myös käsin.

Ratkaisu:

a) Strategia: Merkkijonolle on 12 tavua: 1 tavu merkkijonon pituudelle ja 11 tavua merkkijonoliteraalille. Iteraatioita (silmukoita) on siis oltava 12 laskettuna 0:sta. Eli: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Nämä ovat 12 numeroa.

Kokonaisluku 0 sijoitetaan X-rekisteriin ja luku 1110 = 1210 – 110 = B16 = $0B osoitepaikkaan muistissa, esimerkiksi osoitteeseen $0250. Jokaisessa iteraatiossa X-rekisterin arvoa kasvatetaan ja tulosta verrataan $0B:een $0250-osoitteessa. Heti kun X:n arvo on yhtä suuri kuin $0B, iteraatio pysähtyy. Tässä vaiheessa merkkijonon pituus (tavumäärä) ja merkkijonoliteraali ovat 0300–030 miljardin dollarin (mukaan lukien) osoitepaikat. Muistiosoitteiden kasvattamiseksi 0300 dollarista käytetään Y-rekisteriä. Koodi on:

LDA #$0B
NE OVAT 0250 dollaria
LDX #$00
LDY#$00
STA $ 0300 ; 11:n pituus laitetaan A:han jollain aliohjelmalla ja menee 0300 dollariin
silmukka INX
TÄÄLLÄ
CPY $0250
BEQ-silmukka

b) Strategia: Merkkijonolle on 12 tavua: 1 tavu $00 Null-päätteelle ja 11 tavua merkkijonoliteraalille. Iteraatioita (silmukoita) on siis oltava 12 laskettuna 0:sta. Eli: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Nämä ovat 12 numeroa.

Kokonaisluku 0 laitetaan X-rekisteriin ja luku 1110 = 1210 – 110 = B16 = $0B sijoitetaan osoitepaikkaan muistissa, esimerkiksi osoitteeseen $0250. Jokaisessa iteraatiossa X-rekisterin arvoa kasvatetaan ja tulosta verrataan $0B:een $0250-osoitteessa. Heti kun X:n arvo on yhtä suuri kuin $0B, iteraatio pysähtyy. Tässä vaiheessa merkkijonoliteraalin tavujen määrä plus Null-merkki ovat 0300–030 miljardin dollarin (mukaan lukien) osoitepaikat. Muistiosoitteiden kasvattamiseksi $0300:sta käytetään Y-rekisteriä. Koodi on:

LDA #$0B
NE OVAT 0250 dollaria
LDX #$00
LDY#$00
STA $ 0300 ; Jokin aliohjelma laittaa 'I':n A:han ja se menee 0300 dollariin
silmukka INX
TÄÄLLÄ
CPY $0250
BEQ-silmukka