total-carnage/MAIN.ASM

568 lines
13 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

**************************************************************
*
* Software: ?
* Initiated: ?
*
* Modified: Shawn Liptak, 8/?/91 -Clean up
*
* COPYRIGHT (C) 1991 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 9/6/91 13:28
**************************************************************
.FILE 'MAIN.ASM'
.TITLE 'INITIALIZATION AND INTERRUPTS'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
.INCLUDE "DISP.EQU" ;DISPLAY PROCESSOR EQUATES
.INCLUDE "\VIDEO\SYS\GSP.INC" ;GSP ASSEMBLER EQUATES
.INCLUDE "\VIDEO\SYS\SYS.INC" ;ZUNIT SYSTEM EQUATES
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS, YEAH!
.INCLUDE "GAME.EQU"
.INCLUDE "AUDIT.EQU"
*UTILITY SUBROUTINE EQUATES
.GLOBAL MYOINIT,SETPPROC,WDOGDIS,WDISTAB,INTIO
*PAL EQUATES
.GLOBL DELPAL,GETFPAL,INITBPAL,FINDPAL,INITPAL,PALTRANS,AUTOEON
*RAM EQUATES
.GLOBL INTSYNC0,INTSYNC1,NOAUTOE,SYSCOPY
.GLOBAL IRQSKYE,WDOGRAM
.GLOBAL GAMSTATE,GAMERASE
;EXTERNAL
.REF INIT_PROG,COLRTEMP,SWSTACK,SWTEMP1,SWTEMP2,PLYRPRCS
.REF DRAW_SCORE,SCORE_FLAG
.REF SWSTMN,C_FRAC,C_FLAGS,COINCNTR
.DEF INIT_ALL,CLSCRACH
;UNINITIALIZED RAM DEFINITIONS
.BSS EOSCRN,8,1
.BSS IRQLED,16
.BSS WDOGRAM,32 ;INITIALIZED LONG FOR WATCH DOG DETECT
.TEXT
INIT_ALL
CALLA INIT_SYS ;GENERAL SYSTEM INITIALIZATION
CALLA PINIT ;INIT PROCESS LIST
CALLA MYOINIT ;INITIALIZE THE OBJECT LIST
CALLA AUTOEON
EINT ;ENABLE INTERRUPTS AND WE'RE OFF
MOVK 1,A0
MOVE A0,@DISPLAYON
RETS ;RETURN TO FIRST GAME FILE
**************************************************************************
* *
* SYSTEM ROUTINES AND PROCESSES *
* *
**************************************************************************
;SCAN FOR PROCESS ACTIVATION ONLY
swscan
; MOVE @SWITCH,A0,L
MOVE @COINS,A0
MOVE @SWTEMP1,A1 ;PREVIOUS STATE T=N-1
MOVE @SWTEMP2,A2 ;PREVIOUS PREVIOUS T=N-2
MOVE A1,@SWTEMP2 ;NEW PREVIOUS PREVIOUS
MOVE A0,@SWTEMP1 ;NEW PREVIOUS
AND A1,A2
ANDN A0,A2 ;LOOK FOR 110
sll 16,a2
JREQ SWSCX ;NO SWITCHES
MOVE @SWSTACK,A3,L ;SWITCH ACTIVATION STACK
SWSCLP ;FIND BIT SET
CMPI SWSTMN,A3 ;SWITCH STACK OVERFLOW?
JREQ SWSCX1 ;YEP, QUIT
LMO A2,A0 ;1'S COMP LEFTMOST BIT
RL A0,A2 ;GET RID OF BIT
SLL 1,A2
MOVK 31,A1 ;CALC TRUE BIT #
SUB A0,A1
MOVE A1,-*A3 ;PUSH SWITCH NUMBER ON STACK (0-31)
RL A1,A2 ;RESTORE SWITCH WORD WITHOUT BIT
JRNE SWSCLP
SWSCX1 MOVE A3,@SWSTACK,L ;RESTORE SWITCH STACK
SWSCX RETS
********************************
INIT_SYS
CALLA PINIT
MOVI INAMODE,A0
MOVE A0,@GAMSTATE,W
MOVI WDOGNUM,A0
MOVE A0,@WDOGRAM,L ;MARK SYSTEM AS INITIALIZED
CALLA SNDRES ;SOUND BOARD INIT (MAKES SOUND!)
CALLR INITIO ;INITIALIZE THE I/O REGS
;SET UP TI PIXEL PROCESSING REGS
CALLA SETPPROC ;ONLY NEEDED FOR GSP ROUTINES?
CLR A0
MOVE A0,@DMACTRL ;OFF DMA
MOVE A0,@CMAPSEL ;CLEAR COLOR MAP SELECT
MOVI 81261A8CH,A0 ;INITIALIZE RANDOM SEED
MOVE A0,@RAND,L
MOVI DIE+X2E,A0
MOVE A0,@INTENB ;ENABLE DISPLAY INTERRUPTS
MOVI SYSCINIT,A0 ;INITIALIZE SYSTEM CONTROL REGISTER
MOVE A0,@SYSCTRL,W
MOVE A0,@SYSCOPY,W ;KEEP A COPY IN RAM
RETS
**************************************************************************
* *
* WDOGDIS - WATCH DOG DISABLE *
* NOTE: CALL WHILE INTERRUPTS ARE TURNED OFF. *
* *
**************************************************************************
WDOGDIS
MMTM SP,A0,A1,A2,A3
MOVI WDISTAB,A1
MOVK 1,A3
MOVE @SYSCOPY,A2,W
MOVE *A1+,A0,W
WDOGSL
OR A2,A0
MOVE A0,@SYSCTRL,W
XOR A3,A0
MOVE A0,@SYSCTRL,W
MOVE *A1+,A0,W
JRNN WDOGSL
MOVE A2,@SYSCTRL,W
MMFM SP,A0,A1,A2,A3
RETS
*
*WATCH DOG DISABLE TABLE
WDISTAB
.WORD 0
.WORD 0
.WORD 0
.WORD 0
.WORD 2
.WORD 0
.WORD 2
.WORD 0
.WORD 0FFFFH
**************************************************************************
* *
* CLSCRACH - CLEAR SCRATCH PAD
* NOTE: DESTROYS A0,A1,A2,A3 *
* *
**************************************************************************
CLSCRACH
PULL A3
CLR A0
MOVI SCRATCH,A1,L
MOVI >8000,A2,L ;CLEAR TWO AT A TIME
SCTLP MOVE A0,*A1+,L
DSJS A2,SCTLP
JUMP A3
**************************************************************************
* *
* DIRQ - DISPLAY IRQ, USES THE VALUE STORE @DPYINT TO DETERMINE *
* WHICH INTERRUPT THIS IS, HALF OR FULL SCREEN. @DPYINT IS *
* COMPARED AGAINST THE CONSTANT HSINT. *
* *
**************************************************************************
DIRQ
MMTM SP,B0,B1,B2,B3,B4,B5
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14
SETF 16,1,0 ;WORD SIGN EXTEND
MOVE @INTPEND,A1 ;CLEAR STUPID INTERRUPT PENDING
ANDNI DIE,A1
MOVE A1,@INTPEND
MOVE @INTENB,A1 ;DISABLE DISPLAY INTERRUPT
ANDNI DIE,A1
MOVE A1,@INTENB
EINT ;ENABLE OTHER INTERRUPTS
MOVE @DPYINT,A2 ;CHECK WHAT SCREEN HALF
CMPI HSINT,A2
JRNE DIRQ1 ;BR = END OF SCREEN INTERRUPT
**************************************************************************
* *
* DIRQ0 - HALF SCREEN INTERRUPT. TOP HALF OBJECTS ARE UPDATED, *
* OBJECT VELOCITIES ARE ADDED, SWITCHES FOR PLAYER MOVEMENT ARE *
* SCANNED, AND PLAYERS ARE UPDATED. *
* *
**************************************************************************
DIRQ0
MOVI EOSINT,A1 ;SET FOR EOSCRN INTERRUPT
MOVE A1,@DPYINT
MOVE @TIMER,A1 ;HIT PROCESS TIMER
INC A1
MOVE A1,@TIMER
MOVE @INTSYNC0,A0
INC A0
MOVE A0,@INTSYNC0 ;SYNC AT HALF SCREEN
CALLA DISPQT
callr swscan ;Scan misc switches for processes
MOVE @PLYRPRCS,A0,L ;Count down players delay detection
JRZ PL2
MOVE *A0(DELYDET),A1
JRZ PL2
DEC A1
MOVE A1,*A0(DELYDET)
PL2 MOVE @PLYRPRCS+32,A0,L
JRZ PL3
MOVE *A0(DELYDET),A1
JRZ PL3
DEC A1
MOVE A1,*A0(DELYDET)
PL3 MOVE @SCORE_FLAG,A0
JRZ NOSCORE
CALLA DRAW_SCORE ;DRAW WHOLE AREA
NOSCORE CALLA DISPLAY ;GOT TO MAKE THE DONUTS
JRUC DIRQX
**************************************************************************
* *
* DIRQ1 - END OF SCREEN INTERRUPT ROUTINE. BOTTOM HALF OF SCREEN UPDATED *
* COLOR RAM IS CYCLED, AND SWITCHES ARE SCANNED. *
* *
**************************************************************************
DIRQ1
move @SYSCOPY,a0
andni AUTOERAS,a0 ;Set AE on (0)
move @GAMERASE,a1
jrz dirq10 ;AUTO-ERASE disabled?
move @NOAUTOE,a1
jrz dirq12
dirq10 addk AUTOERAS,a0 ;Disable AUTO ERASE
dirq12 move a0,@SYSCOPY ;Store new value
move a0,@SYSCTRL
MOVE @IRQSKYE,@ERASELOC ;MOVE IN THE CORRECT COLOR
MOVI HSINT,A0
MOVE A0,@DPYINT ;RESET FOR HALF SCREEN INTERRUPT
MOVE @DPYCTL,A0 ;SHIFT REGISTER READ TO RESTART DMA
ORI SRT,A0
MOVE A0,@DPYCTL ;ENABLE SHIFT REG TRANSFER TO STOP DMA HALT
*** CLR A1
MOVI 400*>1000,A1
PIXT *A1,A2
ANDNI SRT,A0
MOVE A0,@DPYCTL
CALLA DISPH ;CALL END OF SCREEN DISPLAY ROUTINE
;UPDATE CYCLING COLOR RAM
MOVI COLRTEMP,A0 ;GET NEW COLORS
MOVI CYCOLORS,A1 ;GET ADDRESS OF CYCLE COLORS
; MOVE *A0+,*A1+,W ;GET THE ODD MAN
; MOVK 1,A6 ;COLOR COUNT/2 (FINAL TWO COLORS IN PAL 0)
;WILL CYCLE
MOVE *A0+,*A1+,L
; DSJS A6,COLORUP
CALLA PALTRANS ;XFER NEW PALETTES IF NECESSARY
MOVE @INTSYNC1,A0
INC A0
MOVE A0,@INTSYNC1 ;SYNC UP AT END OF SCREEN
callr swscan ;Scan misc switches
dint
MOVE @INTENB,A0 ;ENABLE DISPLAY INTERRUPT
ORI DIE,A0
MOVE A0,@INTENB
.IF DEBUG
MOVE @TIMER,A0
CMPI 5AH,A0
JRLT NOLOK
LOCKUP
EINT
NOLOK
.ENDIF
MOVE @IRQLED,A0
INC A0
SLL 29,A0
SRL 29,A0
MOVE A0,@IRQLED
JRNE DIRQX
*
*DO EVERYTHING FROM HERE TO DIRQX EVERY 8 TICKS
*
.IF DEBUG
.ELSE
MOVE @TIMER,A0
CMPI 200,A0
JRLO SKIP_INIT
.REF AUD1
MOVI AUDHANG,A0
CALLA AUD1
JAUC INIT_PROG ;REST ON LOCKUP
SKIP_INIT
.ENDIF
MOVE @C_FRAC,A0 ;COUNT DOWN COIN FRACTION TIMER
JRZ C_TIM0 ;NOTHING THERE
SLL 24,A0
SRL 24,A0 ;THIS IS 30 SECONDS.....IF LARGER BRING DOWN!
DEC A0
MOVE A0,@C_FRAC
*COIN TIMERS
C_TIM0
MOVE @C_FLAGS,A0,L
JRZ C_CNTR
MOVI C_FLAGS+24,A2
MOVK 4,A4
CTIMLP
MOVE A0,A1
SRL 24,A1
JRZ C_TIM1
DEC A1
MOVB A0,*A2
C_TIM1
SUBK 8,A2
SLL 8,A0
DSJS A4,CTIMLP
*COIN COUNTERS
C_CNTR
MOVE @COINCNTR,A0,L ;COUNTERS, TIMERS ACTIVE????
JREQ L_DOG ;NO
MOVK 2,A4 ;DO BOTH COUNTERS
MOVI COINCNTR,A5
CCNTR0L
MOVB *A5,A1 ;MORE COUNTS FOR COUNTER ?
JREQ C_CNTR0 ;NO
MOVB *A5(16),A2 ;PREVIOUS PULSE TIME OUT?
JRNE C_CNTR0 ;NO
MOVK 2,A2
MOVB A2,*A5(16) ;START NEW PULSE
DEC A1 ;DECREMENT COUNTS
MOVB A1,*A5
C_CNTR0
ADDK 8,A5
DSJS A4,CCNTR0L
CLR A2 ;COUNTER ON MASK
MOVI >100,A3
MOVK 2,A4
C_CNTR1L
MOVB *A5,A0 ;COUNTER TIMER ACTIVE?
JREQ C_CNTR1 ;NO
DEC A0 ;YES, DEC IT AND STORE
MOVB A0,*A5
JREQ C_CNTR1 ;DONE
ADD A3,A2 ;TURN COUNTER SOLENOID ON
C_CNTR1
SLL 1,A3
ADDK 8,A5
DSJS A4,C_CNTR1L
.IF YUNIT
CLR A1
MOVE A1,@SECCHIP,W
MOVE A2,@SECCHIP,W ;REFRESH COUNTERS IN HARDWARE
.ENDIF
L_DOG
MOVI WDOGBONE,A1 ;THROW ROVER A BONE
MOVK 1,A3
MOVE @SYSCOPY,A2,W
MOVE *A1+,A0,W
ROVERL
OR A2,A0
MOVE A0,@SYSCTRL,W
XOR A3,A0
MOVE A0,@SYSCTRL,W
MOVE *A1+,A0,W
JRNN ROVERL
MOVE A2,@SYSCTRL,W
DIRQX MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14
MMFM SP,B0,B1,B2,B3,B4,B5
RETI
*WATCHDOG FEED TABLE
WDOGBONE
.WORD 0
.WORD 2
.WORD 0
.WORD 2
.WORD 2
.WORD 0FFFFH
**************************************************************************
* *
* INITIO - INITIALIZE THE GSP I/O REGISTERS *
* *
**************************************************************************
INITIO
MMTM SP,B0,B2,B6,B10
MOVI INTIO,B6
EXGPC B6
MMFM SP,B0,B2,B6,B10
RETS
*INITIALIZE I/O
*USE REGISTER CALL FOR TEST MODE NON-RAM USE
INTIO
MOVI HESYNC,B2,L
MOVI INITDATA,B0,L
MOVI (IDATAEND-INITDATA)/16,B10
INITIOS MOVE *B0+,*B2+
DSJS B10,INITIOS
EXGPC B6
**************************************************************************
* *
* BADTRAP - COME HERE WHEN A TRAP IS HIT THAT IS NOT DEFINED AND LOG IT. *
* *
**************************************************************************
BADTRAP1 nop
BADTRAP2 nop
BADTRAP3 nop
BADTRAP4 nop
BADTRAP5 nop
BADTRAP6 nop
BADTRAP7 nop
BADTRAP8 nop
BADTRAP9 nop
BADTRAP10 nop
BADTRAP11 nop
BADTRAP12 nop
BADTRAP13 nop
BADTRAP14 nop
BADTRAP15 nop
BADTRAP16 nop
BADTRAP17 nop
BADTRAP18 nop
BADTRAP19 nop
BADTRAP20 nop
BADTRAP21 nop
BADTRAP22 nop
BADTRAP23 nop
BADTRAP24 nop
BADTRAP25 nop
BADTRAP26 nop
BADTRAP27 nop
BADTRAP28
JRUC BADTRAP
BADTRAP29
.IF DEBUG
LOCKUP ;THIS WILL BAG WRITES INTO ROM!
EINT
.ENDIF
BADTRAP
.IF DEBUG
LOCKUP
EINT
.ELSE
CALLERR 9,0
PUSH A0
movi AUDTRAP,a0 ;BAD TRAPS
calla AUD1
PULL A0
.ENDIF
RETI
* VIDEO CONTROL REGISTERS INITIAL VALUES
INITDATA:
.WORD 015H ;>C0000000 -- HESYNC
.WORD 032H ;>C0000010 -- HEBLNK ;WAS A 2DH!! 7/26/91
.WORD 0FAH ;>C0000020 -- HSBLNK ;F3
.WORD 0FCH ;>C0000030 -- HTOTAL
.WORD 03H ;>C0000040 -- VESYNC
.WORD 014H ;>C0000050 -- VEBLNK;1B
.WORD 0114H ;>C0000060 -- VSBLNK;11B
.WORD 0120H ;>C0000070 -- VTOTAL
.WORD 0F010H ;>C0000080 -- DPYCTL
.WORD 0FFFCH ;>C0000090 -- DPYSTRT
.WORD HSINT ;>C00000A0 -- DPYINT * INITIALLY HALF SCREEN
; .WORD INI_CTRL ;>C00000B0 -- CONTROL
; .WORD >20 ;>C00000B0 -- CONTROL
.WORD >28 ;>C00000B0 -- CONTROL
.WORD 00H ;>C00000C0 -- HSTDATA
.WORD 00H ;>C00000D0 -- HSTADRL
.WORD 00H ;>C00000E0 -- HSTADRH
.WORD 00H ;>C00000F0 -- HSTCTLL
.WORD 00H ;>C0000100 -- HSTCTLH
.WORD 00H ;>C0000110 -- INTENBL
.WORD 00H ;>C0000120 -- INTPEND
.WORD 00H ;>C0000130 -- CONVSP
.WORD 00H ;>C0000140 -- CONVDP
.WORD PXSIZE ;>C0000150 -- PSIZE
.WORD 00H ;>C0000160 -- PMASK
.WORD 00H ;>C0000170 -- RESERVED
.WORD 00H ;>C0000180 -- RESERVED
.WORD 00H ;>C0000190 -- RESERVED
.WORD 00H ;>C00001A0 -- RESERVED
.WORD 00H ;>C00001B0 -- DPYTAP
IDATAEND:
*
*INITIALIZE ALL 32 TRAP VECTORS
*
.SECT "VECTORS"
.LONG BADTRAP1 ;TRAP 31
.LONG BADTRAP2 ;TRAP 30 ILLOP --- ILLEGAL OPCODE
.LONG BADTRAP3 ;TRAP 29
.LONG BADTRAP4 ;TRAP 28
.LONG BADTRAP5 ;TRAP 27
.LONG BADTRAP6 ;TRAP 26
.LONG BADTRAP7 ;TRAP 25
.LONG BADTRAP8 ;TRAP 24
.LONG BADTRAP9 ;TRAP 23
.LONG BADTRAP10 ;TRAP 22
.LONG BADTRAP11 ;TRAP 21
.LONG BADTRAP12 ;TRAP 20
.LONG BADTRAP13 ;TRAP 19
.LONG BADTRAP14 ;TRAP 18
.LONG BADTRAP15 ;TRAP 17
.LONG BADTRAP16 ;TRAP 16
.LONG BADTRAP17 ;TRAP 15
.LONG BADTRAP18 ;TRAP 14
.LONG BADTRAP19 ;TRAP 13
.LONG BADTRAP20 ;TRAP 12
.LONG BADTRAP21 ;TRAP 11 WV --- WINDOW VIOLATION
.LONG DIRQ ;TRAP 10 DI --- DISPLAY INTERRUPT
.LONG BADTRAP22 ;TRAP 9 HI --- HOST INTERRUPT
.LONG BADTRAP23 ;TRAP 8 NMI -- NONMASKABLE INTERRUPT
.LONG BADTRAP24 ;TRAP 7
.LONG BADTRAP25 ;TRAP 6
.LONG BADTRAP26 ;TRAP 5
.LONG BADTRAP27 ;TRAP 4
.LONG BADTRAP28 ;TRAP 3
.LONG BADTRAP29 ;TRAP 2 INT2 --- EXTERNAL INTERRUPT 2
.LONG DMAINT ;TRAP 1 INT1 --- EXTERNAL INTERRUPT 1
.LONG INIT_PROG ;TRAP 0 RESET
.END