fs2port/port/include/chunk5Zp.h

157 lines
7.6 KiB
C

// Zero-page and RAM addresses the port shares with chunk5.
//
// The port runs the scenery bytecode against a 64K RAM image whose
// zero page mirrors chunk5's working variables. Every address the C
// code touches is named here so there is exactly one place that says
// what each cell means.
//
// The RAM image (port/sceneryRam_FS2.1.bin) was captured from the
// FS2.1 release under MAME. FS2.1's chunk5 lays a few cells out
// differently from the FS2 source in src/chunk5.s; those are marked
// "FS2.1 layout" and the source address is given for cross-reference.
#ifndef CHUNK5_ZP_H
#define CHUNK5_ZP_H
// --- Frame setup / section base ------------------------------------
#define ZP_SCRATCH_X 0x18 // L6BB0 scratch X (16-bit)
#define ZP_SCRATCH_Y 0x1B
#define ZP_SCRATCH_Z 0x1E
#define ZP_POLY_MODE 0x2C // polygon-mode flag ($FF while pooling vertices)
#define ZP_BASE_X 0x4A // L631D section base, 24-bit x3 (mid/hi at +0/+1, low at +2)
#define ZP_BASE_Y 0x4D
#define ZP_BASE_Z 0x50
#define ZP_EXPONENT 0x2F // auto-scale exponent of the latest xform-B
#define RAM_PREV_EXPONENT 0x08EE // exponent of the previous xform-B (curve alignment)
#define ZP_SCALE_CACHE 0x35 // $35/$36 = last $68/$69 seen by L631D
#define ZP_AIRCRAFT_X 0x5A // six 16-bit pairs $5A..$65 feeding L6BB0
#define ZP_AIRCRAFT_X_HI 0x5C
#define ZP_AIRCRAFT_Y 0x5E
#define ZP_ALTITUDE 0x5F // 16-bit altitude straddles $5F/$60
#define ZP_AIRCRAFT_Y_HI 0x60
#define ZP_AIRCRAFT_Z 0x62
#define ZP_AIRCRAFT_Z_HI 0x64
#define ZP_CAM_X 0x66 // camera-vs-section deltas $66/$68/$6A
#define ZP_CAM_Y 0x68
#define ZP_CAM_Z 0x6A
#define ZP_MATRIX 0x78 // 3x3 int16 rotation matrix $78..$89 (row-major, LE)
#define ZP_MATRIX_ROW1 0x7E
#define ZP_MATRIX_ROW2 0x84
#define ZP_STREAM_PTR 0x8B // ($8B/$8C) scenery cursor in chunk5; the port keeps a C pointer
// --- Vertex pipeline (source layout; nothing else in the image uses these) ---
#define ZP_V2_CLIPPED 0x8A // EmitClippedLine: V2 was clipped
#define ZP_CURVE_STEP 0x9E // $9E/$A0/$A2 = curve step (x,y,z)
#define ZP_STICKY_OUTCODE 0xB4 // polygon clip pass: side of previous vertex
#define ZP_POOL_COUNT 0xB5 // polygon vertex count
#define ZP_V1_OUTCODE 0xCA
#define ZP_V1 0xCB // V1 x/y/z at $CB..$D0
#define ZP_V1_SCREEN_COL 0xD1
#define ZP_V1_SCREEN_ROW 0xD2
#define ZP_V2_OUTCODE 0xD3 // also the polygon Z-hi AND accumulator in polygon mode
#define ZP_V2 0xD4 // V2 x/y/z at $D4..$D9
#define ZP_V2_SCREEN_COL 0xDA
#define ZP_V2_SCREEN_ROW 0xDB
#define ZP_V1_SHADOW 0x08 // $08..$10 = snapshot of $CA..$D2 (SnapshotVertex1ToShadow)
#define ZP_V2_SHADOW 0xDC // $DC..$E2 = snapshot of $D3..$D9 (EmitClippedLine_ClipV2)
#define ZP_VERTEX_BYTES 6 // x lo/hi, y lo/hi, z lo/hi
#define ZP_VERTEX_RECORD_BYTES 9 // outcode + xyz + screen col/row
// --- Absolute RAM cells --------------------------------------------
#define RAM_CACHED_POOL 0x0140 // 8-byte cached vertex slots (opcodes $31/$32/$33/$35/$42)
#define RAM_CACHED_POOL_CAP 80
#define RAM_CACHED_POOL_STRIDE 8
#define RAM_RADAR_VIEW 0x0836 // RadarView flag
#define RAM_FILL_COLOR 0x0876 // polygon fill colour register (low nibble indexes ToHiresColorTable)
#define RAM_HEADER_SECTION 0x08E5 // $0D HEADER working copy $08E5..$08E9
#define RAM_HEADER_COUNT 0x08E6
#define RAM_HEADER_DEST 0x08E7
#define RAM_HEADER_CACHE_IDX 0x08E9
#define RAM_HEADER_CACHE 0x08EA // 4 cached section ids
#define RAM_V1_CLIPPED 0x08C4 // EmitClippedLine: V1 was clipped
#define RAM_HORIZON_POLY_BASE 0x0A78 // horizon polygon records, 16 bytes per bank quadrant
#define RAM_SCENERY_ENTRY 0xA7E0 // LA7E0: ProcessScenery entry pointer
#define RAM_IO_START 0xC000 // Apple II I/O range; never a valid scenery/load target
#define RAM_IO_END 0xD000
#define RAM_SIZE 0x10000
// --- Screen geometry used by ProjectVertex -------------------------
#define CHUNK5_SCREEN_CENTRE_COL 0x46 // column bias (0..139 colour pixels)
#define CHUNK5_SCREEN_CENTRE_ROW 0x31 // row bias (0..98 viewport rows)
#define CHUNK5_COLOR_COLUMNS 140
#define CHUNK5_POLY_VERTEX_CAP 60 // ProcessVertex2 caps the pool at $3C
// --- Cells and constants shared by several modules (consolidated 2026-09-06) --
#define DEGREES_360 0x168
#define FUEL_BURN_INDEX 0xF2
#define INPUT_MODE_MAGNETO 3
#define NEEDLE_STEPS 0x58
#define RAM_AIRSPEED 0x0A11
#define RAM_ALT_ADJUST 0x099E
#define RAM_ATIS_BUSY 0x0913
#define RAM_ATIS_NAME_PTR 0x092A
#define RAM_BOMB_TIMER 0x0A54
#define RAM_CARB_HEAT 0x0A58
#define RAM_CHT 0x099C
#define RAM_CLIMB_NEEDLE 0x0A36
#define RAM_COM_FREQ 0x089F
#define RAM_COM_GATE 0x0909
#define RAM_COURSE_STEP_A 0x0847
#define RAM_COURSE_STEP_B 0x0849
#define RAM_CRASH_CODE 0x0834
#define RAM_DAY_PHASE 0x083C
#define RAM_ENEMIES_DOWN 0x0898
#define RAM_ENGINE_FAULTS 0x0991
#define RAM_ENVELOPE_TIMER 0x0899
#define RAM_FUEL_LEFT 0x0992
#define RAM_FUEL_RIGHT 0x0995
#define RAM_HEADING 0x09E4
#define RAM_HEADING_ADJUST 0x08AB
#define RAM_LANDING_FLAG 0x089A
#define RAM_MAG_COMPASS 0x08B2
#define RAM_MAG_VAR_A 0x0846
#define RAM_MAG_VAR_B 0x0848
#define RAM_NAV1_FREQ 0x08F7
#define RAM_NAV2_FREQ 0x08F5
#define RAM_NAV_ACTIVE 0x08F4
#define RAM_NAV_GATE 0x08F2
#define RAM_OIL_TEMP 0x099D
#define RAM_PROP_DRAG 0x0A0D
#define RAM_SEASON_SCALE 0x0884
#define RAM_SIDESLIP 0x09C2
#define RAM_STATION_X 0x08FE
#define RAM_STATION_Z 0x08FA
#define RAM_TANK_SELECT 0x0998
#define RAM_TARGET_RPM 0x0990
#define RAM_THROTTLE 0x0A6F
#define RAM_TURB_X 0x08A1
#define RAM_TURN_LATCH 0x08B9
#define RAM_TURN_PREV_PAGE1 0x0A40
#define RAM_TURN_PREV_PAGE2 0x0A41
#define RAM_WAR_REPORT_DUE 0x08C8
#define RPM_IDLE_FLOOR 0x0D
#define ZP_A5 0xA5
#define ZP_A7 0xA7
#define ZP_ALT 0x5F
#define ZP_ALT_LO 0x5F
#define ZP_ATT_BANK 0x6E // $6E/$6F
#define ZP_ATT_HEADING 0x70 // $70/$71
#define ZP_B7 0xB7
#define ZP_B8 0xB8
#define ZP_BC 0xBC
#define ZP_BE 0xBE
#define ZP_C2 0xC2
#define ZP_C4 0xC4
#define ZP_LINE_DX 0x21
#define ZP_LINE_DY 0x22
#define ZP_MAX_ROW 0xF0
#define ZP_MIN_ROW 0xEF
#define ZP_MSG_VALUE 0xB6 // ValueForString
#define ZP_POS_X_HI 0x5C
#define ZP_POS_Z_HI 0x64
#define ZP_SPAN_RIGHT 0x27
#define ZP_TICK_COUNT 0x34
#define ZP_WORK_HI 0x33
#define ZP_WORK_LO 0x32
#endif