C64Power Forum
Ogólne => Forum Ogólnodyskusyjne => Wątek zaczęty przez: nyar w 23 Września 2007, 02:18
-
Witam ponownie !
Moje pytanie jest być może banalne a być może nie...
chciałbym zrobić tak żeby napisany program w asmie wywołać komendą run spod basica
np. sys (2049) i zapisac go w jednym kawalku na dyskietce.
Pytanie jak to zrobic ?
z góry dzieki za odpowiedź
-
To znów ja.
Linia basica... niby prosta rzecz, a tak w jednym zdaniu sie nie da opisać.
Szkoda że TASM nie ma takiej opcji żeby ją wpisać automatycznie.
Zasada jest niby prosta:
po SYS musisz wpisać adres na twój program w postaci dziesiętnej.
Jak np masz w TASM-e *=$c000 to po sys powinno być 49152.
Gorzej to wpisać w TASM-ie, żeby zawsze było, ale się da.
Nie chce mi się tu rozwodzić nad dokładnym opisem jak to zrobić. Napisz o d którego adresu zaczyna Ci się program w TASM, a ja Ci podam linijkę którą umieścisz na początku algorytmu w TASM, żeby Ci się pojawiło SYS
pzdr
-
dzięki za błyskawiczną odpowiedź na 2 posty :)
$07d0 start programu
I jak sie nie myle chodzi o to żeby program na początku swojej pracy wygenerował
10 sys (2000) w basicu.
No i właśnie mnie to interesuje jak to zrobić. Jeśli znasz jakis art na ten temat albo przykładowe źródłowki to byłbym wdzięczny
pozdro
-
Najłatwiej to zrozumieć wpisując komendę, a później \'podglądając\' ją w jakimś monitorze (w Vice ALT+M).
A więc uruchamiasz emulator (albo oryginalne c64 z jakimś modułem który ma monitor, czyli final, albo AR), i od razu wpisujesz :
10 SYS 2000 (enter)
teraz wchodzisz do monitora (w Vice ALT+M) i wpisujesz komendę: m 0800(bo od $0800 zaczynają się programy w Basic).
Wyświetli Ci się coś takiego:
>C:0800 00 0c 08 0a 00 9e 20 32 ...... 2
>C:0808 30 30 30 00 00 00...
tak właśnie jest reprezentowana ta linijka Basica w pamięci.
A teraz co po kolei...
00 - początek Basicu,
0c 08 - para:młodszy i starszy bajt numeru następnej linii Basica ($080c),
0a 00 - para:młodszy i starszy bajt numer linii Basica (nasze 10 przed SYS),
9e - znaczy tyle co instrukcja SYS,
20 - spacja między SYS a 2000,
32 30 30 30 - \'2000\' nasz adres,
00 - koniec linii (tej 10),
00 00 - następna linia (ta $080c), której nie ma to znaczy, że już koniec programu.
A więc jeśli chcesz to umieścić w TASM-ie po prostu wpisz na początku:
*=$0800
.byte $00,$0c,$08,$0a,$00,$9e,$20,$32,$30,$30, $ 30,$00,$00,$00
*=$07d0
...
i tu dalej twój program.
pzdr
ps. Co do materiałów na ten temat to polecam B.Frelka (jest na czytelni www.retroreaders.pl)
-
zrobiłem tak jak napisałeś ale coś nie do końca to wszystko chce mi działać...
dla przykładu :
10 sys (10000) w basicu to będzie :
>C:0800 00 0f 08 0a 00 9e 20 28 31 30 30 30 ...... (1000
>C:080c 30 29 00 00 00 00 00 00 00 00 00 00 0)..........
w maszynowym
zapisałem to do assemblera w postaci :
*=$0800
.byte $00,$0f,$08,$0a,$00,$9e
.byte $20,$28,$31,$30,$30,$30
.byte $30,$29 ;te zera olałem
*=$2710
ldx#$21
wpak: lda tekst,x
sta$0400,x
dex
bpl wpak
rts
tekst: .text : \'prawdziwy maniak\'
.text \' petli sie nie boi\'
po naciśnięciu <= 3 ,S program wraca do basica i mruga ready
ok spoko wpisuje RUN i ...działa !!! jedyny problem w tym ,że wyświetla to wszystko z controlem (krzaczki). Próbowałem napisać tekst w assemblerze z controlem lecz kilka literek z controlem jest zarezerwowane dla assemblera :/ m.in t
Druga sprawa to, że jak assembluje to do pliku wykonywalnego PRG i go odpale to NIC nie wyświetla po RUN nawet krzaczków :(
gdy zlistuje pod basiciem to wyswietla dodatkowa dziwna linię :
LIST
10 sys (10000)NEW!EXP`CMD
63248 -PRAWDZIWY MANIAK PETLI SIE NIE BOI
READY
-
Nie olewaj tych zer na końcu bo są ważne!
3 zera na końcu oznaczają koniec programu w Basic-u, jak ich nie wpisałeś to po list miałeś dziwne krzaczki. Interpreter nie znalazł końca i wyświetlał wszystko jak leci w pamięci, a że to wychodziło mu losowo to już nie jego wina.
pzdr
-
hejka to samo sie dzieje jak przepisze wszystkie zera z tej linijki, bądź tak jak napisałeś tylko 3.
Te krzaczki po kombinacji shift+c= zamieniają sie w prawdziwy tekst.. być może to jest wina tego ze w assemblerze wszystko pisze sie małymi literami...
po zassemblowaniu do pliku i odpaleniu go niestety nie ma nawet tych `krzaczków`
Krzaczki pojawiają sie tylko jak w asmie wklepie <=,3,S RUN ,zaś shift+c= zamienia to w czytelny tekst...
można coś źle zassemblowac ?
Do assemblacji użyłem kombinacji <=,5, nazwa return.
pozdro
-
czytam właśnie Frelka i tam jest opisane ,że w w adresach $0800 do $0831 zawierać sie powinna linijka programu w basicu bootująca program
a w adresach $0880 do $08a2 `przeładowywacz`(loader/reloader ?) w asmie... właśnie probuję to doczytać i może to rozgryzę.
pozdro
-
dopisałem zera tekst nadal sie nie wyświetla po assemblacji, zaś jak zapuszczę LIST ,wtedy rzeczywiście już nie ma żadnych dziwnych dodatkowych linijek :)
-
Hej,
Znaki wyświetlane za pomocą .text różnią się trochę od tych wyświetlanych na ekranie, ponieważ mają inne kodowanie (ASCII, CMB).
Dopisz: and #$BF
między lda tekst,x ,a sta $0400,x i powinno być dobrze.
Ze zgraniem do pliku - zarówno tej linii basica jak i programu w assemblerze nie jest już tak prosto.
Zgrywanie do jednego pliku ma \'charakter ciągły\', czyli nie można sobie zaznaczyć żeby komputer zgrał linijkę basica, a do niej `dołożył` program w assemblerze.
Wynika to z tego, że zgrywać można jeden cały obszar z pamięci. Linijka basica znajduje się od $0800 do $08xx, a twój program od $2c10 do $2cxx, czyli zgrać wszystko trzeba by od $0800 do $2cxx, a więc również to co się znajduje między $08xx do $2c10, a to już ponad 2Kb :) (troche się marnuje tej pamięci:P )
Ale możesz to zrobić w monitorze emulatora (komenda: s \'program\' 0 0800 2c80).
No niestety nie jest to wszystko takie fajnie elastyczne jak by się chciało.
Dlatego polecam jednak przejście na pisanie programów spod PC. Czyli w edytorze tekstowym połączonym z jakimś kompilatorem do formatu C64 (polecam relunch64, a compilator 64tass - ma identyczną składnię jak TurboAssembler, a więc bez trudu przeniesiesz każdy algorytm).
Tam zasada jest podobna, a do tego dokładając jakiś program linkująca-kompresujacy (np exomizer), w rezultacie (oczywiście po konfiguracji tego wszystkiego w całość) będziesz miał pliczki wynikowe takie jak sobie zażyczysz i nie `marnujące` pamięci.
O przeklejaniu gotowych tekstów (np z tego wątku) do kodu źródłowego programu nie wspomnę
Oszczędzisz czas i nerwy. pzdr
ps. czemu adres po sys umieszczasz w nawiasach ? - to zbędne.
-
Aha .. zmusiłeś mnie do wpisania tego w TurboAssie
linie basica *=$0800 ...
umieść dopiero za kodem bo tak po <- + 3 i `s` tass skacze do 0800 zamiast $2c10
-
hmm a jakby program napisać w adresie zaraz po linii basica ?
to ze sys napisałem w nawiasie to dlatego ze wcześniej podglądałem monitorem i listem co sie dzieje z rożnymi gierkami podczas bootu np. turrican II wysypał wartość sys w nawiasie wiec pomyślałem ze to jest ok.
poprobuję z tym programem na pc który mi poleciłeś.
pozdro
-
udało się program zajmuje od $0800 do $0840 (64b) pamięci czyli chyba niedużo :D
odpala sie komendą run spod basica :)
monitor z finala III sie przydał.
wielkie dzieki i pozdro
-
Tak w ogóle to na Komodę powstały narzędzia, które to samo by załatwiły.
Taki np. Crosslinker (*) - poskłada pliki do kupy, skompresuje i doda SYS xxxx do odpalania z Basica.
(*) Pewnie jest dużo nowszych i lepszych - ten dotarł do mnie na dyskietce PD 64+4, więc to było wieki temu ;)
-
Oczywiście, jest wiele linkerów na c64.
Tyle, że opłacalność ich używania jest wtedy, gdy linkujesz już wszystkie gotowe części kodu jak i dane.
Trudno sobie wyobrazić, żeby ktoś każdorazowo po poprawieniu kilku linijek w swoim programie od nowa go linkował, żeby zobaczyć efekt - przecież to żmudna i syzyfowa praca.
Kiedyś nie korzystało się z PC-tów, i pisanie większych programów wiązało się w znacznej mierze z zawziętością kodera, ale teraz, czemu nie korzystać z mocy obliczeniowych piecy.
Przygodę z programowaniem na c64 rozpocząłem już dawno (początek lat 90-tych), później była przerwa, a teraz wznowiłem ją na nowo (pod koniec 2005)przy okazji dokończenia wcześniej zaczętej gry. Wiadomo, że człowiek nie ma tyle czasu co kiedyś i traktuje to jako hobby \'od czasu do czasu\'.
Początkowo wróciłem do Tass-a pod emulatorem, ale szybko okazało się, że pamięć commodorka (który w takim układzie ma oprócz kodu właściwego, ma program assembler-a i źródłówkę i zmienne) jest za malutka.
Później kombinowałem z dołączaniem różnych kart rozszerzeń w emu i specjalnymi wersjami Tassa wykorzystującymi te rozszerzenia - na próżno, one też miały ograniczenia (np. max 4096 linii kodu - a uwierzcie mi że przy pisaniu gier to jest zaledwie mała cząstka).
Broniłem się przed Pc-towskimi crossassemblerami do końca
, ale niestety musiałem dać za wygraną
Całe szczęście, że był TASS64 (Taboo-sów), który ma składnie identyczną z TASS-em na c64, bo jak miałbym zamieniać wszystko w składni programu to bym to olał i dał sobie już dawno spokój.
Ludzie ze sceny na prawdę napisali już wiele programów i programików wykorzystujących PC ułatwiających życie i jeszcze piszą!
Teraz kodowanie staje się już przyjemnością
-
Skull <== napisz mi plz z jakimi parametrami odpalać 64tass w relaunch, żeby nie wyskakiwał error przy kompilacji oraz ,żeby po f6 assemblowal prawidłowo i odpalal plik wynikowy w vice.
pozdro
-
64tass elegancko kompiluje źródła i wychodzi pliczek PRG :) Ale tylko wtedy ,gdy wpisuje wszystko ręcznie w wiersz poleceń. Natomiast nie mam pomysłu na to, jak skonfigurować relaunch64, żeby to wszystko automatycznie sie kompilowało i odpalało w VICE po naciśnięciu F6.
oka wracam do kodowania bo zaczynam sie rozdrabniać
pozdro
-
hehe to ja tu do Ciebie pisze, a ty na forum
-
Już przeczytałem / odpisałem
dzięki :D
P.S nie każdy zagląda do skrzynki pocztowej :D