/*>execute.c
 *
 * Cybertron Mission
 * BBC version by Matthew Bates. Copyright Micro Power Software 1983.
 * RISC OS Conversion by Michael Foot.
 * Version 1.01 (09 Feb 2003).
 *
 */

#include <stdio.h>
#include <string.h>
#include "r6502lib.h"

extern void m0E02(void);

void execute(void)
{
/*goto m4F80;*/
/*m4F80:
  LDA_IMMED(0x00)
  STA_ZEROP(0x70) 1900
  LDA_IMMED(0x80)
  STA_ZEROP(0x72) 0D80
  LDA_IMMED(0x19)
  STA_ZEROP(0x71) 1900
  LDA_IMMED(0x0D)
  STA_ZEROP(0x73) 0D80
  LDY_IMMED(0x00)
m4F92:
  LDA_POSTI(0x70) 1900
  STA_POSTI(0x72) 0D80
  LDA_ZEROP(0x70) 00
  CLC
  ADC_IMMED(0x01) 01
  STA_ZEROP(0x70) 01
  LDA_ZEROP(0x71) 19
  ADC_IMMED(0x00)
  STA_ZEROP(0x71) 19
  LDA_ZEROP(0x72) 80
  CLC
  ADC_IMMED(0x01) 81
  STA_ZEROP(0x72) 81
  LDA_ZEROP(0x73) 0D
  ADC_IMMED(0x00)
  STA_ZEROP(0x73) 0D
  CMP_IMMED(0x30) 0D80 - 2FFF
  BNE(m4F92)*/
  /*LDX_IMMED(0x00)
m4FB6:
  LDA_ABSXP(0x3B80)
  STA_ABSOX(0x0400)
  LDA_ABSXP(0x3C80)
  STA_ABSOX(0x0500)
  LDA_ABSXP(0x3D80)
  STA_ABSOX(0x0600)
  LDA_ABSXP(0x3E80)
  STA_ABSOX(0x0700)
  INX
  BNE(m4FB6)*/

  memcpy(memory+0x0400,memory+0x3000,0x0400);
  /*memset(memory+0x0B00,0x10,0x0100);*/

  LDA_IMMED(0x06)
  STA_ZEROP(0xC8)
  LDA_IMMED(0x00)
  STA_ZEROP(0xC9)
  LDA_IMMED(0x20)
  STA_ABSOL(0x0CEC)
  STA_ABSOL(0x0CED)
  STA_ABSOL(0x0CEE)
  STA_ABSOL(0x0CEF)
  STA_ABSOL(0x0BB0)
  STA_ABSOL(0x0BB1)
  STA_ABSOL(0x0BB2)
  STA_ABSOL(0x0BB3)
  LDA_IMMED(0x00)
  STA_ABSOL(0x0CEB)
  STA_ABSOL(0x0CEA)
  LDA_IMMED(0x45)
  STA_ZEROP(0x7A)
  LDA_IMMED(0x3D)
  STA_ABSOL(0x2F36)
  LDA_IMMED(0x3F)
  STA_ABSOL(0x2F37)
  LDA_IMMED(0x3E)
  STA_ABSOL(0x2F38)
  STA_ABSOL(0x2F3A)
  LDA_IMMED(0x32)
  STA_ABSOL(0x2F39)
  STA_ABSOL(0x2F3B)
  /*scan for shift key*/
  LDA_IMMED(0x81)
  LDX_IMMED(0x00)
  LDY_IMMED(0xFF)
  OSBYTE81
  STX_ABSOL(0x0C03)

  LDX_IMMED(0x0F)
m5027:
  LDA_ABSXP(0x5170)
  STA_ABSOX(0x0CF0)
  DEX
  BPL(m5027)

  LDA_IMMED(0x16)
  OSWRCH
  LDA_IMMED(0x07)
  OSWRCH
  bbc_video_mode = 0x07;
  bbc_video_addr = 0x7C00;
  getscreenaddress();
  /*cursor off*/
  LDA_IMMED(0x17)
  OSWRCH
  LDA_IMMED(0x00)
  OSWRCH
  LDA_IMMED(0x0A)
  OSWRCH
  LDA_IMMED(0x20)
  OSWRCH
  LDA_IMMED(0x00)
  OSWRCH
  OSWRCH
  OSWRCH
  OSWRCH
  OSWRCH
  OSWRCH
  /*title screen*/
  LDX_IMMED(0x00)
m5064:
  LDA_ABSXP(0x3F80)
  STA_ABSOX(0x7C00)
  LDA_ABSXP(0x4080)
  STA_ABSOX(0x7D00)
  LDA_ABSXP(0x4180)
  STA_ABSOX(0x7E00)
  INX
  BNE(m5064)

  LDX_IMMED(0x00)
  do
  {
    LDA_ABSXP(0x4280)
    STA_ABSOX(0x7F00)
    INX
  }
  while (r6502_x < 0xE8);

m507F:
  LDA_IMMED(0x81)
  LDY_IMMED(0xFF)
  LDX_IMMED(0xBB)
  OSBYTE81
  CPX_IMMED(0x00)
  BNE(m50A9)
  LDA_IMMED(0x81)
  LDY_IMMED(0xFF)
  LDX_IMMED(0xAA)
  OSBYTE81
  CPX_IMMED(0x00)
  BNE(m509C)
  JMP_ABSOL(m507F)
m509C:
  /*LDA_ABSOL(0x0C03)
  BEQ(m50A6)
  LDA_IMMED(0x7D)
  OSBYTE
m50A6:*/
  /*main program*/
  /*JMP_ABSOL(m0E02)*/
  m0E02();
  return;
m50A9:
  /*instructions*/
  LDX_IMMED(0x00)
m50AB:
  LDA_ABSXP(0x4380)
  STA_ABSOX(0x7C00)
  LDA_ABSXP(0x4480)
  STA_ABSOX(0x7D00)
  LDA_ABSXP(0x4580)
  STA_ABSOX(0x7E00)
  INX
  BNE(m50AB)

  LDX_IMMED(0x00)
  do
  {
    LDA_ABSXP(0x4680)
    STA_ABSOX(0x7F00)
    INX
  }
  while (r6502_x < 0xE8);

m50C6:
  LDA_IMMED(0x81)
  LDY_IMMED(0xFF)
  LDX_IMMED(0x9D)
  OSBYTE81
  CPX_IMMED(0x00)
  BNE(m50C6)
m50D3:
  LDA_IMMED(0x81)
  LDY_IMMED(0xFF)
  LDX_IMMED(0x9D)
  OSBYTE81
  CPX_IMMED(0x00)
  BEQ(m50D3)
  LDX_IMMED(0x00)
m50E2:
  LDA_ABSXP(0x4780)
  STA_ABSOX(0x7C00)
  LDA_ABSXP(0x4880)
  STA_ABSOX(0x7D00)
  LDA_ABSXP(0x4980)
  STA_ABSOX(0x7E00)
  INX
  BNE(m50E2)

  LDX_IMMED(0x00)
  do
  {
    LDA_ABSXP(0x4A80)
    STA_ABSOX(0x7F00)
    INX
  }
  while (r6502_x < 0xE8);

m50FD:
  LDA_IMMED(0x81)
  LDY_IMMED(0xFF)
  LDX_IMMED(0x9D)
  OSBYTE81
  CPX_IMMED(0x00)
  BNE(m50FD)
m510A:
  LDA_IMMED(0x81)
  LDY_IMMED(0xFF)
  LDX_IMMED(0x9D)
  OSBYTE81
  CPX_IMMED(0x00)
  BEQ(m510A)
  LDX_IMMED(0x00)
m5119:
  LDA_ABSXP(0x4B80)
  STA_ABSOX(0x7C00)
  LDA_ABSXP(0x4C80)
  STA_ABSOX(0x7D00)
  LDA_ABSXP(0x4D80)
  STA_ABSOX(0x7E00)
  INX
  BNE(m5119)

  LDX_IMMED(0x00)
  do
  {
    LDA_ABSXP(0x4E80)
    STA_ABSOX(0x7F00)
    INX
  }
  while (r6502_x < 0xE8);

m5134:
  LDA_IMMED(0x81)
  LDY_IMMED(0xFF)
  LDX_IMMED(0x9D)
  OSBYTE81
  CPX_IMMED(0x00)
  BNE(m5134)
m5141:
  LDA_IMMED(0x81)
  LDY_IMMED(0xFF)
  LDX_IMMED(0x9D)
  OSBYTE81
  CPX_IMMED(0x00)
  BEQ(m5141)
  JMP_ABSOL(m509C)
}
