TRS80 - Disassembler bara för att...

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Icecap
Inlägg: 26705
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

TRS80 - Disassembler bara för att...

Inlägg av Icecap »

Jag hade i sin tid också en begagnad TRS80. Den byggde jag mycket om på.
* Bytte minne från 4kB dynamisk till 32kB statisk.
* Byggde om till enbart 1 ROM-krets. (EPROM 27128)
* Monterade ett 2*20 tecken LCD.
* Monterade RTC.
* Monterade batteri-backed up 128kB RAM, var i 8 st. 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!
Senast redigerad av Icecap 24 september 2025, 08:42:42, redigerad totalt 2 gånger.
Nerre
Inlägg: 27327
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

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

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26705
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

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

Inlägg av Icecap »

Tyvärr inte. Det var hittat i koden.

Grejen var att jag hade disassemblerat källkoden så att det framför varje instruktion var startadressen.
Sedan märkte jag upp alla JP, CALL och JR och markerade deras destinationer med en L framför adressen.
Alltså blev adress (0x)1234 märkt till L1234:

Och där var det några CALL/JR/JP som gick in i andra byte i en 3-byte instruktion.

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, något 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.
Användarvisningsbild
Icecap
Inlägg: 26705
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

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

Inlägg av Icecap »

Satt och övertänkte lite igen.

Att kunde skriva någon simpel "BASIC" kod för att testa något kunde vara kul och praktisk.

Att bara behöva en terminal för att kunde skapa ett program till en test känns fortfarande lockande och jag har kollat på det en del.

I grunden behövs själva testsystemet, i mitt fall för att ha de in- och utgångar jag vill ha.
Jag tänker lite A/D ingångar, D/A utgångar, digitala in- och utgångar.
RTC för timestamp om man t.ex. vill logga data.
En 1-Wire® bus med tillhörande kommunikationsrutin inbyggd, typ hitta enheter, skriva o läsa data.
Några seriella bussar, t.ex. terminal + 2 mer.
Någon möjlighet att spara/hämta program & data, bäst ville ju vara SD-kort med filsystem.

En sak jag har saknat på nära nog alla BASIC-datorer är att man kunde ställa en timer till att kalla en rutin t.ex. varje sekund. Så den funktion ska såklart vara med.
Den måste ju vara gjort så att när tiden har gått ut, ska den nuvarande rad göras klar, sedan - innan ny rad kallas - ska "interrupten" köras - och sedan återgår den som normalt.

Jag har kommit en bit med hur programmet ska kunde skrivas in, tolkas osv.

Men det är bara ett projekt till "någon gång i framtiden"...
Skriv svar