<L`L5 L5 x"˭#̭0έ1|LV 01./@ԩˍ" #͍ԩZ:ԩ XS HHlTppppFppppppppppppppWA.!5+!02/'2!-/7!.)!7+/$:)%-!3:9./79-+/-0,%479+,!$/7+/$5-!3:9./7%'/0!5,"5..# 7%23*!-5,4) "//402/'2!-4%./$$!7)%,%49'/$.)2/:'29:!.)!*%3,).)%*%34%3#!,+)%-,%.)794/4%.02/$5+4702/7!$:)#)%74!*.)+):!34/3/7!.)!-.%-/.)+/7'2!45,!#*%$,!0!5,!:!7902/$5+/7!.)%4!+730!.)!,9#(+/2%0%49#*):!73:%#(342/../3#4%-!4/7+/$5-!3:9./7%'/:!7!24%4502:9+,!$95*%4%7,%+#*!#($%-/.3425*!$:)!,!.)%).3425+#*)+/$5-!3:9./7%'/02/'2!-94%02!#5*!:39-5,!4/2%-)0/+!:5*!$/+,!$.)%#/3)%34!,/ *!+)%*%34$:)!,!.)%2%*%3425&,!'/7%'/))..9#(2%*%342/7)40.!#)3.)*#42, !C:HHͥL ͍iiɡ  Щ hhl BwD E;HI VLS BD E,HI VLt USUN WSZYSTKIE CARTRIDGE I POWTORZ LADOWANIE . TEN PROGRAM POTRZEBUJE MINIMUM 32K RAM. L L ,/!$).'%22/2L" ̈ɿL0 L" EJK VBD EHIꠈ B VD   ΍0ύ1 xˍ"̍#XL X)Ң L( HvH`0 1ǩ|ȩD RЍЩ./oԩԩ$6%@Ԣ؝D EJKB V{{ 4  ILppB|A K:{{@ {7 L {{{` 4 4 4L$ `é Ġ 4{   4{ 4{ 4 6{{L{${ ' 4 4{ 4{{LF { L {{{AL [L L {' { 5{LF {0L :L {~{ { 4LF { { {{{{L#L {+{LF {LF *{'LF {{LF -{LF {LF ={LF {LF {  5{{L {LLF { {{{{{{  {7L{ 4{ ]L `  % 6{@L {){{ b& ]{{L7 n ]L{{   L 4 4 4 4 5p"q 4 4 4p 4q{ ]  L{{ L {0 G :A`{ș{0{`:{{80m{{L0{87m{{:{{80 m{{L\{87 m{{:{{80m{{L{87m{{:{{80 m{{L{87 m{{`)IL\{ ũ>Ʃ ō{ȱiȱi {L{ 4{` KOREPETYCJE Z KODU MASZYNOWEGO. *******************************  BY PAUL BUNN (C) 1984 NEW GENERATION SOFTWAREWybierz wariant naciskajac RETURN Gdy juz wybrales to nacisnij SPACE ō{{ 4 4{ 4 4{{ 4 4{ 4 4 4 4 6 {{i{Ш{L LH{8 iŅȱŅĠÍ{ȱÅȱÅ 4{>7 {{ { 4{ L{{i{{LL~{ 4 4{ 4  4{LLåĩ<  6 Åą`NACISNIJ KLAWISZ SPACJI H'H{{ {0m{{{i{{Lm{0 d {L{0 {L{0  {L`m{{{i{`v{wxx ȹ` 4 4 4w q{ 4{ 4v q{ 4{ 4 4 4yxL9 q{ 4{ 4xyL,ȹxL9ȹxL9veyvxxL   6YL R  ҩD BDEJKlxBD>EHI V J L JL C:  Czy na pewno chcesz zaladowac dalsze lekcje ? (Y/N) BLV  Please position correct cassette (side two, three or four) and then press PLAY on cassette recorder followed by RETURN on keyboard to start. Do NOT press system reset whilst trying to load. BLAD LADOWANIA. Przewin z powrotem kasete, nacisnij PLAY w magnetofonie a potem RETURN. {{{{{{ o7Gv#w { 4{i 4{ 4 6{{{ٽ{  {{L ;L <{ L v<{#v{{{{L1 @L vivwiw` 4 4 4" 5 { 4 6L v#w{AL{ v{#v{{{{L1 @Lv#w{#LsLNv{?v{{{{{$${{ b{LMLY @L{{ {LM{{{{L1 {{,G ( L]Lȹ{XPYLN{$,ȹ{{ {L7ͅv$w{ L.{{ bL{$)ȹ{{ {:v$w{ L.{{ bL 3v%w{ Lv$w{ L{$'{{ b{*;v$w{ L.ȹ{{ {L|v#w{ L|vP{Ev{{{{2{{{{{{{{hhL1 @L`{{{{hhL1L3{m{{{{m{i{L 4 4 4" 5 Ll{{`{` 4` 4 4 4{ { ~ 4 4 4{ { ~ 4! 4 4{ { ~ 4 4 4{{*i0 4 {jji0 4 {jjjj0i 4 {**i0 4 {ji0 4 {jjji0 4{`{L 4 4 4{  ~ 4 4 4{  ~ 4 4 4{  ~ 4 4 4{)i0 4 4 4 4,{1 4L0 4 4 4 4{jjji0 4 4 4 4{jji0 4 4 4 4{*i0 4 4 4 4{**i0 4`{ q${{{{{`{JJJJ i7{Li0{{) i7{`i0{`{{LY0{{{{8d{{id8 {{i 8{{` 4 4 4 4`{ 4 4 4 4L> 4 4 4 4L^ 4 4{ 4 4 4 4` 4 4{ 4 4 4 4`{ 4{ 4{L4{(LN{$L{{ L{{ b{ );, LN{XLN{)LNROR~SBCSTAADCyAND9CMPEORYLDALDXORASBCSTAADCuAND5ASLCMPDECEORUINCLDALDYLSRVORAROL6RORvSBCSTASTYLDXSTXADCaAND!CMPEORALDAORASBCSTAADCqAND1CMPEORQLDAORASBCSTAJMPLJSR BCCBCSBEQBMI0BNEBPLBVCPBVSp 4 4 4P{ 4{{`+ % 4 4 4{{{{i iL%ȱȱȱ e&ȱȱ e&ȱȱ e&ȱ{ &){ L) ?+`l{ 5{` %hhL {{L)` ׅ{`{{{i` {½{`{®{{{` &m{i` &m{L&+®{{{ȱi­{m{i` %®{{m{{ȱi­{` {{m{i` {{m{Lk' {{{{L+` {{{i{{q{L'`{)l{{{{h) {{`{{ {`{{ {`{{ {`{{ {L) 6hhL {L){`{L){`{L){`{-{{L){){`{ {`J{)L{h) {{`M{{L){)H(*{)L{h) {{`{{,{{) {h) {{`8{`{{ i{{ {L+{L+L({{ {{i{ {L({){`{) H({) {{q{h) {{`{)H({) {jh) {{`{L){{{)M{h) {{`{{L){{`{ {` 4 4 4# 4 6hhL  `{ {`{L){L){{{L){L){) H({) {{{h) {{`{) {{8h) {{`{) {{LR*{) {{LR*{{L){{L){{L){){`{{{L){){`{)L*`{){{`{)@`{)`{)`{)`{)`{)@` + 4L + 6hhL ERROR - ADRES NIE ZNANY {`v+ 48 q{ 4 q{ 4{ 4` ADRES DOCELOWY $z&88+&18 89 "(88+"(88+"(88+&18 89'_88+"(88+'v8|88&18 8=8'_8 8+"(88+"(88+&18 89'_88+"(88+*;;+ &18 89"(88+"(88+"(88+&18 89 '_88+ "(88+p(999&18 89"(88+"(88+"(88+&18 89'_88+"(88+&):++ `(799+ "(88+"(88+(P98+`(799+(/9)98"(88+'}9|8r9`(79=8+(/9)9 8"(88+(P98+`(799+(/9)98"(88+*;;+ `(799+"(88+"(88+"(88+`(799+ (/9)98 "(88+y(999`(799+"(88+"(88+"(88+`(799+(/9)98"(88+"(88+(9 89 "(88+"(88+"(88+(9 89(9"98"(88+(v8 88(9 8=8(9"9 8"(88+(.:++ (9 89(9"98"(88+*;f;+ (9 89"(88+"(88+"(88+(9 89 (9"98 "(88+C)999(9 89"(88+"(88+"(88+(9 89(9"98"(88+(+;++L)998 "(88+"(88+"(88+L)998p)/9"98"(88+(}9 8r9L)99:p)/9"9 8"(88+"(88+L)998p)/9"98"(88++;;+ L)998"(88+"(88+"(88+L)998 p)/9"98 "(88+)999L)998"(88+"(88+"(88+L)998p)/9"98"(88+"(88+4(9 89 "(88+"(88+X(9%894(9 89F(989"(88+)[:%8+"(88+)98 :"(88+X(9%894(9 89F(989"(88+*;9Z; 4(9 89"(88+"(88+X(9%89 4(9 89 F(989 "(88+)9%8 :4(9 89)989"(88+"(88+4(9 89"(88+"(88+N(f:%8=8*(f: 8J8 <(f:8=8"(88+N(f:%8J8*(f: 8J8<(f:8J8"(88+~*9 8B;*(f: 8=8*9 8{:"(88+N(f:%8J8*(f: 8J8<(f:8J8"(88+*;9P; *(f: 8J8"(88+"(88+N(f:%8J8 *(f: 8J8 <(f:8J8 "(88+*9:9*(f: 8J8*9l:{:"(88+N(f:%8J8*(f: 8J8<(f:8J8"(88+b*:%8=8p*: 8J8 "(88+"(88+b*:%8J8p*: 8J8 *[:8+"(88+):%8+p*: 8=8*[:8+"(88+b*:%8J8p*: 8J8 *[:8+"(88+*;:+ p*: 8J8"(88+"(88+"(88+p*: 8J8 *[:8+ "(88+*9:9p*: 8J8"(88+"(88+"(88+p*: 8J8 *[:8+"(88+G*:8=8#*:98 "(88+"(88+G*:8J8#*:98*:8+"(88+*:8+#*:9:):++"(88+G*:8J8#*:98*:8+"(88+*;:+ #*:98"(88+"(88+"(88+#*:98 *:8+ "(88+)9:9#*:98"(88+"(88+"(88+#*:98*:8+"(88+{HHH{Lk5{ɜ{L6ɝ{L6 LC5{L=5 {{L=5 L5γ{{ 5L=5{L5a8 {) { 5L+5i(ǥiȩ{L=5{{({L5hhh`ǩ|ȩȥ{{|L=5 {{α{L=5ǩ|ȭ{δ{i(ǥiL5α{{ 5L=5{HHH{ L4{L5` { i0ХǍ{ȍ{{{|8{ {{{L5 `HH u6{ { {{L@6ILH6hh{`BD{EHI V䭴{ɛ {L@6{{{ `{`{`{`{) {(L5ɇ`H{ai {h{`HH=7ЍЩ @h  hhLbL47HU7T ԍЍh@H{ ԍЍh@L_7{{{` 4 4 4( 4{ 4 4{ 4 4{{ܩ 4 4 4ȩ 4 `셽7 %  6L KONIEC PROGRAMU - KLAWISZ akumulator Rejestr X Rejestr Y Logicz. OR liczba # wartoscia z pamieci Przesuniecie w lewo Ciska rejestr stanu procesora na stos kom. pamieci Break - przerwanie operacjiNieprawidlowa instr. operandu NACISNIJ KLAWISZ 'RETURN' zgas przen.wsk. prawo lewo Obrot Logicz. AND akumulatora Testowanie bitow akumulatora ze stosu Wez Przesun log. wExclusive OR zap.wartoscia z pamieci Dodaj z przerw. kontrolow.Transfer Zapam. do kom. pamieci do wskaz. stosu do akumulatoraSkok do podprogr. Skok - Laduj liczn. program. nowym adresemZmniejsz. Ladujwskaz. stosu do rejestru Xnadmiar Nic nie rob.Zwieksz. tryb dzies. liczbe Odejmij z Porown. nie rowne zero (Z=0)rowne zero (Z=1)Skok, gdy dodatnie (N=0)ujemn.(N=1)Powrot z podprogramu do rejestru Yzap.(C=1)zgas (C=0)zgas przepelnienie (V=0)zapal przepelnien.(V=1){{{L; 4{ 4{ 4 6` ;{{{{{ꭀ{ L<{{{{{ u<{݀{{{{L-<{{{{L;`R< { 4" 4 6hhL BLAD - PODWOJNA ETYKIETA " 4{ 4{ 4 6` 4 4{ 4 6 LA>{ L={BJL={ N{ BA$(A#0L=L=: { ,0L=:L<` { L={) ( L={)( {${), 0 :L=L={),0GA:Ls=hhLN{ ,0:AGL=L=L=ʅ= LL>POWINIEN BYC ODSTEP MIEDZY NAZWA MNEMONICZNA A OPERANDEM. SWIECACA SIE LINIA WYMAGA POPRAWIENIA. x>  4 4{ 4 4 4 4 4 6hhL ETYKIETA NIE MOZE BYC DLUZSZA NIZ SZESC LITER. SWIECACA SIE LINIA ZAWIERA ZBYT DLUGA ETYKIETE. ?4?W?????@8@[@z@@ Lekcja 19 - Stos @ Przyklad 1 do lekcji 19 &O Lekcja 20 - Jeszcze o adresowaniu O Przyklad 1 do lekcji 20 ` Przyklad 2 do lekcji 20 ` Lekcja 21 - Jeszcze o stosie a Przyklad 1 do lekcji 21 h Lekcja 22 - Instrukcja BIT i Przyklad 1 do lekcji 22 l Lekcja 23 - Przerwania m Lekcja 24 - Co teraz ? s WPROWADZ. INNYCH TEMATOW LEKCJI \ STOS Stos jest sterta poukladanych do gory plytek, jedna na drugiej, dajac 256 przegrodek w pionie. Zawartosc tych przegrodek mozna odkladac na gore stosu albo ze szczytu je usuwac. Jesli chcesz otrzymac zawartosc dolnej przegrodki, tomusisz usunac wszystkie z gory, az do osiagniecia potrzebnej przegrodki na dole.  STOS Stos stanowi jedna strona pamieci. Jestto strona 1 ($100 - $1FF). Istnieje tzw. WSKAZNIK STOSU (SP), ktory zawsze wskazuje szczyt stosu. Ta jednobajtowa wartosc uzywana jest tak jak przy adresowaniu indeksowanym, gdzie wskaznikstosu jest dodawany do liczby $100. Adres ten pokazuje w ktorym miejscu na stronie 1-ej aktualnie znajduje sie szczyt stosu. Po kazdym rozkazie PUSH (rzuc na stos) lub PULL (wez ze stosu), wskaznik stosu jest aktualizowany. Maksymalna wartosc SP to $FF, wskazujacaadres szczytu stosu na $1FF. Gdybysmy wtedy dodali cos na stos, to adres ten zmniejszy sie, a po ponownym pobraniu zwiekszy sie, gdyz SP zachowuje sie jak komorka pamieci.  STOS Wszystkie programy uzywajace symulatorasa zapamietywane w komorkach pamieci od $7B00. Brane sa od jednego do trzech bajtow (nazywane bajtami rozkazu, ang. 'op-code bytes') w zaleznosci od uzytej instrukcji. Mozna to obejrzec, gdy po uruchomieniu programu uzyje sie 'SELECT'wtedy ESC zastepuje SPACE a CTRL-ESC zastepuje RETURN. SELECT przywraca obrazpoprzedni, ale klawisze pozostaja. RESET przywraca stan poczatkowy.  STOS Stos jest szczegolnie przydatny do przejsciowego przechowywania danych. 6502 uzywa go do tego. Nieco dalej omowimy w jaki sposob to robi. Do sledzenia aktualnie wykonywanych instrukcji sluzy LICZNIK PROGRAMOWY (PC)Pozwala on upewnic sie, ze instrukcje wykonuja skoki lub podprogramy. W 6502 ten licznik jest szesnastobitowy. Po wykonaniu kazdej instrukcji jest on aktualizowany.  STOS Licznik programowy zawsze wskazuje aktualny adres nastepnej instrukcji, ktora bedzie wykonywana. Znaczy to, ze normalnie jest on zwiekszany o ilosc bajtow zajmowanych przez instrukcje. Przy skokach bezwarunkowych jest ladowany nowym adresem. Podczas skokow warunkowych istniejacy bajt wylotowy jest dodawany do licznika programu. Moze on byc takze liczba ujemna, jesli bit 7 jest zapalony (przy uzupelnieniu do dwoch). Dlatego taki skok moze zmienic adres PC tylko o 127 bajtow wprzod lub o 128 bajtow w tyl. Jest to ograniczenie przy pisaniu dlugich programow, ale nie zajmuj sie tym, gdy pracujesz z naszym symulatorem.  STOS Jedna z mozliwosci 6502 uzywa stosu do zapewnienia poprawnej pracy instrukcji JSR, gdy podczas realizacji RTS kontrolajest natychmiast przejmowana przez RTS zaraz po wykonaniu instrukcji JSR. Jest to realizowane przy wrzucaniu zawartosci licznika programowego na stos. Jest to zawsze adres komorki pamieci zwiekszony o dwa od tej, ktora jest przed instrukcja JSR. Podczas realizowania instrukcji RTS ta 16 bitowaliczba jest pobierana ze stosu i do niejjest dodawane jeden a nastepnie ta wartosc jest wstawiana do licznika programowego. Takie postepowanie gwarantuje, ze po wykonaniu RTS zostaniewykonana pierwsza instrukcja, znajdujacasie zaraz za instrukcja JSR.  STOS A oto lista instrukcji, ktore moga dokonywac operacji na stosie: PHA- CISKA AKUMULATOR NA STOS PLA- POBIERA AKUMULATOR ZE STOSU TSX- TRANSFER WARTOSCI ZE STOSU DO REJESTRU X TXS- TRANSFER WARTOSCI Z REJESTRU X NA STOS Program demonstracyjny ilustruje efekt stosowania powyzszych instrukcji, oraz JSR i RTS, na stosie. TSX JSR NORET RET LDA #$7B PHA LDA #$12 PHA TSX RTS NORET PLA TSX PLA TSX JMP RET END TSX BRK JESZCZE O ADRESOWANIU Dotad stosowalismy nastepujace tryby adresowania: IMPLIKOWANY Tu instrukcje zawieraja swoje wlasne trzy litery. Gdy zastosujemy np. TXS, to te trzy litery zajmuja w pamieci tylko jeden bajt. PELNY Tutaj instrukcje uzywaja komorek pamieci o adresie wiekszym niz 256 (powyzej 1-ej strony). Taka instrukcja zajmuje trzy bajty pamieci.  JESZCZE O ADRESOWANIU STRONY ZEROWEJ Jest on podobny do trybu pelnego, ale instrukcje uzywaja komorek o adresie jednobajtowym (0 do 255), poniewaz bajt MSB jest zawsze zerowy. Dlatego cala instrukcja zajmuje tylko dwa bajty pamieci. NATYCHMIASTOWY Tutaj kazda instrukcja zajmuje dwa bajtygdyz operuje liczbami a nie adresami. Liczby sa od 0 do 255, a wiec wielkosci mieszczace sie w jednej komorce pamieci.Znak '#' jest typowy dla tego trybu adresowania i oznacza liczbe.  JESZCZE O ADRESOWANIU PELNY INDEKSOWANY Y Jest podobny do trybu pelnego, ale do adresu, ktory zawiera instrukcja, dodawana jest zawartosc rejestru Y, co daje nowy adres komorki pamieci. PELNY INDEKSOWANY X Taki sam, jak wyzej wymieniony, ale zamiast Y dodawana jest wartosc rejestru X.  JESZCZE O ADRESOWANIU STRONY ZEROWEJ INDEKSOWANY Y Tak jak pelny indeksowany Y, ale adres dotyczy strony zerowej i dlatego instrukcja zajmuje tylko dwa (a nie trzy) bajty. STRONY ZEROWEJ INDEKSOWANY X Tak samo, jak powyzszy, ale zamiast rejestru Y uzywany jest rejestr X. Instrukcja zajmuje dwa bajty. ADRESOWANIE POSREDNIE INDEKSOW. Ten typ adresowania jest bardzo uzyteczny. Np. podczas realizacji instrukcji STA (78),Y 6502 skacze do komorek pamieci 78 i 79 na stronie zerowej. W komorce 78 jest mlodszy (LSB)a w 79 starszy (MSB) bajt adresu. Jesli np. w komorce 78 jest wartosc $13 a w komorce 79 jest wartosc $2F, to otrzymamy adres komorki pamieci: $2F13. Nastepnie ten adres zostaje zwiekszony o wartosc rejestru Y. Np. jesli rejestr Y zawiera wartosc $5 to otrzymamy nowy adres komorki pamieci: $2F18. Tak wiec po wykonaniu instrukcji STA (78),Y wartosc akumulatora zostanie zapamietana w komorce pamieci o adresie $2F18. ADRESOWANIE INDEKSOW. POSREDNIE To jest bardzo rzadko uzywany tryb adresowania, ktory dokladnie opiszemy. Zastosujmy instrukcje LDA (45,X) i na przykladzie wyjasnijmy jej dzialanie. Jakakolwiek zawartosc rejestru X w czasie wykonywania instrukcji jest dodawana do adresu strony zerowej, w tym przypadku do 45. Jesli np. rejestr X zawiera wartosc 20, to po uruchomieniu programu otrzymamy adres strony zerowej: 65. W tej komorce pamieci jest bajt LSB (np.E2), a w nastepnej (66) jest bajt MSB (np.A1). Dlatego po wykonaniu instrukcji LDA (45,X), dla powyzszego przykladu, akumulator zostanie zaladowany wartoscia komorki pamieci o adresie $A1E2.  JESZCZE O ADRESOWANIU POSREDNIE Ten typ adresowania nie jest przenoszony przez symulator, chociaz jest przenoszony przez normalny asembler. Jedyna instrukcja w tym trybie adresowania jest JMP (xxxx). Komorka pamieci xxxx zawiera bajt LSB a komorka xxxx+1 bajt MSB adresu skoku, ktory ma byc wykonany. Licznik programowy ladowany wlasciwym adresem skoku spowoduje, ze nastepna realizowanainstrukcja bedzie ta, ktora jest wskazywana przez xxxx.  JESZCZE O ADRESOWANIU Przeanalizujmy taki program: LDA #9 STA 320 LDA #2 STA 321 JMP (320) Chociaz ten program nie bedzie pracowal na symulatorze, to jednak zostanie on zasemblowany i po uruchomieniu zostanie normalnie wykonany. W efekcie licznik programowy zostanie zaladowany wartoscia$209. Nastepnie zostanie wykonana instrukcja zawarta w komorce $209. LDA #2 STA 32 LDA #2 STA 33 AGAIN LDY #1 LOOP TYA LOOP2 STA (32),Y INY CPY #10 BNE LOOP INC 33 LDA 33 CMP #3 BEQ AGAIN BRK LDA #$F1 STA 140 LDA #3 STA 141 STA 149 STA 150 LDX #10 TXA STA (130,X) LDA #40 LDX #19 STA (130,X) LDX #10 EOR (130,X) BRK JESZCZE O STOSIE Wskazniki flagowe zajmuja jeden bajt rejestru wskaznikow 6502: BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 N V - B D I Z C N - ZNAK UJEMNY V - PRZEPELNIENIE - - NIE UZYWANY (ROZBUDOWA) B - PRZERWANIE (SYMULATOR NIE STOSUJE) D - TRYB DZIESIETNY I - BLOKADA PRZERWAN Z - WSK. ZERA C - PRZENIES.  JESZCZE O STOSIE Dlatego, uwazajac kazdy wskaznik jako pojedynczy bit osmiobitowej liczby binarnej, mozna powiedziec, ze np. liczba 64 w rejestrze flagowym oznacza zapalony wskaznik przepelnienia.  JESZCZE O STOSIE Tak wiec wskazniki flagowe sa podczas pracy 6502 ladowane i zapamietuja stan 6502, stanowiac w ten sposob REJESTR STANU PROCESORA (PSR). Jak wiesz, wiekszosc instrukcji wplywa na wskaznikiflagowe. Jednak dwie instrukcje moga spowodowac przechowanie stanu wszystkichwskaznikow, nie naruszajac ich. Sa to instrukcje PHP i PLP. Pierwsza powoduje 'wrzucenie' rejestru stanu procesora na stos, a druga pobiera ta zawartosc ze stosu. Jesli chcesz zapalic, powiedzmy trzy flagi jednoczesnie, to mozesz do tego uzyc instrukcji PHP i PLP. Jednak te instrukcje nie dzialaja na akumulatori dlatego do tej operacji trzeba uzyc rowniez instrukcji transferowych.  JESZCZE O STOSIE Przykladowy program pomoze w ilustracjiwspolpracy rejestru stanu procesora ze stosem. Jedno z wielu zastosowan powyzszych instrukcji pozwala zachowac wartosci wskaznikow flagowych w stanie pierwotnymMozna przechowac zawartosc PSR na stosieprzy pomocy instrukcji PHP a nastepnie przy pomocy instrukcji PLP odtworzyc ta wartosc PSR otrzymujac pierwotny stan wskaznikow flagowych. Nalezy tylko pamietac o uzywaniu odpowiednich wartosci (sensownych) PSR, gdyz stos moze zostac latwo 'zasmiecony'. SEC TSX PHP PLA ORA #192 PHA PLP LDA #$FF PHA PLP LDA #1 LOOP PHA PLP ASL A BCC LOOP BRK INSTRUKCJA BIT Uzywana jest do kontrolowania czy jedenlub wiecej bitow w komorce pamieci jest zapalonych. Komorka pamieci dotyczy albostrony zerowej, albo adresowana jest bezposrednio. Testuje sie bity zawarte w akumulatorze z bitami w komorce pamie-ci. Instrukcja ma postac: BIT xxxx, gdzie xxxx okresla adres komorki pamieciPo wykonaniu instrukcji wskaznik zera zostaje zapalony, jesli zaden z bitow liczby (zawartej w komorce pamieci) okreslonych przez bity akumulatora, nie jest zapalony. Obydwie testowane liczby pozostaja niezmienione, przy czym wskazniki przepelnienia i znaku zostaja ustawione tak, ze odtwarzaja 6-ty i 7-my bit liczby z komorki pamieciZastosowanie instrukcji BIT ilustruje ponizszy przyklad. LDA #$30 STA 6 LDA #0 SEC ROTATE ROL A BIT 6 BEQ ROTATE LDA #$C0 STA $3F0 LDA #0 BIT $3F0 LDA #$80 STA 560 LDA #0 BIT 560 BRKPRZERWANIA Przerwanie to cos, co wystepuje po uplywie okreslonego czasu albo po jakimszdarzeniu, np. po nacisnieciu BREAK. Podczas przerwania 6502 szuka, czy jest znany WEKTOR PRZERWANIA, posredniczacy wskoku do mniejszego programu, kierujacego przerwaniem. To przerwanie moze nastapic np. w celu czytania z klawiatury. Gdy przerwanie skonczy sie, to program wraca do normy, traktujac od nowa, mogace sie pojawic nastepne przerwanie. PRZERWANIA Nie mozna pisac wlasnych przerwan z symulatorem. Pojawiajace sie ciagle przerwania mozna zatrzymac naciskajac BREAK lub inny klawisz. Istnieja dwa rodzaje przerwan: PRZERWANIA MASKOWALNE To sa przerwania, ktore moga byc ustawiane, wskazujac na twoj wlasny program. Uzywajac instrukcji SEI (blokada przerwan) mozesz wstawic 'maske' przerwan, ktore beda calkowicie ignorowane przez 6502 az do czasu zadzialania instrukcji CLI (zezwolenie na przerwania). PRZERWANIA NIEMASKOWALNE Ten rodzaj przerwan nie jest zalezny od instrukcji SEI i CLI. W zaleznosci od komputera, te przerwaniamaja zmienne swoje ustalone wektory. Wszystkie przerwania koncza sie instrukcja RTI (powrot z przerwania). Zwykle na okres przerwania zabezpiecza sie zawartosci rejestrow przez wrzucenieich na stos. Gdy nastepuje przerwanie, to rejestr stanu procesora i adres powrotny sa wrzucane na stos. Podczas wykonywania instrukcji RTI wskazniki i adres powrotny sa pobierane ze stosu i program jest normalnie kontynuowany. CO TERAZ ? Konczymy kurs nauki kodu maszynowego mikroprocesora 6502. Zamierzeniem bylo nauczenie podstawowego kodu maszynowego samego 6502. Jednakze najwiecej korzyscida przesledzenie SYSTEMU OPERACYJNEGO. Jest on zawarty w ROM-ie i stanowi standardowe wyposazenie komputera. Procedury maszynowe systemu operacyjnegopozwalaja na nowoczesne gospodarowanie grafika i dzwiekiem. Zarzadzaja one takze praca klawiatury, magnetofonu kasetowego, stacji dyskow i wielu innych urzadzen. CO TERAZ ? Poniewaz ten program tylko symuluje prace 6502, to nie mozesz uzywac go w polaczeniu z systemem operacyjnym. Dlatego nadszedl czas zastosowania bardziej poteznego, lecz mniej nam przyjaznego ASEMBLERA. Zauwaz, ze program maszynowy pracuje bardzo szybko i nie bedzie czekal na ciebie az nacisniesz RETURN ! Istnieje duze prawdopodobienstwo, ze program maszynowy nie pisany z pomoca asemblera spowoduje 'upadek' systemu. Dlatego nalezy zawsze upewnic sie, ze zajmujesz bezpieczna czesc pamieci. Jezeli nie jestes pewien jakiejs instrukcji, to wtedy zawsze sprawdz swoj program, wpisujac go w nasz symulator. ASROLSRO% .DEƽ<><.O.AN.NOԡ.RE .REF.DEF.NOT .AND .OR ,X