/*>execute.c
 *
 * Dare Devil Denis
 * BBC version by Simon Pick. Copyright Visions Software Factory.
 * RISC OS Conversion by Michael Foot.
 * Version 1.03 - (09 Feb 2003).
 *
 */

#include "r6502lib.h"

extern void m14B9(void);
extern void m190D(void);
extern void m192C(void);

extern int quit;

void m0EF6(void)
{
m0EF6:
  LDA_IMMED(0x0F)
  LDX_IMMED(0x00)
  OSBYTE
  LDA_IMMED(0x0D)
  LDX_IMMED(0x04)
  OSBYTE
  /*disable escape*/
  /*LDY_IMMED(0x00)
  LDA_IMMED(0xDC)
  LDX_IMMED(0xFF)
  OSBYTE*/
  LDA_IMMED(0x16)
  OSWRCH
  LDA_IMMED(0x07)
  OSWRCH
  WAIT_FOR_VERTICAL_SYNC
  bbc_video_mode = 0x07;
  bbc_video_addr = 0x7C00;
  /*JSR_ABSOL(0x190D,m190D)*/
  m190D();
  LDX_IMMED(0x00)
  LDA_IMMED(0x1F)
  OSWRCH
  LDA_IMMED(0x0A)
  OSWRCH
  LDA_IMMED(0x05)
  OSWRCH
m0F2B:
  LDA_ABSXP(0x0E63)
  CMP_IMMED(0x0D)
  BEQ(m0F39)
  OSWRCH
  INX
  JMP_ABSOL(m0F2B)
m0F39:
  INX
  LDA_IMMED(0x41)
  STA_ZEROP(0x70)
  LDA_IMMED(0x07)
  STA_ZEROP(0x71)
m0F42:
  LDA_IMMED(0x1F)
  OSWRCH
  LDA_IMMED(0x0C)
  OSWRCH
  LDA_ZEROP(0x71)
  OSWRCH
  LDA_IMMED(0x86)
  OSWRCH
  LDA_ZEROP(0x70)
  OSWRCH
  LDA_IMMED(0x29)
  OSWRCH
  LDA_IMMED(0x83)
  OSWRCH
m0F65:
  LDA_ABSXP(0x0E63)
  CMP_IMMED(0x0D)
  BEQ(m0F73)
  OSWRCH
  INX
  JMP_ABSOL(m0F65)
m0F73:
  INX
  INC_ZEROP(0x71)
  INC_ZEROP(0x71)
  INC_ZEROP(0x70)
  LDA_ZEROP(0x70)
  CMP_IMMED(0x47)
  BNE(m0F42)
  LDA_IMMED(0x1F)
  OSWRCH
  LDA_IMMED(0x04)
  OSWRCH
  LDA_IMMED(0x13)
  OSWRCH
  LDA_IMMED(0x02)
  STA_ZEROP(0x71)
m0F93:
  LDA_ABSXP(0x0E63)
  CMP_IMMED(0x0D)
  BEQ(m0FA1)
  OSWRCH
  INX
  JMP_ABSOL(m0F93)
m0FA1:
  INX
  DEC_ZEROP(0x71)
  BNE(m0F93)
  LDX_IMMED(0x00)
m0FA8:
  LDA_ABSXP(0x0E5A)
  CMP_ABSXP(0x2F3A)
  BEQ(m0FB5)
  BCC(m0FBF)
  JMP_ABSOL(m0FCC)
m0FB5:
  INX
  CPX_IMMED(0x06)
  BNE(m0FA8)
  JMP_ABSOL(m0FCC)
m0FBF:
  LDX_IMMED(0x00)
m0FC1:
  LDA_ABSXP(0x2F3A)
  STA_ABSOX(0x0E5A)
  INX
  CPX_IMMED(0x06)
  BNE(m0FC1)
m0FCC:
  LDA_IMMED(0x20)
  OSWRCH
  LDA_IMMED(0x60)
  OSWRCH
  LDX_IMMED(0x00)
  LDA_IMMED(0x01)
  STA_ZEROP(0x71)
m0FDC:
  LDA_ABSXP(0x0E5A)
  CMP_IMMED(0x30)
  BNE(m0FF0)
  LDA_ZEROP(0x71)
  CMP_IMMED(0x00)
  BEQ(m0FF0)
  CPX_IMMED(0x05)
  BEQ(m0FF0)
  JMP_ABSOL(m0FFA)
m0FF0:
  LDA_IMMED(0x00)
  STA_ZEROP(0x71)
  LDA_ABSXP(0x0E5A)
  OSWRCH
m0FFA:
  INX
  CPX_IMMED(0x06)
  BNE(m0FDC)
  LDX_IMMED(0x00)
  LDA_IMMED(0x07)
  STA_ZEROP(0x73)
  LDA_IMMED(0x00)
  STA_ZEROP(0x71)
  LDA_IMMED(0x07)
  STA_ZEROP(0x72)
  LDA_IMMED(0x04)
  STA_ZEROP(0x77)
m1011:
  /*wait for key*/
  LDA_IMMED(0x81)
  LDX_IMMED(0x02)
  LDY_IMMED(0x00)
  OSBYTE81
  /*check for escape*/
  if (r6502_x == 0x1B)
  {
    quit = TRUE;
    return;
  }
  TXA

  /*ARB: Convert letter to upper case */
  r6502_a &= ~0x20;

  SEC
  SBC_IMMED(0x41)
  /*store key A-E*/
  STA_ZEROP(0x70)
  /*JMP_ABSOL(m1055)
m1055:*/
  LDX_ZEROP(0x71)
  LDA_IMMED(0x1F) /*31*/
  OSWRCH
  LDA_IMMED(0x0C) /*12*/
  OSWRCH
  LDA_ZEROP(0x73)
  OSWRCH
  LDA_ABSXP(0x2EDF)
  ADC_IMMED(0x80)
  OSWRCH
  INC_ZEROP(0x71)
  LDA_ZEROP(0x71)
  CMP_IMMED(0x0B)
  BNE(m107A)
  LDA_IMMED(0x00)
  STA_ZEROP(0x71)
m107A:
  INC_ZEROP(0x72)
  LDA_ZEROP(0x72)
  CMP_IMMED(0x0B)
  BNE(m1092)
  LDA_IMMED(0x00)
  STA_ZEROP(0x72)
  INC_ZEROP(0x73)
  LDA_ZEROP(0x73)
  CMP_IMMED(0x13)
  BNE(m1092)
  LDA_IMMED(0x07)
  STA_ZEROP(0x73)
m1092:
  DEC_ZEROP(0x77)
  BNE(m10D4)
  LDA_IMMED(0x07)
  STA_ZEROP(0x77)
  LDA_IMMED(0x1F)
  OSWRCH
  LDA_IMMED(0x00)
  OSWRCH
  LDA_IMMED(0x16)
  OSWRCH
  LDA_IMMED(0x86)
  OSWRCH
  LDX_IMMED(0x00)
m10B0:
  LDA_ABSXP(0x0E00)
  OSWRCH
  INX
  CPX_IMMED(0x26)
  BNE(m10B0)
  LDA_ABSOL(0x0E00)
  STA_ZEROP(0x74)
  LDX_IMMED(0x00)
m10C2:
  /*shuffle the scrolly text*/
  INX
  LDA_ABSXP(0x0E00)
  DEX
  STA_ABSOX(0x0E00)
  INX
  CPX_IMMED(0x56)
  BNE(m10C2)
  LDA_ZEROP(0x74)
  STA_ABSOX(0x0E00)
m10D4:
  /*check for key A-E*/
  LDA_ZEROP(0x70)
  CMP_IMMED(0x06)
  BCC(m10DD)
  JMP_ABSOL(m1011)
m10DD:
  LDX_ZEROP(0x70)
  LDA_ABSXP(0x0EF0)
  STA_ZEROP(0x70)
  LDX_IMMED(0x00)
  LDA_IMMED(0x30)
m10E8:
  STA_ABSOX(0x2F3A)
  INX
  CPX_IMMED(0x06)
  BNE(m10E8)
  LDA_IMMED(0x01)
  STA_ABSOL(0x181C)
  LDA_ZEROP(0x70)
  STA_ABSOL(0x2FE3)
  LDA_IMMED(0xFF)
  STA_ABSOL(0x181B)
  LDA_IMMED(0x4C)
  STA_ABSOL(0x174B)
  LDA_IMMED(0xCA)
  STA_ABSOL(0x174C)
  LDA_IMMED(0x80)
  STA_ABSOL(0x166F)
  LDA_IMMED(0x01)
  STA_ABSOL(0x1670)
  LDA_IMMED(0x01)
  STA_ABSOL(0x0C09)
  /*JSR_ABSOL(0x192C,m192C)*/
  m192C();
  /*JSR_ABSOL(0x14B9,m14B9)*/
  m14B9();
  JMP_ABSOL(m0EF6)
}

void execute(void)
{
  goto m3475;

m3408:
  LDA_IMMED(0x16)
  OSWRCH
  LDA_IMMED(0x07)
  OSWRCH
  WAIT_FOR_VERTICAL_SYNC
  bbc_video_mode = 0x07;
  bbc_video_addr = 0x7C00;
  /*JSR_ABSOL(0x190D,m190D)*/
  m190D();
  LDA_IMMED(0x00)
  STA_ZEROP(0x70)
  LDA_IMMED(0x7C)
  STA_ZEROP(0x71)
  LDA_IMMED(0x02)
  STA_ZEROP(0x72)
  LDA_IMMED(0x30)
  STA_ZEROP(0x73)
  LDY_IMMED(0x00)
m3427:
  LDA_POSTI(0x72)
  STA_POSTI(0x70)
  INY
  BNE(m3427)
  INC_ZEROP(0x73)
  INC_ZEROP(0x71)
  LDA_ZEROP(0x71)
  CMP_IMMED(0x80)
  BNE(m3427)
  LDX_IMMED(0x00)
m343A:
  STX_ZEROP(0x70)
  /*wait for key*/
  LDX_IMMED(0x02)
  LDY_IMMED(0x00)
  LDA_IMMED(0x81)
  OSBYTE81
  if (r6502_x == 0x1B)
    quit = TRUE;
  else
  {
    /*original code*/
    /*check for space bar*/
    CPX_IMMED(0x20)
    BEQ(m3472)
    LDA_IMMED(0x13)
    OSBYTE
    LDX_ZEROP(0x70)
    LDA_IMMED(0x1F)
    OSWRCH
    LDA_IMMED(0x0C)
    OSWRCH
    LDA_IMMED(0x17)
    OSWRCH
    CLC
    LDA_ABSXP(0x2EDF)
    ADC_IMMED(0x80)
    OSWRCH
    INX
    CPX_IMMED(0x0B)
    BNE(m343A)
    LDX_IMMED(0x00)
    JMP_ABSOL(m343A)
  m3472:
    /*JSR_ABSOL(0x0EF6,m0EF6)*/
    m0EF6();
  }
m3475:
  if (!quit)
  {
    /*original code*/
    LDA_IMMED(0x0D)
    LDX_IMMED(0x04)
    OSBYTE
    LDA_IMMED(0x0F)
    LDX_IMMED(0x00)
    OSBYTE
    JMP_ABSOL(m3408)
  }
}
