forum speccy.pl

ZX Spectrum => PROGRAMOWANIE => Wątek zaczęty przez: ikci w 2013.04.02, 22:47:28

Tytuł: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.02, 22:47:28
Jako, że ostatnio mój wolny czas zaczęły mi zajmować zabawy związane z konwersją gier w wersjach taśmowych na dyskowe (Spectrum +3)

Mam poważny problem - chodzi o gry 128K czyli wykorzystujące memory paging które wczytują się z taśmy tylko poprzez wpisanie USR0
z poziomu +3 Basic.
W przypadku wgrywania z dyskietki, gra musi się wczytać do pamięci poprzez BASIC LOADER a następnie przeskoczyć do trybu USR(0)
w którym jest wsparcie dla memory paging'u oraz muzyki AY ... No i uruchomić po takim przeskoczeniu :-)

Jak to kurka zrobić?

W przypadku wczytywania z taśmy mamy program który automatycznie przełącza na USR0 (i wczytuje kolejny program wymagający trybu USR0)
http://www.worldofspectrum.org/infoseekid.cgi?id=0027522 (http://www.worldofspectrum.org/infoseekid.cgi?id=0027522)

Jednak w przypadku dysku nie możemy najpierw przełączyć na USR0 bo wtedy nasz Speccy +3 nie obsługuje stacji dysków.

Jest też watek na WOS na ten temat: http://www.worldofspectrum.org/forums/showthread.php?t=42804 (http://www.worldofspectrum.org/forums/showthread.php?t=42804)
ale prawdę mówiąc nic mi to nie dało bo to cały czas jest o wczytywaniu z taśmy...

 
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Tygrys w 2013.04.02, 22:55:37
Ostatnio nabrałem troche skilli w sprawie 128K. Powiedz mi, którę grę chciałbyś przerobić na ładowaną ze stacji?
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.03, 06:07:27
No właśnie z wielką dozą bojaźni w sercu przyznaję się do wielokrotnych prób przerzucenia na dysk (zbanowanej gry) Nodes of Yesod w wersji 128K

Już trochę mi się udało zdziałać w temacie tej gry.. ale nie wiem czy mogę to tutaj zamieścić?

Przy okazji: Na WOS od dłuższego czasu ciągnie się (nudny jak flaki w oleju) temat zbanowanych / zakazanych gier.

Temat nudny bo dotyczy chyba tylko WOS, to znaczy chyba jedynie WOS respektuje i nie zamieszcza gier, sprzed 25-30 lat, co do których nie ma 100% pewności w kwestii publikacji lub też ich publikacja została zakazana.

Natomiast zupełnie problem ten nie dotyczy innych platform (CPC, Commodore C64 itd)
Gdyż gry oznaczone na WOS jako DENIED są bez problemu dostępne dla innych platform na poważnych portalach.
Na przykład: http://www.cpc-power.com/index.php?page=detail&onglet=dsk&num=1528 (http://www.cpc-power.com/index.php?page=detail&onglet=dsk&num=1528)

Zresztą w przypadku Spectrum też wystarczy tylko po-google'ać i bez problemu znajdziemy interesującą nas grę..

Zatem jeśli wrzucę tutaj linki do plików hostowanych na moim serwerze to rozumiem, że nikt mi głowy nie urwie?

Mnie chodzi o kwestię edukacyjną.







Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Tygrys w 2013.04.03, 08:44:59
Spokojnie, To nie jest WOS. Równie dobrze możesz dodawać programy w załączniku.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.03, 10:55:26
...
Jest też watek na WOS na ten temat: http://www.worldofspectrum.org/forums/showthread.php?t=42804 (http://www.worldofspectrum.org/forums/showthread.php?t=42804)
ale prawdę mówiąc nic mi to nie dało bo to cały czas jest o wczytywaniu z taśmy...

Trzeba uruchomić tą przełączającą procedurę po wczytaniu gry a przed jej uruchomieniem - czyli przed ostatnim USR. W tym wątku na WOS i pobocznych, jest kilka wersji od najprostszych do takich z odbudowaniem stosu.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.03, 12:11:28
Super!
No to jadę:

1) Nodes of Yesod wersja 48K

Gra nie działa w ogóle pod Spectrum +2A/+2B/+3
Totalna niekompatybilność w każdym trybie (Tryb Loader, Tryb USR0, Tryb Basic 48).

Wygląda to tak, że po załadowaniu gry - pojawia się ekran z wyborem sterowania klawiatura/Kempston/Sinclair II itd
i następnie po dokonaniu wyboru wchodzi nam pierwsza plansza gry, ale bez ludzika (kosmonauty).

(http://www.marcin-marcin-marcin.com/nodes48.jpg)

Z problemem poradziłem sobie w następujący sposób (nie śmiejcie się -  jestem totalnym żółtodziobem)

Program sna2dsk z pakietu Johnn'a Eliott'a  http://www.seasip.info/ZX/taptools-w32.zip (http://www.seasip.info/ZX/taptools-w32.zip)

Przełączyłem emulator na symulowanie "gumiaczka" czyli tryb ZX Spoectrum 48K, następnie zrobiłem snap
gry zaraz po załadowaniu kiedy na ekranie jest jeszcze screen ładujący - i zapisałem to jako plik sna
Następnie programem sna2dsk zrobiłem obraz dysku +3dos
sna2dsk -180  nodesoy.sna  NoY48.dsk 48rom
To ostatnie polecenie to wskazanie oryginalnego "gumiakowego" ROM'u który musi być w tym samym katalogu co sna2dsk.

W rezultacie otrzymałem plik NoY48.dsk

Następnie poprzerabiałem trochę BASIC'owy loader aby ładnie wyglądało, pozmieniałem nazwy wygenerowanych
plików aby wyglądało profesjonalnie i obraz dysku, a raczej drzewo plików wygląda tak:

(http://www.marcin-marcin-marcin.com/tree.jpg)

NODESOFY.BAS oraz DISK to loader w Basicu - to identyczne pliki - z tym, że duplikuje  plik .BAS na plik DISK
aby obraz dysku był "autoładujący".

NODES0.LDR - to loader w asemblerze (albo może w "C"?) wygenerowany automatycznie przez sna2dsk
NODES1.DAT to oryginalny ROM gumiaka (widać po lewej stronie - ma 16K
NODES2.DAT to snapshot czyli plik SNA

Tutaj jest obraz dysku Nodes of Yesod 48K http://www.marcin-marcin-marcin.com/NoY48.dsk (http://www.marcin-marcin-marcin.com/NoY48.dsk)

Gra się ładuje, po załadowaniu komputer coś tam sobie gada... gra i buczy...
Mam działającą wersję dyskową :-)

Ale ja uparłem się aby przekonwertować również wersję 128K

Cały problem polega na tym, że sna2dsk konwertuje wyłącznie snapy 48K

No więc zrobiłem tak, że w emulatorze Spectaculator podpiąłem wirtualnie Multiface 3

(http://www.marcin-marcin-marcin.com/m3.jpg)
 
Teraz ładujemy grę.. czekamy aż się załaduje i... PYK... pauzujemy. następnie aktywujemy Multiface, odpauzowujemy
i dajemy opcję SAVE --> DISK  (musimy mieć już wcześniej przygotowany czysty obraz dysku zapięty w kieszeni A)

W ten sposób na wirtualnym dysku będziemy mieli zapisany snap gry... ale niestety za każdym razem do załadowania będzie
potrzebny aktywny Multiface 3 (lub w skrócie M3)  więc na realnym Spectrusiu +3 raczej taką wersją dyskową się
nie nacieszymy (chyba, że mamy zamiar wydać około 100 funciaków na M3 z przesyłką z Ebayu)

Na szczęście w roku 1990 powstał genialny program M3 Unlock  - na WOS jest niedostępny (MIA) ale my go mamy

http://www.marcin-marcin-marcin.com/m3unlock.zip (http://www.marcin-marcin-marcin.com/m3unlock.zip)

Tym programem odblokowałem pliki zapisane przez Multiface3 i tym sposobem mam działającą wersję 128K
http://www.marcin-marcin-marcin.com/NoY128.dsk (http://www.marcin-marcin-marcin.com/NoY128.dsk)

Niby wszystko gra i buczy więc czego ja właściwie chcę?
Ano chciałbym nie korzystać ze snapów lecz zrzucić "normalnie" grę 128K na dysk...

Jest w necie trochę wersji taśmowych Nodes of Yesod 128k

Wersja chyba oryginalna to: Nodes Of Yesod (1986)(Odin Computer Graphics)(128k).tzx
Wygląda tak:

(http://www.marcin-marcin-marcin.com/nodes128oryg.jpg)

Dla mnie nie do przejścia...
- loader BASICowy zabezpieczony (LINE 0)
- wczytuje pierwszy plik a następnie w tym pliku jest dalsza obsługa ładowania
reszty plików - napisana w asemblerze..

Ta wersja ładuje się do +3 "normalnie" czyli przez LOADER i nie trzeba USR0

Zacząłem szperać po necie i znalazłem wersję z'trainer'owaną

Nodes of Yesod (1985)(Odin Computer Graphics)[t][128K].tap

Popatrzcie:

(http://www.marcin-marcin-marcin.com/nodes128train.jpg)

MIÓD ZABAWA !  Pliki z nagłówkami, loader BASIC'owy mimo że LINE 0 to udało
mi się edytować...
Tylko, że ta cholera uruchamia się tylko poprzez USR0  >:( >:( >:(

Zrobiłem już z tego obraz dysku +3DOS

http://www.marcin-marcin-marcin.com/NoY128train.dsk (http://www.marcin-marcin-marcin.com/NoY128train.dsk)

BASIC loader to plik NODES.BAS

Panowie, podpowiedzcie cosiik... jak go przerobić aby działał?

@PHONEX  - dziękuję, już kombinowałem wiem, że to pewno prościzna, ale jestem za zielony w tym  :(
 
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.03, 12:18:04
Wersja chyba oryginalna to: Nodes Of Yesod (1986)(Odin Computer Graphics)(128k).tzx
Wygląda tak:

(http://www.marcin-marcin-marcin.com/nodes128oryg.jpg)

Dla mnie nie do przejścia...
- loader BASICowy zabezpieczony (LINE 0)
- wczytuje pierwszy plik a następnie w tym pliku jest dalsza obsługa ładowania
reszty plików - napisana w asemblerze..

Ta wersja ładuje się do +3 "normalnie" czyli przez LOADER i nie trzeba USR0

Na oko wygląda, że za loaderem (te 256 bajtów) jest screen, kod ładowany do normalnego RAMu 48 i dwa banki 128. Wrzuć plik bo z wyszukiwarki wychodzą mi głupoty, to rzucę okiem co dokładnie robi loader i może podrzucę jakieś info.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.03, 12:32:15
Widzę, że upierasz się jednak przy "oryginalnym" TZX :-)

Tutaj jest ten "oryginał"  http://www.marcin-marcin-marcin.com/NOY.zip (http://www.marcin-marcin-marcin.com/NOY.zip)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.03, 12:55:49
Wiesz... Jeśli jest poprawna wersja to po co kombinować z jakimiś crackami? Potem jak już będziesz miał normalnie zrobione z loaderem w BASICu to sobie możesz dodać co ci tam będzie potrzebne :)

Loader wygląda tak:
5000 318C50     ld sp,0x508C
5003 3E1F       ld a,0x1F
5005 DD2100C0   ld ix,0xC000
5009 11001B     ld de,0x1B00
500C CD3D50     call 0x503D
500F 3E18       ld a,0x18
5011 DD21005B   ld ix,0x5B00
5015 110090     ld de,0x9000
5018 CD3D50     call 0x503D
501B 3E1E       ld a,0x1E
501D DD2100C0   ld ix,0xC000
5021 110040     ld de,0x4000
5024 CD3D50     call 0x503D
5027 3E1C       ld a,0x1C
5029 DD2100C0   ld ix,0xC000
502D 110040     ld de,0x4000
5030 CD3D50     call 0x503D
5033 01FD7F     ld bc,0x7FFD
5036 3E10       ld a,0x10
5038 ED79       out (c),a
503A C3005B     jp 0x5B00
503D 01FD7F     ld bc,0x7FFD
5040 ED79       out (c),a
5042 37         scf
5043 3EFF       ld a,0xFF
5045 14         inc d
5046 08         ex af,af'
5047 15         dec d
5048 F3         di
5049 C36305     jp 0x0563

Poszczególne bloki są ładowane tak:
1: C000, bank 7 z włączonym shadow screenem - wyświetla obrazek nie psując loadera, który siedzi pod 5000 czyli w normalnym ekranie
2: 5B00, bank 0 - kod do głównego RAMu, ale zaczynając od bufora drukarki więc bezpośrednio nie da się tego zrobić z BASICa
3: C000, bank 4
4: C000, bank 2

Bloki od 2 do 4 ładują się z włączonym shadow screenem, czyli cały czas wyświetlany jest screen.

Na koniec wyłączany jest shadow screen, włączany bank 0 i uruchamiany program od adresu 5B00 (bufor drukarki w trybie 48, zmienne systemowe 128 w trybie 128).

Jak widać tak skonstruowanego loadera nie da się przerobić wprost na BASICowy. To, co trzeba zrobić (i czym za chwilę się zajmę ;)) to loader, który załaduje pierwszy blok kodu gdzieś wyżej do pamięci, potem wciągnie do banków dodatkowe dane a na koniec przerzuci główny kod w dół i skoczy do jego początku.

Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.03, 13:10:51
Kurcze pieczone... jakbym miał taką wiedzę jak Ty to bym KAŻDĄ grę przerobił na wersję +3DOS bez lamerskiej zabawy ze
snapshotami itd...
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.03, 13:16:52
A możesz dać linka do wersji z nagłówkami? Mam pewne podejrzenia...
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.03, 13:17:49
Ok. W załączniku masz TAPa ładującego grę w trybie 128 i ZIPa z fizycznymi plikami, które ten TAP ładuje (do ewentualnego wrzucenia na dyskietkę). W TAPie są normalne bloki kodu z nagłówkiem, przełączanie banków przez systemowy POKE itp. Jedyna modyfikacja w stosunku do tego, co wrzuciłeś to zmieniony główny blok kodu i wyrzucony oryginalny loader. Główny blok ładuje się teraz od 25000, ma na początku JP do końca danych a tam przełącza bank, ustawia stos, przerzuca dane pod $5B00 i skacze do początku programu.

Loader w BASICu jest oczywiście brzydki - kolejne bloki psują screena itp., ale całość jest raczej po to, żebyś mógł sobie dalej przerobić na wersję dyskową. Jeśli +3 nie robi czegoś bardzo inaczej niż zwykłe 128, to nie powinieneś mieć z tym problemu.

Sam loader wygląda tak:
10 clear 24999
20 load "" screen$
30 load "" code
40 poke 23388,16+6
50 load "" code
60 poke 23388,16+4
70 load "" code
80 poke 23388,16+0
90 randomize usr 25000

Modyfikacja głównego bloku to kawałek asma dla pasmo:
        org 25000
        jp move_it
start:
incbin "0005.bin"
move_it:
        di
        ld a,$10
        ld bc,$7ffd
        out (c),a
        ld sp,$508c
        ld hl,start
        ld de,$5b00
        ld bc,move_it-start
        ldir
        jp $5b00

Mam nadzieję, że opis jest jasny, ale jakbym napisał coś niezrozumiale, to pytaj :)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.03, 13:19:57
Kurcze pieczone... jakbym miał taką wiedzę jak Ty to bym KAŻDĄ grę przerobił na wersję +3DOS bez lamerskiej zabawy ze
snapshotami itd...

Nic tylko czytać, ćwiczyć i kombinować. Przecież ja się tego nie nauczyłem w szkole ;)

A możesz dać linka do wersji z nagłówkami? Mam pewne podejrzenia...

To co wrzuciłem wyżej wystarczy?

I... jakie to podejrzenia?
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.03, 13:33:01
Chodzi mi o linka do tego


...

Zacząłem szperać po necie i znalazłem wersję z'trainer'owaną

Nodes of Yesod (1985)(Odin Computer Graphics)[t][128K].tap

Popatrzcie:

(http://www.marcin-marcin-marcin.com/nodes128train.jpg)

MIÓD ZABAWA !  Pliki z nagłówkami, loader BASIC'owy mimo że LINE 0 to udało
mi się edytować...
Tylko, że ta cholera uruchamia się tylko poprzez USR0  >:( >:( >:(


Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.03, 13:44:17
Już wszystko wrzucam.. Dajcie mi sekunde...

Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.03, 13:55:30
@ Phonex  - plik z nagłówkami tutaj:   http://www.marcin-marcin-marcin.com/NOY-t.zip (http://www.marcin-marcin-marcin.com/NOY-t.zip)

@Matofesi

Bardzo dziękuję - przerobiłem zaraz na wersję +3Dos ale coś złego się dzieje...

(http://www.marcin-marcin-marcin.com/noyerror.jpg)

Po ząładowaniu całego (chyba) programu wyświetla sie komunikat
0 OK 90:1  i dalej nic...

Plik TAP który mi wysłałeś pod Spectrum +3 ładuje się bez problemu...
ale po przeróbce do DSK wychodzi jajo

Tutaj plik DSK   http://www.marcin-marcin-marcin.com/noy128beta.dsk (http://www.marcin-marcin-marcin.com/noy128beta.dsk)


Listing BASIC loadera przerobionego na wersję +3DOS wygląda tak:

(http://www.marcin-marcin-marcin.com/loader.jpg)

Oczywiście rozszerzenie plików TAP nie ma znaczenia - to równie dobrze może być SCR przy screenie
czy też COD przy reszcie bloków.. Ważne aby nazwy plików na obrazie dyskietki zgadzały się z nazwami w loaderze.

Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.03, 15:35:30
Wychodzi mi jednak, że +3 inaczej przełącza banki przy ładowaniu z dyskietki i dane nie trafiają tam gdzie powinny. Muszę poszukać co i jak - jak wymyślę, to dam znać ;)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.03, 19:50:51
No i wychodzi mi, że nie da się tego zrobić z samego BASICa. Przy wczytywaniu z dyskietki +3DOS używa dodatkowej pamięci jako bufora i przełącza strony według potrzeb, co powoduje, że normalne stronicowanie działa do momentu wczytywania czegoś z dyskietki.
Tutaj trzeba by wczytywać dane poniżej $C000 i małym kawałkiem kodu przerzucać dane do właściwych banków. Komplikuje to trochę procedurę, ale nie jakoś bardzo. Jeśli sobie nie poradzisz, to spróbuję znaleźć jutro chwilę i napisać stosowny kawałek :)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.03, 20:42:37
OK bardzo Ci dziękuję... Czekam bo może ktoś jeszcze będzie miał jakiś pomysł....
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.03, 20:49:07
Przy wczytywaniu z dyskietki +3DOS używa dodatkowej pamięci jako bufora i przełącza strony według potrzeb, co powoduje, że normalne stronicowanie działa do momentu wczytywania czegoś z dyskietki.

Jest coś jeszcze.
Jak się uruchomi Twoją przeróbkę pod +3 z tapa - to jest jakiś durny komunikat o błędzie! Pod standardowym 128K działa!!!  :o
Jak się obejrzy debuggerem to okazuje się że w momencie ostatniego USR jest włączony bank 6.
W 23388 jest 16 a bank włączony szósty. Czary z mleka!

Ja zająłem się tą drugą wersją z trainerem i mam to samo  >:(
Próbowałem zrobić przełączanie w asemblerze, asekurancko robiąc OUT i aktualizując 23388 i też kicha.
Jest jeszcze druga zmienna - 23399 która wybiera tryb specjalny pamięci, ale nie ma w nim takiej konfiguracji żeby bank 6 był od 49152.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Tygrys w 2013.04.03, 21:29:30
A może by to tak spakować? Załadować obrazek, a pozostałe dane oraz banki spakować, a następnie rozpakować w odpowiednie miejsca.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.03, 21:40:38
Ta wersja z trainerem jest właśnie spakowana.
W ogóle dziwna sprawa, bo w niej w scrollu pod menu litery są przesunięte o 1 pixel. I ta wersja nie gada.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.03, 21:45:47
Tak.. ta wersja z trainerem nie gada... Poza tym to jedyna wersja jaką spotkałem która po załadowaniu gry wymaga
kliknięcia w ENTER aby się uruchomic. Pozostałe wersje same przechodzą do menu wyboru kontrolerów.

A co to działania pliku TAP stworzonego przez Mata... odpalałem na Spectaculatorze i działa...
ale teraz sprawdziłem na SpecEmu i rzeczywiście pojawia się błąd DRIVE NOT READY, 90:1

EDIT: Na FUSE też ten sam błąd...
 
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.03, 22:08:40
Na Spinie też jest "Drive not ready, 90:1".
Skoro na realu też jest błąd to znaczy że Spin i SpecEmu lepiej emulują +3 niż Spectaculator ?
Trzeba nacisnąć klawisz, bo jak naciśniesz T to jest trainer  :)

Na Spinie ta pierwsza wersja (bez nagłówków) też nie gada! I scroll na dole jest skaszaniony. Dopiero przerobiona przez Mata zaczęła gadać i scroll jest OK.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.03, 22:15:25
Na Spinie też jest "Drive not ready, 90:1".
Skoro na realu też jest błąd to znaczy że Spin i SpecEmu lepiej emulują +3 niż Spectaculator ?

A sprawdzał ktos na na realu?

Co do jakości emulacji Spectaculatora.. właśnie zacząłem się o to martwić.
To jeden z niewielu programów za który zapłaciłem  ;D
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.03, 22:48:52
Ups.
Ja myślałem że Ty sprawdzałeś. Że na emulatorze działa, a na realu (+3Dos) nie.
Sorry, czytałem za szybko...
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.04, 09:05:57
No dobra... Tak jak pisałem - przerobiłem pliki i procedurę ładującą. Loader w BASICu wygląda teraz tak:
10 clear 24999
20 load "" screen$
30 load "" code : randomize usr 25000
40 load "" code : randomize usr 25000
50 load "" code : randomize usr 25000

W załączniku TAP, w którym tym razem zmieniłem kolejność - najpierw loader potem screen, banki i na koniec główny blok. Każdy z banków ma na początku skok na koniec a tam procedurkę:
move_it:
        di
        ld a,$10+BANK
        ld bc,$7ffd
        out (c),a
        ld hl,start
        ld de,$c000
        ld bc,move_it-start
        ldir
        ld a,$10
        ld bc,$7ffd
        out (c),a
        ei
        ret

Główny blok jest identyczny jak poprzednio - ładuje się do głównego RAMu, ustawia stos, przerzuca dane i skacze na początek programu.

Tym razem sprawdziłem TAPa - w FUSE odpalonym w trybie +3 ładuje się i odpala bez problemów :)

W załączniku oczywiście również binarne pliki do wrzucenia na dyskietkę :)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.04, 09:25:14
A wymyśliłeś może czemu poprzedni tap działał na +2, a na +3 nie?
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.04, 09:43:37
Stawiam na inną obsługę przerwań i to, że jak ładujesz na +3 z taśmy to on najpierw usiłuje sprawdzić, czy ma dyskietkę i prawdopodobnie coś mu tam przestawia banki. Ale szczerze powiedziawszy dodatkowych ROMów +3 nie oglądałem więc nie jestem pewien o co dokładnie chodzi - wiem, że przełączanie z BASICa banków na tym modelu wymaga dodatkowej ostrożności: ludzie robią OUT+POKE i jeszcze po tej operacji czekają ramkę albo dwie zanim efekt przełączenia faktycznie zacznie działać.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.04, 10:06:32
No i BRAVOOOOOOOO!  Owacje na stojąco!
Tym razem sprawdzałem na czterech emulatorach i na KAZDYM chodzi!

MAT, JESTEŚ WIELKI!

W załączniku gotowy obraz dysku w formacie +3DOS

Jeszcze raz bardzo dziękuję!!
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.04, 10:59:20
... ludzie robią OUT+POKE i jeszcze po tej operacji czekają ramkę albo dwie zanim efekt przełączenia faktycznie zacznie działać.

Zgadza się! Dopisałem PAUSE 100 przed ostatnim USR i już był włączony właściwy bank :)
Ale po uruchomieniu gra się zresetowała.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.04, 11:04:41
Bo prawdopodobnie dane nie trafiły do właściwych banków - przełączenie z dodatkową pauzą zadziała do momentu w którym coś zamielisz (ty albo system ;)) dyskiem. A to powoduje, że - prawie na pewno - nie da się załadować danych z BASICa wprost do banku.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.04, 11:14:31
Właśnie też wpadłem na to, że banki mogły się przełączyć w trakcie ładowania! I dopisałem PAUSE 100 po każdym POKE, przed LOAD. I działa! :)

edit: wystarczy PAUSE 1.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Gryzor w 2013.04.04, 11:48:33
W +3 chyba sterowanie silnikiem stacji jest zrobione na przerwaniach, o ile to cos wnosi :-)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.04, 12:35:13
@Phonex Hmmm... Dziwne... wydawało mi się, że to akurat testowałem i nie chciało działać. Ale może po prostu mi się wydawało ;)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Phonex w 2013.04.04, 14:23:23
No to ja przetestowałem.
Ale i tak pomysł jest niestety Twój ;)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.04, 14:34:27
Uściślając - niestety nie mój ;) Widziałem takie rozwiązanie gdzieś w jakimś loaderze a potem poczytałem przez chwilę dyskusje na WoSie.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.04, 18:15:29
Mat, byłoby genialnie jakbyś jakos to opisał...
Tzn od czego zaczynasz badanie takiej gry... Rozumiem, ze otwierasz w jakims disassemblerze.
Kurcze musze sie zabrać za naukę. Kiedyś było łatwiej. Nie dość że człowiek miał głowę chętniejszą
do nauki to jeszcze mase kumpli w poblizu chętnych do pomocy...
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: pear w 2013.04.04, 19:41:15
... i więcej wolnego czasu  :'(
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: sect0r w 2013.04.04, 22:10:58
W nocy nie spac! Kodowac, tworzyc, nie spac! :D
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: pear w 2013.04.05, 06:33:07
Spanie to luksus. :) Tworzę, tworzę ... ale nie dla siebie, od 12 lat ten sam temat i końca nie widać, a wsparcie żadne.
A że chodzi o programowanie PC niestety, to więcej tutaj nie będę się nie na temat wyżalał ;)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.05, 09:08:42
Mat, byłoby genialnie jakbyś jakos to opisał...

Może kiedyś... To jest bardzo rozległy temat :)

Cytuj
Tzn od czego zaczynasz badanie takiej gry... Rozumiem, ze otwierasz w jakims disassemblerze.

Jak zapewne wszyscy w okolicy wiedzą ja jestem ten stosunkowo nietypowy - używam na co dzień właściwie wyłącznie Linuksa (Windows tylko do grania i odpalania jakichś pokręconych drobiazgów, których inaczej nie da się zrobić). W związku z tym moje narzędzia są... moje ;) Używam paru gotowych narzędzi i trochę własnych skryptów. W tym konkretnym przypadku procedura była mniej więcej taka:

Zacząłem od przerobienia TZXa na TAPa, bo do TZXów nie mam odpowiedniego narzędzia ;) Konwersja to tapeconvert z narzędzi do FUSE.

TAPa "rozprułem" na składowe - do tego mam własny skrypt - tapsplit. Skrypt rozkłada TAPa na osobne bloki i zapisuje je w kolejnych TAPach a do tego zrzuca binarne bloki bez nagłówków, sum kontrolnych itp. (to te pliki 0005.bin, 0006.bin itp.)

Wiedziałem wcześniej, że loader siedzi w pliku o długości 256 bajtów więc tym się zająłem. Plik ładuje się od $5000 (20480) i to było potrzebne do disassemblacji. Większość analizy w takich przypadkach robię "na zimno" - tak było i teraz. Do disassemblacji używam PERLowego gotowca z80dis (kiedyś już pisałem na forum skąd go wziąć - to jest pakiet z CPANa), któremu podaje się adres startowy i plik do disassemblacji. Na wylocie dostałem plik loader.asm, z którego pochodził pierwszy cytowany wcześniej kawałek kodu. Kod uruchamiany jest od początku ładowania a więc...

W loaderze na początku mamy ustawienie stosu
5000 318C50     ld sp,0x508C

A dalej 4 kolejne kawałki ładujące bloki danych:
5003 3E1F       ld a,0x1F
5005 DD2100C0   ld ix,0xC000
5009 11001B     ld de,0x1B00
500C CD3D50     call 0x503D

W akumulatorze mamy wartość do wysłania do portu $7ffd a IX i DE to standardowe parametry dla LD_BYTES - początek i długość bloku do załadowania z taśmy. Sama procedurka ładująca wygląda tak:
503D 01FD7F     ld bc,0x7FFD
5040 ED79       out (c),a
5042 37         scf
5043 3EFF       ld a,0xFF
5045 14         inc d
5046 08         ex af,af'
5047 15         dec d
5048 F3         di
5049 C36305     jp 0x0563

Najpierw ustawiany jest odpowiedni bank pamięci potem parametry dla procedury łądującej i następuje skok do jej wnętrza - dość dziwnie zresztą, bo trafia w środek instrukcji:
0562 DBFE       in a,(0xFE)
0564 1F         rra
0565 E620       and 0x20

Po trafieniu w $0563 dostajemy:
0563 FE1F       cp 0x1F
0565 E620       and 0x20

Traktuję to tylko jako ciekawostkę - nie ma wpływu na wynik analizy. Procedura ładuje dane i to jest istotne ;)

Po załadowaniu wszystkich kolejnych bloków loader kończy się tak:
5033 01FD7F     ld bc,0x7FFD
5036 3E10       ld a,0x10
5038 ED79       out (c),a
503A C3005B     jp 0x5B00

Ustawia główny RAM i skacze na początek właściwej gry.

I to właściwie cała analiza - od tego momentu wiemy już co trzeba zrobić i pozostaje tylko kwestia jak ;)

Potrzebny jest nam loader w BASICu i 4 pliki danych. Każdy z tych elementów potrzebny jest w TAPie z normalnym nagłówkiem. Loader w BASICu to oczywiście edytor tekstowy i programik zmakebas - przetwarza on tekst na tokenizowany program i zapisuje do TAPa. Do konwersji plików z czystego bloku binarnego do TAPa używam w takich wypadkach assemblera pasmo - konwersję robi się tak jak wcześniej pokazywałem:
org $c000
incbin "0006.bin"
Kompliacja tego kodu przez
pasmo --tap bank1.asm bank2.tap
Daje wynikowego TAPa z normalnym nagłówkiem ładującego się od podanego w org adresu.

Konwersja głównego bloku (jak również pozostałych dwóch jak się później okazało ;)) wymagała dodania kawałka kodu przerzucającego dane - całość była równie nieskomplikowana jak zwykłą konwersja:
        org 25000
        jp move_it
start:
incbin "0005.bin"
move_it:
        di
        ld a,$10
        ld bc,$7ffd
        out (c),a
        ld sp,$508c
        ld hl,start
        ld de,$5b00
        ld bc,move_it-start
        ldir
        jp $5b00

Po kompilacji całości dostajemy 5 plików TAP, które po prostu kleimy ze sobą - pod Linuksem prostym cat'em, pod Windows copy ze stosownymi przełącznikami, żeby pliki były traktowane jako binarne. W wyniku dostajemy finalnego TAPa, którego możemy już normalnie wczytać do emulatora.

Ot i cała filozofia ;)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.05, 09:35:04
Mat, bardzo Ci dziękuję - mam nadzieję, że za kilka tygodni (miesięcy?) wróce do tego co tu napisałeś i zrozumiem więcej...
Teraz mamy internet, dostęp do oryginalnych materiałów które kiedyś biegały po giełdach jako mdłe kserokopie za fortune.
Jest YouTube, jest możliwość debugowania w emulatorze - trzeba by bardzo się uprzeć, żeby nie nauczyć się asemblera.

Bo na razie jak słyszę słowo "stos" to mi się kojarzy z Caudron... 
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: matofesi w 2013.04.05, 10:19:49
Mat, bardzo Ci dziękuję - mam nadzieję, że za kilka tygodni (miesięcy?) wróce do tego co tu napisałeś i zrozumiem więcej...

Jak chcesz się bawić w takie rzeczy to sama obsługa klikanych narzędzi niestety nie wystarczy ;)

Cytuj
Teraz mamy internet, dostęp do oryginalnych materiałów które kiedyś biegały po giełdach jako mdłe kserokopie za fortune.

No właśnie. Jak również do rzeczy, których 20 lat temu po prostu nie było :)
Poza wiedzą podstawowe materiały przy takich zabawach to "The Complete Spectrum Rom Disassembly" i disassemblacje ROMów 128: http://www.fruitcake.plus.com/Sinclair/Spectrum128/ROMDisassembly/Spectrum128ROMDisassembly.htm

Cytuj
Jest YouTube, jest możliwość debugowania w emulatorze

Szczerze powiedziawszy nie znalazłem emulatora, który miałby debugger z takimi opcjami, żeby na dłuższą metę był przydatnym narzędziem. Ale fakt - czasem analiza "na żywo" się przydaje.

Cytuj
- trzeba by bardzo się uprzeć, żeby nie nauczyć się asemblera.

Eeee... Można po prostu nie chcieć się go uczyć ;) Ale jak już się nauczysz i zaczniesz coś z tym robić to frajda jest spora :)

Cytuj
Bo na razie jak słyszę słowo "stos" to mi się kojarzy z Caudron...

Stos to taka sprytna konstrukcja, która jest dostępna w większości procesorów i służy do przechowywania tymczasowych danych jak również adresów powrotu z podprogramów. Musi być w miejscu, którego ci nie nadpisze ładujący się właśnie blok kodu, bo inaczej po jego załadowaniu program pójdzie w kartofle (chyba, że dokładnie wiesz, gdzie w tym momencie stos się będzie znajdował i w ładowanym bloku kodu umieścisz własne dane na stosie i kod się magicznie uruchomi inaczej niż by się wydawało ze wstępnej analizy).

Są też oczywiście procesory, które stosu nie używają - nie wiem jak z tych produkowanych dzisiaj, ale na przykład jednostki centralne w maszynach mainframe IBMa serii 360 i pochodnych nie miały w ogóle stosu a zamiast tego tylko tzw. skok ze śladem - przy skoku do podprogramu adres powrotu zapisywany jest w rejestrze - zawsze tym samym.

Ale to dywagacje nie związane z tematem lekcji ;)

A jeśli chcesz się uczyć to sugeruję zacząć jak ja - The Complete Machine Code Tutor daje całkiem fajną podstawę :)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: Gryzor w 2013.04.05, 11:37:03
Ostatnie zeszyty Konkreta mialy tez kurs assemblera na ZX Spectrum + oczywiscie ksiazka Mikroprocesor Z80.
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: ikci w 2013.04.05, 15:44:26
Ostatnie zeszyty Konkreta mialy tez kurs assemblera na ZX Spectrum (...)

No własnie wiem, ktoś tutaj już wspominał o tych zeszytach i chwalił się ich posiadaniem.
Z tego co wiem to nikt ich jeszcze nie zeskanował i nie umieścił w sieci... 


EDIT: JEST ZNALAZŁEM! na chomiku...  żeby ktoś nie musiał ściągać (i płacić) to umieszczam
tutaj wszystkie numery: http://www.marcin-marcin-marcin.com/konkret.zip (http://www.marcin-marcin-marcin.com/konkret.zip) (około 14Mb)
Tytuł: Odp: 128K --> 48K (USR0) z poziomu loadera
Wiadomość wysłana przez: sect0r w 2013.04.05, 20:15:57
To ja jeszcze dorzuce (wiem ze bylo na forum) link do The "Complete ZX Spectrum ROM Disassembly" co prawda w budowie ale po naszemu:
http://edu.i-lo.tarnow.pl/inf/retro/008_zx_spect_rom/index.php
W sumie warto przejrzec pozostale tematy, bo jest tego sporo http://edu.i-lo.tarnow.pl/inf/retro.php