/*>library.c
 *
 * Guardian
 * BBC version by S. Evans. Copyright Alligata Software 1984.
 * RISC OS Conversion by Michael Foot.
 * Version 1.03 (09 Feb 2003).
 *
 */

#include "r6502lib.h"

extern void m1300(void);
extern void m1319(void);
extern void m1320(void);
extern void m1390(void);
extern void m145E(void);
extern void m1478(void);
extern void m1495(void);
extern void m14B0(void);
extern void m14F0(void);
extern void m15B7(void);
extern void m169E(void);
extern void m18A8(void);
extern void m18B5(void);
extern void m18EB(void);
extern void m18FD(void);
extern void m1914(void);
extern void m19A7(void);
extern void m1AB6(void);
extern void m1B17(void);
extern void m1B37(void);
extern void m1C0B(void);
extern void m1F7B(void);
extern void m199A(void);
extern void m20A9(void);
extern void m2122(void);
extern void m215A(void);
extern void m2205(void);
extern void m2251(void);
extern void m228A(void);
extern void m22A4(void);
extern void m2300(void);
extern void m2330(void);
extern void m2345(void);
extern void m2369(void);
extern void m238C(void);
extern void m23DE(void);
extern void m23F5(void);
extern void m2452(void);
extern void m2497(void);
extern void m2501(void);
extern void m2528(void);
extern void m2555(void);
extern void m2597(void);
extern void m267C(void);
extern void m270E(void);
extern void m2727(void);
extern void m2742(void);
extern void m2782(void);
extern void m2849(void);
extern void m285F(void);
extern void m286C(void);
extern void m2883(void);
extern void m28E3(void);
extern void m2912(void);
extern void m2971(void);
extern void m29B6(void);
extern void m2A17(void);
extern void m2A2B(void);
extern void m2A71(void);
extern void m2AEB(void);
extern void m2BAB(void);
extern void m2BD9(void);
extern void m2C90(void);
extern void m2CC3(void);
extern void m241D(void);

void m2501(void)
{
  STY_ABSOL(0x25A4)
  LDA_ZEROP(0x70)
  STA_ABSOL(0x2599)
  LDY_IMMED(0x00)
  STY_ZEROP(0x75)
  LDA_ABSXP(0x0FC0)
  BMI(m2515)
  /*JMP_ABSOL(m2555)*/
  m2555();
  return;
m2515:
  AND_IMMED(0x7F)
  BNE(m2525)
  LDY_ABSOL(0x25A4)
  LDA_ABSXP(0x0EE0)
  LDX_ZEROP(0x70)
  JSR_ABSOL(0x2524,m169E)
  RTS
m2525:
  /*JMP_ABSOL(m2550)*/
/*m2550:*/
  /*copied*/
  AND_IMMED(0x7F)
  /*JMP_ABSOL(m2555)*/
  m2555();
}

void m2528(void)
{
  STY_ABSOL(0x25A4)
  LDA_ZEROP(0x70)
  STA_ABSOL(0x2599)
  LDY_ABSXP(0x0EA0)
  LDA_ABSYP(0x0678)
  STA_ZEROP(0x74)
  LDA_ABSYP(0x0638)
  STA_ZEROP(0x75)
  LDA_ABSXP(0x0FA0)
  STA_ABSOX(0x0FC0)
  BMI(m254B)
  BNE(m2548)
  RTS
m2548:
  /*JMP_ABSOL(m2555)*/
  m2555();
  return;
m254B:
  CMP_IMMED(0xCF)
  BNE(m2550)
  RTS
m2550:
  AND_IMMED(0x7F)
  /*JMP_ABSOL(m2555)*/
  m2555();
}

void m2555(void)
{
  STA_ZEROP(0x78)
  EOR_IMMED(0xFF)
  CLC
  ADC_IMMED(0x01)
  STA_ZEROP(0x79)
  LDA_ZEROP(0x78)
  LDY_ZEROP(0x78)
  JSR_ABSOL(0x2565,m2597)
  LDA_ZEROP(0x78)
  LDY_IMMED(0x00)
  JSR_ABSOL(0x256C,m2597)
  LDA_ZEROP(0x78)
  LDY_ZEROP(0x79)
  JSR_ABSOL(0x2573,m2597)
  LDA_IMMED(0x00)
  LDY_ZEROP(0x79)
  JSR_ABSOL(0x257A,m2597)
  LDA_ZEROP(0x79)
  LDY_ZEROP(0x79)
  JSR_ABSOL(0x2581,m2597)
  LDA_ZEROP(0x79)
  LDY_IMMED(0x00)
  JSR_ABSOL(0x2588,m2597)
  LDA_ZEROP(0x79)
  LDY_ZEROP(0x78)
  JSR_ABSOL(0x258F,m2597)
  LDA_IMMED(0x00)
  LDY_ZEROP(0x78)
  /*JMP_ABSOL(m2597)*/
  m2597();
}

void m2597(void)
{
  CLC
  value1 = memory[0x2599];
  ADC_IMMED(value1)
  BMI(m2596)
  CMP_IMMED(0x50)
  BCS(m2596)
  STA_ZEROP(0x70)
  TYA
  value1 = memory[0x25A4];
  ADC_IMMED(value1)
  BMI(m2596)
  CMP_IMMED(0x1C)
  BCC(m2596)
  TAY
  LDA_IMMED(0x00)
  STA_ZEROP(0x71)
  LDA_ZEROP(0x75)
  BEQ(m25EA)
  LDA_ZEROP(0x70)
  LSR
  PHP
  ASL
  ASL
  ROL_ZEROP(0x71)
  ASL
  ROL_ZEROP(0x71)
  ADC_ABSYP(0x0700)
  STA_ZEROP(0x70)
  LDA_ZEROP(0x71)
  ADC_ABSYP(0x0780)
  STA_ZEROP(0x71)
  PLP
  BCC(m25DA)
  LDY_IMMED(0x00)
  LDA_ZEROP(0x74)
  STA_POSTI(0x70)
  INY
  LDA_ZEROP(0x75)
  STA_POSTI(0x70)
  RTS
m25DA:
  LDY_IMMED(0x00)
  LDA_ZEROP(0x74)
  ASL
  ASL
  STA_POSTI(0x70)
  INY
  LDA_ZEROP(0x75)
  ASL
  ASL
  STA_POSTI(0x70)
  RTS
m25EA:
  LDA_ZEROP(0x70)
  LSR
  ASL
  ASL
  ROL_ZEROP(0x71)
  ASL
  ROL_ZEROP(0x71)
  ADC_ABSYP(0x0700)
  STA_ZEROP(0x70)
  LDA_ZEROP(0x71)
  ADC_ABSYP(0x0780)
  STA_ZEROP(0x71)
  LDY_IMMED(0x00)
  TYA
  STA_POSTI(0x70)
  INY
  STA_POSTI(0x70)
  RTS
m2596:
  RTS
}

void m264A(void)
{
  LDA_ABSOL(0x062E)
  BNE(m2609)
  LDX_IMMED(0xAB)
  STX_ZEROP(0x7B)
  JSR_ABSOL(0x2656,m1319)
  BCC(m2679)
  JSR_ABSOL(0x265B,m18B5)
  STA_ZEROP(0x80)
  LDA_ABSOL(0x0620)
  LDX_ZEROP(0x81)
  LDY_ZEROP(0x82)
  JSR_ABSOL(0x2667,m169E)
  LDA_IMMED(0x3C)
  STA_ZEROP(0x82)
  LDA_IMMED(0x28)
  STA_ABSOL(0x062E)
  LDA_IMMED(0x00)
  STA_ABSOL(0x0623)
  STA_ABSOL(0x0624)
  RTS
m2679:
  /*JMP_ABSOL(m1500)*/
/*m1500:*/
  LDA_ABSOL(0x0627)
  BEQ(m150F)
  DEC_ABSOL(0x0627)
  BNE(m150F)
  LDA_IMMED(0x07)
  JSR_ABSOL(0x150F,m14F0)
m150F:
  LDX_IMMED(0x9F)
  JSR_ABSOL(0x1514,m1319)
  LDA_IMMED(0x00)
  BCC(m1544)
  LDA_ABSOL(0x0626)
  BNE(m1544)
  LDA_ZEROP(0x65)
  BEQ(m1544)
  DEC_ZEROP(0x65)
  JSR_ABSOL(0x1526,m228A)

  regs.r[0] = 0xB0;
  regs.r[1] = 0;
  regs.r[2] = 0xFF;
  _kernel_swi(OS_Byte,&regs,&regs);
  memory[0x0240] = (regs.r[1] & 0xFF);

  LDA_ABSOL(0x0240)
  AND_IMMED(0x03)
  ORA_IMMED(0x01)
  STA_ABSOL(0x0627)
  LDA_IMMED(0x00)
  JSR_ABSOL(0x1535,m14F0)
  DEC_ZEROP(0x58)
  LDA_IMMED(0x02)
  LDX_IMMED(0xF1)
  LDY_IMMED(0x06)
  JSR_ABSOL(0x1540,m22A4)
  INC_ZEROP(0x58)
  LDA_IMMED(0x01)
m1544:
  STA_ABSOL(0x0626)
  INC_ZEROP(0x83)
  LDA_IMMED(0x80)
  STA_ZEROP(0x7B)
  LDA_ABSOL(0x0620)
  LDX_ZEROP(0x81)
  LDY_ZEROP(0x82)
  JSR_ABSOL(0x1557,m169E)
  LDX_IMMED(0xBE)
  JSR_ABSOL(0x155C,m1319)
  BCC(m1566)
  LDA_ZEROP(0x82)
  CMP_IMMED(0x1D)
  BEQ(m1566)
  DEC_ZEROP(0x82)
m1566:
  LDX_IMMED(0x9E)
  JSR_ABSOL(0x156B,m1319)
  BCC(m1575)
  LDA_ZEROP(0x82)
  CMP_IMMED(0x7C)
  BEQ(m1575)
  INC_ZEROP(0x82)
m1575:
  LDA_ABSOL(0x0620)
  BEQ(m1585)
  LDA_ZEROP(0x81)
  CMP_IMMED(0x3E)
  BEQ(m158D)
  INC_ZEROP(0x81)
  JMP_ABSOL(m158D)
m1585:
  LDA_ZEROP(0x81)
  CMP_IMMED(0x0E)
  BEQ(m158D)
  DEC_ZEROP(0x81)
m158D:
  LDX_IMMED(0x9D)
  JSR_ABSOL(0x1592,m1319)
  LDA_IMMED(0x00)
  BCC(m15A5)
  LDA_ABSOL(0x0621)
  BNE(m15A5)
  LDA_ABSOL(0x0620)
  EOR_IMMED(0x02)
  STA_ABSOL(0x0620)
  LDA_IMMED(0x01)
m15A5:
  STA_ABSOL(0x0621)
  LDX_ZEROP(0x81)
  LDY_ZEROP(0x82)
  LDA_IMMED(0x00)
  STA_ZEROP(0x7B)
  LDA_ABSOL(0x0620)
  JSR_ABSOL(0x15B6,m169E)
  RTS

m2609:
  LDA_IMMED(0x00)
  STA_ZEROP(0x74)
  STA_ZEROP(0x75)
  LDY_ZEROP(0x82)
  INY
  /*JMP_ABSOL(m12F0)*/
/*m12F0:*/
  STY_ABSOL(0x25A4)
  LDY_ZEROP(0x81)
  /*JMP_ABSOL(m2615)*/

/*m2615:*/
  INY
  INY
  STY_ABSOL(0x2599)
  LDA_ABSOL(0x062E)
  JSR_ABSOL(0x2620,m2555)
  LDA_IMMED(0x11)
  STA_ZEROP(0x74)
  STA_ZEROP(0x75)
  DEC_ABSOL(0x062E)
  BEQ(m2631)
  LDA_ABSOL(0x062E)
  /*JMP_ABSOL(m2555)*/
  m2555();
  return;
m2631:
  LDA_IMMED(0x00)
  STA_ZEROP(0x7B)
  LDA_ABSOL(0x0620)
  LDX_ZEROP(0x81)
  LDY_ZEROP(0x82)
  JSR_ABSOL(0x263F,m169E)
  LDA_ZEROP(0x80)
  AND_IMMED(0x07)
  BNE(m2649)
  LDA_IMMED(0x46)
  STA_ZEROP(0x8A)
m2649:
  RTS
}

void m267C(void)
{
  JSR_ABSOL(0x267F,m18A8)
  LDA_ZEROP(0x8A)
  BNE(m269E)
  JSR_ABSOL(0x2686,m264A)
m2686:
  JSR_ABSOL(0x2689,m2205)
  JSR_ABSOL(0x268C,m2782)
  JSR_ABSOL(0x268F,m2452)
  JSR_ABSOL(0x2692,m1C0B)
  JSR_ABSOL(0x2695,m1F7B)
  JSR_ABSOL(0x2698,m15B7)
  JSR_ABSOL(0x269B,m2742)
  /*JMP_ABSOL(m267C)*/
  m267C();
  return;
m269E:
  DEC_ZEROP(0x8A)
  BEQ(m26C2)
  LDX_ZEROP(0x81)
  LDA_ZEROP(0x8A)
  CMP_IMMED(0x3A)
  BNE(m26B3)
  LDA_IMMED(0x07)
  JSR_ABSOL(0x26AF,m14F0)
  LDX_ZEROP(0x81)
  LDA_ZEROP(0x8A)
m26B3:
  AND_IMMED(0x01)
  STA_ZEROP(0x7B)
  LDY_ZEROP(0x82)
  LDA_ABSOL(0x0620)
  JSR_ABSOL(0x26BF,m169E)
  JMP_ABSOL(m2686)
m26C2:
  JSR_ABSOL(0x26C5,m2345)
  JSR_ABSOL(0x26C8,m1B17)
  LDA_IMMED(0x46)
  STA_ZEROP(0x8A)
m26CC:
  JSR_ABSOL(0x26CF,m18A8)
  JSR_ABSOL(0x26D2,m1B37)
  JSR_ABSOL(0x26D5,m1B37)
  DEC_ZEROP(0x8A)
  BNE(m26CC)
  LDY_IMMED(0x32)
m26DB:
  JSR_ABSOL(0x26DE,m18A8)
  DEY
  BNE(m26DB)
  DEC_ZEROP(0x66)
  BMI(m26F1)
  JSR_ABSOL(0x26E8,m2727)
  JSR_ABSOL(0x26EB,m2369)
  JSR_ABSOL(0x26EE,m2C90)
  /*JMP_ABSOL(m267C)*/
  m267C();
  return;
m26F1:
  LDA_IMMED(0x00)
  STA_ZEROP(0x66)
  JSR_ABSOL(0x26F8,m2727)
  LDA_IMMED(0xFF)
  STA_ZEROP(0x74)
  LDA_IMMED(0x30)
  LDX_IMMED(0xC0)
  LDY_IMMED(0x6D)
  JSR_ABSOL(0x2705,m2A17)
  LDY_IMMED(0x64)
m2707:
  JSR_ABSOL(0x270A,m18A8)
  DEY
  BNE(m2707)
  RTS
}

void m270E(void)
{
  /*main loop*/
m270E:
  JSR_ABSOL(0x2711,m2AEB)
  if (!quit)
  {
    JSR_ABSOL(0x2714,m238C)
    /*turn keyboard interrupts off*/
    LDA_IMMED(0x00)
    STA_ABSOL(0x0242)
    JSR_ABSOL(0x271C,m267C)
    /*turn keyboard interrupts on*/
    LDA_IMMED(0xFF)
    STA_ABSOL(0x0242)
    JSR_ABSOL(0x2724,m2BAB)
    /*WAIT_FOR_VERTICAL_SYNC*/
    JMP_ABSOL(m270E)
  }
}

void m2727(void)
{
  char vdu_char;

  vdu_char = 0x00;

  LDX_IMMED(0x00)
m2729:
  LDA_ABSXP(0x5480)
  CMP_IMMED(0xFE)
  BEQ(m2737)

  if (vdu_char == 0x16)
  {
    /*mode*/
    switch (r6502_a)
    {
      case 0x05:
        bbc_video_mode = 0x05;
        bbc_video_addr = 0x5800;
        getscreenaddress();
        break;
    }
  }
  vdu_char = r6502_a;

  OSWRCH
  INX
  JMP_ABSOL(m2729)
m2737:
  LDA_IMMED(0x00)
  STA_ZEROP(0x63)
  JSR_ABSOL(0x273E,m14B0)
  JSR_ABSOL(0x2741,m2251)
  RTS
}

void m2742(void)
{
  LDA_ZEROP(0x85)
  AND_IMMED(0x0F)
  BNE(m2781)
  LDA_ABSOL(0x0616)
  BNE(m2759)
  LDA_ABSOL(0x061B)
  BNE(m2768)
  LDA_ZEROP(0x8A)
  BNE(m2759)
  /*JMP_ABSOL(m29B6)*/
  m29B6();
  return;
m2759:
  LDA_ABSOL(0x0615)
  BEQ(m2763)
  DEC_ABSOL(0x0619)
  BNE(m2779)
m2763:
  LDA_ABSOL(0x061B)
  BEQ(m2779)
m2768:
  LDA_ABSOL(0x061A)
  CLC
  ADC_IMMED(0x08)
  STA_ABSOL(0x061A)
  DEC_ABSOL(0x061B)
  LDA_IMMED(0x28)
  STA_ABSOL(0x0619)
m2779:
  LDA_ABSOL(0x061D)
  BEQ(m2781)
  DEC_ABSOL(0x061D)
m2781:
  RTS
}

void m2782(void)
{
  LDX_IMMED(0xB6)
  JSR_ABSOL(0x2787,m1319)
  LDY_IMMED(0x00)
  BCC(m2795)
  LDA_ABSOL(0x0622)
  BNE(m2798)
  LDA_ZEROP(0x8A)
  BNE(m2798)
  INY
m2795:
  STY_ABSOL(0x0622)
m2798:
  STY_ZEROP(0x74)
  LDX_IMMED(0x00)
m279C:
  LDA_ABSXP(0x0640)
  STA_ZEROP(0x70)
  LDA_ABSXP(0x0641)
  STA_ZEROP(0x71)
  LDA_ABSXP(0x0642)
  STA_ZEROP(0x72)
  LDA_ABSXP(0x0643)
  STA_ZEROP(0x73)
  LDA_ABSXP(0x0645)
  CMP_ABSXP(0x0644)
  BNE(m27C1)
  LDA_ZEROP(0x74)
  BEQ(m2800)
  DEC_ZEROP(0x74)
  /*JMP_ABSOL(m2883)*/
  m2883();
  return;
m27C1:
  BCS(m280A)
  CLC
  ADC_IMMED(0x01)
  STA_ABSOX(0x0645)
  AND_IMMED(0x01)
  BNE(m27DE)
  LDY_IMMED(0x00)
  TYA
  STA_POSTI(0x72)
  LDA_ZEROP(0x72)
  ADC_IMMED(0x08)
  STA_ABSOX(0x0642)
  BCC(m27DE)
  INC_ABSOX(0x0643)


m27DE:
  LDA_ABSXP(0x0644)
  CLC
  ADC_IMMED(0x04)
  CMP_IMMED(0x50)
  BCC(m27EE)
m27E8:
  JSR_ABSOL(0x27EB,m2849)
  JMP_ABSOL(m2800)
m27EE:
  JSR_ABSOL(0x27F1,m28E3)
  BCS(m27E8)
  LDA_ZEROP(0x70)
  CLC
  ADC_IMMED(0x10)
  STA_ABSOX(0x0640)
  BCC(m2800)
  INC_ABSOX(0x0641)
m2800:
  TXA
  CLC
  ADC_IMMED(0x08)
  TAX
  CPX_IMMED(0x20)
  BNE(m279C)
  RTS
m280A:
  SEC
  SBC_IMMED(0x01)
  STA_ABSOX(0x0645)
  AND_IMMED(0x01)
  BNE(m2826)
  LDY_IMMED(0x00)
  TYA
  STA_POSTI(0x72)
  LDA_ZEROP(0x72)
  SEC
  SBC_IMMED(0x08)
  STA_ABSOX(0x0642)
  BCS(m2826)
  DEC_ABSOX(0x0643)
m2826:
  LDA_ABSXP(0x0644)
  SEC
  SBC_IMMED(0x04)
  BPL(m2834)
m282E:
  JSR_ABSOL(0x2831,m285F)
  JMP_ABSOL(m2800)
m2834:
  JSR_ABSOL(0x2837,m28E3)
  BCS(m282E)
  LDA_ZEROP(0x70)
  SEC
  SBC_IMMED(0x10)
  STA_ABSOX(0x0640)
  BCS(m2800)
  DEC_ABSOX(0x0641)
  JMP_ABSOL(m2800)
}

void m2849(void)
{
  LDA_ZEROP(0x72)
  STA_ZEROP(0x70)
  LDA_ZEROP(0x73)
  STA_ZEROP(0x71)
  LDA_ABSXP(0x0644)
  SEC
  SBC_ABSXP(0x0645)
  LSR
  STX_ZEROP(0x7E)
  TAX
  /*JMP_ABSOL(m286C)*/
  m286C();
}

void m285F(void)
{
  LDA_ABSXP(0x0645)
  SEC
  SBC_ABSXP(0x0644)
  LSR
  STX_ZEROP(0x7E)
  TAX
  INX
  INX
  m286C();
}

void m286C(void)
{
  CLC
  LDY_IMMED(0x00)
m286F:
  LDA_IMMED(0x00)
  STA_POSTI(0x70)
  TYA
  ADC_IMMED(0x08)
  TAY
  DEX
  BPL(m286F)
  LDX_ZEROP(0x7E)
  LDA_ABSXP(0x0644)
  STA_ABSOX(0x0645)
  RTS
}

void m2883(void)
{
  STX_ZEROP(0x57)
  LDA_IMMED(0x07)
  LDY_IMMED(0x46)
  LDX_IMMED(0x01)
  JSR_ABSOL(0x288E,m22A4)
  LDA_IMMED(0x08)
  STA_ZEROP(0x70)
  LDA_ABSOL(0x0620)
  BEQ(m289B)
  LDA_IMMED(0xFD)
  STA_ZEROP(0x70)
m289B:
  LDA_ZEROP(0x82)
  CLC
  ADC_IMMED(0x02)
  STA_ABSOX(0x0647)
  TAY
  LDA_IMMED(0x00)
  STA_ABSOX(0x0646)
  LDA_ZEROP(0x81)
  CLC
  ADC_ZEROP(0x70)
  STA_ABSOX(0x0644)
  STA_ABSOX(0x0645)
  STX_ZEROP(0x7E)
  LSR
  TAX
  JSR_ABSOL(0x28BB,m1300)
  LDX_ZEROP(0x7E)
  LDA_ZEROP(0x70)
  STA_ABSOX(0x0642)
  LDA_ZEROP(0x71)
  STA_ABSOX(0x0641)
  STA_ABSOX(0x0643)
  LDY_ABSOL(0x0620)
  BEQ(m28E0)
  LDA_ZEROP(0x70)
  SEC
  SBC_IMMED(0x08)
  STA_ZEROP(0x70)
  BCS(m28DD)
  DEC_ZEROP(0x71)
  DEC_ABSOX(0x0641)
m28DD:
  JMP_ABSOL(m2826a)
m28E0:
  /*JMP_ABSOL(m27DE)*/

m27DEa:
  /*copied*/
  LDA_ABSXP(0x0644)
  CLC
  ADC_IMMED(0x04)
  CMP_IMMED(0x50)
  BCC(m27EEa)
m27E8a:
  JSR_ABSOL(0x27EB,m2849)
  JMP_ABSOL(m2800a)
m27EEa:
  JSR_ABSOL(0x27F1,m28E3)
  BCS(m27E8a)
  LDA_ZEROP(0x70)
  CLC
  ADC_IMMED(0x10)
  STA_ABSOX(0x0640)
  BCC(m2800a)
  INC_ABSOX(0x0641)
m2800a:
  TXA
  CLC
  ADC_IMMED(0x08)
  TAX
  CPX_IMMED(0x20)
  BNE(m279Ca)
  RTS
m280Aa:
  SEC
  SBC_IMMED(0x01)
  STA_ABSOX(0x0645)
  AND_IMMED(0x01)
  BNE(m2826a)
  LDY_IMMED(0x00)
  TYA
  STA_POSTI(0x72)
  LDA_ZEROP(0x72)
  SEC
  SBC_IMMED(0x08)
  STA_ABSOX(0x0642)
  BCS(m2826a)
  DEC_ABSOX(0x0643)

m2826a:
  LDA_ABSXP(0x0644)
  SEC
  SBC_IMMED(0x04)
  BPL(m2834a)
m282Ea:
  JSR_ABSOL(0x2831,m285F) /*!!*/
  JMP_ABSOL(m2800a)
m2834a:
  JSR_ABSOL(0x2837,m28E3)
  BCS(m282Ea)
  LDA_ZEROP(0x70)
  SEC
  SBC_IMMED(0x10)
  STA_ABSOX(0x0640)
  BCS(m2800a)
  DEC_ABSOX(0x0641)
  JMP_ABSOL(m2800a)

m279Ca:
  /*copied*/
  LDA_ABSXP(0x0640)
  STA_ZEROP(0x70)
  LDA_ABSXP(0x0641)
  STA_ZEROP(0x71)
  LDA_ABSXP(0x0642)
  STA_ZEROP(0x72)
  LDA_ABSXP(0x0643)
  STA_ZEROP(0x73)
  LDA_ABSXP(0x0645)
  CMP_ABSXP(0x0644)
  BNE(m27C1a)
  LDA_ZEROP(0x74)
  BEQ(m2800a)
  DEC_ZEROP(0x74)
  /*JMP_ABSOL(m2883)*/
  m2883();
  return;
m27C1a:
  BCS(m280Aa)
  CLC
  ADC_IMMED(0x01)
  STA_ABSOX(0x0645)
  AND_IMMED(0x01)
  BNE(m27DEa)
  LDY_IMMED(0x00)
  TYA
  STA_POSTI(0x72)
  LDA_ZEROP(0x72)
  ADC_IMMED(0x08)
  STA_ABSOX(0x0642)
  BCC(m27DEa)
  INC_ABSOX(0x0643)
  goto m27DEa;
}

void m29B6(void)
{
  JSR_ABSOL(0x29B9,m2727)
  LDA_IMMED(0xFF)
  STA_ZEROP(0x74)
  LDX_IMMED(0x40)
  LDY_IMMED(0x67)
  LDA_IMMED(0x00)
  JSR_ABSOL(0x29C6,m2A17)
  LDX_IMMED(0xF0)
  LDY_IMMED(0x69)
  LDA_IMMED(0x20)
  JSR_ABSOL(0x29CF,m2A17)
  LDA_ABSOL(0x0615)
  STA_ZEROP(0x89)
  BEQ(m2A03)
  LDA_IMMED(0x16)
  STA_ZEROP(0x8A)
m29DA:
  LDY_IMMED(0x04)
m29DC:
  JSR_ABSOL(0x29DF,m18A8)
  DEY
  BNE(m29DC)
  LDY_IMMED(0x41)
  LDA_ZEROP(0x8A)
  CLC
  ADC_IMMED(0x03)
  STA_ZEROP(0x8A)
  TAX
  LDA_IMMED(0x00)
  STA_ZEROP(0x7B)
  LDA_IMMED(0x14)
  JSR_ABSOL(0x29F5,m169E)
  LDA_ABSOL(0x5528)
  STA_ZEROP(0x63)
  LDA_IMMED(0x00)
  JSR_ABSOL(0x29FF,m14B0)
  DEC_ZEROP(0x89)
  BNE(m29DA)
m2A03:
  LDY_IMMED(0x64)
m2A05:
  JSR_ABSOL(0x2A08,m18A8)
  DEY
  BNE(m2A05)
  JSR_ABSOL(0x2A0E,m2727)
  JSR_ABSOL(0x2A11,m2A71)
  JSR_ABSOL(0x2A14,m2CC3)
  /*JMP_ABSOL(m2C90)*/
  m2C90();
  return;
}

void m2A71(void)
{
  LDA_ABSOL(0x5528)
  CMP_IMMED(0x05)
  BEQ(m2A7B)
  CLC
  ADC_IMMED(0x01)
m2A7B:
  STA_ABSOL(0x5528)
  DEC_ABSOL(0x0629)
  BNE(m2A8D)
  LDA_IMMED(0x0A)
  STA_ABSOL(0x0615)
  LDA_IMMED(0x05)
  STA_ABSOL(0x0629)
m2A8D:
  SED
  LDA_ABSOL(0x0628)
  CLC
  ADC_IMMED(0x01)
  STA_ABSOL(0x0628)
  CLD
  AND_IMMED(0x0F)
  STA_ABSOL(0x550D)
  LDA_ABSOL(0x0628)
  LSR
  LSR
  LSR
  LSR
  BNE(m2AA8)
  LDA_IMMED(0x0C)
m2AA8:
  STA_ABSOL(0x550C)
  LDA_ABSOL(0x0618)
  CLC
  ADC_IMMED(0x04)
  STA_ABSOL(0x0618)
  LDA_ABSOL(0x0613)
  ADC_IMMED(0x03)
  BMI(m2AEA)
  STA_ABSOL(0x0613)
  LDA_ABSOL(0x0610)
  ADC_IMMED(0x02)
  STA_ABSOL(0x0610)
  LDA_ABSOL(0x0614)
  ADC_IMMED(0x02)
  STA_ABSOL(0x0614)
  LDA_ABSOL(0x0617)
  ADC_IMMED(0x02)
  STA_ABSOL(0x0617)
  LDA_ABSOL(0x061E)
  SBC_IMMED(0x00)
  CMP_IMMED(0x0C)
  BEQ(m2AE2)
  STA_ABSOL(0x061E)
m2AE2:
  LDA_ABSOL(0x0612)
  ADC_IMMED(0x05)
  STA_ABSOL(0x0612)
m2AEA:
  RTS
}

void m28E3(void)
{
  STA_ABSOX(0x0644)
  LDA_ABSXP(0x0646)
  STX_ZEROP(0x7E)
  TAX
  LDY_IMMED(0x00)
  LDA_POSTI(0x70)
  BNE(m28F5)
  JSR_ABSOL(0x28F5,m2912)
m28F5:
  LDA_ABSXP(0x0966)
  STA_POSTI(0x70)
  LDY_IMMED(0x08)
  INX
  LDA_POSTI(0x70)
  BNE(m2904)
  JSR_ABSOL(0x2904,m2912)
m2904:
  LDA_ABSXP(0x0966)
  STA_POSTI(0x70)
  INX
  TXA
  LDX_ZEROP(0x7E)
  STA_ABSOX(0x0646)
  CLC
  RTS
}

void m2912(void)
{
  STX_ZEROP(0x7F)
  STY_ZEROP(0x7D)
  LDX_ZEROP(0x7E)
  LDY_IMMED(0x1F)
m291A:
  LDA_ABSYP(0x0E00)
  BPL(m2927)
m291F:
  DEY
  BPL(m291A)
  LDX_ZEROP(0x7F)
  LDY_ZEROP(0x7D)
  RTS
m2927:
  LDA_ABSYP(0x0EA0)
  CMP_IMMED(0x07)
  BCS(m291F)
  LDA_ABSYP(0x0EE0)
  BMI(m291F)
  LDA_ABSYP(0x0E40)
  CMP_ABSXP(0x0647)
  BCS(m291F)
  ADC_IMMED(0x05)
  CMP_ABSXP(0x0647)
  BCC(m291F)
  LDA_ABSYP(0x0E00)
  CMP_ABSXP(0x0644)
  BCS(m2952)
  CMP_ABSXP(0x0645)
  BCC(m291F)
  JMP_ABSOL(m2957)
m2952:
  CMP_ABSXP(0x0645)
  BCS(m291F)
m2957:
  STX_ZEROP(0x57)
  STY_ZEROP(0x56)
  DEC_ZEROP(0x58)
  LDA_IMMED(0x01)
  LDY_IMMED(0x05)
  LDX_IMMED(0xF1)
  JSR_ABSOL(0x2966,m22A4)
  INC_ZEROP(0x58)
  JSR_ABSOL(0x296B,m215A)
  PLA
  PLA
  LDX_ZEROP(0x7E)
  SEC
  RTS
}

void m2971(void)
{
  /*display a character on the screen*/
  CMP_IMMED(0x20)
  BNE(m2977)
  LDA_IMMED(0x3A)
m2977:
  CMP_IMMED(0x0C)
  BEQ(m29B5)
  CMP_IMMED(0x41)
  BCC(m298B)
  LDY_IMMED(0x00)
  STY_ZEROP(0x70)
  LDY_IMMED(0x12)
  SEC
  SBC_IMMED(0x41)
  JMP_ABSOL(m2993)
m298B:
  AND_IMMED(0x0F)
  LDY_IMMED(0xA0)
  STY_ZEROP(0x70)
  LDY_IMMED(0x0B)
m2993:
  ASL
  ASL
  ASL
  ADC_ZEROP(0x70)
  STA_ZEROP(0x70)
  TYA
  ADC_IMMED(0x00)
  STA_ZEROP(0x71)
  LDY_IMMED(0x07)
m29A1:
  LDA_POSTI(0x70)
  AND_ZEROP(0x74)
  STA_POSTI(0x72)
  DEY
  BPL(m29A1)
  LDA_ZEROP(0x72)
  CLC
  ADC_IMMED(0x08)
  STA_ZEROP(0x72)
  BCC(m29B5)
  INC_ZEROP(0x73)
m29B5:
  RTS
}

void m2A17(void)
{
  STX_ZEROP(0x72)
  STY_ZEROP(0x73)
  TAX
m2A1C:
  LDA_ABSXP(0x5500)
  CMP_IMMED(0x0D)
  BEQ(m2A2A)
  JSR_ABSOL(0x2A26,m2971)
  INX
  JMP_ABSOL(m2A1C)
m2A2A:
  RTS
}

void m2A2B(void)
{
  /*display a line of text*/
  STX_ZEROP(0x78)
  STY_ZEROP(0x79)
  LDY_IMMED(0x00)
m2A31:
  STY_ZEROP(0x75)
  LDA_POSTI(0x78)
  CMP_IMMED(0x0D)
  BEQ(m2A4A)
  CMP_IMMED(0x1F)
  BEQ(m2A54)
  CMP_IMMED(0x11)
  BEQ(m2A4B)
  JSR_ABSOL(0x2A44,m2971)
  LDY_ZEROP(0x75)
  INY
  JMP_ABSOL(m2A31)
m2A4A:
  RTS
m2A4B:
  INY
  LDA_POSTI(0x78)
  STA_ZEROP(0x74)
  INY
  JMP_ABSOL(m2A31)
m2A54:
  INY
  LDA_POSTI(0x78)
  INY
  ASL
  ASL
  TAX
  LDA_POSTI(0x78)
  ASL
  ASL
  ASL
  CLC
  ADC_ABSXP(0x0700)
  STA_ZEROP(0x72)
  LDA_ABSXP(0x0780)
  ADC_IMMED(0x00)
  STA_ZEROP(0x73)
  INY
  JMP_ABSOL(m2A31)
}

void m2AEB(void)
{
  char vdu_char;

  vdu_char = 0x00;

  LDX_IMMED(0x00)
m2AED:
  LDA_ABSXP(0x55B0)
  CMP_IMMED(0x0D)
  BEQ(m2AFB)

  if (vdu_char == 0x16)
  {
    /*mode*/
    switch (r6502_a)
    {
      case 0x05:
        bbc_video_mode = 0x05;
        bbc_video_addr = 0x5800;
        getscreenaddress();
        break;
    }
  }
  vdu_char = r6502_a;

  OSWRCH
  INX
  JMP_ABSOL(m2AED)
m2AFB:
  LDX_IMMED(0x00)
  LDA_IMMED(0x50)
  STA_ZEROP(0x72)
  LDA_IMMED(0x67)
  STA_ZEROP(0x73)
m2B05:
  STX_ZEROP(0x75)
  LDA_IMMED(0x0F)
  STA_ZEROP(0x74)
  TXA
  LSR
  LSR
  LSR
  LSR
  ADC_IMMED(0x01)
  JSR_ABSOL(0x2B15,m2971)
  LDA_IMMED(0x5B)
  JSR_ABSOL(0x2B1A,m2971)
  LDA_IMMED(0x20)
  JSR_ABSOL(0x2B1F,m2971)
  LDA_ABSXP(0x5300)
  STA_ZEROP(0x60)
  LDA_ABSXP(0x5301)
  STA_ZEROP(0x61)
  LDA_ABSXP(0x5302)
  STA_ZEROP(0x62)
  LDA_ZEROP(0x72)
  STA_ZEROP(0x78)
  LDA_ZEROP(0x73)
  STA_ZEROP(0x79)
  JSR_ABSOL(0x2B39,m1478)
  LDA_ZEROP(0x78)
  STA_ZEROP(0x72)
  LDA_ZEROP(0x79)
  STA_ZEROP(0x73)
  LDA_IMMED(0x20)
  JSR_ABSOL(0x2B46,m2971)
  LDA_IMMED(0xF0)
  STA_ZEROP(0x74)
  LDX_ZEROP(0x75)
  INX
  INX
m2B4E:
  INX
  LDA_ABSXP(0x5300)
  CMP_IMMED(0x0D)
  BEQ(m2B5C)
  JSR_ABSOL(0x2B59,m2971)
  JMP_ABSOL(m2B4E)
m2B5C:
  LDA_ZEROP(0x72)
  CLC
  ADC_IMMED(0xC8)
  STA_ZEROP(0x72)
  LDA_ZEROP(0x73)
  ADC_IMMED(0x01)
  STA_ZEROP(0x73)
m2B69:
  LDA_IMMED(0x20)
  JSR_ABSOL(0x2B6E,m2971)
  INX
  TXA
  AND_IMMED(0x0F)
  BNE(m2B69)
  CPX_IMMED(0x80)
  BEQ(m2B7B)
  JMP_ABSOL(m2B05)
m2B7B:
  LDX_IMMED(0x40)
  LDY_IMMED(0x55)
  JSR_ABSOL(0x2B82,m2A2B)
  LDA_IMMED(0xFF)
  STA_ZEROP(0x74)
m2B86:
  JSR_ABSOL(0x2B89,m18A8)

  /*check to see if escape pressed*/
  LDX_IMMED(0x8F)
  JSR_ABSOL(0x2B8E,m1319)
  if (r6502_y == 0xFF)
    quit = TRUE;
  BCS(m2BA7)

  /*check to see if space bar pressed*/
  LDX_IMMED(0x9D)
  JSR_ABSOL(0x2B8E,m1319)
  BCS(m2BA7)

  regs.r[0] = 0xB0;
  regs.r[1] = 0;
  regs.r[2] = 0xFF;
  _kernel_swi(OS_Byte,&regs,&regs);
  memory[0x0240] = (regs.r[1] & 0xFF);

  LDA_ABSOL(0x0240)
  AND_IMMED(0x1F)
  BNE(m2B86)

  WAIT_FOR_VERTICAL_SYNC
  /*display PRESS SPACE TO START*/
  LDX_IMMED(0x90)
  LDY_IMMED(0x55)
  JSR_ABSOL(0x2B9E,m2A2B)
  LDA_ZEROP(0x74)
  EOR_IMMED(0xFF)
  STA_ZEROP(0x74)
  JMP_ABSOL(m2B86)
m2BA7:
  INC_ABSOL(0x0621)
  RTS
}

void m2BAB(void)
{
  LDX_IMMED(0x00)
m2BAD:
  LDA_ABSXP(0x5302)
  CMP_ZEROP(0x62)
  BEQ(m2BB9)
  BCS(m2BCF)
  /*JMP_ABSOL(m2BD9)*/
  m2BD9();
  return;
m2BB9:
  LDA_ABSXP(0x5301)
  CMP_ZEROP(0x61)
  BEQ(m2BC5)
  BCS(m2BCF)
  /*JMP_ABSOL(m2BD9)*/
  m2BD9();
  return;
m2BC5:
  LDA_ABSXP(0x5300)
  CMP_ZEROP(0x60)
  BCS(m2BCF)
  /*JMP_ABSOL(m2BD9)*/
  m2BD9();
  return;
m2BCF:
  TXA
  CLC
  ADC_IMMED(0x10)
  TAX
  CMP_IMMED(0x80)
  BNE(m2BAD)
  RTS
}

void m2BD9(void)
{
  STX_ZEROP(0x79)
  CPX_IMMED(0x70)
  BEQ(m2BF2)
  LDX_IMMED(0x6F)
m2BE1:
  LDA_ABSXP(0x5300)
  STA_ABSOX(0x5310)
  DEX
  CPX_ZEROP(0x79)
  BNE(m2BE1)
  LDA_ABSXP(0x5300)
  STA_ABSOX(0x5310)
m2BF2:
  LDA_ZEROP(0x60)
  STA_ABSOX(0x5300)
  LDA_ZEROP(0x61)
  STA_ABSOX(0x5301)
  LDA_ZEROP(0x62)
  STA_ABSOX(0x5302)
  INX
  INX
  INX
  STX_ZEROP(0x60)
  LDX_IMMED(0x00)
m2C08:
  LDA_ABSXP(0x55B0)
  CMP_IMMED(0x0D)
  BEQ(m2C16)
  OSWRCH
  INX
  JMP_ABSOL(m2C08)
m2C16:
  LDX_IMMED(0x00)
  LDY_IMMED(0x54)
  JSR_ABSOL(0x2C1D,m2A2B)
  LDA_IMMED(0x0F)
  LDX_IMMED(0x01)
  OSBYTE
  LDX_ZEROP(0x60)
  LDY_IMMED(0x00)
  STY_ZEROP(0x78)
m2C2A:
  STX_ZEROP(0x79)
  LDA_IMMED(0x81)
  LDY_IMMED(0x7F)
  OSBYTE81
  TYA
  BMI(m2C2A)
  TXA
  LDX_ZEROP(0x79)
  CMP_IMMED(0x7F)
  BEQ(m2C76)
  CMP_IMMED(0x0D)
  BEQ(m2C72)
  LDY_ZEROP(0x78)
  CPY_IMMED(0x0C)
  BEQ(m2C2A)
  CMP_IMMED(0x20)
  BEQ(m2C66)
  CMP_IMMED(0x2E)
  BNE(m2C54)
  LDA_IMMED(0x5B)
  JMP_ABSOL(m2C66)
m2C54:
  CMP_IMMED(0x61)
  BCC(m2C5B)
  SEC
  SBC_IMMED(0x20)
m2C5B:
  CMP_IMMED(0x5B)
  BCS(m2C2A)
  CMP_IMMED(0x41)
  BCS(m2C66)
  JMP_ABSOL(m2C2A)
m2C66:
  /*high score table*/
  STA_ABSOX(0x5300)
  JSR_ABSOL(0x2C6C,m2971)
  INC_ZEROP(0x78)
  INX
  JMP_ABSOL(m2C2A)
m2C72:
  STA_ABSOX(0x5300)
  RTS
m2C76:
  LDY_ZEROP(0x78)
  BEQ(m2C2A)
  LDA_ZEROP(0x72)
  SEC
  SBC_IMMED(0x08)
  STA_ZEROP(0x72)
  PHA
  LDA_IMMED(0x20)
  JSR_ABSOL(0x2C87,m2971)
  PLA
  STA_ZEROP(0x72)
  DEC_ZEROP(0x78)
  DEX
  JMP_ABSOL(m2C2A)
}

void m2C90(void)
{
  LDA_IMMED(0x00)
  STA_ABSOL(0x0620)
  STA_ABSOL(0x0623)
  STA_ABSOL(0x0624)
  STA_ABSOL(0x0625)
  LDA_IMMED(0x50)
  STA_ZEROP(0x82)
  LDA_IMMED(0x10)
  STA_ZEROP(0x81)
  LDA_IMMED(0x00)
  STA_ZEROP(0x80)
  STA_ZEROP(0x89)
  STA_ZEROP(0x8A)
  STA_ZEROP(0x8B)
  LDX_IMMED(0x7F)
  LDA_IMMED(0xFF)
m2CB4:
  STA_ABSOX(0x0D00)
  DEX
  BPL(m2CB4)
  LDX_IMMED(0x1F)
m2CBC:
  STA_ABSOX(0x0640)
  DEX
  BPL(m2CBC)
  RTS
}

void m2CC3(void)
{
  LDA_IMMED(0x00)
  STA_ZEROP(0x73)
  STA_ZEROP(0x71)
  LDA_IMMED(0x08)
  STA_ZEROP(0x70)
  LDY_ABSOL(0x5528)
  DEY
  LDA_ABSYP(0x5470)
  STA_ABSOL(0x061B)
  LDA_ABSYP(0x5475)
  STA_ZEROP(0x72)
  LDA_ABSYP(0x547A)
  STA_ZEROP(0x74)
  LDA_IMMED(0xA4)
  STA_ABSOL(0x061D)
  LDA_IMMED(0x1E)
  STA_ABSOL(0x0619)
  /*JMP_ABSOL(m19A7)*/
  m19A7();
}
