************************************************************** * * 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