wwf-wrestlemania/MAIN.ASM

1201 lines
25 KiB
NASM
Executable File
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: 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