forum speccy.pl
Komputery z Z80 => JUPITER ACE => Wątek zaczęty przez: KWF w 2020.10.05, 09:18:11
-
Większość materiałów na temat programowania w asemblerze odnosi się do archaicznego TASM (Telemark Assembler) i pod niego są szablony (templates) do generowania plików TAP dla Jupitera ACE. Co prawda TASM w do wersji 3.1 działa całkiem sprawnie pod DOSboxem, jednak jego używanie jest archeologią stosowaną. Ostatnia wersja TAMSa o numerze 3.2 działa z lini komend Windowsa, ale nie działa pod DOSboxem, więc poza kręgiem moich zainteresowań.
Osobiście do gustu bardziej przypadł mi ZASM, który jest ciągle rozwijany (najnowsza wersja pochodzi z września tego roku). Dlaczego ZASM? Ponieważ z automatu potrafi dodać sumę kontrolną do generowanych bloków TAP (na odpowiednim miejscu), a także dokleić odpowiedni nagłówek oraz dodać długość następnego bloku w pliku TAP. Aha, no i jest dla nieokienkowych.
Dokumentacja ZASM opisuje w jaki sposób generować pliki TAP (https://k1.spdns.de/Develop/Projects/zasm/Documentation/z92.htm) dla ZX Spectrum i Jupitera ACE. Opisuje ona różnicę między tymi formatami, ALE opis jest do wersji starszej niż 4.2 i nie działa poprawnie w nowszych wersjach kompilatora. Generowane tą metodą TAPy mają za długi nagłówek (o dwa bajty). Dla własnych celów stworzyłem sobie dwa szablony pod ZASMa 4.2.x, aby łatwo i wygodnie generować poprawne pliki TAP, które można wczytać do emulatora (w moim przypadku ZXSP).
DICT_template - szablon dla TAPa z definicjami nowych słów w FORTH; wczytywanie przez:
LOAD nazwa
BIN_template - szablon TAPa z kodem binarnym wczytywanym pod zadany adres w pamięci RAM; wczytywanie przez:
0 0 BLOAD nazwa
W ZIPie są dwa przykładowe pliki DICT.TAP i BIN.TAP wygenerowane z tych szablonów. Są to wersje rozwojowe i można je sobie dowolnie modyfikować, np. przez dodanie autostartu, czy łączenie wielu bloków w jeden plik.
Szablony przeniosłem na GitHuba, aby łatwiej nimi zarządzać.
https://github.com/McKlaud76/JACE-TAP-templates
-
Dzięki wielkie, przyda się!
-
fajnie fajnie! jeszcze tylko to wczytać na Jupitera :)
-
Eee, to już jesteśmy w domu ;) tap2tzx przeskaluje TAPa do TZXa z timingami ZX Spectrum i można wczytywać przez TZXduino :)
-
Do kompletu dołożyłem autostart:
AUTOSTART_template - szablon TAPa z autostartem; wczytywanie przez:
0 0 BLOAD autostart
Oraz przykładowe TAPy wygenerowane z tych szablonów.
-
To ja tylko przypomnę dla lubiących pasmo: https://www.speccy.pl/forum/index.php?topic=5592.msg84984#msg84984
Niestety nie umiem tego przekompilować pod Windowsem.
-
I jeszcze garść przydatnych informacji:
--- Mapa pamięci
0000 - 1FFF = ROM
2000 - 23FF = 768 charmap + 256 PAD (CPU priority)
2400 - 27FF = 768 charmap + 256 PAD (Video priority)
2800 - 2BFF = 1KB charset (CPU priority)
2C00 - 2FFF = 1KB charset (Video priority)
3000 - 3BFF = RAM 1KB x 3 mirrors
3C00 - 3FFF = RAM 1KB
3C00 - FFFF = Expansion RAM (0-48KB)
--- Rejestry Z80 i ich wykorzystanie przez FORTHa
A,Flags - Temporary
BC - Temporary
DE - Temporary
HL - Temporary
IX - System Variables ($3C00)
IY - Interpreter Pointer
SP - Return Stack Pointer (IP on top)
$3C3B - Data Stack Pointer
RST n - Used for core stack ops
-
Jakby komuś było potrzebne, to w załączniku przekompilowane dla Windows pasmo z moim patchem generującym TAPy dla Jupitera. Wywyołuje się np:
pasmo --jace zrodlo.asm wynik.tap
W efekcie daje TAPa którego podłączamy do emulatora (albo konwertujemy na tzx etc.) i wczytujemy przez
0 0 bload wynik
Jeśli w kodzie znajdowała się dyrektywa END to całość się załaduje i automatycznie uruchomi od tego adresu. Jeśli nie, to tylko załaduje od adresu z ORG.
Ten tryb nie nadaje się oczywiście do wszystkich zastosowań - przede wszystkim nie da się w ten sposób skompilować kodu osadzanego w słowniku FORTH. Potrzebna mi była metoda szybkiego generowania TAPów z demami do testowania i stąd właśnie ta poprawka.
Kod jest skompilowany statycznie przy użyciu MinGW - kompilacja innym kompilatorem da pewnie mniejsze EXE, ale to już wykracza poza moje umiejętności obsługi Windows ;)
-
Po dyskusjach o fizycznym wczytywaniu programów do Jupitera i procedurze konwersji przysiadłem i poprawiłem pasmo dodając do niego kolejny tryb generowania --jacex
Wywołanie tak jak dotychczas
pasmo --jacex zrodlo.asm wynik.tzx
(tak... w poprzednim poście parametry były podane w niepoprawnej kolejności ;)) (poprawione przez moderatora)
Plik wynikowy powinien mieć format "przeskalowany" do Jupitera i wgrywać się poprawnie na fizycznym sprzęcie przy użyciu "wgrywadełek" albo stosownego programu odtwarzającego TZXy.
Wczytanie (i uruchomienie) kodu to - jak dotychczas
0 0 bload wynik
W załączniku archiwum z patchem (uwaga - jakość kodu może wypalić wzrok ;)) oraz pasmo.exe skompilowane statycznie dla Windows.
-
czy ten sam plik daje radę wczytać w emulator?
-
Oczywiście. Tylko jak podglądasz w "managerze taśmy" to śmiesznie wygląda bo tam są bloki z nietypowymi timingami i się pokazują jako "Turbo speed block" ;)
-
a to spoko, bo wychodzi, że jest to taki "all-in-one" czyli ten sam plik docelowo do użycia na prawdziwym sprzęcie można testować pod emulatorem. Aha - czy dobrze kojarzę, że masz EightyOne przerobiony czy "fabryczny"?
-
Starsza wersja lekko przerobiona. Oryginalna nie obsługuje AY na portach ZX 128 - znaczy da się to włączyć, ale w Jupku po prostu nie działa. Poszukaj - wrzucałem tu gdzieś przekompilowaną wersję. Próbowałem skompilować nowszą, ale @SAJ zrobił tam jakiś magic, żeby to się kompilowało i ja nie umiem tego powtórzyć - windowsowe programy mnie nie lubią ;)
edit: Tu jest: https://www.speccy.pl/forum/index.php?topic=5656.msg85916#msg85916 :)
-
Dzięki, zaciągnąłem.