Nu är snart jul-ledigheten slut och jag har faktiskt lyckats ägna några stunder åt detta.
Eftersom det är en en-bits processor som mest bara utför enkla algebraiska operationer typ and, or och = så fick jag en vision om att man kanske skulle kunna automatisera utbenandet av detta. Tack vare exiles utmärkta arbete tror vi oss ju veta vilka adresser som är input, output och minne så genom att lägga till lite list kod i disassemblern borde man kunna få ut uttrycken som hamnar på out. Byggde successivt ut koden så att jag fick lista med symboliska namn. Sen avkodning med kommentarer på varje rad om vad som hände och till sist slöt jag cirkeln och fick hela uttrycken.
Det var bara det att jag hade underskattat komplexiteten. Första gången jag körde det "kompletta" programmet såg det ut som om det hängde sig. Bröt exekveringen och kollade koden. Men där finns inget som kunde resultera i rekursion eller oändliga loopar. Obegripligt. Körde på en mindre del av koden och det såg ut att fungera. Men med lite mer så ökade liststorleken ganska mycket. Eller lite mer än ganska mycket faktiskt. Väldigt mycket. Väldigt väldigt mycket. Jag kompilerar till 64-bitarsprogram och kör på en maskin med 16Gb minne. Låter jag den tugga börjar musiken hacka efter några minuter när jag har en 5Gb stor listfil och processen allokerat 12Gb minne! Jag har inte lyckats köra avkodningen på hela programmet.
Och det visar sig när jag läser lista på mindre mängd att det kanske blir ohanterbart ändå.
I den här filen finns uttrycket jag fick ut för 1T3, Spindle CW Command. 18kB! för ett uttryck och det innehåller en massa "unassigned" som hintar om att man läser minnespositioner som sätts i nästa varv så att säga eller i förra kanske.
insane.txt
Så jag fick backa ett steg och sparar visserligen avkodade uttryck i symbotabellerna men läser bara upp det som sparas i RR och Temp, d.v.s. address 0 och 1. Då blir listan hanterbar. Med de namn jag gett in och utgångar ser den ut så här:
nigata_symbolic.txt
Jag skrev några lite mer vettiga namn på outputs än inputs, men detta styrs av filer och inte i själva koden så det är lätt att ändra för den som vill pilla vidare härifrån.
Här är det kompilerade programmet och de styrfiler med namn man behöver:
dis_niigata_exe.zip
Källkoden för den som är nyfiken eller vill bygga vidare finns här:
dis_niigata_source.zip
Skall bli spännande när säter får tillfälle att rota vidare i hur det är kopplat.
P.S.
Kommer ihåg nu att jag skulle fixat hex-kodning av upptäckta minnesadresser också, men dom får stå som MEM 1803 et.c. så länge. Och dessutom flaggning av minnesadresser som man läser innan man skriver. Finns jobb kvar alltså.
D.S.
P.P.S.
Kan nån tala om vad det är för typ av maskin? Svarv, fräs, press, gnist... Bara för kul att veta. Påverkar knappast detta.
D.S.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.