Autor Wątek: 128K --> 48K (USR0) z poziomu loadera  (Przeczytany 34853 razy)

ikci

  • *****
  • Wiadomości: 1216
  • Miejsce pobytu:
    Kraków
128K --> 48K (USR0) z poziomu loadera
« dnia: 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

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
ale prawdę mówiąc nic mi to nie dało bo to cały czas jest o wczytywaniu z taśmy...

 
ZX Spectrum 48K, ZX Spectrum +, ZX Spectrum 128K, ZX Spectrum +2, ZX Spectrum +2B, ZX Spectrum +3, TIMEX TC2048, UNIPOLBRIT Komputer 2068, Didaktik Gama 80kB, 
Amstrad/Schneider CPC6128, Schneider CPC464, Commodore C64, Atari 800XL, 65XE 130XE, A500+, A600, A1200, ATARI 1040 STF

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #1 dnia: 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?

ikci

  • *****
  • Wiadomości: 1216
  • Miejsce pobytu:
    Kraków
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #2 dnia: 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

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ą.







ZX Spectrum 48K, ZX Spectrum +, ZX Spectrum 128K, ZX Spectrum +2, ZX Spectrum +2B, ZX Spectrum +3, TIMEX TC2048, UNIPOLBRIT Komputer 2068, Didaktik Gama 80kB, 
Amstrad/Schneider CPC6128, Schneider CPC464, Commodore C64, Atari 800XL, 65XE 130XE, A500+, A600, A1200, ATARI 1040 STF

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #3 dnia: 2013.04.03, 08:44:59 »
Spokojnie, To nie jest WOS. Równie dobrze możesz dodawać programy w załączniku.

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #4 dnia: 2013.04.03, 10:55:26 »
...
Jest też watek na WOS na ten temat: 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.

ikci

  • *****
  • Wiadomości: 1216
  • Miejsce pobytu:
    Kraków
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #5 dnia: 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).



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

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:



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

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


 
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

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

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:



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:



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

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  :(
 
« Ostatnia zmiana: 2013.04.03, 12:17:17 wysłana przez ikci »
ZX Spectrum 48K, ZX Spectrum +, ZX Spectrum 128K, ZX Spectrum +2, ZX Spectrum +2B, ZX Spectrum +3, TIMEX TC2048, UNIPOLBRIT Komputer 2068, Didaktik Gama 80kB, 
Amstrad/Schneider CPC6128, Schneider CPC464, Commodore C64, Atari 800XL, 65XE 130XE, A500+, A600, A1200, ATARI 1040 STF

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #6 dnia: 2013.04.03, 12:18:04 »
Wersja chyba oryginalna to: Nodes Of Yesod (1986)(Odin Computer Graphics)(128k).tzx
Wygląda tak:



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.

ikci

  • *****
  • Wiadomości: 1216
  • Miejsce pobytu:
    Kraków
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #7 dnia: 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
ZX Spectrum 48K, ZX Spectrum +, ZX Spectrum 128K, ZX Spectrum +2, ZX Spectrum +2B, ZX Spectrum +3, TIMEX TC2048, UNIPOLBRIT Komputer 2068, Didaktik Gama 80kB, 
Amstrad/Schneider CPC6128, Schneider CPC464, Commodore C64, Atari 800XL, 65XE 130XE, A500+, A600, A1200, ATARI 1040 STF

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #8 dnia: 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.


ikci

  • *****
  • Wiadomości: 1216
  • Miejsce pobytu:
    Kraków
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #9 dnia: 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...
ZX Spectrum 48K, ZX Spectrum +, ZX Spectrum 128K, ZX Spectrum +2, ZX Spectrum +2B, ZX Spectrum +3, TIMEX TC2048, UNIPOLBRIT Komputer 2068, Didaktik Gama 80kB, 
Amstrad/Schneider CPC6128, Schneider CPC464, Commodore C64, Atari 800XL, 65XE 130XE, A500+, A600, A1200, ATARI 1040 STF

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #10 dnia: 2013.04.03, 13:16:52 »
A możesz dać linka do wersji z nagłówkami? Mam pewne podejrzenia...

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #11 dnia: 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 :)

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #12 dnia: 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?

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #13 dnia: 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:



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  >:( >:( >:(



ikci

  • *****
  • Wiadomości: 1216
  • Miejsce pobytu:
    Kraków
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #14 dnia: 2013.04.03, 13:44:17 »
Już wszystko wrzucam.. Dajcie mi sekunde...

ZX Spectrum 48K, ZX Spectrum +, ZX Spectrum 128K, ZX Spectrum +2, ZX Spectrum +2B, ZX Spectrum +3, TIMEX TC2048, UNIPOLBRIT Komputer 2068, Didaktik Gama 80kB, 
Amstrad/Schneider CPC6128, Schneider CPC464, Commodore C64, Atari 800XL, 65XE 130XE, A500+, A600, A1200, ATARI 1040 STF