Pytanie wejściowe brzmi, jak program ma rozpoznać, czy został uruchomiony w trybie natywnym, czy w emulacji. Niby jest bit E rejestru znaczników, więc można tak:

sec
xce

Po tym po bicie C poznajemy, czy tryb był emulacji (C=1) czy natywny. Ale przy okazji robi się przełączenie trybów: z emulacji w natywny, co grozi zwisem, jeśli działamy na XL OS-ie, albo z natywnego w emulację, co z kolei grozi pokasowaniem zawartości rejestrów i zrujnowaniem stosu.

A więc: jak sprawdzić, w jakim trybie jest procesor, bez przełączenia? Wymyśliłem takie coś:

.ab
php
sep #$20
lda #$01
xba
lda #$00
rep #$20
dec
xba
plp
lsr

Po tym, jak C=1, to jest emulacja, a jak C=0 to natywny. Ale to jest trochę długie (14 bajtów, 27 cykli), może ktoś ma pomysł na coś krótszego?

KMK
? HEX$(6670358)

2

Ja wpadlem na cos takiego (mam nadzieje, ze sie nie wyglupilem, bo nie uruchamialem):

.ab
php
rep #$20
lda #$00
dec
plp
lsr

Powinna zwracac to samo co Twoja (8 bajtow, 14 albo 15 cykli ;))

3

Um, też nie uruchamiałem, ale na oko powinno działać. Proste i genialne  ;)

KMK
? HEX$(6670358)

4

Nie sprawdzalem (nie bardzo moge), ale wydaje mi sie, ze powinno dzialac:

.ab 
php  
sep #$20
lda #$ff 
rep #$20
inc
php
pla
plp
lsr

Alternatywna wersja:

php
rep/sep #$10
php
pla
lsr
lsr
lsr
lsr
plp
lsr

co do linii rep/sep nie mam pewnosci jaka powinna zawierac instrukcje i czy jest to zalezne od umiejscowienia kodu w przerwaniu czy poza nim (w zwiazku z tym zglaszanie w znaczniku C stanu procesora moze byc takze dwojakie)

wydaje mi sie, ze wlasciwa instrukcja powinno byc rep #$10 i wowczas zgaszony zn. C sygnalizowalby stan natywny procesora (odwrotnie od poprzednich przykladow zamieszczonych w topicu)

Ze tak troche oftopicznier zapytam, co robi instrukcja "php"? ;)

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

6

PHP zapisuje rejestr znacznikow na stosie. Jest to instrukcja znana juz z 6502.

Druga podana przeze mnie metoda jest chyba zla. Nie uwzglednia mozliwosci, kiedy znacznik M bylby zgaszony (akumulator 16-bitowy) w trybie natywnym. Para instrukcji PHP PLA zdejmuje wowczas dodatkowy bajt ze stosu.
Zeby to ominac potrzebna bedzie dodatkowa instrukcja po REP #$10, SEP #$20, chyba ze mialaby zastosowanie inna odmiana tej metody z SEP #$10, wowczas wystarczyloby poprawic na SEP #$30.

Albo jeszcze inaczej, zamiast REP #$10, byloby REP #$20 i dodatkowe LSR po PLA.

[ Dodano: Czw Lut 10, 2005 9:38 am ]
Przepraszam za zamieszanie.
Obie wersje sa felerne. To ten sam blad z mozliwym pobraniem ze stosu slowa zamiast bajtu do akumulatora.
Poprawka do metody pierwszej powoduje wydluzenie kodu do 14 bajtow.
Druga mozna przeksztalcic do postaci 13 bajtow:

php
rep #$20
php
sep #$20
pla
asl
asl
asl
rol
plp
lsr

Jesli wersja Laoo dziala, to oczywiscie te propozycje sa pozbawione sensu.

[ Dodano: Czw Lut 10, 2005 11:17 am ]

php
rep #$e0
php
set #$20
pla
cmp #$20
rol
plp
lsr

12 bajtow.

7

Wersja Laoo działa, a to w ten sposób:

- w trybie emulacji REP #$20 nic nie robi, więc LDA # ładuje $00 do akumulatora, zmniejsza je o 1 otrzymując $FF, po czym wysuwa najmłodszy bit akumulatora do C. C=1 - tryb emulacji.

- w trybie natywnym REP #$20 przełącza akumulator na 16 bitów, więc LDA # ładuje do akumulatora DWA kolejne bajty, czyli $003A, przeskakując tym samym rozkaz DEC. Potem wysuwa najmłodszy bit akumulatora do C. C=0 tryb natywny.

Jak mówię, koncept wcale dowcipny.

KMK
? HEX$(6670358)

8

Rzeczywiscie, bardzo fajnie pomyslane. Gratuluje inwencji Laoo. Dziekuje Draco za objasnienie!

Dla mnie 65816 pozostawal do wczoraj zagadnieniem slabo rozumianym, dzis dzieki temu tematowi, wydaje mi sie, ze jest troche lepiej. Byla to wiec dobra okazja do przyjrzenia sie blizej temu prockowi, co moze kiedys mi sie tez przyda.

9

Rodzina 6502 (zupelnie jak procesory intela w opozycji do procesorow motoroli) uzywa w wielobajtowych slowach kolejnosci Little Endian. Ujmuje to troche dowcipu mojemu rozwiazaniu, bo wartosc ladowana do akumulatora to $3A00, a wiec to ze najmlodszy bit jest zerem nie jest przypadkiem :)

To zdecydowanie najlepszy kod jaki kiedykolwiek napisalem (bo lepiej juz sie go napisac nie da) wiec od teraz bedzie juz tylko z gorki... przytlacza mnie to... osiagnalem juz wszystko co bylo do osiagniecia... koncze z programowaniem i zajme sie ogrodnictwem ;)

10

laoo/ng nie myslales czasem zeby go opatentowac? Pomysl o tatniench :D

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

11

..heh - Laoo - to może source DracOS'a też przeanalizujesz - jeśli statystyka nie kłamie to pewnie skróci się o 40%  :twisted: - Draco - to żart. :D

Draco - może i nie przyjżałem się sprawie - ale pytanie;- czy w ostatniej wersji DracOS jest międzynarodowy zestaw znaków ??

Kontakt: pin@usdk.pl

12

wartosc ladowana do akumulatora to $3A00, a wiec to ze najmlodszy bit jest zerem nie jest przypadkiem

W rzeczy samej. Niemniej "dwa kolejne" bajty, które LDA wciąga do procesora to $003A. Interpretując mojego maila literalnie można by jeszcze na podobnej zasadzie powiedzieć, że LDA niczego nie zmniejsza ani tym mniej cokolwiek wysuwa. Jakoś dzisiejsze popołudnie nie było dla mnie dobrym czasem jeśli chodzi o klarowność wywodu :?

koncze z programowaniem i zajme sie ogrodnictwem ;)

Wyhoduj pomidora dojrzewającego w osiem cykli atarynkowego zegara, zarobisz tyle szmalu, że Gates to będzie przy tobie mały pikuś.  ;)

Pin: oczywiście, że zawiera drugi generator znaków. Musiałby wyjść ukaz państwowy o zakazie mania dwóch generatorów znaków, żebym go wyrzucił. Myślałem nawet o tym, żeby ten drugi generator trochę ulepszyć, np. zamienić znaki ASCII 125 i 127 w nawiasy klamrowe.

PS. A co do tego skracania o 40% - dobrze by było  :rolleyes: Ale gdyby ktoś przyszedł i skrócił 16 kB kodu tego ROM-u o 40%, wtedy chyba ja bym się musiał zająć ogrodnictwem.  ;)

KMK
? HEX$(6670358)

13

umarł król, niech żyje król

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C