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

Phonex

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

matofesi

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

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #32 dnia: 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.
« Ostatnia zmiana: 2013.04.04, 11:25:45 wysłana przez Phonex »

Gryzor

  • *****
  • Wiadomości: 2010
  • Miejsce pobytu:
    Warszawa
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #33 dnia: 2013.04.04, 11:48:33 »
W +3 chyba sterowanie silnikiem stacji jest zrobione na przerwaniach, o ile to cos wnosi :-)

matofesi

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

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #35 dnia: 2013.04.04, 14:23:23 »
No to ja przetestowałem.
Ale i tak pomysł jest niestety Twój ;)

matofesi

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

ikci

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

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #38 dnia: 2013.04.04, 19:41:15 »
... i więcej wolnego czasu  :'(
ZX/Enterprise/CPC/Robotron/C128D

sect0r

  • *****
  • Wiadomości: 698
  • Miejsce pobytu:
    Oltedal/NO
  • speccyholic
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #39 dnia: 2013.04.04, 22:10:58 »
W nocy nie spac! Kodowac, tworzyc, nie spac! :D
Szarak # DivIDE+ # MasakratorFM DeluXe by Zaxon

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #40 dnia: 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ł ;)
ZX/Enterprise/CPC/Robotron/C128D

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #41 dnia: 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 ;)
« Ostatnia zmiana: 2013.04.05, 09:39:31 wysłana przez matofesi »

ikci

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

Gryzor

  • *****
  • Wiadomości: 2010
  • Miejsce pobytu:
    Warszawa
Odp: 128K --> 48K (USR0) z poziomu loadera
« Odpowiedź #44 dnia: 2013.04.05, 11:37:03 »
Ostatnie zeszyty Konkreta mialy tez kurs assemblera na ZX Spectrum + oczywiscie ksiazka Mikroprocesor Z80.