************************************************************** * * Software: Shawn Liptak and ? * Initiated: ? * * Modified: Shawn Liptak, 8/?/91 -Clean up * Shawn Liptak, 1/27/92 -Basketball start * Shawn Liptak, 3/19/93 -Clean up * * COPYRIGHT (C) 1992 WILLIAMS ELECTRONICS GAMES, INC. * *.Last mod - 3/19/93 13:59 ************************************************************** .file "main.asm" .title "initialization and interrupts" .width 132 .option b,d,l,t .mnolist .include "audit.equ" .include "mproc.equ" .include "display.equ" .include "gsp.equ" .include "sys.equ" .include "game.equ" .include "dip.equ" .include "macros.h" .include "wwfsec.equ" ****************************************************************************** * EXTERNAL REFERENCES .ref RESET_VOICE_QUEUE,ANNOUNCE_VOICE .ref set_up_line_tables .ref swstackbot .ref process_init .ref C_FLAGS .ref display_init .ref GAMSTATE .ref dma_irq .ref swstacktop .ref C_FRAC .ref READ_DIP .ref init_prog .ref swstack_p .ref COINCNTR .ref pal_transfer .ref _sound_addr .ref _coin_addr .ref _switch_addr .ref _switch2_addr .ref _watchdog_addr .ref _dipswitch_addr .ref _soundirq_addr .ref _coin_counter_addr .ref _get_time .ref _aquire_time .ref _tmonth .ref _tdate .ref _thours .ref _tminutes .ref _tseconds ;from DCSSOUND.ASM .ref qsndrst_proc .def InitPIC .def SecFuncCheck .globl RemapIO .globl InitPIC .globl _clk_rd .globl SecFuncCheck ALARM_MAC .macro month,date,hour,minute,func .word :month: ;month number 1-12 (-1 = don't care) .word :date: ;date (1-31) (-1 = don't care) .word :hour: ;hour (0-23) (-1 = don't care) .word :minute: ;minute (0-59) (-1 = don't care) .long :func: ;func - Pointer to function to call .endm .bss _clk_rd,32 ;Clock Trigger Counter .bss _io_map,32 ;Current I/O Map BSSX dma_bog,16 ;VCOUNT at end of DIRQ BSSX dma_meter,16 ;show line? BSSX cpu_meter,16 ;show line for cpu ****************************************************************************** ;ram BSSX SYSCOPY ,16 ;Copy of SYSCTRL latch BSSX WDOGRAM ,32 ;INITIALIZED LONG FOR WATCH DOG DETECT BSSX IRQSKYE ,16 ;Erase color BSSX dpageflip ,16 ;1=Enable page flip and erasure, 0=No erasure BSSX dirqtimer ,16 ;+1 by dirq, cleared by mproc BSSX dirqcnt ,16 ;+1 each dirq .bss dirqdraw ,16 ;!0=Still drawing last frame .bss swtemp1 ,32 .bss swtemp2 ,32 .bss FSWITCH ,64 BSSX switches_old ,64 BSSX switches_cur ,64 BSSX switches_up ,64 BSSX switches_down ,64 BSSX NPLAYERS ,16 ;NUMBER OF PLAYERS ALLOWED BSSX COUNTER_MODE ,16 ;COIN COUNTER MODE BSSX VALIDATOR ,16 ;VALIDATOR FLAG 0 = NONE, 1 = INSTALLED BSSX TWOPLAYERS ,16 ;0 = NO, 1 = YES 2 players BSSX ROLLING_COUNT,16 .data ALARM_TAB ALARM_MAC -1,-1,-1,38,RemapIO ;Remap I/O at 38 minutes past hour ALARM_MAC -1,-1,11,4,RemapIO ;Remap I/O at 11:04 a.m. every day ALARM_MAC -1,31,16,27,RemapIO ;Remap I/O on the 31st at 4:27 p.m. ALARM_MAC 4,1,12,30,RemapIO ;Remap I/O at 12:30 p.m. on April fools day .long 0 .even _SecurityFunctions .long SetAddresses .even .text ******************************** * Alarm Clock Support (Called by DIRQ when seconds are 0) * Trashes a0 SUBR _AlarmClock mmtm sp,a0,a1,a2 movi ALARM_TAB,a0,L _ac_loop move *a0,a1,W ;Get Alarm month jrz _ac_done ;BR = No more alarm settings jrn _ac_date ;Do we care what month BR = NO move @_tmonth,a2,W ;Get current month cmp a1,a0 ;Same ? jrnz _ac_next ;Nope - Done with this alarm _ac_date move *a0(16),a1,W ;Get Alarm Date jrn _ac_hour ;Do we care what date BR = no move @_tdate,a2,W ;Get current date cmp a1,a2 ;Same ? jrnz _ac_next ;Nope - Done with this alarm _ac_hour move *a0(32),a1,W ;Get Alarm Hour jrn _ac_minute ;Do we care what hour BR = no move @_thours,a2,W ;Get current hour cmp a1,a2 ;Same ? jrnz _ac_next ;Nope - Done with this alarm _ac_minute move *a0(48),a1,W ;Get Alarm minute jrn _ac_next ;Do we care what minute BR = no move @_tminutes,a2,W ;Get current minute cmp a1,a2 ;Same ? jrnz _ac_next ;Nope - Done with this alarm move *a0(64),a0,L ;Yes - run this alarm function call a0 _ac_next addi 96,a0 ;Increment to next alarm record jruc _ac_loop _ac_done mmfm sp,a0,a1,a2 ;All done - restore registers rets ;Go back to interrupt handler ******************************** * Remap I/O space - Changes the I/O map * Trashes a0,a1 SUBR RemapIO ;temp! ; rets move @_io_map,a0,L ;Get Current I/O map addk 1,a0 ;Increment it cmpi 5,a0 ;>= 5? jrlt #map_ok ;Nope - then use it clr a0 ;else reset it back to 0 #map_ok move a0,@_io_map,L ;a0 = I/O map number clr a1 ;a1 = SetAddresses Trap Request trap 3 ;Remap I/O space rets RemapIO_End SecFuncTable .long RemapIO,RemapIO_End .word 06a9h ;This is a checksum of the function .long 0 ****************************************************************************** SUBR InitAddresses movi COINS,a0 move a0,@_coin_addr,L movi SWITCH,a0 move a0,@_switch_addr,L movi SWITCH2,a0 move a0,@_switch2_addr,L movi WATCHDOG,a0 move a0,@_watchdog_addr,L movi DIPSWITCH,a0 move a0,@_dipswitch_addr,L movi SOUND,a0 move a0,@_sound_addr,L movi SOUNDIRQ,a0 move a0,@_soundirq_addr,L movi COIN_COUNTERS,a0 move a0,@_coin_counter_addr,L movi VMUX_INITMODE,a0 move a0,@VMUX_CONTROL rets ****************************************************************************** SUBR AddressSet1 movi COINS_M1,a0 move a0,@_coin_addr,L movi SWITCH_M1,a0 move a0,@_switch_addr,L movi SWITCH2_M1,a0 move a0,@_switch2_addr,L movi WATCHDOG_M1,a0 move a0,@_watchdog_addr,L movi DIPSWITCH_M1,a0 move a0,@_dipswitch_addr,L movi SOUND_M1,a0 move a0,@_sound_addr,L movi SOUNDIRQ_M1,a0 move a0,@_soundirq_addr,L movi COIN_COUNTERS_M1,a0 move a0,@_coin_counter_addr,L movi (VMUX_INITMODE|VMUX_MODE1),a0 move a0,@VMUX_CONTROL rets ****************************************************************************** SUBR AddressSet2 movi COINS_M2,a0 move a0,@_coin_addr,L movi SWITCH_M2,a0 move a0,@_switch_addr,L movi SWITCH2_M2,a0 move a0,@_switch2_addr,L movi WATCHDOG_M2,a0 move a0,@_watchdog_addr,L movi DIPSWITCH_M2,a0 move a0,@_dipswitch_addr,L movi SOUND_M2,a0 move a0,@_sound_addr,L movi SOUNDIRQ_M2,a0 move a0,@_soundirq_addr,L movi COIN_COUNTERS_M2,a0 move a0,@_coin_counter_addr,L movi (VMUX_INITMODE|VMUX_MODE2),a0 move a0,@VMUX_CONTROL rets ****************************************************************************** SUBR AddressSet3 movi COINS_M3,a0 move a0,@_coin_addr,L movi SWITCH_M3,a0 move a0,@_switch_addr,L movi SWITCH2_M3,a0 move a0,@_switch2_addr,L movi WATCHDOG_M3,a0 move a0,@_watchdog_addr,L movi DIPSWITCH_M3,a0 move a0,@_dipswitch_addr,L movi SOUND_M3,a0 move a0,@_sound_addr,L movi SOUNDIRQ_M3,a0 move a0,@_soundirq_addr,L movi COIN_COUNTERS_M3,a0 move a0,@_coin_counter_addr,L movi (VMUX_INITMODE|VMUX_MODE3),a0 move a0,@VMUX_CONTROL rets ****************************************************************************** SUBR AddressSet4 movi COINS_M4,a0 move a0,@_coin_addr,L movi SWITCH_M4,a0 move a0,@_switch_addr,L movi SWITCH2_M4,a0 move a0,@_switch2_addr,L movi WATCHDOG_M4,a0 move a0,@_watchdog_addr,L movi DIPSWITCH_M4,a0 move a0,@_dipswitch_addr,L movi SOUND_M4,a0 move a0,@_sound_addr,L movi SOUNDIRQ_M4,a0 move a0,@_soundirq_addr,L movi COIN_COUNTERS_M4,a0 move a0,@_coin_counter_addr,L movi (VMUX_INITMODE|VMUX_MODE4),a0 move a0,@VMUX_CONTROL rets AddressTable .long InitAddresses, AddressSet1, AddressSet2 .long AddressSet3, AddressSet4 ****************************************************************************** ; A0 = Address Set to install (0-4) SUBR SetAddresses move a0,a0 jrn _invalid cmpi 4,a0 jrgt _invalid sll 5,a0 addi AddressTable,a0 move *a0,a0,L pushst dint call a0 popst _invalid rets ********************************** * SecFuncCheck - Checks to make sure security functions have not be mucked with * Trashes a0,a1,a2,a3, a4 SUBR SecFuncCheck rets ;<----------------temp!!!!!!!!!!!!!!!!!!!!!! movi SecFuncTable,a0,L ;Table of security functions to check SFC_loop move *a0+,a1,L ;Pointer to beginning of function jrz SFC_done move *a0+,a2,L ;Pointer to end of function sub a1,a2 srl 3,a2 clr a3 SFC_iloop movb *a1,a4 andi 0ffh,a4 add a4,a3 addk 8,a1 dsjs a2,SFC_iloop move *a0+,a4,W cmp a4,a3 jrz SFC_loop LOCKUP SFC_done *************************************************************** * InitPIC - Initializes the PIC Microcontroller * SUBR InitPIC calla InitAddresses clr a0 ;Reset the PIC move @_coin_counter_addr,a1,L move a0,*a1,W movk 10,a0 ;Hold RESET fer a bit dsjs a0,$ movk 010h,a0 ;Set no command request move a0,@PIC_COMMAND,W movk 020h,a0 ;Allow PIC to run move @_coin_counter_addr,a1,L move a0,*a1,W movi 200000000,a1 _pwait_loop move @_soundirq_addr,a0,L move *a0,a0,W btst 12,a0 jrz _pnwait move @_watchdog_addr,a0,L move a0,*a0 dsjs a1,_pwait_loop _pnwait movk 010h,a0 move a0,@PIC_COMMAND,W movi 2000000,a1 _pwait_loop1 move @_soundirq_addr,a0,L move *a0,a0,W btst 12,a0 jrnz _pwait_done move @_watchdog_addr,a0,L move a0,*a0 dsjs a1,_pwait_loop1 _pwait_done rets ******************************** * Init hardware, IO, RAM * Trashes scratch, A2-A7 SUBR init_all dint ;No interrupts until addresses set up clr a0 ;>Clr scratch mem movi SCRATCH,a1 movi >18000-20,a2 ;128K minus some stack #lp move a0,*a1+,L dsjs a2,#lp calla set_up_line_tables movi -1,a0 ;Auto Clock update OFF move a0,@_clk_rd,L calla InitPIC ;Initialize the PIC movi WDOGNUM,a0 move a0,@WDOGRAM,L ;Mark system as initialized movi SYSCINIT|WPIROM,a0 move a0,@SYSCTRL move a0,@SYSCOPY ;Copy callr io_init ;Initialize the I/O regs calla display_init ;Init display system calla process_init ;Init process list movk INAMODE,a0 move a0,@GAMSTATE movi 81261A8CH,a0 ;Random seed move a0,@RAND,L movi swstacktop,a0 ;Initialize switch stack move a0,@swstack_p,L callr dip_init ;Initialize the dipswitches CREATE QSNDRST_PID,qsndrst_proc ;Init sound board CALLA RESET_VOICE_QUEUE CREATE VOICE_PID,ANNOUNCE_VOICE movk 1,a0 move a0,@DISPLAYON ;clear write-to-rom ints ; Toddview messes with the interrupt vector table at startup, ; and we end up with a pending WROM int. Clear it out to avoid ; hanging right off the bat. move @SYSCOPY,a0 xori 02000h,a0 move a0,@SYSCTRL move @SYSCOPY,a0 move a0,@SYSCTRL eint rets ******************************** * Initialize options via dip switch settings dip_init PUSH a0,a1 calla READ_DIP ;Get the current dip switch bits move a0,a1 andi DPPLAYERS,a0 ;AQUIRE THE NUMBER OF PLAYERS sll 3,a0 addi #pnum_t,a0 movb *a0,a0 move a0,@NPLAYERS move a1,a0 andi DPCOUNTER,a0 srl DPCOUNTER_SRL-3,a0 addi #cntr_t,a0 movb *a0,a0 ;Match eugene's old shit move a0,@COUNTER_MODE move a1,a0 andi DPVALIDATOR,a0 ;AQUIRE THE VALIDATOR STATUS srl DPVALIDATOR_SRL,a0 move a0,@VALIDATOR ;SAVE IT move a1,a0 andi DPPLAYERS,a0 move a0,@TWOPLAYERS ;0=4 plyrs, 1=2 plyrs PULL a0,a1 rets ;Translate dipswitch into number of players allowed #pnum_t .byte 4,2 ;Translate dipswitch coin counter adjustment to what the old cmos values were #cntr_t .byte 2,3,1,2 .even ************************************************************************** * Initialize GSP I/O registers io_init PUSH b2,b6 movi INTIO,b6 exgpc b6 PULL b2,b6 rets #******************************* * Initialize GSP I/O registers * B6=*Return address * Trashes B0-B2 SUBR INTIO movi HESYNC,b2 movi gspioinit_t,b0 movi (giiend-gspioinit_t)/16,b1 #lp move *b0+,*b2+ dsj b1,#lp movi VMUX_INITMODE,a0 move a0,@VMUX_CONTROL,W exgpc b6 #******************************* * Watch dog disable * Note: Call while interrupts are turned off SUBR WDOGDIS .if TUNIT=0 PUSH a0,a1,a2,a3,a4 pushst setf 16,1,0 movi #dis_t,a1 move @SYSCOPY,a2 movk 1,a3 movi SYSCTRL,a4 move *a1+,a0 #lp or a2,a0 move a0,*a4 xor a3,a0 move a0,*a4 move *a1+,a0 jrnn #lp move a2,*a4 popst PULL a0,a1,a2,a3,a4 rets #dis_t .word 0,0,0,0, 2,0,2,0, -1 ;WATCH DOG DISABLE TABLE .else rets .endif **************************************************************** * Display IRQ DIRQ mmtm sp,b0,b1,b2,b3,b4,b5,b6,b7,b11 mmtm sp,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14 setf 1,0,0 move sp,@INTPEND+DIP ;Clear int pending move sp,@INTENB+DIP ;Disable display int eint ;Let DMA int run setf 16,1,0 ;Word sign extend MOVE @ROLLING_COUNT,A1 INC A1 MOVE A1,@ROLLING_COUNT movi DPYCTL,a8 move *a8,a7 ;>Shift register read to restart DMA movi NIL|DXV|SRT|>10,a0 move a0,*a8 movi 510*>1000,a2 ;*Autoerase lines pixt *a2,a2 ;Mem to shift reg xfer callr switch_stack ;Scan misc switches move @dirqdraw,a0 jrnz di50 ;In draw code? move b13,b0 jrn #chkmp ;DMA done? move @GAMSTATE,a0 jrn #chkmp ;In diagnostics? (B13 invalid) movi 26000/4,a1 ;>Make sure DMA is OK #dqwait cmp b13,b0 jrne di50 ;DMAQ changed? dsj a1,#dqwait .if DEBUG trap 29 .endif clr a1 move a1,@DMACTRL ;Timed out move a1,@DMACTRL subk 1,a1 move a1,b13 di50 move a7,*a8 ;Restore jruc #60hzcode ;Skip flip #chkmp move @dirqtimer,a1 jrnz di50 ;Mproc not done? move @dpageflip,a2 jrz di400 ;Flipping off? ; movi -4,a0 ;Page0 movk 4,a0 ; this save 1 cycle neg a0 movi PAGE1YO*>1000,b2 ;*Page1 move @dpage,a1 jrnz #onp1 movi ->1004,a0 ;Page1 clr b2 ;*Page0 #onp1 move a0,@DPYSTRT ;If we don't page flip next time move a0,@DPYADR ;Override DPYSTRT not a1 ;Flip move a1,@dpage dint movi 26000/8,a1 ;>Wait on last DMA #dwait move @DMACTRL,a0 jrnn #dmaoff ;DMA stopped? dsj a1,#dwait move a1,@DMACTRL ;Timed out .if DEBUG trap 29 .endif #dmaoff move a2,a2 jrn #noerase ;Erase off? movi CONTROL,a9 ;>Clear whole page move *a9,a6 ;NEW - This is a bug - NEVER Turn OFF CAS before RAS Refreshes ;There is a possibility that by putting an 8 in the CONTROL register ;the Dynamic RAM device's (Bitmap RAM and/or Scratch RAM) could lose ;data. Because the amount of time that CAS before RAS refreshes are turned ;off is very short, the probabilty of actual data loss is minimal. Data ;loss could occur if the CAS before RAS refreshes are shut off just prior ;to a refresh cycle occuring. This is not very likely though because of the ;asynchronous nature of the 34010's refresh cycles. Setting the control ;register to 0ch will guarentee that there will be no possibilty of losing ;refresh cycles to the DRAM and VRAM devices. This NOTE is here simply to ;explain the reason for the code change below. ; ---> movk 8,a0 <--- MOVk 0ch,a0 move a0,*a9 ;Transparency off movk 16,a0 move a0,@PSIZE movi SCRN_PTCH*2,b3 ;Pitch (2 lines) PUSH b10,b11,b12,b13,b14 movi [127,1],b7 ;Rows:Columns fill l PULL b10,b11,b12,b13,b14 move a6,*a9 ;Restore movk PXSIZE,a0 move a0,@PSIZE ;Normal #noerase di400 move a7,*a8 ;Restore eint calla pal_transfer ;Copy new PALs move @IRQSKYE,@ERASELOC ;Copy bkgnd color ; move @COLRTEMP,a0,L ; jrz #notindiag ; movi CYCOLORS,a1 ; move a0,*a1+,L ;Copy diagnostics color cycler ; move @COLRTEMP+32,*a1,L ;#notindiag ; callr switch_stack ;Scan misc switches movk 1,a0 move a0,@dirqdraw setf 1,0,0 ;Enable display int move a0,@INTENB+DIP setf 16,1,0 calla DISPLAY ;Build DMAQ, update XYPOS dint clr a0 move a0,@dirqdraw ;Draw done #60hzcode ;*** This code must run at 60HZ move @_clk_rd,a2,L ;Increment the time get counter jrn _no_gt ;If negative then no auto clock update addk 1,a2 move a2,@_clk_rd,L cmpi 1,a2 ;Time to transfer the time? jrz _gt ;BR = yes go get time xori 01bh,a2 ;Time to trigger time aquisition? jrnz _no_gt ;BR = nope - exit move a2,@_clk_rd,L ;Set counter back to 0 calla _aquire_time ;Trigger time aquistion jruc _no_gt ;Done _gt calla _get_time ;Transfer time from PIC move @_tseconds,a2,W ;Seconds = 0 ? jrnz _no_gt ;BR = Nope - all done calla _AlarmClock ;else - go check for alarm functions _no_gt .if WWFUNIT .else movi SWITCH,a2 .endif movi FSWITCH,a3 .if WWFUNIT ; move @SWITCH,a2 ; move @COINS,a0 move @_switch_addr,a2,L move *a2,a2 move @_coin_addr,a0,L move *a0,a0 sll 16,a0 ; andi 0ffffh,a2 ; 3,12 ; or a2,a0 ; 1,4 movx a2,a0 ; 1,4 .else move *a2+,a0,L .endif not a0 move a0,*a3+,L .if WWFUNIT ; move @SWITCH2,a0 ; move @DIPSWITCH,a1 move @_switch2_addr,a0,L move *a0,a0 move @_dipswitch_addr,a1,L move *a1,a1 sll 16,a1 ; andi 0ffffh,a2 ; 3,12 ; or a2,a0 ; 1,4 movx a0,a1 ; 1,4 .else move *a2,a1,L .endif not a1 move a1,*a3,L move @switches_cur,a2,L move a2,@switches_old,L move @FSWITCH,a1,L move a1,@switches_cur,L move a2,a0 xor a1,a2 ;down transitions and a1,a2 move a2,@switches_down,L xor a0,a1 ;up transitions and a0,a1 move a1,@switches_up,L move @switches_cur+20h,a2,L move a2,@switches_old+20h,L move @FSWITCH+20h,a1,L move a1,@switches_cur+20h,L move a2,a0 xor a1,a2 ;down transitions and a1,a2 move a2,@switches_down+20h,L xor a0,a1 ;up transitions and a0,a1 move a1,@switches_up+20h,L move @dirqtimer,a1 ;Tell mproc to run addk 1,a1 move a1,@dirqtimer ; callr switch_stack ;Scan misc switches MOVK 5,A1 MOVI C_FLAGS,A2 ALL_COUNTERS_DONE MOVB *A2,A3 JRZ NO_WORRY_COUNTER SUBK 1,A3 MOVE A3,*A2 NO_WORRY_COUNTER ADDK 8,A2 DSJS A1,ALL_COUNTERS_DONE dint setf 1,0,0 ;Enable display int movk 1,a1 move a1,@INTENB+DIP setf 16,1,0 move @dirqcnt,a0 addk 1,a0 move a0,@dirqcnt sll 32-3,a0 jrnz dirqx ;Skip? ;>Do every 8 ticks .if DEBUG .else move @dirqtimer,a0 cmpi 400,a0 jahs init_prog ;Reset? .endif move @C_FRAC,a0 ;>Count down coin fraction timer jrz #nfrc ;No frac? sll 32-8,a0 srl 32-8,a0 subk 1,a0 move a0,@C_FRAC #nfrc ;>Coin counters move @COINCNTR,a0,L jrz l_dog ;Counters, timers inactive? movk 2,a4 ;do both counters movi COINCNTR,a5 ccntr0l movb *a5,a1 ;more counts for counter ? jrz c_cntr0 ;no movb *a5(16),a2 ;previous pulse time out? jrnz 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 1,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 move @_coin_counter_addr,a0,L ori 32,a2 andi 21h,a2 ;only set bits 5 and maybe 0. move a2,*a0,W l_dog .if TUNIT2 ; move a0,@WATCHDOG ;Hit move @_watchdog_addr,a0,L move a0,*a0 .else movi wdogbone_t,a1 ;>Clock watchdog move @SYSCOPY,a2 movk 1,a3 movi SYSCTRL,a4 move *a1+,a0 roverl or a2,a0 move a0,*a4 xor a3,a0 move a0,*a4 move *a1+,a0 jrnn roverl ;More? move a2,*a4 ;Restore .endif move @VCOUNT,a14 move a14,@dma_bog 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,b6,b7,b11 reti wdogbone_t .word 0,2,0,2,2,-1 ;Watchdog feed table #******************************* * Scan switches SUBRP switch_stack ; move @COINS,a0,W ; move @SWITCH,a1,W ;02/23/95 - This maps the Test Dipswitch onto the TEST switch from the ; coindoor when NOT in Diagnostics mode - This allows the diagnostics ; process to be triggered by the TEST dipswitch move @GAMSTATE,a0,W jrn #no_testsw_map move @_dipswitch_addr,a1,L move *a1,a1,W sll 4,a1 ori 0ffefh,a1 #no_testsw_map move @_coin_addr,a0,L move *a0,a0,W and a1,a0 move @_switch_addr,a1,L move *a1,a1,W sll 16,a0 ; sll 16,a1 ;mask off top 16 ; srl 16,a1 ; or a1,a0 movx a1,a0 ori >6600ffff,a0 ;Set ignore bits ; movb @COINS+16,a1 ; move @SWITCH2,a1,W move @_switch2_addr,a1,L move *a1,a1,W move @swtemp1,a1,L ;previous state t=n-1 move @swtemp2,a2,L ;previous previous t=n-2 move a1,@swtemp2,L ;new previous previous move a0,@swtemp1,L ;new previous and a1,a2 andn a0,a2 ;look for 110 jrz #x ;No switches? move @swstack_p,a3,L #lp cmpi swstackbot,a3 jreq #x ;Switch stack overflow? move a2,a2 jrz #x 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 ;Stack switch number (0-31) rl a1,a2 ;Restore switch word without bit jrnz #lp move a3,@swstack_p,L ;restore switch stack #x rets ****************************************************************************** * badtrapx - Come here when a trap is hit that is not defined and log it badtrap31 badtrap30 badtrap28 badtrap27 badtrap26 badtrap25 badtrap24 badtrap23 badtrap22 badtrap21 badtrap20 badtrap19 badtrap18 badtrap17 badtrap16 badtrap15 badtrap14 badtrap13 badtrap12 badtrap11 badtrap9 badtrap8 badtrap7 badtrap6 badtrap5 badtrap4 badtrap3 .if DEBUG ;??? LOCKUP eint .else CALLERR 9,0 .endif reti ;WRITE TO CODE/IMAGE ROM wrom_int .if DEBUG ;If debug, just lockup so we can fix it. LOCKUP eint .else ;If shipping code, audit the error and clear the int PUSH a14 movi SYSCINIT,a14 xori 02000h,a14 move a14,@SYSCTRL ori 02000h,a14 move a14,@SYSCTRL PULL a14 CALLERR 9,0 eint .endif reti badtrap .if DEBUG LOCKUP eint .else CALLERR 9,0 .endif reti badtrap29 .if DEBUG reti ; LOCKUP ;A write to ROM! .endif jruc badtrap ****************************************************************************** * trap3_handler - Security Trap * a1 = Security Service Identifier * 0 = SetAddresses (I/O address remap) * a0 = Data for particular Security Service * Security Service Value * 0 Don't Care SUBR trap3_handler sll 5,a1 addi _SecurityFunctions,a1 move *a1,a1,L call a1 reti ;Initial GSP I/O register values gspioinit_t ;NEW - Values change because dot clock is twice as fast. ; .word 015h ;>C0000000 -- HESYNC ; .word HEBLNKINIT ;>C0000010 -- HEBLNK ; .word 0fah ;>C0000020 -- HSBLNK ; .word 0fch ;>C0000030 -- HTOTAL .word 02bh ;>C0000000 -- HESYNC .word HEBLNKINIT ;>C0000010 -- HEBLNK .word 01f5h ;>C0000020 -- HSBLNK .word 01f9h ;>C0000030 -- HTOTAL .word 3 ;>C0000040 -- VESYNC .word 20 ;>C0000050 -- VEBLNK .word 274 ;>C0000060 -- VSBLNK ;254 lines .word 288 ;>C0000070 -- VTOTAL .word >f010 ;>C0000080 -- DPYCTL ENV|NIL|DXV|SRE|>10 .word 0fffch ;>C0000090 -- DPYSTRT .word EOSINT ;>C00000A0 -- DPYINT .word 2ch ;>C00000B0 -- CONTROL .word 0 ;>C00000C0 -- HSTDATA .word 0 ;>C00000D0 -- HSTADRL .word 0 ;>C00000E0 -- HSTADRH .word 0 ;>C00000F0 -- HSTCTLL .word 0 ;>C0000100 -- HSTCTLH .word 0 ;>C0000110 -- INTENBL .word 0 ;>C0000120 -- INTPEND .word 0 ;>C0000130 -- CONVSP .word 0 ;>C0000140 -- CONVDP .word PXSIZE ;>C0000150 -- PSIZE .word 0 ;>C0000160 -- PMASK .word 0 ;>C0000170 -- RESERVED .word 0 ;>C0000180 -- RESERVED .word 0 ;>C0000190 -- RESERVED .word 0 ;>C00001A0 -- RESERVED .word 28 ;>C00001B0 -- DPYTAP giiend ;Initialize all 32 trap vectors .sect "VECTORS" .long badtrap31 ;TRAP 31 .long badtrap30 ;TRAP 30 ILLOP --- ILLEGAL OPCODE .long badtrap29 ;TRAP 29 .long badtrap28 ;TRAP 28 .long badtrap27 ;TRAP 27 .long badtrap26 ;TRAP 26 .long badtrap25 ;TRAP 25 .long badtrap24 ;TRAP 24 .long badtrap23 ;TRAP 23 .long badtrap22 ;TRAP 22 .long badtrap21 ;TRAP 21 .long badtrap20 ;TRAP 20 .long badtrap19 ;TRAP 19 .long badtrap18 ;TRAP 18 .long badtrap17 ;TRAP 17 .long badtrap16 ;TRAP 16 .long badtrap15 ;TRAP 15 .long badtrap14 ;TRAP 14 .long badtrap13 ;TRAP 13 .long badtrap12 ;TRAP 12 .long badtrap11 ;TRAP 11 WV --- WINDOW VIOLATION .long DIRQ ;TRAP 10 DI --- DISPLAY INTERRUPT .long badtrap9 ;TRAP 9 HI --- HOST INTERRUPT .long badtrap8 ;TRAP 8 NMI -- NONMASKABLE INTERRUPT .long badtrap7 ;TRAP 7 .long badtrap6 ;TRAP 6 .long badtrap5 ;TRAP 5 .long badtrap4 ;TRAP 4 .long trap3_handler ;TRAP 3 Security Trap .long wrom_int ;TRAP 2 INT2 --- EXTERNAL INTERRUPT 2 .long dma_irq ;TRAP 1 INT1 --- EXTERNAL INTERRUPT 1 .long init_prog ;TRAP 0 RESET ****************************************************************************** .end