Code: Select all
function Main()
N=0 S=0 E=0 R=0 T={} X=0 SWI=0
--C=DataLoad("Y_IN.bin")
C=DataLoad(FileCall())
S=tonumber(GetInput("Starting offset","Enter a hexadecimal number for START of code:",""),16)
if (S==nil) then os.exit() end S=S+1
E=tonumber(GetInput("Ending offset","Enter a hexadecimal number for END of code:",""),16)
if (E==nil) then os.exit() end E=E+1
R=tonumber(GetInput("New offset","Edit this if renumbering the offsets:",string.format("%04X",S-1)),16)
if (R==nil) then os.exit() end R=R+1
while S<=E do
N=string.byte(C,S) X=N N=IL[X+1] if (N==0) then break end
S1=string.sub(C,S,S+N-1) S1=string.format("%04X: ",R-1)..Data_Hex(S1) S2=IM[X+1]
if (X>=32 and X<=47 or X==141) then
X=string.byte(C,S+1) if (X>127) then X=X-256 end
S2=S2..string.format("%+i",X)
end
if (X==63) then SWI=string.byte(C,S+1) S2=S2.." "..SM[SWI+1] --Add names for Software Interrupt calls.
if (SWI==11) then S1=S1..Data_Hex(string.char(string.byte(C,S+2))) N=N+1 end --
end
if (X==189 and string.byte(C,S+1)*256+string.byte(C,S+2)==8564) then --Check for jump to CL subroutines at $2174.
X=string.byte(C,S+3) S1=S1..Data_Hex(string.char(X)) N=N+1 --Get the extra byte and increase N by 1.
S2="JSR rst_entry_point Jump to Comms Link function "..X..", "..CL[X+1].."." --Prepare the mnemonic and a full comment.
end
table.insert(T,S1..string.rep(" ",24-(3*N))..S2) S=S+N R=R+N
if (X==63 and SWI==111) then --If SWI is UT$DISP, print the inline string.
N=0 repeat N=N+1 until string.byte(C,S+N-1)==0
S1=string.sub(C,S,S+N-2)
X=Data_Hex(S1).."00" local L=1
S1=" Print \""..string.gsub(S1,"\"","\"+QUOTE+\"").."\"." --Fix literal quotes, then quote the string.
S1=string.gsub(S1,".",
function(V) V=string.byte(V) if (V<32) then return "\"+"..CC[V+1].."+\"" end end --Print control characters by STANDARD names.
)
S1=string.gsub(S1,"\"\"%+","") S1=string.gsub(S1,"%+\"\"","") --Clean up surplus quotes and + signs.
T[table.getn(T)]=T[table.getn(T)]..S1
while L<=string.len(X) do
table.insert(T," "..string.sub(X,L,L+24-1)) L=L+24
end
S=S+N R=R+N
end
end
C=TextFile(T,"\r\n") C=string.gsub(C,"(39 +RTS)","%1\r\n\r\n")
DataSave("Z_OUT.txt",C)
os.exit()
end
--========== GUI Functions =============--
function FileCall()
local FilePane=wx.wxFileDialog(wx.NULL,"Psion Organiser machine code disassembler","","","All files|*.*",wx.wxOPEN)
FilePane:Centre()
if (FilePane:ShowModal()==wx.wxID_OK) then return FilePane:GetPath() else os.exit() end
FilePane:Destroy()
end
function GetInput(T,M,zz) local N
local InputBox=wx.wxTextEntryDialog(wx.NULL,M,T); InputBox:SetValue(zz)
if (InputBox:ShowModal()~=wx.wxID_OK) then N="" else N=InputBox:GetValue() end
InputBox:Destroy()
return N
end
function AlertMsg(M,T,I,YN) local F="File Error:" -- General alert. M=Message. T=Title, "File Error:" as default.
return wx.wxMessageBox(M,T or F,wx.wxOK+(YN or 0)*6+256*2^I) -- YN=1=Yes/No. I=0/1/2/3=Exclamation/Error/Question/Information.
end
--========== Common Functions ============--
function DataLoad(F)
F=assert(io.open(F,"rb")) local D=F:read("*a") F:close() return D
end
function DataSave(F,D)
F=assert(io.open(F,"wb")) F:write(D) F:close()
end
function TextFile(T,N) --Table, Newline.
return table.concat(T,N)..N
end
function Data_Hex(S)
return string.gsub(S,".",function(X)
return string.format("%02X ",string.byte(X)) end)
end
--======================================================== Bulk Data tables =========================================================--
IL={1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,1,2,3,3,2,2,3,2,2,2,2,2,3,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
2,2,2,3,2,2,2,0,2,2,2,2,3,2,3,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
2,2,2,3,2,2,2,0,2,2,2,2,3,0,3,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}
IM={"TRAP","NOP","","","LSRD","ASLD","TAP","TPA","INX","DEX","CLV","SEV","CLC","SEC","CLI","SEI","SBA","CBA","","","","","TAB","TBA",
"XGDX","DAA","SLP","ABA","","","","","BRA ","BRN ","BHI ","BLS ","BCC ","BCS ","BNE ","BEQ ","BVC ","BVS ","BPL ","BMI ","BGE ",
"BLT ","BGT ","BLE ","TSX","INS","PULA","PULB","DES","TXS","PSHA","PSHB","PULX","RTS","ABX","RTI","PSHX","MUL","WAI","SWI","NEGA",
"","","COMA","LSRA","","RORA","ASRA","ASLA","ROLA","DECA","","INCA","TSTA","","CLRA","NEGB","","","COMB","LSRB","","RORB","ASRB",
"ASLB","ROLB","DECB","","INCB","TSTB","","CLRB","NEG d,X","AIM #,d,X","OIM #,d,X","COM d,X","LSR d,X","EIM #,d,X","ROR d,X","ASR d,X",
"ASL d,X","ROL d,X","DEC d,X","TIM #,d,X","INC d,X","TST d,X","JMP d,X","CLR d,X","NEG mm","AIM #,0m","OIM #,0m","COM mm","LSR mm",
"EIM #,0m","ROR mm","ASR mm","ASL mm","ROL mm","DEC mm","TIM #,0m","INC mm","TST mm","JMP mm","CLR mm","SUBA #","CMPA #","SBCA #",
"SUBD ##","ANDA #","BITA #","LDAA #","","EORA #","ADCA #","ORAA #","ADDA #","CPX ##","BSR ","LDS ##","","SUBA 0m","CMPA 0m","SBCA 0m",
"SUBD 0m","ANDA 0m","BITA 0m","LDAA 0m","STAA 0m","EORA 0m","ADCA 0m","ORAA 0m","ADDA 0m","CPX 0m","JSR 0m","LDS 0m","STS 0m","SUBA d,X",
"CMPA d,X","SBCA d,X","SUBD d,X","ANDA d,X","BITA d,X","LDAA d,X","STAA d,X","EORA d,X","ADCA d,X","ORAA d,X","ADDA d,X","CPX d,X",
"JSR d,X","LDS d,X","STS d,X","SUBA mm","CMPA mm","SBCA mm","SUBD mm","ANDA mm","BITA mm","LDAA mm","STAA mm","EORA mm","ADCA mm",
"ORAA mm","ADDA mm","CPX mm","JSR mm","LDS mm","STS mm","SUBB #","CMPB #","SBCB #","ADDD ##","ANDB #","BITB #","LDAB #","","EORB #",
"ADCB #","ORAB #","ADDB #","LDD ##","","LDX ##","","SUBB 0m","CMPB 0m","SBCB 0m","ADDD 0m","ANDB 0m","BITB 0m","LDAB 0m","STAB 0m",
"EORB 0m","ADCB 0m","ORAB 0m","ADDB 0m","LDD 0m","STD 0m","LDX 0m","STX 0m","SUBB d,X","CMPB d,X","SBCB d,X","ADDD d,X","ANDB d,X",
"BITB d,X","LDAB d,X","STAB d,X","EORB d,X","ADCB d,X","ORAB d,X","ADDB d,X","LDD d,X","STD d,X","LDX d,X","STX d,X","SUBB mm","CMPB mm",
"SBCB mm","ADDD mm","ANDB mm","BITB mm","LDAB mm","STAB mm","EORB mm","ADCB mm","ORAB mm","ADDB mm","LDD mm","STD mm","LDX mm","STX mm"}
SM={"AL$free","AL$grab","AL$grow","AL$repl","AL$shnk","AL$size","AL$zero","BT$nmdn","BT$nmen","BT$nof","BT$non","BT$pprg","BT$swof",
"BZ$alrm","BZ$bell","BZ$tone","DP$emit","DP$prnt","DP$rest","DP$save","DP$stat","DP$view","DP$wrdy","DV$boot","DV$cler","DV$lkup",
"DV$load","DV$vect","ED$edit","ED$epos","ED$view","ER$lkup","ER$mess","FL$back","FL$bcat","FL$bdel","FL$bopn","FL$bsav","FL$catl",
"FL$copy","FL$cret","FL$deln","FL$eras","FL$ffnd","FL$find","FL$frec","FL$next","FL$open","FL$pars","FL$read","FL$rect","FL$renm",
"FL$rset","FL$setp","FL$size","FL$writ","FN$atan","FN$cos","FN$exp","FN$ln","FN$log","FN$powr","FN$rnd","FN$sin","FN$sqrt","FN$tan",
"IT$gval","IT$radd","IT$strt","IT$tadd","KB$brek","KB$flsh","KB$getk","KB$init","KB$stat","KB$test","KB$uget","LG$newp","LG$rled",
"LN$strt","MN$disp","MT$btof","MT$fadd","MT$fbdc","MT$fbex","MT$fbgn","MT$fbin","MT$fdiv","MT$fmul","MT$fngt","MT$fsub","PK$pkof",
"PK$qadd","PK$rbyt","PK$read","PK$rwrd","PK$sadd","PK$save","PK$setp","PK$skip","RM$runp","TL$addi","TL$cpyx","TL$deli","TL$xxmd",
"TM$dayv","TM$tget","TM$updt","TM$wait","UT$cpyb","UT$ddsp","UT$disp","UT$entr","UT$fill","UT$icpb","UT$isbf","UT$leav","UT$sdiv",
"UT$smul","UT$splt","UT$udiv","UT$umul","UT$utob","UT$xcat","UT$xtob","UT$ysno","UT$cdsp*","TL$rstr*","TL$lset*","BT$toff*","DP$mset*",
"DP$cset*","DP$cprn*","DP$udg*","MN$xdsp*","MN$1dsp*","MN$titl*","FN$sum*","FN$mean*","FN$var*","FN$std*","FN$min*","FN$max*","FL$wpar*",
"FL$wcat*","FL$wcpy*","FL$wdel*","FL$wfnd*","UT$wild*","TM$ndys*","TM$week*","TM$dnam*","FL$getx*","FL$valx*","LN$xstt*","TL$zzmd*",
"XT$dirm*","FL$ncat*","AM$entr*","NT$entr*","CA$entr*","XT$entr*","XT$bar*","DP$pvew*","TI$entr*","UT$sort*","WL$entr*","DI$entr*",
"XF$entr*","ER$prnt*","TM$mnam*","LG$edit*","FN$asin*","FN$acos*","XF$sort*","LG$entr*","FL$fdel*","KB$conk*","UT$cmpb*","TM$tset*"}
CL={"RS$open","RS$close","RS$putchar","RS$getchar","RS$flush","RS$setvars","RS$lprint","RS$linput","RS$licon","RS$lidis","RS$liput","RS$liget"}
CC={"UDG_0","UDG_1","UDG_2","UDG_3","UDG_4","UDG_5","UDG_6","UDG_7","DEL","TAB","LF","HOME","CLS","CR","CLR_1","CLR_2","BEEP","RFR_1/2",
"RFR_1","RFR_2","RFR_3","RFR_4","CLR_3","CLR_4","DOTS_2","DOTS_3","CLR_E","CHR$(11)","CHR$(12)","CHR$(13)","CHR$(14)","CHR$(15)"}
--======================================================= End Of Script ===========================================================--
Main()
If you run that with wxLua it will open an Organiser machine code binary file and list the doings in an output file like ASM. It mentions the rst_entry_point. I can't remember the context for making this anymore, but it was basically to help examine what existing Psion code is up to. It can be set to limit which chunk of the binary file you want to extract a listing for.
I have found it useful even if all I want to know is whether something IS code or not. :) If it's not, the output is garbage, but the same is true of any disassembler, even Win32 DASM...