revolution-x/GXHSTD.ASM

2901 lines
82 KiB
NASM
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.

.MLIB "GXMACS.LIB"
.FILE "GXHSTD.ASM"
.TITLE "<<< GENERATION X - HSTD ROUTINES >>>"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1992 MIDWAY MANUFACTURING COMPANY. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.INCLUDE "GX.INC"
.INCLUDE "GXSTRING.H"
.INCLUDE "IMGTBL.GLO"
.INCLUDE "UNIVTBL.GLO"
* IN THIS MODULE
.DEF RC_BYTE, RC_BYTEI, RC_WORD, RC_WORDI, RC_LONG, RC_LONGI
.DEF WC_BYTE, WC_BYTEI, WC_WORD, WC_WORDI, WC_LONG, WC_LONGI
.DEF INIT_TB, ALL_TAB, TOD_TAB, INIT_TAB
.DEF PT_ENTRY, VAL_TAB, ROM_PTRS, DEC_HSR, INIT_HSR
.DEF GET_HSC, ATT_HSTD, TRYADD
.DEF CLEAR_HSCOLORS, ON_HSTD, HS_ENTRY_SCRN, INITHIT
.DEF CHAR_PLOT, CHAR_SCORE, NEW_HISCORES
.DEF ENTRY_PTR, FETCH_SCORE
*SYMBOLS IN GX.ASM
.REF PLAYER, GPLAYD, WEND_SND_TAB, WIPEOUT
*SYMBOLS IN GXADJ.ASM
.REF BINBCD
*SYMBOLS IN GXCONTRL.ASM
.REF PLAYER_CURSOR
*SYMBOLS IN GXRAM.ASM
.REF SKYCOLOR, DO_CREDITS, GUNS_OFF
*SYMBOLS IN GXMISC.ASM
.REF SKYUP
* SYMBOLS IN GXSND.ASM
.REF SND_DIR_CHOSEN
* SYMBOLS IN GXLA1.ASM
.REF LA_OUTSIDE1_VECT_TABLE
* SYMBOLS IN GXBONUS.ASM
.REF INIT_ZERO_UNIVERSE
.REF BONUS_SET_X, NUMBER_RACKS
.REF JAKE_BOX
* SYMBOLS IN GX.ASM
.REF PLAYER_CLR
.REF ANY_BUT, WAIT_BUT, GET_CSTR
.REF CYCLE16
.REF INIT_ZERO_UNIVERSE
PBLK_STOR .EQU PDATA+0200H ;STORE AWAY THE PLAYER BLOCK IN A PROCESS
GRMUL EQU 32
RDMUL EQU 1024
.BSS LINE_STARTXY,32
.BSS INITIAL_1,8
.BSS INITIAL_2,8
.BSS INITIAL_3,8
.BSS DUMMY,8
.BSS SCORE_DATA,32
.BSS PIX_PAL,32
.BSS CHAR_POINTERS,32*33
.BSS CHAR_PLOT,64
.BSS CHAR_SCORE,32
.BSS CHAR_NUM,16
.BSS HOLDINITS,RHS_SIZE*4
.BSS ON_HSTD,16
.BSS COLPTR,32 ;PALETTE PTRS
.BSS COLPTRF,32
.BSS NEW_SCORE,32 ;SCORE PTR
.BSS HISCRFLAG,16 ;HIGH SCORE TABLE FLAG
.BSS CHAR_VAL,16 ;ASCII INITIAL VALUE
.BSS TOC,32 ;TIME OUT COUNT
.BSS P1INITS,32 ;PLAYER 1'S INITIAL STRING
.BSS P2INITS,32 ;PLAYER 2'S INITIAL STRING
.BSS NEW_HISCORES,16 ;Flag to tell us someone just entered
.BSS UNUSED_WORD,16
.BSS GREEN_PAL,32
.BSS RED_PAL,32
.BSS YEL_PAL,32
.BSS BLUE_PAL,32
.BSS WHITE_PAL,32
.TEXT
.EVEN
**************************************************************************
* *
* HIGH SCORE TABLE DEFINITIONS *
* *
**************************************************************************
ALL_TAB
.LONG ALL_TIME_ORIGIN ;LOCATION OF TABLE
.WORD ALL_TIME_ENTRIES-1 ;NUMBER IN THE TABLE (DON'T COUNT ZERO FILLER)
.WORD ALL_TIME_VISIBLE ;# VISIBLE (SHOW 20 ALL TIME)
.WORD ALL_TIME_SELECT ;BITS TO SELECT IT
.LONG ALL_TIME_ROM_TABLE ;ROM IMAGE OF TABLE
.WORD ALL_TIME_ENTRIES/5 ;RESET TABLE IF 1/5 OR MORE BAD
TOD_TAB
.LONG TODAYS_ORIGIN ;LOCATION OF TABLE
.WORD TODAYS_ENTRIES-1 ;NUMBER IN THE TABLE (DON'T COUNT ZERO FILLER)
.WORD TODAYS_VISIBLE ;# VISIBLE (SHOW 20 ALL TIME)
.WORD TODAYS_SELECT ;BITS TO SELECT IT
.LONG TODAYS_ROM_TABLE ;ROM IMAGE OF TABLE
.WORD TODAYS_ENTRIES/5 ;RESET TABLE IF 1/5 OR MORE BAD
**************************************************************************
* *
* AUTO HIGH SCORE TABLE RESET HANDLING *
* *
**************************************************************************
* *
* DEC_HSR *
* *
* THIS IS CALLED WITH EACH START OR CONTINUE FOR *
* A PLAYER. IT REMOVES 1 FROM THE HSTD COUNTER UNLESS *
* ITS ALREADY SITTING AT ZERO. *
* *
**************************************************************************
DEC_HSR
MMTM SP,A0
CALLR GET_HSC ;THIS IS EASY...GET THE COUNTER
JRZ DECHX ;ITS ZERO....NO ACTION.
DEC A0 ;REMOVE A TICK
calla CMOSUNLOCK
CALLR PUT_HSC ;PUT IT BACK JAK
calla CMOSLOCK
DECHX
MMFM SP,A0
RETS
**************************************************************************
* *
* DELAY_HSRESET *
* *
* THIS IS CALLED WHEN A NEW ENTRY IS MADE IN THE ALL TIME *
* HIGH SCORE TABLE. IF WE'RE CLOSE TO A HIGH SCORE *
* RESET, WE PUT IT OFF AWHILE SO HE CAN SHOW HIS FRIENDS *
* FOR A FEW DAYS. *
* *
**************************************************************************
HS_MIN EQU 750 ;ALWAYS 750 PLAYS BEFORE REMOVING A FRESH
* ;NAME.
*XUNIT NOBODY CALLS THIS
*
*
*DELAY_HSRESET
* MMTM SP,A0
* CALLR GET_HSC ;THIS IS EASY...GET THE COUNTER
* CMPI HS_MIN,A0 ;IS IT TOO LOW
* JRHS DHX ;NOPE...NO ACTION
*
* MOVI HS_MIN,A0 ;STOP THE RESET!
; calla CMOSUNLOCK
* CALLR PUT_HSC ;THIS MANY PLAYS TILL RESET!
; calla CMOSLOCK
*DHX MMFM SP,A0
* RETS
**************************************************************************
* *
* INIT_HSR *
* *
* THIS IS CALLED TO INITIALIZE THE HIGH SCORE RESET *
* COUNTER TO ITS ADJUSTED VALUE. *
* *
**************************************************************************
INIT_HSR
MMTM SP,A0
calla CMOSUNLOCK
MOVI ADJHSRES,A0
CALLA GET_ADJ ;GET THE ADJUSTED VALUE
CALLR PUT_HSC ;SET IT TO THIS VALUE
calla CMOSLOCK
MMFM SP,A0
RETS
**************************************************************************
* *
* PUT_HSC *
* *
* THIS IS CALLED TO SET THE HIGH SCORE RESET COUNTER *
* TO THE VALUE IN A0. *
* *
**************************************************************************
PUT_HSC
MMTM SP,A7,A0
CALLR HSR_PAGE ;HIGH SCORE PAGE
MOVI HRESET_COUNTER,A7 ;POINT AT
CALLR WC_LONGI ;WRITE OUR PARAMETER
NOT A0 ;NEGATE IT.
CALLR WC_LONG ;AND WRITE IN SUBSEQUENT SPOT.
;XUNIT CALLA DEF_PAGE ;FLIP PAGE
MMFM SP,A7,A0 ;AND RETURN
RETS
**************************************************************************
* *
* GET_HSC *
* *
* THIS IS CALLED TO FETCH THE HIGH SCORE COUNTER IN A0. *
* IF IT IS INVALID, IT WILL IMMEDIATELY BE RESET TO THE *
* ADJUSTED VALUE AND THIS IS WHAT WILL BE RETURNED *
* IN A0. .EQ. MEANS ITS AT ZERO! *
* *
**************************************************************************
GET_HSC
MMTM SP,A7,A1
CALLR HSR_PAGE ;POINT PAGE AT HSR
MOVI HRESET_COUNTER,A7 ;POINT AT
CALLR RC_LONGI ;READ THE VALUE
MOVE A0,A1 ;STASH IT
CALLR RC_LONG ;READ VERIFIER
NOT A0 ;SEE IF ITS VALID
CMP A0,A1
JRZ GET_HSCX ;IT IS....RETURN IT.
CALLR INIT_HSR ;REFRESH IT WITH FACTORY VALUE
*
* NOW RETURN THE FACTORY VALUE IN CASE IT DIDN'T TAKE
*
MOVI ADJHSRES,A0
CALLA GET_ADJ ;GET THE ADJUSTED VALUE
GET_HSCX
;XUNIT CALLA DEF_PAGE ;FLIP PAGE AWAY FROM US
MOVE A0,A0 ;SET Z FLAG BASED ON COUNTER
MMFM SP,A7,A1
RETS
HSR_PAGE
MMTM SP,A1
MOVI HSR_SELECT,A1
;XUNIT CALLR SET_PAGE
MMFM SP,A1
RETS
**************************************************************************
* *
* CKHSTD *
* *
* CHECK TO SEE IF EITHER SCORE WILL MAKE EITHER OF THE TABLES *
* *
* ENTRY *
* A0 SCORE TO CHECK *
* *
* EXIT *
* .EQ. NO *
* .NE. YES *
* *
**************************************************************************
ADD_ALL_TO_SHUFFLE
MOVK 1,B1
MOVI P1DATA,A14
MOVE *A14(POBJ),A1,L
JRZ NO_INSERT_PLAYER_1
MOVE *A14(PSCORE),A0,L
JRZ NO_INSERT_PLAYER_1
CALLA BINBCD
MOVE A14,A8
MOVI INITIAL_1,A1
CALLR TRYADD
NO_INSERT_PLAYER_1
MOVI P2DATA,A14
MOVE *A14(POBJ),A1,L
JRZ NO_INSERT_PLAYER_2
MOVE *A14(PSCORE),A0,L
JRZ NO_INSERT_PLAYER_2
CALLA BINBCD
MOVE A14,A8
MOVI INITIAL_1,A1
CALLR TRYADD
NO_INSERT_PLAYER_2
MOVI P3DATA,A14
MOVE *A14(POBJ),A1,L
JRZ NO_INSERT_PLAYER_3
MOVE *A14(PSCORE),A0,L
JRZ NO_INSERT_PLAYER_3
CALLA BINBCD
MOVE A14,A8
MOVI INITIAL_1,A1
CALLR TRYADD
NO_INSERT_PLAYER_3
RETS
COMPARE_AND_SHUFFLE
MOVI P1DATA,A14
CALLA COMPARE_PLAYER
MOVI P2DATA,A14
CALLA COMPARE_PLAYER
MOVI P3DATA,A14
COMPARE_PLAYER
CLR A0
CLR A2
MOVE *A14(POBJ),A1,L
JRZ WERE_NOT_IN
MOVE *A14(PSCORE),A0,L
JRZ WERE_NOT_IN
CALLA BINBCD
MOVE A0,B0
MOVI ALL_TAB,A8 ; CHECK ALL TIME TABLE FIRST, PLAYER 2
CALLA CHECK_SCORE
JRZ NOT_IN_ALL_TIME
CMPI 8,A0
JRLE WERE_IN
NOT_IN_ALL_TIME
MOVE B0,A0
MOVI TOD_TAB,A8 ; TODAY'S TABLE, PLAYER 2
CALLA CHECK_SCORE
JRZ WERE_NOT_IN
CMPI 8,A0
JRLE WERE_IN
WERE_NOT_IN
CLR A2
MOVE A2,*A14(POBJ),L
WERE_IN
RETS
**************************************************************************
* *
* TRYADD *
* *
* WE THINK WE ARE IN ONE OF THE TABLES -- ADD ME *
* *
* ENTRY *
* A0 SCORE *
* A1 POINTER TO INITIALS *
* A8 POINTER TO THE PLAYER DATA AREA *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
TRYADD:
MMTM SP,A8
PUSH A0
MOVE A8,A2
CALLA GPLAYNUM
INC A0 ; 1 BASE THIS ONE
MOVE A0,A2 ; WHAT TO STICK IN "HS_SCORE"
PULL A0
MOVI ALL_TAB,A8 ; CHECK ALL TIME TABLE FIRST
CALLR ADD_ENTRY
MOVI TOD_TAB,A8 ; TODAY'S TABLE
CALLR ADD_ENTRY
MMFM SP,A8
RETS
**************************************************************************
* *
* CHECK_SCORE *
* *
* THIS IS CALLED WITH A SCORE IN A0 TO SEE IF IT *
* IS HIGH ENOUGH TO MAKE THE TABLE. *
* *
* THIS ROUTINE CALLS FIND_TABLE_LEVEL WHICH RETURNS *
* THE POINT IN THE TABLE THAT THE PASSED SCORE WOULD *
* LAND. THIS VALUE MUST BE LESS THAN OR EQUAL TO *
* THE "TB_VISIBLE" VALUE FOR THE TABLE. THIS WOULD *
* MEAN THAT WE WANT TO GET THE PLAYER'S INITIALS. *
* *
* A8 CONTAINS ROM POINTER FOR TABLE TO CHECK. *
* RETURN A0 = 0 (AND .EQ.) IF SCORE ISN'T HIGH ENOUGH *
* AND A0 = POSITION IN TABLE IF SCORE MAKES IT. *
* *
**************************************************************************
CHECK_SCORE
MMTM SP,A1,A3,A9,A10
MOVE A0,A3 ;STASH SCORE IN A3
CALLR FIND_TABLE_LEVEL ;SEE WHERE WE LAND IN THIS TABLE
JRZ ANSWER_IN_A0 ;ZERO.....GUY DIDN'T MAKE IT
MOVE *A8(TB_VISIBLE),A1,W ;GET THE NUMBER "VISIBLE"
CMP A1,A0 ;A0 MUST BE LESS OR EQUAL
JRLS ANSWER_IN_A0 ;NOT INVISIBLE...RETURN SUCCESS
CLR A0 ;RETURN FAILURE
ANSWER_IN_A0
MOVE A0,A0 ;SET EQ BIT ACCORDINGLY
MMFM SP,A1,A3,A9,A10
RETS
**************************************************************************
* *
* ADD_ENTRY *
* *
* THIS IS CALLED AFTER "ENTER YOUR INITIALS" TO *
* ADD AN ENTRY TO THE TABLE. A0 CONTAINS THE *
* SCORE OF THE PLAYER. A1 CONTAINS A POINTER *
* TO THE FETCHED INITIALS. THE INITIALS ARE *
* STORED AS CONSECUTIVE BYTES IN CONVENTIONAL *
* (1 BYTE TAKES 1 BYTE SPACE) RAM. *
* *
* A8 contains a the table to store the entry in. *
* A2 CONTAINS SOMETHING TO STICK IN "HS_COLOR" *
* *
* RETURN CARRY SET IF IT DIDN'T MAKE IT INTO REQUESTED TABLE *
* *
**************************************************************************
ADD_ENTRY
MMTM SP,A0,A1,A2,A3,A4,A7,A9,A10,A11
MOVE A2,A11
CALLR ROM_PTRS ;SETUP FOR THIS TABLE
MOVE A0,A4 ;STASH THE SCORE A SEC.
CLR A2 ;DONT WORRY ABOUT OTHER GUY AT THIS POINT
CALLR CHECK_SCORE ;DOES THE REQUEST MAKE IT?
SETC ;ANTICIPATE FAILURE
JRZ DIDNT_MAKE_IT ;DON'T KNOW WHY I GOT THESE INITS.
*
* A0 NOW HAS THE PLACE FOR THE NEW GUY.
* MOVE THE ENTIRE TABLE DOWN 1 UNIT.
*
calla CMOSUNLOCK
MOVE B1,B1
JRZ COPY_DONE
MOVE A10,A3 ;LAST GUY IN TABLE IS DESTINATION
COPY_DOWN_LOOP
MOVE A3,A2 ;GUY BEFORE HIM IS SOURCE
DEC A2 ;A2 NOW HAS SOURCE
CMP A0,A2 ;IS SOURCE LOWER THAN OUR SLOT?
JRLO COPY_DONE ;IT IS...DON'T MOVE HIM.
CALLR COPY_ENTRY ;COPY A2 ENTRY TO A3
DEC A3 ;MOVE DOWN TO ONE BEFORE
JRUC COPY_DOWN_LOOP
COPY_DONE
CALLR PUT_SCORE_FOR_ENTRY ;SCORE IN A4 WRITTEN TO ENTRY A0
*
* INITIAL POINTER IS IN A1
* TABLE OFFSET IN A0
*
CALLR PT_ENTRY ;GET ENTRY POINTER IN A7
MMTM SP,A0,A7
ADDI HS_COL,A7
MOVE A11,A0
CALLR WC_WORD
MMFM SP,A0,A7
ADDI HS_INITS,A7 ;POINT AT FIRST INITIAL
MOVI NUM_INITS,A2 ;THIS IS NUMBER OF INITIALS
MMTM SP,A0 ;SAVE A0
INIT_COPY_LOOP
MOVB *A1,A0 ;GET AN INITIAL
JRNZ NOT_BLANK
MOVI SPACE,A0 ;REPLACE BLANKS WITH SPACES
NOT_BLANK
CALLR WC_BYTEI ;WRITE THE BYTE AND INCREMENT
ADDI BYTE_SIZE,A1 ;A1 TO NEXT BYTE PLEASE
DSJ A2,INIT_COPY_LOOP
MMFM SP,A0 ;GET BACK ENTRY NUMBER
CALLR FORM_HS_CKSUM_AND_STORE ;FOR CHECKSUM FOR THIS ENTRY AND STORE!
CLRC ;RETURN SUCCESS!
calla CMOSLOCK
DIDNT_MAKE_IT
MMFM SP,A0,A1,A2,A3,A4,A7,A9,A10,A11
RETS
**************************************************************************
* *
* FIND_TABLE_LEVEL *
* *
* THIS IS CALLED TO COMPARE THE SCORE IN A0 TO *
* THE TABLE POINTED TO BY A8. *
* *
* RETURN PHYSICALLY WHERE IT FITS IN A0, AND *
* SET THE Z FLAG ACCORDINGLY *
* *
**************************************************************************
FIND_TABLE_LEVEL
MMTM SP,A1,A2,A3
CALLR ROM_PTRS ;SETUP FOR THIS TABLE
CALLR VAL_TAB ;FIX THE TABLE IN CASE ITS BROKEN.
JRC FTL_FAIL ;CAN'T VALIDATE..SAY SCORE DIDN'T MAKE IT
MOVE A0,A2 ;KEEP SCORE IN A2
MOVK 1,A0 ;START AT 1 AND WORK UP.
CHECK_NEXT_SCORE
CALLR GET_HSCR ;FETCH A0 ENTRY'S SCORE IN A1
CMP A1,A2 ;HOW DO WE FARE AGAINST A1?
JRGE FOUND_THE_SPOT ;WE FOUND THE SPOT
INC A0 ;KEEP MOVING DOWN TILL WE FIT
CMP A10,A0 ;ARE WE LOOKING AT THE LAST ONE?
JRLS CHECK_NEXT_SCORE
FTL_FAIL
CLR A0 ;WE'RE NOT HIGH ENOUGH RETURN FAILURE
FOUND_THE_SPOT
MOVE A0,A0 ;MAKE SURE YOU SET THE FLAGS
MMFM SP,A1,A2,A3
RETS
**************************************************************************
* *
* GET_HSCR *
* *
* THIS IS CALLED TO FETCH THE SCORE FROM CMOS FOR *
* A GIVEN ENTRY. *
* *
* ENTRY NUMBER PASSED IN A0. *
* SCORE RETURNED IN A1. *
* *
**************************************************************************
GET_HSCR
MMTM SP,A7,A0
CALLR PT_ENTRY ;POINT A7 AT ENTRY
ADDI HS_SCORE,A7 ;INDEX SCORE PART.
CALLR RC_LONG ;FETCH THE LONG WORD INTO A0
MOVE A0,A1 ;MOVE TO A1
MMFM SP,A7,A0
RETS
**************************************************************************
* *
* PUT_SCORE_FOR_ENTRY *
* *
* THIS IS CALLED TO WRITE OUT THE SCORE FOR A GIVEN ENTRY. *
* ENTRY SPECIFIED BY A0. *
* SCORE PASSED IN A4. *
* *
**************************************************************************
PUT_SCORE_FOR_ENTRY
MMTM SP,A7,A0
CALLR PT_ENTRY ;POINT A7 AT ENTRY
ADDI HS_SCORE,A7 ;INDEX SCORE PART.
MOVE A4,A0 ;MOVE SCORE TO A0
CALLR WC_LONG ;WRITE OUT THE LONG WORD
MMFM SP,A7,A0
RETS
**************************************************************************
* *
* LOW LEVEL HSTD PROCESSING *
* *
**************************************************************************
*
* FOR HIGH SCORE ROUTINES
*
* A8 = ROM POINTER FOR A GIVEN TABLE STATS
* A9 = RAM POINTER FOR CMOS DATA
* A10 = NUMBER OF ENTRIES IN THE TABLE
*
* A0 = PARTICULAR ENTRY TO DEAL WITH
* 0 = FILL ENTRY (POINTER ROUTINES POINT HERE IF ERROR)
* 1 = HIGHEST SCORE IN TABLE
* N = NTH SCORE
*
* A1 = OUTPUT OF CHECKSUM ROUTINE (BYTE)
*
* A7 = POINTER TO CURRENT ENTRY
*
* A4,A5,A6 SCRATCH
*
**************************************************************************
* *
* FORM_HS_CKSUM *
* *
* THIS IS CALLED TO FORM THE CHECKSUM FOR THE SCORE *
* NUMBER IN A0. (RAM POINTER ASSUMED IN A9). *
* CHECKSUM IS RETURNED IN A1. THIS IS A *BYTE*. *
* *
* CHECKSUM IS COMPUTED AS THE COMPLEMENT OF THE SIMPLE SUM *
* OF THE BYTES IN THE ENTRY. *
* *
* THIS ROUTINE RETURNS WITH THE Z BIT SET (.EQ.) IF THE *
* CHECKSUM FOR THIS ENTRY MATCHES. *
* *
**************************************************************************
FORM_HS_CKSUM
MMTM SP,A0,A4,A6,A7
CALLR PT_ENTRY ;A7 = POINTER TO CURRENT ENTRY
MMTM SP,A7 ;SAVE POINTER TO ENTRY
MOVI HS_BYTES_TO_CHECK,A4 ;COUNT DOWN THE BYTES
CLR A1 ;KEEP SUM IN A1
ADD_A_BYTE
CALLR RC_BYTEI ;GET A BYTE INTO A0
ADD A0,A1 ;ADD TO SUM
DSJ A4,ADD_A_BYTE ;ONE MORE ADDED
NOT A1 ;CHECKSUM IS NOW IN LOW BYTE
ANDI BYTE_MASK,A1 ;MASK SO ITS COOL
MMFM SP,A7 ;GET POINTER BACK
ADDI HS_CKBYTE,A7 ;POINT AT CHECKBYTE
CALLR RC_BYTE ;READ IN THE BYTE
CMP A0,A1 ;COMPARE WHAT'S THERE TO WHAT WE GOT
MMFM SP,A0,A4,A6,A7 ;Z BIT RETURNS COMPARE
RETS ;A1 RETURNS CKSUM
**************************************************************************
* *
* FORM_HS_CKSUM_AND_STORE *
* *
* THIS IS USED TO SET THE CHECKSUM FOR THE CURRENT *
* ENTRY (A0) TO THE CORRECT VALUE. *
* *
**************************************************************************
FORM_HS_CKSUM_AND_STORE
MMTM SP,A0,A7
CALLR FORM_HS_CKSUM ;GET THE CKSUM IN A1, POINTER IN A7
CALLR PT_ENTRY ;POINT AT THE VALUE
ADDI HS_CKBYTE,A7 ;POINT AT CHECKBYTE
MOVE A1,A0 ;GET CHECKBYTE TO A0
CALLR WC_BYTE ;WRITE OUT THE BYTE
MMFM SP,A0,A7
RETS
**************************************************************************
* *
* PT_ENTRY *
* *
* THIS IS CALLED TO POINT AT A GIVEN ENTRY OF *
* THE HIGH SCORE TABLE. THIS ROUTINE BASES *
* ACTIVITY ON ROM POINTER IN A8. IT FETCHES *
* FRESH COPIES OF THE A9 RAM POINTER AND THE *
* A10 ENTRY COUNTER. IT RETURNS THE ENTRY *
* POINTER IN A7. *
* *
* A0 SPECIFIES WHICH ENTRY TO POINT AT *
* A8,A9,A10 AND SYSCTRL ASSUMED SET PROPERLY *
* A7 RETURNED POINTING TO THAT ENTRY *
* *
**************************************************************************
PT_ENTRY
CMP A10,A0 ;A10 IS MAX VALUE
JRLS POINTER_IN_RANGE
.IF DEBUG
JRUC $ ;HANG IN DEVELOPMENT
.ENDIF
MOVE A9,A7 ;RETURN ZERO OFFSET IN FIELD
RETS
POINTER_IN_RANGE
MOVI HS_SIZE,A7 ;SIZE OF ENTRY
MPYU A0,A7 ;OFFSET OF ENTRY
ADD A9,A7 ;ADD IN THE BASE
RETS
**************************************************************************
* *
* ROM_PTRS *
* *
* THIS IS CALLED TO LOAD UP THE ROM STRUCTURE *
* DATA INTO REGISTERS. *
* *
* THIS ALSO SETS UP STATUS WORD TO SELECT THE CMOS *
* BANK SELECT FOR WHERE THE PARTICULAR TABLE RESIDES. *
* *
* INPUT A8 = HSTD STRUCTURE ROM POINTER. *
* *
* OUTPUT A9 = CMOS RAM POINTER TO BASE OF TABLE *
* OUTPUT A10 = LAST ENTRY IN TABLE. TABLE WILL *
* HAVE A10+1 ENTRIES SINCE ENTRY *
* 0 IS A FILLER. *
* *
**************************************************************************
ROM_PTRS
MMTM SP,A0,A1 ;SCRATCH REGGIES
MOVE *A8(TB_POINTER),A9,L ;GET CMOS POINTER
MOVE *A8(TB_COUNT),A10,W ;GET NUMBER OF ENTRIES
MOVE *A8(TB_PAGE_BITS),A1 ;GET OUR CMOS PAGE BITS
;XUNIT CALLR SET_PAGE
MMFM SP,A0,A1 ;SCRATCH REGGIES
RETS
**************************************************************************
* *
* SET_PAGE *
* *
* This is called to set the CMOS page to the bits *
* contained in A1. *
* *
**************************************************************************
;XUNIT START
*SET_PAGE
* .IF TUNIT=0
* MMTM SP,A0,A1
* ANDI CMOS_PAGE_SELECT_BITS,A1 ;KILL SIGN EXTEND..SAVE BITS
* PUSHST ;SAVE INTERRUPT STATUS
* DINT ;STOP INTERRUPTS
* MOVE @SYSCOPY,A0,W ;GET THE RAM COPY
* ANDNI CMOS_PAGE_SELECT_BITS,A0 ;REMOVE THE CURRENT PAGE SELECT
* OR A1,A0 ;ADD IN OUR BITS
* MOVE A0,@SYSCOPY,W ;PUT THEM BACK IN THE RAM COPY
* MOVE A0,@SYSCTRL,W ;NOW THE HARDWARE
* POPST ;OK TO RE-START INTS
* MMFM SP,A0,A1
* .ENDIF
* RETS
;XUNIT END
**************************************************************************
* *
* INIT_TAB *
* *
* This entrypoint is called at power up to *
* clear out "today's" high score table. We do *
* this job, and then we do the job on the *
* all time table for high score reset if *
* necessary. *
* *
**************************************************************************
INIT_TAB
MMTM SP,A8,A0
MOVI TOD_TAB,A8
CALLR INIT_TB ;RESET TODAYS TABLE
.IF 0
CALLR GET_HSC ;CHECK THE HIGH SCORE RESET COUNTER
JRNZ INIT_TAB1 ;NOT ZERO...NO MORE ACTIVITY
*
* ITS ZERO....SEE IF ITS TURNED OFF
*
MOVI ADJHSRES,A0
CALLA GET_ADJ ;GET THE ADJUSTED VALUE
JRZ INIT_TAB1 ;ITS TURNED OFF...NO ACTION.
.ENDIF
MOVI ALL_TAB,A8 ;RESET THE ALL TIME TABLE
CALLR INIT_TB ;INIT THE ALL TIME TABLE
CALLR INIT_HSR ;RESET THE COUNTER TO ADJUSTED VALUE
INIT_TAB1
MMFM SP,A8,A0
RETS
**************************************************************************
* *
* INIT_TB *
* *
* THIS IS CALLED TO SETUP A HIGH SCORE TABLE WITH *
* FACTORY ENTRIES. *
* *
* A8 = ROM TABLE POINTER *
* *
**************************************************************************
INIT_TB
MMTM SP,A5,A6,A7,A0
calla CMOSUNLOCK
CALLR ROM_PTRS ;STUFF TABLE DATA
MOVE *A8(TB_FACTORY),A6,L ;GET THE FACTORY TABLE
MOVE A10,A5 ;NUMBER OF VALID ENTRIES
INC A5 ;1 MORE TO HOLD ZERO ENTRY
MOVI HS_SIZE_IN_BYTES,A1 ;SIZE OF 1 ENTRY
MPYU A1,A5 ;A7 HAS NUMBER OF WORDS TO MOVE
MOVE A9,A7 ;CMOS POINTER IN A7
INIT_TB_1
MOVB *A6,A0 ;GET A BYTE FROM ROM
ADDI BYTE_SIZE,A6 ;KICK ROM POINTER
CALLR WC_BYTEI ;WRITE THE BYTE AND INCREMENT
DSJS A5,INIT_TB_1 ;UNTIL THEY'RE ALL THERE.
MOVE A10,A0 ;POINT AT LAST ENTRY
INIT_TB_2
CALLR FORM_HS_CKSUM_AND_STORE ;SET ITS CHECKSUM
DEC A0 ;MOVE DOWN
JRNN INIT_TB_2 ;SET EACH ONE INCLUDING ZERO
calla CMOSLOCK
MMFM SP,A5,A6,A7,A0
RETS
**************************************************************************
* *
* KILL_TAB *
* *
* THIS IS CALLED TO SMASH A HIGH SCORE TABLE. *
* *
**************************************************************************
*KILL_TAB
* MMTM SP,A5,A6,A7,A0
* CALLR ROM_PTRS ;STUFF TABLE DATA
* MOVE A10,A0 ;POINT AT LAST ENTRY
*KILL_TAB_2
*
* MMTM SP,A0,A7
* CALLR FORM_HS_CKSUM ;GET THE CKSUM IN A1, POINTER IN A7
* CALLR PT_ENTRY ;POINT AT THE VALUE
* ADDI HS_CKBYTE,A7 ;POINT AT CHECKBYTE
* MOVE A1,A0 ;GET CHECKBYTE TO A0
* INC A0 ;BAD CKSUM
* CALLR WC_BYTE ;WRITE OUT THE BYTE
* MMFM SP,A0,A7
*
* DEC A0 ;MOVE DOWN
* JRNN KILL_TAB_2 ;SET EACH ONE INCLUDING ZERO
* MMFM SP,A5,A6,A7,A0
* RETS
*
**************************************************************************
* *
* COPY_ENTRY *
* *
* THIS IS CALLED TO COPY 1 ENTRY OF THE TABLE TO A *
* DIFFERENT LOCATION IN THE TABLE. *
* *
* A8,A9,A10,SYSCTRL ASSUMED TO BE SETUP ALREADY *
* A2 = SOURCE ENTRY (NUMBER) *
* A3 = DESTINATION ENTRY (NUMBER) *
* *
**************************************************************************
COPY_ENTRY
MMTM SP,A0,A4,A5,A6,A7
MOVI HS_SIZE_IN_BYTES,A4 ;ENTRY SIZE IN BYTES
MOVE A2,A0 ;FIRST POINT FOR A0
CALLR PT_ENTRY
MOVE A7,A6 ;A6 = SOURCE POINTER
MOVE A3,A0
CALLR PT_ENTRY ;A5 = DESTINATION
MOVE A7,A5
COPY_LOOP
*
* IN THIS LOOP WE MOVE A BYTE AT A TIME.
* SINCE THE WORD AND LONG DO THE SHIFTING AND
* MASKING AND CALL MULTIPLE ROUTINES, THIS IS
* THE MOST EFFICIENT MODE OF OPERATION.
*
MOVE A6,A7 ;SOURCE IN CMOS REGGIE
CALLR RC_BYTEI ;FETCH A WORD
MOVE A7,A6
MOVE A5,A7 ;DESTINATION
CALLR WC_BYTEI ;WRITE IT
MOVE A7,A5 ;BACK TO DEST REGGIE
DSJ A4,COPY_LOOP ;UNTIL ALL WORDS ARE COPIED
MMFM SP,A0,A4,A5,A6,A7
RETS
**************************************************************************
* *
* VAL_TAB *
* *
* THIS ROUTINE IS CALLED WHEN WE ARE INTERESTED IN *
* THE HSTD TABLE DATA. A8 CONTAINS THE ROM POINTER *
* FOR THE TABLE. FOR ANY ENTRIES THAT WE THROW *
* OUT, WE MOVE THE REST OF THE TABLE UP, AND CREATE *
* A NEW ENTRY AT THE END OF THE TABLE. *
* *
* A2 = 0 ON OUTSIDE CALL. *
* A2 = 1 ON RECURSIVE CALL (THE CHECK AFTER RE-INIT) *
* *
* THERE ARE 3 CHECKS MADE FOR EACH ENTRY: *
* *
* 1) IS CHECKSUM CORRECT. *
* 2) IS SCORE ALL NUMERIC *
* 3) ARE INITIALS ALL VALID ENTRIES. *
* *
* OUTPUT CC = TABLE OK *
* CS = PROBLEM THAT CAN'T BE RECTIFIED *
* (PROBABLY BAD RAM) *
* *
* A2 = 0 ...table ok, or cleaned up *
* A2 otherwise meanes table initialized *
* *
**************************************************************************
VAL_TAB
CLR A2 ;indicate first call in
CALLR DO_VALIDATE ;validate
RETS
DO_VALIDATE
MMTM SP,A0,A1,A3,A4,A5,A6,A7
CALLR ROM_PTRS ;SETUP FOR TABLE
MOVI 1,A0 ;ITERATE THROUGH THE ENTRIES
CLR A1 ;COUNT ERRORS
CHECK_A0_ENTRY
CALLR CHECK_ENTRY ;IS THE ENTRY OK?
JRNC VT_1 ;YEP.
CALLR REMOVE_ENTRY ;REMOVE THIS ENTRY
INC A1
MOVE *A8(TB_ERROR_COUNT),A3 ;GET THRESHOLD
CMP A3,A1 ;ARE WE THERE?
JRLO CHECK_A0_ENTRY ;NOPE...CHECK MOVE UP ENTRY AT A0
*
* TABLE IS MESSED UP....RE-INITIALIZE IT PLEASE
*
MOVE A2,A2 ;IS THIS RECURSIVE CHECK AFTER INIT?
JRNZ CANT_VALIDATE ;THEN RETURN FAILURE
CALLR INIT_TB ;INIT THIS TABLE PLEASE
MOVK 1,A2 ;INDICATE RECURSIVE CALL
CALLR DO_VALIDATE ;IS IT ALRIGHT NOW?
MMFM SP,A0,A1,A3,A4,A5,A6,A7
RETS
*
* LAST ENTRY WAS VALID...MOVE TO NEXT
*
VT_1
INC A0 ;KICK IT
CMP A10,A0 ;STILL IN TABLE?
JRLS CHECK_A0_ENTRY ;YEP....CHECK THIS ENTRY
CLRC ;RETURN VALID!
MMFM SP,A0,A1,A3,A4,A5,A6,A7
RETS
CANT_VALIDATE
SETC ;RETURN FAILURE!
MMFM SP,A0,A1,A3,A4,A5,A6,A7
RETS
**************************************************************************
* *
* CHECK_ENTRY *
* *
* THIS IS CALLED TO CHECK THE ENTRY INDICATED BY *
* A0. *
* *
* CC = OK *
* CS = ENTRY BAD *
* *
**************************************************************************
CHECK_ENTRY
MMTM SP,A0,A1,A2,A3,A7
CALLR FORM_HS_CKSUM ;CHECK OUT CKSUM FIRST
JRNZ CHECK_FAIL ;BAD CHECKSUM....ITS BAD
*
* CHECKSUM OK...CHECK SCORE
*
CALLR GET_HSCR ;SCORE IN A1
MOVE A1,A3 ;SAVE COPY OF SCORE
CHECK_DIGIT
MOVE A1,A2 ;COPY FOR NEXT NIBBLE
ANDI 0FH,A2 ;MASK THE NIBBLE
CMPI 9,A2
JRHI CHECK_FAIL ;NIBBLE TOO HIGH
SRL 4,A1 ;SHIFT DOWN TO NEXT NIBBLE
JRNZ CHECK_DIGIT
DEC A0 ;MAKE SURE WE ARE LOWER THAN PREVIOUS SCORE!
JREQ FIRST_ENT ;WE'RE THE 1ST IN THE TABLE
CALLR GET_HSCR ;GET THE SCORE FOR THE GUY BEFORE US
CMP A1,A3 ;OURS MUST BE LOWER OR SAME
JRHI CHECK_FAIL ;OURS IS BIGGER....REMOVE US
FIRST_ENT
INC A0 ;RESTORE THE ENTRY NUMBER
*
* SCORE OK...CHECK INITIALS
*
CALLR PT_ENTRY ;POINT A7 AT ENTRY
ADDI HS_INITS,A7 ;POINT AT FIRST INITIAL
MOVI NUM_INITS,A2 ;THIS IS NUMBER OF INITIALS
NEXT_LETTER
CALLR RC_BYTEI ;FETCH A BYTE
CALLR VERIFY_LETTER ;SEE IF ITS VALID.
JRC CHECK_FAIL ;NOT A LETTER...BYTE
DSJ A2,NEXT_LETTER
CLRC ;RETURN PASS
MMFM SP,A0,A1,A2,A3,A7
RETS
CHECK_FAIL
SETC
MMFM SP,A0,A1,A2,A3,A7
RETS
**************************************************************************
* *
* VERIFY_LETTER *
* *
* THIS IS CALLED FOR EACH INITIAL LETTER TO SEE *
* IF ITS VALID. *
* *
* CC = VALID *
* CS = NOT VALID *
* *
**************************************************************************
VERIFY_LETTER
ANDI BYTE_MASK,A0 ;KEEP JUST THE BYTE
CMPI SPACE,A0 ;SPACE?
JREQ VERIFY_PASS ;ITS OK.
* No fucking wonder it didn't work !
; CMPI LET_A,A0 ;BETWEEN A-Z?
; JRLO VERIFY_FAIL
;
; CMPI LET_Z,A0
; JRHI VERIFY_FAIL
CMPI ASCII_START,A0 ;BETWEEN A-Z?
JRLO VERIFY_FAIL
CMPI ASCII_END,A0
JRHI VERIFY_FAIL
VERIFY_PASS
CLRC
RETS
VERIFY_FAIL
SETC
RETS
**************************************************************************
* *
* REMOVE_ENTRY *
* *
* THIS IS CALLED TO REMOVE A BAD ENTRY FROM THE TABLE. *
* IT DELETES THE ENTRY INDICATED BY A0. *
* *
* IT BUBBLES THE REST OF THE TABLE UP 1 UNIT. *
* *
* IT THEN PUTS THE LOWEST SCORE FROM THE ROM TABLE *
* WITH INITIALS IN THAT ENTRY. *
* *
**************************************************************************
REMOVE_ENTRY
MMTM SP,A0,A1,A2,A6,A7
calla CMOSUNLOCK
MOVE A0,A3 ;THIS IS DEST
MOVE A3,A2 ;SOURCE IS 1 BELOW
BUBBLE_ANOTHER
INC A2 ;NOW WE'RE SET FOR A COPY...
CMP A10,A2 ;IS SOURCE OUT OF RANGE?
JRHI BUBBLE_DONE ;YEP....WE'RE AT THE BOTTOM (A3)
CALLR COPY_ENTRY
INC A3
JRUC BUBBLE_ANOTHER
BUBBLE_DONE
MOVE A3,A0 ;THIS IS BOTTOM OF TABLE
CALLR PT_ENTRY ;A7 POINTS AT CMOS BLOCK
MOVE *A8(TB_FACTORY),A6,L ;GET FACTORY TABLE
MOVI HS_ROM_SIZE,A1 ;SIZE OF ENTRY
MPYU A10,A1 ;TIMES NUMBER OF VALID ENTRIES..POINTS AT LAST.
ADD A1,A6 ;NOW WE POINT AT END OF ROM TABLE
MOVI HS_SIZE_IN_BYTES,A2 ;SIZE OF ENTRY
REPLACE_LOOP
MOVB *A6,A0 ;MOVE A ROM BYTE TO A0
ADDI BYTE_SIZE,A6
CALLR WC_BYTEI ;WRITE THE WORD AND INCREMENT
DSJ A2,REPLACE_LOOP ;UNTIL THEY'RE ALL THERE.
MOVE A10,A0 ;POINT AT "LAST" ENTRY
CALLR FORM_HS_CKSUM_AND_STORE ;STORE THE CHECKBYTE
calla CMOSLOCK
MMFM SP,A0,A1,A2,A6,A7 ;AND RETURN
RETS
**************************************************************************
* *
* CMOS UTILITIES *
* *
**************************************************************************
**************************************************************************
* *
* FOR ALL OF THESE CMOS ROUTINES. *
* *
* A7 = POINTER TO MEMORY *
* A0 = DATA TO/FROM MEMORY *
* *
**************************************************************************
*
* **** IMPORTANT NOTE ON WORD AND LONG WORD PACKING ****
* **** IMPORTANT NOTE ON WORD AND LONG WORD PACKING ****
* **** IMPORTANT NOTE ON WORD AND LONG WORD PACKING ****
* **** IMPORTANT NOTE ON WORD AND LONG WORD PACKING ****
* **** IMPORTANT NOTE ON WORD AND LONG WORD PACKING ****
*
* NOTE THAT REQUESTS FOR WORDS RETURN THE 2 BYTES PACKED
* INTO A WORD AS <1ST BYTE><2ND BYTE>. THIS IS NOT
* THE SAME WAY THAT THE GSP HANDLES A WORD POINTED AT
* WITH A POINTER.
*
* LONG WORDS WORK SIMILARLY:
*
* MSB LSB
* <1ST BYTE> <2ND BYTE> <3RD BYTE> <4TH BYTE>
*
* TOUGH LUCK INTEL HACKERS!
*
*
* RC_BYTE
* WC_BYTE
*
* These 2 routines are the only routines that ever touch
* CMOS ram. This is done to localize the effect of
* changes in the architecture. All efforts to deal with
* CMOS should come through these routines. Locking
* hardware will be easily added in the future (as well
* as different memory mapping).
*
RC_BYTE
MOVB *A7,A0
ANDI BYTE_MASK,A0
RETS
WC_BYTE
;XUNIT .IF TUNIT
;XUNIT MOVB A0,@WP_UNLOCK ;UNLOCK CMOS FOR A ONE SHOT WRITE
;XUNIT .ENDIF
MOVB A0,*A7 ;WRITE OUT THE BYTE
RETS ;AND RETURN
**************************************************************************
* *
* RC_BYTEI *
* *
* READ BYTE POINTED TO BY A7...INCREMENT POINTER TO *
* "NEXT" BYTE. *
* *
**************************************************************************
RC_BYTEI
CALLR RC_BYTE
ADDI C_BYTE_SIZE,A7 ;WORDS SEPARATE CMOS BYTES.
MOVE A0,A0 ;RETURN FLAGS ACCORDINGLY
RETS
RC_WORD
MMTM SP,A1,A7 ;USE A1 TO COMBINE BYTES
CALLR RC_BYTEI ;GET A BYTE
MOVE A0,A1 ;SAVE IN A1
ANDI BYTE_MASK,A1 ;MASK ONLY BYTE
SLL 8,A1 ;SHIFT TO HIGH BYTE
CALLR RC_BYTE ;GET THE 2ND BYTE
ANDI BYTE_MASK,A0
OR A1,A0 ;A0 HAS THE WORD
MMFM SP,A1,A7
RETS
RC_WORDI
CALLR RC_WORD
ADDI C_WORD_SIZE,A7 ;LONG SEPARATE CMOS WORDS.
MOVE A0,A0 ;RETURN FLAGS ACCORDINGLY
RETS
RC_LONG
MMTM SP,A1,A7 ;USE A1 TO COMBINE BYTES
CALLR RC_WORDI ;GET A WORD
MOVE A0,A1 ;SAVE IN A1
ANDI WORD_MASK,A1 ;MASK ONLY WORD
SLL 16,A1 ;SHIFT TO HIGH WORD
CALLR RC_WORD ;GET THE 2ND WORD
ANDI WORD_MASK,A0
OR A1,A0 ;A0 HAS THE LONG WORD
MMFM SP,A1,A7
RETS
RC_LONGI
CALLR RC_LONG
ADDI C_LONG_SIZE,A7 ;DOUBLE THE DISTANCE FOR BRAIN DAMIJ
MOVE A0,A0 ;RETURN FLAGS ACCORDINGLY
RETS
WC_BYTEI
CALLR WC_BYTE
ADDI C_BYTE_SIZE,A7
RETS
WC_WORD
MMTM SP,A0,A1,A7
MOVE A0,A1 ;MAKE COPY OF WORD
SRL 8,A0 ;GET HIGH BYTE IN A0
CALLR WC_BYTEI ;WRITE THE HIGH BYTE
MOVE A1,A0 ;NOW GET THE LOW BYTE BACK
CALLR WC_BYTE ;WRITE IT
MMFM SP,A0,A1,A7 ;AND RESTORE ALL WE TOUCHED
RETS
WC_WORDI
CALLR WC_WORD
ADDI C_WORD_SIZE,A7
RETS
WC_LONG
MMTM SP,A0,A1,A7
MOVE A0,A1 ;MAKE COPY OF LONG
SRL 16,A0 ;GET HIGH WORD IN A0
CALLR WC_WORDI ;WRITE THE HIGH WORD
MOVE A1,A0 ;NOW GET THE LOW WORD BACK
CALLR WC_WORD ;WRITE IT
MMFM SP,A0,A1,A7 ;AND RESTORE ALL WE TOUCHED
RETS
WC_LONGI
CALLR WC_LONG
ADDI C_LONG_SIZE,A7
RETS
**************************************************************************
* *
* CLR_ISTR *
* *
* CLEAR INITIAL DATA STRING *
* *
* ENTRY *
* A8, POINTER TO STRING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
CLR_ISTR
MOVI 00202020H,A14 ; SPACE SPACE SPACE NULL
MOVE A14,*A0,L
RETS
**************************************************************************
* *
* HS_ENTRY_SCRN *
* *
* HIGH SCORE ENTRY SCREEN SETUP AND TIMER LOOP *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
HS_ENTRY_SCRN
MOVI INGAMEOV,A0
MOVE A0,@GAME_STATE
CLRM @NEW_HISCORES,W ;No new ones yet
MOVK ADJHSON,A0
CALLA GET_ADJ
JRZ NO_HI_SCORE_INPUT
MOVI 00202020H,A0
MOVE A0,@INITIAL_1,L
MOVE A0,@P1DATA+PBONUSCORE,L
MOVE A0,@P2DATA+PBONUSCORE,L
MOVE A0,@P3DATA+PBONUSCORE,L
MOVE A0,@P1DATA+POBJ,L
MOVE A0,@P2DATA+POBJ,L
MOVE A0,@P3DATA+POBJ,L
CLR A0
MOVE A0,@P1DATA+PBONUSOBJ,L
MOVE A0,@P2DATA+PBONUSOBJ,L
MOVE A0,@P3DATA+PBONUSOBJ,L
MOVE A0,@P1DATA+PBOMBTYPE
MOVE A0,@P2DATA+PBOMBTYPE
MOVE A0,@P3DATA+PBOMBTYPE
MOVE A0,@IRQSKYE
MOVE A0,@IRQGNDE
CALLA ADD_ALL_TO_SHUFFLE
CALLR COMPARE_AND_SHUFFLE
MOVE @P1DATA+POBJ,A1,L
MOVE @P2DATA+POBJ,A2,L
MOVE @P3DATA+POBJ,A3,L
OR A1,A2
OR A2,A3
JRZ NO_HI_SCORE_INPUT
NO_CHEXX
CALLA CLEAR_ANIMS ;Clear all animations
CALLA KILL_DESTRUCTIBLES
CALLA MYOINIT ;initialize evreyfink
CALLA INIT_ZERO_UNIVERSE ;set up dummy universe
CALLA SCORAREA
MOVE @NPLAYERS,A10,W ;how many players are able to play
DEC A10
SLL 5,A10
MOVE A10,@NUMBER_RACKS ;0 - 2 players ; 10h - 3 players
MOVIM SCRNST,@SCRNTL,L
MOVIM SCRNEND,@SCRNBR,L
MOVIM -1,@GAMERASE,W ;AUTO ERASE OFF
MOVKM 1,@GUN_ONE_SHOT,W
CREATE PID_CURSOR,PLAYER_CURSOR ;START THE CURSOR TRACKER
SOUNDON ;TURN ON SOUND AND DISPLAY
DISPON
MOVKM 1,@NEW_HISCORES,W ;Got some new righteous ones
MOVE @DO_CREDITS,A14,W
JRZ HES_NORMAL ;BR = Not running credits
SOUND1 SND_BGND1_OFF
SOUND1 SND_BGND2_OFF
SOUND1 SND_BGND3_OFF
SOUND1 SND_CHAN1_OFF
SOUND1 SND_CHAN2_OFF
SOUND1 SND_CHAN3_OFF
SOUND1 SND_HSTD_CONGRATS2
JRUC HES_GO
HES_NORMAL
SOUND1 SND_ALLOFF
SLEEP 1
SOUND1 SND_HSTD_CONGRATS
HES_GO
MOVI HSE_MESS,A8
CALLA LM_SETUP
JSRP PRINTF
MOVI A_Z1,A8
CALLA LM_SETUP
JSRP PRINTF
CALLR MAKE_SINGLE
CREATE PID_IND,TIMER_PROC
MOVI P1DATA,A10
CREATE PID_ATT,SET_UP_FOR_INPUT ;set up plyr1 for input
MOVI P2DATA,A10
CREATE PID_ATT,SET_UP_FOR_INPUT ;set up plyr2 for input
MOVI P3DATA,A10
CREATE PID_ATT,SET_UP_FOR_INPUT ;set up plyr3 for input
SLEEP 2
CLRM @GUNS_OFF,W
ARE_WE_STILL_INPUTING
SLEEP 10
MOVE @TOC,A1,L
JRZ NO_HI_SCORE_INPUT
INC A1
JRNZ ARE_WE_STILL_INPUTING
SLEEP 30
NO_HI_SCORE_INPUT
RETP
MAKE_SINGLE
MOVI CONV_ASCII,A10
MOVE *A10+,A1
MOVE A1,*A2(OVAR9)
MOVI CHAR_POINTERS,A3
MOVE A2,*A3+,L
MAKE_SINGLE_2
MOVE *A2(OPARTS),A8,L
JRZ FINISHED_LETS
MOVE A8,*A3+,L
MOVE *A10+,A1
MOVE A1,*A8(OVAR9)
MOVI MAKE_LETTER_EXPLODE,A1
MOVE A1,*A8(OGUNVECT),L
MOVE *A8(OFLAGS),A1
ORI M_NOPIXSCAN,A1
MOVE A1,*A8(OFLAGS)
PUSH A3
CALLA PULL_PART
PULLQ A3
JRUC MAKE_SINGLE_2
FINISHED_LETS
RETS
SND_HSTD_CONGRATS
.WORD 0F3FDH,95,84edH,1,083e8H,0 ;"Can I have your autograph?"
SND_HSTD_CONGRATS2
.WORD 0F3FDH,95,84edH,0 ;"Can I have your autograph?"
TAB_HS_ENTERED
.LONG SND_ENTERED1, SND_ENTERED2, SND_ENTERED3, SND_ENTERED4
.LONG SND_ENTERED5
SND_ENTERED1
.WORD 0E3FBH,49,0A53FH,0 ;"Uh Huh"
SND_ENTERED2
.WORD 0E3FBH,47,0A533H,0 ;"Thank You"
SND_ENTERED3
.WORD 0E3FBH,69,0A542H,0 ;"Ooo Baby"
SND_ENTERED4
.WORD 0E3FBH,82,0A545H,0 ;"You're good"
SND_ENTERED5
.WORD 0E3FBH,82,0A54BH,0 ;"My Hero"
CONV_ASCII
.WORD 65,66,67,68,69,70,71,72,73,74,75,76,77
.WORD 78,79,80,81,82,83,84,85,86,87,88,89,90
.WORD 42,33,63,62,32,1,0
SCORE_COL_TAB
.WORD COLOR_RED,COLOR_YELLOW,COLOR_BLUE
SCORE_COL_TAB2
.WORD COLOR_RED,COLOR_BLUE
SET_UP_FOR_INPUT
CLR A0
MOVE A0,*A10(PCHAR_COUNT)
MOVE A10,*A13(PBLK_STOR),L ;grab plyr block data address
MOVE *A10(POBJ),A1,L
JRZ THIS_GUY_NOT_INPUTTING
MOVE A10,A2
CALLA PLAYER
MOVE *A10(PSCORE),A1,L
MOVE A1,@SCORE_DATA,L
MOVE A10,A2
MOVI PUT_SCORE_MESS,A8
CALLA LM_SETUP
CALLA GPLAYNUM
MOVI SCORE_COL_TAB,A14
MOVE @NUMBER_RACKS,A3
JRNZ NO_CLEVER_SCORE_COL
MOVI SCORE_COL_TAB2,A14
NO_CLEVER_SCORE_COL
SLL 4,A0
ADD A14,A0
MOVE *A0,A0
SLL 16,A0
MOVY A0,A5
CLR A0
CALLA BONUS_SET_X
JSRP PRINTF
MOVI INIT_FORM,A8
CALLA LM_SETUP
CALLA BONUS_SET_X
JSRP PRINTF
WAIT_UNTIL_FINISHED
SLEEP 1
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVE *A10(PCHAR_COUNT),A1
CMPI 4,A1
JRNE WAIT_UNTIL_FINISHED
CREATE PID_JUNK,FLASH_I_BOX
MOVE *A10(PBONUSCORE),A1,L
MOVE A1,@INITIAL_1,L
MOVE *A10(PSCORE),A0,L
CALLA BINBCD
MOVE A10,A8
MOVI INITIAL_1,A1
CLR B1
CALLA TRYADD
MOVE *A10(PPID),A0,W
MOVI M_INDESTRUCT|MASK_PLAYER,A1
CALLA KILALL ;KILL THE PLAYER PROCESSES
MOVE *A10(POBJ),A0,L
CALLA DELOBJ ;REMOVE THE SHIT
CLR A0
MOVE A0,*A10(PEBAROBJ),L
MOVE A10,A2
CALLA PLAYER_CLR ;CLEAR OUT PLAYER GAME DATA
SLEEP 20
THIS_GUY_NOT_INPUTTING
MOVE *A13(PBLK_STOR),A10,L ;grab plyr block data address
MOVK 4,A0
MOVE A0,*A10(PCHAR_COUNT)
DIE
FLASH_I_BOX
; SOUND1 SND_DIR_CHOSEN ;sound it !
RANDENT TAB_HS_ENTERED,5,5,L ;Random sound to make
CALLA ONESND
MOVE *A10(PBONUSOBJ),A8,L
JRZ NO_FLASH_IT
MOVI COLOR_WHITE,A7
MOVK 4,A4
CALLA JAKE_BOX
MOVE A6,A8
MOVK 4,A9
FLASH_IT_AGAIN
SLEEP 3
MOVE *A8(OFLAGS),A1
ORI M_NODISP,A1
MOVE A1,*A8(OFLAGS)
SLEEP 5
MOVE *A8(OFLAGS),A1
ANDI 0FFFFH-M_NODISP,A1
MOVE A1,*A8(OFLAGS)
DSJS A9,FLASH_IT_AGAIN
CALLA DELETE_OBJ
NO_FLASH_IT
DIE
**********************
;WORD ONE PIXEL
;WORD FILLER
;LONG YACCEL
;LONG XVEL
;LONG YVEL
;LONG XPOS
;LONG YPOS
.BSS LET_BIT_TABLE,((32*6)*280*3)
INITHIT
SUBI HS_YMIN,A9
SUBI HS_XMIN,A11
MOVI CHAR_XBOX,A7
DIVU A7,A11
MOVI CHAR_YBOX,A7
DIVU A7,A9
CMPK 3,A9
JRLO NO_Y_DIV_WORRY
MOVK 2,A9
NO_Y_DIV_WORRY
MOVK 11,A1
MPYU A9,A1
ADD A11,A1
SLL 5,A1
ADDI CHAR_POINTERS,A1
MOVE *A1,A8,L
MAKE_LETTER_EXPLODE
MOVE *A2(PBOMBTYPE),A14
CMPI 3,A14
JREQ NO_RESET_TIMER
INC A14
MOVE A14,*A2(PBOMBTYPE)
MOVK 30,A14 ;INIT TIMER TO 30 SECONDS
MOVE A14,@TOC,L
NO_RESET_TIMER
PUSH A8
MOVE *A2(PPID),A0
SLL 8,A0
ORI 23,A0
CALLA EXISTP_ALL
JRNZ LETTER_STILL_EXPLODING
MOVE *A8(OFLAGS),A1
ANDI M_NODISP,A1
JRNZ LETTER_STILL_EXPLODING
MOVE *A8(OVAR9),A1
JRNZ NOT_HIT_END
MOVK 4,A1
MOVE A1,*A2(PCHAR_COUNT)
JRUC YES_HIT_END
NOT_HIT_END
DEC A1
JRNZ NOT_HIT_DELETE
MOVI 32,A1
MOVE *A2(PCHAR_COUNT),A3
JRZ STAY_WITH_IT
DEC A3
STAY_WITH_IT
MOVE A3,*A2(PCHAR_COUNT)
SLL 3,A3
MOVE A2,A4
ADDI PBONUSCORE,A4
ADD A3,A4
MOVB A1,*A4
JRUC YES_HIT_END
NOT_HIT_DELETE
INC A1
MOVE *A2(PCHAR_COUNT),A3
CMPI 3,A3
JRLT NO_OVERFLOW_PROB
DEC A3
NO_OVERFLOW_PROB
SLL 3,A3
MOVE A2,A4
ADDI PBONUSCORE,A4
ADD A3,A4
MOVB A1,*A4
SRL 3,A3
INC A3
MOVE A3,*A2(PCHAR_COUNT)
YES_HIT_END
CALLA GPLAYNUM ;GET THE PLAYERS NUMBER
MOVI (32*6)*280,A9
MPYU A0,A9
ADDI LET_BIT_TABLE,A9
MOVE *A8(OPAL),A1
MOVE A1,@PIX_PAL
MOVE A2,A10
MOVE *A2(PPID),A1
SLL 8,A1
ORI 23,A1
MOVI EXPLODE_LETTER,A7
CALLA GETPRC
MOVE *A2(PBONUSOBJ),A8,L
JRZ NO_INITIALS_TO_KILL
CALLA DELETE_OBJ
NO_INITIALS_TO_KILL
PUSH A2
MOVE A2,*A13(PBLK_STOR),L
MOVE *A2(PBONUSCORE),A1,L
CLR A2
CMPI 0202020H,A1
JREQ NO_PRINT_ANYTHING
MOVE A1,@INITIAL_1,L
MOVI P_IFORM,A8
CALLA LM_SETUP
CALLA BONUS_SET_X
JSRP PRINTF
NO_PRINT_ANYTHING
PULLQ A10
MOVE A2,*A10(PBONUSOBJ),L
MOVE A10,A2
LETTER_STILL_EXPLODING
PULLQ A0
RETS
WHICH_GLASS
.LONG GLASS_1
.LONG GLASS_2
.LONG GLASS_3
GLASS_1
.word 0F180h,10H,43C0h ;Kill track 3
.WORD 0
GLASS_2
.word 0F280h,10H,43C1h ;Kill track 3
.WORD 0
GLASS_3
.word 0F380h,10H,43C2h ;Kill track 3
.WORD 0
EXPLODE_LETTER
SLEEP 16
MOVE A10,A2
CALLA GPLAYNUM
SLL 5,A0
ADDI WHICH_GLASS,A0
MOVE *A0,A0,L
CALLA ONESND
PUSH A9
MOVE *A8(ODAG),A3,L
MOVE @NO_MIRROR,A7,W ;Are we mirroring
JRNZ NO_FLIP_PIX_DAG
MOVI 400,A7
MOVE A3,A1
SUB A1,A7
MOVE *A8(OSIZEX),A1
SUB A1,A7
MOVX A7,A3
NO_FLIP_PIX_DAG
MOVX A3,A7
SLL 16,A7
SRL 16,A3
SLL 16,A3
MOVE A8,B0
MOVE *A8(OIMG),A8,L
MOVE *A8(ISAG),A8,L
MOVE A9,A2
MOVI 010000H,A5
MOVI 01F00H,A1
MOVE *B0(OSIZEY),B1
MOVE B1,A11
CLR A9
NEXT_Y_PIXELS
MOVE A7,A4
MOVE *B0(OSIZEX),B1
MOVE B1,A10
NEXT_X_PIXELS
CALLR GET_PIXEL
DSJS A10,NEXT_X_PIXELS
ADD A5,A3
DSJS A11,NEXT_Y_PIXELS
PULLQ A10
CREATEP PID_JUNK,ADD_PIXEL_VEL
MOVE B0,A8
MOVE *A8(OFLAGS),A1
ORI M_NODISP,A1
MOVE A1,*A8(OFLAGS)
SLEEP 30
MOVE *A8(OFLAGS),A1
ANDI 0FFFFH-M_NODISP,A1
MOVE A1,*A8(OFLAGS)
MOVI 0D0DH,A1 ;black, then kill object
MOVE A1,*A8(OCONST)
SLEEP 2
MOVI 0C0CH,A1 ;black, then kill object
MOVE A1,*A8(OCONST)
SLEEP 2
MOVI 0B0BH,A1 ;black, then kill object
MOVE A1,*A8(OCONST)
SLEEP 2
MOVI 0A0AH,A1 ;black, then kill object
MOVE A1,*A8(OCONST)
SLEEP 2
MOVI 0909H,A1 ;black, then kill object
MOVE A1,*A8(OCONST)
SLEEP 2
MOVI 0202H,A1 ;black, then kill object
MOVE A1,*A8(OCONST)
DIE
GET_PIXEL
MOVE *A8,A6 ;GET PIXEL
INC A8
SLL 31,A6
SRL 31,A6
MOVE A6,*A2+,L
MOVE A1,*A2+,L ;YACCEL
MOVI 018000H,A0
CALLA SRAND
SLL 1,A0
MOVE A0,*A2+,L ;XVEL
MOVI 21000H,A0
CALLA SRAND
SLL 1,A0
MOVE A0,*A2+,L ;YVEL
MOVE A4,*A2+,L ;XPOS
MOVE A3,*A2+,L ;YPOS
ADD A5,A4
INC A9
RETS
PIXEL_COL_OFF
.WORD 13,13
.WORD 12,12
.WORD 11,11
.WORD 10,10
.WORD 9,9
.WORD 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.WORD 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.WORD 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.WORD 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
.WORD 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
ADD_PIXEL_VEL
MOVI 40,A11
ADD_PIXEL_VEL2
DEC A11
JRNZ CONT_PIXEL_VEL
DIE
CONT_PIXEL_VEL
MOVE A11,A6
SLL 4,A6
ADDI PIXEL_COL_OFF,A6
MOVE *A6,A6
MOVE A6,B6
MMTM SP,A9,A10
movi DMAGOREG,B1
MOVE @PIX_PAL,@DMACMAPCON,L
MOVE *B1,B2,L ;WAIT FOR DMA TO CATCH UP
MOVE A10,A6
MOVI 3*32,A7
MOVI 512*8,B3
SETCDP
CLR B4
MOVI 8,A8
MOVE A8,@PSIZE
MOVE @PAGEADDR,A10,L
MOVI [252,0],A14
NEXT_PIXEL_VEL
MMFM A6,A0,A1,A2,A3,A4,A5
MOVE A5,A5
JRZ NO_PLOT_ANYTHING
MOVE B6,A5
ADD A4,A2 ;DO YACCEL
JRZ NO_PLOT_ANYTHING
ADD A2,A0 ;Y
CMP A14,A0
JRLE NO_WORRY_ABOUT_Y_BOUNCE
CALLR DO_BOUNCE
NO_WORRY_ABOUT_Y_BOUNCE
ADD A3,A1 ;X
MMTM A6,A0,A1,A2
SRL 16,A1
MOVX A1,A0
ADDXY A10,A0
CVXYL A0,A1
MOVB A5,*A1
ADD A7,A6
NO_PLOT_ANYTHING
DSJS A9,NEXT_PIXEL_VEL
MMFM SP,A9,A10
SLOOP 1,ADD_PIXEL_VEL2
DO_BOUNCE
SUB A2,A0
NEG A2
PUSH A1
MOVE A2,A1
SRA 1,A1
SUB A1,A2
PULLQ A1
MOVE A2,B0
ABS B0
SRL 16,B0
JRNZ NO_WORRY_ABOUT_Y_BOUNCE2
CLR A2
MOVE A2,*A6(20H-0C0H),L
MOVE A2,*A6(60H-0C0H),L
NO_WORRY_ABOUT_Y_BOUNCE2
RETS
********************************
A_Z1
MESS_MAC RD20FONT,17,25,100,COLOR_PWHITE,STRLNRMOF,OID_P1MOTEXT
.STRING "A B C D E F G H ",C_REG," J K"
.STRING "\nL M N O P Q R S T U V"
.STRING "\nW X Y Z * ! ? - _ ",C_TM," ",C_COPY,0
.EVEN
PUT_SCORE_MESS
MESS_MAC RD20FONT,2,62+5,230,COLOR_PLF,STRCNRMO,OID_P1MOTEXT
.STRING "%,ld",0
.LONG SCORE_DATA
.EVEN
**************************************************************************
* *
* TIMER_PROC *
* *
* TIMER PROCESS *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
TIMER_PROC
MOVK 30,A14 ;INIT TIMER TO 30 SECONDS
TICK MOVE A14,@TOC,L
MOVI TIMER_MESS,A8
JSRP LM_PRINTF ;DISPLAY TIME LEFT
MOVE A2,A8
SLEEP 60 ;1 SECOND DELAY
CALLA DELETE_OBJ
MOVE @P1DATA+PCHAR_COUNT,A0
MOVE @P2DATA+PCHAR_COUNT,A1
MOVE @P3DATA+PCHAR_COUNT,A2
AND A1,A2
AND A2,A0
CMPI 4,A0 ;CHECK IF PLAYER 2 IS DONE
JRNE MOTIME ;BR = NO
MOVI -1,A14 ;YES, BOTH ARE DONE
JRUC TDONE ;ZERO TIME LEFT
MOTIME MOVE @TOC,A14,L ;DECREMENT TIME LEFT
DEC A14
JRNZ TICK ;NEXT LOOP THINGY
MOVE @P1DATA+PBONUSCORE,A1,L
MOVE A1,@INITIAL_1,L
MOVE @P1DATA+PSCORE,A0,L
CALLA BINBCD
MOVI P1DATA,A8
MOVI INITIAL_1,A1
CLR B1
CALLA TRYADD
MOVE @P2DATA+PBONUSCORE,A1,L
MOVE A1,@INITIAL_1,L
MOVE @P2DATA+PSCORE,A0,L
CALLA BINBCD
MOVI P2DATA,A8
MOVI INITIAL_1,A1
CLR B1
CALLA TRYADD
MOVE @P3DATA+PBONUSCORE,A1,L
MOVE A1,@INITIAL_1,L
MOVE @P3DATA+PSCORE,A0,L
CALLA BINBCD
MOVI P3DATA,A8
MOVI INITIAL_1,A1
CLR B1
CALLA TRYADD
MOVI -1,A14
TDONE MOVE A14,@TOC,L ;SAVE ZERO
DIE ;GOODBYE
**************************************************************************
* *
* ATT_HSTD *
* *
* ATTRACT MODE HIGH-SCORE TABLE PAGE *
* *
* ENTRY *
* NOTHING *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
ATT_HSTD:
CALLA WIPEOUT
CLRM @SCRNTL,L
MOVKM 3,@GAMERASE,W
DISPON
CLR A0
CALLA FADEBLAK
SLEEP 1
MOVKM 1,@BLACKOUT,W
CALLA INIT_LINKED_LIST ;Initialize the Background links
MOVI -010000H,A0
SLL ZFRAC,A0
MOVE A0,@ZBASE_HR,L
MOVI 19C000H,A0
MOVE A0,@XBASE,L
CLR A0
MOVE A0,@YBASE,L
MOVI LA_OUTSIDE1_VECT_TABLE,A14
MOVE A14,@WVT_PTR,L ;STUFF WAVE VECTOR TABLE PTR
MOVI GXEVLOB3,A0
JSRP START_UNIVERSE
SLEEP 4
CLR A10
MOVE A10,@BLACKOUT
CLR A0
CALLA FADEIN_HALF_3
SLEEP 16
CALLA FADEFULL_TEXT
SLEEP 3
MOVK 1,A0
MOVE A0,@ON_HSTD,W ; FLAG THE HSTD PAGE
MOVI TOD_TAB,A8
CALLR VAL_TAB ; CHECK TO SEE IF WE HAVE A TABLE
JRC ATTOUTTAHERE
MOVI ALL_TAB,A8
CALLR VAL_TAB
JRC ATTOUTTAHERE
CLR A0 ;CLEAR PLAYER 1 AND 2 CHARACTER
CALLA GPLAYD ;POSITIONS FOR PULSING PROCESSES
CLR A1
MOVB A1,*A2(PCHAR_COUNT)
MOVK 1,A0
CALLA GPLAYD
MOVB A1,*A2(PCHAR_COUNT)
MOVI GREEN_TO_BLACK,A0
CALLA GETFPAL
MOVE A0,@GREEN_PAL
MOVI RED_TO_BLACK,A0
CALLA GETFPAL
MOVE A0,@RED_PAL
MOVI YEL_TO_BLACK,A0
CALLA GETFPAL
MOVE A0,@YEL_PAL
MOVI BLUE_TO_BLACK,A0
CALLA GETFPAL
MOVE A0,@BLUE_PAL
MOVI WHITE_TO_BLACK,A0
CALLA GETFPAL
MOVE A0,@WHITE_PAL
SLEEP 3
MOVK 2,A5 ; LOOP TWICE
TABLELP
MOVE A5,*A13(PDATA+080H),L
MOVE *A13(PDATA+080H),A5,L ; CHECK FOR FIRST TIME
SLEEP 2
MOVE *A13(PDATA+080H),A5,L ; CHECK FOR FIRST TIME
CMPI 1,A5
JREQ TJMP0
MOVI TODAY_MESS,A8 ; 2ND TIME, TODAYS
; MOVI ALL_MESS,A8 ; FIRST TIME, ALL TIME
JSRP LM_PRINTF
JRUC CJMP
TJMP0
MOVI ALL_MESS,A8 ; FIRST TIME, ALL TIME
; MOVI TODAY_MESS,A8 ; 2ND TIME, TODAYS
JSRP LM_PRINTF
CJMP
MOVI CREDIT_TEXT,A8 ; DISPLAY NUMBER OF CREDITS
CALLA LM_SETUP
CALLA GET_CSTR ; GET THE CREDIT STRING
JSRP PRINTF ; PRINT THE SCORE THING
MOVE *A13(PDATA+080H),A5,L ; CHECK FOR 2ND TIME
CMPI 2,A5
JREQ TJMP1
MOVI COLOR_WHITE,A5
MOVE A5,@COLPTRF,L
MOVI ALL_TAB,A8
; MOVI COLOR_GREEN,A5
; MOVE A5,@COLPTRF,L
; MOVI TOD_TAB,A8
MOVE A8,*A13(PDATA+0A0H),L ; STORE TABLE
JSRP PLOT_TABLE
JRUC FJMP
TJMP1
; MOVI COLOR_WHITE,A5
; MOVE A5,@COLPTRF,L
; MOVI ALL_TAB,A8
MOVI COLOR_GREEN,A5
MOVE A5,@COLPTRF,L
MOVI TOD_TAB,A8
MOVE A8,*A13(PDATA+0A0H),L ; SAVE TABLE
JSRP PLOT_TABLE
FJMP
MOVK 1,A5 ; TWICE FOR FADE CYCLE LOOP
FCLP MOVE A5,*A13(PDATA+0E0H),L
MOVK 10,A5 ; 10 ENTERIES TO PULSE
FADELP
MOVE A5,*A13(PDATA+060H),L
MOVE A5,A0
SUBK 11,A0
NEG A0 ; CALC ENTRY NUMBER
MOVE *A13(PDATA+0A0H),A8,L ; LOAD TABLE
MOVE A5,A9
JSRP PLOT_ENTRY ; PLOT TABLE ENTRY (FOR PULSING)
SLEEP 22
MOVE *A13(PDATA+060H),A5,L
DEC A5
CMPI 2,A5
JRNE FADELP
SLEEP 10
MOVE *A13(PDATA+0E0H),A5,L ; NEXT CYCLE OF PULSING THE TABLE
DSJ A5,FCLP
MOVI OID_TEXT,A0 ;kill all hiscore text
CALLA KILOBJ_ALL
MOVE *A13(PDATA+080H),A5,L
DSJ A5,TABLELP ; DO THE OTHER TABLE (TODAYS BEST)
ATTOUTTAHERE
CLR A0
MOVE A0,@ON_HSTD,W ; DISABLE FLAG
MOVK 1,A0
MOVE A0,@INGAMEOV,W ; ENABLE FLAG
CLR A10
CLR A0
CALLA FADE_HALF2BLAK
MOVI TEXTPAL,A0
CALLA FADEOUT_PALF
SLEEP 16
RETP
ARE_WE_NEW_HS
PUSH A0
MOVE A0,@CHAR_NUM,W
CALLR FETCH_SCORE ; GET THE SCORE
MOVE A1,@CHAR_SCORE,L
CALLR ENTRY_PTR ; POINT TO THE RIGHT ENTRY
ADDI HS_COL,A7
CALLR RC_WORD ; GET COLOR STUFF
MOVE A0,A1
PULLQ A0
RETS
CREDIT_TEXT:
MESS_MAC RD7FONT,1,198,246,COLOR_PRED,STRCNRMOS,0
.EVEN
BLACK2HALF
.word 0,8,16,24,32,40,48,56,64
.word 72,80,0FFFFH,88,96,104,112,120,128,0FFFFH
**************************************************************************
* *
* STRCMP *
* *
* COMPARE TWO STRINGS *
* *
* ENTRY *
* A0 AND A8 DA STRINGS *
* *
* EXIT *
* Z = 1 (SET), STRINGS EQUAL *
* Z = 0 (CLR), NOT EQUAL *
**************************************************************************
STRCMP MMTM SP,A1,A2,A9
MOVK 3,A2
NEXTCMP MOVB *A0,A1
MOVB *A8,A9
CMP A1,A9
JRNE CMPDONE
ADDK 8,A0
ADDK 8,A8
DSJ A2,NEXTCMP
SETZ
CMPDONE MMFM SP,A1,A2,A9
RETS
**************************************************************************
* *
* PLOT_TABLE *
* *
* PLOT OUT A TABLE AT A GIVEN SET OF TABLE LOCS *
* *
* ENTRY *
* A8 POINTER TO CMOS TABLE *
* *
* EXIT *
* NOTHING *
* *
**************************************************************************
ZIP_ACROSS .EQU 25
PLOT_TABLE:
MOVK 1,A0 ; START AT TABLE ENTRY 1
MOVI (26+HSTDY)*65536+106,A9 ; INITIAL SCRN LOCATION
PTLOOP
MOVE A9,*A13(PDATA+060H),L ; SAVE SCRN LOCATION
CMPI 9,A0
JREQ PTDONE ; NO MORE TO PLOT
MOVE A0,*A13(PDATA),L ; SAVE ENTRY NUMBER
MOVE A8,*A13(PDATA+040H),L ; SAVE PTR TO TABLE
MOVE @COLPTRF,@COLPTR,L
JSRP PLOT_ENTRY ; PLOT IT
MOVE *A13(PDATA),A0,L ; RESTORE ENTRY NUMBER
MOVE *A13(PDATA+040H),A8,L ; RESTORE PTR TO TABLE
PUSHP A0
SLEEP ZIP_ACROSS+10
PULLP A0
NOFIRST INC A0 ; NEXT ENTRY
MOVE *A13(PDATA+060H),A9,L
ADDI 26*65536,A9 ; NEXT SCRN LOCATION
JRUC PTLOOP
PTDONE
RETP
**************************************************************************
* *
* PLOT_ENTRY *
* *
* PLOT A HIGHSCORE TABLE ENTRY *
* *
* ENTRY *
* A0 ENTRY *
* A8 POINTER TO CMOS TABLE TO USE *
* A9 LOCATION ON SCREEN *
* *
* EXIT *
* NOTHING *
* *
* NOTE: TRASHES A8,A9,A10,A11 *
* *
**************************************************************************
PLOT_ENTRY:
MOVE A0,@CHAR_NUM,W
CALLR FETCH_SCORE ; GET THE SCORE
MOVE A1,@CHAR_SCORE,L
CALLR ENTRY_PTR ; POINT TO THE RIGHT ENTRY
MOVI 2020H,A0
MOVE A0,@CHAR_PLOT,L ; SPACES
MOVI 2000H,A0
MOVE A0,@CHAR_PLOT+32,L ; SPACE AND A ZERO TERMINATE
MOVE A7,A1 ; SAVE IT AROUND
ADDI HS_INITS,A7 ; GET TO THE INITIALS
CALLR RC_BYTEI
MOVB A0,@CHAR_PLOT
CALLR RC_BYTEI
MOVB A0,@CHAR_PLOT+8
CALLR RC_BYTEI
MOVB A0,@CHAR_PLOT+16
MOVE A1,A7
ADDI HS_COL,A7
CALLR RC_WORD ; GET COLOR STUFF
MOVE A0,A0
JRZ PELITTLE
MOVI COLOR_RED,A14
DEC A0
JRZ PRINT_COL_SET
MOVI COLOR_YELLOW,A14
MOVE @NPLAYERS,A10,W ;how many players are able to play
CMPI 1,A10
JREQ SET_COLOR_AS_BLUE
DEC A0
JRZ PRINT_COL_SET
SET_COLOR_AS_BLUE
MOVI COLOR_BLUE,A14
PRINT_COL_SET
MOVE A14,@COLPTR,L
PELITTLE
CLR A14 ; CLEAR NO DELAY FLAG
MOVE A14,*A13(PDATA+0C0H),L ; STORE NO DELAY FLAG
CMPI 10,A9 ; CHECK FOR SINGLE SCORE OR TABLE
JRHI PNORM ; BR = TABLE (DON'T NEED LOCATION)
INC A14 ; SET NO DELAY FLAG
MOVE A14,*A13(PDATA+0C0H),L ; STORE NO DELAY FLAG
MOVI (26+HSTDY)*65536+106,A6 ; CALC SCRN LOCATION
SUBI 11,A9
NEG A9
DEC A9
MOVI 26*65536,A8
MPYU A8,A9
ADD A6,A9
PNORM MOVE A9,A6 ; SAVE SCRN LOCATION
PUSHP A9
PUSHP A9
MOVI HSTD_NUM,A8 ; DISPLAY ENTRY NUMBER
CALLA LM_SETUP
ADDI 8,A6 ; MINOR ADJUSTMENT ON LOCATION
MOVE A6,A9 ; SET LOCATION
CLR A0 ; SET FOR NO SLEEP
MOVE *A13(PDATA+0C0H),A14,L ; GET NO DELAY FLAG
CMPI 1,A14 ; CLEAR DELAY?
JRNE PF0 ; BR = NO
JSRP START_HI_FLASH
JRUC PF0A
PF0 JSRP PRINTF
CALLR SETUP_RESET_AND_MOVE
PF0A
PULLP A6 ; RESTORE
MOVI HSTD_MESS,A8 ; DISPLAY ENTRY INITIALS
CALLA LM_SETUP
CALLA READ_SW1_SW2
BTST P1BOMB,A0
JRNZ NOER
BTST P2TRIGGER,A0
JRNZ NOER
MOVE A8,A9
MOVI ERSTR,A0
MOVI CHAR_PLOT,A8
CALLR STRCMP
JRZ DOER
MOVI ROSTR,A0
MOVI CHAR_PLOT,A8
CALLR STRCMP
JRZ DORO
MOVE A9,A8
JRUC NOER
DOER MOVI ER_STR,A8
JRUC NOER
DORO MOVI RO_STR,A8
NOER MOVE A6,A9 ; SET LOCATION
CLR A0 ; SET FOR NO SLEEP
MOVE *A13(PDATA+0C0H),A14,L
CMPI 1,A14 ; CLEAR DELAY?
JRNE PF1 ; BR = NO
JSRP START_HI_FLASH
JRUC PF1A
PF1 JSRP PRINTF
CALLR RESET_AND_MOVE
PF1A
PULLP A6 ; RESTORE
ADDI 215,A6 ; ANOTHER MINOR ADJUSTMENT ON LOC
MOVI HSTD_SCORE,A8 ; DISPLAY ENTRY SCORE
CALLA LM_SETUP
MOVE A6,A9 ; SET LOCATION
CLR A0 ; SET FOR NO SLEEP
MOVE *A13(PDATA+0C0H),A14,L
CMPI 1,A14 ; CLEAR DELAY?
JRNE PF2 ; BR = NO
JSRP START_HI_FLASH
JRUC PF2A
PF2 JSRP PRINTF
MOVE *A13(PDATA+0C0H),A14,L
CALLR RESET_AND_MOVE
PF2A
PERET
RETP
CONVERT_COL_TO_PAL
.LONG 0,RED_PAL,WHITE_PAL,BLUE_PAL
.LONG 0,YEL_PAL,0,GREEN_PAL
START_HI_FLASH
MMTM A12,A0,A1,A2,A3,A4,A5,A7,A8,A9
CLR A2
JSRP PRINTF
MOVE A2,A5
JRZ NO_NEED_TO_PULSE
MOVI 080000H,A0
MOVE A5,A8
MOVE_NEW_BEHIND_OLD
MOVE A0,*A8(OZVAL),L
MOVE *A8(OPARTS),A8,L
JRNZ MOVE_NEW_BEHIND_OLD
MOVE A5,A8
PUSHP A5
COMP_EACH_LET
MOVE *A8(OXPOS),A3
MOVE *A8(OYPOS),A4
MOVI FGLIST,A0
MOVE A0,A9
COMP_NEXT_LET
MOVE *A0,A0,L
CMP A0,A9
JREQ COULDNT_FIND_IT
CMP A0,A8
JREQ COMP_NEXT_LET
MOVE *A0(OXPOS),A1
MOVE *A0(OYPOS),A2
CMP A1,A3
JRNE COMP_NEXT_LET
CMP A2,A4
JRNE COMP_NEXT_LET
PUSH A8
MOVE A0,A8
MOVE *A8(OPAL),*A8(OVAR6),L
MOVE *A8(OCONST),A0
SRL 8,A0
SLL 5,A0
ADDI CONVERT_COL_TO_PAL,A0
MOVE *A0,A1,L
MOVE *A1(0),*A8(OPAL)
MOVI 0F0FH,A0
MOVE A0,*A8(OCONST)
MOVK 15,A9
CREATE PID_JUNK,WAIT_AND_RESET_PAL
PULLQ A8
SLEEP 1
COULDNT_FIND_IT
MOVE *A8(OPARTS),A8,L
JRNZ COMP_EACH_LET
PULLP A5
MOVE A5,A8
CALLA DELETE_OBJ
NO_NEED_TO_PULSE
MMFM A12,A0,A1,A2,A3,A4,A5,A7,A8,A9
RETP
WAIT_AND_RESET_PAL
SLEEP 2
CLR A0
MOVE A9,A0
SLL 8,A0
OR A9,A0
MOVE A0,*A8(OCONST)
DSJS A9,WAIT_AND_RESET_PAL
MOVE *A8(OVAR6),*A8(OPAL),L
DIE
SETUP_RESET_AND_MOVE
MOVE A2,A2
JRZ FINISHED_TEXT
MOVE *A2(OXPOS),A1
MOVE A1,@LINE_STARTXY
RESET_AND_MOVE
MOVE A2,A8
CALLR ZIP_TEXT_ACROSS
RESET_AND_MOVE_2
MOVE *A2(OPARTS),A8,L
JRZ FINISHED_TEXT
CALLA PULL_PART
CALLR ZIP_TEXT_ACROSS
JRUC RESET_AND_MOVE_2
FINISHED_TEXT
RETS
ZIP_TEXT_ACROSS
MOVE *A8(OXPOS),A1
MOVE A1,*A8(OVAR9)
MOVE @LINE_STARTXY,A3
MOVE A3,A5
SUB A5,A1
SLL 16,A1
MOVI ZIP_ACROSS,A5
DIVU A5,A1
MOVE A1,*A8(OXVEL),L
MOVE A3,*A8(OXPOS)
MOVE A3,*A8(ODAG)
CREATE PID_JUNK,MOVE_TEXT_ACROSS
RETS
MOVE_TEXT_ACROSS
SLEEP ZIP_ACROSS
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE *A8(OVAR9),*A8(OXPOS)
DIE
FLASHTABLE
.WORD 0101H, 0606H, 0101H, 0606H
FLASHPAL
.LONG TEXTPAL, TEXTPAL, TEXTPAL, TEXTPAL
COLTABLE
.LONG TEXTPAL, TEXTPAL, TEXTPAL, TEXTPAL
**************************************************************************
* *
* FETCH_SCORE *
* *
* GET THE SCORE FOR A GIVEN ENTRY IN THE HIGHSCORE TABLE *
* *
* ENTRY *
* A0 ENTRY NUMBER *
* A8 TABLE TO GET SCORE FROM *
* *
* EXIT *
* A1 SCORE *
* *
**************************************************************************
FETCH_SCORE:
MMTM SP,A9,A10
CALLA ROM_PTRS ;GET SYSTEM READY TO ACCESS THIS ONE
CALLA GET_HSCR ;NOW FETCH THE SCORE IN A1.
MMFM SP,A9,A10
RETS
**************************************************************************
* *
* ENTRY_PTR *
* *
* SET A7 TO POINT TO A GIVEN SCORE ENTRY *
* *
* ENTRY *
* A0 ENTRY NUMBER *
* A8 TABLE TO GET SCORE ENTRY FROM *
* *
* EXIT *
* A7 POINTER TO TABLE ENTRY *
* *
**************************************************************************
ENTRY_PTR:
MMTM SP,A9,A10
CALLA ROM_PTRS ;SETUP STUFF
CALLA PT_ENTRY ;POINT A7 AT ENTRY
MMFM SP,A9,A10
RETS
**************************************************************************
* *
* CLEAR_HSCOLORS - CLEAR OUT THE PLAYER COLOR INDICATOR ON ALL OF THE *
* CURRENT HIGH SCORES. *
* *
**************************************************************************
CLEAR_HSCOLORS
MMTM SP,A0,A1,A7,A8
calla CMOSUNLOCK
MOVI TOD_TAB,A8
MOVK 10,A0
CTL1
CALLR ENTRY_PTR
PUSH A0
CLR A0
ADDI HS_COL,A7
CALLR WC_WORD
PULL A0
PUSH A8
CALLA ROM_PTRS
CALLR FORM_HS_CKSUM_AND_STORE
PULL A8
DSJS A0,CTL1
MOVI ALL_TAB,A8
MOVK 20,A0
CTL2
CALLR ENTRY_PTR
PUSH A0
CLR A0
ADDI HS_COL,A7
CALLR WC_WORD
PULL A0
PUSH A8
CALLA ROM_PTRS
CALLR FORM_HS_CKSUM_AND_STORE
PULL A8
DSJS A0,CTL2
calla CMOSLOCK
MMFM SP,A0,A1,A7,A8
RETS
*****************************************************************************
*****************************************************************************
*****
***** DEFAULT ROM HSTD TABLES AND TABLE DEFINITIONS
*****
*****************************************************************************
*****************************************************************************
TB_POINTER EQU 0 ;LONG-POINTER TO BEGINNING OF TABLE
TB_COUNT EQU TB_POINTER+LONG_SIZE ;WORD....# IN THE TABLE.
TB_VISIBLE EQU TB_COUNT+WORD_SIZE ;WORD....NUMBER DISPLAYED
TB_PAGE_BITS EQU TB_VISIBLE+WORD_SIZE ;WORD....STATUS WORD FOR CMOS PAGE
TB_FACTORY EQU TB_PAGE_BITS+WORD_SIZE ;LONG....ROM STARTUP TABLE
TB_ERROR_COUNT EQU TB_FACTORY+LONG_SIZE ;WORD....NUM ERRORS TO RE-INIT
*
SCR_M .MACRO SCRM1,SCRM2,SCRM3,SCRM4
.BYTE :SCRM1:
.BYTE :SCRM2:
.BYTE :SCRM3:
.BYTE :SCRM4:
.ENDM
INIT_M .MACRO IM1,IM2,IM3
.BYTE :IM1:
.BYTE :IM2:
.BYTE :IM3:
.BYTE 0 ;CHECKBYTE
.ENDM
ALL_TIME_ROM_TABLE:
SCR_M 01H,50H,00H,00H
.WORD 0
INIT_M 'G','N','P'
ROM_ENTRY_SIZE EQU $-ALL_TIME_ROM_TABLE
SCR_M 01H,00H,00H,00H
.WORD 0
INIT_M 'S','V','T' ;1 STEVEN
SCR_M 00H,95H,00H,00H
.WORD 0
INIT_M 'A','J','P' ;2 JOE
SCR_M 00H,90H,00H,00H
.WORD 0
INIT_M 'B','E','W' ;3 BRAD
SCR_M 00H,85H,00H,00H
.WORD 0
INIT_M 'T','W','H' ;4 TOM
SCR_M 00H,80H,00H,00H
.WORD 0
INIT_M 'J','M','K' ;5 JOEY
SCR_M 00H,75H,00H,00H
.WORD 0
INIT_M 'T','J','C' ;6 TIM
SCR_M 00H,70H,00H,00H
.WORD 0
INIT_M 'K','A','G' ;7 KEITH GARDE
SCR_M 00H,65H,00H,00H
.WORD 0
INIT_M 'R','A','F' ;8 ROB
SCR_M 00H,60H,00H,00H
.WORD 0
INIT_M 'D','A','S' ;9 DANNY SIMON
SCR_M 00H,55H,00H,00H
.WORD 0
INIT_M 'E','D','M' ;10 ED MARSH
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'A','G','F' ;11 ANDRES FALK
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'E','J','B' ;12
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'A','K','N' ;13
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'L','E','B' ;14
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'C','L','B' ;15
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'D','U','X' ;16 NOSTALGIA
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'N','D','N' ;17
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'S','S','R' ;18
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'M','R',' ' ;19
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'B','I','G' ;20
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'L','E','P'
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'M','D','R'
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'B','A','C'
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'W',' ','R'
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'M','P','T'
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'S','U','E'
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'M','O','M'
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'D','A','D'
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'S','F','D'
SCR_M 00H,50H,00H,00H
.WORD 0
INIT_M 'A','K','D'
ALL_TIME_ENTRIES EQU ($-ALL_TIME_ROM_TABLE)/ROM_ENTRY_SIZE
TODAYS_ROM_TABLE:
SCR_M 00H,31H,08H,65H
.WORD 0
INIT_M 'G','N','P'
SCR_M 00H,31H,08H,65H
.WORD 0
INIT_M 'G','N','P' ;GEORGE
SCR_M 00H,30H,00H,00H
.WORD 0
INIT_M 'J','E','H' ;JACK
SCR_M 00H,28H,00H,00H
.WORD 0
INIT_M 'D','O','Z' ;DOZER
SCR_M 00H,26H,00H,00H
.WORD 0
INIT_M 'W','B','D' ;WARREN
SCR_M 00H,24H,00H,00H
.WORD 0
INIT_M 'S','A','B' ;STEVE
SCR_M 00H,22H,00H,00H
.WORD 0
INIT_M 'M','A','M' ;MARTY
SCR_M 00H,20H,00H,00H
.WORD 0
INIT_M 'J','C','V' ;JOHN
SCR_M 00H,18H,00H,00H
.WORD 0
INIT_M 'J','M','S' ;JAKE
SCR_M 00H,16H,00H,00H
.WORD 0
INIT_M 'C','P','G' ;GRANNER
SCR_M 00H,14H,00H,00H
.WORD 0
INIT_M 'J','R','N' ;NEWCOMER
TODAYS_ENTRIES EQU ($-TODAYS_ROM_TABLE)/ROM_ENTRY_SIZE
**************************************************************************
* *
* STUFF FOR ATT_HSTD *
* *
**************************************************************************
HSTDY EQU (SKYTOPOF/2)
INIT_FORM:
MESS_MAC RD20FONT,20,62+5,205,COLOR_PWHITE,STRCNRMOF,OID_P1MOTEXT
.STRING "___",0
.EVEN
INIT_TABLE:
MESS_MAC RD15FONT,1,56,155,COLOR_PRED,STRCNCO,OID_INIT
STRLOC: .STRING "%c",0
.LONG CHAR_VAL
.EVEN
.IF GERMAN
HSE_MESS:
MESS_MAC RD15FONT,16,200,20,COLOR_PRED,STRCNCOF,OID_TEXT
.STRING "TRAGE DEINE INITIALEN EIN",0
.EVEN
TODAY_MESS:
MESS_MAC RD15FONT,3,200,HSTDY,COLOR_PLF,STRCNRMOS,OID_TEXT
.STRING "TAGES-HIGH SCORE",0
.EVEN
ALL_MESS:
MESS_MAC RD15FONT,3,200,HSTDY,COLOR_PLF,STRCNRMOS,OID_TEXT
.STRING "BISHERIGER HIGH SCORE",0
.EVEN
.ELSE
HSE_MESS:
MESS_MAC RD20FONT,10,190,60,COLOR_PRED,STRCNRMO,OID_TEXT
.STRING "ENTER YOUR INITIALS",0
.EVEN
TODAY_MESS:
MESS_MAC RD20FONT,2,200,HSTDY,COLOR_PLF,STRCNRMOS,OID_TEXT
.STRING "TODAY'S REVOLUTIONARIES",0
.EVEN
ALL_MESS:
MESS_MAC RD20FONT,2,200,HSTDY,COLOR_PLF,STRCNRMOS,OID_TEXT
.STRING "ALL TIME REVOLUTIONARIES",0
.EVEN
.ENDIF
HSTD_NUM:
MESS_MAC RD20FONT,13,200,95+HSTDY,COLOR_PBLUE,STRRNRMOF,20000H|OID_TEXT
.STRING "\*b%d) ",0
.LONG COLPTR
.LONG CHAR_NUM
.EVEN
HSTD_MESS:
MESS_MAC RD20FONT,19,200,95+HSTDY,COLOR_PRED,STRLNRMOF,20000H|OID_TEXT
.STRING "\*b%s",0
.LONG COLPTR
.LONG CHAR_PLOT
ER_STR .STRING "\*b%sER",0
.LONG COLPTR
.LONG CHAR_PLOT
RO_STR .STRING "\*b%sRO",0
.LONG COLPTR
.LONG CHAR_PLOT
.EVEN
ERSTR .STRING "DOZ"
ROSTR .STRING "PET"
HSTD_SCORE:
MESS_MAC RD20FONT,12,200,95+HSTDY,COLOR_PYELLOW,STRRNRMOF,20000h|OID_TEXT
.STRING "\*b%,lb",0
.LONG COLPTR
.LONG CHAR_SCORE
.EVEN
P_IFORM:
MESS_MAC RD20FONT,20,62+8,200,COLOR_PLF,STRCNRMOF,OID_P1TEXT
.STRING "%s",0
.LONG INITIAL_1
.EVEN
TIMER_MESS:
MESS_MAC RD15FONT,3,200,37,COLOR_PRED,STRCNCO,OID_BTIME
.STRING "%d",0
.LONG TOC
.EVEN
GREEN_TO_BLACK
.WORD 16
.WORD 31*GRMUL,29*GRMUL,27*GRMUL,25*GRMUL
.WORD 23*GRMUL,21*GRMUL,19*GRMUL,17*GRMUL
.WORD 15*GRMUL,13*GRMUL,11*GRMUL,9*GRMUL
.WORD 7*GRMUL,5*GRMUL,3*GRMUL,1*GRMUL
RED_TO_BLACK
.WORD 16
.WORD 31*RDMUL,29*RDMUL,27*RDMUL,25*RDMUL
.WORD 23*RDMUL,21*RDMUL,19*RDMUL,17*RDMUL
.WORD 15*RDMUL,13*RDMUL,11*RDMUL,9*RDMUL
.WORD 7*RDMUL,5*RDMUL,3*RDMUL,1*RDMUL
YEL_TO_BLACK
.WORD 16
.WORD (31*GRMUL)+(31*RDMUL),(29*GRMUL)+(29*RDMUL),(27*GRMUL)+(27*RDMUL),(25*GRMUL)+(25*RDMUL)
.WORD (23*GRMUL)+(23*RDMUL),(21*GRMUL)+(21*RDMUL),(19*GRMUL)+(19*RDMUL),(17*GRMUL)+(17*RDMUL)
.WORD (15*GRMUL)+(15*RDMUL),(13*GRMUL)+(13*RDMUL),(11*GRMUL)+(11*RDMUL),(9*GRMUL)+(9*RDMUL)
.WORD (7*GRMUL)+(7*RDMUL),(5*GRMUL)+(5*RDMUL),(3*GRMUL)+(3*RDMUL),(1*GRMUL)+(1*RDMUL)
BLUE_TO_BLACK
.WORD 16
.WORD 31,29,27,25
.WORD 23,21,19,17
.WORD 15,13,11,9
.WORD 7,5,3,1
WHITE_TO_BLACK
.WORD 16
.WORD 31+(31*GRMUL)+(31*RDMUL),29+(29*GRMUL)+(29*RDMUL),27+(27*GRMUL)+(27*RDMUL),25+(25*GRMUL)+(25*RDMUL)
.WORD 23+(23*GRMUL)+(23*RDMUL),21+(21*GRMUL)+(21*RDMUL),19+(19*GRMUL)+(19*RDMUL),17+(17*GRMUL)+(17*RDMUL)
.WORD 15+(15*GRMUL)+(15*RDMUL),13+(13*GRMUL)+(13*RDMUL),11+(11*GRMUL)+(11*RDMUL),9+(9*GRMUL)+(9*RDMUL)
.WORD 7+(7*GRMUL)+(7*RDMUL),5+(5*GRMUL)+(5*RDMUL),3+(3*GRMUL)+(3*RDMUL),1+(1*GRMUL)+(1*RDMUL)
.END