#!/usr/bin/php
<?php

/* File input is 1 long line of hex codes.  All spaces and hex locations must
 * be stripped out.  I copied the bin file to a new file, found the starting
 * address manually and deleted everything before it.  Delete the E2B3R and RUN
 * at the end.  Then tr -d ': \n' to put it all on one line.

 * LOMEM and HIMEM will have to be set manually from bytes $4A through $4D
 * LOMEM = $4A + 256*$4B
 * HIMEM = $4C + 256*$4D

 * 004A: 00 08 00 10
 * LOMEM=2048
 * HIMEM=4096

 * 004A: 00 03 00 10
 * LOMEM=768
 * HIMEM=4096

 * 004A: 00 03 00 40
 * LOMEM=768
 * HIMEM=16384
*/

if ($argc 2) {
  print 
'Usage: ' $argv[0] . ' <file>' PHP_EOL PHP_EOL;
  exit(
1);
}

$detoken = array('HIMEM: ',PHP_EOL,'_',':','LOAD ','SAVE ','CON ','RUN ','RUN','DEL',',','NEW ','CLR ','AUTO',',','MAN ','HIMEM:','LOMEM:','+','-','*','/','=','#','>=','>','<=','<>','<',' AND ',' OR ','MOD ','^','+','(',',',' THEN ',' THEN ',',',',','"','"','(','!','!','(','PEEK ','RND','SGN ','ABS ','PDL ','RNDX','(','+','-','NOT','(','=','#','LEN(','ASC(','SCRN(',',','(','$','$ ','(',',',',',';',';',';',',',',',', ','TEXT ','GR ','CALL','DIM ','DIM ','TAB ','END ','INPUT ','INPUT ','INPUT ','FOR ','=',' TO ',' STEP ','NEXT ',',','RETURN ','GOSUB ','REM','LET','GOTO ','IF ','PRINT ','PRINT ','PRINT','POKE ',',','COLOR=','PLOT',',','HLIN',',','AT','VLIN',',','AT','VTAB','=','=',')',') ','LIST',',','LIST ','POP ','NODSP','NODSP','NOTRACE ','DSP','DSP','TRACE ','PR#','IN#');

function 
decode($data) {
  global 
$detoken;
  
$len strlen($data)-2;
  
$out '';
  if (
substr($data, -2) !== '01') {
    echo 
PHP_EOL chunk_split($data2' ') . PHP_EOL;
    return 
'Error decoding line';
  }
  
$inquotes 0;
  
$inrem 0;
  for (
$i=0;$i<$len;$i+=2) {
    
$token hexdec(substr($data,$i,2));
    switch(
$token) {
      
// B0 - B9
      
case (!$inquotes and !$inrem and $token 175 and $token 186 and hexdec(substr($data,$i-2,2)) < 128):
        
$out .= hexdec(substr($data$i+42) . substr($data$i+22));
        
$i+=4;
        break;
      
// ASCII with high bit turned on
      
case ($token 128):
        
$out .= chr($token 128);
        break;
      default:
        
// REM
        
if ($token == 93$inrem 1;
        
// open quotes
        
if ($token == 40$inquotes 1;
        
// close quotes
        
if ($token == 41$inquotes 0;
        
$out .= $detoken[$token];
    }
  }
  return 
$out;
}

$fp fopen($argv[1], 'rb');
if (!
$fp) {
  echo 
"$errstr ($errno)" PHP_EOL PHP_EOL;
} else {
  echo 
'E000R' PHP_EOL 'SCR' PHP_EOL 'LOMEM=2048' PHP_EOL 'HIMEM=4096' PHP_EOL;
  while (!
feof($fp)) {
    
$byte fread($fp2);
    if (
feof($fp)) break;
    
$len hexdec($byte) - 1;
    
$data fread($fp$len*2);
    
$line hexdec(substr($data22) . substr($data02));
    
$data substr($data4);
    
$out $line ' ' decode($data);
    echo 
$out PHP_EOL;
  }
  
fclose($fp);
  echo 
'RUN' PHP_EOL;
}