6502 konekieli Indirect

Aloittaja virgo, elokuu 25, 2013, 03:51

« edellinen - seuraava »

virgo

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


Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500