cruisin-usa/CUSA.ASM

2260 lines
41 KiB
NASM
Executable File

.FILE "CUSA.ASM"
*----------------------------------------------------------------------------
* CRUIS'N USA
*
*
* EUGENE JARVIS DIRECTOR
*
* ERIC PRIBYL SOFTWARE
*
* MARK LOFFREDO HARDWARE
* GLENN SHIPP HARDWARE
*
* TED BARBER GRAPHICS
* SHAWN COOPER GRAPHICS
*
* MATT BOOTY SOUND FX
* VINCE PONTARELLI MUSIC
*
*
* COPYRIGHT (C) 1994 NINTENDO, DEVELOPED BY TV GAMES, INC.
* MANUFACTURED AND SOLD BY MIDWAY MANUFACTURING COMPANY UNDER LICENSE
*
*
MEMTESTS .set 1
.include MPROC.EQU
.include MACS.EQU
.include OBJ.EQU
.include OBJECTS.EQU
.include GLOBALS.EQU
.include SYS.EQU
.include C30.EQU
.include TEXT.EQU
.include VUNIT.EQU
.include CMOS.EQU
.include SNDTAB.EQU
.include PALL.EQU
.include SYSID.EQU
.include DIRQ.EQU
.include ERROR.EQU
.include COMM.EQU
.include CHECKSUM.EQU
TIKS_PER_SECOND .set 57
.include DATE.ASM
.text
fbss COMMINTM,1 ;0 if NON-linked
;INT2_M if linked
.globl VERSION_STAMP
romdata
.if 0
startup0 .string "DO NOT EVEN CONSIDER RELEASING THESE ROMS",0
startup2 .string " THIS VERSION HAS A FATAL BUG",0
startup1
startup3
dlts .string "TEST VERSION",0
VERSION_STAMP .string "VERSION NOT FOR RELEASE",0
.else
startup0 .string " CRUISN USA (TM) HEAD 2 HEAD",0
startup1 .string " (C) 1994 NINTENDO, DEVELOPED BY TV GAMES, INC.",0
startup2 .string "MANUFACTURED AND SOLD BY MIDWAY MANUFACTURING COMPANY",0
startup3 .string " UNDER LICENSE.",0
dlts .string "DOWNLOADING TEXTURES",0
;Release of linked version will be 4.0
; I = I4000
; VID = 40
;
VERSION_STAMP .string "VERSION 4.4",0
.endif
INTERNAL_VERS .string "I440",0
VERSION_ID .set 40
;Because of managements inability to deal with software projects,
;or being able to keep the version control straight
;we have now moved into Internal and External versions of the program
;VERSION_STAMP contains whatever the management wants to call it.
;If management asks call it 'version' or 'release'.
;'actual version' or 'internal version' or 'internal' is what
;to use for us.
;INTERNAL_VERS is the actual version of the software.
;Keep in mind that multiple releases exist under the external
;version name, and the true software version can be gotten from
;the title page.
M1 .string "LOADING OS-WMS...",0
M2 .string "I-NODES ALLOCATED, DCS DECODED (14-1715)",0
M3 .string "WMS SATELLITE COMM, CHANNEL 3 ACTIVE LYBIRP",0
M4 .string "USR/ELP/CUSA>NETLINK WMS 14.32.86.1 -K CIRE",0
M5 .string "CONNECTING TO HOST...",0
M6 .string "CONNECTION ESTABLISHED, PUBLIC-KEY: CIRE",0
M7 .string "USR/ELP/CUSA>FTP GET CUSA",0
M8 .string "37940813 BYTES RECEIVED OK",0
M9 .string "USR/ELP/CUSA>TV30 CUSA /L",0
.text
;*** RAM DEFINITIONS
pbss _MODE,1 ;machine mode
pbss STATE,1 ;comm machine state
.bss NFRAMES,1 ;number of frames passed since last update
.bss INFRAMES,1
.bss FRAMRATE,1 ;MIN frames allowed-1
.bss IFRAMES,1
.bss OFRAMES,1
.bss ERRORN,1
.bss ERRORO,1
.bss FRAMETIME,1 ;TMR_FRAME
.bss SWITCHBUTS,1
.bss BGNDCOLA,1 ;color 0 in COLORRAM
.bss DIAG_ACTIVE,1
.bss GAME_TIMER,1 ;FL minutes since last buyin
pbss SYSCNTL,1 ;shadow location
pbss _pot0,1 ;steering wheel
.bss _pot1,1 ;accel pedal
.bss _pot2,1 ;brake pedal
.bss RDPOT,1
.bss _sectime,1 ;one second timer
.bss CLEARRDY,1 ;clear screen is ready (1 = swap pages and clear screen)
.bss NOAERASE,1 ;NO AUTOERASE FLAG
.bss NOSWAP,1 ;NO PAGE SWAPPING
.bss DISPLAY_PAGE,1
fbss MPROC_TIK,1
*----------------------------------------------------------------------------
_c_int00:
LDI 02h,IOF ;TV30 KLUDGE
CLRI R0 ;must fix COMM setup asap
LDP @COMMINTM
STI R0,@COMMINTM
LDP @CPU_WS
LDI 1068h,R0
STI R0,@CPU_WS
LDP @FIFO_CONTROL
LDI FIFO_CONTROL_INIT,R0
STI R0,@FIFO_CONTROL
LDI 800h,ST ;ENABLE THE CACHE, DISABLE INTERRUPTS
LDP @FASTSTKI
LDI @FASTSTKI,SP ;LOAD THE ADDRESS INTO SP
DINT ;DISABLE INTERUPTS
CLRI R0
LDP @CMOS_WP_WORD
STI R0,@CMOS_WP_WORD ;DISABLE CMOS WRITES
LDIL RAM0,AR0 ;CLEARS CMOS_WP_WORD_SHADOW
RPTS 2047
STI R0,*AR0++
;
;CHECK TO SEE IF THIS IS A WATCHDOG
;
fbss WDHIT,1
;POWERUP IGNORE GLITCH FIX
LDP @991050h ;DOG TEST
LDI @991050h,R0
LDP @WDHIT
STI R0,@WDHIT ;SAVE YOUR DOGGIE
LDP @SYSCNTLR
LDI SYSCNTL_INIT,R0 ;INIT SYSCNTL
STI R0,@SYSCNTLR
LDP @DMA_SETUP
LDI DMA_SETUP_INIT,R0 ;INIT DMA
STI R0,@DMA_SETUP
LDP @FIFO_SIZE
LDI 270,R0 ;INIT FIFO SIZE
STI R0,@FIFO_SIZE
CALL CRT_REG_SETUP ;INIT CRT
SETDP
.if MEMTESTS
CALL TEST_STATIC_CHIPS ;TEST THE INSTALLABLE CHIPS
.endif
.if DEBUG
;
;COPY THE 'ROM' into the 'ROM'
;
;*this only works in RAM
;and, if used in ROM will cause a lockup
;
LDI 40h,AR1 ;SOURCE ADDRESS
LDI 0C000h,AR2 ;DESINATION ADDRESS
LS 8,AR2
ADDI 40h,AR2
LDI 1000h,RC ;COPY THE PROGRAM INTO
LS 4,RC ;FAST RAM
SUBI 41h,RC
RPTB LD_DBG1
LDI *AR1++,R0
LD_DBG1 STI R0,*AR2++
.endif
LDI 0,AR1 ;SOURCE ADDRESS
LDI 4000h,AR2 ;DESINATION ADDRESS
LS 8,AR2
LDI 1000h,RC ;COPY THE PROGRAM INTO
LS 4,RC ;FAST RAM
RPTB LD_RAM
LDI *AR1++,R0
LD_RAM STI R0,*AR2++
NOP
NOP ;DELAY FOR PIPELINE
NOP
LDI 22h,IOF
NOP
NOP ;DELAY FOR PIPELINE
NOP
SOFTWTM R0 ;SET WAIT STATES
CLRI R0
LDP @COMMINTM
STI R0,@COMMINTM
SETDP
.if MEMTESTS
CALL TEST_CHIPS ;TEST THE INSTALLABLE CHIPS
.endif
SOFTWTM R0 ;SET WAIT STATES
DINT
LDP @FASTSTKI
LDI @FASTSTKI,SP ;LOAD THE ADDRESS INTO SP
.if MEMTESTS = 0
;For RAM (development) version, we must copy the
;program into what would be the ROM
;
LDI @SYSCNTL,R0
ANDN 10h,R0
STI R0,@SYSCNTL
LDP @SYSCNTLR
STI R0,@SYSCNTLR
SETDP
LDI 040h,AR1 ;SOURCE ADDRESS
LDI 0C000h,AR2 ;DESINATION ADDRESS
LS 8,AR2
ADDI 040h,AR2
LDI 1000h,RC ;COPY THE PROGRAM INTO
LS 4,RC ;FAST RAM
SUBI 41h,RC
RPTB LD_RAM3
LDI *AR1++,R0
LD_RAM3 STI R0,*AR2++
LDI @SYSCNTL,R0
OR 10h,R0
STI R0,@SYSCNTL
LDP @SYSCNTLR
STI R0,@SYSCNTLR
SETDP
.endif
CLRI R2
SETAUD ADJ_OUTOFDIAG
BU DR1 ;SKIP DOGGIE
DIAG_RETURN:
LDI 8,R0 ;PREVENT FALSE DOGGIE
LDP @WDHIT
STI R0,@WDHIT ;SAVE YOUR DOGGIE
DR1
SOFTWTM R0 ;SET WAIT STATES
DINT
LDP @FASTSTKI
LDI @FASTSTKI,SP ;LOAD THE ADDRESS INTO SP
.if DEBUG
CALL VERIFY_CODE_INTEGRITY
.endif
;LOAD CODE BACK INTO RAM
;
;
LDI 040h,AR1 ;SOURCE ADDRESS
LDI 0C000h,AR2 ;DESINATION ADDRESS
LS 8,AR2
ADDI 040h,AR2
LDI 1000h,RC ;COPY THE PROGRAM INTO
LS 4,RC ;FAST RAM
RPTB LD_RAM2
LDI *AR2++,R0
LD_RAM2 STI R0,*AR1++
CLRI R0
LDP @COLORAM
STI R0,@COLORAM
SETDP
STI R0,@DIAG_ACTIVE
CALL CLR_PBSS
CALL CLR_RAM ;INIT .BSS TO 0
LDI MDIAG,R0 ;MELLOW THE WHEEL
STI R0,@_MODE
LDI SYSCNTL_INIT,R0 ;INIT SYSCNTL RAM SHADOW
STI R0,@SYSCNTL
CALL FEED_WATCHDOG
CALL MESSAGE1 ;DISPLAY STARTUP MESSAGE TO SCREEN
CALL MSG1
LDI 240,R0 ;X MIN
STI R0,@PREVX
LDI 1,R0
STI R0,@DELTA
LDP @TIMER_CNTL1
LDI 200h|1,R0 ;INIT TIMER MUMBO-JUMBO
STI R0,@TIMER_CNTL1 ;
LDI -1,R0 ;
STI R0,@TIMER_PERIOD1 ;
SETDP
LDF 0,R0
LDI @TIMERAMI,AR0
RPTS 47 ;CLEAR OUT COUNT AREA
STF R0,*AR0++
LDL 5A5A5A5Ah,R0 ;INIT RANDOM NUMBER SEED
STI R0,@RAND
CALL LOAD_FIXED_PALETTES ;LOAD BASE PALETTES
CALL INIT_SYSTEM ;INIT REST OF SYSTEM
CALL READIO ;GET I/O STATUS (W/INTs OFF)
CALL CHECKDIAG ;GOTO DIAGNOSTICS PREDICATE
CALL FIFO_RESET ;CLEAR THE FIFO
CALL COMM_INIT
CALL TIMER_RESET
DINT
CALL RESET_SNDBRD ;RESET SOUND BOARD (and DB)
EINT
CALL FIFO_RESET
LDI INT0_M|INT3_M,IE ;ENABLE INTERRUPTS
AND 0,IF
CALL ENABLEGIE
CALL COMM_ENABLE_INT2
.globl INITIALIZATION_MOTION_CHECK
CALL INITIALIZATION_MOTION_CHECK
CLRI R2
SETAUD ADJ_OUTOFDIAG
LDI 1,R0 ;INIT BASE OF WAVERAM
STI R0,@HARD_SECTION_LOAD
LDL _SECshared,AR2
CALL LOAD_SECTION_REQ
LDI 1,R0
STI R0,@HARD_SECTION_LOAD
LDL _SECskys,AR2
CALL LOAD_SECTION_REQ
CALL MSG2
LDI 1,R0
STI R0,@HARD_SECTION_LOAD
STI R0,@BOOT_PACIFY_SCREEN_P
LDL _SECgeneral,AR2
CALL LOAD_SECTION_REQ
LDI 1,R0
STI R0,@HARD_SECTION_LOAD
STI R0,@BOOT_PACIFY_SCREEN_P
.globl _SEChead2head
LDL _SEChead2head,AR2
CALL LOAD_SECTION_REQ
CALL MSG3
LDI 1,R0 ;LOAD 1ST WAVE
STI R0,@HARD_SECTION_LOAD
STI R0,@BOOT_PACIFY_SCREEN_P
LDL _SECpress,AR2
CALL LOAD_SECTION_REQ
LDI 0,R2
LDI AUD_BCREDITS,AR2
CALL AUDIT_WRITE
READADJ ADJ_VOLUME
LDI R0,R1
CALL SET_MASTER_VOL
LDP @WDHIT ;LOG WATCHDOG HIT
LDI @WDHIT,R0
SETDP
AND 8,R0 ;CHECK B3
BNZ NOPEIT
INCAUD AUD_NUM_WATCHDOGS
NOPEIT
CLRI R0
STI R0,@_newbut
LDI -1,AR2
STI AR2,@_ATTR_MODE
CALL WAVE ;setup 1st wave
CALL FIFO_RESET
LDI INT0_M|INT3_M,IE ;ENABLE INTERRUPTS
LDP @COMMINTM
OR @COMMINTM,IE
SETDP
AND 0,IF
CALL ENABLEGIE
READAUD AUD_VERSION ;version update???
CMPI VERSION_ID,R0
BNE VERSION_UPDATE
CALL VALIDATE_CMOS ;DIAGNOSTIC CHECK ON CMOS
BC CMOS_ERROR ;wait till its better
READAUD ADJ_ACTUALHSTDRESET ;CHECK FOR HI SCORE RESET
CMPI 0,R0
BGT NODO1
CALL INIT_HSTD_TABLES
READAUD ADJ_HIGHSCORE_RESET
LDI R0,R2
SETADJ ADJ_ACTUALHSTDRESET
NODO1 LDI 1,R0
STI R0,@NFRAMES
LDI 0,R0
STI R0,@ERRORO
STI R0,@ERRORN
CALL TIMERESET
CALL COMMQ_PACKET_INIT
*----------------------------------------------------------------------------
MAINLOOP:
FIFO_CLRP R0 ;IS THE FIFO CLEAR
DMA_WT R0
CALL FIFO_RESET
CALL TIMEREC
CALL DECOMPRESS_PROC
CALL TIMEREC
MWAIT0 LDI @INFRAMES,R0
CMPI @FRAMRATE,R0 ;1 FRAME MINIMUM
BLT MWAIT0
CALL TIMEREC
CALL ZSORTWT ;WAIT FOR PAGE WHILE SORTING
CALL TIMEREC
MWAIT LDI @CLEARRDY,R0 ;DONE WHEN INT SIGNALS PAGE SWAPPED
BNZ MWAIT
ENTER2
;COMMUNICATION XFER
;
CALL COMM_ROUTINE
CALL COMMQ_PACKET_INIT
CALL DECODE_BUFFER
LDI @INFRAMES,R0
CLRI R1
STI R1,@INFRAMES ;CLEAR INTERRUPT COUNTER
STI R0,@NFRAMES ;SAVE FOR ALL CURRENT PROCESSES
CALL TIMEREC
STF R0,@FRAMETIME ;SAVE THE FRAMETIME
CALL TIMERESET
LDI @_MODE,R4 ;FILL FIFO STUFF
TSTB MINFIN,R4 ;
CALLNZ INFINITY
CALL TIMEREC
LDI @COMM_DRONE_PTR,R0
CALLNZ COMM_DRONE_PTR_SORT
CALL DIRQ ;DISPLAY THE POLYGONS
CALL TIMEREC
LDI @_MODE,R4 ;FILL FIFO STUFF
TSTB MHUD,R4
BZ NHUD
AND MMODE,R4
CMPI MGAME,R4
BEQ DOIT8
CMPI MBONUS,R4
BNE NHUD
DOIT8 CALL HUD ;HEADS UP DISPLAY (GAME MODE ONLY)
NHUD
CALL TIMEREC
LDI @_MODE,R4
AND MMODE,R4 ;THIS MASK IS IMPORTANT!!!!
CMPI MATTR,R4
CALLEQ INSERT_COINS
CALL VOLUME_DISPLAY
CALL TIMEREC
LDI @_MODE,R0 ;MOTION CABINET LEVELING
AND MMODE,R4 ;IF NOT IN GAME
CMPI MGAME,R4
BEQ NODO555
CALL LEVEL_THE_MOTION
NODO555
CALL CHECKDIAG ;JUMP TO DIAGNOSTICS?
CALL SWDISP ;DISPATCH ANY SWITCH PROCESSES
CALL COLSCC
CLRI R0
LDP @MPROC_TIK
STI R0,@MPROC_TIK
SETDP
CALL PRC_DISPATCH ;EXECUTE PROCESSES
CALL COMMQ_READY_TO_SEND
CALL TEXT_OUTPUT ;END FILL FIFO STUFF
CALL TIMEREC
LDI @_MODE,R0
AND MMODE,R0
CMPI MATTR,R0
BNE MAINLOOP
;we are in attract mode, set appropriately
LDI @DIPRAM,R0
TSTB CMDP_MASTER,R0
BZ MAINLOOP
LDI @OM_ATTR_MODE,AR2
CMPI @OLD_OM_ATTR_MODE,AR2
BEQ MAINLOOP
CMPI -2,AR2 ;WE MAY ONLY SYNC ON THE MIDWAY SPIN
BNE MAINLOOP
STI AR2,@OM_ATTR_MODE
STI AR2,@_ATTR_MODE
CALL SILENT
LDI @FASTSTKI,SP ;GET PAGE OF STORED ADDRESS
LDI @_ATTR_MODE,AR2 ;AND INTO FP TOO
CALL WAVE
BU COLD_ENTER
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*WE HAVE A RADICAL SYSTEM CHANGE
*WE WANT TO
*1. LET EXECUTE ANY PROCESSES THAT WE HAVE BEGUN
*2. CLEAR THE SCREEN (WHILE STILL VIEWING OLD SCREEN)
*3. PLOT THE NEW SCREEN
*4. CONTINUE WITH THE SYSTEM
*
COLD_ENTER:
FIFO_CLRP R0 ;is the fifo clear
DMA_WT R0
CALL FIFO_RESET
LDI 1,R0
STI R0,@CLEARRDY ;set clear ready to happen...
CLRI R0
STI R0,@NOAERASE ;turn auto-erase ON
C_WAIT LDI @CLEARRDY,R0 ;wait for it to clear
BNZ C_WAIT
CALL COMMQ_READY_TO_SEND
CALL COMM_ROUTINE
CALL COMMQ_PACKET_INIT
CALL DECODE_BUFFER
CALL PRC_DISPATCH
CALL COMMQ_READY_TO_SEND
BR ENTER2
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*INTERRUPT ROUTINE
*
*1. initially mask out all interupts we dont want to occur
*2. enable GIE of ST by calling a routine that RETI's
* (allows debugger to function)
*3. increment number of frames passed since last screen update
*
*
ENABLEGIE:
RETI
INT0:
PUSH ST
LDI INT1_M,IE ;disable everything except TV30 interrupt & comm int
ANDN INT0_M,IF ;we wont irq ourself
PUSH DP
PUSH R0
LDP @COMMINTM
OR @COMMINTM,IE
LDP @CPU_WS
LDI @CPU_WS,R0
PUSH R0
LDI SOFT_WS,R0
STI R0,@CPU_WS
PUSH R1
PUSH R2
PUSH R3
PUSH R4
PUSH R5
PUSH R6
PUSH R7
PUSHF R0
PUSHF R1
PUSHF R2
PUSHF R3
PUSHF R4
PUSHF R5
PUSHF R6
PUSHF R7
PUSH RC
PUSH RS
PUSH RE
PUSH BK
PUSH IR0
PUSH IR1
PUSH AR0
PUSH AR1
PUSH AR2
PUSH AR3
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
SETDP
CALL PAL_XFER ;TRANSFER QUEUED PALETTES
LDI @BGNDCOLA,R0 ;SET BACKGROUND COLOR
LDP @COLORAM
STI R0,@COLORAM
SETDP ;RESET DP
CALL COMM_MASTER_SEND_SYNC
CALL ENABLEGIE
LDI @_MODE,R0
AND MMODE,R0
CMPI MDIAG,R0
BEQ NTEST
LDP @MPROC_TIK
LDI @MPROC_TIK,R0
SETDP
INC R0
CMPI 300,R0
BLE REGIT
ERRON U,EC_WATCHDOG2
BU _c_int00
REGIT LDP @MPROC_TIK
STI R0,@MPROC_TIK
SETDP
NTEST
CALL FEED_WATCHDOG
LDI @CLEARRDY,R0
BZ NCLRSCR
LDI 0,R0
STI R0,@CLEARRDY ;RESET SCREEN CLEAR FLAG
STI R0,@IFRAMES ;RESET INTERRUPT FRAME COUNTER
.globl MOTION_RCV_TIKS
LDI @MOTION_RCV_TIKS,R0 ;MOTION RECEIVE ERROR
DEC R0
STI R0,@MOTION_RCV_TIKS
LDI @NOSWAP,R0 ;PAGE SWAP?
BNZ NCLRSCR
LDI @DISPLAY_PAGE,R0 ;PAGE SWAP FLAG
XOR 1,R0
STI R0,@DISPLAY_PAGE
BNZ PAGE1
CALL SETPAGE1
CALL FASTCLR0
B DN_PAGE
PAGE1 CALL SETPAGE0
CALL FASTCLR1
DN_PAGE
NCLRSCR
LDI @STOPWATCH_CNTL,R0 ;STOPWATCH TIMER
BZ NOSTOPWUPDT
INCM @STOPWATCH
NOSTOPWUPDT
INCM @_sectime ;ONE SECOND TIMER
CMPI TIKS_PER_SECOND,R0
BLT NOTASEC
CLRI R0
STI R0,@_sectime
LDI @_MODE,R5
AND MMODE,R5
CMPI MDIAG,R5
BEQ JJ88
INCAUD AUD_POWERON_TIME
CMPI MATTR,R5
BEQ JJ88
INCAUD AUD_GAMEON_TIME
CMPI MGAME,R5
BNE JJ88
LDI @CAMVIEW,AR2
ADDI AUD_VIEW1_TIME,AR2
CALL AUDIT_INC
JJ88
LDI @OFFROAD_TMR,R0 ;OFFROAD TIMER
SUBI 1,R0
LDILT 0,R0
STI R0,@OFFROAD_TMR
LDI @_countdown,R0 ;LO DP TIME REMAINING FOR PLAYER
BLE NOTASEC
LDI @_MODE,R1 ;RACE MUST BE HAPPENING TO DECREMENT COUNT
TSTB MGO,R1
BZ NOTASEC
SUBI 1,R0
STI R0,@_countdown
NOTASEC
.data
FLOAT_TIK .float 0.000292397 ;(1/60)/57 of a minute
.text
LDF @FLOAT_TIK,R0
ADDF @GAME_TIMER,R0
STF R0,@GAME_TIMER
NOTINGAME
INCM @INFRAMES ;increment number of frames passed since last screen switch
INCMF @IFRAMES
CALL NUWHEEL ;motorized wheel
CALL SNDPROC ;sound processor
CALL READIO ;read the switches
CALL RANDOM ;randomize further...
CALL BUTTONS ;lighted buttons routine
CALL COIN_COUNTER ;coin counter routine
CALL CHECK_STATE
CALL LATCH_ERROR ;motion error
ANDN INT0_M,IF ;set 60Hz IRQ no longer pending
POP AR7
POP AR6
POP AR5
POP AR4
POP AR3
POP AR2
POP AR1
POP AR0
POP IR1
POP IR0
POP BK
POP RE
POP RS
POP RC
POPF R7
POPF R6
POPF R5
POPF R4
POPF R3
POPF R2
POPF R1
POPF R0
POP R7
POP R6
POP R5
POP R4
POP R3
POP R2
POP R1
POP R0
LDP @CPU_WS
STI R0,@CPU_WS
POP R0
LDI INT1_M|INT3_M|INT0_M,IE
LDP @COMMINTM
OR @COMMINTM,IE
POP DP
POP ST
RETI
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*READ IO SWITCHES AND POTS
*
*
pbss _newbut,0
pbss SWRAM,3 ;SWITCH STATE STORE N,N-1,N-2
SWRAMI .word SWRAM
pbss DIPRAM,1 ;DIP SWITCH RAM COPY
READIO:
CLRI AR0 ;for Loff production board timing problem
LDP @DIPSW
LDI @DIPSW,R0
LDI *AR0,R2
LDP @DIPRAM
RS 16,R0
STI R0,@DIPRAM
LDP @SWITCH3
LDI @SWITCH3,R0 ;READ HARDWARE 0=CLOSED, 1=OPEN
LDI *AR0,R2 ;Loff
LS 16,R0
LDI @SWITCH1,R1
LDI *AR0,R2 ;Loff
LS 16,R1
LDP @FASTSTKI
RS 16,R1
OR R1,R0
NOT R0,R1
LDI @SWRAMI,AR0
STI R1,@SWITCHBUTS
;
;SCAN SWITCHES, TRIGGER ON LEADING EDGE
;
AND *AR0,*+AR0(1),R2 ;PREVIOUS TWO OPEN
AND R1,R2 ;CURRENT ONE CLOSED
OR *+AR0(2),R2 ;OR INTO EDGE LIST
STI R2,*+AR0(2) ;STORE EDGE WORD 1=EDGE TRIGGERED
LDI *AR0,R1 ;GET N-1
STI R1,*+AR0(1) ;N-1 --> N-2
STI R0,*AR0 ;N --> N-1
PUSH DP
LDI @SYSCNTL,R0 ;actually we signal a read of the
LDP @SYSCNTLR ;have a value
ANDN ATOD_WR,R0 ;pot(s), they interrupt us when they
STI R0,@SYSCNTLR ;have a value
POP DP
CLRI AR0
LDP @ATOD_R
LDI 04h,R0
LS 24,R0
STI R0,@ATOD_R
LDI *AR0,R2
SETDP
CLRI R0
STI R0,@RDPOT
;THESE ARE SPECIAL ROUTINES WHICH ARE CALLED, *NOT* CREATED
;FOR PROCESSES.
; THIS INCLUDES:
; VOL+
; VOL-
; DIAG BUTTON
;NO OTHER ROUTINES SHOULD BE HERE
LDI @SWRAM+2,R0
TSTB SW_DIAG,R0
CALLNZ DIAG_TOGGLE
LDI @_MODE,R0
AND MMODE,R0
CMPI MATTR,R0
BEQ NIGY
CMPI MDIAG,R0
BEQ NIGY
LDI @SWITCHBUTS,R0
TSTB SW_VOLPLUS,R0
CALLNZ VOL_PLUS
TSTB SW_VOLMINUS,R0
CALLNZ VOL_MINUS
NIGY
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
VOL_MINUS:
PUSH R0
PUSH R1
PUSH R2
PUSH R3
PUSH AR2
LDP @SWRAM+2
LDI @SWRAM+2,R0
ANDN SW_VOLMINUS,R0
STI R0,@SWRAM+2
SETDP
.globl VOLUME_ACTIVE
LDI 60,R0
STI R0,@VOLUME_ACTIVE
READADJ ADJ_MIN_VOL_LEVEL
LDI R0,R3
READADJ ADJ_VOLUME
DEC R0
CMPI R3,R0
LDILT R3,R0
BU VOLJN
VOL_PLUS:
PUSH R0
PUSH R1
PUSH R2
PUSH R3
PUSH AR2
LDP @SWRAM+2
LDI @SWRAM+2,R0
ANDN SW_VOLPLUS,R0
STI R0,@SWRAM+2
SETDP
LDI 60,R0
STI R0,@VOLUME_ACTIVE
READADJ ADJ_MIN_VOL_LEVEL
LDI R0,R3
READADJ ADJ_VOLUME
INC R0
CMPI R3,R0
LDILT R3,R0
VOLJN
CMPI 0,R0
LDILE 0,R0
CMPI 255,R0 ;??? strange - but 249-255 cut off
LDIGT 255,R0
LDI R0,R2
PUSH R0
SETADJ ADJ_VOLUME
POP R1
CALL SET_MASTER_VOL
POP AR2
POP R3
POP R2
POP R1
POP R0
RETS
DIAG_TOGGLE:
PUSH R0
LDI @_MODE,R0
AND MMODE,R0
CMPI MDIAG,R0
BEQ DTXX
LDI @SWRAM+2,R0
ANDN 010h,R0
STI R0,@SWRAM+2
LDI @DIAG_ACTIVE,R0
LDIZ 1,R0
LDINZ 0,R0
STI R0,@DIAG_ACTIVE
DTXX POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*OPTIMIZED 9/14/93-ELP
ATODINT:
PUSH ST
PUSH IE
PUSH DP
LDP @COMMINTM
LDI @COMMINTM,IE
SETDP
CALL ENABLEGIE
PUSH R0
PUSHF R0
PUSH R6
LDP @CPU_WS
PUSH R1
PUSHF R1
PUSH AR0
LDI @CPU_WS,R6 ;SET WAIT STATES
LDI 1090h,R0
STI R0,@CPU_WS
LDP @RDPOT ;WHICH POT TO READ?
LDI @RDPOT,R0
BNZD RDFOOT
LDP @SYSCNTL
LDI @SYSCNTL,R1
ANDN ATOD_RD,R1
;---->BNZD RDFOOT
;RDSTEER
LDP @SYSCNTLR
STI R1,@SYSCNTLR
CLRI AR0
LDP @ATOD_R
LDI @ATOD_R,R1
LDI *AR0,R0
LDP @_pot0
RS 24,R1
FLOAT R1
FLOAT @_pot0,R0
;MAXIMUM SLEW RATE
;
SUBF R0,R1
CMPF 65,R1
LDFGT 65,R1
CMPF -65,R1
LDFLT -65,R1
ADDF R0,R1
MPYF 0.33,R1 ;SMOOTH WHEEL A TAD
MPYF 0.67,R0
ADDF R1,R0
FIX R0
STI R0,@_pot0
NOSMOOTH1
LDP @SYSCNTL
LDI @SYSCNTL,R0 ;ACTUALLY WE SIGNAL A READ OF THE
LDP @SYSCNTLR ;HAVE A VALUE
ANDN ATOD_WR,R0 ;POT(S), THEY INTERRUPT US WHEN THEY
STI R0,@SYSCNTLR ;HAVE A VALUE
LDP @ATOD_R
CLRI AR0
LDI 05h,R0 ;SETUP TO READ GAS PEDAL
LS 24,R0
STI R0,@ATOD_R
LDI *AR0,R0
BUD EXITR
LDP @RDPOT
LDI 1,R0
STI R0,@RDPOT
;----> BUD EXITR
RDFOOT
CMPI 1,R0
BNED RDBRAKE
LDP @SYSCNTLR
STI R1,@SYSCNTLR
LDP @ATOD_R ;READ GAS PEDAL
;----> BNED RDBRAKE
CLRI AR0
LDI @ATOD_R,R1
LDI *AR0,R0
LDP @_pot1
RS 24,R1
FLOAT R1
FLOAT @_pot1,R0
MPYF 0.33,R1 ;SMOOTH A TAD
MPYF 0.67,R0
ADDF R1,R0
FIX R0
STI R0,@_pot1
LDP @SYSCNTL
LDI @SYSCNTL,R0 ;ACTUALLY WE SIGNAL A READ OF THE
LDP SYSCNTLR
ANDN ATOD_WR,R0 ;POT(S), THEY INTERRUPT US WHEN THEY
STI R0,@SYSCNTLR
LDP @ATOD_R
LDI 06h,R0 ;SETUP TO READ BRAKE PEDAL
LS 24,R0
CLRI AR0
STI R0,@ATOD_R
LDI *AR0,R0
BUD EXITR
LDP @RDPOT
LDI 2,R0
STI R0,@RDPOT
;----> BUD EXITR
RDBRAKE
CLRI AR0
LDI @ATOD_R,R1 ;READ BRAKE PEDAL
LDI *AR0,R0
LDP @_pot2
RS 24,R1
FLOAT R1
FLOAT @_pot2,R0
MPYF 0.25,R1 ;SMOOTH A TAD
MPYF 0.75,R0
ADDF R1,R0
FIX R0
STI R0,@_pot2
LDP @RDPOT
LDI 3,R0
STI R0,@RDPOT
EXITR
LDP @CPU_WS
POP AR0
POPF R1
POP R1
STI R6,@CPU_WS
POP R6
POPF R0
POP R0
POP DP
ANDN INT3_M,IF ;masking a2d int. (no longer pending)
POP IE
POP ST
RETI
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*SWITCH DISPATCH START PROCESSES FOR SWITCHES
*
SWDISP:
; LDP @SWRAM
LDI @SWRAM+2,R3
LS 4,R3 ;MASK GARBAGE
RS 4,R3
BZ SWSTX ;NO EDGES ACTIVATED
LDI 0,R1
STI R1,@SWRAM+2 ;CLEAR OUT EDGES
LDI -1,R1
SWTLP
ADDI 1,R1
LSH -1,R3
BNC SWTLP
; LDP @SWTABI
LDI @SWTABI,AR0
ADDI R1,AR0
LDI *AR0,AR2 ;GET WAKEUP
CMPI 0,AR2
BEQ NOGPROC
LDI SPAWNER_C|SPWN_SWITCH_T,R2
CALL PRC_CREATE ;R2=PID, AR2=WAKEUP ADDR
NOGPROC LDI R3,R3
BNZ SWTLP
SWSTX
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*SWITCH ROUTINE TABLE
*0 = NO PROCESS TO CREATE
SWTABI .word SWTAB
SWTAB
.word COIN1 ;00000001 SW_COIN1 (COIN.ASM)
.word COIN2 ;00000002 SW_COIN2 (COIN.ASM)
.word _start ;00000004 START (INTRO.ASM)
.word 0 ;00000008
.word 0 ;00000010 SW_DIAG (DIAG.ASM)
.word 0 ;00000020
.word SERV_COIN ;00000040 SW_COINSRV (COIN.ASM)
.word COIN3 ;00000080
.word 0 ;00000100
.word 0 ;00000200
.word 0 ;00000400
.word 0 ;00000800
.word 0 ;00001000
.word 0 ;00002000
.word COIN4 ;00004000
.word 0 ;00008000
.word 0 ;00010000 BRAKE
.word RADIO_BUT ;00020000 RADIO (OLD ABORT)
.word 0 ;00040000 LOW
.word _debug ;00080000 DEBUG
.word _VIEW0 ;00100000 VIEW0
.word _VIEW1 ;00200000 VIEW1
.word _VIEW2 ;00400000 VIEW2
.word 0 ;00800000 VIEW4
.word 0 ;01000000
.word 0 ;02000000
.word 0 ;04000000
.word 0 ;08000000
.word 0 ;10000000
.word 0 ;20000000
.word 0 ;40000000
.word 0 ;80000000
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
CHECKDIAG:
LDI @DIAG_ACTIVE,R0
RETSZ
BR ENTER_DIAG
; RETS
*----------------------------------------------------------------------------
PB1 .usect pbsss,1
PB2 .usect pbsse,1
PBSS_PTR .word PB1
PBSS_BSSEND .word PB2
CLR_PBSS:
PUSH R0
PUSH AR0
PUSH RC
PUSH RS
PUSH RE
LDI @PBSS_PTR,AR0
LDI @PBSS_BSSEND,RC
SUBI AR0,RC
SUBI 1,RC
CLRI R0
RPTB PRAMCLP
PRAMCLP STI R0,*AR0++
CALL CLEAR_LINK
POP RE
POP RS
POP RC
POP AR0
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*CLR RAM (SLOW RAM)
*make sure this is *NOT* done after C initializations
*make sure nothing exists on the stack yet
*
*
RAM_PTR .word BSSSTART
;RAM_BSSEND .word 01F7FFh
RAM_BSSEND .word 01EFFFh ;save protected hi bss ram
CLR_RAM:
PUSH R0
PUSH AR0
PUSH RC
PUSH RS
PUSH RE
LDI @RAM_PTR,AR0
LDI @RAM_BSSEND,RC
SUBI AR0,RC
SUBI 1,RC
CLRI R0
RPTB RAMCLP
RAMCLP STI R0,*AR0++
POP RE
POP RS
POP RC
POP AR0
POP R0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*THESE MUST BE CALLED *BEFORE* PROGRAM IS COPIED INTO FAST RAM
*
CLEAR_ONCHIPRAM:
LDIL 809800h,AR0
CLRI R0
LDI 2047h,RC
RPTS RC
STI R0,*AR0++
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*
SPACER .set 20
fbss BUTTON_TIKS,1
pbss BUTTON_STATUS,1
.bss OLD_BUTTON_STATUS,1
*
BUTTONS:
LDI @_MODE,R0
AND MMODE,R0
CMPI MDIAG,R0
BEQ DIAG_BUTTONS
CMPI MATTR,R0
BNE BUT3
READAUD ADJ_FREE_PLAY
CMPI 1,R0
BNE JUSTGOON
LDI @BUTTON_STATUS,R0
OR BUT_START,R0
STI R0,@BUTTON_STATUS
BU BUT3
JUSTGOON
READAUD AUD_CREDITS
CMPI 0,R0
BLE DASHLIGHT
.globl OLD_BUTTON_STATUS
BUT3
LDI @BUTTON_STATUS,R0
TSTB BUT_START,R0
BZ NOSTART
LDP @BUTTON_TIKS
LDI @BUTTON_TIKS,R1
INC R1
STI R1,@BUTTON_TIKS
SETDP
CMPI 30,R1
BLT NOSTART
ANDN BUT_START,R0 ;TURN IT OFF
CMPI 60,R1
BLT NOSTART
CLRI R1
LDP @BUTTON_TIKS
STI R1,@BUTTON_TIKS
SETDP
NOSTART
LDI @HEAD2HEAD_ON,R2
BNZ PAPAFFD
CMPI @OLD_BUTTON_STATUS,R0
RETSEQ
PAPAFFD STI R0,@OLD_BUTTON_STATUS
BUTLITE
LDIL SOUND,AR0
LDI 0FF05h,R1
LDI 0F705h,R2
STI R1,*AR0
RPTS SPACER
NOP
STI R2,*AR0
RPTS SPACER
NOP
STI R1,*AR0
RPTS SPACER
NOP
LDI @HEAD2HEAD_ON,R2
BZ KKDAK
LDI @THIS_MACHINE_AHEAD,R2
BNZ KKDAK
AND 0FFh,R0
ANDN BUT_FRONT,R0
BU FDDDA
KKDAK AND 0FFh,R0
OR BUT_FRONT,R0
FDDDA LDI R0,R1
OR 0FF00h,R0
OR 0FB00h,R1
STI R0,*AR0
RPTS SPACER
NOP
STI R1,*AR0
RPTS SPACER
NOP
STI R0,*AR0
RPTS SPACER
NOP
RETS
DIAG_BUTTONS:
LDP @BUTTON_STATUS
LDI @BUTTON_STATUS,R0
SETDP
LDP @BUTTON_TIKS
LDI @BUTTON_TIKS,R1
INC R1
STI R1,@BUTTON_TIKS
SETDP
CMPI 30,R1
BLT DGBT
CLRI R0
CMPI 50,R1
BLT DGBT
CLRI R1
LDP @BUTTON_TIKS
STI R1,@BUTTON_TIKS
SETDP
DGBT
LDIL SOUND,AR0
LDI 0FF05h,R1
LDI 0F705h,R2
STI R1,*AR0
RPTS SPACER
NOP
STI R2,*AR0
RPTS SPACER
NOP
STI R1,*AR0
RPTS SPACER
NOP
LDI R0,R1
OR 0FF00h,R0
OR 0FB00h,R1
STI R0,*AR0
RPTS SPACER
NOP
STI R1,*AR0
RPTS SPACER
NOP
STI R0,*AR0
RPTS SPACER
NOP
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*WAIT FOR INTERRUPT AT VBLANK
*
WAIT_FOR_VBLANK:
LDI @INFRAMES,R0
WAIT1 CMPI @INFRAMES,R0 ;wait for a hot one
BZ WAIT1
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
CRT_REG_SETUP_STRI
.word CRT_REG_SETUP_STR
romdata
CRT_REG_SETUP_STR
.word 399|CRT_SETUP_ICSYNC ;CRT_SETUP
.word 01ffh ;CRT_HADDRINC
.word 01feh ;CRT_HBLKSTART
.word 020eh ;CRT_HSYNCSTART
.word 0227h ;CRT_HSYNCEND
.word 0299h ;CRT_HBLKEND
.word 029ah ;CRT_HTTL
.word 018eh ;CRT_VBLKSTART
.word 0191h ;CRT_SYNCSTART
.word 0194h ;CRT_SYNCEND
.word 01afh ;CRT_VBLK
.word 01b0h ;CRT_VTTL
;before syncing
; .word 400|CRT_SETUP_ICSYNC ;CRT_SETUP
; .word 01ffh ;CRT_HADDRINC
; .word 01feh ;CRT_HBLKSTART
; .word 020eh ;CRT_HSYNCSTART
; .word 0227h ;CRT_HSYNCEND
; .word 0299h ;CRT_HBLKEND
; .word 029ah ;CRT_HTTL
; .word 018fh ;CRT_VBLKSTART
; .word 0192h ;CRT_SYNCSTART
; .word 0195h ;CRT_SYNCEND
; .word 01b0h ;CRT_VBLK
; .word 01b0h ;CRT_VTTL
.text
CRT_REG_SETUP:
PUSHM AR0,AR1,R0,DP
LDIL CRT_SETUP,AR0
LDP @CRT_REG_SETUP_STRI
LDI @CRT_REG_SETUP_STRI,AR1
LDI 11,RC
RPTB CRTRGLP
LDI *AR1++,R0
CRTRGLP STI R0,*AR0++
POPM DP,R0,AR1,AR0
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*IF THIS IS EVER HIT STOP AND FIND OUT WHERE IT IS
*COMING FROM
*
ERROR_TRAP:
CALL ENABLEGIE
NOP
NOP
NOP
SLOCKON U,"ERROR_TRAP INT"
.if DEBUG
BU $
.endif
RETI
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
FIFO_RESET:
DINT
LDP @SYSCNTL
LDI @SYSCNTL,R0 ;READ SHADOW LOCATION
LDI R0,R1
ANDN 1,R1 ;MASK OUT FIFORS
LDP @SYSCNTLR
STI R1,@SYSCNTLR ;STROBE SYSTEM
STI R0,@SYSCNTLR ;THEN BACK TO NORMAL
EINT
LDP @FIFO_CONTROL ;RESET COUNTER ON FIFO (SAFETY FEATURE)
LDI FIFO_CONTROL_DMA_RUNSEL|FIFO_CONTROL_FIFO_RST,R0
STI R0,@FIFO_CONTROL
NOP
LDI FIFO_CONTROL_DMA_RUNSEL,R0
STI R0,@FIFO_CONTROL
SETDP
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*INTERRUPT VECTORS
*
.sect "vector"
.word _c_int00 ;RESET startup (000h)
.word INT0 ;INT 0 (display int [60Hz]) (001h)
.word ERROR_TRAP ;INT 1 (TV30 interrupt) (002h)
.word COMM_IRQ ;INT 2 (COMM IRQ) (003h)
.word ATODINT ;INT 3 (ATOD CONVERTER DONE) (004h)
.word ERROR_TRAP ;XINT0 (005h)
.word ERROR_TRAP ;RINT0 (006h)
.word ERROR_TRAP ;XINT1 (007h)
.word ERROR_TRAP ;RINT1 (008h)
.word ERROR_TRAP ;TINT0 (009h)
.word ERROR_TRAP ;TINT1 (00Ah)
.word ERROR_TRAP ;DINT (00Bh)
.word ERROR_TRAP ;RESERVED (00Ch)
.word ERROR_TRAP ;RESERVED (00Dh)
.word ERROR_TRAP ;RESERVED (00Eh)
.word ERROR_TRAP ;RESERVED (00Fh)
.word ERROR_TRAP ;RESERVED (010h)
.word ERROR_TRAP ;RESERVED (011h)
.word ERROR_TRAP ;RESERVED (012h)
.word ERROR_TRAP ;RESERVED (013h)
.word ERROR_TRAP ;RESERVED (014h)
.word ERROR_TRAP ;RESERVED (015h)
.word ERROR_TRAP ;RESERVED (016h)
.word ERROR_TRAP ;RESERVED (017h)
.word ERROR_TRAP ;RESERVED (018h)
.word ERROR_TRAP ;RESERVED (019h)
.word ERROR_TRAP ;RESERVED (01Ah)
.word ERROR_TRAP ;RESERVED (01Bh)
.word ERROR_TRAP ;RESERVED (01Ch)
.word ERROR_TRAP ;RESERVED (01Dh)
.word ERROR_TRAP ;RESERVED (01Eh)
.word ERROR_TRAP ;RESERVED (01Fh)
.word ERROR_TRAP ;TRAP 0 (020h)
.word ERROR_TRAP ;TRAP 1 (021h)
.word ERROR_TRAP ;TRAP 2 (022h)
.word ERROR_TRAP ;TRAP 3 (023h)
.word ERROR_TRAP ;TRAP 4 (024h)
.word ERROR_TRAP ;TRAP 5 (025h)
.word ERROR_TRAP ;TRAP 6 (026h)
.word ERROR_TRAP ;TRAP 7 (027h)
.word ERROR_TRAP ;TRAP 8 (028h)
.word ERROR_TRAP ;TRAP 9 (029h)
.word ERROR_TRAP ;TRAP 10 (02Ah)
.word ERROR_TRAP ;TRAP 11 (02Bh)
.word ERROR_TRAP ;TRAP 12 (02Ch)
.word ERROR_TRAP ;TRAP 13 (02Dh)
.word ERROR_TRAP ;TRAP 14 (02Eh)
.word ERROR_TRAP ;TRAP 15 (02Fh)
.word ERROR_TRAP ;TRAP 16 (030h)
.word ERROR_TRAP ;TRAP 17 (031h)
.word ERROR_TRAP ;TRAP 18 (032h)
.word ERROR_TRAP ;TRAP 19 (033h)
.word ERROR_TRAP ;TRAP 20 (034h)
.word ERROR_TRAP ;TRAP 21 (035h)
.word ERROR_TRAP ;TRAP 22 (036h)
.word ERROR_TRAP ;TRAP 23 (037h)
.word ERROR_TRAP ;TRAP 24 (038h)
.word ERROR_TRAP ;TRAP 25 (TV30 BREAK POINT) (039h)
.word ERROR_TRAP ;TRAP 26 (TV30 TVBP, TVBPX) (03Ah)
.word ERROR_TRAP ;TRAP 27 (TV30 RPTS/RPTB STATEMENTS) (03Bh)
.word ERROR_TRAP ;TRAP 28 (RESERVED) (03Ch)
.word ERROR_TRAP ;TRAP 29 (RESERVED) (03Dh)
.word ERROR_TRAP ;TRAP 30 (RESERVED) (03Eh)
.word ERROR_TRAP ;TRAP 31 (RESERVED) (03Fh)
.text
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
.if STATISTICS
.bss ST_POLYGONS,1 ;number of polygons (total)
.bss ST_VERTICES,1 ;number of vertices (total)
.bss ST_OBJECTS,1 ;number of objects (total)
.endif
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*
*1ms = 10 counts
*1mils = 10000
*1frame should = 165000 (roughly)
*
TIMER_RESET:
PUSH DP
PUSH R0
LDP @TIMER_CNTL1
LDI @TIMER_CNTL1,R0
OR TMR_RESET_GO,R0
STI R0,@TIMER_CNTL1
POP R0
POP DP
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
TIMER_READ:
PUSH DP
LDP @TIMER_CNTR1
LDI @TIMER_CNTR1,R0
POP DP
RETS
*----------------------------------------------------------------------------
.bss TIMEFRAME,1
.bss TIMEX,1
.bss TIMECLR,1
.bss TIMERAM,50
TIMERAMI .word TIMERAM
*----------------------------------------------------------------------------
TIMERESET:
PUSH DP
CALL TIMER_RESET
SETDP
LDI @TIMERAMI,AR0
STI AR0,@TIMEX
LDI @TIMECLR,R0
BNZ TIMEL1
LDF @TIMEFRAME,R0
ADDF 1,R0
STF R0,@TIMEFRAME
CALL INV_F30
LDI @TIMERAMI,AR0
STI AR0,@TIMEX
LDI 15,RC
RPTB TIMELP
LDF *AR0++,R1
ADDF *+AR0(15),R1
STF R1,*+AR0(15)
MPYF R0,R1
TIMELP STF R1,*+AR0(31)
POP DP
RETS
TIMEL1
LDI 0,R0
STI R0,@TIMECLR
LDF 0,R0
STF R0,@TIMEFRAME
LDI @TIMERAMI,AR0
RPTS 47 ;CLEAR OUT COUNT AREA
STF R0,*AR0++
POP DP
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
TIMEREC:
PUSH DP
PUSH AR0
LDP @TIMER_CNTR1
FLOAT @TIMER_CNTR1,R0
LDP @TIMEX
LDI @TIMEX,AR0
STF R0,*AR0++ ;SAVE THE INDEX
STI AR0,@TIMEX
POP AR0
POP DP
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
MESSAGE1:
CLRI R0
LDP @9E0000h
STI R0,@9E0000h
LDI -1,R0
STI R0,@9E0001h ;white
LDI 06000h,R0
STI R0,@9E0003h ;red
LDI 0294Ah,R0
STI R0,@9E000Bh ;grey
SETDP
CALL CLRSCRN
CALL SETPAGE0
LDIL SCREEN0,R0 ;set active screen to 1 (writeable)
STI R0,@ACTIVE_SCREEN
LDI 1,RC
TEXTIT startup0,1,40
TEXTIT startup1,1,70
TEXTIT startup2,1,80
TEXTIT startup3,1,90
LDI 11,RC
TEXTIT dlts,40,110
LDI 1,RC
TEXTIT VERSION_STAMP,40,130
TEXTIT INTERNAL_VERS,260,150
TEXTIT DATE_STAMP,40,150
CLRI AR0
LDP @DIPSW
LDI @DIPSW,R0
LDI *AR0,AR0
RS 16,R0
SETDP
TSTB DIP_COMMP,R0
BZ DODOIBO
LDI @LINKDISABLED,AR2
BU HJSADF
DODOIBO TSTB CMDP_MASTER,R0
LDIZ @IAMMASTER,AR2
LDINZ @IAMSLAVE,AR2
HJSADF LDI 40,R2
LDI 160,R3
CALL _outtextxyc
;test if link pal is installed
;
;
COMMPAL .set 0990000h ;COMMUNICATIONS PAL
CLRI AR0
LDP @COMMPAL
LDI @COMMPAL,R0
LDI *AR0,R1
SETDP
AND 0FH,R0
CMPI 4,R0 ;BAD PAL ?
LDIZ @TPALI,AR2
LDINZ @TPALNI,AR2
LDI 40,R2
LDI 170,R3
LDI 1,RC
CALL _outtextxyc
;
;
LDI 239,AR2
LDI 110,R2
LDI 301,R3
LDI 117,RC
LDI 11,RS
CALL _rectangle
LDI 11,RC
TEXTIT M1,1,190
RETS
.bss MSG_CNT,1
MSG1: LDI 11,RC
TEXTIT M2,1,200
TEXTIT M3,1,220
TEXTIT M4,1,230
TEXTIT M5,1,240
RETS
MSG2: LDI 11,RC
TEXTIT M6,1,260
TEXTIT M7,1,270
RETS
LINKDISABLED SPTR "LINK DISABLED BY U97 DIP6 OFF"
IAMMASTER SPTR "LINK MASTER MACHINE"
IAMSLAVE SPTR "LINK SLAVE MACHINE"
TPALI SPTR "U38 LINK PAL INSTALLED"
TPALNI SPTR "U38 LINK PAL NOT INSTALLED"
MSG3: LDI 11,RC
TEXTIT M8,1,280
TEXTIT M9,1,290
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*SECRET OCTOPUS
*
*
NUM_STATES .set 7
STATE_TABLE .word SW_VIEW0|SW_VIEW2
.word SW_VIEW2
.word SW_VIEW1|SW_VIEW2
.word SW_VIEW1
.word SW_VIEW0|SW_VIEW1
.word SW_VIEW0
.word SW_VIEW0|SW_RADIO
STATE_TABLEI .word STATE_TABLE
*
STATE_MASK .word SW_VIEW0|SW_VIEW1|SW_VIEW2|SW_RADIO
*
.bss STATE_NUM,1
.bss STATE_TIK,1
*
*
*
CHECK_STATE:
LDI @_MODE,R0
AND MMODE,R0
CMPI MATTR,R0
BNE ABORT_STATE
LDI @SWITCHBUTS,R2
LDI @STATE_NUM,AR0
LDI AR0,R0
ADDI @STATE_TABLEI,AR0
LDI *AR0,R1
AND @STATE_MASK,R2
CMPI R1,R2 ;ADVANCE TO NEXT STATE?
BEQ NEXTSTATE
LDI @STATE_NUM,R1
BZ ABORT_STATE
DEC R1
LDI R1,AR0
ADDI @STATE_TABLEI,AR0
LDI *AR0,R1
CMPI R1,R2 ;IS IT THE PREVIOUS STATE??
BNE ABORT_STATE
LDI @STATE_TIK,R0
DEC R0 ;ABORT STATE
BLT ABORT_STATE
STI R0,@STATE_TIK
RETS
NEXTSTATE
LDI @STATE_NUM,R0
INC R0
CMPI NUM_STATES,R0
BEQ DODIAG
STI R0,@STATE_NUM
LDI 120,R0
STI R0,@STATE_TIK
RETS
DODIAG
CLRI R0
STI R0,@STATE_NUM
STI R0,@STATE_TIK
.globl HIDDEN_DIAG
BR HIDDEN_DIAG
*
*
*
ABORT_STATE:
CLRI R0
STI R0,@STATE_NUM
STI R0,@STATE_TIK
RETS
*----------------------------------------------------------------------------
.bss BUTTON_IBO,1
.bss BUTTON_TIK,1
*----------------------------------------------------------------------------
BUTTONI .word BUTTII
BUTTII .word BUT_VIEW1,BUT_VIEW2,BUT_VIEW3,BUT_VIEW2
*
DASHLIGHT:
LDI @BUTTON_TIK,R0
INC R0
LDILT 0,R0
STI R0,@BUTTON_TIK
CMPI 60,R0
RETSLT
LDI 0,R0
STI R0,@BUTTON_TIK
LDI @BUTTON_IBO,R0
INC R0
CMPI 3,R0
LDIGE 0,R0
CMPI 0,R0
LDILT 0,R0
STI R0,@BUTTON_IBO
LDI R0,AR0
ADDI @BUTTONI,AR0
LDI *AR0,R0
B BUTLITE
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
CMOS_ERROR:
LDI 8,AR6
FLASH_LP
CALL CLRSCRN ;CMOS WAS RESET
CALL SETPAGE0
LDIL SCREEN0,R0 ;set active screen to 1 (writeable)
STI R0,@ACTIVE_SCREEN
LDI 100,AR5
FLASH_LP1
LDI 1,RC
TEXTITT "CMOS ERROR",216,190
TEXTITT "FACTORY ADJUSTMENTS RESTORED",144,200
DBU AR5,FLASH_LP1
CALL FEED_WATCHDOG
DBU AR6,FLASH_LP
CALL FAKEDIAG
CALL SET_CONTROLS
BR DIAG_RETURN
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
VERSION_UPDATE:
LDI 8,AR6
VFLASH_LP
CALL CLRSCRN ;CMOS WAS RESET
CALL SETPAGE0
LDIL SCREEN0,R0 ;set active screen to 1 (writeable)
STI R0,@ACTIVE_SCREEN
LDI 100,AR5
VFLASH_LP1
LDI 1,RC
TEXTITT "VERSION UPDATED",196,190
TEXTITT "FACTORY SETTINGS RESTORED",156,200
DBU AR5,VFLASH_LP1
CALL FEED_WATCHDOG
DBU AR6,VFLASH_LP
;RESET YOUR SHIT
CALL FAKEDIAG
CALL FFRSUB
LDI VERSION_ID,R2
SETAUD AUD_VERSION
BR DIAG_RETURN
*----------------------------------------------------------------------------
.globl FFRSUB,SET_CONTROLS,DIAGPAL
*----------------------------------------------------------------------------
.globl FAKEDIAG
FAKEDIAG:
CALL INIT_SYSTEM
CALL PAL_INIT
LDL DIAGPAL,AR2
CALL PAL_ALLOC_RAW
LDI 4210H,R0
STI R0,@BGNDCOLA
LDI MDIAG,R0 ;set mode appropriate
STI R0,@_MODE
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
FEED_WATCHDOG:
PUSH DP
PUSH R0
LDP @CPU_WS
LDI @CPU_WS,R0
PUSH R0
LDI SOFT_WS,R0
STI R0,@CPU_WS
LDP @SYSCNTL
LDI @SYSCNTL,R0
XOR WDOG,R0
STI R0,@SYSCNTL
LDP @SYSCNTLR
STI R0,@SYSCNTLR
POP R0
LDP @CPU_WS
STI R0,@CPU_WS
POP R0
POP DP
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
fbss SYSCNTL_OC,1
.globl FEED_WATCHDOG_HARD
FEED_WATCHDOG_HARD:
PUSH DP
PUSH R0
LDP @CPU_WS
LDI @CPU_WS,R0
PUSH R0
LDI 1068h,R0
STI R0,@CPU_WS
LDP @SYSCNTL
LDI @SYSCNTL,R0
XOR WDOG,R0
STI R0,@SYSCNTL
LDP @SYSCNTLR
STI R0,@SYSCNTLR
POP R0
LDP @CPU_WS
STI R0,@CPU_WS
POP R0
POP DP
RETS
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
.globl BSSSTART
BSSSTARTI .word BSSSTART
VERIFY_CODE_INTEGRITY:
.if DEBUG
;
;verify that the code has not been corrupted
;
;*this only works in RAM
;and, if used in ROM will cause a lockup
;
LDI 40h,AR1 ;SOURCE ADDRESS
LDI 0C00h,AR2 ;DESINATION ADDRESS
LS 12,AR2
ADDI 40h,AR2
LDI @BSSSTARTI,RC
SUBI 041h,RC
RPTB LD_CHK1
LDI *AR1++,R0
CMPI *AR2++,R0
.if CODE_CHECK
BNE $
.endif
LD_CHK1 NOP
.endif
RETS
*----------------------------------------------------------------------------
.END