/* Soft64View.h - Commodore 64 Emulator for NeXT */
/* Neil Franklin, Morgenweg 8, 8404 Winterthur */
/* version (last revision) 23.5.93 */

/* Data Types */

typedef unsigned char DATA;             /* 8 bit processor */
typedef unsigned short ADDR;            /* 64k addresses */

/* Soft64View Object */

#import <appkit/View.h>

@interface Soft64View:View {
  int auto_load_done;
  int Running; }

- initFrame:(const NXRect *)frameRect;
- drawSelf:(const NXRect *)rects :(int)rectCount;
- appDidInit:sender;
- (BOOL) acceptsFirstResponder;
- becomeFirstResponder;
- resignFirstResponder;
- (BOOL)appAcceptsAnotherFile:sender;
- (int)app:sender openFile:(const char *)filename type:(const char *)aType;
- keyDown:(NXEvent *)theEvent;
- keyUp:(NXEvent *)theEvent;
- openprg:sender;
- freeze64:sender;
- reset64:sender;

@end

/* timer for executing c64_slice() */

void timer_start(id Self);
void timer_stop(void);
void timer_entry(DPSTimedEntry teNumber, double now, char *userData);

/* autotyper - types automatically instead of user */

void auto_init(void);
void auto_type(DATA *Keys);
void auto_load(const DATA *Keys);
void auto_slice(void);

/* entire C64 */

void c64_init(void);
void c64_slice(int ScreenLines);
void c64_abort(char *ErrorMessage);

/* Processor MPU 6510 */

void mpu_init(void);
void mpu_interrupt(int Source, int Set);
void mpu_php(void);
void mpu_plp(void);
void mpu_64us(int ClockCycles);

/* Memory and Address Manager */

void mem_init(void);
void mem_loadrom(char *Name, DATA *Mem, int Length);
DATA mem_rd(ADDR Addr);
void mem_wr(ADDR Addr, DATA Data);

/* VIC */

void vic_init(void);
DATA vic_rd(ADDR Addr);
void vic_wr(ADDR Addr,DATA Data);
void vic_draw_allchar(void);
void vic_draw_char(int X, int Y, DATA Char, DATA Color, DATA Bcolor);
void vic_mem_wr(ADDR Addr, DATA Data);
int vic_64us(void);
void vic_draw_ext(int Line, DATA Color);

/* SID */

void sid_init(void);
DATA sid_rd(ADDR Addr);
void sid_wr(ADDR Addr, DATA data);

/* CIA1 */

void cia1_init(void);
DATA cia1_rd(ADDR Addr);
void cia1_wr(ADDR Addr, DATA Data);
void cia1_64us(void);

/* Keyboard - convert CBM-ASCII into scan codes */

void keyb_init(void);
DATA keyb_rd(DATA Row);
void keyb_down(DATA Key);
void keyb_up(void);

/* CIA2 */

void cia2_init(void);
DATA cia2_rd(ADDR Addr);
void cia2_wr(ADDR Addr, DATA Data);
void cia2_64us(void);
void cia2_iec_stat(DATA Status);

/* Floppy 1541 at address 8 */

void flo_init(void);
DATA flo_rd(void);
void flo_wr(DATA Data);
void flo_atn(DATA Data);
void flo_fopen(int FloSec, DATA *FileName);
