mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-30 06:50:39 +00:00
683 lines
25 KiB
C
683 lines
25 KiB
C
; ****** HVGLIB.H (formally called ballyequ.h) (C)1977,78
|
|
; *** Bally Astrocade Equates and Macros Header File ***
|
|
; From the nutting_manual and reformatted using Mixed Case
|
|
; Version 3.01 - thru December 29, 2010
|
|
; by Richard C Degler, from scratch
|
|
;
|
|
; > Retyped and proofread by Adam Trionfo and Lance F. Squire
|
|
; > Version 1.0 (as ballyequ.h) - January 17, 2002
|
|
; > Version 2.52 (Version 1.0 of HVGLIB.H) - March 28, 2003
|
|
; > Version 2.6 - March 2, 2004 - as seen on BallyAlley.com
|
|
; > Version 3.0 - 2009
|
|
; > Version 3.01 - Changed "FonT BASE character" comment
|
|
; >
|
|
; > This file contains the equates and macros that Bally
|
|
; > programs require for assembly. This file has been
|
|
; > written to assemble with ZMAC 1.3 (a freely distribut-
|
|
; > able Z-80 assembler (with C source), that has a 25-year
|
|
; > history. ZMAC can be compiled under just about any O.S.
|
|
; > in existence, so try it out. This file will probably
|
|
; > require changes to be assembled under other assemblers.
|
|
; >
|
|
; > To assemble your Z-80 source code using ZMAC:
|
|
; >
|
|
; > zmac -d -o <outfile> -x <listfile> <filename>
|
|
; >
|
|
; > For example, assemble this Astrocade Z-80 ROM file:
|
|
; >
|
|
; > zmac -d -o BallyROM.bin -x BallyROM.lst BallyROM.asm
|
|
; >
|
|
; > Currently the Listing file is full of 'Undeclared'
|
|
; > errors. When all of the source is typed-in, these will
|
|
; > vanish. I'm leaving the others until all the source is
|
|
; > re-typed.
|
|
; >
|
|
;
|
|
; ***************************
|
|
; * Home Video Game EQUates *
|
|
; ***************************
|
|
;
|
|
; ASSEMBLY CONTROL
|
|
;
|
|
XPNDON EQU 1 ; ** SET TO 1 WHEN HARDWARE EXP
|
|
NWHDWR EQU 1 ; ** SET TO 1 WHEN NEW HARDWARE
|
|
;
|
|
; General goodies (HEX and Decimal values):
|
|
NORMEM EQU $4000 ; 8192 ; NORmal MEMory start
|
|
FIRSTC EQU $2000 ; 4096 ; FIRST address in Cartridge
|
|
SCREEN EQU $0000 ; 0 ; magic SCREEN start
|
|
BYTEPL EQU $28 ; 40 ; BYTEs Per Line
|
|
BITSPL EQU $A0 ; 160 ; BITS Per Line
|
|
;
|
|
; Stuff in SYSTEM DOPE VECTOR (valid for ALL system ROMs):
|
|
STIMER EQU $0200 ; Seconds and game TIMER, music
|
|
CTIMER EQU $0203 ; Custom TIMERs
|
|
FNTSYS EQU $0206 ; FoNT descriptor for SYStem font
|
|
FNTSML EQU $020D ; FoNT descriptor for SMaLl font
|
|
ALKEYS EQU $0214 ; ALl KEYS keypad mask
|
|
MENUST EQU $0218 ; head of onboard MENU STart
|
|
MXSCR EQU $021E ; address of 'MaX SCoRe' text string
|
|
NOPLAY EQU $0228 ; address of 'Number Of PLAYers' string
|
|
NOGAME EQU $0235 ; address of 'Number Of GAMEs' string
|
|
;
|
|
; BITS in PROCESSOR FLAG byte:
|
|
PSWCY EQU 0 ; Processor Status Word, CarrY bit
|
|
PSWPV EQU 2 ; Processor Status Word, Parity or oVerflow bit
|
|
PSWZRO EQU 6 ; Processor Status Word, ZeRO bit
|
|
PSWSGN EQU 7 ; Processor Status Word, SiGN bit
|
|
;
|
|
; BITS in GAME STATUS Byte:
|
|
GSBTIM EQU 0 ; Game Status Byte, if TIMe is up set end bit
|
|
GSBSCR EQU 1 ; Game Status Byte, if SCoRe reached set end bit
|
|
GSBEND EQU 7 ; Game Status Byte, END flag bit
|
|
;
|
|
; Standard VECTOR DISPLACEMENTS and bits:
|
|
VBMR EQU $00 ; +0 ; Vector Block, Magic Register
|
|
VBSTAT EQU $01 ; +1 ; Vector Block, STATus byte
|
|
VBTIMB EQU $02 ; +2 ; Vector Block, TIMe Base
|
|
VBDXL EQU $03 ; +3 ; Vector Block, Delta for X Low
|
|
VBDXH EQU $04 ; +4 ; Vector Block, Delta for X Hi
|
|
VBXL EQU $05 ; +5 ; Vector Block, X coord Low
|
|
VBXH EQU $06 ; +6 ; Vector Block, X coord Hi
|
|
VBXCHK EQU $07 ; +7 ; Vector Block, X CHecK flags
|
|
VBDYL EQU $08 ; +8 ; Vector Block, Delta for Y Low
|
|
VBDYH EQU $09 ; +9 ; Vector Block, Delta for Y Hi
|
|
VBYL EQU $0A ; +10 ; Vector Block, Y coord Low
|
|
VBYH EQU $0B ; +11 ; Vector Block, Y coord Hi
|
|
VBYCHK EQU $0C ; +12 ; Vector Block, Y CHecK flags
|
|
VBOAL EQU $0D ; +13 ; Vector Block, Old Address Low
|
|
VBOAH EQU $0E ; +14 ; Vector Block, Old Address Hi
|
|
;
|
|
; DISPLACEMENTS from start of COORDINATE AREA (X or Y):
|
|
VBDCL EQU $00 ; +0 ; Vector Block, Delta for Coord Low
|
|
VBDCH EQU $01 ; +1 ; Vector Block, Delta for Coord Hi
|
|
VBCL EQU $02 ; +2 ; Vector Block, Coord Low
|
|
VBCH EQU $03 ; +3 ; Vector Block, Coord Hi
|
|
VBCCHK EQU $04 ; +4 ; Vector Block, Coord CHecK flags
|
|
;
|
|
; BITS in STATUS byte:
|
|
VBBLNK EQU 6 ; Vector Block status, BLaNK bit
|
|
VBSACT EQU 7 ; Vector Block Status, ACTive bit
|
|
;
|
|
; BITS in (X or Y) VB CHECK FLAG bit mask:
|
|
VBCLMT EQU 0 ; Vector Block Check, LiMiT bit
|
|
VBCREV EQU 1 ; Vector Block Check, REVerse delta on limit attain
|
|
VBCLAT EQU 3 ; Vector Block Check, coordinate Limit ATtained
|
|
;
|
|
; FONT TABLE DISPLACEMENTS for CHARACTER DESCRIPTOR BLOCK:
|
|
FTBASE EQU $00 ; +0 ; FonT BASE character (normally $A0)
|
|
FTFSX EQU $01 ; +1 ; FonT Frame X Size width
|
|
FTFSY EQU $02 ; +2 ; FonT Frame Y Size height
|
|
FTBYTE EQU $03 ; +3 ; FonT X size for char in BYTEs
|
|
FTYSIZ EQU $04 ; +4 ; FonT Y SIZe height in rows
|
|
FTPTL EQU $05 ; +5 ; FonT Pattern Table address Low
|
|
FTPTH EQU $06 ; +6 ; FonT Pattern Table address Hi
|
|
;
|
|
; BITS for MAGIC REGISTER (write option) byte:
|
|
MRSHFT EQU $03 ; Magic Register, mask of SHiFT amount 0-3
|
|
MRROT EQU 2 ; Magic Register, write with ROTata bit
|
|
MRXPND EQU 3 ; Magic Register, write with eXPaND bit
|
|
MROR EQU 4 ; Magic Register, write with OR bit
|
|
MRXOR EQU 5 ; Magic Register, write with eXclusive-OR bit
|
|
MRFLOP EQU 6 ; Magic Register, write with FLOP bit
|
|
;
|
|
; BITS of CONTROL HANDLE Input port:
|
|
CHUP EQU 0 ; Control Handle, UP bit
|
|
CHDOWN EQU 1 ; Control Handle, DOWN bit
|
|
CHLEFT EQU 2 ; Control Handle, joystick LEFT bit
|
|
CHRIGH EQU 3 ; Control Handle, joystick RIGHT bit
|
|
CHTRIG EQU 4 ; Control Handle, TRIGger bit
|
|
;
|
|
; CONTEXT BLOCK Register DISPLACEMENTS:
|
|
CBIYL EQU $00 ; +0 ; Context Block, IY register Low
|
|
CBIYH EQU $01 ; +1 ; Context Block, IY register Hi
|
|
CBIXL EQU $02 ; +2 ; Context Block, IX register Low
|
|
CBIXH EQU $03 ; +3 ; Context Block, IX register Hi
|
|
CBE EQU $04 ; +4 ; Context Block, E register
|
|
CBD EQU $05 ; +5 ; Context Block, D register
|
|
CBC EQU $06 ; +6 ; Context Block, C register
|
|
CBB EQU $07 ; +7 ; Context Block, B register
|
|
CBFLAG EQU $08 ; +8 ; Context Block, FLAGs register
|
|
CBA EQU $09 ; +9 ; Context Block, A register
|
|
CBL EQU $0A ; +10 ; Context Block, L register
|
|
CBH EQU $0B ; +11 ; Context Block, H register
|
|
;
|
|
; SENTRY RETURN Codes EQUates:
|
|
SNUL EQU $00 ; Sentry return NULl, nothing happened
|
|
SCT0 EQU $01 ; Sentry, Counter-Timer 0 has counted down
|
|
SCT1 EQU $02 ; Sentry, Counter-Timer 1 has counted down
|
|
SCT2 EQU $03 ; Sentry, Counter-Timer 2 has counted down
|
|
SCT3 EQU $04 ; Sentry, Counter-Timer 3 has counted down
|
|
SCT4 EQU $05 ; Sentry, Counter-Timer 4 has counted down
|
|
SCT5 EQU $06 ; Sentry, Counter-Timer 5 has counted down
|
|
SCT6 EQU $07 ; Sentry, Counter-Timer 6 has counted down
|
|
SCT7 EQU $08 ; Sentry, Counter-Timer 7 has counted down
|
|
SF0 EQU $09 ; Sentry, Flag bit 0 has changed
|
|
SF1 EQU $0A ; Sentry, Flag bit 1 has changed
|
|
SF2 EQU $0B ; Sentry, Flag bit 2 has changed
|
|
SF3 EQU $0C ; Sentry, Flag bit 3 has changed
|
|
SF4 EQU $0D ; Sentry, Flag bit 4 has changed
|
|
SF5 EQU $0E ; Sentry, Flag bit 5 has changed
|
|
SF6 EQU $0F ; Sentry, Flag bit 6 has changed
|
|
SF7 EQU $10 ; Sentry, Flag bit 7 has changed
|
|
SSEC EQU $11 ; Sentry, SEConds timer has counted down
|
|
SKYU EQU $12 ; Sentry, KeY is now Up
|
|
SKYD EQU $13 ; Sentry, KeY is now Down
|
|
ST0 EQU $14 ; Sentry, Trigger 0 for player 1 has changed
|
|
SJ0 EQU $15 ; Sentry, Joystick 0 for player 1 has changed
|
|
ST1 EQU $16 ; Sentry, Trigger 1 for player 2 has changed
|
|
SJ1 EQU $17 ; Sentry, Joystick 1 for player 2 has changed
|
|
ST2 EQU $18 ; Sentry, Trigger 2 for player 3 has changed
|
|
SJ2 EQU $19 ; Sentry, Joystick 2 for player 3 has changed
|
|
ST3 EQU $1A ; Sentry, Trigger 3 for player 4 has changed
|
|
SJ3 EQU $1B ; Sentry, Joystick 3 for player 4 has changed
|
|
SP0 EQU $1C ; Sentry, POTentiometer 0 has changed
|
|
SP1 EQU $1D ; Sentry, POTentiometer 1 has changed
|
|
SP2 EQU $1E ; Sentry, POTentiometer 2 has changed
|
|
SP3 EQU $1F ; Sentry, POTentiometer 3 has changed
|
|
;
|
|
;
|
|
; ********************************
|
|
; * Home Video Game PORT EQUates *
|
|
; ********************************
|
|
;
|
|
; OUTPUT Ports for VIRTUAL COLOR:
|
|
COL0R EQU $00 ; &(0)= ; write COLor 0 Right
|
|
COL1R EQU $01 ; &(1)= ; write COLor 1 Right
|
|
COL2R EQU $02 ; &(2)= ; write COLor 2 Right
|
|
COL3R EQU $03 ; &(3)= ; write COLor 3 Right
|
|
COL0L EQU $04 ; &(4)= ; write COLor 0 Left
|
|
COL1L EQU $05 ; &(5)= ; write COLor 1 Left
|
|
COL2L EQU $06 ; &(6)= ; write COLor 2 Left
|
|
COL3L EQU $07 ; &(7)= ; write COLor 3 Left
|
|
HORCB EQU $09 ; &(9)= ; write HORizontal Color Boundary
|
|
VERBL EQU $0A ;&(10)= ; write VERtical Blanking Line
|
|
COLBX EQU $0B ;&(11)= ; write COLor BloCK multi-port
|
|
;
|
|
; OUTPUT Ports for MUSIC and SOUNDS:
|
|
TONMO EQU $10 ;&(16)= ; write TONe Master Oscillator
|
|
TONEA EQU $11 ;&(17)= ; write TONe A oscillator
|
|
TONEB EQU $12 ;&(18)= ; write TONe B oscillator
|
|
TONEC EQU $13 ;&(19)= ; write TONe C oscillator
|
|
VIBRA EQU $14 ;&(20)= ; write VIBRAto frequency & range
|
|
VOLC EQU $15 ;&(21)= ; write VOLume of tone C
|
|
VOLAB EQU $16 ;&(22)= ; write VOLumes of tones A & B
|
|
VOLN EQU $17 ;&(23)= ; write VOLume of Noise
|
|
SNDBX EQU $18 ;&(24)= ; write SouND BloCK multi-port
|
|
;
|
|
; INTERRUPT and CONTROL OUTPUT Ports:
|
|
CONCM EQU $08 ; &(8)= ; write 0 for CONsumer, 1 for CoMmercial mode
|
|
MAGIC EQU $0C ;&(12)= ; write MAGIC register
|
|
INFBK EQU $0D ;&(13)= ; write INterrupt FeedBacK
|
|
INMOD EQU $0E ;&(14)= ; write INterrupt MODe
|
|
INLIN EQU $0F ;&(15)= ; write INterrupt LINe
|
|
XPAND EQU $19 ;&(25)= ; eXPANDer pixel definition port
|
|
;
|
|
; INTERRUPT and INTERCEPT INPUT Ports:
|
|
INTST EQU $08 ; =&(8) ; read INTercept STatus
|
|
VERAF EQU $0E ;=&(14) ; read VERtical Address Feedback
|
|
HORAF EQU $0F ;=&(15) ; read HORizontal Address Feedback
|
|
;
|
|
; HAND CONTROL INPUT Ports:
|
|
SW0 EQU $10 ;=&(16) ; read SWitch bank 0 for player 1 hand control
|
|
SW1 EQU $11 ;=&(17) ; read SWitch bank 1 for player 2 hand control
|
|
SW2 EQU $12 ;=&(18) ; read SWitch bank 2 for player 3 hand control
|
|
SW3 EQU $13 ;=&(19) ; read SWitch bank 3 for player 4 hand control
|
|
POT0 EQU $1C ;=&(28) ; read POTentiometer 0 for player 1 knob
|
|
POT1 EQU $1D ;=&(29) ; read POTentiometer 1 for player 2 knob
|
|
POT2 EQU $1E ;=&(30) ; read POTentiometer 2 for player 3 knob
|
|
POT3 EQU $1F ;=&(31) ; read POTentiometer 3 for player 4 knob
|
|
;
|
|
; KEYBOARD INPUT Ports:
|
|
KEY0 EQU $14 ;=&(20) ; KEYboard column 0 (right side)
|
|
KEY1 EQU $15 ;=&(21) ; KEYboard column 1 (center right)
|
|
KEY2 EQU $16 ;=&(22) ; KEYboard column 2 (center left)
|
|
KEY3 EQU $17 ;=&(23) ; KEYboard column 3 (left side)
|
|
;
|
|
;
|
|
; ***************************************
|
|
; * Home Video Game SYSTEM CALL Indexes *
|
|
; ***************************************
|
|
;
|
|
; USER PROGRAM Interface:
|
|
INTPC EQU $00 ; # 0 ; INTerPret with Context create
|
|
XINTC EQU $02 ; # 2 ; eXit INTerpreter with Context
|
|
RCALL EQU $04 ; # 4 ; Real CALL asm language subroutine
|
|
MCALL EQU $06 ; # 6 ; Macro CALL interpreter subroutine
|
|
MRET EQU $08 ; # 8 ; Macro RETurn from interpreter subroutine
|
|
MJUMP EQU $0A ; # 10 ; Macro JUMP to interpreter subroutine
|
|
SUCK EQU $0C ; # 12 ; SUCK inline args into context block
|
|
;
|
|
; SCHEDULER Routines:
|
|
ACTINT EQU $0E ; # 14 ; ACTivate sub timer INTerrupts
|
|
DECCTS EQU $10 ; # 16 ; DECrement CT'S under mask
|
|
;
|
|
; MUSIC and SOUNDS:
|
|
BMUSIC EQU $12 ; # 18 ; Begin playing MUSIC
|
|
EMUSIC EQU $14 ; # 20 ; End playing MUSIC
|
|
;
|
|
; SCREEN HANDLER Routines:
|
|
SETOUT EQU $16 ; # 22 ; SET some OUTput ports
|
|
COLSET EQU $18 ; # 24 ; COLors SET
|
|
FILL EQU $1A ; # 26 ; FILL memory with data
|
|
RECTAN EQU $1C ; # 28 ; paint a RECTANgle
|
|
VWRITR EQU $1E ; # 30 ; Vector WRITe Relative
|
|
WRITR EQU $20 ; # 32 ; WRITe Relative
|
|
WRITP EQU $22 ; # 34 ; WRITe with Pattern size lookup
|
|
WRIT EQU $24 ; # 36 ; WRITe with sizes provided
|
|
WRITA EQU $26 ; # 38 ; WRITe Absolute
|
|
VBLANK EQU $28 ; # 40 ; Vector BLANK area
|
|
BLANK EQU $2A ; # 42 ; BLANK area
|
|
SAVE EQU $2C ; # 44 ; SAVE area
|
|
RESTOR EQU $2E ; # 46 ; RESTORe area
|
|
SCROLL EQU $30 ; # 48 ; SCROLL area of screen
|
|
;
|
|
CHRDIS EQU $32 ; # 50 ; CHaRacter DISplay
|
|
STRDIS EQU $34 ; # 52 ; STRing DISplay
|
|
DISNUM EQU $36 ; # 54 ; DISplay NUMber
|
|
;
|
|
RELABS EQU $38 ; # 56 ; RELative to ABSolute conversion
|
|
RELAB1 EQU $3A ; # 58 ; RELative to non-magic ABSolute
|
|
VECTC EQU $3C ; # 60 ; VECTor move single Coordinate
|
|
VECT EQU $3E ; # 62 ; VECTor move coordinate pair
|
|
;
|
|
; HUMAN INTERFACE Routines:
|
|
KCTASC EQU $40 ; # 64 ; Key Code in B To ASCii
|
|
SENTRY EQU $42 ; # 66 ; SENse TRansition Y
|
|
DOIT EQU $44 ; # 68 ; DOIT table, branch to translation handler
|
|
DOITB EQU $46 ; # 70 ; DOIT table, use B instead of A
|
|
PIZBRK EQU $48 ; # 72 ; take a PIZza BReaK
|
|
MENU EQU $4A ; # 74 ; display a MENU
|
|
GETPAR EQU $4C ; # 76 ; GET game PARameter from user
|
|
GETNUM EQU $4E ; # 78 ; GET NUMber from user
|
|
PAWS EQU $50 ; # 80 ; PAUSE
|
|
DISTIM EQU $52 ; # 82 ; DISplay TIMe
|
|
INCSCR EQU $54 ; # 84 ; INCrement SCoRe
|
|
;
|
|
; MATH Routines:
|
|
INDEXN EQU $56 ; # 86 ; INDEX Nibble by C
|
|
STOREN EQU $58 ; # 88 ; STORE Nibble in A by C
|
|
INDEXW EQU $5A ; # 90 ; INDEX Word by A
|
|
INDEXB EQU $5C ; # 92 ; INDEX Byte by A
|
|
MOVE EQU $5E ; # 94 ; MOVE block transfer
|
|
SHIFTU EQU $60 ; # 96 ; SHIFT Up digit in A
|
|
BCDADD EQU $62 ; # 98 ; BCD ADDition
|
|
BCDSUB EQU $64 ;# 100 ; BCD SUBtraction
|
|
BCDMUL EQU $66 ;# 102 ; BCD MULtiplication
|
|
BCDDIV EQU $68 ;# 104 ; BCD DIVision
|
|
BCDCHS EQU $6A ;# 106 ; BCD CHange Sign
|
|
BCDNEG EQU $6C ;# 108 ; BCD NEGate to decimal
|
|
DADD EQU $6E ;# 110 ; Decimal ADDition
|
|
DSMG EQU $70 ;# 112 ; Decimal convert to Sign MaGnitude
|
|
DABS EQU $72 ;# 114 ; Decimal ABSolute value
|
|
NEGT EQU $74 ;# 116 ; decimal NEGaTe
|
|
RANGED EQU $76 ;# 118 ; RANGED random number
|
|
QUIT EQU $78 ;# 120 ; QUIT cassette execution
|
|
SETB EQU $7A ;# 122 ; SET Byte
|
|
SETW EQU $7C ;# 124 ; SET Word
|
|
MSKTD EQU $7E ;# 127 ; MaSK joystick in B To Deltas
|
|
;
|
|
;
|
|
; **********
|
|
; * MACROS *
|
|
; **********
|
|
; Assembler directives in lower case to distinguish from OPCODEs.
|
|
;
|
|
; MACROs to define PATTERNs:
|
|
DEF2 macro AA,AB
|
|
DB AA
|
|
DB AB
|
|
endm
|
|
DEF3 macro BA,BB,BCC
|
|
DB BA
|
|
DB BB
|
|
DB BCC ; 'BC' reserved, so used 'BCC'
|
|
endm
|
|
DEF4 macro CA,CB,CC,CD
|
|
DB CA
|
|
DB CB
|
|
DB CC
|
|
DB CD
|
|
endm
|
|
DEF5 macro DA,DBB,DC,DD,DEE
|
|
DB DA
|
|
DB DBB
|
|
DB DC
|
|
DB DD
|
|
DB DEE
|
|
endm
|
|
DEF6 macro EA,EB,EC,ED,EE,EF
|
|
DB EA
|
|
DB EB
|
|
DB EC
|
|
DB ED
|
|
DB EE
|
|
DB EF
|
|
endm
|
|
DEF8 macro GA,GB,GC,GD,GEE,GF,GG,GH
|
|
DB GA
|
|
DB GB
|
|
DB GC
|
|
DB GD
|
|
DB GEE ; 'GE' reserved, so used 'GEE'
|
|
DB GF
|
|
DB GG
|
|
DB GH
|
|
endm
|
|
;
|
|
; MACRO to compute CONSTANT SCREEN Addresses:
|
|
XYRELL macro p1,p2,p3 ; RELative LOAD
|
|
LD p1,[(p3 SHL 8) + p2]
|
|
endm
|
|
;
|
|
; MACROs to generate SYSTEM CALLs:
|
|
SYSTEM macro NUMBA
|
|
RST $38
|
|
DB NUMBA
|
|
if NUMBA = INTPC
|
|
INTPCC DEFL 1
|
|
endif
|
|
endm
|
|
; MACRO to generate SYSTEM CALL with SUCK option ON:
|
|
SYSSUK macro UMBA
|
|
RST $38
|
|
DB UMBA + 1
|
|
if UMBA = INTPC
|
|
INTPCC DEFL 1
|
|
endif
|
|
endm
|
|
;
|
|
; MACROs to generate MACRO INTERPRETER CALLs:
|
|
; INTERPRET without INLINE SUCK:
|
|
DONT macro CID
|
|
DB CID
|
|
endm
|
|
; INTERPRET with INLINE SUCK option ON:
|
|
DO macro CID
|
|
DB CID + 1
|
|
endm
|
|
;
|
|
; FILL screen with constant data (was 'FILL?'):
|
|
FILLq macro START,NBYTES,DATA
|
|
DB FILL + 1
|
|
DW START
|
|
DW NBYTES
|
|
DB DATA
|
|
endm
|
|
; DISPLAY a STRING: (only inside interpreter?)
|
|
TEXTD macro AA,BB,CC,DD
|
|
DB STRDIS + 1
|
|
DB BB
|
|
DB CC
|
|
DB DD
|
|
DW AA
|
|
endm
|
|
;
|
|
; EXIT interpreter with context restore:
|
|
EXIT macro
|
|
DB XINTC
|
|
INTPCC DEFL 0
|
|
endm
|
|
;
|
|
ENDx EQU $C0 ; END of DOIT Table
|
|
;
|
|
; MACRO CALLs from DOIT Table (only):
|
|
MCALL macro AA, BB, EE
|
|
DB AA + $80
|
|
DW BB
|
|
if EE = ENDx
|
|
DB EE
|
|
endif
|
|
endm
|
|
; REAL CALL from DOIT Table:
|
|
RCALL macro AA,BB,EE
|
|
DB AA + $40
|
|
DW BB
|
|
if EE = ENDx
|
|
DB EE
|
|
endif
|
|
endm
|
|
; REAL JUMP from DOIT Table:
|
|
JMPd macro AA,BB,EE
|
|
DB AA
|
|
DW BB
|
|
if EE = ENDx
|
|
DB EE
|
|
endif
|
|
endm
|
|
;
|
|
;**************
|
|
; MUSIC MACROS:
|
|
; $00 to $7F = NOTE DURation, FREQuency(s):
|
|
NOTE1 macro DUR,N1
|
|
DB (DUR) AND ($7F)
|
|
DB N1
|
|
endm
|
|
NOTE2 macro DUR,N1,N2
|
|
DB (DUR) AND ($7F)
|
|
DB N1
|
|
DB N2
|
|
endm
|
|
NOTE3 macro DUR,N1,N2,N3
|
|
DB (DUR) AND ($7F)
|
|
DB N1
|
|
DB N2
|
|
DB N3
|
|
endm
|
|
NOTE4 macro DUR,N1,N2,N3,N4
|
|
DB (DUR) AND ($7F)
|
|
DB N1
|
|
DB N2
|
|
DB N3
|
|
DB N4
|
|
endm
|
|
NOTE5 macro DUR,N1,N2,N3,N4,N5
|
|
DB (DUR) AND ($7F)
|
|
DB N1
|
|
DB N2
|
|
DB N3
|
|
DB N4
|
|
DB N5
|
|
endm
|
|
; $80 = Set MASTER Osc, Offset:
|
|
MASTER macro OFFSET
|
|
DB $80
|
|
DB OFFSET
|
|
endm
|
|
; $80 to $88 = Stuff OUTPUT Port# (0 to 7 only!), Data
|
|
; or OUTPUT SNDBX, Data10, D11,..., Data17:
|
|
OUTPUT macro PORT,D0,D1,D2,D3,D4,D5,D6,D7
|
|
if PORT != $18
|
|
DB $80 + ((PORT) AND ($7F))
|
|
DB D0 ; <-- D0 is NOT $D0
|
|
else ; on PORT = $18
|
|
DB $88
|
|
DEF8 D7,D6,D5,D4,D3,D2,D1,D0
|
|
endif
|
|
endm
|
|
; $90 = Set VOICE MASK byte:
|
|
; The format of the Voice MASK is:
|
|
; * I * A * I * B * I * C * V * N *
|
|
; bit 7 6 5 4 3 2 1 0
|
|
; read right-to-left, where I = INC PC and
|
|
; A, B, or C = load TONE A,B,C with data at PC
|
|
; V = load Vibrato with data at PC and INC PC
|
|
; N = load Noise with data at PC and INC PC
|
|
VOICEM macro MASK ; 'VOICES' TO 'VOICEM'
|
|
DB $90
|
|
DB MASK
|
|
endm
|
|
; $A0 to $AF = PUSH Number 1 to 16 onto music stack:
|
|
PUSHN macro NUMB
|
|
DB $A0 + ((NUMB-1) AND $0F)
|
|
endm
|
|
; $BO = Set VOLUMEs:
|
|
VOLUME macro P1,P2
|
|
DB $B0
|
|
DB P1
|
|
DB P2
|
|
endm
|
|
; $C0 = Dec Stack top and JNZ:
|
|
DSJNZ macro ADD_IT
|
|
DB $C0
|
|
DW ADD_IT
|
|
endm
|
|
; note: Music Processor also uses standard codes as $C3 for
|
|
; music JumP, $C9 for music RETurn, and $CD for music CALL.
|
|
;
|
|
; $D0 = Call RELative self+1 plus 0 to 15:
|
|
CREL macro BY
|
|
DB $D0 + (BY AND $0F)
|
|
endm
|
|
; $E0 = Flip LEGatto to STAcato:
|
|
LEGSTA macro
|
|
DB $E0
|
|
endm
|
|
REST macro TIME
|
|
DB $E1
|
|
DB TIME
|
|
endm
|
|
QUIET macro
|
|
DB $F0
|
|
endm
|
|
;
|
|
; *****************
|
|
; * MUSIC EQUATES *
|
|
; *****************
|
|
; NOTE Values:
|
|
G0 EQU $FD ; 253
|
|
GS0 EQU $EE ; 238
|
|
A0 EQU $E1 ; 225
|
|
AS0 EQU $D4 ; 212
|
|
B0 EQU $C8 ; 200
|
|
C1 EQU $BD ; 189
|
|
CS1 EQU $B2 ; 178
|
|
D1 EQU $A8 ; 168
|
|
DS1 EQU $9F ; 159
|
|
E1 EQU $96 ; 150
|
|
F1 EQU $8D ; 141
|
|
FS1 EQU $85 ; 133
|
|
G1 EQU $7E ; 126
|
|
GS1 EQU $77 ; 119
|
|
A1 EQU $70 ; 112
|
|
AS1 EQU $6A ; 106
|
|
B1 EQU $64 ; 100
|
|
C2 EQU $5E ; 94
|
|
CS2 EQU $59 ; 89
|
|
D2 EQU $54 ; 84
|
|
DS2 EQU $4F ; 79
|
|
E2 EQU $4A ; 74
|
|
F2 EQU $46 ; 70
|
|
FS2 EQU $42 ; 66
|
|
G2 EQU $3E ; 62
|
|
GS2 EQU $3B ; 59
|
|
A2 EQU $37 ; 55
|
|
AS2 EQU $34 ; 52
|
|
B2 EQU $31 ; 49
|
|
C3 EQU $2E ; 46
|
|
CS3 EQU $2C ; 44
|
|
D3 EQU $29 ; 41
|
|
DS3 EQU $27 ; 39
|
|
E3 EQU $25 ; 37
|
|
F3 EQU $22 ; 34
|
|
FS3 EQU $20 ; 32
|
|
G3 EQU $1F ; 31
|
|
GS3 EQU $1D ; 29
|
|
A3 EQU $1B ; 27
|
|
AS3 EQU $1A ; 26
|
|
B3 EQU $18 ; 24
|
|
C4 EQU $17 ; 23
|
|
CS4 EQU $15 ; 21
|
|
D4 EQU $14 ; 20
|
|
DS4 EQU $13 ; 19
|
|
E4 EQU $12 ; 18
|
|
F4 EQU $11 ; 17
|
|
FS4 EQU $10 ; 16
|
|
G4 EQU $0F ; 15
|
|
GS4 EQU $0E ; 14
|
|
A4 EQU $0D ; 13
|
|
C5 EQU $0B ; 11
|
|
CS5 EQU $0A ; 10
|
|
DS5 EQU $09 ; 9
|
|
F5 EQU $08 ; 8
|
|
G5 EQU $07 ; 7
|
|
A5 EQU $06 ; 6
|
|
C6 EQU $05 ; 5
|
|
DS6 EQU $04 ; 4
|
|
G6 EQU $03 ; 3
|
|
C7 EQU $02 ; 2
|
|
G7 EQU $01 ; 1
|
|
G8 EQU $00 ; 0
|
|
;
|
|
; MASTER OSCILATOR Offsets:
|
|
OB0 EQU $FE ; 254
|
|
OC0 EQU $F1 ; 241
|
|
OD1 EQU $D6 ; 214
|
|
OE1 EQU $BF ; 191
|
|
OF1 EQU $B4 ; 180
|
|
OG1 EQU $A0 ; 160
|
|
OA1 EQU $8F ; 143
|
|
OA2 EQU $47 ; 71
|
|
OA3 EQU $23 ; 35
|
|
OA4 EQU $11 ; 17
|
|
OA5 EQU $08 ; 8
|
|
;
|
|
;
|
|
; ***************************
|
|
; * SYSTEM RAM MEMORY Cells *
|
|
; ***************************
|
|
WASTE EQU $0FFF
|
|
WASTER EQU WASTE
|
|
;
|
|
SYSRAM EQU $4FCE ; Resides at the highest possible address
|
|
BEGRAM EQU SYSRAM ; typically used for initial Stack Pointer
|
|
; Used by MUSIC PROCESSOR:
|
|
MUZPC EQU $4FCE ; MUSic Program Counter
|
|
MUZSP EQU $4FD0 ; MUSic Stack Pointer
|
|
PVOLAB EQU $4FD2 ; Preset VOLume for tones A and B
|
|
PVOLMC EQU $4FD3 ; Preset VOLuMe for tone C and Noise Mode
|
|
VOICES EQU $4FD4 ; music VOICES mask
|
|
; COUNTER TIMERS (used by DECCTS,ACTINT,CTIMER):
|
|
CT0 EQU $4FD5 ; Counter Timer 0
|
|
CT1 EQU $4FD6 ; Counter Timer 1
|
|
CT2 EQU $4FD7 ; Counter Timer 2
|
|
CT3 EQU $4FD8 ; Counter Timer 3
|
|
CT4 EQU $4FD9 ; Counter Timer 4
|
|
CT5 EQU $4FDA ; Counter Timer 5
|
|
CT6 EQU $4FDB ; Counter Timer 6
|
|
CT7 EQU $4FDC ; Counter Timer 7
|
|
;Used by SENTRY to track controls:
|
|
CNT EQU $4FDD ; Counter update & Number Tracking
|
|
SEMI4S EQU $4FDE ; SEMAPHORE flag bitS
|
|
OPOT0 EQU $4FDF ; Old POT 0 tracking byte
|
|
OPOT1 EQU $4FE0 ; Old POT 1 tracking byte
|
|
OPOT2 EQU $4FE1 ; Old POT 2 tracking byte
|
|
OPOT3 EQU $4FE2 ; Old POT 3 tracking byte
|
|
KEYSEX EQU $4FE3 ; KEYS-EX tracking byte
|
|
OSW0 EQU $4FE4 ; Old SWitch 0 tracking byte
|
|
OSW1 EQU $4FE5 ; Old SWitch 1 tracking byte
|
|
OSW2 EQU $4FE6 ; Old SWitch 2 tracking byte
|
|
OSW3 EQU $4FE7 ; Old SWitch 3 tracking byte
|
|
COLLST EQU $4FE8 ; COLset LaST address for P.B. A
|
|
; Used by STIMER:
|
|
DURAT EQU $4FEA ; note DURATion
|
|
TMR60 EQU $4FEB ; TiMeR for SIXTY'ths of sec
|
|
TIMOUT EQU $4FEC ; TIMer for blackOUT
|
|
GTSECS EQU $4FED ; Game Time SECondS
|
|
GTMINS EQU $4FEE ; Game Time MINuteS
|
|
; Used by MENU:
|
|
RANSHT EQU $4FEF ; RANdom number SHifT register
|
|
NUMPLY EQU $4FF3 ; NUMber of PLaYers
|
|
ENDSCR EQU $4FF4 ; END SCoRe to 'play to'
|
|
MRLOCK EQU $4FF7 ; Magic Register LOCK out flag
|
|
GAMSTB EQU $4FF8 ; GAMe STatus Byte
|
|
PRIOR EQU $4FF9 ; PRIOR music protect flag
|
|
SENFLG EQU $4FFA ; SENtry control seizure FLaG
|
|
; User UPI Routines, even numbers from $80 to $FE ( + 1 for SUCK):
|
|
UMARGT EQU $4FFB ; User Mask ARGument Table + (routine / 2)
|
|
USERTB EQU $4FFD ; USER Table Base + routine = JumP address
|
|
;
|
|
URINAL EQU $4FFF ; WASTER flushes here!
|
|
;
|
|
;
|