jaguar.inc
theRemovers_rmvlib/include/jaguar.inc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	JAGUAR.INC  Hardware Equates for JAGUAR System
;
;	COPYRIGHT 1992-1994 Atari Computer Corporation
;	UNAUTHORIZED REPRODUCTION, ADAPTATION, DISTRIBUTION,
;	PERFORMANCE OR DISPLAY OF THIS COMPUTER PROGRAM OR
;	THE ASSOCIATED AUDIOVISUAL WORK IS STRICTLY PROHIBITED.
;	ALL RIGHTS RESERVED.
;
;      Last Modified: 9/19/94 - SDS
;                     2/16/95 - MF
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	.if	^^defined	__JAGUAR_H
	.print	"jaguar.inc already included"
	end
	.endif
__JAGUAR_H	equ	1

	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;      GENERIC DEFINES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DRAM		EQU	$000000	; First system RAM location
USERRAM		EQU	$004000	; Beginning of non-reserved RAM
ENDRAM		EQU	$200000	; End of DRAM
INITSTACK	EQU	ENDRAM-4	; Good place to initialize stack

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;      CPU REGISTERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LEVEL0		EQU	$100		; 68000 Level 0 Autovector Interrupt
USER0		EQU	$100		; Pseudonym for LEVEL0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Masks for INT1 CPU Interrupt Control Register

C_VIDENA	EQU	$0001		; Enable Video time-base interrupts
C_GPUENA	EQU	$0002		; Enable GPU register-write interrupt
C_OPENA		EQU	$0004		; Enable OP stop-object interrupt
C_PITENA	EQU	$0008		; Enable PIT interrupt
C_JERENA	EQU	$0010		; Enable Jerry interrupt

C_VIDCLR	EQU	$0100		; Clear pending video interrupts
C_GPUCLR	EQU	$0200		; Clear pending GPU interrupts
C_OPCLR		EQU	$0400		; Clear pending OP interrupts
C_PITCLR	EQU	$0800		; Clear pending PIT interrupts
C_JERCLR	EQU	$1000		; Clear pending Jerry interrupts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	JAGUAR REGISTERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BASE		EQU	$F00000	; TOM Internal Register Base

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	TOM REGISTERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

HC		EQU	BASE+4	; Horizontal Count
VC		EQU	BASE+6	; Vertical Count
LPH		EQU	BASE+8	; Horizontal Lightpen
LPV		EQU	BASE+$0A	; Vertical Lightpen
OB0		EQU	BASE+$10	; Current Object Phrase
OB1		EQU	BASE+$12
OB2		EQU	BASE+$14
OB3		EQU	BASE+$16
OLP		EQU	BASE+$20	; Object List Pointer
OBF		EQU	BASE+$26	; Object Processor Flag
VMODE		EQU	BASE+$28	; Video Mode
BORD1		EQU	BASE+$2A	; Border Color (Red & Green)
BORD2		EQU	BASE+$2C	; Border Color (Blue)
HDB1		EQU	BASE+$38	; Horizontal Display Begin One
HDB2		EQU	BASE+$3A	; Horizontal Display Begin Two
HDE		EQU	BASE+$3C	; Horizontal Display End
VS		EQU	BASE+$44	; Vertical Sync
VDB		EQU	BASE+$46	; Vertical Display Begin
VDE		EQU	BASE+$48	; Vertical Display End
VI		EQU	BASE+$4E	; Vertical Interrupt
PIT0		EQU	BASE+$50	; Programmable Interrupt Timer (Lo)
PIT1		EQU	BASE+$52	; Programmable Interrupt Timer (Hi)
BG		EQU	BASE+$58	; Background Color

INT1		EQU	BASE+$E0	; CPU Interrupt Control Register
INT2		EQU	BASE+$E2	; CPU Interrupt Resume Register

CLUT		EQU	BASE+$400	; Color Lookup Table

LBUFA		EQU	BASE+$800	; Line Buffer A
LBUFB		EQU	BASE+$1000	; Line Buffer B
LBUFC		EQU	BASE+$1800	; Line Buffer Current

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;      OBJECT PROCESSOR EQUATES 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BITOBJ		EQU	0
SCBITOBJ	EQU	1
GPUOBJ		EQU	2
BRANCHOBJ	EQU	3
STOPOBJ		EQU	4

O_REFLECT	EQU	$00002000	; OR with top LONG of BITMAP object
O_RMW		EQU	$00004000
O_TRANS		EQU	$00008000
O_RELEASE	EQU	$00010000

O_DEPTH1	EQU	(0<<12)	; DEPTH Field for BITMAP objects
O_DEPTH2	EQU	(1<<12)
O_DEPTH4	EQU	(2<<12)
O_DEPTH8	EQU	(3<<12)
O_DEPTH16	EQU	(4<<12)
O_DEPTH32	EQU	(5<<12)

O_NOGAP		EQU	(1<<15)	; Phrase GAP between image phrases
O_1GAP		EQU	(2<<15)
O_2GAP		EQU	(3<<15)
O_3GAP		EQU	(4<<15)
O_4GAP		EQU	(5<<15)
O_5GAP		EQU	(6<<15)
O_6GAP		EQU	(7<<15)

O_BREQ		EQU	(0<<14)	; CC field of BRANCH objects
O_BRGT		EQU	(1<<14)
O_BRLT		EQU	(2<<14)
O_BROP		EQU	(3<<14)
O_BRHALF	EQU	(4<<14)

O_STOPINTS	EQU	$00000008	; Enable Interrupts in STOP object

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;      VIDEO INITIALIZATION CONSTANTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

NTSC_WIDTH	EQU	1409		; Width of screen in pixel clocks
NTSC_HMID	EQU	823		; Middle of screen in pixel clocks
NTSC_HEIGHT	EQU	241		; Height of screen in scanlines
NTSC_VMID	EQU	266		; Middle of screen in halflines

PAL_WIDTH	EQU	1381		; Same as above for PAL...
PAL_HMID	EQU	843
PAL_HEIGHT	EQU	287
PAL_VMID	EQU	322

;;; The following mask will extract the PAL/NTSC flag bit from the
;;; CONFIG register. NTSC = Bit Set, PAL = Bit Clear

VIDTYPE		EQU	$10 

;;; The following are Video Mode register flags

VIDEN		EQU	$0001		; Enable video-time base generator

CRY16		EQU	$0000		; Enable 16-bit CRY mode
RGB24		EQU	$0002		; Enable 24-bit RGB mode
DIRECT16	EQU	$0004		; Enable 16-bit DIRECT mode
RGB16		EQU	$0006		; Enable 16-bit RGB mode

GENLOCK		EQU	$0008		; Not Supported in Jaguar Console
INCEN		EQU	$0010		; Enable encrustation
BINC		EQU	$0020		; Select local border color
CSYNC		EQU	$0040		; Enable composite sync
BGEN		EQU	$0080		; Clear line buffer to BG
VARMOD		EQU	$0100		; Enable variable-color resolution mode

PWIDTH1		EQU	$0000		; Select pixels 1 clock wide
PWIDTH2		EQU	$0200		; Select pixels 2 clocks wide
PWIDTH3		EQU	$0400		; Select pixels 3 clocks wide
PWIDTH4		EQU	$0600		; Select pixels 4 clocks wide
PWIDTH5		EQU	$0800		; Select pixels 5 clocks wide
PWIDTH6		EQU	$0A00		; Select pixels 6 clocks wide
PWIDTH7		EQU	$0C00		; Select pixels 7 clocks wide
PWIDTH8		EQU	$0E00		; Select pixels 8 clocks wide

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	GPU REGISTERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

G_FLAGS 	EQU	BASE+$2100	; GPU Flags
G_MTXC		EQU	BASE+$2104	; GPU Matrix Control
G_MTXA		EQU	BASE+$2108	; GPU Matrix Address
G_END		EQU	BASE+$210C	; GPU Data Organization
G_PC		EQU	BASE+$2110	; GPU Program Counter
G_CTRL		EQU	BASE+$2114	; GPU Operation Control/Status
G_HIDATA 	EQU	BASE+$2118	; GPU Bus Interface high data
G_REMAIN 	EQU	BASE+$211C	; GPU Division Remainder
G_DIVCTRL 	EQU	BASE+$211C	; GPU Divider control
G_RAM		EQU	BASE+$3000	; GPU Internal RAM
G_ENDRAM	EQU	G_RAM+(4*1024)	; 4K bytes

;;;
;;; GPU Flags Register Equates
;;;

G_CPUENA	EQU	$00000010	; CPU Interrupt enable bits
G_DSPENA	EQU	$00000020	; DSP Interrupt enable bits
G_PITENA	EQU	$00000040	; PIT Interrupt enable bits
G_OPENA		EQU	$00000080	; Object Processor Interrupt enable bits
G_BLITENA	EQU	$00000100	; Blitter Interrupt enable bits
G_CPUCLR	EQU	$00000200	; CPU Interrupt clear bits
G_DSPCLR	EQU	$00000400	; DSP Interrupt clear bits
G_PITCLR	EQU	$00000800	; PIT Interrupt clear bits
G_OPCLR		EQU	$00001000	; Object Processor Interrupt clear bits
G_BLITCLR	EQU	$00002000	; Blitter Interrupt clear bits

;;;
;;; GPU Control/Status Register
;;;

GPUGO		EQU	$00000001	; Start and Stop the GPU
;GPUINT0		EQU	$00000004	; generate a GPU type 0 interrupt

G_CPULAT	EQU	$00000040	; Interrupt Latches
G_DSPLAT	EQU	$00000080
G_PITLAT	EQU	$00000100
G_OPLAT		EQU	$00000200
G_BLITLAT	EQU	$00000400

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	BLITTER REGISTERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

A1_BASE 	EQU	BASE+$2200	; A1 Base Address
A1_FLAGS	EQU	BASE+$2204	; A1 Control Flags
A1_CLIP		EQU	BASE+$2208	; A1 Clipping Size
A1_PIXEL	EQU	BASE+$220C	; A1 Pixel Pointer
A1_STEP		EQU	BASE+$2210	; A1 Step (Integer Part)
A1_FSTEP	EQU	BASE+$2214	; A1 Step (Fractional Part)
A1_FPIXEL	EQU	BASE+$2218	; A1 Pixel Pointer (Fractional)
A1_INC		EQU	BASE+$221C	; A1 Increment (Integer Part)
A1_FINC		EQU	BASE+$2220	; A1 Increment (Fractional Part)
A2_BASE		EQU	BASE+$2224	; A2 Base Address
A2_FLAGS	EQU	BASE+$2228	; A2 Control Flags
A2_MASK		EQU	BASE+$222C	; A2 Address Mask
A2_PIXEL	EQU	BASE+$2230	; A2 PIXEL
A2_STEP		EQU	BASE+$2234	; A2 Step (Integer)

B_CMD		EQU	BASE+$2238	; Command
B_COUNT		EQU	BASE+$223C	; Counters
B_SRCD		EQU	BASE+$2240	; Source Data
B_DSTD		EQU	BASE+$2248	; Destination Data
B_DSTZ		EQU	BASE+$2250	; Destination Z
B_SRCZ1		EQU	BASE+$2258	; Source Z (Integer)
B_SRCZ2		EQU	BASE+$2260	; Source Z (Fractional)
B_PATD		EQU	BASE+$2268	; Pattern Data
B_IINC		EQU	BASE+$2270	; Intensity Increment
B_ZINC		EQU	BASE+$2274	; Z Increment
B_STOP		EQU	BASE+$2278	; Collision stop control

B_I3		EQU	BASE+$227C	; Blitter Intensity 3
B_I2		EQU	BASE+$2280	; Blitter Intensity 2
B_I1		EQU	BASE+$2284	; Blitter Intensity 1
B_I0		EQU	BASE+$2288	; Blitter Intensity 0

B_Z3		EQU	BASE+$228C	; Blitter Z 3
B_Z2		EQU	BASE+$2290	; Blitter Z 2
B_Z1		EQU	BASE+$2294	; Blitter Z 1
B_Z0		EQU	BASE+$2298	; Blitter Z 0

;;;
;;; BLITTER Command Register equates
;;;

SRCEN		EQU	$00000001	; d00:     source data read (inner loop)
SRCENZ		EQU	$00000002	; d01:     source Z read (inner loop)
SRCENX		EQU	$00000004	; d02:     source data read (realign)
DSTEN		EQU	$00000008	; d03:     dest data read (inner loop)
DSTENZ		EQU	$00000010	; d04:     dest Z read (inner loop)
DSTWRZ		EQU	$00000020	; d05:     dest Z write (inner loop)
CLIP_A1		EQU	$00000040	; d06:     A1 clipping enable
UPDA1F		EQU	$00000100	; d08:     A1 update step fraction
UPDA1		EQU	$00000200	; d09:     A1 update step
UPDA2		EQU	$00000400	; d10:     A2 update step
DSTA2		EQU	$00000800	; d11:     reverse usage of A1 and A2
GOURD		EQU	$00001000	; d12:     enable Gouraud shading
ZBUFF		EQU	$00002000	; d13:     polygon Z data updates
TOPBEN		EQU	$00004000	; d14:     intensity carry into byte
TOPNEN		EQU	$00008000	; d15:     intensity carry into nibble
PATDSEL		EQU	$00010000	; d16:     Select pattern data
ADDDSEL		EQU	$00020000	; d17:     diagnostic
					; d18-d20: Z comparator inhibit
ZMODELT		EQU	$00040000	; 	     source < destination
ZMODEEQ		EQU	$00080000	;	     source = destination
ZMODEGT		EQU	$00100000	;	     source > destination
					; d21-d24: Logic function control
*LFU_NAN		EQU	$00200000	; 	     !source & !destination
*LFU_NA		EQU	$00400000	; 	     !source &  destination
*LFU_AN		EQU	$00800000	; 	      source & !destination
*LFU_A		EQU	$01000000	; 	      source &  destination

CMPDST		EQU	$02000000	; d25:     pixel compare pattern & dest
BCOMPEN		EQU	$04000000	; d26:     bit compare write inhibit
DCOMPEN		EQU	$08000000	; d27:     data compare write inhibit
BKGWREN		EQU	$10000000	; d28:     data write back
BUSHI		EQU	$20000000	; d29	   blitter priority
SRCSHADE	EQU	$40000000	; d30:	   shade src data w/IINC value

;;;
;;; The following are ALL 16 possible logical operations of the LFUs
;;;

LFU_NAN		EQU	%0001<<21	; NOT Source AND NOT Destination
LFU_NA		EQU	%0010<<21	; NOT Source AND Destination
LFU_AN		EQU	%0100<<21	; Source AND NOT Destination
LFU_A		EQU	%1000<<21	; Source AND Destination
	
LFU_ZERO	EQU	0			; All Zeros
LFU_NSAND	EQU	LFU_NAN			; NOT Source AND NOT Destination
LFU_NSAD	EQU	LFU_NA			; NOT Source AND Destination
LFU_SAND	EQU	LFU_AN			; Source AND NOT Destination
LFU_SAD		EQU	LFU_A			; Source AND Destination
LFU_NOTS	EQU	LFU_NSAND|LFU_NSAD	; NOT Source
LFU_NOTD	EQU	LFU_SAND|LFU_NSAND	; NOT Destination
LFU_NSORND	EQU	LFU_NOTS|LFU_NOTD	; NOT Source OR NOT Destination
LFU_N_SXORD	EQU	LFU_SAD|LFU_NSAND	; NOT (Source XOR Destination) 
LFU_SXORD	EQU	LFU_NSAD|LFU_SAND	; Source XOR Destination
LFU_D		EQU	LFU_SAD|LFU_NSAD	; Destination
LFU_NSORD	EQU	LFU_NOTS|LFU_D		; NOT Source OR Destination
LFU_S		EQU	LFU_SAD|LFU_SAND	; Source
LFU_SORND	EQU	LFU_S|LFU_NOTD		; Source OR NOT Destination
LFU_SORD	EQU	LFU_S|LFU_D		; Source OR Destination
LFU_ONE		EQU	LFU_S|LFU_NOTS		; All Ones
	
	;; Ces equates sont apparemment bugges
; LFU_ZERO	EQU	$00000000	; All Zeros
; LFU_NSAND	EQU	$00200000	; NOT Source AND NOT Destination
; LFU_NSAD	EQU	$00400000	; NOT Source AND Destination
; LFU_NOTS	EQU	$00600000	; NOT Source
; LFU_SAND	EQU	$00800000	; Source AND NOT Destination
; LFU_NOTD	EQU	$00A00000	; NOT Destination
; LFU_N_SXORD	EQU	$00C00000	; NOT (Source XOR Destination)
; LFU_NSORND	EQU	$00E00000	; NOT Source OR NOT Destination
; LFU_SAD		EQU	$01000000	; Source AND Destination
; LFU_SXORD	EQU	$01200000	; Source XOR Destination
; LFU_D		EQU	$01400000	; Destination
; LFU_NSORD	EQU	$01600000	; NOT Source OR Destination
; LFU_S		EQU	$01800000	; Source
; LFU_SORND	EQU	$01A00000	; Source OR NOT Destination
; LFU_SORD	EQU	$01C00000	; Source OR Destination
; LFU_ONE		EQU	$01E00000	; All Ones

; ; These are some common combinations with less boolean names

LFU_REPLACE	EQU	LFU_S		; Source REPLACEs destination
LFU_XOR		EQU	LFU_SXORD	; Source XOR with destination
LFU_CLEAR	EQU	LFU_ZERO	; CLEAR destination

;;;
;;; BLITTER Flags (A1 or A2) register equates
;;;

; Pitch d00-d01:
;	distance between pixel phrases
PITCH1		EQU	$00000000	; 0 phrase gap
PITCH2		EQU	$00000001	; 1 phrase gap
PITCH4		EQU	$00000002	; 3 phrase gap
PITCH3		EQU	$00000003	; 2 phrase gap

; Pixel d03-d05
;	bit depth (2^n)
PIXEL1		EQU	$00000000	; n = 0	
PIXEL2		EQU	$00000008	; n = 1	
PIXEL4		EQU	$00000010	; n = 2	
PIXEL8		EQU	$00000018	; n = 3	
PIXEL16		EQU	$00000020	; n = 4	
PIXEL32		EQU	$00000028	; n = 5	

; Z offset d06-d08
;	offset from phrase of pixel data from its corresponding
;	Z data phrases
ZOFFS0		EQU	$00000000	; offset = 0	UNUSED
ZOFFS1		EQU	$00000040	; offset = 1
ZOFFS2		EQU	$00000080	; offset = 2
ZOFFS3		EQU	$000000C0	; offset = 3
ZOFFS4		EQU	$00000100	; offset = 4
ZOFFS5		EQU	$00000140	; offset = 5
ZOFFS6		EQU	$00000180	; offset = 6
ZOFFS7		EQU	$000001C0	; offset = 7	UNUSED

; Width d09-d14
;	width used for address generation
;	This is a 6-bit floating point value in pixels
;	4-bit unsigned exponent
;	2-bit mantissa with implied 3rd bit of 1
WID2		EQU	$00000800	; 1.00 X 2^1  ( 4<<9)
WID4 		EQU	$00001000	; 1.00 X 2^2  ( 8<<9)
WID6		EQU	$00001400	; 1.10 X 2^2  (10<<9)
WID8		EQU	$00001800	; 1.00 x 2^3  (12<<9)
WID10		EQU	$00001A00	; 1.01 X 2^3  (13<<9)
WID12		EQU	$00001C00	; 1.10 X 2^3  (14<<9)
WID14		EQU	$00001E00	; 1.11 X 2^3  (15<<9)
WID16		EQU	$00002000	; 1.00 X 2^4  (16<<9)
WID20		EQU	$00002200	; 1.01 X 2^4  (17<<9)
WID24		EQU	$00002400	; 1.10 X 2^4  (18<<9)
WID28		EQU	$00002600	; 1.11 X 2^4  (19<<9)
WID32		EQU	$00002800	; 1.00 X 2^5  (20<<9)
WID40		EQU	$00002A00	; 1.01 X 2^5  (21<<9)
WID48		EQU	$00002C00	; 1.10 X 2^5  (22<<9)
WID56		EQU	$00002E00	; 1.11 X 2^5  (23<<9)
WID64		EQU	$00003000	; 1.00 X 2^6  (24<<9)
WID80		EQU	$00003200	; 1.01 X 2^6  (25<<9)
WID96		EQU	$00003400	; 1.10 X 2^6  (26<<9)
WID112		EQU	$00003600	; 1.11 X 2^6  (27<<9)
WID128		EQU	$00003800	; 1.00 X 2^7  (28<<9)
WID160		EQU	$00003A00	; 1.01 X 2^7  (29<<9)
WID192		EQU	$00003C00	; 1.10 X 2^7  (30<<9)
WID224		EQU	$00003E00	; 1.11 X 2^7  (31<<9)
WID256		EQU	$00004000	; 1.00 X 2^8  (32<<9)
WID320		EQU	$00004200	; 1.01 X 2^8  (33<<9)
WID384		EQU	$00004400	; 1.10 X 2^8  (34<<9)
WID448		EQU	$00004600	; 1.11 X 2^8  (35<<9)
WID512		EQU	$00004800	; 1.00 X 2^9  (36<<9)
WID640		EQU	$00004A00	; 1.01 X 2^9  (37<<9)
WID768		EQU	$00004C00	; 1.10 X 2^9  (38<<9)
WID896		EQU	$00004E00	; 1.11 X 2^9  (39<<9)
WID1024		EQU	$00005000	; 1.00 X 2^10 (40<<9)
WID1280		EQU	$00005200	; 1.01 X 2^10 (41<<9)
WID1536		EQU	$00005400	; 1.10 X 2^10 (42<<9)
WID1792		EQU	$00005600	; 1.11 X 2^10 (43<<9)
WID2048		EQU	$00005800	; 1.00 X 2^11 (44<<9)
WID2560		EQU	$00005A00	; 1.01 X 2^11 (45<<9)
WID3072		EQU	$00005C00	; 1.10 X 2^11 (46<<9)
WID3584		EQU	$00005E00	; 1.11 X 2^11 (47<<9)

; X add control d16-d17
;	controls the update of the X pointer on each pass
;	round the inner loop
XADDPHR		EQU	$00000000	; 00 - add phrase width and truncate
XADDPIX		EQU	$00010000	; 01 - add pixel size (add 1)	
XADD0		EQU	$00020000	; 10 - add zero
XADDINC		EQU	$00030000	; 11 - add the increment

; Y add control	d18
;	controls the update of the Y pointer within the inner loop.
;	it is overridden by the X add control if they are in add increment
YADD0		EQU	$00000000	; 00 - add zero
YADD1		EQU	$00040000	; 01 - add 1

; X sign d19
;	add or subtract pixel size if X add control = 01 (XADDPIX)
XSIGNADD	EQU	$00000000	; 0 - add pixel size
XSIGNSUB	EQU	$00080000	; 1 - subtract pixel size

; Y sign d20
;	add or subtract pixel size if Y add control = 01 (YADD1)
YSIGNADD	EQU	$00000000	; 0 - add 1
YSIGNSUB	EQU	$00100000	; 1 - sub 1


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	JERRY REGISTERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

JPIT1		EQU	BASE+$10000	; Timer 1 Pre-Scaler
JPIT2		EQU	BASE+$10002	; Timer 1 Divider
JPIT3		EQU	BASE+$10004	; Timer 2 Pre-Scaler
JPIT4		EQU	BASE+$10006	; Timer 2 Divider

J_INT          EQU     BASE+$10020   ; Jerry Interrupt control (to TOM)
		
JOYSTICK       EQU     BASE+$14000   ; Joystick register and mute
JOYBUTS		EQU	BASE+$14002	; Joystick register
CONFIG		EQU	BASE+$14002	; Also has NTSC/PAL

MOD_MASK	EQU	BASE+$1A118	; Mask for ADDQ(SUBQ)MOD

SCLK		EQU	BASE+$1A150	; SSI Clock Frequency
SMODE		EQU	BASE+$1A154	; SSI Control

L_I2S		EQU	BASE+$1A148	; I2S Serial Interface	
R_I2S		EQU	BASE+$1A14C	; I2S Serial Interface

;;;
;;; Jerry Interrupt Control Flags
;;;

J_EXTENA	EQU	$0001		; Enable external interrupts
J_DSPENA	EQU	$0002		; Enable DSP interrupts
J_TIM1ENA	EQU	$0004		; Enable Timer 1 interrupts
J_TIM2ENA	EQU	$0008		; Enable Timer 2 interrupts
J_ASYNENA	EQU	$0010		; Enable Asyncronous Serial interrupts
J_SYNENA	EQU	$0020		; Enable Syncronous Serial interrupts

J_EXTCLR	EQU	$0100		; Clear pending external interrupts
J_DSPCLR	EQU	$0200		; Clear pending DSP interrupts
J_TIM1CLR	EQU	$0400		; Clear pending Timer 1 interrupts
J_TIM2CLR	EQU	$0800		; Clear pending Timer 2 interrupts
J_ASYNCLR	EQU	$1000		; Clear pending Asynch. Serial interrupts
J_SYNCLR	EQU	$2000		; Clear pending Synch. Serial interrupts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;     JERRY Joystick Equates
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Bits when LONGword is formatted as below (from JOYTEST\JT_LOOP.S).
;
; Format: xxApxxBx RLDU147* xxCxxxox 2580369#

JOY_UP		EQU	20		;joypad
JOY_DOWN	EQU	21
JOY_LEFT	EQU	22
JOY_RIGHT	EQU	23

FIRE_A		EQU	29		;fire buttons
FIRE_B		EQU	25
FIRE_C		EQU	13
OPTION		EQU	9
PAUSE		EQU	28

KEY_STAR	EQU	16		;keypad
KEY_7		EQU	17
KEY_4		EQU	18
KEY_1		EQU	19

KEY_0		EQU	4
KEY_8		EQU	5
KEY_5		EQU	6
KEY_2		EQU	7

KEY_HASH	EQU	0
KEY_9		EQU	1
KEY_6		EQU	2
KEY_3		EQU	3

ANY_JOY		EQU	$00F00000	; AND joyedge with this...
					; joypad was pressed if result is not 0
ANY_FIRE	EQU	$32002200	; AND joyedge with this...
					; A,B C, Option or Pause was pressed
					; if result is not 0
ANY_KEY		EQU	$000F00FF	; AND joyedge with this... 123456789*0#
					; was pressed if result is not 0

;;;
;;;	ROM Tables built into Jerry - 128 samples each
;;;	16 bit samples sign extended to 32
;;;

ROM_TABLE   	EQU	BASE+$1D000	; Base of tables

ROM_TRI     	EQU	BASE+$1D000	; A triangle wave
ROM_SINE    	EQU	BASE+$1D200	; Full amplitude SINE
ROM_AMSINE  	EQU	BASE+$1D400	; Linear (?) ramp SINE
ROM_12W 	EQU	BASE+$1D600	; SINE(X)+SINE(2*X) : (was ROM_SINE12W)
ROM_CHIRP16 	EQU	BASE+$1D800	; SHORT SWEEP
ROM_NTRI    	EQU	BASE+$1DA00	; Triangle w/NOISE
ROM_DELTA   	EQU	BASE+$1DC00	; Positive spike
ROM_NOISE   	EQU	BASE+$1DE00	; Guess

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;	JERRY Registers (DSP)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

D_FLAGS		EQU	BASE+$1A100	; DSP Flags
D_MTXC		EQU	BASE+$1A104	; DSP Matrix Control
D_MTXA		EQU	BASE+$1A108	; DSP Matrix Address
D_END		EQU	BASE+$1A10C	; DSP Data Organization
D_PC		EQU	BASE+$1A110	; DSP Program Counter
D_CTRL		EQU	BASE+$1A114	; DSP Operation Control/Status
D_MOD          EQU     BASE+$1A118   ; DSP Modulo Instruction Mask
D_REMAIN 	EQU	BASE+$1A11C	; DSP Division Remainder
D_DIVCTRL 	EQU	BASE+$1A11C	; DSP Divider control
D_MACHI        EQU     BASE+$1A120   ; DSP Hi byte of MAC operations
D_RAM		EQU	BASE+$1B000	; DSP Internal RAM
D_ENDRAM	EQU	D_RAM+(8*1024)	; 8K bytes

;;;
;;; JERRY Flag Register Equates
;;;

D_CPUENA	EQU	$00000010	; CPU Interrupt Enable Bit
D_I2SENA	EQU	$00000020	; I2S Interrupt Enable Bit
D_TIM1ENA	EQU	$00000040	; Timer 1 Interrupt Enable Bit
D_TIM2ENA	EQU	$00000080	; Timer 2 Interrupt Enable Bit
D_EXT0ENA	EQU	$00000100	; External Interrupt 0 Enable Bit
D_EXT1ENA	EQU	$00010000	; External Interrupt 1 Enable Bit

D_CPUCLR	EQU	$00000200	; CPU Interrupt Clear Bit
D_I2SCLR	EQU	$00000400	; I2S Interrupt Clear Bit
D_TIM1CLR	EQU	$00000800	; Timer 1 Interrupt Clear Bit
D_TIM2CLR	EQU	$00001000	; Timer 2 Interrupt Clear Bit
D_EXT0CLR	EQU	$00002000	; External Interrupt 0 Clear Bit
D_EXT1CLR	EQU	$00020000	; External Interrupt 1 Clear Bit

;;;
;;; JERRY Control/Status Register
;;;

DSPGO		EQU	$00000001	; Start DSP
DSPINT0		EQU	$00000004	; Generate a DSP Interrupt 0

D_CPULAT	EQU	$00000040	; Interrupt Latches
D_I2SLAT	EQU	$00000080
D_TIM1LAT	EQU	$00000100
D_TIM2LAT	EQU	$00000200
D_EXT1LAT	EQU	$00000400
D_EXT2LAT	EQU	$00010000

;;;
;;; JERRY Modulo Instruction Masks
;;;

MODMASK2	EQU	$FFFFFFFE	; 2 byte circular buffer
MODMASK4	EQU	$FFFFFFFC	; 4 byte circular buffer
MODMASK8	EQU	$FFFFFFF8	; 8 byte circular buffer
MODMASK16	EQU	$FFFFFFF0	; 16 byte circular buffer
MODMASK32	EQU	$FFFFFFE0	; 32 byte circular buffer
MODMASK64	EQU	$FFFFFFC0	; 64 byte circular buffer
MODMASK128	EQU	$FFFFFF80	; 128 byte circular buffer
MODMASK256	EQU	$FFFFFF00	; 256 byte circular buffer
MODMASK512	EQU	$FFFFFE00	; 512 byte circular buffer
MODMASK1K	EQU	$FFFFFC00	; 1k circular buffer 
MODMASK2K	EQU	$FFFFF800	; 2k circular buffer
MODMASK4K	EQU	$FFFFF000	; 4k circular buffer
MODMASK8K	EQU	$FFFFE000	; 8k circular buffer
MODMASK16K	EQU	$FFFFC000	; 16k circular buffer
MODMASK32K	EQU	$FFFF8000	; 32k circular buffer
MODMASK64K	EQU	$FFFF0000	; 64k circular buffer
MODMASK128K	EQU	$FFFE0000	; 128k circular buffer
MODMASK256K	EQU	$FFFC0000	; 256k circular buffer
MODMASK512K	EQU	$FFF80000	; 512k circular buffer
MODMASK1M	EQU	$FFF00000	; 1M circular buffer
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; SHARED Equates for TOM (GPU) and JERRY (DSP)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;
;;; Control/Status Registers
;;;

RISCGO		EQU	$00000001	; Start GPU or DSP
CPUINT		EQU	$00000002	; Allow the GPU/DSP to interrupt CPU
FORCEINT0	EQU	$00000004	; Cause an INT 0 on GPU or DSP
SINGLE_STEP	EQU	$00000008	; Enter SINGLE_STEP mode
SINGLE_GO	EQU	$00000010	; Execute one instruction

REGPAGE		EQU	$00004000	; Register Bank Select
DMAEN  		EQU	$00008000	; Enable DMA LOAD and STORE

;;;
;;; Flags Register
;;;

ZERO_FLAG	EQU	$00000001	; ALU Zero Flag
CARRY_FLAG	EQU	$00000002	; ALU Carry Flag
NEGA_FLAG	EQU	$00000004	; ALU Negative Flag

IMASK		EQU	$00000008	; Interrupt Service Mask

;;;
;;; Matrix Control Register
;;;

MATRIX3		EQU	$00000003	; use for 3x1 Matrix
MATRIX4		EQU	$00000004	; etc...
MATRIX5		EQU	$00000005
MATRIX6		EQU	$00000006
MATRIX7		EQU	$00000007
MATRIX8		EQU	$00000008
MATRIX9		EQU	$00000009
MATRIX10	EQU	$0000000A
MATRIX11	EQU	$0000000B
MATRIX12	EQU	$0000000C
MATRIX13	EQU	$0000000D
MATRIX14	EQU	$0000000E
MATRIX15	EQU	$0000000F
		
MATROW		EQU	$00000000	; Access Matrix by Row
MATCOL		EQU	$00000010	; Access Matrix by Column

;;;
;;; Data Organisation Register
;;;

BIG_IO		EQU	$00010001	; Use 32-bit registers as big-endian
BIG_PIX		EQU	$00020002	; Pixel organisation is big-endian
BIG_INST	EQU	$00040004	; Word program fetches are big-endian

;;;
;;; Divide Unit Control
;;;

DIV_OFFSET	EQU	$00000001	; Divide 16.16 values if set

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; The following EQU's will be removed from JAGUAR.INC in the next release
;;; or two. For the most part, they are being removed because they are only
;;; useful in Jaguar programming methods we do not recommend.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

COMPAT		EQU	1

		IF	COMPAT
;;;
;;; These registers should never be messed with so these EQUs will
;;; be purged in the next revision of JAGUAR.INC. Please don't use them.
;;;

MEMCON1 	EQU	BASE+0	; Memory Configuration Register One
MEMCON2 	EQU	BASE+2	; Memory Configuration Register Two
OLPLO		EQU	BASE+$20
OLPHI		EQU	BASE+$22
ODP		EQU	BASE+$24	; Object Data Pointer
HP		EQU	BASE+$2e	; Horizontal Period
HBB		EQU	BASE+$30	; Horizontal Blanking Begin
HBE		EQU	BASE+$32	; Horizontal Blanking End
HS		EQU	BASE+$34	; Horizontal Sync
HVS		EQU	BASE+$36	; Horizontal Vertical Sync
VP		EQU	BASE+$3e	; Vertical Period
VBB		EQU	BASE+$40	; Vertical Blanking Begin
VBE		EQU	BASE+$42	; Vertical Blanking End
VEB		EQU	BASE+$4a	; Vertical EQUalization Begin
VEE		EQU	BASE+$4c	; Vertical EQUalization End
HEQ		EQU	BASE+$54	; Horizontal EQUalization End
TEST1		EQU	BASE+$56	; Undocumented Register - DO NOT USE

;;; These don't exist on the Jaguar Console so they are going away.
R_DAC		EQU	BASE+$1A148	; These are not connected in Jaguar	
L_DAC		EQU	BASE+$1A14C	; so DO NOT USE!!!

		ENDIF

O_XPOS          EQU 0
O_YPOS          EQU 2
O_DATA          EQU 4
O_HEIGHT        EQU 8
O_DWIDTH        EQU 10
O_IWIDTH        EQU 12
O_FLAGS         EQU 14
O_FIRSTPIX      EQU 15
O_TYPE          EQU 16
O_DEPTH         EQU 17
O_PITCH         EQU 18
O_INDEX         EQU 19
O_SCALE         EQU 20
OBJSIZE         EQU 24   
;;;;;;;;;
;; EOF ;;
;;;;;;;;;
