/* generated by a2c (6502 -> C). entry 0x0600, org 0x0600 */
#include <stdint.h>
#include <string.h>
#include <stdio.h>
typedef struct{uint8_t a,x,y,sp,c,z,n,v,i,d,brk;uint16_t pc;uint8_t m[65536];}cpu_t;
#define ZP16(z,ix) ((((z)+(ix))&0xFF)|(((((z)+(ix)+1)&0xFF))<<8))
static void setzn(cpu_t*s,uint8_t v){s->z=(v==0);s->n=(v&0x80)!=0;}
static void push(cpu_t*s,uint8_t v){s->m[0x100+s->sp]=v;s->sp--;}
static uint8_t pull(cpu_t*s){s->sp++;return s->m[0x100+s->sp];}
static uint8_t pack(cpu_t*s){return (s->n<<7)|(s->v<<6)|0x20|(s->d<<3)|(s->i<<2)|(s->z<<1)|s->c;}
static void unpack(cpu_t*s,uint8_t p){s->n=(p>>7)&1;s->v=(p>>6)&1;s->d=(p>>3)&1;s->i=(p>>2)&1;s->z=(p>>1)&1;s->c=p&1;}
static uint8_t adc(cpu_t*s,uint8_t r){unsigned t=(unsigned)s->a+r+s->c;s->c=t>0xFF;s->v=((s->a^t)&(r^t)&0x80)!=0;s->a=(uint8_t)t;setzn(s,s->a);return s->a;}
static uint8_t sbc(cpu_t*s,uint8_t r){unsigned t=(unsigned)s->a-(r+(1-s->c));s->c=t<0x100;s->v=((s->a^r)&(s->a^t)&0x80)!=0;s->a=(uint8_t)t;setzn(s,s->a);return s->a;}
static void cmp8(cpu_t*s,uint8_t a,uint8_t r){unsigned t=(unsigned)a-r;s->c=t<0x100;setzn(s,(uint8_t)t);}
static void bit(cpu_t*s,uint8_t r){s->z=(s->a&r)==0;s->n=(r&0x80)!=0;s->v=(r&0x40)!=0;}
static uint8_t rmw(cpu_t*s,int v,int d){uint8_t t=(uint8_t)(v+d);setzn(s,t);return t;}
static uint8_t shift(cpu_t*s,char op,uint8_t v){unsigned c=s->c;uint8_t r;
 if(op=='A'){s->c=(v&0x80)!=0;r=(uint8_t)(v<<1);}
 else if(op=='L'){s->c=v&1;r=(uint8_t)(v>>1);}
 else {s->c=v&1;r=(uint8_t)((v>>1)|(c<<7));}
 setzn(s,r);return r;}
static void jmp_ind(cpu_t*s,uint16_t a){s->pc=(uint16_t)(s->m[a]|(s->m[(uint16_t)(a+1)]<<8));}
static void fn_0600(cpu_t*s);
static void fn_0624(cpu_t*s);

/* routine @ 0x0600 */
static void fn_0600(cpu_t*s){
L_0600: ;
  setzn(s,s->x=(uint8_t)(0x00));
  setzn(s,s->y=(uint8_t)(0x00));
  setzn(s,s->a=(uint8_t)(0x00));
  s->m[0x0200]=s->a;
  setzn(s,s->a=(uint8_t)(0x01));
  s->m[0x0201]=s->a;
L_060E: ;
  cmp8(s,s->x,0x0A);
  if(s->z==1) goto L_0620;
  s->c=0;
  setzn(s,s->a=(uint8_t)(s->m[(0x0200+s->x)&0xFFFF]));
  s->a=adc(s,s->m[(0x0201+s->x)&0xFFFF]);
  s->m[(0x0202+s->x)&0xFFFF]=s->a;
  setzn(s,(uint8_t)++s->x);
  goto L_060E;
L_0620: ;
  fn_0624(s);
  return;
}

/* routine @ 0x0624 */
static void fn_0624(cpu_t*s){
L_0624: ;
  setzn(s,s->a=(uint8_t)(0x00));
  setzn(s,s->x=(uint8_t)(0x00));
L_0628: ;
  cmp8(s,s->x,0x0C);
  if(s->z==1) goto L_0634;
  s->c=0;
  s->a=adc(s,s->m[(0x0200+s->x)&0xFFFF]);
  setzn(s,(uint8_t)++s->x);
  goto L_0628;
L_0634: ;
  s->m[0x00]=s->a;
  return;
}

int main(void){static cpu_t cpu;memset(&cpu,0,sizeof cpu);
 fn_0600(&cpu);
 for(unsigned i=0;i<65536;i++) if(cpu.m[i]) printf("%04X %02X\n",i,cpu.m[i]);
 return 0;}
