Catakig/Source/LibAppleII/LibAppleII-Priv.h

167 lines
4.3 KiB
Objective-C

/* LibAppleII-Priv.h
Private definitions for source files in the LibAppleII library. Client
applications should normally ignore this header. The public API is all
defined in "LibAppleII.h".
*/
#import "LibAppleII.h"
#import "MyUtils.h"
#define LENGTH(ARRAY_1D) \
( sizeof(ARRAY_1D) / sizeof(ARRAY_1D[0]) )
// number of elements in a one-dimensional array
#define DFLAG(SHIFT, NAME) \
ks##NAME = (SHIFT), kf##NAME = 1U << ks##NAME,
// defines bit-flag constants with ease
#define IS_OPEN(FD) ((FD) >= 0)
#define CLOSE(FD) (close(FD), -1)
#define REWIND(FD) lseek((FD), 0, SEEK_SET)
#define TELL(FD) lseek((FD), 0, SEEK_CUR)
//---------------------------------------------------------------------------
// Handy integer constants.
enum
{
//-------------------------------------------------------------
// File format identifiers
kFmtUnknown = 0,
kFmtDO, kFmtPO, kFmtNIB, kFmtHDV,
kFmt2IMG_DO, kFmt2IMG_PO, kFmt2IMG_NIB, kFmt2IMG_HDV,
kFmtGZip, kFmtBZip,
kFmtSHK, kFmtBSC, kFmtBinaryII,
kFmtNB2, kFmtDiskCopy4, // kFmtCopyIIPlus, kFmtFDI,
//-------------------------------------------------------------
// Apple II soft-switch flags (used in A2Computer field 'mFlags').
DFLAG( 0, TEXT) // flags affecting video display
DFLAG( 1, MIXED)
DFLAG( 2, 80COL)
DFLAG( 3, SINGRES) // (inverse of "DHIRES" flag)
DFLAG( 4, HIRESv)
DFLAG( 5, PAGE2v)
DFLAG( 6, 80STOREv)
DFLAG( 7, ALTCHAR)
DFLAG( 8, RAMWRT) // flags affecting memory writes
DFLAG( 9, LCWRTlo)
DFLAG(10, LCWRThi)
DFLAG(11, ALTZP) // flags affecting memory reads and writes
DFLAG(12, LCBANK2)
DFLAG(13, HIRESm)
DFLAG(14, PAGE2m)
DFLAG(15, 80STOREm)
DFLAG(16, RAMRD) // flags affecting memory reads
DFLAG(17, LCRD)
DFLAG(18, CXROM)
DFLAG(19, C3ROM)
DFLAG(20, HotSlot)
// DFLAG(21, HotSlot1)
// DFLAG(22, HotSlot2)
ksWMap = ksRAMWRT, kmWMap = (1 << (3+5)) - 1,
ksRMap = ksALTZP, kmRMap = (1 << (5+7)) - 1,
DFLAG(28, XYMASK) // IIc flags
DFLAG(29, VBLMASK)
DFLAG(30, X0EDGE)
DFLAG(31, Y0EDGE)
//-------------------------------------------------------------
// Miscellany
DFLAG(0, HaltNoPower) // flags for 'mHalts' field of A2Computer
DFLAG(1, HaltReset)
kTapRatio = 5,
kFilterRes = 128,
kFilterSize = kFilterRes * kTapRatio,
kBadFD = -1,
kLightSustain = 5 << 4,
k64KB = 1UL << 16,
// k1MB = 1UL << 20,
};
//---------------------------------------------------------------------------
// Type definitions.
typedef int fd_t; // file descriptor
typedef uint32_t PixelGroup; // a run of four 8-bit pixels
typedef struct A2IWM A2IWM;
//typedef struct A2PSG A2PSG;
typedef struct A2Memory
{
uint8_t
RAM[8][2][0x2000], // main and aux RAM (64 KB each)
ROM[2][0x4000], // up to 2 banks of ROM
WOM[0x800], // write-only memory (for ROM writes)
altSlotROM[0x800],
pad_[0x1000], // pad struct up to next 0x2000 boundary
diskBuffers[4][0x2000];
} A2Memory;
//---------------------------------------------------------------------------
extern struct A2PrivateTables
{
uint8_t tPHP[1 << 12];
uint16_t tPLP[0x100],
tROL[0x100 << 3],
tROR[0x100 << 3];
int16_t tADC [0xC40], tSBC [0xC40], // for 65c02
tADCo[0xC40], tSBCo[0xC40]; // for 6502
int8_t rmaps[kmRMap+1][0x80+1],
wmaps[kmWMap+1][0x80+1];
struct {
uint32_t flat;
uint32_t delta[kFilterSize];
} audio;
struct {
uint16_t T[3][8][0x100]; // [charset][row][screen code] -> 14b
uint32_t Hs[0x100]; // 8b -> 14b
} vidBits;
struct {
PixelGroup Ts[1<<(2*2)], Hs[1<<(5*2)], G[16],
Td[1<<(4*2)], Hd[1<<(6+3)];
} vidPix;
uint8_t curTime[32];
} A2T;
//---------------------------------------------------------------------------
// Prototypes of global functions.
#ifdef __cplusplus
extern "C" {
#endif
BOOL A2AppendResourceFile(fd_t fout, NSString* resName);
void A2DumpArray(const char*, const void*, size_t, int);
unsigned A2GleanFileFormat(const void* header, size_t size);
unsigned A2HitIWM(A2IWM* iwm, unsigned ea, unsigned d);
void* A2MemoryMap(void* addr, size_t size, fd_t fd, off_t foff);
fd_t A2OpenTempFile(size_t size);
unsigned A2Random16(void);
void A2WriteEntireFile(fd_t fout, fd_t fin);
void A2WriteFiller(fd_t fout, char fillValue, size_t reps);
#ifdef __cplusplus
}
#endif
//---------------------------------------------------------------------------