ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
sidreloc.c File Reference
#include <stdint.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <math.h>
#include <stdarg.h>
#include <errno.h>

Go to the source code of this file.

Data Structures

struct  source
struct  value_t
struct  core
struct  progbyte
struct  sidheader
struct  zeropage
struct  constraint
struct  constraintlist
struct  arena

Macros

#define RELEASE   "1.0"
#define PBF_DONT_RELOC   0x01
#define PBF_RELOC   0x02
#define PBF_USED_IN_ZP   0x04
#define PBF_USED_IN_MSB   0x08
#define RETF_OUTOFBOUNDS   0x20
#define RETF_TOLERANCE   0x40
#define getN()
#define getV()
#define getB()
#define getD()
#define getI()
#define getZ()
#define getC()
#define setNVZC(N, V, Z, C)
#define setNZC(N, Z, C)
#define setNZ(N, Z)
#define setZ(Z)
#define setC(C)
#define tick(n)
#define tickIf(p)
#define putMemory(ADDR, VALUE)
#define getMemory(ADDR)
#define push(VALUE)
#define pop()
#define implied(ticks)
#define immediate(ticks)
#define abs(ticks)
#define relative(ticks)
#define indirect(ticks)
#define absx(ticks)
#define absy(ticks)
#define zp(ticks)
#define zpx(ticks)
#define zpy(ticks)
#define indx(ticks)
#define indy(ticks)
#define adc(ticks, adrmode)
#define sbc(ticks, adrmode)
#define cmpR(ticks, adrmode, R)
#define cmp(ticks, adrmode)
#define cpx(ticks, adrmode)
#define cpy(ticks, adrmode)
#define dec(ticks, adrmode)
#define decR(ticks, adrmode, R)
#define dex(ticks, adrmode)
#define dey(ticks, adrmode)
#define inc(ticks, adrmode)
#define incR(ticks, adrmode, R)
#define inx(ticks, adrmode)
#define iny(ticks, adrmode)
#define bit(ticks, adrmode)
#define eor(ticks, adrmode)
#define bitwise(ticks, adrmode, op)
#define and(ticks, adrmode)
#define ora(ticks, adrmode)
#define asl(ticks, adrmode)
#define asla(ticks, adrmode)
#define lsr(ticks, adrmode)
#define lsra(ticks, adrmode)
#define rol(ticks, adrmode)
#define rola(ticks, adrmode)
#define ror(ticks, adrmode)
#define rora(ticks, adrmode)
#define tRS(ticks, adrmode, R1, R2)
#define tax(ticks, adrmode)
#define txa(ticks, adrmode)
#define tay(ticks, adrmode)
#define tya(ticks, adrmode)
#define tsx(ticks, adrmode)
#define txs(ticks, adrmode)
#define ldR(ticks, adrmode, R)
#define lda(ticks, adrmode)
#define ldx(ticks, adrmode)
#define ldy(ticks, adrmode)
#define stR(ticks, adrmode, R)
#define sta(ticks, adrmode)
#define stx(ticks, adrmode)
#define sty(ticks, adrmode)
#define branch(ticks, adrmode, cond)
#define bcc(ticks, adrmode)
#define bcs(ticks, adrmode)
#define bne(ticks, adrmode)
#define beq(ticks, adrmode)
#define bpl(ticks, adrmode)
#define bmi(ticks, adrmode)
#define bvc(ticks, adrmode)
#define bvs(ticks, adrmode)
#define jmp(ticks, adrmode)
#define jsr(ticks, adrmode)
#define rts(ticks, adrmode)
#define brk(ticks, adrmode)
#define rti(ticks, adrmode)
#define nop(ticks, adrmode)
#define ill(ticks, adrmode)
#define pha(ticks, adrmode)
#define php(ticks, adrmode)
#define pla(ticks, adrmode)
#define plp(ticks, adrmode)
#define clF(ticks, adrmode, F)
#define clc(ticks, adrmode)
#define cld(ticks, adrmode)
#define cli(ticks, adrmode)
#define clv(ticks, adrmode)
#define seF(ticks, adrmode, F)
#define sec(ticks, adrmode)
#define sed(ticks, adrmode)
#define sei(ticks, adrmode)
#define do_insns(_)
#define dump()
#define fetch()
#define goto_next()
#define dispatch(num, name, mode, cycles)
#define HASHSIZE   8192
#define C_EXACTLY_ONE   1
#define C_ALIKE   2
#define ARENASIZE   32768

Typedefs

typedef uint8_t byte
typedef uint16_t word

Enumerations

enum  {
  RET_SUCCESS , RET_HEADER , RET_RSID , RET_MUS ,
  RET_BASIC , RET_PSID , RET_PARAM , RET_IO ,
  RET_CONSTR , RET_ZPFULL , RET_VERIFY , RET_PLAYADDR ,
  RET_RANGE , RET_CYCLES
}
enum  {
  ERR_OK , ERR_BRK , ERR_INTERNAL , ERR_ILLEGAL ,
  ERR_CYCLES
}
enum  {
  flagN = (1<<7) , flagV = (1<<6) , flagX = (1<<5) , flagB = (1<<4) ,
  flagD = (1<<3) , flagI = (1<<2) , flagZ = (1<<1) , flagC = (1<<0)
}
enum  {
  OPT_FRAMES = 256 , OPT_NMI_CALLS , OPT_INIT_CYCLES , OPT_PLAY_CYCLES ,
  OPT_NMI_CYCLES
}

Functions

char * sidreloc_get_lasterror_string ()
int sidreloc_set_page (int _page)
int sidreloc_set_page0 (int _first, int _last)
int sidreloc_set_nopage0 ()
int sidreloc_set_reloc (int _start, int _end)
int sidreloc_set_tolerance (int _tolerance)
int sidreloc_set_strict ()
int sidreloc_set_force ()
int sidreloc_set_verbosity (int _verbose)
int sidreloc_set_quiet ()
int sidreloc_set_frames (int _frames)
int sidreloc_set_init_cycles (int _cycles)
int sidreloc_set_play_cycles (int _cycles)
int sidreloc_set_nmi_cycles (int _cycles)
int sidreloc_set_nmi_calls (int _cycles)
int sidreloc_set_input_data (unsigned char *_data, int _size)
int sidreloc_set_output_data (unsigned char *_data)
int sidreloc_main ()

Variables

char * emulate_err []

Macro Definition Documentation

◆ abs

#define abs ( ticks)
Value:
tick(ticks); \
core->read[PC] = 1; \
core->read[PC + 1] = 1; \
src_ea_msb = memory[PC + 1].src; \
ea = memory[PC].value + (memory[PC + 1].value << 8); \
check_reloc_range(ea, memory[PC].src, 0, src_ea_msb); \
PC += 2;
#define tick(n)
Definition sidreloc.c:308
uint8_t read[65536]
Definition sidreloc.c:73

Definition at line 338 of file sidreloc.c.

◆ absx

#define absx ( ticks)
Value:
tick(ticks); \
core->read[PC] = 1; \
core->read[PC + 1] = 1; \
src_ea_msb = memory[PC + 1].src; \
ea = memory[PC].value + (memory[PC + 1].value << 8); \
tickIf((ticks == 4) && ((ea >> 8) != ((ea + X.value) >> 8))); \
ea += X.value; \
check_reloc_range(ea, memory[PC].src, X.src, src_ea_msb); \
PC += 2;
@ X
Definition ugbc.tab.h:950

Definition at line 372 of file sidreloc.c.

◆ absy

#define absy ( ticks)
Value:
tick(ticks); \
core->read[PC] = 1; \
core->read[PC + 1] = 1; \
src_ea_msb = memory[PC + 1].src; \
ea = memory[PC].value + (memory[PC + 1].value << 8); \
tickIf((ticks == 4) && ((ea >> 8) != ((ea + Y.value) >> 8))); \
ea += Y.value; \
check_reloc_range(ea, memory[PC].src, Y.src, src_ea_msb); \
PC += 2;
@ Y
Definition ugbc.tab.h:959

Definition at line 383 of file sidreloc.c.

◆ adc

#define adc ( ticks,
adrmode )

Definition at line 454 of file sidreloc.c.

◆ and

#define and ( ticks,
adrmode )
Value:
bitwise(ticks, adrmode, &)
#define bitwise(ticks, adrmode, op)
Definition sidreloc.c:601

Definition at line 612 of file sidreloc.c.

◆ ARENASIZE

#define ARENASIZE   32768

Definition at line 1095 of file sidreloc.c.

◆ asl

#define asl ( ticks,
adrmode )
Value:
adrmode(ticks); \
{ \
value_t b = getMemory(ea); \
unsigned int i = b.value << 1; \
b.value = i; \
b.src = 0; \
putMemory(ea, b); \
fetch(); \
setNZC(i & 0x80, !i, i >> 8); \
} \
goto_next();
#define getMemory(ADDR)
Definition sidreloc.c:321
uint8_t value
Definition sidreloc.c:67
struct source * src
Definition sidreloc.c:68

Definition at line 615 of file sidreloc.c.

◆ asla

#define asla ( ticks,
adrmode )
Value:
tick(ticks); \
fetch(); \
{ \
int c = A.value >> 7; \
A.value <<= 1; \
A.src = 0; \
setNZC(A.value & 0x80, !A.value, c); \
} \
goto_next();
@ A
Definition ugbc.tab.h:93

Definition at line 628 of file sidreloc.c.

◆ bcc

#define bcc ( ticks,
adrmode )
Value:
branch(ticks, adrmode, !getC())
#define branch(ticks, adrmode, cond)
Definition sidreloc.c:762
#define getC()
Definition sidreloc.c:300

Definition at line 777 of file sidreloc.c.

◆ bcs

#define bcs ( ticks,
adrmode )
Value:
branch(ticks, adrmode, getC())

Definition at line 778 of file sidreloc.c.

◆ beq

#define beq ( ticks,
adrmode )
Value:
branch(ticks, adrmode, getZ())
#define getZ()
Definition sidreloc.c:299

Definition at line 780 of file sidreloc.c.

◆ bit

#define bit ( ticks,
adrmode )
Value:
adrmode(ticks); \
fetch(); \
{ \
value_t B = getMemory(ea); \
P = (P & ~(flagN | flagV | flagZ)) \
| (B.value & (0xC0)) | (((A.value & B.value) == 0) << 1); \
} \
goto_next();
#define B(code, label)
Definition 6309.c:47
@ flagZ
Definition sidreloc.c:283
@ flagN
Definition sidreloc.c:277
@ flagV
Definition sidreloc.c:278
@ P
Definition ugbc.tab.h:623

Definition at line 579 of file sidreloc.c.

◆ bitwise

#define bitwise ( ticks,
adrmode,
op )
Value:
adrmode(ticks); \
fetch(); \
{ \
value_t b = getMemory(ea); \
A.value op##= b.value; \
A.src = 0; \
} \
setNZ(A.value & 0x80, !A.value); \
goto_next();

Definition at line 601 of file sidreloc.c.

◆ bmi

#define bmi ( ticks,
adrmode )
Value:
branch(ticks, adrmode, getN())
#define getN()
Definition sidreloc.c:294

Definition at line 782 of file sidreloc.c.

◆ bne

#define bne ( ticks,
adrmode )
Value:
branch(ticks, adrmode, !getZ())

Definition at line 779 of file sidreloc.c.

◆ bpl

#define bpl ( ticks,
adrmode )
Value:
branch(ticks, adrmode, !getN())

Definition at line 781 of file sidreloc.c.

◆ branch

#define branch ( ticks,
adrmode,
cond )
Value:
if (cond) \
{ \
adrmode(ticks); \
PC += ea; \
tick(1); \
} \
else \
{ \
tick(ticks); \
PC++; \
} \
fetch(); \
goto_next();

Definition at line 762 of file sidreloc.c.

◆ brk

#define brk ( ticks,
adrmode )
Value:
tick(ticks); \
return ERR_BRK;
@ ERR_BRK
Definition sidreloc.c:107

Definition at line 825 of file sidreloc.c.

◆ bvc

#define bvc ( ticks,
adrmode )
Value:
branch(ticks, adrmode, !getV())
#define getV()
Definition sidreloc.c:295

Definition at line 783 of file sidreloc.c.

◆ bvs

#define bvs ( ticks,
adrmode )
Value:
branch(ticks, adrmode, getV())

Definition at line 784 of file sidreloc.c.

◆ C_ALIKE

#define C_ALIKE   2

Definition at line 1073 of file sidreloc.c.

◆ C_EXACTLY_ONE

#define C_EXACTLY_ONE   1

Definition at line 1072 of file sidreloc.c.

◆ clc

#define clc ( ticks,
adrmode )
Value:
clF(ticks, adrmode, flagC)
@ flagC
Definition sidreloc.c:284
#define clF(ticks, adrmode, F)
Definition sidreloc.c:889

Definition at line 895 of file sidreloc.c.

◆ cld

#define cld ( ticks,
adrmode )
Value:
clF(ticks, adrmode, flagD)
@ flagD
Definition sidreloc.c:281

Definition at line 896 of file sidreloc.c.

◆ clF

#define clF ( ticks,
adrmode,
F )
Value:
fetch(); \
tick(ticks); \
P &= ~F; \
goto_next();
#define fetch()
@ F
Definition ugbc.tab.h:368

Definition at line 889 of file sidreloc.c.

◆ cli

#define cli ( ticks,
adrmode )
Value:
clF(ticks, adrmode, flagI)
@ flagI
Definition sidreloc.c:282

Definition at line 897 of file sidreloc.c.

◆ clv

#define clv ( ticks,
adrmode )
Value:
clF(ticks, adrmode, flagV)

Definition at line 898 of file sidreloc.c.

◆ cmp

#define cmp ( ticks,
adrmode )
Value:
cmpR(ticks, adrmode, A)
#define cmpR(ticks, adrmode, R)
Definition sidreloc.c:522

Definition at line 533 of file sidreloc.c.

◆ cmpR

#define cmpR ( ticks,
adrmode,
R )
Value:
adrmode(ticks); \
fetch(); \
{ \
value_t B = getMemory(ea); \
byte d = R.value - B.value; \
reloc_alike(B, R); \
setNZC(d & 0x80, !d, R.value >= B.value); \
} \
goto_next();
@ R
Definition ugbc.tab.h:696

Definition at line 522 of file sidreloc.c.

◆ cpx

#define cpx ( ticks,
adrmode )
Value:
cmpR(ticks, adrmode, X)

Definition at line 534 of file sidreloc.c.

◆ cpy

#define cpy ( ticks,
adrmode )
Value:
cmpR(ticks, adrmode, Y)

Definition at line 535 of file sidreloc.c.

◆ dec

#define dec ( ticks,
adrmode )
Value:
adrmode(ticks); \
fetch(); \
{ \
value_t B = getMemory(ea); \
--B.value; \
putMemory(ea, B); \
setNZ(B.value & 0x80, !B.value); \
} \
goto_next();

Definition at line 537 of file sidreloc.c.

◆ decR

#define decR ( ticks,
adrmode,
R )
Value:
fetch(); \
tick(ticks); \
--R.value; \
setNZ(R.value & 0x80, !R.value); \
goto_next();

Definition at line 548 of file sidreloc.c.

◆ dex

#define dex ( ticks,
adrmode )
Value:
decR(ticks, adrmode, X)
#define decR(ticks, adrmode, R)
Definition sidreloc.c:548

Definition at line 555 of file sidreloc.c.

◆ dey

#define dey ( ticks,
adrmode )
Value:
decR(ticks, adrmode, Y)

Definition at line 556 of file sidreloc.c.

◆ dispatch

#define dispatch ( num,
name,
mode,
cycles )
Value:
_##num: name(cycles, mode) return ERR_INTERNAL;
char * name
Definition _optimizer.c:672
@ ERR_INTERNAL
Definition sidreloc.c:108

◆ do_insns

#define do_insns ( _)

Definition at line 912 of file sidreloc.c.

◆ dump

#define dump ( )

◆ eor

#define eor ( ticks,
adrmode )
Value:
adrmode(ticks); \
fetch(); \
{ \
value_t b = getMemory(ea); \
reloc_alike(A, b); \
A.value ^= b.value; \
A.src = 0; \
} \
setNZ(A.value & 0x80, !A.value); \
goto_next();

Definition at line 589 of file sidreloc.c.

◆ fetch

#define fetch ( )
Value:
{ value_t v = memory[PC]; core->read[PC] = 1; dump(); PC++; dont_reloc(v.src); opcode = v.value; tpc = itabp[opcode]; }
#define dump()

◆ getB

#define getB ( )
Value:
(P & flagB)
@ flagB
Definition sidreloc.c:280

Definition at line 296 of file sidreloc.c.

◆ getC

#define getC ( )
Value:
(P & flagC)

Definition at line 300 of file sidreloc.c.

◆ getD

#define getD ( )
Value:
(P & flagD)

Definition at line 297 of file sidreloc.c.

◆ getI

#define getI ( )
Value:
(P & flagI)

Definition at line 298 of file sidreloc.c.

◆ getMemory

#define getMemory ( ADDR)
Value:
(core->read[ADDR] = 1, memory[ADDR])

Definition at line 321 of file sidreloc.c.

◆ getN

#define getN ( )
Value:
(P & flagN)

Definition at line 294 of file sidreloc.c.

◆ getV

#define getV ( )
Value:
(P & flagV)

Definition at line 295 of file sidreloc.c.

◆ getZ

#define getZ ( )
Value:
(P & flagZ)

Definition at line 299 of file sidreloc.c.

◆ goto_next

#define goto_next ( )
Value:
goto *tpc

◆ HASHSIZE

#define HASHSIZE   8192

Definition at line 1070 of file sidreloc.c.

◆ ill

#define ill ( ticks,
adrmode )
Value:
goto illegal_instr;

Definition at line 850 of file sidreloc.c.

◆ immediate

#define immediate ( ticks)
Value:
tick(ticks); \
src_ea_msb = src_pc_msb; \
ea = PC++;

Definition at line 333 of file sidreloc.c.

◆ implied

#define implied ( ticks)
Value:
tick(ticks);

Definition at line 330 of file sidreloc.c.

◆ inc

#define inc ( ticks,
adrmode )
Value:
adrmode(ticks); \
fetch(); \
{ \
value_t B = getMemory(ea); \
++B.value; \
putMemory(ea, B); \
setNZ(B.value & 0x80, !B.value); \
} \
goto_next();

Definition at line 558 of file sidreloc.c.

◆ incR

#define incR ( ticks,
adrmode,
R )
Value:
fetch(); \
tick(ticks); \
++R.value; \
setNZ(R.value & 0x80, !R.value); \
goto_next();

Definition at line 569 of file sidreloc.c.

◆ indirect

#define indirect ( ticks)
Value:
tick(ticks); \
{ \
word tmp; \
core->read[PC] = 1; \
core->read[PC + 1] = 1; \
tmp = memory[PC].value + (memory[PC + 1].value << 8); \
check_reloc_range(tmp, memory[PC].src, 0, memory[PC + 1].src); \
core->read[tmp] = 1; \
core->read[tmp + 1] = 1; \
src_ea_msb = memory[tmp + 1].src; \
ea = memory[tmp].value + (memory[tmp + 1].value << 8); \
check_reloc_range(ea, memory[tmp].src, 0, src_ea_msb); \
PC += 2; \
}
uint16_t word
Definition sidreloc.c:274

Definition at line 356 of file sidreloc.c.

◆ indx

#define indx ( ticks)
Value:
tick(ticks); \
{ \
byte tmp = memory[PC].value + X.value; \
core->read[PC] = 1; \
used_for_zp_addr(memory[PC].src, X.src, tmp); \
used_for_zp_addr(memory[PC].src, X.src, tmp + 1); \
core->read[tmp] = 1; \
core->read[tmp + 1] = 1; \
src_ea_msb = memory[tmp + 1].src; \
ea = memory[tmp].value + (memory[tmp + 1].value << 8); \
check_reloc_range(ea, memory[tmp].src, 0, src_ea_msb); \
PC++; \
}

Definition at line 420 of file sidreloc.c.

◆ indy

#define indy ( ticks)
Value:
tick(ticks); \
{ \
byte tmp = memory[PC].value; \
core->read[PC] = 1; \
used_for_zp_addr(memory[PC].src, 0, tmp); \
used_for_zp_addr(memory[PC].src, 0, tmp + 1); \
PC++; \
core->read[tmp] = 1; \
core->read[tmp + 1] = 1; \
src_ea_msb = memory[tmp + 1].src; \
ea = memory[tmp].value + (memory[tmp + 1].value << 8); \
tickIf((ticks == 5) && ((ea >> 8) != ((ea + Y.value) >> 8))); \
ea += Y.value; \
check_reloc_range(ea, memory[tmp].src, Y.src, src_ea_msb); \
}

Definition at line 435 of file sidreloc.c.

◆ inx

#define inx ( ticks,
adrmode )
Value:
incR(ticks, adrmode, X)
#define incR(ticks, adrmode, R)
Definition sidreloc.c:569

Definition at line 576 of file sidreloc.c.

◆ iny

#define iny ( ticks,
adrmode )
Value:
incR(ticks, adrmode, Y)

Definition at line 577 of file sidreloc.c.

◆ jmp

#define jmp ( ticks,
adrmode )
Value:
adrmode(ticks); \
PC = ea; \
src_pc_msb = src_ea_msb; \
fetch(); \
goto_next();

Definition at line 786 of file sidreloc.c.

◆ jsr

#define jsr ( ticks,
adrmode )
Value:
PC++; \
{ \
value_t v; \
v.src = src_pc_msb; \
v.value = PC >> 8; \
push(v); \
v.src = 0; \
v.value = PC & 0xff; \
push(v); \
} \
PC--; \
adrmode(ticks); \
PC = ea; \
src_pc_msb = src_ea_msb; \
fetch(); \
goto_next();

Definition at line 793 of file sidreloc.c.

◆ lda

#define lda ( ticks,
adrmode )
Value:
ldR(ticks, adrmode, A)
#define ldR(ticks, adrmode, R)
Definition sidreloc.c:741

Definition at line 748 of file sidreloc.c.

◆ ldR

#define ldR ( ticks,
adrmode,
R )
Value:
adrmode(ticks); \
fetch(); \
R = getMemory(ea); \
setNZ(R.value & 0x80, !R.value); \
goto_next();

Definition at line 741 of file sidreloc.c.

◆ ldx

#define ldx ( ticks,
adrmode )
Value:
ldR(ticks, adrmode, X)

Definition at line 749 of file sidreloc.c.

◆ ldy

#define ldy ( ticks,
adrmode )
Value:
ldR(ticks, adrmode, Y)

Definition at line 750 of file sidreloc.c.

◆ lsr

#define lsr ( ticks,
adrmode )
Value:
adrmode(ticks); \
{ \
value_t b = getMemory(ea); \
int c= b.value & 1; \
fetch(); \
b.value >>= 1; \
b.src = 0; \
putMemory(ea, b); \
setNZC(0, !b.value, c); \
} \
goto_next();

Definition at line 639 of file sidreloc.c.

◆ lsra

#define lsra ( ticks,
adrmode )
Value:
tick(ticks); \
fetch(); \
{ \
int c = A.value & 1; \
A.value >>= 1; \
A.src = 0; \
setNZC(0, !A.value, c); \
} \
goto_next();

Definition at line 652 of file sidreloc.c.

◆ nop

#define nop ( ticks,
adrmode )
Value:
adrmode(ticks); \
fetch(); \
goto_next();

Definition at line 845 of file sidreloc.c.

◆ ora

#define ora ( ticks,
adrmode )
Value:
bitwise(ticks, adrmode, |)

Definition at line 613 of file sidreloc.c.

◆ PBF_DONT_RELOC

#define PBF_DONT_RELOC   0x01

Definition at line 83 of file sidreloc.c.

◆ PBF_RELOC

#define PBF_RELOC   0x02

Definition at line 84 of file sidreloc.c.

◆ PBF_USED_IN_MSB

#define PBF_USED_IN_MSB   0x08

Definition at line 86 of file sidreloc.c.

◆ PBF_USED_IN_ZP

#define PBF_USED_IN_ZP   0x04

Definition at line 85 of file sidreloc.c.

◆ pha

#define pha ( ticks,
adrmode )
Value:
fetch(); \
tick(ticks); \
push(A); \
goto_next();

Definition at line 853 of file sidreloc.c.

◆ php

#define php ( ticks,
adrmode )
Value:
fetch(); \
tick(ticks); \
{ \
value_t v; \
v.value = P; \
v.src = 0; \
push(v); \
} \
goto_next();

Definition at line 859 of file sidreloc.c.

◆ pla

#define pla ( ticks,
adrmode )
Value:
fetch(); \
tick(ticks); \
if(S >= 0xff) return ERR_OK; \
A = pop(); \
setNZ(A.value & 0x80, !A.value); \
#define goto_next()
#define setNZ(N, Z)
Definition sidreloc.c:304
#define pop()
Definition sidreloc.c:326
@ ERR_OK
Definition sidreloc.c:106
@ S
Definition ugbc.tab.h:748

Definition at line 870 of file sidreloc.c.

◆ plp

#define plp ( ticks,
adrmode )
Value:
fetch(); \
tick(ticks); \
if(S >= 0xff) return ERR_OK; \
{ \
value_t v = pop(); \
dont_reloc(v.src); \
P = v.value; \
} \
goto_next();

Definition at line 878 of file sidreloc.c.

◆ pop

#define pop ( )
Value:
(memory[++S + 0x0100])

Definition at line 326 of file sidreloc.c.

◆ push

#define push ( VALUE)
Value:
(memory[0x0100 + S--] = (VALUE))
@ VALUE
Definition ugbc.tab.h:906

Definition at line 325 of file sidreloc.c.

◆ putMemory

#define putMemory ( ADDR,
VALUE )
Value:
memory[ADDR] = (VALUE); \
core->written[ADDR] = 1;
uint8_t written[65536]
Definition sidreloc.c:74

Definition at line 317 of file sidreloc.c.

◆ relative

#define relative ( ticks)
Value:
tick(ticks); \
core->read[PC] = 1; \
dont_reloc(memory[PC].src); \
src_ea_msb = src_pc_msb; \
ea = memory[PC++].value; \
if (ea & 0x80) ea -= 0x100; \
tickIf((ea >> 8) != (PC >> 8));

Definition at line 347 of file sidreloc.c.

◆ RELEASE

#define RELEASE   "1.0"

Definition at line 50 of file sidreloc.c.

◆ RETF_OUTOFBOUNDS

#define RETF_OUTOFBOUNDS   0x20

Definition at line 221 of file sidreloc.c.

◆ RETF_TOLERANCE

#define RETF_TOLERANCE   0x40

Definition at line 222 of file sidreloc.c.

◆ rol

#define rol ( ticks,
adrmode )
Value:
adrmode(ticks); \
{ \
value_t v = getMemory(ea); \
word b = (v.value << 1) | getC(); \
v.value = b; \
v.src = 0; \
fetch(); \
putMemory(ea, v); \
setNZC(b & 0x80, !(b & 0xFF), b >> 8); \
} \
goto_next();

Definition at line 663 of file sidreloc.c.

◆ rola

#define rola ( ticks,
adrmode )
Value:
tick(ticks); \
fetch(); \
{ \
word b = (A.value << 1) | getC(); \
A.value = b; \
A.src = 0; \
setNZC(A.value & 0x80, !A.value, b >> 8); \
} \
goto_next();

Definition at line 676 of file sidreloc.c.

◆ ror

#define ror ( ticks,
adrmode )
Value:
adrmode(ticks); \
{ \
int c = getC(); \
value_t m = getMemory(ea); \
value_t n; \
byte b = (c << 7) | (m.value >> 1); \
fetch(); \
n.value = b; \
n.src = 0; \
putMemory(ea, n); \
setNZC(b & 0x80, !b, m.value & 1); \
} \
goto_next();

Definition at line 687 of file sidreloc.c.

◆ rora

#define rora ( ticks,
adrmode )
Value:
adrmode(ticks); \
{ \
int ci = getC(); \
int co = A.value & 1; \
fetch(); \
A.value = (ci << 7) | (A.value >> 1); \
A.src = 0; \
setNZC(A.value & 0x80, !A.value, co); \
} \
goto_next();

Definition at line 702 of file sidreloc.c.

◆ rti

#define rti ( ticks,
adrmode )
Value:
tick(ticks); \
if(S >= 0xfd) return ERR_OK; \
{ \
value_t status = pop(); \
value_t lsb = pop(); \
value_t msb = pop(); \
P = status.value; \
PC = lsb.value | (msb.value << 8); \
src_pc_msb = msb.src; \
dont_reloc(status.src); \
check_reloc_range(PC, lsb.src, 0, msb.src); \
} \
fetch(); \
goto_next();

Definition at line 829 of file sidreloc.c.

◆ rts

#define rts ( ticks,
adrmode )
Value:
tick(ticks); \
if(S >= 0xfe) return ERR_OK; \
{ \
value_t lsb = pop(); \
value_t msb = pop(); \
PC = lsb.value | (msb.value << 8); \
src_pc_msb = msb.src; \
check_reloc_range(PC, lsb.src, 0, msb.src); \
} \
PC++; \
fetch(); \
goto_next();

Definition at line 811 of file sidreloc.c.

◆ sbc

#define sbc ( ticks,
adrmode )

Definition at line 488 of file sidreloc.c.

◆ sec

#define sec ( ticks,
adrmode )
Value:
seF(ticks, adrmode, flagC)
#define seF(ticks, adrmode, F)
Definition sidreloc.c:900

Definition at line 906 of file sidreloc.c.

◆ sed

#define sed ( ticks,
adrmode )
Value:
seF(ticks, adrmode, flagD)

Definition at line 907 of file sidreloc.c.

◆ seF

#define seF ( ticks,
adrmode,
F )
Value:
fetch(); \
tick(ticks); \
P |= F; \
goto_next();

Definition at line 900 of file sidreloc.c.

◆ sei

#define sei ( ticks,
adrmode )
Value:
seF(ticks, adrmode, flagI)

Definition at line 908 of file sidreloc.c.

◆ setC

#define setC ( C)
Value:
(P= (P & ~( flagC)) | (C))
@ C
Definition ugbc.tab.h:182

Definition at line 306 of file sidreloc.c.

◆ setNVZC

#define setNVZC ( N,
V,
Z,
C )
Value:
(P= (P & ~(flagN | flagV | flagZ | flagC)) | (N) | ((V)<<6) | ((Z)<<1) | (C))
@ V
Definition ugbc.tab.h:904
@ N
Definition ugbc.tab.h:581
@ Z
Definition ugbc.tab.h:968

Definition at line 302 of file sidreloc.c.

◆ setNZ

#define setNZ ( N,
Z )
Value:
(P= (P & ~(flagN | flagZ )) | (N) | ((Z)<<1) )

Definition at line 304 of file sidreloc.c.

◆ setNZC

#define setNZC ( N,
Z,
C )
Value:
(P= (P & ~(flagN | flagZ | flagC)) | (N) | ((Z)<<1) | (C))

Definition at line 303 of file sidreloc.c.

◆ setZ

#define setZ ( Z)
Value:
(P= (P & ~( flagZ )) | ((Z)<<1) )

Definition at line 305 of file sidreloc.c.

◆ sta

#define sta ( ticks,
adrmode )
Value:
stR(ticks, adrmode, A)
#define stR(ticks, adrmode, R)
Definition sidreloc.c:752

Definition at line 758 of file sidreloc.c.

◆ stR

#define stR ( ticks,
adrmode,
R )
Value:
adrmode(ticks); \
fetch(); \
putMemory(ea, R); \
goto_next();

Definition at line 752 of file sidreloc.c.

◆ stx

#define stx ( ticks,
adrmode )
Value:
stR(ticks, adrmode, X)

Definition at line 759 of file sidreloc.c.

◆ sty

#define sty ( ticks,
adrmode )
Value:
stR(ticks, adrmode, Y)

Definition at line 760 of file sidreloc.c.

◆ tax

#define tax ( ticks,
adrmode )
Value:
tRS(ticks, adrmode, A, X)
#define tRS(ticks, adrmode, R1, R2)
Definition sidreloc.c:714

Definition at line 721 of file sidreloc.c.

◆ tay

#define tay ( ticks,
adrmode )
Value:
tRS(ticks, adrmode, A, Y)

Definition at line 723 of file sidreloc.c.

◆ tick

#define tick ( n)
Value:
if(max_cycles < n) return ERR_CYCLES; max_cycles -= n
@ ERR_CYCLES
Definition sidreloc.c:110

Definition at line 308 of file sidreloc.c.

◆ tickIf

#define tickIf ( p)

Definition at line 312 of file sidreloc.c.

◆ tRS

#define tRS ( ticks,
adrmode,
R1,
R2 )
Value:
fetch(); \
tick(ticks); \
R2 = R1; \
setNZ(R2.value & 0x80, !R1.value); \
goto_next();

Definition at line 714 of file sidreloc.c.

◆ tsx

#define tsx ( ticks,
adrmode )
Value:
fetch(); \
tick(ticks); \
X.value = S; \
X.src = 0; \
setNZ(S & 0x80, !S); \
goto_next();

Definition at line 726 of file sidreloc.c.

◆ txa

#define txa ( ticks,
adrmode )
Value:
tRS(ticks, adrmode, X, A)

Definition at line 722 of file sidreloc.c.

◆ txs

#define txs ( ticks,
adrmode )
Value:
fetch(); \
tick(ticks); \
dont_reloc(X.src); \
S = X.value; \
goto_next();

Definition at line 734 of file sidreloc.c.

◆ tya

#define tya ( ticks,
adrmode )
Value:
tRS(ticks, adrmode, Y, A)

Definition at line 724 of file sidreloc.c.

◆ zp

#define zp ( ticks)
Value:
tick(ticks); \
core->read[PC] = 1; \
src_ea_msb = 0; \
ea = memory[PC].value; \
used_for_zp_addr(memory[PC].src, 0, ea); \
PC++;

Definition at line 394 of file sidreloc.c.

◆ zpx

#define zpx ( ticks)
Value:
tick(ticks); \
core->read[PC] = 1; \
src_ea_msb = 0; \
ea = memory[PC].value + X.value; \
ea &= 0x00ff; \
used_for_zp_addr(memory[PC].src, X.src, ea); \
PC++;

Definition at line 402 of file sidreloc.c.

◆ zpy

#define zpy ( ticks)
Value:
tick(ticks); \
core->read[PC] = 1; \
src_ea_msb = 0; \
ea = memory[PC].value + Y.value; \
ea &= 0x00ff; \
used_for_zp_addr(memory[PC].src, Y.src, ea); \
PC++;

Definition at line 411 of file sidreloc.c.

Typedef Documentation

◆ byte

typedef uint8_t byte

Definition at line 273 of file sidreloc.c.

◆ word

typedef uint16_t word

Definition at line 274 of file sidreloc.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
flagN 
flagV 
flagX 
flagB 
flagD 
flagI 
flagZ 
flagC 

Definition at line 276 of file sidreloc.c.

◆ anonymous enum

anonymous enum
Enumerator
ERR_OK 
ERR_BRK 
ERR_INTERNAL 
ERR_ILLEGAL 
ERR_CYCLES 

Definition at line 105 of file sidreloc.c.

◆ anonymous enum

anonymous enum
Enumerator
RET_SUCCESS 
RET_HEADER 
RET_RSID 
RET_MUS 
RET_BASIC 
RET_PSID 
RET_PARAM 
RET_IO 
RET_CONSTR 
RET_ZPFULL 
RET_VERIFY 
RET_PLAYADDR 
RET_RANGE 
RET_CYCLES 

Definition at line 88 of file sidreloc.c.

◆ anonymous enum

anonymous enum
Enumerator
OPT_FRAMES 
OPT_NMI_CALLS 
OPT_INIT_CYCLES 
OPT_PLAY_CYCLES 
OPT_NMI_CYCLES 

Definition at line 2008 of file sidreloc.c.

Function Documentation

◆ sidreloc_get_lasterror_string()

char * sidreloc_get_lasterror_string ( )

Definition at line 2022 of file sidreloc.c.

◆ sidreloc_main()

int sidreloc_main ( )

Definition at line 2162 of file sidreloc.c.

◆ sidreloc_set_force()

int sidreloc_set_force ( )

Definition at line 2082 of file sidreloc.c.

◆ sidreloc_set_frames()

int sidreloc_set_frames ( int _frames)

Definition at line 2097 of file sidreloc.c.

◆ sidreloc_set_init_cycles()

int sidreloc_set_init_cycles ( int _cycles)

Definition at line 2107 of file sidreloc.c.

◆ sidreloc_set_input_data()

int sidreloc_set_input_data ( unsigned char * _data,
int _size )

Definition at line 2151 of file sidreloc.c.

◆ sidreloc_set_nmi_calls()

int sidreloc_set_nmi_calls ( int _cycles)

Definition at line 2137 of file sidreloc.c.

◆ sidreloc_set_nmi_cycles()

int sidreloc_set_nmi_cycles ( int _cycles)

Definition at line 2127 of file sidreloc.c.

◆ sidreloc_set_nopage0()

int sidreloc_set_nopage0 ( )

Definition at line 2049 of file sidreloc.c.

◆ sidreloc_set_output_data()

int sidreloc_set_output_data ( unsigned char * _data)

Definition at line 2157 of file sidreloc.c.

◆ sidreloc_set_page()

int sidreloc_set_page ( int _page)

Definition at line 2026 of file sidreloc.c.

◆ sidreloc_set_page0()

int sidreloc_set_page0 ( int _first,
int _last )

Definition at line 2036 of file sidreloc.c.

◆ sidreloc_set_play_cycles()

int sidreloc_set_play_cycles ( int _cycles)

Definition at line 2117 of file sidreloc.c.

◆ sidreloc_set_quiet()

int sidreloc_set_quiet ( )

Definition at line 2092 of file sidreloc.c.

◆ sidreloc_set_reloc()

int sidreloc_set_reloc ( int _start,
int _end )

Definition at line 2054 of file sidreloc.c.

◆ sidreloc_set_strict()

int sidreloc_set_strict ( )

Definition at line 2077 of file sidreloc.c.

◆ sidreloc_set_tolerance()

int sidreloc_set_tolerance ( int _tolerance)

Definition at line 2067 of file sidreloc.c.

◆ sidreloc_set_verbosity()

int sidreloc_set_verbosity ( int _verbose)

Definition at line 2087 of file sidreloc.c.

Variable Documentation

◆ emulate_err

char* emulate_err[]
Initial value:
= {
"BRK instruction",
"Internal CPU emulator error",
"Illegal opcode",
"Max cycles exhausted (infinite loop?)",
}

Definition at line 287 of file sidreloc.c.