1098 lines
20 KiB
NASM
Executable File
1098 lines
20 KiB
NASM
Executable File
.FILE "CMOS.ASM"
|
|
*----------------------------------------------------------------------------
|
|
*CMOS ROUTINES
|
|
*
|
|
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
|
|
*ALL RIGHTS RESERVED
|
|
*
|
|
|
|
.include SYS.EQU
|
|
.include VUNIT.EQU
|
|
.include C30.EQU
|
|
.include CMOS.EQU
|
|
.include MACS.EQU
|
|
.include GLOBALS.EQU
|
|
|
|
.text
|
|
*----------------------------------------------------------------------------
|
|
CMOSI .word CMOS ;start of CMOS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*DECREMENT HIGH SCORE RESET COUNTER
|
|
*
|
|
HSTDEC
|
|
READAUD ADJ_ACTUALHSTDRESET
|
|
SUBI 1,R0
|
|
LDILT 0,R0
|
|
LDI R0,R2
|
|
SETADJ ADJ_ACTUALHSTDRESET
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
CMOS_ON_C:
|
|
PUSH DP
|
|
LDP @CPU_WS
|
|
LDI CMOS_WS,R1
|
|
STI R1,@CPU_WS
|
|
POP DP
|
|
RETS
|
|
CMOS_OFF_C:
|
|
PUSH DP
|
|
LDP @CPU_WS
|
|
LDI SOFT_WS,R1
|
|
STI R1,@CPU_WS
|
|
POP DP
|
|
RETS
|
|
CMOS_WPON_C:
|
|
PUSH DP
|
|
.globl CMOS_WP_WORD_SHADOW
|
|
LDP @CMOS_WP_WORD_SHADOW
|
|
LDI @CMOS_WP_WORD_SHADOW,R1
|
|
AND 0F00h,R1
|
|
|
|
LDP @CMOS_WP_WORD
|
|
STI R1,@CMOS_WP_WORD
|
|
POP DP
|
|
RETS
|
|
CMOS_WPOFF_C:
|
|
PUSH DP
|
|
.globl CMOS_WP_WORD_SHADOW
|
|
LDP @CMOS_WP_WORD_SHADOW
|
|
LDI @CMOS_WP_WORD_SHADOW,R1
|
|
AND 0F00h,R1
|
|
|
|
LDP @CMOS_WP_WORD
|
|
OR CMOS_WP,R1
|
|
STI R1,@CMOS_WP_WORD
|
|
POP DP
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*VALIDATE_CMOS
|
|
*
|
|
*THIS ROUTINE VERIFIES THAT THE CMOS WE ARE USING
|
|
*IS CORRECT. IF NOT, THE VALUES ARE RESET TO THE DEFAULTS.
|
|
*CALL ON STARTUP
|
|
*
|
|
*
|
|
VALIDATE_CMOS:
|
|
|
|
READAUD AUD_PCREDITS
|
|
LDI R0,R2
|
|
CMPI 10,R0
|
|
LDIGT 10,R2
|
|
CMPI 0,R0
|
|
LDILT 0,R2
|
|
SETAUD AUD_PCREDITS
|
|
|
|
|
|
READAUD AUD_CREDITS
|
|
LDI R0,R2
|
|
CMPI 30,R0
|
|
LDIGT 30,R2
|
|
CMPI 0,R0
|
|
LDILT 0,R2
|
|
SETAUD AUD_CREDITS
|
|
|
|
CALL VALIDATE_HSTD_TABLES
|
|
CALL VERIFY_ADJUSTMENTS_ACCURACY
|
|
CLRC
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*RESET_BOOKKEEPING
|
|
*
|
|
* RESET THE BOOKKEEPING CMOS PAGE (GENERATE THE NEW CHECKSUM)
|
|
*
|
|
RESET_BOOKKEEPING:
|
|
PUSH R0
|
|
PUSH R2
|
|
PUSH AR2
|
|
PUSH AR4
|
|
|
|
;erase AUDITS
|
|
LDI (NUM_AUDITS-MAX_ADJUSTMENTS)-1,AR4
|
|
LDI @CMOSI,AR2
|
|
ADDI (MAX_ADJUSTMENTS+1)<<2,AR2
|
|
CLRI R2
|
|
RBLP CALL _wr_cw
|
|
DBU AR4,RBLP
|
|
|
|
POP AR4
|
|
POP AR2
|
|
POP R2
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*
|
|
*
|
|
*
|
|
VADJTAB .MACRO LOW,HIGH,DEFAULT
|
|
.word :LOW:
|
|
.word :HIGH:
|
|
.word :DEFAULT:
|
|
; .word :HIGH:<<8|:LOW:|(:DEFAULT:<<16)
|
|
.ENDM
|
|
romdata
|
|
VERIFY_ADJUSTMENTS_ACCURACYTAB
|
|
VADJTAB 0,81,0 ;ADJ_COINMODE
|
|
VADJTAB 0,255,0 ;ADJ_GASMIN
|
|
VADJTAB 0,255,255 ;ADJ_GASMAX
|
|
VADJTAB 0,255,0 ;ADJ_STEERMIN
|
|
VADJTAB 0,255,255 ;ADJ_STEERMAX
|
|
VADJTAB 0,255,128 ;ADJ_STEERCENTER
|
|
VADJTAB 0,255,0 ;ADJ_BRAKEMIN
|
|
VADJTAB 0,255,255 ;ADJ_BRAKEMAX
|
|
VADJTAB 0,255,200 ;ADJ_VOLUME
|
|
|
|
VADJTAB 0,100,1 ;ADJ_COIN1_UNITS
|
|
VADJTAB 0,100,1 ;ADJ_COIN2_UNITS
|
|
VADJTAB 0,100,1 ;ADJ_COIN3_UNITS
|
|
VADJTAB 0,100,1 ;ADJ_COIN4_UNITS
|
|
|
|
|
|
VADJTAB 0,100,1 ;ADJ_UNITS_PER_CREDIT
|
|
VADJTAB 0,100,0 ;ADJ_BONUS_UNITS
|
|
VADJTAB 0,100,0 ;ADJ_UNITS_MIN
|
|
VADJTAB 0,100,3 ;ADJ_CREDITS_TO_START
|
|
VADJTAB 0,100,3 ;ADJ_CREDITS_TO_CONTINUE
|
|
|
|
VADJTAB 0,1,1 ;ADJ_SHOW_FRAC
|
|
VADJTAB 0,127,1 ;ADJ_COIN1_COUNTER
|
|
VADJTAB 0,127,1 ;ADJ_COIN2_COUNTER
|
|
VADJTAB 0,127,1 ;ADJ_COIN3_COUNTER
|
|
VADJTAB 0,127,4 ;ADJ_COIN4_COUNTER
|
|
|
|
|
|
VADJTAB 0,1,1 ;ADJ_STANDARD_PRICING
|
|
VADJTAB 0,1,0 ;ADJ_CUSTOM_PRICING
|
|
VADJTAB 0,1,0 ;ADJ_FREE_PLAY
|
|
VADJTAB 0,1,1 ;ADJ_FREEGAME
|
|
VADJTAB 0,9,5 ;ADJ_DIFFICULTY
|
|
VADJTAB 0,6,3 ;ADJ_TIME_TO_START
|
|
VADJTAB 10,25,20 ;ADJ_CHECKPOINT_BONUS
|
|
VADJTAB 0,1,0 ;ADJ_ATTRACT_MODE_SOUND
|
|
VADJTAB 0,1,1 ;ADJ_HIGH_SCORE_ENTRY
|
|
VADJTAB 0,255,100 ;ADJ_MIN_VOL_LEVEL
|
|
VADJTAB 0,25000,4000 ;ADJ_ACTUALHSTDRESET
|
|
VADJTAB 0,1,0 ;ADJ_MPHORKPM
|
|
VADJTAB 0,1,1 ;ADJ_ROADKILL
|
|
VADJTAB 0,1,1 ;ADJ_CLINTON
|
|
VADJTAB 0,1,1 ;ADJ_GIRLS
|
|
VADJTAB 0,5,5 ;ADJ_STEERING_SENSE
|
|
VADJTAB 1000,25000,5000 ;ADJ_HIGHSCORE_RESET (step 1000)
|
|
VADJTAB 0,100,50 ;ADJ_DIFF_LOCAL
|
|
VADJTAB 0,1,0 ;UNKNOWN
|
|
VADJTAB 0,30,20 ;ADJ_RAMP_PERCENTAGE
|
|
VADJTAB 0,5000,0 ;ADJ_RAMP_COUNT
|
|
VADJTAB 0,1,1 ;ADJ_ENTER_INITS
|
|
VADJTAB 10,50,30 ;ADJ_MAX_CREDITS
|
|
|
|
.text
|
|
*
|
|
VERIFY_ADJUSTMENTS_ACCURACY:
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH R3
|
|
PUSH R4
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
CLRI AR5
|
|
LDL VERIFY_ADJUSTMENTS_ACCURACYTAB,AR6
|
|
VAALP
|
|
LDI AR5,AR2
|
|
CALL AUDIT_READ ;R0 = ADJUSTMENT VALUE
|
|
|
|
LDI *AR6++,R1
|
|
LDI *AR6++,R2
|
|
LDI *AR6++,R3
|
|
|
|
CMPI R1,R0
|
|
BLT DORST
|
|
CMPI R2,R0
|
|
BLE NORST
|
|
|
|
DORST LDI R3,R2
|
|
LDI AR5,AR2
|
|
CALL ADJUSTMENT_WRITE
|
|
|
|
NORST INC AR5
|
|
CMPI NUM_ADJUSTMENTS,AR5
|
|
BLT VAALP
|
|
|
|
POP AR6
|
|
POP AR5
|
|
POP AR2
|
|
POP R4
|
|
POP R3
|
|
POP R2
|
|
POP R1
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
RESET_ADJUSTMENTS:
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH R3
|
|
PUSH AR2
|
|
PUSH AR5
|
|
PUSH AR6
|
|
|
|
CLRI AR5
|
|
LDL VERIFY_ADJUSTMENTS_ACCURACYTAB,AR6
|
|
VAALP2
|
|
LDI *AR6++,R2
|
|
LDI *AR6++,R2
|
|
LDI *AR6++,R2 ;RESET VALUE
|
|
LDI AR5,AR2
|
|
CALL AUDIT_WRITE
|
|
|
|
INC AR5
|
|
CMPI NUM_ADJUSTMENTS,AR5
|
|
BLT VAALP2
|
|
|
|
.ref GETCOIN_DEFAULT
|
|
CALL GETCOIN_DEFAULT
|
|
|
|
|
|
; LDP @DIPSW
|
|
; LDI @DIPSW,R2
|
|
; SETDP
|
|
; RS 24,R2
|
|
; NOT R2
|
|
; LDI 0,R0
|
|
; LDI 7,RC
|
|
; RPTB INVBLP
|
|
; LSH -1,R2
|
|
;INVBLP ROLC R0
|
|
; AND 07Fh,R0
|
|
; LDI R0,R2
|
|
|
|
;Now check to see if the dipswitch setting is a valid coinmode
|
|
LDL VERIFY_ADJUSTMENTS_ACCURACYTAB,AR2
|
|
LDI ADJ_COINMODE,R0
|
|
MPYI 3,R0
|
|
ADDI R0,AR2
|
|
LDI *+AR2,R0
|
|
CMPI R0,R2
|
|
LDIGT *+AR2(2),R2
|
|
|
|
LDI ADJ_COINMODE,AR2
|
|
CALL ADJUSTMENT_WRITE
|
|
|
|
|
|
CALL CHECKSUMGEN_ADJ
|
|
LDI R0,R2
|
|
SETAUD ADJ_CHECKSUM
|
|
POP AR6
|
|
POP AR5
|
|
POP AR2
|
|
POP R3
|
|
POP R2
|
|
POP R1
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*GENERATE CHECKSUM FOR THE ADJUSTMENTS
|
|
*
|
|
*RETURNS
|
|
* R0 ADJUSTMENT CHECKSUM
|
|
*
|
|
CHECKSUMGEN_ADJ:
|
|
PUSH R1
|
|
PUSH AR2
|
|
PUSH AR5
|
|
|
|
CLRI AR5
|
|
CLRI R1
|
|
VAALP3
|
|
LDI AR5,AR2
|
|
CALL AUDIT_READ ;R0 = ADJUSTMENT VALUE
|
|
ADDI R0,R1
|
|
|
|
INC AR5
|
|
CMPI NUM_ADJUSTMENTS,AR5
|
|
BLT VAALP3
|
|
|
|
LDI R1,R0
|
|
POP AR5
|
|
POP AR2
|
|
POP R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
;*----------------------------------------------------------------------------
|
|
;*GENERATE CHECKSUM FOR THE AUDITS
|
|
;*
|
|
;*RETURNS
|
|
;* R0 ADJUSTMENT CHECKSUM
|
|
;*
|
|
;CHECKSUMGEN_AUD:
|
|
; PUSH R0
|
|
; PUSH R1
|
|
; PUSH AR2
|
|
; PUSH AR5
|
|
;
|
|
; LDI AUD_COIN1,AR5
|
|
; CLRI R1
|
|
;VAALP4 LDI AR5,AR2
|
|
; CALL AUDIT_READ ;R0 = ADJUSTMENT VALUE
|
|
; ADDI R0,R1
|
|
;
|
|
; INC AR5
|
|
; CMPI NUM_AUDITS-MAX_ADJUSTMENTS,AR5
|
|
; BLT VAALP4
|
|
;
|
|
; LDI R1,R0
|
|
; POP AR5
|
|
; POP AR2
|
|
; POP R1
|
|
; POP R0
|
|
; RETS
|
|
;*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*void audit_inc(int index)
|
|
*
|
|
*PARAMETERS
|
|
* AR2 INDEX
|
|
*RETURNS
|
|
* R0 AUDIT VALUE
|
|
*
|
|
AUDIT_INC:
|
|
LS 2,AR2
|
|
ADDI @CMOSI,AR2
|
|
CALL _rd_cw
|
|
NOP *AR2--(4)
|
|
ADDI 1,R0
|
|
LDI R0,R2
|
|
CALL _wr_cw
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*void audit_add(int index)
|
|
*
|
|
*PARAMETERS
|
|
* AR2 INDEX
|
|
* R2 VALUE
|
|
*RETURNS
|
|
* R0 AUDIT VALUE
|
|
*
|
|
AUDIT_ADD:
|
|
LS 2,AR2
|
|
ADDI @CMOSI,AR2
|
|
CALL _rd_cw
|
|
NOP *AR2--(4)
|
|
ADDI R0,R2
|
|
CALL _wr_cw
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*AUDIT_READ
|
|
*
|
|
*PARAMETERS
|
|
* AR2 INDEX
|
|
*RETURNS
|
|
* R0 AUDIT VALUE
|
|
*
|
|
ADJUSTMENT_READ:
|
|
AUDIT_READ:
|
|
LS 2,AR2
|
|
ADDI @CMOSI,AR2
|
|
CALL _rd_cw
|
|
NOP *AR2--(4)
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*
|
|
*
|
|
*PARAMETERS
|
|
* AR2 INDEX
|
|
* R2 VALUE
|
|
*RETURNS
|
|
* R0 AUDIT VALUE
|
|
ADJUSTMENT_WRITE:
|
|
CALL AUDIT_WRITE_ADJ
|
|
CALL CHECKSUMGEN_ADJ
|
|
LDI R0,R2
|
|
LDI ADJ_CHECKSUM,AR2
|
|
CALL AUDIT_WRITE_ADJ
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*AUDIT_WRITE
|
|
*
|
|
*PARAMETERS
|
|
* AR2 INDEX
|
|
* R2 VALUE
|
|
*RETURNS
|
|
* R0 AUDIT VALUE
|
|
*
|
|
AUDIT_WRITE:
|
|
|
|
.if DEBUG
|
|
CMPI NUM_ADJUSTMENTS,AR2
|
|
BLT $ ;AUDIT BEING USED TO WRITE ADJUSTMENT
|
|
.endif
|
|
|
|
AUDIT_WRITE_ADJ:
|
|
LS 2,AR2
|
|
ADDI @CMOSI,AR2
|
|
CALL _wr_cw
|
|
NOP *AR2--(4)
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*NOTE!!!: MODIFICATIONS TO _rd_cw,_wr_cw,_rd_cwR,_wr_cwR
|
|
*NOTE!!!: MODIFICATIONS TO _rd_cw,_wr_cw,_rd_cwR,_wr_cwR
|
|
*NOTE!!!: MODIFICATIONS TO _rd_cw,_wr_cw,_rd_cwR,_wr_cwR
|
|
*
|
|
*
|
|
*THE REGISTER RULES ARE:
|
|
*
|
|
* AR2 is incremented to next entry in CMOS
|
|
* R0 holds RETURN VALUE
|
|
*
|
|
* ALL OTHER REGS ARE PRESERVED!!!
|
|
* ALL OTHER REGS ARE PRESERVED!!!
|
|
* ALL OTHER REGS ARE PRESERVED!!!
|
|
*
|
|
*
|
|
* These are the basic pieces for CMOS I/O. No other routines
|
|
* should directly access CMOS.
|
|
*
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*int rd_cw(int addr);
|
|
*READ CMOS WORD
|
|
*
|
|
*PARAMETERS
|
|
* AR2 ADDR
|
|
*RETURNS
|
|
* R0 WORD
|
|
* AR2 INCREMENTED TO NEXT ENTRY IN CMOS
|
|
_rd_cw:
|
|
PUSH R1
|
|
CMOS_ON
|
|
NOP ;DELAY FOR TIMING...
|
|
|
|
LDI *AR2++,R0
|
|
RS 24,R0
|
|
LS 8,R0
|
|
|
|
LDI *AR2++,R1
|
|
RS 24,R1
|
|
OR R1,R0
|
|
LS 8,R0
|
|
|
|
LDI *AR2++,R1
|
|
RS 24,R1
|
|
OR R1,R0
|
|
LS 8,R0
|
|
|
|
LDI *AR2++,R1
|
|
RS 24,R1
|
|
OR R1,R0
|
|
|
|
CMOS_OFF
|
|
POP R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*void wr_cw(int addr, int value);
|
|
*WRITE CMOS WORD
|
|
*
|
|
*PARAMETERS
|
|
* AR2 LOC
|
|
* R2 WORD
|
|
*RETURNS
|
|
* AR2 INCREMENTED TO NEXT ENTRY IN CMOS
|
|
*
|
|
_wr_cw:
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH R3
|
|
CMOS_ON
|
|
CMOS_WP_OFF
|
|
NOP ;DELAY FOR TIMING...
|
|
|
|
STI R2,*AR2++
|
|
LS 8,R2
|
|
STI R2,*AR2++
|
|
LS 8,R2
|
|
STI R2,*AR2++
|
|
LS 8,R2
|
|
STI R2,*AR2++
|
|
CMOS_WP_ON
|
|
CMOS_OFF
|
|
POP R3
|
|
POP R2
|
|
POP R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*int rd_cmR(int addr);
|
|
*READ CMOS WORD REVERSED (MOTOROLA STYLE)
|
|
*
|
|
*PARAMETERS
|
|
* AR2 LOC
|
|
*RETURNS
|
|
* R0 WORD
|
|
* AR2 INCREMENTED TO NEXT ENTRY IN CMOS
|
|
*
|
|
_rd_cwR:
|
|
PUSH R1
|
|
CMOS_ON
|
|
NOP ;DELAY FOR TIMING...
|
|
|
|
LDI *AR2++,R0
|
|
RS 24,R0
|
|
|
|
LDI *AR2++,R1
|
|
RS 24,R1
|
|
LS 8,R1
|
|
OR R1,R0
|
|
|
|
LDI *AR2++,R1
|
|
RS 24,R1
|
|
LS 16,R1
|
|
OR R1,R0
|
|
|
|
LDI *AR2++,R1
|
|
RS 24,R1
|
|
LS 24,R1
|
|
OR R1,R0
|
|
|
|
CMOS_OFF
|
|
POP R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*void wr_cmR(int addr, int value);
|
|
*WRITE CMOS WORD REVERSED
|
|
*
|
|
*PARAMETERS
|
|
* AR2 LOC
|
|
* R2 WORD
|
|
*RETURNS
|
|
* AR2 INCREMENTED TO NEXT ENTRY IN CMOS
|
|
*
|
|
_wr_cwR:
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH R3
|
|
LDI R2,R3
|
|
LS 24,R3
|
|
CMOS_ON
|
|
CMOS_WP_OFF
|
|
|
|
NOP ;DELAY FOR TIMING...
|
|
|
|
STI R3,*AR2++
|
|
LDI R2,R3
|
|
RS 8,R3
|
|
LS 24,R3
|
|
STI R3,*AR2++
|
|
|
|
LDI R2,R3
|
|
RS 16,R3
|
|
LS 24,R3
|
|
STI R3,*AR2++
|
|
|
|
RS 24,R2
|
|
LS 24,R3
|
|
STI R2,*AR2++
|
|
CMOS_WP_ON
|
|
CMOS_OFF
|
|
POP R3
|
|
POP R2
|
|
POP R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
TABLEENT .MACRO I1,I2,I3,MIN,SEC,POSTN
|
|
.word :MIN:*60*56+:SEC:*56
|
|
.string :I1:,:I2:,:I3:,:POSTN:
|
|
.ENDM
|
|
DEFAULT_TABLE_SIZE .set 2
|
|
|
|
DEFAULT_TABLE:
|
|
TABLEENT 'T','V','G',2,01,3
|
|
TABLEENT 'E','L','P',2,02,3
|
|
TABLEENT 'E','P','J',2,03,3
|
|
TABLEENT 'M','L',' ',2,04,3
|
|
TABLEENT 'G','W','S',2,06,3
|
|
TABLEENT 'S','X','C',2,08,3
|
|
TABLEENT 'T','E','D',2,10,3
|
|
TABLEENT 'M','E','Y',2,12,3
|
|
TABLEENT 'M','M','V',2,14,3
|
|
TABLEENT 'B','D','P',2,16,3
|
|
|
|
|
|
DEFAULT_TABLE_TOTALI .word DEFAULT_TABLE_TOTAL
|
|
DEFAULT_TABLE_TOTAL:
|
|
TABLEENT 'T','V','G',28,00,3
|
|
TABLEENT 'E','L','P',28,10,3
|
|
TABLEENT 'E','P','J',28,20,3
|
|
TABLEENT 'M','L',' ',28,30,3
|
|
TABLEENT 'G','W','S',28,40,3
|
|
TABLEENT 'S','X','C',28,50,3
|
|
TABLEENT 'T','E','D',30,00,3
|
|
TABLEENT 'M','E','Y',31,10,3
|
|
TABLEENT 'M','M','V',32,20,3
|
|
TABLEENT 'B','D','P',34,30,3
|
|
NUM_TABLES .set 14
|
|
|
|
|
|
|
|
*INIT_LASTHS_TABLE
|
|
*CHECK_LASTHS
|
|
*----------------------------------------------------------------------------
|
|
*Initialize the LAST HS SET CMOS table
|
|
*
|
|
*This table is to keep track of the High Score entries set (if any at all)
|
|
*by the last player.
|
|
*There is one byte per Race location.
|
|
* -1 = not set by last player. 0-9 = Position in this table for that race
|
|
INIT_LASTHS_TABLE:
|
|
LDI NUM_TABLES+1,R6
|
|
LDI 0,R7
|
|
CALL GET_TABLE_ADDR
|
|
LDI -1,R2
|
|
LDI 14,AR5
|
|
ILT_LP
|
|
CALL _wr_cw
|
|
DBU AR5,ILT_LP
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* R6 = RACE NUMBER
|
|
* R7 = ENTRY NUMBER
|
|
UPDATE_LASTHS:
|
|
PUSH AR2
|
|
PUSH R0
|
|
PUSH R2
|
|
PUSH R6
|
|
PUSH R7
|
|
LDI R6,R0
|
|
LDI NUM_TABLES+1,R6
|
|
LDI 0,R7
|
|
CALL GET_TABLE_ADDR
|
|
MPYI 4,R0 ;4 bytes per word
|
|
ADDI R0,AR2
|
|
POP R7
|
|
LDI R7,R2
|
|
CALL _wr_cw
|
|
|
|
POP R6
|
|
POP R2
|
|
POP R0
|
|
POP AR2
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* R1 = RACE NUMBER
|
|
*
|
|
*Returns R0 = position in table of the last player that played. -1 = not in table
|
|
|
|
CHECK_LASTHS:
|
|
LDI NUM_TABLES+1,R6
|
|
LDI 0,R7
|
|
CALL GET_TABLE_ADDR
|
|
MPYI 4,R1 ;4 bytes per word
|
|
ADDI R1,AR2
|
|
CALL _rd_cw
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*Initialize the CMOS tables
|
|
*
|
|
*ALL TABLES DEFAULT TO THE ABOVE TABLE
|
|
*
|
|
*Related routines for management of CMOS stuff
|
|
*
|
|
* INIT_HSTD_TABLES
|
|
* GET_TABLE_ADDR
|
|
* TABLE_ENTRY_READ
|
|
* TABLE_ENTRY_WRITE0
|
|
* TABLE_ENTRY_WRITE
|
|
* CHECK_RACE_TABLE
|
|
* INSERT_TABLE_ENTRY
|
|
*
|
|
*
|
|
.globl INIT_HSTD_TABLES
|
|
INIT_HSTD_TABLES:
|
|
CLRI R6
|
|
LDI 15-1,AR5
|
|
ITL1
|
|
CLRI R7
|
|
LDI 10-1,AR4
|
|
LDL DEFAULT_TABLE,AR1
|
|
CMPI 14,R6 ;the 15th entry is the totals for the entire country
|
|
LDIEQ @DEFAULT_TABLE_TOTALI,AR1
|
|
ITL2
|
|
CALL GET_TABLE_ADDR
|
|
CALL TABLE_ENTRY_WRITE
|
|
|
|
ADDI DEFAULT_TABLE_SIZE,AR1
|
|
INC R7
|
|
DBU AR4,ITL2
|
|
INC R6
|
|
DBU AR5,ITL1
|
|
|
|
CALL INIT_LASTHS_TABLE
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
.globl INIT_HSTD_TABLES
|
|
VALIDATE_HSTD_TABLES:
|
|
CLRI R6
|
|
LDI 10-1,AR5
|
|
ITL1A
|
|
CLRI R7
|
|
LDI 10-1,AR4
|
|
LDL DEFAULT_TABLE,AR1
|
|
ITL2A
|
|
CALL GET_TABLE_ADDR
|
|
CALL TABLE_ENTRY_READ
|
|
|
|
CMPI ' ',R1
|
|
BEQ J1
|
|
CMPI '0',R1
|
|
BLT RESETALL
|
|
CMPI 'Z',R1
|
|
BGT RESETALL
|
|
J1 CMPI ' ',R2
|
|
BEQ J2
|
|
CMPI '0',R2
|
|
BLT RESETALL
|
|
CMPI 'Z',R2
|
|
BGT RESETALL
|
|
J2 CMPI ' ',R3
|
|
BEQ J3
|
|
CMPI '0',R3
|
|
BLT RESETALL
|
|
CMPI 'Z',R3
|
|
BGT RESETALL
|
|
|
|
J3 CMPI 0,R4
|
|
BLT RESETALL
|
|
CMPI 10,R4
|
|
BGT RESETALL
|
|
|
|
CMPI 4*60*60,R0
|
|
BGT RESETALL
|
|
CMPI 0,R0
|
|
BLT RESETALL
|
|
|
|
ADDI DEFAULT_TABLE_SIZE,AR1
|
|
INC R7
|
|
DBU AR4,ITL2A
|
|
|
|
INC R6
|
|
DBU AR5,ITL1A
|
|
RETS
|
|
|
|
RESETALL:
|
|
CALL INIT_HSTD_TABLES
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*PARAMETERS
|
|
* R6 RACE NUMBER
|
|
* R7 ENTRY NUMBER
|
|
*
|
|
*RETURNS
|
|
* AR2 ADDRESS
|
|
*
|
|
GET_TABLE_ADDR:
|
|
PUSH R6
|
|
PUSH R7
|
|
|
|
MPYI RACE_TABLE_SIZE,R6
|
|
MPYI TE_SIZE,R7
|
|
ADDI R6,R7,AR2
|
|
ADDI MAX_AUDITS*4,AR2
|
|
|
|
ADDI @CMOSI,AR2
|
|
POP R7
|
|
POP R6
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*WRITE ENTRY IN TABLE
|
|
*
|
|
*PARAMETER
|
|
* AR2 ADDRESS OF ENTRY
|
|
* AR1 TABLE ENTRY
|
|
*RETURNS
|
|
* (AR2 INCREMENTED TO THE NEXT ENTRY)
|
|
*
|
|
*
|
|
TABLE_ENTRY_WRITE:
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH R3
|
|
|
|
PUSH AR1
|
|
LDI *AR1++,R0
|
|
LDI *AR1++,R1
|
|
LDI R1,R2
|
|
RS 8,R2
|
|
|
|
LDI R1,R3
|
|
RS 16,R3
|
|
|
|
LDI R1,R4
|
|
RS 24,R4
|
|
POP AR1
|
|
|
|
BU TEWL1
|
|
|
|
*
|
|
*PARAMETERS
|
|
* R0 TIME CODE
|
|
* R1 Initial 1
|
|
* R2 Initial 2
|
|
* R3 Initial 3
|
|
* R4 POSITION
|
|
* AR2 ADDR
|
|
*
|
|
*
|
|
TABLE_ENTRY_WRITE0:
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH R3
|
|
|
|
TEWL1
|
|
PUSH R2
|
|
LDI R0,R2
|
|
CALL _wr_cw
|
|
POP R2
|
|
|
|
PUSH R1
|
|
CMOS_ON
|
|
CMOS_WP_OFF
|
|
; NOP ;DELAY FOR TIMING...
|
|
POP R1
|
|
|
|
LS 24,R1
|
|
STI R1,*AR2++
|
|
LS 24,R2
|
|
STI R2,*AR2++
|
|
LS 24,R3
|
|
STI R3,*AR2++
|
|
LS 24,R4
|
|
STI R4,*AR2++
|
|
CMOS_WP_ON
|
|
CMOS_OFF
|
|
|
|
POP R3
|
|
POP R2
|
|
POP R1
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*READ A TABLE ENTRY
|
|
*
|
|
*
|
|
*PARAMETERS
|
|
* AR2 ADDR
|
|
*RETURNS
|
|
* R0 TIME CODE
|
|
* R1 Initial 1
|
|
* R2 Initial 2
|
|
* R3 Initial 3
|
|
* R4 POSITION
|
|
* (AR2 INCREMENTED TO THE NEXT ENTRY)
|
|
*
|
|
TABLE_ENTRY_READ:
|
|
CALL _rd_cw
|
|
|
|
PUSH R0
|
|
|
|
CMOS_ON
|
|
CMOS_WP_OFF
|
|
|
|
LDI *AR2++,R1
|
|
RS 24,R1
|
|
LDI *AR2++,R2
|
|
RS 24,R2
|
|
LDI *AR2++,R3
|
|
RS 24,R3
|
|
LDI *AR2++,R4
|
|
RS 24,R4
|
|
|
|
PUSH R1
|
|
CMOS_WP_ON ;This trashes register R1
|
|
CMOS_OFF
|
|
POP R1
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CHECK_TABLE
|
|
*
|
|
*THIS ROUTINE CHECKS THE SPECIFIED TABLE TO SEE WHETHER OR NOT
|
|
*THE PLAYER CAN ENTER INTO THE TABLE
|
|
*
|
|
*PARAMETERS
|
|
* R0 TIME CODE (TO CHECK)
|
|
* R1 RACE INDEX
|
|
*RETURNS
|
|
* R0 {-1} = NO, MAY NOT ENTER
|
|
* R0 {0...9} = INDEX TO ENTER TABLE
|
|
*
|
|
CHECK_RACE_TABLE:
|
|
PUSH R0
|
|
LDI R1,R6
|
|
CLRI R7
|
|
CALL GET_TABLE_ADDR
|
|
POP R6
|
|
|
|
CLRI R5 ;RETURN INDEX
|
|
NXTENT CALL TABLE_ENTRY_READ
|
|
CMPI R0,R6
|
|
BLT INSERT_HERE
|
|
|
|
INC R5
|
|
CMPI 10,R5
|
|
BLT NXTENT
|
|
|
|
LDI -1,R0
|
|
RETS
|
|
|
|
INSERT_HERE
|
|
LDI R5,R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
*
|
|
*PARAMETERS
|
|
* R0 TIME CODE
|
|
* R1 Initial 1
|
|
* R2 Initial 2
|
|
* R3 Initial 3
|
|
* R4 POSITION
|
|
* R5 INDEX #
|
|
* R6 RACE #
|
|
*
|
|
*
|
|
*
|
|
INSERT_TABLE_ENTRY:
|
|
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH R3
|
|
PUSH R4
|
|
PUSH R5
|
|
|
|
LDI NUM_ENTRIES_PER_RACE-2,R7 ;Start at position 8
|
|
CALL GET_TABLE_ADDR
|
|
|
|
CMPI 9,R5
|
|
BGE ITLX
|
|
|
|
ITEL CALL TABLE_ENTRY_READ
|
|
CALL TABLE_ENTRY_WRITE0 ;This uses the registers as input instead of *AR1
|
|
|
|
NOP *AR2--(TE_SIZE*3)
|
|
DEC R7
|
|
CMPI R5,R7
|
|
BGE ITEL ;Copy down position including where inserting
|
|
|
|
ITLX POP R7
|
|
CALL GET_TABLE_ADDR ;Get the ADDR of the insert point
|
|
POP R4
|
|
POP R3
|
|
POP R2
|
|
POP R1
|
|
POP R0
|
|
CALL TABLE_ENTRY_WRITE0 ;This uses the registers as input instead of *AR1
|
|
|
|
CALL UPDATE_LASTHS
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
.END
|