1

Napisalem program w XASM (v. 3.02). Wygenerowany XEX odpala sie prawidlowo na Atari800win oraz na Altirze 1.8. Ale przy probie odpalenia na prawdziwym Atari przez SIO2SD, program nie startuje (choc sie laduje). Mam takie objawy: widze normlnie ekran w trybie 0 z kursorem, ale jest dodany jeden znak (w lewym gornym rogu): "k" w inversie. I tyle. Zwis w tym momencie.
To o tyle dziwne, ze praktycznie pierwsze co robie w programie to ustwienie DL, ktory wlacza tryb 4 Antica.
Oczywiscie odpalam bez BASIC'a.

Program umieszczam od adresu $2000, na stronie zerowej wykorzystuje adresy od $80 w gore.

Nie chce umieszczac tu calego programu, ale poczatek mam taki jak nizej.

Pytanie: czy to jakis typowy objaw? o czyms zapomnialem?
Czy tez musze szukac szczegolowo co sknocilem...

CHBASE equ $D409 ;adres zestawu znakow (starszy bajt) ma cien CHABS - $02F4 (756)
CHBAS  equ $2F4
dliadr   equ $230
obr      equ $58

          org $80
tab1     dta 0,0
;rezerwacja dalszych zmiennych

       run start

       org $2000
pmg_memory_1            
       org *+$800
pamiec_ekranu
       org *+$800        
buf_gen_znakow
       ins 'fonty1.fnt'      
buf_gen_znakow_level_1
       ins 'lev1.fnt'     

start
     mwa #dl dliadr
     mwa #pamiec_ekranu obr

     lda #>buf_gen_znakow
     sta CHBAS

     ;tu leci dalej program
     ;wlaczenie duszkow, ustawienie przerwan itp


;----------------------------------------
;display list
dl       dta $70,$70,$70
         dta $44,a(pamiec_ekranu)
         dta $04+$80
         dta $04
         dta $04+$80
         dta $04+$80
         dta $04+$80    
:19      dta $04
         dta $41,a(dl)

2

Ciężko gdybać nie widząc całego programu, ale ja to bym "run start" dał na samym końcu kodu.

Czy możecie wyjaśnić, Stirlitz, dlaczego wasz służbowy adres stirlitz@rsha.gov.de ma aliasa justas@gru.su?
Nie czytam PM. Proszę używać e-mail.

3

>          org $80
>tab1     dta 0,0

zrezygnuj z tego. po uruchomieniu programu przekopiuj tab1 na strone zero.

albo
tab1    equ $80

i po starcie wyzeruj tab1

daj znac czy pomoglo.

http://atari.pl/hsc/ad.php?i=1.

4

Ale chodzi o te dwa bajty konkretnie ze sa uzywane przy starcie systemu a potem juz nie?
To po prostu przesune w gore zmienne zeby sie zaczynaly od $82. Zaden problem.

Myslalem ze $80 i $81 sa wykorzystywane tylko przy wlaczonym BASIC'u.

5

ale Twoj program ladowany jest jakims loaderem, moze on uzywa tych lokacji?

http://atari.pl/hsc/ad.php?i=1.

6

loaderem...?
nie, zadnym loaderem...
XASM mi kompiluje do xex i odpalam xex.
Ten plik ma automatycznie stworzony odpowiedni naglowek, 3 bloki:
pierwszy od $80
drugi $02E0, $02E1 wskazujacy na poczatek programu
trzeci od $3000 z resztą programu (bo od $2000 zarezerwowalem na obszar PMG i pamiec ekranu)

To przeciez standardowy format pliku wykonywalnego i SIO2SD powinien go obsluzyc tak jak kazdego innego xexa.

Ale to xex musisz czymś odpalić: loaderem jakimś albo dosem.

8

Ustaw run na końcu kodu...

Czy możecie wyjaśnić, Stirlitz, dlaczego wasz służbowy adres stirlitz@rsha.gov.de ma aliasa justas@gru.su?
Nie czytam PM. Proszę używać e-mail.

9

wydaje mi sie ze run nie ma tu nic do rzeczy. moze byc nawet na poczatku.

http://atari.pl/hsc/ad.php?i=1.

10 Ostatnio edytowany przez mono (2011-02-21 13:28:55)

@nosty: Samo Atari po uruchomieniu przeprowadza procedurę boot, a więc ładuje n pierwszych sektorów z pierwszego dysku pod wskazany w nagłówku boot (1 sektor dysku) adres, po czym przeprowadza inicjalizację oraz uruchomienie wczytanego programu. Niestety format boot nie jest równoważny formatowi xex (plikowi binarnemu), bo pliki binarne są obsługiwane przez DOSa a nie przez OS.
Jeśli bootujesz xexa z SIO2SD, wtedy SIO2SD tworzy w locie "dyskietkę" z bootloaderem i dołącza Twojego xex, którego tenże bootloader potrafi załadować i uruchomić tak, jak DOS.
Ponieważ bootloader działa takich zasadach jak każdy inny program w systemie, to może używać jakichś komórek na stronie zerowej. No i stąd lepiej je zainicjalizować w programie, niż za pomocą struktur pliku binarnego. Osobiście nie lubię też wpisywania wartości do rejestrów IO lub zmiennych systemowych za pomocą bloków pliku binarnego.

Edit: Doprecyzowania artka z Atariki wymaga tylko to, że po załadowaniu wszystkich bloków programu procedura boot skacze pod adres ładowania danych+6 gdzie powinna znaleźć się procedura inicjalizacji zakończona rts'em. Procedura ta wykonuje się tylko raz i to podczas boota więc nie powinna być punktem wejścia do Twojego programu (zazwyczaj znajduje się tu sekwencja CLC; RTS, lub też, ponieważ procedura bootująca może załadować tylko 256 sektorów, program doładowujący dodatkową część programu poprzez SIO). Słowo spod adresu ładowania +4 przepisywane jest do DOSINI lub CASINI (zależnie od rodzaju boota) po czym procedura RESET (której boot jest częścią) biegnie sobie dalej. Na samym końcu wykonywany jest skok do DOSINI/CASINI (zależnie od BOOT?) i to jest faktyczny punkt wejścia do programu.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

11

Przesuniecie run start na koniec faktycznie nie pomoglo.

Ale po wyjasnieniach Mono pojalem o co chodzi z tym loaderem. Zmienie rezerwacje wszystkich zmiennych na stronie zerowej (a wykorzystuje ze 40 bajtow), tak by byly ustawiane na poczatku programu. Moge to sprawdzic dopiero wieczorem. Poinformuje o wynikach.
Dzieki za pomoc.

12 Ostatnio edytowany przez mindfields (2011-02-21 21:58:44)

mono napisał/a:

@nosty: Niestety format boot nie jest równoważny formatowi xex (plikowi binarnemu), bo pliki binarne są obsługiwane przez DOSa a nie przez OS.

Więcej na ten temat (wiem, że teksty JBW dzisiaj to już "klasyka", ale co mi tam ;) ) http://tiny.pl/hc3s5

Loading... Please wait!

13

Melduję że gra sie juz odpala i smiga znakomicie na moim Atari :)
Faktycznie pomogło inicjowanie zmiennych na stronie zerowej w programie zamiast przez dta.
Dzieki!