! (Intel etc) 8048 family disassembler
! (c) 1989 RWT - all rights reserved

%include "inc:util.imp"
%begin

%externalroutinespec phex4(%integer x)
%externalroutinespec phex2(%integer x)
%constinteger blank = 255 {0 for on-chip rom, 255 for separate eprom}

%bytearray codebuffer(0:4095)
%integer maxpc

%conststring(11)%array mnemonic(-1:255) =    "DATA  #",-
   "NOP",        "*??*",       "OUTL  BUS,A","ADD   A,#",
   "JMP   ",     "EN    I",    "*??*",       "DEC   A",
   "INS   A,BUS","IN    A,P1", "IN    A,P2", "*??*",
   "MOVD  A,P4", "MOVD  A,P5", "MOVD  A,P6", "MOVD  A,P7",
   "INC   @R0",  "INC   @R1",  "JB0   $",    "ADDC  A,#",
   "CALL  ",     "DIS   I",    "JTF   $",    "INC   A",
   "INC   R0",   "INC   R1",   "INC   R2",   "INC   R3",
   "INC   R4",   "INC   R5",   "INC   R6",   "INC   R7",
   "XCH   A,@R0","XCH   A,@R1","*??*",       "MOV   A,#",
   "JMP   ",     "EN    TCNTI","JNT0  $",    "CLR   A",
   "XCH   A,R0", "XCH   A,R1", "XCH   A,R2", "XCH   A,R3",
   "XCH   A,R4", "XCH   A,R5", "XCH   A,R6", "XCH   A,R7",
   "XCHD  A,@R0","XCHD  A,@R1","JB1   $",    "*??*",
   "CALL  ",     "DIS   TCNTI","JT0   $",    "CPL   A",
   "*??*",       "OUTL  P1,A", "OUTL  P2,A", "*??*",
   "MOVD  P4,A", "MOVD  P5,A", "MOVD  P6,A", "MOVD  P7,A",
   "ORL   A,@R0","ORL   A,@R1","MOV   A,T",  "ORL   A,#",
   "JMP   ",     "STRT  CNT",  "JNT1  $",    "SWAP  A",
   "ORL   A,R0", "ORL   A,R1", "ORL   A,R2", "ORL   A,R3",
   "ORL   A,R4", "ORL   A,R5", "ORL   A,R6", "ORL   A,R7",
   "ANL   A,@R0","ANL   A,@R1","JB2   $",    "ANL   A,#",
   "CALL  ",     "STRT  T",    "JT1   $",    "DA    A",
   "ANL   A,R0", "ANL   A,R1", "ANL   A,R2", "ANL   A,R3",
   "ANL   A,R4", "ANL   A,R5", "ANL   A,R6", "ANL   A,R7",
   "ADD   A,@R0","ADD   A,@R1","MOV   T,A",  "*??*",
   "JMP   ",     "STOP  TCNT", "*??*",       "RRC   A",
   "ADD   A,R0", "ADD   A,R1", "ADD   A,R2", "ADD   A,R3",
   "ADD   A,R4", "ADD   A,R5", "ADD   A,R6", "ADD   A,R7",
   "ADDC  A,@R0","ADDC  A,@R1","JB3   $",    "*??*",
   "CALL  ",     "EN    T0CLK","JF1   $",    "RR    A",
   "ADDC  A,R0", "ADDC  A,R1", "ADDC  A,R2", "ADDC  A,R3",
   "ADDC  A,R4", "ADDC  A,R5", "ADDC  A,R6", "ADDC  A,R7",
   "MOVX  A,@R0","MOVX  A,@R1","*??*",       "RET",
   "JMP   ",     "CLR   F0",   "JNI   $",    "*??*",
   "ORL   BUS,#","ORL   P1,#", "ORL   P2,#", "*??*",
   "ORL   P4,#", "ORL   P5,#", "ORL   P6,#", "ORL   P7,#",
   "MOVX  @R0,A","MOVX  @R1,A","JB4   $",    "RETR",
   "CALL  ",     "CPL   F0",   "JNZ   $",    "CLR   C",
   "ANL   BUS,#","ANL   P1,#", "ANL   P2,#", "*??*",
   "ANL   P4,#", "ANL   P5,#", "ANL   P6,#", "ANL   P7,#",
   "MOV   @R0,A","MOV   @R1,A","*??*",       "MOVP  A,@A",
   "JMP   ",     "CLR   F1",   "*??*",       "CPL   C",
   "MOV   R0,A", "MOV   R1,A", "MOV   R2,A", "MOV   R3,A",
   "MOV   R4,A", "MOV   R5,A", "MOV   R6,A", "MOV   R7,A",
   "MOV   @R0,#","MOV   @R1,#","JB5   $",    "JMPP  @A",
   "CALL  ",     "CPL   F1",   "JF0   $",    "*??*",
   "MOV   R0,#", "MOV   R1,#", "MOV   R2,#", "MOV   R3,#",
   "MOV   R4,#", "MOV   R5,#", "MOV   R6,#", "MOV   R7,#",
   "*??*",       "*??*",       "*??*",       "*??*",
   "JMP   ",     "SEL   RB0",  "JZ    $",    "MOV   A,PSW",
   "DEC   R0",   "DEC   R1",   "DEC   R2",   "DEC   R3",
   "DEC   R4",   "DEC   R5",   "DEC   R6",   "DEC   R7",
   "XRL   A,@R0","XRL   A,@R1","JB6   $",    "XRL   A,#",
   "CALL  ",     "SEL   RB1",  "*??*",       "MOV   PSW,A",
   "XRL   A,R0", "XRL   A,R1", "XRL   A,R2", "XRL   A,R3",
   "XRL   A,R4", "XRL   A,R5", "XRL   A,R6", "XRL   A,R7",
   "*??*",       "*??*",       "*??*",       "MOVP3  A,@A",
   "JMP   ",     "SEL   MB0",  "JNC   $",    "RL    A",
   "DJNZ  R0,$", "DJNZ  R1,$", "DJNZ  R2,$", "DJNZ  R3,$",
   "DJNZ  R4,$", "DJNZ  R5,$", "DJNZ  R6,$", "DJNZ  R7,$",
   "MOV   A,@R0","MOV   A,@R1","JB7   $",    "*??*",
   "CALL  ",     "SEL   MB1",  "JC    $",    "RLC   A",
   "MOV   A,R0", "MOV   A,R1", "MOV   A,R2", "MOV   A,R3",
   "MOV   A,R4", "MOV   A,R5", "MOV   A,R6", "MOV   A,R7"

%routine read
%string(255)in,out=":t"
  %on 9 %start
    maxpc = maxpc-1
    %return
  %finish
  defineparam("Infile",in,pamnodefault)
  defineparam("Outfile",out,pamnewgroup)
  processparameters(cliparam)
  openinput(1,in)
  openoutput(1,out)
  readsymbol(codebuffer(maxpc)) %for maxpc = 0,1,4095
%end

%routine decode
%integer pc=0,double,op,parm
%string(*)%name mnem
%bytename flag
  %while pc<=maxpc %cycle
    op = codebuffer(pc)
    parm = 0; parm = codebuffer(pc+1) %if pc<maxpc
    mnem == mnemonic(op)
    flag == charno(mnem,length(mnem))
    double = 0; double = 1 %if op&15=4 %or flag='#' %or flag='$'
    newline; phex4(pc); spaces(2)
    phex2(op)
    %if double=0 %then spaces(2) %else phex2(parm)
    spaces(2); printstring(mnem)
    %if op&15=4 %start
      phex4(op>>5<<8+parm)
    %elseif flag='#'
      write(parm,0)
    %elseif flag='$'
      printsymbol((pc-1)>>8&7+'0')
      phex2(parm)
    %finish
    pc = pc+double+1
  %repeat
%end

read; decode
%end
