tuossa jo sivusin aihetta mutta avataampa tälle oma alueensa
keskitytään ensin Indirect osoitus muotoon
selkein aluksi
muistipaikka
$1000 00 20 80 80
A. 2000 4C 00 10 JMP $1000
B. 2000 6C 00 10 JMP ($1000)
kaksi melkein saman näköistä hyppykäskyä (Basic Goto)
eroa näissä käskyissä on suoritus ajassa sekä toiminnassa
A hyppää muistipaikkaan $1000 ja törmää siellä ensimmäiseen Tavuun joka on nolla konekielessä käsky BRK eli tapahtuu ohjemallinen keskeytys yleensä kaataa koneen
B. lukee ensin Tavut $1000 muisti paikasta ja saatujen tavujen kanssa muodostaa hypyn $2000 osoitteeseen huomaa kone kielen osoite muoto Alempi tavu ylempitavu
tämä sama osoite muoto näkyy deassemblerin tulostamassa koodissa missä tapauksessa A. ensimmäinen tavu on itse konekieli komento 4C = JMP
seuraavat tavut 00 ja 10 ovat hyppy osoite $1000
B. 6C = JMP ( ja 00 10 = $1000)
ongelma tulee tapauksessa B. jos
2000 6C FF 10 JMP ($10FF) hyppy on tämän näköinen
6510 tai 6502 eivät osaa suorittaa tätä komentoa oikein
koska prosessori noukkii hypyn ylemmän tavun väärästä paikkaa tässä tapauksessa osoiteesta $1000 ja alemman $10FF
osa kääntäjistä osaa tulkita tämän virheeksi ja varoittavat tästä mutta ohjelmoijan on silti hyvä tietää että on mahdollista että näin saattaa käydä
sama ongelma koskee melkein kaikkia kyseistä Indirect osoitusta käyttävistä käskyistä
A. LDA ($FF),y
B. LDA ($FF,X)
näillä komennoilla saattaisi olla sama ongema mutta tähän liittyy toinekin juttu osoiteesta 0$100-01FF on prosessorin Stak pino alue joka
taatusti sekoittaa ylemmän tavun osoituksen samoin pinon lukeminen tuntuu sekoittavan koneen
samon miten X. ja Y. rekisterin käyttö tässä yhteydessä poikkeaan toisistaan
LDA ($F0.x) / LDA ($F0),y kohdistaisi käskyn hakemaan dataa soitteesta $1000
nollasivu
00F0 00 10 00 20 00 30 00 40
muisti
1000 10 11 12 13 14 15 16 17 18
2000 20 21 22 23 24 25 26 27 28
3000 30 31 32 33 34 35 36 37 38
4000 40 41 42 43 44 45 46 47 48
5000 50 51 52 53 54 55 56 57 58
Y. toiminta
Y = nolla LDA käsky hakee osoitteesta $F0 = $1000 Akkuun tallentuu luku $10
Y= yksi --""-- $11 ($1000+1)
Y=seitsemän --""-- $17 ($1000+7)
eli $F0 nollasivulla annettuun osoitteeseen $1000 +Y
X. toiminta
(tätä muotoa käytetään yleensä parillisilla numeroilla)
X= nolla LDA käsky hakee osoitteesta $F0 00 10 =$1000 Akkuun tallentuu Arvo $10
X= yksi käsky hakee osoitteesta $F1 10 00 =$0010 --""-- tallentuu nollasivun arvo osoitteesta $10
X= kaksi --""-- $F2 00 20 =$2000 akkuun tallentuu $20
X= neljä --""-- $F4 00 30 =$3000 --""-- $30
X= viisi --""-- $F5 30 00 =$0030 Akkuun latautuu niollasivun $30 arvo
kuten esimerkistä huomaamme X. rekisteri lisää luettavan paikan kohtaa $F0+X
varmin konsti käyttää tätä on kertoa X annettava luku aina x2 ettei exytä parittomille osoitteille
esim.
LDA #1
ASL
TAX
LDA ($F0,x)
saman lainalaisuudet koskevat muistakin tämän osoitus muodon hallitsevat käskyt
niitä ovat
ORA =OR whit A
EOR = EXOR whit A
AND = AND whit A
SBC = minus whit A
ADC = Plus whit A
CMP = Vertailu whit A