Sida 1 av 1

TRS80 - Disassembler bara fär att...

Postat: 31 juli 2025, 11:48:55
av Icecap
Jag hade i sin tid också en begagnad TRS80. Den byggde jag mycket om på.
* Bytte minne från 4kB dynamisk till 23kB statisk.
* Byggde om till enbart 1 ROM-krets.
* Monterade ett 2*20 tecken LCD.
* Monterade RTC.
* Monterade batteri-backed up 128kB RAM, var i 8kB banks.

Sedan startade jag på mjukvaran. Disassemblerede ROM, hittade många konstigheter men mest av allt:
* Hittade några av vad jag kallade "ID-sekvenser" där man t.ex. har en tabell som man kan hoppa in till - men hoppet är eg. i mitten av en 3-byte instruktion.
- Även områden som inte används alls men har ID/COPYRIGHT delar (antar jag).
* Fixade alla sådana saker jag hittade och fick en fullt fungerande "rensat" version med "riktiga" hopp osv.
* Hittade BASIC startpunkt i RAM.
* Fixade TIME$ som eg. är en disk-grej men jag hade ju inbyggt en RTC så...
* Fixade så att LPRINT skrev till det nyss inbyggda LCD.
* Använde disk-SAVE/LOAD/RUN till RAM-bankerna.
* Hittade punktet just innan den gick i "bootat klart" och lade till att den kollade i RAM bank 0, OM det fanns något BASIC-program och OM det var sparat med autostart-flagga. Om så, blev BASIC-programmet kopierat in och startat.
* Fixade så att ett program kunde ladda in ett annat BASIC-program från en av bankerna och att det körtes automatisk. Då kunde alla bankernas program växla till ett annat program.

Alla ändringar blev såklart skrivit i Z80 assembler.

I nutid fick jag lite blodad tand och då alla de gamla data är borta sedan några år - skrev jag en disassembler i Python.
Lade till en funktion som tillåter att man "fyller upp" med olika områden som ska behandlas som icke-kod.
Tänk texten för BASIC-kommandoorden, "READY", "Error", " in " osv.
Varje område anges med startadress, längd och typ.

Disassemblern fungerar som tänkt, lade till att den kör 2 varv, då kan jag i första varv skapa en LABEL-databas och i andra varv använda den databas.

Numera finns det ju internet och där hittade jag sedan en disassemblerat version med förklaring och plötligt var det inte lika intressant längre.

Jag hade ursprungligen en tanka om att skape en Z80 "kärna" i någon lämplig µC och sedan kanske Frankensteina en TRS80-funktions liknande grunka.
Det kunde nämligen vara trevligt att ha ett system som man kan programmera på samma sätt och då ha in- och utgångar som kan göra saker, alltså eg. en "genväg" till ett P.O.C. system.

Och samtidig ha det "lite" retro...

Men ja, efter jag fick disassembleren klar och testat insåg jag hur onödigt det eg. ville vara.

Dels finns det BASIC-tolkar som man kan bygga på själva på internet, dels kan man klara sig mycket långt om man byggar hårdvaran som har de I/O som kan behövas.
Sedan skriver man några drivers som klarar att göre main-programmet enkelt att använda - och plötsligt är TRS80-vägen tung, begränsat och likgiltig.

Men min disassembler fungerar!

Re: TRS80 - Disassembler bara fär att...

Postat: 31 juli 2025, 11:51:33
av Nerre
Det där med att hoppet är in i en 3-bytesinstruktion handlar väl mer om att disassemblern inte följt hoppen utan bara stegat igenom ROM?

Om man disassemblerar från hopp-adressen iställe för byten innan blir det ju en annan instruktion.

Re: TRS80 - Disassembler bara fär att...

Postat: 31 juli 2025, 12:25:21
av Icecap
Tyvärr inte.
3-byten var typ LD BC, 0x????
Men 0x???? var LD A, 0x??

Och det var kanske 3-4 st direkt efter varandra.

Rutinen som kom efter använde enbart värdet i A.

Det som det kan vara är att man sparar hopp - och ROM är på max. 12kB.
Hoppar man in i första steg, blir A laddad med 0x01, sedan utförs 2 st LD BC, 0x???? innan värdet i A används.

Det kostar lite tid men man sparar att ladda A och sedan utföra en JR <slutdestination>.
Vid att hoppa in på rätt ställe i en 3-byte instruktion, sparar man 1 byte per steg i tabellen, nogot som annars vill ta 4 bytes (LD A,0x??, JR <funktionen>).

Och samtidig har man skapat en ganska unik ID-kod om det blir (C)-problemer.