Поглавље 4: Водич за асемблерски језик за микропроцесор 6502

Poglavle 4 Vodic Za Asemblerski Jezik Za Mikroprocesor 6502



Поглавље 4: Водич за асемблерски језик за микропроцесор 6502

4.1 Увод

6502 микропроцесор је пуштен у продају 1975. Коришћен је као микропроцесор за неке тадашње персоналне рачунаре као што су Аппле ИИ, Цоммодоре 64 и ББЦ Мицро.







Микропроцесор 6502 се и данас производи у великом броју. То више није централна процесорска јединица која се данас користи у персоналним рачунарима (лаптоповима), али се и даље производи у великом броју и данас се користи у електронским и електричним уређајима. Да би се разумеле модерније рачунарске архитектуре, од велике је помоћи испитати старији, али прилично успешан микропроцесор као што је 6502.



Пошто је једноставан за разумевање и програмирање, један је од најбољих (ако не и најбољих) микропроцесора који се користи за подучавање асемблерског језика. Асемблерски језик је језик ниског нивоа који се може користити за програмирање рачунара. Имајте на уму да се асемблерски језик за један микропроцесор разликује од асемблерског језика другог микропроцесора. 6502 микропроцесорски асемблерски језик се учи у овом поглављу. Тачније, 65Ц02 се учи, али се једноставно назива 6502.



Познати рачунар у прошлости се звао цоммодоре_64. 6502 је микропроцесор из породице 6500. Рачунар цоммодоре_64 користи микропроцесор 6510. 6510 микропроцесор је од 6500 µП. Скуп инструкција 6502 µП је скоро све инструкције 6510 µП. Знање овог и следећег поглавља је засновано на рачунару цоммодоре_64. Ово знање се користи као основа за објашњење савремених рачунарских архитектура и савремених оперативних система у овом делу онлајн курса за каријеру.





Архитектура рачунара се односи на компоненте матичне плоче рачунара и објашњење како подаци теку унутар сваке компоненте, посебно микропроцесора, како подаци теку између компоненти, као и како подаци међусобно делују. Једнина за податке је датум. Ефикасан начин за проучавање рачунарске архитектуре рачунара је проучавање асемблерског језика матичне плоче.

За рачунар цоммодоре_64 се каже да је рачунар од 8-битне рачунарске речи. То значи да се информације чувају, преносе и њима манипулише у облику осмобитних бинарних кодова.



Блок дијаграм Цоммодоре 64 матичне плоче
Блок дијаграм матичне плоче цоммодоре 64 је:


Слика 4.1 Блок дијаграм системске јединице Цоммодоре_64

Замислите микропроцесор 6510 као микропроцесор 6502. Укупна меморија је низ бајтова (8 битова по бајту). Постоји меморија са случајним приступом (читање/писање) у коју се бајтови могу уписивати или брисати. Када се рачунар искључи, све информације у меморији са случајним приступом (РАМ) се бришу. Ту је и меморија само за читање (РОМ). Када се рачунар искључи, информације у РОМ-у остају (не бришу се).

Постоји улазно/излазни порт (коло) који се на дијаграму назива улазно/излазним уређајима. Овај порт не треба мешати са портовима који су видљиви на левој и десној или предњој и задњој вертикалној површини рачунарске системске јединице. То су две различите ствари. Везе овог унутрашњег порта са периферијама као што су чврсти диск (или флопи-диск), тастатура и монитор нису приказане на дијаграму.

На дијаграму су три сабирнице (групе електричних проводника врло малих жица). Свака жица може пренети бит 1 или бит 0. Сабирница података, за пренос осмобитног бајта по један (један импулс такта) у РАМ и улазно/излазни порт (улазно/излазни уређаји) је двосмерна. Сабирница података је широка осам бита.

Све компоненте су повезане на адресну магистралу. Адресна магистрала је једносмерна од микропроцесора. Постоји шеснаест проводника за адресну магистралу и сваки носи по један бит (1 или 0). Шеснаест битова се шаље у једном тактном импулсу.

Постоји контролни аутобус. Неки од проводника контролне магистрале би пренели по један бит са микропроцесора на остале компоненте. Неколико контролних линија преноси битове од улазно/излазног (ИО) порта до микропроцесора.

Меморија рачунара
РАМ и РОМ се сматрају једним меморијским склопом. Овај склоп је дијаграмски представљен на следећи начин где хексадецимални бројеви имају префикс „$“:


Слика 4.11 Распоред меморије за рачунар Цоммодоре 64

РАМ је од 0000 16 то ДФФФ 16 који је написан као од $0000 до $ДФФФ. Са 6502 µП асемблерским језиком, хексадецимални број има префикс „$“, а не суфикс (субсцриптед) са 16 или Х или хексадецимални. Све информације у РАМ меморији се гасе када се рачунар искључи. РОМ почиње од $Е000 до $ФФФФ. Има потпрограме који се не искључују када се рачунар искључи. Ове потпрограме су најчешће коришћене рутине које помажу у програмирању. Кориснички програм их позива (погледајте следеће поглавље).

Простор (бајтови) од $0200 до $Д000 је за корисничке програме. Простор од $Д000 до $ДФФФ је за информације које су директно повезане са периферним уређајима (улазно/излазни уређаји). Ово је део оперативног система. Дакле, оперативни систем рачунара цоммодоре-64 се састоји од два главна дела: део у РОМ-у који се никада не гаси и део од $Д000 до $ДФФФ који се гаси када се напајање искључи. Ови ИО (улаз/излаз) подаци се морају учитати са диска сваки пут када се рачунар укључи. Данас се такви подаци називају периферним драјверима. Периферни уређаји почињу од порта за улазно/излазни уређај преко прикључака на матичној плочи до препознатљивих портова на вертикалним површинама рачунара на које су монитор, тастатура итд. повезани са самим периферијама (монитор, тастатура итд. .).

Меморија се састоји од 2 16 = 65,536 бајт локација. У хексадецималном облику, ово је 10000 16 = 10000 Х = 10000 хек = локације од 10000 УСД. У рачунарству, бројање у основи два, бази десет, основи шеснаест итд. почиње од 0, а не од 1. Дакле, прва локација је заправо број локације 0000000000000000 2 = 0 10 = 0000 16 = 0000 долара. У асемблерском језику 6502 µП, идентификација адресе адресе има префикс $ и нема суфикса или индекса. Последња локација је број локације 1111111111111111 2 = 65,535 10 = ФФФФ 16 = $ФФФФ а не 10000000000000000 2 , или 65,536 10 или 10000 16 , или 10000 долара. 10000000000000000 2 , 65,536 10 , 10000 16 , или $10000 даје укупан број локација бајтова.

Ево, 2 16 = 65,536 = 64 к 1024 = 64 к 2 10 = 64 килобајта (килобајта). Суфикс 64 у називу Цоммодоре-64 значи 64 КБ укупне меморије (РАМ и РОМ). Бајт је 8 битова, а 8 битова ће отићи на једно бајтско место у меморији.

64 кбајта меморије подељено је на странице. Свака страница има 0100 16 = 256 10 локације бајтова. Првих 256 10 = прво 0100 16 локације је страница 0. Друга је страница 1, трећа је страница 2, и тако даље.

Да би се адресирало 65.536 локација, потребно је 16 битова за сваку локацију (адресу). Дакле, адресна магистрала од микропроцесора до меморије се састоји од 16 линија; један ред за један бит. Бит је или 1 или 0.

6502 µП регистри
Регистар је као бајт ћелије за меморијску локацију бајтова. 6502 µП има шест регистара: пет 8-битних регистара и један 16-битни регистар. 16-битни регистар се назива програмски бројач што је скраћено ПЦ. Садржи меморијску адресу за следећу инструкцију. Програм на асемблерском језику састоји се од инструкција које се смештају у меморију. Шеснаест (16) различитих битова је потребно за адресирање одређене локације бајта у меморији. При одређеном импулсу такта, ови битови се шаљу на 16-битне адресне линије адресне магистрале ради читања инструкције. Сви регистри за 6502 µП су приказани на следећи начин:


Слика 4.12 6502 µП Регистри

Програмски бројач или ПЦ се на дијаграму може видети као 16-битни регистар. Осам битова нижег значаја је означено као ПЦЛ за низак број бројача програма. Већих значајних осам битова је означено као ПЦХ за Програмски бројач Хигх. Инструкција у меморији за Цоммодоре-64 може се састојати од једног, два или три бајта. 16 битова у рачунару указује на следећу инструкцију која ће се извршити, у меморији. Међу колима у микропроцесору, два се зову аритметичка логичка јединица и декодер инструкција. Ако је тренутна инструкција која се обрађује у µП (микропроцесору) дуга један бајт, ова два кола повећавају ПЦ за следећу инструкцију за 1 јединицу. Ако је тренутна инструкција која се обрађује у µП дуга два бајта, што значи да заузима два узастопна бајта у меморији, ова два кола повећавају ПЦ за следећу инструкцију за 2 јединице. Ако је тренутна инструкција која се обрађује у µП дуга три бајта, што значи да заузима три узастопна бајта у меморији, ова два кола повећавају ПЦ за следећу инструкцију за 3 јединице.

Акумулатор „А“ је осмобитни регистар опште намене који чува резултате већине аритметичких и логичких операција.

Сваки регистр 'Кс' и 'И' се користи за бројање корака програма. Бројање у програмирању почиње од 0. Дакле, они се називају индексним регистрима. Они имају неколико других намена.

Иако регистар показивача стека, „С“ има 9 битова који се сматрају осмобитним регистром. Његов садржај указује на локацију бајтова на страници 1 РАМ-а. Страница 1 почиње од бајта $0100 (256 10 ) у бајт $01ФФ (511 10 ). Када је програм покренут, он се креће са једне инструкције на следећу узастопну инструкцију у меморији. Међутим, то није увек случај. Постоје случајеви када скаче из једне меморијске области у другу меморијску област да би наставио да извршава упутства тамо, узастопно. Страница 1 у РАМ-у се користи као стек. Стек је велика РАМ меморијска област која има следеће адресе за наставак кода одакле долази до скока. Кодови са упутствима за прескакање нису у стеку; они су на другом месту у сећању. Међутим, након што се изврше инструкције за скок, адресе за наставак (не сегменти кода) су у стеку. Они су гурнути тамо као резултат инструкција за скок или грану.

Осмобитни регистар статуса процесора П је посебна врста регистра. Појединачни битови нису повезани или повезани један са другим. Сваки бит тамо се назива заставицом и цени се независно од осталих. Значења застава су дата у наставку по потреби.

Први и последњи битни индекс за сваки регистар су назначени изнад сваког регистра у претходном дијаграму. Бројање битова (позиција) у регистру почиње од 0 на десној страни.

Странице меморије у бинарном, хексадецималном и децималном формату
Следећа табела приказује почетак меморијских страница у бинарном, хексадецималном и децималном облику:

Свака страница има 1.000.000 2 број бајтова који је исти као 100 Х број бајтова који је исти као 256 10 број бајтова. У претходном дијаграму меморије, странице су приказане нагоре од странице 0, а не надоле као што је приказано у табели.

Бинарне, хексадецималне и децималне колоне ове табеле дају адресе локација меморијских бајтова у њиховим различитим основама. Приметите да су за нулту страницу, само битови за нижи бајт потребни за куцање приликом кодирања. Битови за виши бајт се могу изоставити јер су увек нуле (за нулту страницу). За остале странице треба користити битове за виши бајт.

Остатак овог поглавља објашњава асемблерски језик 6502 µП користећи све претходне информације. Да би брзо разумео језик, читалац мора да додаје и одузима у основи шеснаест уместо у основи десет. Заправо би требало да буде основа два, али израчунавање у основи два је гломазно. Запамтите да када се додају два броја у основу два, пренос је и даље 1 као у основи десет. Али када се одузму два броја у основи два, позајмица је два, а не десет као у основи десет. Када се додају два броја у основу шеснаест, пренос је и даље 1 као у основи десет. Али када се одузму два броја у основи шеснаест, позајмица је шеснаест, а не десет као у основи десет.

4.2 Упутства за пренос података

Размотрите следећу табелу упутстава за пренос података на асемблерском језику за 6502 µП:

Када се бајт (8 бита) копира са меморијске локације бајта у регистар акумулатора, Кс регистар или И регистар, то се учитава. Када се бајт копира из било ког од ових регистара на локацију меморијског бајта, то је пренос. Када се бајт копира из једног регистра у други, то се и даље преноси. У другој колони табеле, стрелица показује смер копије за бајт. Остале четири колоне приказују различите начине адресирања.

Унос у колони начина адресирања је стварни бајт код за одговарајући мнемонички део инструкције у хексадецималу. АЕ, на пример, је стварни бајт код за ЛДКС који треба да учита бајт из меморије у Кс регистар у режиму апсолутног адресирања као што је АЕ 16 = 10101110 2 . Дакле, битови за ЛДКС на локацији меморијског бајта су 10101110.

Приметите да за ЛДКС мнемонички део инструкције постоје три могућа бајта, а то су А2, АЕ и А6, и сваки је за одређени начин адресирања. Када бајт који се учитава у Кс регистар не треба да се копира са меморијске локације бајта, вредност се мора унети са (одмах после) ЛДКС мнемоником у инструкцији у хексадецималном или децималном облику. У овом поглављу такве вредности се куцају хексадецимално. Ово је тренутно адресирање, тако да је стварни бајт у меморији који представља ЛДКС А2 16 = 10100010 2 а не АЕ 16 што је једнако 10101110 2 .

У табели, сви бајтови под насловима начина адресирања називају се Оперативни кодови, што је скраћено као кодови операција. За једну мнемонику може постојати више од једног опкода, у зависности од начина адресирања.

Белешка: Реч „учитавање“ у јединици рачунарског система може имати два значења: може се односити на учитавање датотеке са диска у меморију рачунара или се може односити на пренос бајта са локације меморијског бајта у регистар микропроцесора. .

Постоји више начина адресирања од четири у табели за 6502 µП.

Осим ако није другачије наведено, сав кориснички програмски код у овом поглављу почиње од адресе 0200 16 што је почетак корисничке области у меморији.

Меморија М и Акумулатор А

Меморија у акумулатор

Непосредно обраћање
Следећа инструкција чува број ФФ 16 = 255 10 у акумулатор:

ЛДА #$ФФ

„$“ се не користи само за идентификацију меморијске адресе. Уопштено, користи се да означи да је следећи број који следи хексадецималан. У овом случају, $ФФ није адреса ниједне локације меморијског бајта. То је број 255 10 у хексадецималном. База 16 или било који од њених еквивалентних индекса не смеју бити написани у инструкцији асемблерског језика. „#“ означава да оно што следи је вредност која се ставља у регистар акумулатора. Вредност се може написати и у основи десет, али то није урађено у овом поглављу. „#“ значи тренутно адресирање.

Мнемоника има неку сличност са одговарајућом енглеском фразом. „ЛДА #$ФФ“ значи учитавање броја 255 10 у акумулатор А. Пошто је ово непосредно адресирање из претходне табеле, ЛДА је А9 а не АД или А5. А9 у бинарној верзији је 101010001. Дакле, ако је А9 за ЛДА на адреси $0200 у меморији, $ФФ је у $0301 = 0300 + 1 адреса. #$ФФ је управо операнд за ЛДА мнемонику.

Апсолутно адресирање
Ако је вредност $ФФ на локацији $0333 у меморији, претходна инструкција је:

ЛДА $0333

Обратите пажњу на одсуство #. У овом случају, одсуство # значи да је оно што следи меморијска адреса, а не вредност од интереса (а не вредност која се ставља у акумулатор). Дакле, опкод за ЛДА, овог пута је АД, а не А9 или А5. Операнд за ЛДА овде је адреса $0333, а не вредност $ФФ. $ФФ се налази на локацији $0333 која је прилично удаљена. Инструкција „ЛДА $0333“ заузима три узастопне локације у меморији, а не две, као што је то чинила претходна илустрација. „АД“ за ЛДА је на локацији од 0200 долара. Доњи бајт од 0333 који је 33 налази се на локацији $0301. Виши бајт од $0333 који је 03 налази се на локацији $0302. Ово је мали ендианнесс који користи 6502 асемблерски језик. Асемблерски језици различитих микропроцесора су различити.

Ово је пример апсолутног адресирања. $0333 је адреса локације која има $ФФ. Инструкција се састоји од три узастопна бајта и не укључује $ФФ или његову стварну локацију бајта.

Адресирање нулте странице

Претпоставимо да је вредност $ФФ на меморијској локацији $0050 на нултој страници. Локације бајтова за нулту страницу почињу од $0000 и завршавају се на $00ФФ. Ово је 256 10 локација укупно. Свака страница меморије Цоммодоре-64 је 256 10 дуго. Приметите да је виши бајт нула за све могуће локације у простору нулте странице у меморији. Режим адресирања са нултом страницом је исти као и режим апсолутног адресирања, али се виши бајт од 00 не уписује у инструкцију. Дакле, да бисте учитали $ФФ са локације $0050 у акумулатор, инструкција режима адресирања на нулти страници је:

ЛДА 50 долара

Са ЛДА је А5 а не А9 или АД, А5 16 = 10100101 2 . Запамтите да сваки бајт у меморији има 8 ћелија, а свака ћелија садржи по мало. Инструкција се овде састоји од два узастопна бајта. А5 за ЛДА је на меморијској локацији $0200, а адреса од $50, без вишег бајта од 00, је на локацији $0301. Одсуство 00, које би потрошило бајт у укупној меморији од 64К, штеди меморијски простор.

Акумулатор у меморију

Апсолутно адресирање
Следећа инструкција копира вредност бајта, шта год да је, из акумулатора на меморијску локацију од 1444 долара:

КОШТЕ 1444 долара

За ово се каже да се преноси са акумулатора у меморију. Не учитава се. Учитавање је супротно. Бајт кода операције за СТА је 8Д 16 = 10001101 2 . Ова инструкција се састоји од три узастопна бајта у меморији. Тхе 8Д 16 налази се на локацији од 0200 долара. 44 16 од $1444 адресе је на локацији $0201. и 14 16 налази се на локацији $0202 – мали ендианнесс. Стварни бајт који се копира није део инструкције. Овде се за СТА користи 8Д, а не 85 за адресирање нулте странице (у табели).

Нулто адресирање страница
Следећа инструкција копира вредност бајта, каква год да је, од акумулатора до меморијске локације од $0050 на нултој страници:

СТА $0050

Бајт кода операције за СТА овде је 85 16 = 10000101 2 . Ова инструкција се састоји од два узастопна бајта у меморији. 85 16 налази се на локацији 0200 долара. 50 16 адресе $0050 налази се на локацији $0201. Овде се не поставља питање ендианнесса јер адреса има само један бајт који је нижи бајт. Стварни бајт који се копира није део инструкције. Овде се за СТА користи 85 а не 8Д за адресирање нулте странице.

Нема смисла користити непосредно адресирање за пренос бајта из акумулатора на локацију у меморији. То је зато што стварна вредност као што је $ФФ мора бити наведена у инструкцији у непосредном адресирању. Дакле, тренутно адресирање није могуће за пренос вредности бајта из регистра у µП на било коју меморијску локацију.

ЛДКС, СТКС, ЛДИ и СТИ Мнемоника
ЛДКС и СТКС су слични ЛДА и СТА, респективно. Али овде се користи регистар Кс, а не регистар А (акумулатор). ЛДИ и СТИ су слични ЛДА и СТА, респективно. Али овде се користи И регистар а не А регистар. Погледајте табелу 4.21 за сваки хексадецимални операцијски код који одговара одређеној мнемоници и одређеном начину адресирања.

Трансфери од регистрације до регистра
Претходна два сета инструкција у табели 4.21 баве се копирањем меморије/микропроцесора-регистра (трансфер) и копирањем регистра/регистра (трансфер). Инструкције ТАКС, ТКСА, ТАИ, ТИА, ТСКС и ТКСС врше копирање (пренос) из регистра у микропроцесору у други регистар истог микропроцесора.

Да бисте копирали бајт из А у Кс, инструкција је:

ПОРЕЗ

Да бисте копирали бајт из Кс у А, инструкција је:

ТКС

Да бисте копирали бајт из А у И, инструкција је:

ХАНД

Да бисте копирали бајт из И у А, инструкција је:

ТИА

За рачунар цоммодоре 64, стек је страница 1 одмах после странице 0 у меморији. Као и свака друга страница, састоји се од 25610 10 локације бајтова, од $0100 до $01ФФ. Обично се програм извршава од једне до следеће узастопне инструкције у меморији. С времена на време долази до скока на други сегмент меморијског кода (скупа инструкција). Подручје стека у меморији (РАМ) има следеће адресе инструкција одакле су стали скокови (или гране) за наставак програма.

Показивач стека “С” је 9-битни регистар у 6502 µП. Први бит (крајњи леви) је увек 1. Све адресе локација бајтова на првој страници почињу са 1 праћеним 8 различитих битова за 256 10 локацијама. Показивач стека има адресу локације на страници 1 која има адресу следеће инструкције коју програм мора да врати и настави са њом након извршавања тренутног (скоченог) сегмента кода. Пошто први бит свих адреса стека (прва страница) почиње са 1, регистар показивача стека треба да задржи само преосталих осам битова. На крају крајева, његов први бит, који је крајњи леви бит (девети бит рачунајући с његове десне стране), увек је 1.

Да бисте копирали бајт из С у Кс, инструкција је:

ТСКС

Да бисте копирали бајт из Кс у С, инструкција је:

ТКСТ

Инструкције од регистра до регистра не узимају никакав операнд. Састоје се само од мнемотехнике. Свака мнемоника има свој операцијски код у хексадецималном облику. Ово је у режиму подразумеваног адресирања јер нема операнда (нема меморијске адресе, нема вредности).

Белешка: Не постоји пренос Кс на И или И на Кс (копирање).

4.3 Аритметичке операције

Коло, аритметичко-логичка јединица у 6502 µП, може истовремено да додаје само два осмобитна броја. Не одузима, не умножава и не дели. У следећој табели су приказани кодови операција и начини адресирања за аритметичке операције:

Белешка: Све мнемонике за аритметичке операције и друге врсте операција (тј. свих 6502 мнемотехнике) узимају један бајт кода операције (оп). Ако постоји више од једног начина адресирања за мнемотехнику, постојали би различити опкодови за исту мнемонику: један за сваки начин адресирања. Ц, Д и В у табели су ознаке статусног регистра. Њихова значења ће бити дата касније по потреби.

Сабирање неозначених бројева
Са 6502 µП, потписани бројеви су комплементарни бројеви. Неозначени бројеви су обични позитивни бројеви који почињу од нуле. Дакле, за бајт од осам бита, најмањи број без предзнака је 00000000 2 = 0 10 = 00 16 а највећи непотписани број је 11111111 2 = 255 10 = ФФ 16 . За два непотписана броја, сабирак је:

А+М+Ц→А

То значи да 8-битни садржај акумулатора додаје аритметичко-логичка јединица бајту (8-биту) из меморије. Након додавања А и М, пренос до деветог бита иде у ћелију са заставицом за пренос у статусном регистру. Сваки претходни бит преноса из претходног додавања који је још увек у ћелији са заставицом за пренос у статусном регистру се такође додаје збиру А и М, чинећи А+М+Ц→А. Резултат се враћа у акумулатор.

Ако је додатак камата:

А + М

И нема потребе за додавањем претходног ношења, мора се обрисати заставица за ношење која је постављена на 0, тако да је додавање:

А+М+0→А исто што и А+М→А

Белешка: Ако се М дода А, и дође до преноса 1 јер је резултат већи од 255 10 = 11111111 2 = ФФ 16 , ово је ново ношење. Овај нови пренос од 1 се аутоматски шаље у ћелију са заставицом за ношење у случају да је потребно следећем пару осам бита да се сабере (још један А + М).

Код за додавање два неозначена осмобита
00111111 2 +00010101 2 је исто што и 3Ф 16 + 15 16 што је исто као 63 10 +21 10 . Резултат је 010101002 2 што је исто као 54 16 и 84 10 . Резултат није већи од максималног броја за осам битова који је 255 10 = 11111111 2 = ФФ 16 . Дакле, нема резултујућег преноса 1. Другим речима, резултујући пренос је 0. Пре сабирања, нема претходног преноса од 1. Другим речима, претходни пренос је 0. Код за обављање овог сабирања може бити:

ЦЛЦ
ЛДА#$3Ф
АДЦ #15$

Белешка: Док куцате асемблерски језик, тастер „Ентер“ на тастатури се притисне на крају сваке инструкције. У овом коду постоје три упутства. Прва инструкција (ЦЛЦ) брише ознаку за ношење у случају да претходни додатак има 1. ЦЛЦ се може урадити само у режиму имплицитног адресирања. Мнемоника за начин имплицитног адресирања не узима операнд. Ово брише ћелију за пренос статусног регистра П. Брисање значи давање бита 0 ћелији са заставицом за пренос. Следеће две инструкције у коду користе режим непосредног адресирања. Код непосредног адресирања, постоји само један операнд за мнемонику, а то је број (а не адреса меморије или регистра). Дакле, број мора да претходи „#“. „$“ значи да је број који следи хексадецималан.

Друга инструкција учитава број 3Ф 16 у акумулатор. За трећу инструкцију, коло аритметичко-логичке јединице µП узима претходни (очишћени) пренос 0 (присиљен на 0) ћелије са заставицом за пренос статусног регистра и додаје га на 15 16 као и на вредност која је већ у 3Ф 16 акумулатор и враћа комплетан резултат назад у акумулатор. У овом случају, резултујући пренос је 0. АЛУ (аритметичко-логичка јединица) шаље (ставља) 0 у ћелију са заставицом за пренос статусног регистра. Регистар статуса процесора и регистар статуса значе исту ствар. Ако је резултат преноса 1, АЛУ шаље 1 у заставицу за пренос статусног регистра.

Три реда претходног кода морају бити у меморији пре него што се изврше. Опцоде 1816 за ЦЛЦ (имплицирано адресирање) је на локацији $0200 бајтова. Оперативни код А9 16 за ЛДА (непосредно адресирање) је на локацији $0201 бајта. Број 3Ф 10 је на локацији $0202 бајта. Оперативни код 69 16 за ЛДА (непосредно адресирање) је на локацији $0203 бајта. Број 15 10 налази се на $0204 бајт локацији.

Белешка: ЛДА је инструкција за пренос (учитавање), а не аритметичка инструкција (мнемоничка).

Код за додавање два неозначена шеснаест бита
Сви регистри у 6502 µП су у суштини осмобитни регистри, осим ПЦ (Програмски бројач) који је 16-битни. Чак је и статусни регистар широк 8 бита, иако његових осам битова не раде заједно. У овом одељку разматра се додавање два 16 неозначених бита, са преношењем из првог пара од осам битова у други пар од осам битова. Пренос од интереса овде је пренос са позиције осмог бита на позицију деветог бита.

Нека бројеви буду 0010101010111111 2 = 2АБФ16 16 = 10,943 10 и 0010101010010101 2 = 2А95 16 = 10,901 10 . Збир је 0101010101010100 2 = 5554 16 = 21,844 10 .

Додавање ова два неозначена броја у основу два је следеће:

Следећа табела приказује исти додатак са преношењем 1 са осмог на позицију деветог бита, почевши са десне стране:

Приликом овог кодирања, два нижа бајта се прво додају. Затим, АЛУ (Аритметичко-логичка јединица) шаље пренос 1 са позиције осмог бита на позицију деветог бита, у ћелију са заставицом за пренос у статусном регистру. Резултат од 0 1 0 1 0 1 0 0 без преноса иде у акумулатор. Затим се други пар бајтова додаје са преносом. АДЦ мнемоника значи аутоматско додавање са претходним преносом. У овом случају, претходни пренос, који је 1, не сме се мењати пре другог додавања. За прво додавање, пошто било које претходно преношење није део овог комплетног додавања, мора се обрисати (направити 0).

За потпуно сабирање два пара бајтова, први додатак је:

А + М + 0 -> А

Други додатак је:

А + М + 1 -> А

Дакле, заставица за ношење мора бити обрисана (дата вредност 0) непосредно пре првог додавања. Следећи програм чији читалац мора да прочита објашњење које следи користи режим апсолутног адресирања за ово сумирање:

ЦЛЦ
ЛДА $0213
АДЦ $0215
; нема клиринга јер је потребна вредност ознаке за ношење
СТА $0217
ЛДА $0214
АДЦ $0216
СТА $0218

Имајте на уму да код асемблерског језика 6502 тачка-зарез почиње коментар. То значи да се у извршавању програма игнорише тачка и зарез и све што је са његове десне стране. Програм који је претходно написан је у текстуалној датотеци се чува са именом по избору програмера и са екстензијом „асм“. Претходни програм није тачан програм који иде у меморију на извршење. Одговарајући програм у меморији назива се преведени програм где се мнемотехника замењује кодовима операција (бајтовима). Сваки коментар остаје у текстуалној датотеци асемблерског језика и уклања се пре него што преведени програм стигне у меморију. У ствари, постоје две датотеке које су данас сачуване на диску: „.асм“ датотека и „.еке“ датотека. Датотека „.асм“ је она на претходној илустрацији. Датотека „.еке“ је датотека „.асм“ са уклоњеним свим коментарима и свим мнемоничким знацима замењеним њиховим кодовима. Када се отвори у уређивачу текста, датотека „.еке“ је непрепознатљива. Осим ако није другачије наведено, за потребе овог поглавља, „.еке“ датотека се копира у меморију почевши од локације $0200. Ово је друго значење учитавања.

Два 16-битна броја која се додају заузимају четири бајта у меморији за апсолутно адресирање: два бајта по броју (меморија је низ бајтова). Са апсолутним адресирањем, операнд за операцијски код је у меморији. Резултат сумирања је широк два бајта и такође се мора ставити у меморију. Ово даје укупно 6 10 = 6 16 бајтова за улазе и излазе. Улази нису са тастатуре, а излаз није са монитора или штампача. Улази су у меморији (РАМ), а излаз (резултат сумирања) се враћа у меморију (РАМ) у овој ситуацији.

Пре него што се програм изврши, преведена верзија мора прво бити у меморији. Гледајући претходни програмски код, види се да упутства без коментара чине 19 10 = 13 16 бајтова. Дакле, програм заузима од $0200 бајт локације у меморији до $0200 + $13 – $1 = $0212 бајтова локација (почевши од $0200 а не $0201 што имплицира – $1). Додавање 6 бајтова за улазне и излазне бројеве чини да се сав програм завршава на $0212 + $6 = $0218. Укупна дужина програма је 19 16 = 25 10 .

Нижи бајт аугенде треба да буде на адреси $0213, а виши бајт исте аугенде треба да буде у адреси $0214 – мали ендианнесс. Слично томе, нижи бајт додатка треба да буде на адреси $0215, а виши бајт истог сабирка треба да буде у адреси $0216 – мали ендианнесс. Нижи бајт резултата (збир) треба да буде на адреси $0217, а виши бајт истог резултата треба да буде у адреси $0218 – мали ендианнесс.

Опкод 18 16 за ЦЛЦ (имплицирано адресирање) је на локацији бајтова од $0200. Оперативни код за „ЛДА $0213“, тј. АД 16 за ЛДА (апсолутно адресирање), налази се на локацији бајтова $0201. Доњи бајт аугенда који је 10111111 налази се на локацији меморијског бајта од $0213. Запамтите да сваки опкод заузима један бајт. Адреса „$0213“ за „ЛДА $0213“ је на локацијама бајтова $0202 и $0203. Инструкција “ЛДА $0213” учитава нижи бајт аугенде у акумулатор.

Оперативни код за „АДЦ $0215“, тј. 6Д 16 за АДЦ (апсолутно адресирање), налази се на локацији бајтова $0204. Доњи бајт додатка који је 10010101 налази се на локацији бајта од $0215. Адреса „$0215“ за „АДЦ $0215“ је на локацијама бајтова $0205 и $0206. Инструкција “АДЦ $0215” додаје нижи бајт сабирача нижем бајту аугенде који је већ у акумулатору. Резултат се враћа у акумулатор. Свако преношење после осмог бита се шаље у заставицу за пренос статусног регистра. Ћелија са заставицом за ношење не сме бити обрисана пре другог додавања виших бајтова. Овај пренос се аутоматски додаје збиру виших бајтова. У ствари, пренос од 0 се аутоматски додаје збиру нижих бајтова на почетку (еквивалентно томе да нема додавања преноса) због ЦЛЦ.

Коментар траје следећих 48 10 = 30 16 бајтова. Међутим, ово остаје само у текстуалној датотеци „.асм“. Не допире до сећања. Уклања се преводом који ради асемблер (програм).

За следећу инструкцију која је „СТА $0217“, опкод СТА који је 8Д 16 (апсолутно адресирање) налази се на локацији бајтова $0207. Адреса „$0217“ за „СТА $0217“ је на меморијским локацијама од $0208 и $0209. Инструкција „СТА $0217“ копира осмобитни садржај акумулатора на меморијску локацију од $0217.

Виши бајт аугенда који је 00101010 налази се на меморијској локацији од $0214, а виши бајт додатка који је 00101010 је на локацији бајта од $02 16 . Оперативни код за „ЛДА $0214“ који је АД16 за ЛДА (апсолутно адресирање) налази се на локацији бајта од $020А. Адреса „$0214“ за „ЛДА $0214“ налази се на локацијама од $020Б и $020Ц. Инструкција „ЛДА $0214“ учитава виши бајт аугенде у акумулатор, бришући све што се налази у акумулатору.

Оперативни код за „АДЦ $0216“ који је 6Д 16 за АДЦ (апсолутно адресирање) је на локацији бајтова $020Д. Адреса „$0216“ за „АДЦ 0216“ је на локацијама бајтова $020Е и $020Ф. Инструкција “АДЦ $0216” додаје виши бајт додатка вишем бајту аугенде који је већ у акумулатору. Резултат се враћа у акумулатор. Ако постоји пренос од 1, за овај други додатак, он се аутоматски ставља у ћелију за пренос статусног регистра. Иако пренос преко шеснаестог бита (лево) није потребан за овај проблем, лепо је проверити да ли је дошло до преноса 1 тако што ћете проверити да ли је ознака за пренос постала 1.

За следећу и последњу инструкцију која је „СТА $0218“, опкод СТА који је 8Д16 (апсолутно адресирање) налази се на локацији бајта од $0210. Адреса „$0218“ за „СТА $0218“ налази се на меморијским локацијама од $0211 и $0212. Инструкција „СТА $0218” копира осмобитни садржај акумулатора на меморијску локацију од $0218. Резултат сабирања два шеснаесто-битна броја је 0101010101010100, са нижим бајтом 01010100 на меморијској локацији од $0217 и вишим бајтом од 01010101 на меморијској локацији од $0218 – мали ендианнесс.

Одузимање
Са 6502 µП, потписани бројеви су комплементарни бројеви. Број комплемента двојке може бити осам битова, шеснаест битова или било који вишеструки од осам битова. Са два комплемента, први бит са леве стране је бит знака. За позитиван број, овај први бит је 0 за означавање знака. Остали битови формирају број на нормалан начин. Да бисте добили допуну два негативног броја, инвертујте све битове за одговарајући позитиван број, а затим додајте 1 резултату са десног краја.

Да би се један позитиван број одузео од другог позитивног броја, одузимање се претвара у негативан број комплемента два. Затим се минус и нови негативни број сабирају на нормалан начин. Дакле, одузимање осам битова постаје:

Где је носивост претпостављена као 1. Резултат у акумулатору је разлика у комплементу два. Дакле, да бисте одузели два броја, заставица за ношење мора бити постављена (направљена на 1).

Приликом одузимања два шеснаестобитна броја, одузимање се врши два пута као са сабирањем два шеснаестобитна броја. Пошто је одузимање облик сабирања са 6502 µП, при одузимању два шеснаесто-битна броја, ознака за ношење се поставља само једном за прво одузимање. За друго одузимање, било које подешавање заставице за ношење се врши аутоматски.

Програмирање одузимања за осам-битне бројеве или шеснаест-битне бројеве се врши слично програмирању сабирања. Међутим, заставица за ношење мора бити постављена на самом почетку. Мнемоника за ово је:

Одузимање са шеснаест-битним позитивним бројевима
Размотрите одузимање са следећим бројевима:

Ово одузимање не укључује допуну два. Пошто се одузимање у 6502 µП врши у комплементу два, одузимање у основи два се врши на следећи начин:

Резултат комплемента два је исти као резултат који се добија обичним одузимањем. Међутим, имајте на уму да се 1 који иде на позицију седамнаестог бита са десне стране игнорише. Минуенд и субтрахенд се деле на два бита осмице сваки. Комплемент два од 10010110 нижег бајта одузимања одређује се независно од његовог вишег бајта и било каквог преноса. Комплемент два од 11101011 вишег бајта одузимања одређује се независно од његовог нижег бајта и било каквог преноса.

16-бита минуенда је већ у комплементу два, почевши од 0 са леве стране. Дакле, није потребно никакво подешавање у битовима. Са 6502 µП, доњи бајт минуенда без икаквих модификација се додаје нижем бајту два комплемента одузетог. Доњи бајт минуенда се не конвертује у комплемент двојке јер шеснаест битова целог минуенда мора већ бити у комплементу два (са 0 као првим битом са леве стране). У овом првом додавању, обавезно ношење од 1 се додаје због инструкције 1=0 СЕЦ.

У тренутном ефективном одузимању, постоји пренос 1 (сабирања) од осмог до деветог бита (са десне стране). Пошто је ово ефективно одузимање, било који бит који би требало да буде у заставици за пренос у статусном регистру се допуњава (обрће). Дакле, пренос 1 постаје 0 у застави Ц. У другој операцији, виши бајт минуенда се додаје комплементарном бајту вишег два одузетог. Аутоматски допуњен бит заставице ношења статусног регистра (у овом случају је 0) се такође додаје (вишим бајтовима). Сваки 1 који иде даље од шеснаестог бита са десне стране се игнорише.

Следећа ствар је само да кодирате сву ту шему на следећи начин:

СЕЦ
ЛДА $0213
СБЦ $0215
; нема брисања јер је потребна обрнута вредност заставице ношења
СТА $0217
ЛДА $0214
СБЦ $0216
СТА $0218

Запамтите да код асемблерског језика 6502 тачка-зарез почиње коментар који није укључен у преведену верзију програма у меморији. Два 16-битна броја за одузимање заузимају четири бајта меморије са апсолутним адресирањем; два по броју (меморија је низ бајтова). Ови улази нису са тастатуре. Резултат сумирања су два бајта и такође се морају ставити у меморију на друго место. Овај излаз не иде на монитор или штампач; иде у сећање. Ово даје укупно 6 10 = 6 16 бајтова за улазе и излазе који се стављају у меморију (РАМ).

Пре него што се програм изврши, он прво мора да буде у меморији. Гледајући програмски код, види се да упутства без коментара чине 19 10 = 13 16 бајтова. Пошто сви програми у овом поглављу почињу од меморијске локације од $0200, програм прелази са локације $0200 бајтова у меморији на локацију $0200 + $13 – $1 = $0212 бајтова (почев од $0200, а не $0201). Овај опсег не укључује регион за улазне и излазне бајтове. Два улазна броја заузимају 4 бајта, а један излазни број 2 бајта. Додавањем 6 бајтова за улазне и излазне бројеве чини опсег за програм који се завршава на $0212 + $6 = $0218. Укупна дужина програма је 19 16 = 25 10 .

Нижи бајт минуенда треба да буде на адреси $0213, а виши бајт истог минуенда треба да буде у адреси $0214 – мали ендианнесс. Слично томе, нижи бајт одузимања треба да буде на адреси $0215, а виши бајт истог одузимања треба да буде у адреси $0216 – мали ендианнесс. Нижи бајт резултата (разлика) треба да буде у адреси $0217, а виши бајт истог резултата треба да буде у адреси $0218 – мали ендианнесс.

Оперативни код 38 16 за СЕЦ (имплицирано адресирање) је у адреси $0200. Претпоставља се да сви програми у овом поглављу почињу на меморијској локацији од $0200, поништавајући сваки програм који би тамо постојао; осим што је другачије наведено. Оперативни код за „ЛДА $0213“, тј. АД 16 , за ЛДА (апсолутно адресирање) је на локацији $0201 бајта. Доњи бајт минуенда који је 10111111 налази се на локацији меморијског бајта од $0213. Запамтите да сваки опкод заузима један бајт. Адреса „$0213“ за „ЛДА $0213“ је на локацијама бајтова $0202 и $0203. Инструкција “ЛДА $0213” учитава нижи бајт минуенда у акумулатор.

Оперативни код за „СБЦ $0215“, тј. ЕД 16 , за СБЦ (апсолутно адресирање) је на локацији $0204 бајта. Доњи бајт одузимања који је 01101010 налази се на локацији $0215 бајтова. Адреса „$0215“ за „АДЦ $0215“ је на локацијама бајтова $0205 и $0206. Инструкција “СБЦ $0215” одузима нижи бајт одузимања од нижег бајта минуенда који је већ у акумулатору. Ово је одузимање комплемента два. Резултат се враћа у акумулатор. Комплемент (инверзија) било ког преноса после осмог бита се шаље у заставицу за пренос статусног регистра. Ова ознака за ношење се не сме обрисати пре другог одузимања са вишим бајтовима. Овај пренос се аутоматски додаје одузимању виших бајтова.

Коментар траје следећих 57 10 = 3916 16 бајтова. Међутим, ово остаје само у текстуалној датотеци „.асм“. Не допире до сећања. Уклања се преводом који ради асемблер (програм).

За следећу инструкцију која је „СТА $0217“, опкод СТА, тј. 8Д 16 (апсолутно адресирање), налази се на локацији $0207 бајтова. Адреса „$0217“ за „СТА $0217“ је на меморијским локацијама од $0208 и $0209. Инструкција „СТА $0217“ копира осмобитни садржај акумулатора на меморијску локацију од $0217.

Виши бајт минуенда који је 00101010 налази се на меморијској локацији од $0214, а виши бајт одузимања који је 00010101 налази се на локацији бајта од $0216. Оперативни код за „ЛДА $0214“, тј. АД 16 за ЛДА (апсолутно адресирање), налази се на $020А бајт локацији. Адреса „$0214“ за „ЛДА $0214“ налази се на локацијама од $020Б и $020Ц. Инструкција “ЛДА $0214” учитава виши бајт минуенда у акумулатор, бришући све што се налази у акумулатору.

Оперативни код за „СБЦ $0216“, тј. ЕД 16 за СБЦ (апсолутно адресирање), налази се на локацији $020Д бајтова. Адреса „$0216“ за „СБЦ $0216“ је на локацијама бајтова $020Е и $020Ф. Инструкција „СБЦ $0216“ одузима виши бајт одузимања од вишег бајта минуенда (комплемента два) који је већ у акумулатору. Резултат се враћа у акумулатор. Ако постоји пренос 1 за ово друго одузимање, његов комплемент се аутоматски ставља у ћелију за пренос статусног регистра. Иако пренос преко шеснаестог бита (лево) није потребан за овај проблем, лепо је проверити да ли се пренос комплемента јавља тако што ћете проверити заставицу за пренос.

За следећу и последњу инструкцију која је „СТА $0218“, опцоде СТА, тј. 8Д 16 (апсолутно адресирање), налази се на локацији $0210 бајтова. Адреса „$0218“ за „СТА $0218“ налази се на меморијским локацијама од $0211 и $0212. Инструкција „СТА $0218” копира осмобитни садржај акумулатора на меморијску локацију од $0218. Резултат одузимања са два шеснаесто-битна броја је 0001010101010101 са нижим бајтом 01010101 на меморијској локацији од $0217 и вишим бајтом од 00010101 на меморијској локацији од $0218 – мали ендианнесс.

6502 µП има кола само за сабирање и индиректно за одузимање комплемента. Нема кола за множење и дељење. Да бисте извршили множење и дељење, треба написати програм на асемблеру са детаљима, укључујући померање делимичних производа и делимичних дивиденди.

4.4 Логичке операције

У 6502 µП, мнемоника за ОР је ОРА, а мнемоника за ексклузивно ОР је ЕОР. Приметите да логичке операције немају подразумевано адресирање. Подразумевано адресирање не узима операнд. Сваки од логичких оператора мора узети два операнда. Први је у акумулатору, а други у меморији или у инструкцији. Резултат (8 бита) се враћа у акумулатор. Први у акумулатору се или ставља непосредном инструкцијом или се копира из меморије са апсолутним адресирањем. У овом одељку за илустрацију се користи само адресирање нулте странице. Сви ови логички оператори су битни оператори.

И
Следећа табела илуструје Битвисе АНД у бинарном, хексадецималном и децималном систему:

Сви програми у овом поглављу треба да почну на локацији меморијског бајта од $0200. Међутим, програми у овом одељку су на нултој страници, са циљем да илуструју употребу нулте странице без вишег бајта од 00000000 2 . Претходни АНДинг може бити кодиран на следећи начин:

ЛДА #$9А; не из сећања – непосредно обраћање
АНД #$ЦД ; не из сећања – непосредно обраћање
СТА $30 ; складишти 88 долара на 0030 долара на нули

ИЛИ
Следећа табела илуструје битовско ОР у бинарном, хексадецималном и децималном систему:

ЛДА #$9А; не из сећања – непосредно обраћање
ОРА #$ЦД ; не из сећања – непосредно обраћање
СТА $30 ; складишти $ЦФ на 0030 $ на нули

БЕСПЛАТНО
Следећа табела илуструје Битвисе КСОР у бинарном, хексадецималном и децималном систему:

ЛДА #$9А; не из сећања – непосредно обраћање
ЕОР #$ЦД ; не из сећања – непосредно обраћање
СТА $30 ; складишти 57 долара по 0030 долара на нули

4.5 Операције померања и ротације

Мнемоника и опкодови за операторе померања и ротације су:

АСЛ: Померите улево за један бит акумулатора или меморијске локације, убацујући 0 у напуштену крајњу десну ћелију.

ЛСР: Померите удесно за један бит акумулатора или меморијске локације, убацујући 0 у напуштену крајњу леву ћелију.
РОЛ: Ротирајте један бит лево од акумулатора или меморијске локације, убацујући бит који је испуштен са леве стране у напуштену крајњу десну ћелију.
РОР: Ротирајте један бит десно од акумулатора или меморијске локације, убацујући бит који је испуштен са десне стране у испражњену крајњу леву ћелију.

Да бисте извршили смену или ротацију са акумулатором, инструкција је отприлике овако:

ЛСР А

Ово користи други начин адресирања који се назива режим адресирања акумулатора.

Да бисте извршили померање или ротацију са меморијском локацијом бајтова, инструкција је отприлике оваква:

РОР $2БЦД

Где је 2БЦД меморијска локација.

Имајте на уму да не постоји непосредан или подразумевани режим адресирања за померање или ротирање. Не постоји режим тренутног адресирања јер нема смисла померати или ротирати број који остаје само у инструкцији. Не постоји начин подразумеваног адресирања јер дизајнери 6502 µП желе да се само садржај акумулатора (А регистар) или локација меморијског бајта помера или ротира.

4.6 Релативни начин адресирања

Микропроцесор увек повећава (за 1, 2 или 3 јединице) бројач програма (ПЦ) да би показао на следећу инструкцију која треба да се изврши. 6502 µП има инструкцију чија је мнемоника БВС што значи Бранцх он Оверфлов Сет. Рачунар се састоји од два бајта. Ова инструкција узрокује да рачунар има другачију меморијску адресу за следећу инструкцију која треба да се изврши, а не као резултат нормалног повећања. То чини додавањем или одузимањем вредности, која се зове помак, садржају рачунара. И тако, рачунар тада показује на другу (разгранату) меморијску локацију да би рачунар одатле наставио да извршава. Помак је цео број од -128 10 до +127 10 (комплемента два). Дакле, померање може учинити да се скок настави у меморији. Ако је позитиван или иза у памћењу, или ако је негативан.

БВС инструкција узима само један операнд који је офсет. БВС користи релативно адресирање. Размотрите следеће упутство:

БВС $7Ф

У бази два, 7Ф Х је 01111111 2 = 127 10 . Претпоставимо да је садржај на рачунару за следећу инструкцију 0300 УСД. БВС инструкција узрокује да се $7Ф (позитиван број који је већ у комплементу два) дода на $0300 да би се добило $037Ф. Дакле, уместо следеће инструкције која треба да се изврши на меморијској локацији од $0300, она је на меморијској локацији од $037Ф (приближно пола странице разлике).

Постоје и друга упутства за гранање, али БВС је веома добра за илустрацију релативног адресирања. Релативно адресирање се бави упутствима гране.

4.7 Индексирано адресирање и индиректно адресирање одвојено

Ови начини адресирања омогућавају 6502 µП да рукује огромним количинама података у кратким временским периодима са смањеним бројем инструкција. Постоји 64 КБ локација за целу Цомодоре-64 меморију. Дакле, за приступ било којој локацији бајтова, од 16 бита, потребна су два бајта. Једини изузетак од потребе за два бајта је за нулту страницу где је већи бајт од $00 изостављен да би се уштедио простор који заузима инструкција у меморији. Код начина адресирања без нулте странице, и виши и нижи бајтови 16-битне меморијске адресе су углавном некако назначени.

Основно индексирано адресирање

Апсолутно индексно адресирање
Запамтите да се Кс или И регистар назива индексни регистар. Размотрите следеће упутство:

ЛДА $Ц453,Кс

Претпоставимо да је вредност 6 Х налази се у регистру Кс. Имајте на уму да 6 није уписано нигде у инструкцији. Ово упутство додаје вредност 6Х на Ц453 Х који је део откуцане инструкције у текстуалној датотеци која тек треба да се састави – Ц453 Х + 6 Х = Ц459 Х . ЛДА значи учитавање бајта у акумулатор. Бајт који се учитава у акумулатор долази са адресе $Ц459. $Ц459 који је збир $Ц453 који је унет са упутством и 6 Х која се налази у регистру Кс постаје ефективна адреса са које долази бајт који се учитава у акумулатор. Ако 6 Х је у И регистру, И се уписује уместо Кс у инструкцији.

У откуцаној инструкцији, $Ц453 је познат као основна адреса и 6 Х у регистру Кс или И познат је као део за бројање или индекс за ефективну адресу. Основна адреса се може односити на било коју бајт адресу у меморији, а следећа 256 10 адресама се може приступити, под претпоставком да је почетни индекс (или бројање) у регистру Кс или И 0. Запамтите да један бајт може дати континуирани опсег до 256 10 бројеви (тј. 00000000 2 до 11111111 2 ).

Дакле, апсолутно адресирање додаје све што је већ стављено (што је стављено другом инструкцијом) у регистар Кс или И на 16 адреса које су откуцане уз инструкцију да би се добила ефективна адреса. У откуцаној инструкцији, два индексна регистра се разликују по Кс или И који се куцају иза зареза. Откуцава се или Кс или И; не ОБОЈЕ.

Након што се сав програм откуца у уређивачу текста и сачува са екстензијом „.асм“ назива датотеке, асемблер, који је други програм, мора да преведе откуцани програм у оно што је (учитано) у меморији. Претходна инструкција, а то је „ЛДА $Ц453,Кс“, заузима три локације бајта у меморији, а не пет.

Запамтите да мнемоника као што је ЛДА може имати више од једног опкода (различитих бајтова). Оперативни код за инструкцију која користи Кс регистар се разликује од кода операције који користи И регистар. Асемблер зна који опкод да користи на основу откуцане инструкције. Оперативни код од једног бајта за „ЛДА $Ц453,Кс“ се разликује од једнобајтног кода за „ЛДА $Ц453,И“. У ствари, оперативни код за ЛДА у „ЛДА $Ц453,Кс” је БД, а код операције за ЛДА у „ЛДА $Ц453,9” је БД.

Ако је операцијски код за ЛДА на локацији $0200 бајтова. Затим, 16-битна адреса од $Ц453 заузима следеће место поред бајтова у меморији које су $0201 и $0202. Одређени бајт кода операције показује да ли је у питању Кс или И регистар. И тако, инструкција састављеног језика која је „ЛДА $Ц453,Кс“ или „ЛДА $Ц453,И“ заузима три узастопна бајта у меморији, а не четири или пет.

Индексирано адресирање нулте странице
Адресирање индекса нулте странице је као апсолутно адресирање индекса које је претходно описано, али циљни бајт мора бити само на нултој страници (од $0000 до $00ФФ). Сада, када се ради са нултом страницом, виши бајт који је увек 00 Х јер се меморијске локације обично избегавају. Дакле, обично се помиње да нулта страница почиње од $00 до ФФ. И тако, претходна инструкција „ЛДА $Ц453,Кс“ је:

ЛДА $53.Кс

$Ц4, виши бајт који се односи на страницу изнад нулте странице, не може се користити у овој инструкцији јер поставља очекивани циљни бајт који се учитава у акумулирани бајт изван и изнад нулте странице.

Када се вредност која је уписана у инструкцији дода вредности у регистру индекса, збир не би требало да даје резултат изнад нулте странице (ФФ Х ). Дакле, не долази у обзир да имате инструкцију попут „ЛДА $ФФ, Кс“ и вредност као што је ФФ Х у индексном регистру јер ФФ Х + ФФ Х = 200 Х што је локација првог бајта (0200$) странице 2 (треће странице) у меморији, је велика удаљеност од странице 0. Дакле, са адресирањем индексираним са нултом страницом, ефективна адреса мора да лежи на нултој страници.

Индиректно адресирање

Скочи на апсолутно адресирање
Пре дискусије о апсолутном индиректном адресирању, добро је прво погледати ЈМП апсолутно адресирање. Претпоставимо да је адреса која има вредност од интереса (циљни бајт) 8765 долара. Ово је 16 бита који се састоји од два бајта: виши бајт који је 87 Х и доњи бајт који је 65 Х . Дакле, два бајта за 8765 долара се стављају у рачунар (програмски бројач) за следећу инструкцију. Оно што је укуцано у програм (фајл) асемблерског језика је:

ЈМП $8765

Извршни програм у меморији скаче са адресе којој год да је приступио на 8765 долара. ЈМП мнемоника има три опкода који су 4Ц, 6Ц и 7Ц. Оперативни код за ово апсолутно адресирање је 4Ц. Оперативни код за апсолутно индиректно адресирање ЈМП је 6Ц (погледајте следеће илустрације).

Апсолутно индиректно адресирање
Ово се користи само са инструкцијом за скок (ЈМП). Претпоставимо да је адреса која има бајт од интереса (циљни бајт) 8765 долара. Ово је 16 бита који се састоји од два бајта: виши бајт који је 87 Х и доњи бајт који је 65 Х . Са апсолутним индиректним адресирањем, ова два бајта се заправо налазе на две узастопне локације бајтова негде другде у меморији.

Претпоставимо да се налазе на меморијским локацијама $0210 и $0211. Затим, доњи бајт адресе од интереса која је 65 Х је на адреси $0210, а виши бајт који је 87 Х је на адреси $0211. То значи да нижи меморијски бајт од интереса иде на нижу узастопну адресу, а виши меморијски бајт од интереса иде на вишу узастопну адресу – мали ендианнесс.

16-битна адреса се може односити на две узастопне адресе у меморији. У том светлу, адреса $0210 се односи на адресе $0210 и $0211. Адресни пар $0210 и $0211 садржи крајњу адресу (16 бита од два бајта) циљног бајта, са нижим бајтом од 65 Х у $0210 и виши бајт од 87 Х у $0211. Дакле, инструкција за скок која је укуцана је:

ЈМП (0210 УСД)

ЈМП мнемоника има три опкода који су 4Ц, 6Ц и 7Ц. Оперативни код за апсолутно индиректно адресирање је 6Ц. Оно што је откуцано у текстуалној датотеци је „ЈМП ($0210)“. Због заграда асемблер (преводилац) користи опкод 6Ц за ЈМП, а не 4Ц или 7Ц.

Са апсолутним индиректним адресирањем, заправо постоје три меморијска региона. Први регион се може састојати од локација бајтова од $0200, $0201 и $0202. Ово има три бајта за инструкцију „ЈМП ($0210)“. Други регион, који није нужно поред првог, састоји се од две узастопне локације бајтова $0210 и $0211. То је нижи бајт овде ($0210) који је откуцан у инструкцији програма асемблерског језика. Ако је адреса од интереса 8765 долара, доњи бајт од 65 Х је на локацији $0210 бајтова, а виши бајт од 87 Х налази се на локацији $0211 бајтова. Трећи регион се састоји од само једне локације бајта. То је адреса од $8765 за циљани бајт (крајњи бајт од интереса). Пар узастопних адреса, $0210 и $0211, садржи показивач $8765 који је адреса од интереса. Након компјутерске интерпретације, 8765 долара иде у ПЦ (програмски бројач) за приступ циљном бајту.

Индиректно адресирање нулте странице
Ово адресирање је исто као апсолутно индиректно адресирање, али показивач мора бити на нултој страници. Адреса нижег бајта региона показивача је оно што је у откуцаној инструкцији како следи:

ЈМП (50 УСД)

Виши бајт показивача је на локацији од 51 бајта. Ефективна адреса (показана) не мора да буде на нултој страници.

Дакле, код индексног адресирања, вредност у индексном регистру се додаје основној адреси која је дата у инструкцији да има ефективну адресу. Индиректно адресирање користи показивач.

4.8 Индексирано индиректно адресирање

Апсолутно индексирано индиректно адресирање
Овај начин адресирања се користи само са ЈМП инструкцијама.
Код апсолутног индиректног адресирања, постоји показана вредност (бајт) са своје две узастопне бајт адресе. Ове две узастопне адресе формирају показивач који се налази у области показивача два узастопна бајта у меморији. Доњи бајт региона показивача је оно што је уписано у инструкцији у загради. Показивач је адреса означене вредности. У претходној ситуацији, $8765 је адреса назначене вредности. $0210 (прати $0211) је адреса чији је садржај $8765 што је показивач. Са режимом апсолутног индиректног адресирања, то је ($0210) оно што се уписује у програм (текстуални фајл), укључујући заграде.

Са друге стране, са режимом апсолутног индексног индиректног адресирања, доњи бајт адресе за регион показивача се формира додавањем вредности у Кс регистру укуцаној адреси. На пример, ако је показивач на адреси адресе $0210, откуцана инструкција може бити овако:

ЈМП (020 УСД, Кс)

Где Кс регистар има вредност 6 Х . 020А Х + 6 Х = 0210 Х . И регистар се не користи са овим начином адресирања.

Индиректно адресирање индексирано на нулти страници
Овај начин адресирања користи Кс регистар а не И регистар. Са овим начином адресирања, још увек постоје показана вредност и показивач у свом двобајтном региону показивача адресе. Морају бити два узастопна бајта на нултој страници за показивач. Адреса која је уписана у инструкцији је адреса од једног бајта. Ова вредност се додаје вредности у регистру Кс и сваки пренос се одбацује. Резултат указује на регион показивача на страници 0. На пример, ако је адреса од интереса (показана) $8765 и налази се на локацијама бајтова $50 и $51 на страници 0, а вредност у Кс регистру је $30, откуцана инструкција је отприлике овако:

ЛДА (20 УСД)

Зато што $20 + $30 = $50.

Индиректно индексирано адресирање
Овај начин адресирања користи регистар И, а не Кс регистар. Са овим начином адресирања, и даље постоје показана вредност и регион показивача, али садржај региона показивача функционише другачије. Морају бити два узастопна бајта на нултој страници за регион показивача. У инструкцији се уписује доња адреса региона показивача. Овај број (пар бајтова) који се налази у региону показивача додаје се вредности у И регистру да би се добио прави показивач. На пример, нека адреса од интереса (показана) буде $8765, вредност 6Х буде у И регистру, а број (два бајта) на адреси 50 Х и 51 Х . Два бајта заједно су $875Ф од $875Ф + $6 = $8765. Откуцана инструкција је отприлике овако:

ЛДА (50 УСД), И

4.9 Инструкције за повећање, смањење и тест-БИТ-ове

Следећа табела приказује операције инструкција за повећање и смањење:

ИНА и ДЕА повећавају и смањују акумулатор, респективно. То се зове акумулаторско адресирање. ИНКС, ДЕКС, ИНИ и ДЕИ су за Кс и И регистре, респективно. Они не узимају ниједан операнд. Дакле, они користе подразумевани начин адресирања. Повећање значи додавање 1 регистру или меморијском бајту. Декремент значи одузимање 1 од регистра или меморијског бајта.

ИНЦ и ДЕЦ повећавају и смањују меморијски бајт, респективно (а не регистар). Коришћење нулте странице уместо апсолутног адресирања је да се уштеди меморија за инструкцију. Нулто адресирање страница је један бајт мање од апсолутног адресирања за инструкцију у меморији. Међутим, режим адресирања нулте странице утиче само на нулту страницу.

БИТ инструкција тестира битове бајта у меморији са 8 битова у акумулатору, али не мења ниједно. Постављају се само неке заставице регистра статуса процесора „П“. Битови наведене меморијске локације су логички повезани са битовима акумулатора. Затим се постављају следећи статусни битови:

  • Н који је бит 7 и последњи бит (лево) статусног регистра, прима бит 7 меморијске локације пре АНДинга.
  • В који је бит 6 статусног регистра прима бит 6 меморијске локације пре АНДинга.
  • Ознака З статусног регистра је постављена (направљена је 1) ако је резултат АНД нула (00000000 2 ). У супротном се брише (направљено 0).

4.10 Упореди упутства

Мнемонике инструкција за поређење за 6502 µП су ЦМП, ЦПКС и ЦПИ. После сваког поређења, утичу на ознаке Н, З и Ц регистра статуса процесора „П“. Ознака Н се поставља (направи 1) када је резултат негативан број. Ознака З је постављена (направљена 1) када је резултат нула (000000002). Ознака Ц се поставља (направи 1) када постоји пренос од осмог до деветог бита. Следећа табела даје детаљну илустрацију

Значи „већи од“. Уз то, табела за поређење треба да буде разумљива сама по себи.

4.11 Инструкције за скок и гранање

Следећа табела резимира упутства за скок и гранање:

ЈМП инструкција користи апсолутно и индиректно адресирање. Остатак инструкција у табели су упутства за гране. Они користе само релативно адресирање са 6502 µП. Тиме табела постаје саморазумљива ако се чита с лева на десно и одозго на доле.

Имајте на уму да се гране могу применити само на адресе унутар -128 до +127 бајтова од дате адресе. Ово је релативно адресирање. И за ЈМП и за упутства о гранању, програмски бројач (ПЦ) је директно погођен. 6502 µП не дозвољава гране на апсолутну адресу, иако скок може да изврши апсолутно адресирање. ЈМП инструкција није инструкција гране.

Белешка: Релативно адресирање се користи само са инструкцијама гранања.

4.12 Подручје стека

Потпрограм је као један од претходних кратких програма за сабирање два броја или одузимање два броја. Подручје стека у меморији почиње од $0100 до $01ФФ укључујући. Ова област се једноставно зове стек. Када микропроцесор изврши скок на инструкцију потпрограма (ЈСР – погледајте следећу дискусију), мора да зна где да се врати када заврши. 6502 µП чува ове информације (повратну адресу) у малој меморији од $0100 до $01ФФ (област стека) и користи садржај регистра показивача стека који је „С“ у микропроцесору као показивач (9 бита) на последњу враћену адресу која је ускладиштена на страници 1 ($0100 до $01ФФ) меморије. Стек расте са $01ФФ и омогућава угнежђење потпрограма до 128 нивоа у дубину.

Друга употреба показивача стека је руковање прекидима. 6502 µП има пинове означене као ИРК и НМИ. Могуће је да се неки мали електрични сигнали примене на ове пинове и доведу до тога да 6502 µП престане са извршавањем једног програма и натера га да почне да извршава други. У овом случају, први програм се прекида. Као и потпрограми, сегменти кода прекида могу бити угнежђени. Обрада прекида се разматра у следећем поглављу.

Белешка : Показивач стека има 8 битова за адресу нижег бајта у адресирању локација од $0100 до $01ФФ. Виши бајт од 00000001 2 претпоставља.

Следећа табела даје упутства која повезују показивач стека „С“ са регистрима А, Кс, И и П са подручјем стека у меморији:

4.13 Позив и повратак потпрограма

Потпрограм је скуп инструкција којима се постиже одређени циљ. Претходни програм сабирања или одузимања је веома кратка потпрограм. Потпрограми се понекад називају само рутинама. Упутство за позивање потпрограма је:

ЈСР : Пређите на подрутину

Инструкција за повратак из потпрограма је:

РТС : Повратак из потпрограма

Микропроцесор има тенденцију да непрекидно извршава инструкције у меморији, једну за другом. Претпоставимо да микропроцесор тренутно извршава сегмент кода и да наиђе на инструкцију скока (ЈМП) да оде и изврши сегмент кода иза којег је можда већ извршен. Он извршава тај сегмент кода иза и наставља да извршава све сегменте кода (инструкције) пратећи сегмент кода иза, све док поново не изврши тренутни сегмент кода и настави испод. ЈМП не гура следећу инструкцију у стек.

За разлику од ЈМП-а, ЈСР гура адресу следеће инструкције иза себе са рачунара (програмски бројач) у стек. Положај стека ове адресе се налази у показивачу стека „С“. Када се РТС инструкција наиђе (изврши) у потпрограму, адреса која је гурнута на стек повлачи стек и програм наставља на тој повученој адреси која је следећа адреса инструкције непосредно пре позива потпрограма. Последња адреса која је уклоњена из стека се шаље програмском бројачу. У следећој табели су дати технички детаљи упутства за ЈСР и РТС:

Погледајте следећу илустрацију за употребу ЈСР-а и РТС-а:

4.14 Пример петље за одбројавање

Следећи потпрограм одбројава од $ФФ до $00 (укупно 256 10 рачуна се):

старт ЛДКС #$ФФ; оптерећење Кс са $ФФ = 255
лооп ДЕКС ; Кс = Кс – 1
БНЕ лооп ; ако Кс није нула онда гото петља
РТС ; повратак

Сваки ред има коментар. Коментари никада не улазе у меморију ради извршења. Асемблер (преводилац) који конвертује програм у оно што се налази у меморији за извршење (покретање) увек уклања коментаре. Коментар почиње са „;“ . „Старт“ и „петља“ у овом програму се називају ознакама. Ознака идентификује (име) за адресу инструкције. Ако је инструкција инструкција од једног бајта (имплицирано адресирање), ознака је адреса те инструкције. Ако је инструкција вишебајтна инструкција, ознака идентификује први бајт за вишебајтну инструкцију. Прва инструкција за овај програм састоји се од два бајта. Под претпоставком да почиње на адреси $0300, адреса $0300 може бити замењена са 'старт' доле у ​​програму. Друга инструкција (ДЕКС) је инструкција од једног бајта и требало би да буде на адреси $0302. То значи да се адреса $0302 може заменити са „петља“, доле у ​​програму, што је заправо тако у „БНЕ петљи“.

„БНЕ петља“ означава гранање на дату адресу када је ознака З статусног регистра 0. Када је вредност у А или Кс или И регистру 00000000 2 , због последње операције, З заставица је 1 (постављена). Дакле, док је 0 (а не 1), друга и трећа инструкција у програму се понављају тим редоследом. У сваком поновљеном низу, вредност (цео број) у Кс регистру се смањује за 1. ДЕКС значи Кс = Кс – 1. Када је вредност у Кс регистру $00 = 00000000 2 , З постаје 1. У том тренутку више нема понављања две инструкције. Последња РТС инструкција у програму, која је једнобајтна инструкција (подразумевано адресирање), враћа се из потпрограма. Ефекат ове инструкције је да направи адресу програмског бројача у стеку за код који треба да се изврши пре позива потпрограма и врати се на програмски бројач (ПЦ). Ова адреса је адреса инструкције која треба да се изврши пре позивања потпрограма.

Белешка: Када пишете програм на асемблерском језику за 6502 µП, само ознака мора да почиње на почетку реда; било који други код линије мора бити померен за најмање један размак удесно.

Позивање потпрограма
Занемарујући меморијски простор који заузимају претходне ознаке, програм заузима 6 бајтова узастопних локација у меморији (РАМ) од 0300 до 0305 долара. У овом случају, програм је:

ЛДКС #$ФФ ; оптерећење Кс са $ФФ = 255
ДЕКС ; Кс = Кс – 1
БНЕ $0302 ; ако Кс није нула онда гото петља
РТС ; повратак

Почевши од адресе $0200 у меморији може бити позив за потпрограм. Упутство за позив је:

ЈСР старт ; почетак је адреса $0300, односно ЈСР $0300

Потпрограм и његов позив који су исправно написани у датотеци за уређивање текста су:

старт ЛДКС #$ФФ; оптерећење Кс са $ФФ = 255
лооп ДЕКС ; Кс = Кс – 1

БНЕ лооп ; ако Кс није нула онда гото петља
РТС ; повратак

Почетак ЈСР-а: пређите на рутину од 0300 УСД

Сада, у једном дугом програму може бити много потпрограма. Сви они не могу имати назив „старт“. Требало би да имају различита имена. У ствари, ниједан од њих можда нема назив „почетак“. „Старт“ се овде користи из наставних разлога.

4.15 Превођење програма

Превођење програма или његово склапање значи исто. Размотрите следећи програм:

старт ЛДКС #$ФФ : учитавање Кс са $ФФ = 255
петља ДЕКС : Кс = Кс – 1
БНЕ петља: ако Кс није нула онда гото петља
РТС : повратак
Почетак ЈСР-а: пређите на рутину од 0300 УСД

Ово је програм који је претходно написан. Састоји се од потпрограма, старта и позива потпрограма. Програм одбројава од 255 10 до 0 10 . Програм почиње на почетној адреси корисника од $0200 (РАМ). Програм се куца у уређивачу текста и чува на диску. Има име попут „сампле.асм“ где је „сампле“ име по избору програмера, али екстензија „.асм“ за асемблерски језик мора бити повезана са именом датотеке.

Састављени програм производи други програм који се назива асемблер. Асемблер испоручује произвођач 6502 µП или трећа страна. Асемблер репродукује програм на такав начин да се налази у меморији (РАМ) док се извршава (покреће).

Претпоставимо да ЈСР инструкција почиње на адреси $0200, а потпрограм почиње на адреси $0300. Асемблер уклања све коментаре и беле просторе. Коментари и празни простори троше сећање које је увек мало. Могућа празна линија између претходног сегмента кода потпрограма и позива потпрограма је пример размака. Састављена датотека је и даље сачувана на диску, а зове се нешто попут „сампле.еке“. „Узорак“ је име по избору програмера, али екстензија „.еке“ би требало да постоји да би означила да је то извршна датотека.

Састављени програм се може документовати на следећи начин:

Израда оваквог документа се каже да се саставља ручно. Имајте на уму да се коментари у овом документу не појављују у меморији (за извршење). Колона адреса у табели означава почетне адресе инструкција у меморији. Имајте на уму да је „ЈСР старт“ тј. „ЈСР $0300“, за који се очекује да буде кодиран као „20 03 00“, заправо кодиран као „20 00 03“ при чему адреса доњег меморијског бајта заузима нижи бајт у меморији и виша адреса меморијског бајта заузима виши бајт у меморији – мали ендианнесс. Опкод за ЈСР је 20 16 .

Имајте на уму да је помак према инструкцији гранања као што је БНЕ комплементарни број двојке у опсегу од 128 10 до + 127 10 . Дакле, „БНЕ петља“ значи „БНЕ -1 10 ” што је заправо „Д0 ФФ” у кодном облику ФФ 16 је -1 у комплементу два који је записан као = 11111111 у основи два. Програм асемблера замењује ознаке и поља стварним хексадецималним бројевима (хексадецимални бројеви су бинарни бројеви који су груписани у четири бита). Стварне адресе на којима свака инструкција почиње су заправо укључене.

Белешка: Инструкција „ЈСР старт“ је замењена краћим инструкцијама које шаљу тренутни садржај (високе и ниске бајтове) програмског бројача у стек са показивачем стека који се смањује два пута (једном за високи бајт и једном за мали бајт) и затим поново учитава рачунар са адресом од $0300. Показивач стека сада показује на $00ФД, под претпоставком да је иницијализован на $01ФФ.

Такође, РТС инструкција је замењена низом краћих инструкција које повећавају показивач стека „С“ два пута (једном за нижи бајт и једном за високи бајт) и повлаче одговарајућа два бајта адресе са показивача стека на ПЦ за следеће упутство.

Белешка: Текст ознаке не би требало да има више од 8 знакова.

„БНЕ петља“ користи релативно адресирање. То значи додати -3 10 на следећи садржај бројача програма од $0305. Бајтови за „БНЕ петљу“ су „Д0 ФД“ где је ФД комплемент два од -3 10 .

Напомена: Ово поглавље не представља сва упутства за 6502 µП. Сва упутства и њихови детаљи могу се наћи у документу под насловом “СИ6500 8-Бит Мицропроцессор Фамили”. За овај документ постоји ПДФ датотека под називом „6502.пдф“ која је слободно доступна на Интернету. 6502 µП који је описан у овом документу је 65Ц02.

4.16 Прекиди

Сигнали било ког уређаја који је повезан на спољне (вертикалне површине) портове Цоммодоре 64 морају да прођу или кроз ЦИА 1 или ЦИА 2 кола (ИЦ) пре него што стигну до 6502 микропроцесора. Сигнали са магистрале података 6502 µП морају да прођу или кроз ЦИА 1 или ЦИА 2 чип пре него што стигну до било ког спољног уређаја. ЦИА је скраћеница од Цомплек Интерфаце Адаптер. На слици 4.1 „Блок дијаграм Цоммодоре_64 матичне плоче“, блок улазно/излазни уређаји представљају ЦИА 1 и ЦИА 2. Када је програм покренут, може се прекинути да би се покренуо неки други део кода пре него што се настави. Постоји хардверски прекид и прекид софтвера. За хардверски прекид постоје два улазна сигнална пина на 6502 µП. Називи ових пинова су ИРК и НМИ . Ово нису µП линије података. Линије података за µП су Д7, Д6, Д5, Д4, Д3, Д2, Д1 и Д0; са Д0 за најмањи битни бит и Д7 за најзначајнији бит.

ИРК означава Интеррупт РеКуест „активан“ низак. Ова улазна линија за µП је нормално висока, на приближно 5 волти. Када падне на приближно 0 волти, то је захтев за прекид који сигнализира µП. Чим се захтев одобри, линија се враћа високо. Одобравање захтева за прекид значи да се µП грана на код (потпрограм) који рукује прекидом.

НМИ означава „активан“ низак ниво прекида који се не може маскирати. Док код за ИРК се извршава НМИ може ићи ниско. У овом случају, НМИ се рукује (извршава се сопствени код). Након тога, код за ИРК наставља. После кода за ИРК завршава, наставља се главни програмски код. То је, НМИ прекида се ИРК руковалац. Сигнал за НМИ и даље се може дати µП чак и када је µП неактиван и не рукује ничим или не покреће главни програм.

Белешка: То је заправо прелаз са високог на ниско, од НМИ , то је НМИ сигнал - више о томе касније. ИРК обично долази из ЦИА 1 и НМИ обично долази из ЦИА 2. НМИ , што је скраћеница за непрекид који се не може маскирати, може се сматрати прекидом који се не може зауставити.

Руковање прекидима
Да ли је захтев из ИРК или НМИ , тренутна инструкција мора да се заврши. 6502 има само А, Кс и И регистре. Док потпрограм ради, можда користи ова три регистра заједно. Руковалац прекида је и даље потпрограм, иако се не види као такав. Након што је тренутна инструкција завршена, садржај А, Кс и И регистара за 65Ц02 µП се чува у стеку. Адреса следеће инструкције програмског бројача се такође шаље стеку. µП се затим грана на код за прекид. Након тога, садржај А, Кс и И регистара се затим враћа из стека обрнутим редоследом на који се шаље.

Пример кодирања за прекид
Ради једноставности, претпоставимо да је рутина за µП ИРК прекид је само да се додају бројеви $01 и $02 и сачува резултат од $03 на меморијској адреси од $0400. код је:

ИСР ПХА
ПХКС
ПХИ
;
ЛДА #$01
АДЦ #$02
КОШТАЈУ 0400 долара
;
ПЛИ
ПЛКС
ПЛА
РТИ

ИСР је ознака и идентификује меморијску адресу на којој се налази ПХА инструкција. ИСР значи сервисна рутина прекида. ПХА, ПХКС и ПХИ шаљу садржај А, Кс и И регистара у стог са надом да ће бити потребни било ком коду (програму) који се изводи непосредно пре прекида. Следеће три инструкције чине језгро руковаоца прекида. Инструкције ПЛИ, ПЛКС и ПЛА морају бити тим редоследом и враћају садржај И, Кс и А регистара. Последња инструкција, која је РТИ, (без операнда) враћа наставак извршавања било ком коду (програму) који се извршава пре прекида. РТИ повлачи адресу следеће инструкције кода која се извршава из стека назад у програмски бројач. РТИ значи Повратак из прекида. Тиме је руковање прекидом (потпрограм) завршено.

Софтверски прекид
Главни начин да имате софтверски прекид за 6502 µП је коришћење БРК имплицитне инструкције адресе. Претпоставимо да је главни програм покренут и да наиђе на БРК инструкцију. Од тог тренутка, адреса следеће инструкције у ПЦ-у треба да буде послата стеку пошто је тренутна инструкција завршена. Потпрограм за руковање софтверским инструкцијама треба да се зове „нект“. Овај потпрограм за прекид треба да гурне садржај регистра А, Кс и И у стек. Након што се изврши језгро потпрограма, садржај регистара А, Кс и И треба да буде повучен из стека у њихове регистре помоћу потпрограма који довршава. Последња изјава у рутини је РТИ. Садржај рачунара се такође аутоматски повлачи са стека на рачунар због РТИ.

Поређење и супротстављање рутине потпрограма и услуге прекида
Следећа табела упоређује и супротставља рутину потпрограма и услуге прекида:

4.17 Резиме 6502 главних начина адресирања

Свака инструкција за 6502 је један бајт, праћен нула или више операнада.

Режим непосредног адресирања
Код режима непосредног адресирања, после операнда је вредност, а не меморијска адреса. Вредности мора да претходи #. Ако је вредност хексадецимална, иза „#“ мора да стоји „$“. Инструкције за непосредно адресирање за 65Ц02 су: АДЦ, АНД, БИТ, ЦМП, ЦПКС, ЦПИ, ЕОР, ЛДА, ЛДКС, ЛДИ, ОРА, СБЦ. Читалац треба да консултује документацију за 65Ц02 µП да би знао како да користи упутства која су овде наведена, а која нису објашњена у овом поглављу. Пример упутства је:

ЛДА #77 долара

Режим апсолутног адресирања
У режиму апсолутног адресирања постоји један операнд. Овај операнд је адреса вредности у меморији (обично хексадецимална или ознака). Има 64 хиљада 10 = 65,536 10 меморијске адресе за 6502 µП. Типично, вредност од једног бајта је на једној од ових адреса. Апсолутна упутства за адресирање за 65Ц02 су: АДЦ, АНД, АСЛ, БИТ, ЦМП, ЦПКС, ЦПИ, ДЕЦ, ЕОР, ИНЦ, ЈМП, ЈСР, ЛДА, ЛДКС, ЛДИ, ЛСР, ОРА, РОЛ, РОР, СБЦ, СТА , СТКС, СТИ, СТЗ, ТРБ, ТСБ. Читалац треба да консултује документацију за 65Ц02 µП да би знао како да користи упутства која су овде наведена, као и за остале начине адресирања који нису објашњени у овом поглављу. Пример упутства је:

КОШТЕ 1234 долара

Режим подразумеваног адресирања
У режиму имплицитног адресирања не постоји операнд. Било који укључени µП регистар подразумева се инструкцијом. Подразумевана упутства за адресирање за 65Ц02 су: БРК, ЦЛЦ, ЦЛД, ЦЛИ, ЦЛВ, ДЕКС, ДЕИ, ИНКС, ИНИ, НОП, ПХА, ПХП, ПХКС, ПХИ, ПЛА, ПЛП, ПЛКС, ПЛИ, РТИ, РТС, СЕЦ , СЕД, СЕИ, ТАКС, ТАИ, ТСКС, ТКСА, ТКСС, ТИА. Пример упутства је:

ДЕКС : Смањите Кс регистар за једну јединицу.

Релативни начин адресирања
Релативни начин адресирања бави се само инструкцијама гранања. У режиму релативног адресирања, постоји само један операнд. То је вредност од -128 10 до +127 10 . Ова вредност се назива офсет. На основу знака, ова вредност се додаје или одузима од следеће инструкције програмског бројача да би се добила адреса намераване следеће инструкције. Релативна упутства за начин адресе су: БЦЦ, БЦС, БЕК, БМИ, БНЕ, БПЛ, БРА, БВЦ, БВС. Примери инструкција су:

БНЕ $7Ф : (грана ако је З = 0 у статусном регистру, П)

Који додаје 127 тренутном програмском бројачу (адреса за извршење) и почиње да извршава инструкцију на тој адреси. Слично:

БЕК $Ф9 : (грана ако је З = : у статусном регистру, П)

Што додаје -7 тренутном бројачу програма и почиње извршавање на новој адреси програмског бројача. Операнд је комплементарни број двојке.

Апсолутно индексирано адресирање
У апсолутном индексном адресирању, садржај регистра Кс или И се додаје датој апсолутној адреси (било где од $0000 до $ФФФФ, тј. од 0 10 до 65536 10 ) да имате праву адресу. Ова дата апсолутна адреса се назива базна адреса. Ако се користи Кс регистар, инструкција за састављање је отприлике овако:

ЛДА $Ц453,Кс

Ако се користи И регистар, то је нешто попут:

ЛДА $Ц453,И

Вредност за регистар Кс или И назива се вредност бројања или индекса и може бити било где од $00 (0 10 ) до ФФ (250 10 ). То се не зове офсет.

Апсолутне инструкције за адресирање индекса су: АДЦ, АНД, АСЛ (само Кс), БИТ (са акумулатором и меморијом, само са Кс), ЦМП, ДЕЦ (само меморија и Кс), ЕОР, ИНЦ (само меморија и Кс), ЛДА , ЛДКС, ЛДИ, ЛСР (само Кс), ОРА, РОЛ (само Кс), РОР (само Кс), СБЦ, СТА, СТЗ (само Кс).

Апсолутно индиректно адресирање
Ово се користи само са упутствима за скок. Са овим, дата апсолутна адреса има адресу показивача. Адреса показивача се састоји од два бајта. Двобајтни показивач указује на (је адреса) одредишне вредности бајта у меморији. Дакле, инструкције асемблерског језика су:

ЈМП (3456 УСД)

Са заградама, и $13 је на адреси адресе од $3456, док је $ЕБ на адреси адресе од $3457 (= $3456 + 1). Затим, одредишна адреса је $13ЕБ, а $13ЕБ је показивач. Апсолутних 3456 долара је у загради у инструкцији где је 34 нижи бајт, а 56 виши бајт.

4.18 Креирање стринга са асемблерским језиком 6502 µП

Као што је показано у следећем поглављу, након креирања датотеке у меморији, датотека се може сачувати на диску. Датотеци треба дати име. Име је пример стринга. Постоји много других примера стрингова у програмирању.

Постоје два главна начина за креирање низа АСЦИИ кодова. На оба начина, сви АСЦИИ кодови (знакови) заузимају узастопне локације бајтова у меморији. На један од начина, овом низу бајтова претходи целобројни бајт који представља дужину (број карактера) у низу (стринг). На други начин, низ знакова је праћен (одмах праћен) Нулл бајтом који је 00 16 , односно 00 долара. Дужина стринга (број карактера) није назначена на овај други начин. Нулл карактер се не користи на први начин.

На пример, размислите о „Волим те!“ низ без наводника. Дужина овде је 11; размак се рачуна као један АСЦИИ бајт (знак). Претпоставимо да стринг мора бити смештен у меморију са првим карактером на адреси $0300.

Следећа табела приказује поставку меморије стрингова када је први бајт 11 10 = 0Б 16 :

Следећа табела приказује подешавање меморије стрингова када је први бајт „И“, а последњи бајт Нулл ($00):

Следеће упутство се може користити за почетак креирања стринга:

КОШТАЈУ 0300$

Претпоставимо да се први бајт налази у акумулатору који треба да се пошаље на адресу локације $0300. Ово упутство важи за оба случаја (оба типа стрингова).

Након постављања свих знакова у меморијске ћелије, један по један, низ се може читати помоћу петље. У првом случају се чита број знакова након дужине. У другом случају, знакови се читају од 'И' док се не испуни нулти карактер који је 'Нулл'.

4.19 Креирање низа са асемблерским језиком 6502 µП

Низ целих бројева од једног бајта састоји се од узастопних локација меморијских бајтова са целим бројевима. Затим, постоји показивач који показује на локацију првог целог броја. Дакле, низ целих бројева се састоји од два дела: показивача и серије локација.

За низ стрингова, сваки низ може бити на другом месту у меморији. Затим, постоје узастопне меморијске локације са показивачима где сваки показивач показује на прву локацију сваког низа. Показивач се у овом случају састоји од два бајта. Ако стринг почиње својом дужином, одговарајући показивач показује на локацију те дужине. Ако стринг не почиње својом дужином већ се завршава нултим карактером, одговарајући показивач показује на локацију првог знака низа. И постоји показивач који показује на адресу нижег бајта првог показивача узастопних показивача. Дакле, низ стрингова се састоји од три дела: низова на различитим местима у меморији, одговарајућих узастопних показивача и показивача на први показивач узастопних показивача.

4.20 Проблеми

Читаоцу се саветује да реши све проблеме у једном поглављу пре него што пређе на следеће поглавље.

  1. Напишите програм на асемблеру који почиње од $0200 за 6502 µП и додаје непотписане бројеве 2А94 Х (додати) у 2АБФ Х (аугенд). Нека улази и излаз буду у меморији. Такође, ручно израдите састављен програмски документ.
  2. Напишите програм на асемблеру који почиње од $0200 за 6502 µП и одузима непотписане бројеве од 1569 Х (субтрахенд) из 2АБФ Х (минуенд). Нека улази и излази буду у меморији. Такође, ручно израдите састављен програмски документ.
  3. Напишите програм на асемблеру за 6502 µП који броји од $00 до $09 користећи петљу. Програм би требало да почне од 0200 долара. Такође, ручно израдите састављен програмски документ.
  4. Напишите програм на асемблеру који почиње од $0200 за 6502 µП. Програм има два потпрограма. Прва потпрограм додаје непотписане бројеве 0203 Х (аугенд) и 0102Х (адд). Други потпрограм додаје збир из првог потпрограма који је 0305Х до 0006 Х (аугенд). Коначни резултат се чува у меморији. Позовите први потпрограм који је ФСТСУБ и други подпрограм који је СЕЦСУБ. Нека улази и излази буду у меморији. Такође, ручно израдите састављен програмски документ за цео програм.
  5. С обзиром да је ан ИРК руковалац додаје $02 до $01 на акумулатору као руковање језгром док НМИ се издаје и руковање језгром за НМИ додаје $05 до $04 у акумулатору, напишите асемблерски језик за оба руковаоца укључујући њихове позиве. Позив на ИРК руковалац треба да буде на адреси $0200. Тхе ИРК руковалац треба да почне на адреси од $0300. Тхе НМИ руковалац треба да почне на адреси од $0400. Резултат од ИРК обрађивач треба ставити на адресу $0500, а резултат од НМИ руковаоца треба ставити на адресу $0501.
  6. Укратко објасните како се инструкција БРК користи за стварање софтверског прекида у рачунару 65Ц02.
  7. Направите табелу која упоређује и супротставља нормалну потпрограму са рутином услуге прекида.
  8. Укратко објасните главне начине адресирања 65Ц02 µП дајући примере инструкција асемблерског језика.
  9. а) Напишите програм на машинском језику 6502 да ставите „Волим те!“ низ АСЦИИ кодова у меморији, почевши од адресе $0300 са дужином низа. Програм би требало да почне на адреси $0200. Узмите сваки знак из акумулатора један по један, под претпоставком да их тамо шаље нека подрутина. Такође, ручно саставите програм. (Ако треба да знате АСЦИИ кодове за „Волим те!“. Ево их: „Ја“:49 16 , простор : 20 16 , 'л': 6Ц 16 , 'о': 6Ф 16 , 'ин':76 16 , 'е':65, 'и':79 16 , 'ин':75 16 , и „!“:21 16 (Напомена: сваки код заузима 1 бајт).
    б) Напишите програм на машинском језику 6502 да ставите „Волим те!“ низ АСЦИИ кодова у меморији, почевши од адресе $0300 без дужине низа, али завршава се на 00 16 . Програм би требало да почне на адреси $0200. Набавите сваки знак из акумулатора, под претпоставком да их тамо шаље, један по један, нека потпрограма. Такође, ручно саставите програм.