wwf-wrestlemania/HSTD.ASM

4339 lines
85 KiB
NASM
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

***************************************************************
*
* Software: LARRY DeMAR, EUGENE JARVIS
* Modified: Shawn Liptak 8/6/91 - Multi color fonts
* Jason Skiles 12/14/93 - Use STRING.ASM calls
* Jason Skiles 1/17/94 - Hold most recent index in CMOS
*
* COPYRIGHT (C) 1991 WILLIAMS ELECTRONICS GAMES, INC.
*
*.Last mod - 1/17/94 11:59
****************************************************************
.file "hstd.asm"
.title "robo high-score-to-date management"
.width 132
.option b,d,l,t
.mnolist
.include "audit.equ"
.include "mproc.equ"
.include "display.equ"
.include "sys.equ"
.include "game.equ"
.include "link.equ"
.include "macros.h"
.include "plyr.equ"
.include "gsp.equ"
.include "crowdimg.glo"
.include "fontsimg.glo"
.include "bgndtbl.glo"
.include "miscimg.glo"
.include "ropeimg.glo"
.include "sound.h"
.TEXT
; - confine cursor to end and del once all inits are in
* IN THIS MODULE
.DEF GET_HSCR
.DEF RC_BYTEI
.DEF RC_BYTE
.DEF RC_WORD
.DEF RC_LONG
.DEF RC_LONGI
.DEF WC_BYTE
.DEF WC_BYTEI
.DEF WC_WORD
.DEF WC_WORDI
.DEF WC_LONG
.DEF WC_LONGI
.DEF PT_ENTRY
.DEF INIT_TB
.DEF INIT_TAB ;GEORGES POWER UP ENTRY
.DEF P_FORK
.DEF VAL_TAB
.DEF ROM_PTRS
.DEF BEATEN_TAB_ENTRIES
.DEF INTER_TAB_ENTRIES
.DEF TAG_TAB_ENTRIES
.DEF INTER_TAB
.DEF TAG_TAB
.DEF STREAK_TAB
.DEF BEATEN_TAB
.DEF DO_BEATEN_GAME
; .DEF ISHSTD,GETINIT,GETINIT1,GETINIT2,INITTIM
.DEF SET_PAGE
; .DEF A2_CHECK
.DEF DEC_HSR,INIT_HSR,GET_HSC
.def not_blank
******************************************************************************
* EXTERNAL REFERENCES
.ref ADD_VOICE,message_palette,get_but_val_down,dec_to_asc
.ref dec_to_asc_new_entry,MATCH_TIMERS,civanic,GET_ADJ
.ref which_player,mess_z,ANIM_CROWD,DEF_PAGE,print_message
.ref message_buffer,howard_wins,GET_AUD,RNDRNG0,mess_line_spacing
.ref pal_getf,AUD,BEGINOBJ_TBL,print_string_C2,SHADOW01
.ref SHADOW02,mess_space_width,SPEAR,mess_objid,print_string_R
.ref BINBCD,message_ascii,get_stick_val_cur,p1oldwinstreak
.ref mess_spacing,mess_cursx,print_string,mess_cursy
.ref print_string_with_z,setup_message,KILL_AUD,osgemd_ascii
.ref get_stick_val_down,setup_back_anim,font9_ascii,CYCLE_TABLE
.ref BCDBIN,copy_string,IGNORE_CHAR_WIDTH,message_buffer2
.ref triple_sound,change_image,digits_tbl,wsf14_ascii
.ref p2oldwinstreak,print_string2,current_round
.ref mess_cursx2,font9A_ascii
.ref font18_ascii
.ref print_string_C,belt_type
.if 0
.ref prog_specials,are_special_inits
.endif
******************************************************************************
.TEXT
;Sound headers
BEEPSND .WORD >F3FE,>10,>80A2,0 ;LOW BEEP
BSSX starting_num,16
BSSX entered_inits, (8*6)*2
; .bss entered_message, (16*4)*2
.bss last_hscore_ndx, 16
.bss last_streak_ndx, 16
.bss not_blank,16
BSSX auto_init,16
**************************************************************************
*
* HIGH SCORE TABLE DEFINITIONS
*
**************************************************************************
STREAK_TABLE_VISIBLE equ 18
PIN_SPEED_TAB_VISIBLE equ 9
BEATEN_TAB_VISIBLE equ 30
INTER_TAB_VISIBLE equ 30
TAG_TAB_VISIBLE EQU 18
STREAK_TAB
.LONG STREAK_TABLE_ORIGIN ;LOCATION OF TABLE
.WORD STREAK_TABLE_ENTRIES-1 ;NUMBER IN THE TABLE (DON'T COUNT ZERO FILLER)
.WORD STREAK_TABLE_VISIBLE ;unused?
.WORD STREAK_TABLE_SELECT ;BITS TO SELECT IT
.LONG STREAK_ROM_TABLE ;ROM IMAGE OF TABLE
.WORD STREAK_TABLE_ENTRIES/5 ;RESET TABLE IF 1/5 OR MORE BAD
SUBR PIN_SPEED_TAB
.LONG PIN_SPEED_TAB_ORIGIN ;LOCATION OF TABLE
.WORD PIN_SPEED_TAB_ENTRIES-1 ;NUMBER IN THE TABLE (DON'T COUNT ZERO FILLER)
.WORD PIN_SPEED_TAB_VISIBLE ;unused ?
.WORD PIN_SPEED_TAB_SELECT ;BITS TO SELECT IT
.LONG PIN_SPEED_TAB_ROM_TABLE ;ROM IMAGE OF TABLE
.WORD PIN_SPEED_TAB_ENTRIES/5 ;RESET TABLE IF 1/5 OR MORE BAD
BEATEN_TAB
.LONG BEATEN_TAB_ORIGIN ;LOCATION OF TABLE
.WORD BEATEN_TAB_ENTRIES-1 ;NUMBER IN THE TABLE (DON'T COUNT ZERO FILLER)
.WORD BEATEN_TAB_VISIBLE ;unused?
.WORD BEATEN_TAB_SELECT ;BITS TO SELECT IT
.LONG BEATEN_ROM_TABLE ;ROM IMAGE OF TABLE
.WORD BEATEN_TAB_ENTRIES/5 ;RESET TABLE IF 1/5 OR MORE BAD
INTER_TAB
.LONG INTER_TAB_ORIGIN ;LOCATION OF TABLE
.WORD INTER_TAB_ENTRIES-1 ;NUMBER IN THE TABLE (DON'T COUNT ZERO FILLER)
.WORD INTER_TAB_VISIBLE ;unused?
.WORD INTER_TAB_SELECT ;BITS TO SELECT IT
.LONG INTER_ROM_TABLE ;ROM IMAGE OF TABLE
.WORD INTER_TAB_ENTRIES/5 ;RESET TABLE IF 1/5 OR MORE BAD
TAG_TAB
.LONG TAG_TAB_ORIGIN ;LOCATION OF TABLE
.WORD TAG_TAB_ENTRIES-1 ;NUMBER IN THE TABLE (DON'T COUNT ZERO FILLER)
.WORD TAG_TAB_VISIBLE ;unused?
.WORD TAG_TAB_SELECT ;BITS TO SELECT IT
.LONG TAG_ROM_TABLE ;ROM IMAGE OF TABLE
.WORD TAG_TAB_ENTRIES/5 ;RESET TABLE IF 1/5 OR MORE BAD
P_FORK
MMTM SP,A1
MOVE *A13(PROCID),A1 ;PASS OUR ID TO FORKED PROCESS
CALLA GETPRC ;MAKE THE PROCESS
MMFM SP,A1
RETS
**************************************************************************
*
* 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
CALLR PUT_HSC ;PUT IT BACK JAK
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.
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!
CALLR PUT_HSC ;THIS MANY PLAYS TILL RESET!
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
MOVI ADJHSRES,A0
CALLA GET_ADJ ;GET THE ADJUSTED VALUE
CALLR PUT_HSC ;SET IT TO THIS VALUE
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.
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. Z set if 0
*
**************************************************************************
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
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
CALLR SET_PAGE
MMFM SP,A1
RETS
#*********************************************************************
* Check validity of high score and win streak tables.
*
SUBR table_cmos_check
movi PIN_SPEED_TAB,a8
callr VAL_TAB
movi STREAK_TAB,a8
callr VAL_TAB
movi BEATEN_TAB,a8
callr VAL_TAB
movi INTER_TAB,a8
callr VAL_TAB
movi TAG_TAB,a8
callr VAL_TAB
rets
#*********************************************************************
* Display high score table
*
SUBR print_inter
push a5
movi #hscore_mes2,a2
calla print_message
MOVI [10,0],A0
MOVI [21,0],A1
movi MVEBAR_R,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
MOVI [13,0],A0
MOVI [21+9,0],A1
movi SHADOW01,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
CREATE FLASH_PID,JUDDER_SHADOW
pull a9
move a9,@starting_num
movi HS_SIZE,a7
mpyu a7,a9
addi INTER_TAB_ORIGIN,a9
move a9,a8
movi 3,a7 ;draw 3
movi [51-9,8],a9
movi [58+5,10],a10
#loop
movi GOLD,a11
movi AUD_INTER,A0
calla GET_AUD
MOVE @starting_num,A5
cmp a1,a5
jrne #gold
movi BLUE,a11
#gold
PUSH a3,a7,a8,a9,a10,a11
movi INTER_TAB_SELECT,a1 ;set the read page
callr SET_PAGE
movi special_copy,a5
callr draw_beaten_table_entry
PULL a3,a7,a8,a9,a10,a11
move @starting_num,a5
inc a5
move a5,@starting_num
dec a7
jrz #done
addi HS_SIZE,a8
addi [46h,0],a9
addi [46h,0],a10
jruc #loop
#done
callr hscore_colcyc
callr hscore_colcyc2
RETP
#hscore_mes2
JAM_STR osgemd_ascii,10,0,200,10,BLUE,print_string_C2
.byte "INTERCONTINENTAL CHAMPS",0,0
.even
#**********************
SUBR print_beaten
push a5
movi #hscore_mes,a2
calla print_message
MOVI [10,0],A0
MOVI [21,0],A1
movi MVEBAR_R,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
MOVI [13,0],A0
MOVI [21+9,0],A1
movi SHADOW01,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
CREATE FLASH_PID,JUDDER_SHADOW
pull a9
move a9,@starting_num
movi HS_SIZE,a7
mpyu a7,a9
addi BEATEN_TAB_ORIGIN,a9
move a9,a8
movi 3,a7 ;draw 3
movi [51-9,8],a9
movi [58+5,10],a10
#loop
movi GOLD,a11
movi AUD_BEATEN,A0
calla GET_AUD
MOVE @starting_num,A5
cmp a1,a5
jrne #gold
movi BLUE,a11
#gold
PUSH a3,a7,a8,a9,a10,a11
movi BEATEN_TAB_SELECT,a1 ;set the read page
callr SET_PAGE
movi special_copy,a5
callr draw_beaten_table_entry
PULL a3,a7,a8,a9,a10,a11
move @starting_num,a5
inc a5
move a5,@starting_num
dec a7
jrz #done
addi HS_SIZE,a8
addi [46h,0],a9
addi [46h,0],a10
jruc #loop
#done
; callr hscore_colcyc
; callr hscore_colcyc2
RETP
SUBR JUDDER_SHADOW
MOVI SHADOW_ANIM,A1
calla setup_back_anim
JSRP ANIM_CROWD
DIE
CANI_GOTO equ 0 + 8000h
SHADOW_ANIM
WL 1,SHADOW02
WL 1,SHADOW01
WL CANI_GOTO,SHADOW_ANIM
#hscore_mes
JAM_STR osgemd_ascii,10,0,200,10,BLUE,print_string_C2
.byte "WORLD CHAMPIONS",0,0
.even
SUBR STOP_ALL_OBJS
MOVI OBJLST,A8
CLR A1
JRUC DO_EACH_OBJ_STOP
STOP_THIS_OBJ
MOVE A1,*A8(OYVEL),L
DO_EACH_OBJ_STOP
MOVE *A8,A8,L
JRNZ STOP_THIS_OBJ
RETS
SUBR MOVE_ALL_OBJS_UP
MOVI OBJLST,A8
MOVI RUBYPAL,A0
CALLA pal_getf
MOVI [-2,0],A1
JRUC DO_EACH_OBJ
MOVE_THIS_OBJ_UP
MOVE *A8(OPAL),A2
CMP A2,A0
JREQ DO_EACH_OBJ
MOVE *A8(OZPOS),A2
CMPI 1798H,A2
JRGT DO_EACH_OBJ
MOVE A1,*A8(OYVEL),L
DO_EACH_OBJ
MOVE *A8,A8,L
JRNZ MOVE_THIS_OBJ_UP
RETS
SUBR DELETE_ANY_OFF_TOP
MOVI OBJLST,A8
MOVI [-30,0],A3
JRUC DO_EACH_OBJ_NEXT
DELETE_OR_NOT
MOVE *A8(OYVAL),A2,L
CMP A3,A2
JRGT DO_EACH_OBJ_NEXT
MOVE *A8,A9,L
CALLA DELOBJA8
MOVE A9,A8
JRNZ DELETE_OR_NOT
RETS
DO_EACH_OBJ_NEXT
MOVE *A8,A8,L
JRNZ DELETE_OR_NOT
RETS
#*********************************************************************
* Display high score table
*
SUBR print_tag
movi tag_mes,a2
calla print_message
MOVI [10,0],A0
MOVI [21,0],A1
movi MVEBAR_R,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
MOVI [13,0],A0
MOVI [21+9,0],A1
movi SHADOW01,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
movi FLASH_PID,A0
CLR A1
NOT A1
CALLA KILALL
CREATE FLASH_PID,JUDDER_SHADOW
movi 9,a7 ;draw 9
movk 1,a3
movi TAG_TAB_ORIGIN+HS_SIZE,a8
movi [40,8],a9
movi [38,64+8],a10
#loop
movi GOLD,a11
movi AUD_TAG,A0
calla GET_AUD
addk 1,a1
srl 1,a1
CMP a1,A3
jrne #notblue
movi BLUE,a11
#notblue
PUSH A3,a7,a8,a9,a10,a11
movi TAG_TAB_SELECT,a1 ;set the read page
callr SET_PAGE
movi special_copy,a5
movi SEC,a2
MOVI [118H,0],a1
MOVI 0110H,A6
callr draw_tag_table_entry
PULL A3,a7,a8,a9,a10,a11
INC A3
dec a7
jrz #done
addi HS_SIZE*2,a8
addi [23,0],a9
addi [23,0],a10
jruc #loop
#done
RETP
tag_mes
JAM_STR osgemd_ascii,10,0,200,10,BLUE,print_string_C2
.byte "TAG TEAM CHAMPIONS",0,0
.even
#*********************************************************************
* Display high score table
*
SUBR print_hscores
movi #hscore_mes,a2
calla print_message
MOVI [10,0],A0
MOVI [21,0],A1
movi MVEBAR_R,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
MOVI [13,0],A0
MOVI [21+9,0],A1
movi SHADOW01,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
movi FLASH_PID,A0
CLR A1
NOT A1
CALLA KILALL
CREATE FLASH_PID,JUDDER_SHADOW
movi 9,a7 ;draw 9
movk 1,a3
movi PIN_SPEED_TAB_ORIGIN+HS_SIZE,a8
movi [40,8],a9
movi [38,64+8],a10
#loop
movi GOLD,a11
movi AUD_PINSPEED,A0
calla GET_AUD
CMP a1,A3
jrne #notblue
movi BLUE,a11
#notblue
PUSH A3,a7,a8,a9,a10,a11
movi PIN_SPEED_TAB_SELECT,a1 ;set the read page
callr SET_PAGE
movi special_copy,a5
movi SEC,a2
MOVI [82H,0],a1
MOVI 120,A6
callr draw_pinspeed_table_entry
PULL A3,a7,a8,a9,a10,a11
INC A3
dec a7
jrz #done
addi HS_SIZE,a8
addi [23,0],a9
addi [23,0],a10
jruc #loop
#done
RETP
#hscore_mes
JAM_STR osgemd_ascii,10,0,200,10,BLUE,print_string_C2
.byte "FASTEST PINDOWN TIMES",0,0
.even
#*********************************************************************
* Display win streaks table
*
SUBR print_winstreaks
movi #streak_mes,a2
calla print_message
MOVI [10,0],A0
MOVI [21,0],A1
movi MVEBAR_R,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
MOVI [13,0],A0
MOVI [21+9,0],A1
movi SHADOW01,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJ
movi FLASH_PID,A0
CLR A1
NOT A1
CALLA KILALL
CREATE FLASH_PID,JUDDER_SHADOW
movi 18,a7 ;draw 18
MOVK 1,A3
; clr a3
movi STREAK_TABLE_ORIGIN+HS_SIZE,a8
movi [40,8],a9
movi [38,44],a10
#loop
movi GOLD,a11
movi AUD_WINSTREAK,A0
calla GET_AUD
cmp a1,a3
jrne #gold
movi BLUE,a11
#gold
PUSH A3,a7,a8,a9,a10,a11
movi STREAK_TABLE_SELECT,a1
callr SET_PAGE
movi copy_string,a5
MOVI [6aH,0],a1
movi WINS,a2
MOVI 80,A6
callr draw_winstreak_table_entry
PULL A3,a7,a8,a9,a10,a11
INC A3
dec a7
jrz #done
cmpi 9,a7
jreq reset_position
addi HS_SIZE,a8
addi [23,0],a9
addi [23,0],a10
jruc #loop
reset_position
addi HS_SIZE,a8
movi [40,208+5],a9
movi [38,244+5],a10
jruc #loop
#done
RETP
#streak_mes
JAM_STR osgemd_ascii,10,0,200,10,BLUE,print_string_C2
.byte "LONGEST WINNING STREAKS",0,0
.even
special_copy
movi message_buffer,a2
movi message_buffer2,a3
move *a3+,*a2+
movi ".",a1
movb a1,*a2
addi 8,a2
movb *a3,*a2
addi 8,a2
addi 16,a3
clr a1
movb a1,*a2
MOVK 15,A0
move a0,@mess_spacing
MOVK 1,A0
MOVE A0,@IGNORE_CHAR_WIDTH
rets
.bss work_buffer,8*10
#*********************************************
*
SUBRP strip_white
PUSH a0,a1,a2
movi work_buffer,a0 ; Pointer to work buffer
subk 1,a3
sll 3,a3 ; Set pointer to end of buffer
move a3,a1
addi work_buffer,a1
#ff_loop
movb *a0,a2 ; Get char
cmpi 20h,a2 ; Is it a space ?
jrnz #first_found ; br = no
move a2,a2 ; Is it 0 ?
jrz #first_found ; br = yes
addk 8,a0 ; Increment front pointer
jruc #ff_loop ; Go check next char
#first_found
#fl_loop
movb *a1,a2 ; Get char
move a2,a2 ; Is it 0 ?
jrz #get_prev
cmpi 20h,a2 ; Is it a space ?
jrnz #last_found ; br = yes
#get_prev
cmpi work_buffer,a1 ; Are we at beginning ?
jrz #last_found ; br = yes
subk 8,a1 ; Decrement pointer
jruc #fl_loop ; Go check previous char
#last_found
addk 8,a1
movi message_buffer,a2 ; Where we are gonna put it
cmp a0,a1 ; back pointer > front pointer ?
jrgt #copy_loop ; br = yes
movi work_buffer,a0 ; reset front pointer
move a3,a1
addi work_buffer,a1
#copy_loop
movb *a0,a14 ; Get char
movb a14,*a2 ; Write to message buffer
addk 8,a0 ; Increment front pointer
cmp a0,a1 ; front = back ?
jrz #copy_done ; br = yes
addk 8,a2 ; Increment dest pointer
jruc #copy_loop ; Go do next char
#copy_done
addk 8,a2 ; Increment dest pointer
clr a1 ; NULL terminate the string
move a1,*a2
PULL a0,a1,a2
rets
#*******************************
* Display a table entry (initials and score)
* >a8=*entry, a9=[Y,Xleft] of initials, a10=[Y,Xright] of score, a11=pal
* >a0=draw high score message? (0|1)
SUBRP draw_tag_table_entry
PUSH A7
push a8
PUSH A5
PUSH A6
move a10,a0
sll 16,a0
ADD A1,A0
move a10,a1
srl 16,a1
sll 16,a1
addi [4,0],a1
movi 1000H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
PULL A6
PULL A5
pull a8
move a8,a7
callr RC_LONG ;read the score
calla BCDBIN
callr val_to_dec_tenths_asc
movk 2,a0
move a0,@mess_spacing
CLR A0
MOVE A0,@IGNORE_CHAR_WIDTH
movi font18_ascii,a0
move a0,@message_ascii,L
movi 10,a0
move a0,@mess_space_width
move a10,a0
sll 16,a0
srl 16,a0
add A6,a0
move a0,@mess_cursx
move a10,a0
srl 16,a0
move a0,@mess_cursy
movi WGSF_W_P1,a0
move a0,@message_palette,L
calla print_string_R
;initials
movi work_buffer,a1
move a8,a7
addi HS_INITS,a7
movi 5,a2
#initloop
callr RC_BYTEI
movb a0,*a1
addk 8,a1
dsj a2,#initloop
movk 5,a3
callr strip_white
clr a0 ;null-terminate it
movb a0,*a1
movi osgemd_ascii,a0
move a0,@message_ascii,L
movi 10,a0
move a0,@mess_space_width
clr a0
move a0,@mess_spacing
MOVE A0,@IGNORE_CHAR_WIDTH
move a10,a0
sll 16,a0
srl 16,a0
addk 30,a0
move a0,@mess_cursx
move a10,a0
srl 16,a0
move a0,@mess_cursy
move a11,@message_palette,L
calla print_string_C
push a8
move a10,a0
sll 16,a0
addi [52h,0],a0
move a10,a1
srl 16,a1
sll 16,a1
move a11,b0
movi OSGEMD_AND,a2
movi 1799H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
CLR A6
CLR A7
calla BEGINOBJP
pull a8
;initials second set
movi work_buffer,a1
move a8,a7
addi HS_INITS+HS_SIZE,a7
movi 5,a2
#initloop2
callr RC_BYTEI
movb a0,*a1
addk 8,a1
dsj a2,#initloop2
movk 5,a3
callr strip_white
clr a0 ;null-terminate it
movb a0,*a1
movi osgemd_ascii,a0
move a0,@message_ascii,L
movi 10,a0
move a0,@mess_space_width
clr a0
move a0,@mess_spacing
MOVE A0,@IGNORE_CHAR_WIDTH
move a10,a0
sll 16,a0
srl 16,a0
addi 155,a0
move a0,@mess_cursx
move a10,a0
srl 16,a0
move a0,@mess_cursy
move a11,@message_palette,L
calla print_string_C
move a9,a0
sll 16,a0
subi [8,0],a0
move a9,a1
srl 16,a1
sll 16,a1
addi [2,0],a1
movi SPEAR,a2
movi 1000H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
move a9,a0
sll 16,a0
addi [13,0],a0
move a9,a1
srl 16,a1
sll 16,a1
addi [2,0],a1
movi SPEAR,a2
movi 1001H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
PULL A7
movi "#",a0
movb a0,@message_buffer
addk 8,a1
MOVK 10,A0
SUB A7,A0
calla BINBCD ;dec number in A0
move a0,a1
movi message_buffer+8,a2
calla dec_to_asc_new_entry
clr a0
move a0,*a2+
movi wsf14_ascii,a0
move a0,@message_ascii,L
movi 7,a0
move a0,@mess_space_width
clr a0
move a0,@mess_spacing
MOVE A0,@IGNORE_CHAR_WIDTH
move a9,a0
sll 16,a0
srl 16,a0
move a0,@mess_cursx
move a9,a0
srl 16,a0
move a0,@mess_cursy
movi WSF_W_P,a0
move a0,@message_palette,L
movi 1003h,a0
move a0,@mess_z,L
calla print_string_with_z
rets
dot
.string ".",0
.even
zero
.string "0",0
.even
; A0 = binary value
.ref concat_string
.ref concat_rom_string
SUBRP val_to_dec_tenths_asc
PUSH a1,a2,a3,a4,a5,a6
movi 10,a3
move a0,a1
divu a3,a1
move a1,a0
movi 10,a3
move a0,a1
divu a3,a1
movi 10,a2
move a0,a3
modu a2,a3
PUSH a3
move a1,a0
movi 1000,a1
calla dec_to_asc
calla copy_string
movi dot,a4
calla concat_rom_string
PULL a3
move a3,a0
jrz #is_zero
movi 10,a1
calla dec_to_asc
calla concat_string
jruc #conv_done
#is_zero
movi zero,a4
calla concat_rom_string
#conv_done
PULL a1,a2,a3,a4,a5,a6
rets
#*******************************
* Display a table entry (initials and score)
* >a8=*entry, a9=[Y,Xleft] of initials, a10=[Y,Xright] of score, a11=pal
* >a0=draw high score message? (0|1)
SUBRP draw_pinspeed_table_entry
PUSH A7
push a8
PUSH A5
PUSH A6
move a10,a0
sll 16,a0
ADD A1,A0
move a10,a1
srl 16,a1
sll 16,a1
addi [4,0],a1
movi 1000H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
PULL A6
PULL A5
pull a8
move a8,a7
callr RC_LONG ;read the score
calla BCDBIN
callr val_to_dec_tenths_asc
movk 2,a0
move a0,@mess_spacing
CLR A0
MOVE A0,@IGNORE_CHAR_WIDTH
movi font18_ascii,a0
move a0,@message_ascii,L
movi 10,a0
move a0,@mess_space_width
move a10,a0
sll 16,a0
srl 16,a0
add A6,a0
move a0,@mess_cursx
move a10,a0
srl 16,a0
move a0,@mess_cursy
movi WGSF_W_P1,a0
move a0,@message_palette,L
calla print_string_R
;initials
movi message_buffer,a1
move a8,a7
addi HS_INITS,a7
movi 3,a2
#initloop
callr RC_BYTEI
movb a0,*a1
addk 8,a1
dsj a2,#initloop
callr RC_BYTEI
push a0
clr a0 ;null-terminate it
movb a0,*a1
movi osgemd_ascii,a0
move a0,@message_ascii,L
movi 10,a0
move a0,@mess_space_width
clr a0
move a0,@mess_spacing
MOVE A0,@IGNORE_CHAR_WIDTH
move a10,a0
sll 16,a0
srl 16,a0
addi 17h,a0
move a0,@mess_cursx
move a10,a0
srl 16,a0
move a0,@mess_cursy
move a11,@message_palette,L
calla print_string_C
move a9,a0
sll 16,a0
subi [8,0],a0
move a9,a1
srl 16,a1
sll 16,a1
addi [2,0],a1
movi SPEAR,a2
movi 1000H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
move a9,a0
sll 16,a0
addi [13,0],a0
move a9,a1
srl 16,a1
sll 16,a1
addi [2,0],a1
movi SPEAR,a2
movi 1001H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
pull a0
SUBI "A",a0
sll 5,a0
addi WHICH_NAMES,A0
MOVE *A0,A2,L
move a9,a0
sll 16,a0
addi [302,0],a0
move a9,a1
srl 16,a1
sll 16,a1
addi [7,0],a1
movi 1001H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
PULL A7
movi "#",a0
movb a0,@message_buffer
addk 8,a1
MOVK 10,A0
SUB A7,A0
calla BINBCD ;dec number in A0
move a0,a1
movi message_buffer+8,a2
calla dec_to_asc_new_entry
clr a0
move a0,*a2+
movi wsf14_ascii,a0
move a0,@message_ascii,L
movi 7,a0
move a0,@mess_space_width
clr a0
move a0,@mess_spacing
MOVE A0,@IGNORE_CHAR_WIDTH
move a9,a0
sll 16,a0
srl 16,a0
move a0,@mess_cursx
move a9,a0
srl 16,a0
move a0,@mess_cursy
movi WSF_W_P,a0
move a0,@message_palette,L
movi 1003h,a0
move a0,@mess_z,L
calla print_string_with_z
rets
#*******************************
SUBRP draw_winstreak_table_entry
PUSH A7
push a8
PUSH A5
PUSH A6
move a10,a0
sll 16,a0
ADD A1,A0
move a10,a1
srl 16,a1
sll 16,a1
addi [4,0],a1
movi 1000H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
PULL A6
PULL A5
pull a8
move a8,a7
callr RC_LONG ;read the score
calla BCDBIN
movi 9999999,a1
calla dec_to_asc ;convert to ASCII
CLR A0
move a0,@mess_spacing
call a5
clr a0
MOVE A0,@IGNORE_CHAR_WIDTH
movi font18_ascii,a0
move a0,@message_ascii,L
movi 10,a0
move a0,@mess_space_width
move a10,a0
sll 16,a0
srl 16,a0
add A6,a0
move a0,@mess_cursx
move a10,a0
srl 16,a0
move a0,@mess_cursy
movi WGSF_W_P1,a0
move a0,@message_palette,L
calla print_string_C
;initials
; movi message_buffer,a1
movi work_buffer,a1
move a8,a7
addi HS_INITS,a7
movi 3,a2
#initloop
callr RC_BYTEI
movb a0,*a1
addk 8,a1
dsj a2,#initloop
movk 3,a3
callr strip_white
clr a0 ;null-terminate it
movb a0,*a1
movi osgemd_ascii,a0
move a0,@message_ascii,L
movi 10,a0
move a0,@mess_space_width
clr a0
move a0,@mess_spacing
MOVE A0,@IGNORE_CHAR_WIDTH
move a10,a0
sll 16,a0
srl 16,a0
addi 17h,a0
move a0,@mess_cursx
move a10,a0
srl 16,a0
move a0,@mess_cursy
move a11,@message_palette,L
calla print_string_C
move a9,a0
sll 16,a0
subi [8,0],a0
move a9,a1
srl 16,a1
sll 16,a1
addi [2,0],a1
movi SPEAR,a2
movi 1000H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
move a9,a0
sll 16,a0
SUBi [10,0],a0
move a9,a1
srl 16,a1
sll 16,a1
addi [2,0],a1
movi BARBUTT,a2
movi 1001H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
MOVI DPLT_R_P,B0
calla BEGINOBJWP
PULL A7
; movi "#",a0
; movb a0,@message_buffer
; addk 8,a1
MOVK 19,A0
SUB A7,A0
calla BINBCD ;dec number in A0
move a0,a1
; movi message_buffer+8,a2
movi message_buffer,a2
calla dec_to_asc_new_entry
clr a0
move a0,*a2+
movi wsf14_ascii,a0
move a0,@message_ascii,L
movi 7,a0
move a0,@mess_space_width
clr a0
move a0,@mess_spacing
MOVE A0,@IGNORE_CHAR_WIDTH
move a9,a0
sll 16,a0
srl 16,a0
subi 4,a0
move a0,@mess_cursx
move a9,a0
srl 16,a0
move a0,@mess_cursy
movi WSF_W_P,a0
move a0,@message_palette,L
movi 1003h,a0
move a0,@mess_z,L
calla print_string_with_z
rets
WHICH_NAMES
.LONG HART
.LONG RAZOR
.LONG UNDER
.LONG YOKO
.LONG SHAWN
.LONG BAMBAM
.LONG DOINK
.LONG 0
.LONG LEX
which_crouton
.long CRUT_BH
.long CRUT_RR
.long CRUT_UN
.long CRUT_YK
.long CRUT_SM
.long CRUT_BM
.long CRUT_DK
.long CRUT_LX
SUBR draw_each_inter_table_entry
movi HS_SIZE,a7
mpyu a7,a9
addi INTER_TAB_ORIGIN,a9
move a9,a8
movi [126H,8],a9
movi [13BH,10],a10
movi GOLD,a11
movi AUD_INTER,A0
calla GET_AUD
MOVE @starting_num,A5
cmp a1,a5
jrne #gold2
movi BLUE,a11
#gold2
movi INTER_TAB_SELECT,a1 ;set the read page
callr SET_PAGE
movi special_copy,a5
JRUC draw_beaten_table_entry
SUBR draw_each_beaten_table_entry
movi HS_SIZE,a7
mpyu a7,a9
addi BEATEN_TAB_ORIGIN,a9
move a9,a8
movi [126H,8],a9
movi [13BH,10],a10
movi GOLD,a11
movi AUD_BEATEN,A0
calla GET_AUD
MOVE @starting_num,A5
cmp a1,a5
jrne #gold
movi BLUE,a11
#gold
movi BEATEN_TAB_SELECT,a1 ;set the read page
callr SET_PAGE
movi special_copy,a5
#*******************************
* Display a table entry (initials and score)
* >a8=*entry, a9=[Y,Xleft] of initials, a10=[Y,Xright] of score, a11=pal
* >a0=draw high score message? (0|1)
SUBR draw_beaten_table_entry
push a7
push a9,a10
move a8,a7
callr RC_LONG ;read the score
move a0,a9
jrnz no_reset_blank
movk 1,a0
move a0,@not_blank
no_reset_blank
movk 8,a10
clr a3
pull a1
push a1
move a1,a0
sll 16,a0
clr b4
addi [2,0],a1
next_icon
srl 1,a9
jrnc no_icon
mmtm sp,a0,a1,a3,a8,a11
move a3,a4
sll 5,a4
addi which_crouton,a4
move *a4,a2,L
movi 1000H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
movi 01000100h,a3
move a3,*a8(OSCALE),L
mmfm sp,a0,a1,a3,a8,a11
addi [30h,0],a0
inc b4
no_icon
srl 3,a9
inc a3
dec a10
jrnz next_icon
mmtm sp,a0,a1,a3,a8,a11
movi 8,b5
sub b4,b5
;loop will attempt to create 2^32 number of dots!!!!!
;Soooooo - don't do it!!!!
jrz #no_dots
move b5,a10
addi [10,0],a0
next_dot
; movi CRUTPLT_G,a2
movi OSGEMD_DOT,a2
movi 1000H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
push a0,a1
calla BEGINOBJW
pull a0,a1
addi [30h,0],a0
dec a10
jrnz next_dot
#no_dots
mmfm sp,a0,a1,a3,a8,a11
pull a9,a10
;initials
do_just_init
movi message_buffer,a1
move a8,a7
addi HS_INITS,a7
movi 5,a2
#initloop
callr RC_BYTEI
movb a0,*a1
addk 8,a1
dsj a2,#initloop
clr a0 ;null-terminate it
movb a0,*a1
movi osgemd_ascii,a0
move a0,@message_ascii,L
movi 10,a0
move a0,@mess_space_width
clr a0
move a0,@mess_spacing
MOVE A0,@IGNORE_CHAR_WIDTH
move a9,a0
sll 16,a0
srl 16,a0
addi 50,a0
move a0,@mess_cursx
move a9,a0
srl 16,a0
move a0,@mess_cursy
move a11,@message_palette,L
movi 1003h,a0
move a0,@mess_z,L
calla print_string_with_z
push a1
move a9,a0
sll 16,a0
subi [8,0],a0
move a9,a1
srl 16,a1
sll 16,a1
addi [2,0],a1
movi SPEAR,a2
movi 1000H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
move a9,a0
sll 16,a0
addi [13,0],a0
move a9,a1
srl 16,a1
sll 16,a1
addi [2,0],a1
movi SPEAR,a2
movi 1001H,a3
movi DMAWNZ,a4
movi CLSNEUT,a5
clr a6
clr a7
calla BEGINOBJW
pull a1
pull a7
movi "#",a0
movb a0,@message_buffer
addk 8,a1
move @starting_num,a0
calla BINBCD ;dec number in A0
move a0,a1
movi message_buffer+8,a2
calla dec_to_asc_new_entry
clr a0
move a0,*a2+
movi wsf14_ascii,a0
move a0,@message_ascii,L
movi 7,a0
move a0,@mess_space_width
clr a0
move a0,@mess_spacing
MOVE A0,@IGNORE_CHAR_WIDTH
move a9,a0
sll 16,a0
srl 16,a0
move a0,@mess_cursx
move a9,a0
srl 16,a0
move a0,@mess_cursy
movi WSF_W_P,a0
move a0,@message_palette,L
movi 1003h,a0
move a0,@mess_z,L
calla print_string_with_z
rets
#*******************************
* high score page color cyclers
*
SUBR hscore_colcyc
movi [10,7],a8 ;START AT COLOR 10, CYCLE 7 COLORS
movi BLUE,a9 ;PAL NAME
movi COLTAB2,a10 ;TABLE TO CYCLE WITH
movk 3,a11 ;RATE OF CYCLE IN TICKS
CREATE CYCPID,CYCLE_TABLE ;START PROCESS TO DO CYCLE
rets
COLTAB2
.word 0033eh,0135fh,02b7fh,03f9fh,053bfh,06bdfh,07fffh
.word 06bdfh,053bfh,03f9fh,0277fh,0135fh,00f3fh,00b1fh,002ffh
.word 002dfh,002ffh,002ffh,0031fh,0031fh,0033fh,002fdh,002dch
.word 0029ah,00259h,00237h,00258h,00259h,0027ah,0029bh,002bch
.word 0025ah,001f7h,001b5h,00172h,00194h,001d6h,00218h,0065ah
.word 0069ch,00ebch,01addh,022fdh,02f1eh,0375eh,0437fh,04f9fh
.word 03b7fh,0275fh,0133fh,0033fh,002feh,002ddh,002bch,0029bh
.word 0025ah,00239h,00218h,00259h,0027bh,002bch,002feh,0033fh
.word 0033eh,0135fh,02b7fh,03f9fh,053bfh,06bdfh,07fffh
.word 06bdfh,053bfh,03f9fh,0277fh,0135fh,00f3fh,00b1fh,002ffh
SUBR hscore_colcyc2
movi [10,7],a8 ;START AT COLOR 10, CYCLE 7 COLORS
movi RUBYPAL,a9 ;PAL NAME
movi COLTAB3,a10 ;TABLE TO CYCLE WITH
movk 3,a11 ;RATE OF CYCLE IN TICKS
CREATE CYCPID,CYCLE_TABLE ;START PROCESS TO DO CYCLE
rets
COLTAB3
.word 07c01h,07c63h,07d08h,07d8ch,07e10h,07eb5h,07f39h
.word 07e94h,07e10h,07d6bh,07ce7h,07c42h,07421h,06c00h,06400h
.word 05c00h,06400h,06800h,07000h,07400h,07c00h,07400h,06c00h
.word 06000h,05800h,05c00h,06000h,06400h,06800h,06c00h,07000h
.word 06400h,05c00h,05000h,04800h,05000h,05800h,06000h,06c00h
.word 06c21h,07063h,070c6h,07508h,0754ah,079adh,079efh,07e52h
.word 07defh,07dadh,0794ah,078e7h,07884h,07842h,07800h,07000h
.word 06c00h,06400h,06000h,06400h,06c00h,07000h,07800h,07c00h
.word 07c01h,07c63h,07d08h,07d8ch,07e10h,07eb5h,07f39h
.word 07e94h,07e10h,07d6bh,07ce7h,07c42h,07421h,06c00h,06400h
#*****************************************************************************
* Checks to see if the expired player made the table, and takes care of all
* the details if he did.
*
STRUCTPD
LONG #cursorimg ;UHL cursor *img
LONG #hiliteimg ;UHL hilite letter *img
WORD #stick ;UHW stick to read
LONG #which_tab
LONG #which_entry
LONG #which_level
WORD #which_aud
WHICH_TO_OR
.LONG 1H
.LONG 10H
.LONG 100H
.LONG 1000H
.LONG 10000H
.LONG 100000H
.LONG 1000000H
.LONG 10000000H
DO_BEATEN_GAME
move a10,a1
sll 4,a1
addi which_player,a1
move *a1,a9
CMPI 8,A9
JRNE AVOID_NUMBER_8
DEC A9
AVOID_NUMBER_8
SLL 5,A9
ADDI WHICH_TO_OR,A9
MOVE *A9,A9,L
move a10,a1 ;clear out intials for end game table
MOVE a1,a2
sll 5,a1
sll 4,a2
add a2,a1
addi entered_inits,a1
clr a11
move a11,*a1+,L
movb a11,*a1
movi FIND_LOW_TABLE_LEVEL,a11
movi BEATEN_TAB,a5
movi AUD_BEATEN,A3
MOVE @belt_type,a1
jrnz found_right_table
movi INTER_TAB,A5
movi AUD_INTER,A3
found_right_table
movi enter_initials_beaten,a10
movi SPECIAL_ENTRY,a7
jruc create_initial_input
SUBR DO_TAG_GAME
move a10,a1 ;clear out intials for end game table
MOVE a1,a2
sll 5,a1
sll 4,a2
add a2,a1
addi entered_inits,a1
clr a11
move a11,*a1+,L
movb a11,*a1
movi FIND_LOW_TABLE_LEVEL,a11
movi TAG_TAB,a5
movi AUD_TAG,A3
movi enter_initials_beaten,a10
movi do_entry_time,a7
jruc create_initial_input
SUBR pin_speed_check
;skip this check if I'm a drone.
move a8,A0
CMPI 2,A0
JRGE #retp
;skip this check if the match took three rounds
move @current_round,a14
cmpi 3,a14
jreq #retp
SLL 5,A0
ADDI MATCH_TIMERS,A0
MOVE *A0,A9,L
jrle #retp
movi FIND_LOW_TABLE_LEVEL,a11
movi PIN_SPEED_TAB,a5
movi enter_initials_top_20,a10
movi do_entry_time,a7
movi AUD_PINSPEED,a3
jruc create_initial_input
SUBR winstreak_check
move a8,a9
sll 4,a9
addi p1oldwinstreak,a9
move *a9,a9
movi FIND_HIGH_TABLE_LEVEL,a11
movi STREAK_TAB,a5
movi enter_initials_streak,a10
movi do_entry,a7
movi AUD_WINSTREAK,a3
create_initial_input
move a8,a1
addi HI_INPUT_PID,a1
calla GETPRC
move a5,*a0(#which_tab),L
move a8,*a0(#stick)
move a10,*a0(#which_entry),L
move a11,*a0(#which_level),L
move a3,*a0(#which_aud)
#retp RETP
SUBR do_that_cycle
movi [02h,1],a8 ;cycle color A
movi FNT9RED_P,a9 ;pal name
movi fnt9_red_white,a10 ;use the LFLASH table
movk 6,a11 ;cycle speed
CREATE CYCPID,CYCLE_TABLE
movi [02h,1],a8 ;cycle color A
movi FNT9WHT2P,a9 ;pal name
movi fnt9_blue_white,a10 ;use the LFLASH table
movk 6,a11 ;cycle speed
CREATE CYCPID,CYCLE_TABLE
callr hscore_colcyc
callr hscore_colcyc2
rets
do_entry
;convert score and wins to BCD
move a9,a0
calla BINBCD
move a0,a9
do_entry_time
move a9,a0
clr a3
move *a13(#which_tab),a8,L
callr CHECK_SCORE
jrz #done_jake_hack
no_we_can_come_back
;they made one of the tables. first update AUD_LSCORE
move a0,a1
move *a13(#which_aud),a0
calla KILL_AUD
calla AUD
SPECIAL_ENTRY
movk 1,a14
move a14,@auto_init
MOVE *A13(#stick),a1
MOVE a1,a2
sll 5,a1
sll 4,a2
add a2,a1
addi entered_inits,a1
move *a1,a0,L
JRNZ NO_NEED_TO_ENTER
clr a14
move a14,@auto_init
CREATE0 howard_wins
PUSHP a9
MOVE *A13(#which_entry),A1,L
GETPC A7
ADDI 040h,A7
MOVE A7,-*A12,L ;PUSH RET ADDR
JUMP A1
PULLP a9
MOVI 0B8H,A0
CALLA triple_sound
MOVE *A13(#stick),a1
MOVE a1,a2
sll 5,a1
sll 4,a2
add a2,a1
addi entered_inits,a1
NO_NEED_TO_ENTER
move a9,a0
move *a13(#which_tab),a8,L
cmpi BEATEN_TAB,a8
JREQ SPECIAL_ADDITION
CMPI INTER_TAB,A8
JREQ SPECIAL_ADDITION
CMPI TAG_TAB,A8
JRNE normal_addition
CALLR TAG_ENTRY
jruc #done
SPECIAL_ADDITION
callr SPECIAL_ADD_ENTRY
CALLR SORT_BEATEN_TABLE
jruc #done
normal_addition
callr ADD_ENTRY
#done
movi CYCPID,a0
movi -1,a1
calla KILALL
DIE
#done_jake_hack
movi 17,a0
move *a13(#which_tab),a8,L
cmpi TAG_TAB,a8
jreq no_we_can_come_back
movi CYCPID,a0
movi -1,a1
calla KILALL
DIE
fnt9_blue_white
.word 0001fH,07FFFH
.word -1
fnt9_red_white
.word 07C00H,07FFFH
.word -1
*****************************************************************************
* proc pointer + #stick = stick (0:1)
; SUBR enter_message
; clr a0
; movb a0,@entered_message
; movb a0,@entered_message+40h
; movi entered_message,a4
; move a4,a5
; movi entered_message+(15*8),a6
; PUSHP a4,a5,a6
;
; movi #entermess_mes,a2
; PUSHP a2
; jruc #go
SUBR enter_initials_beaten
movi entered_inits,a4
move a4,a5
movi entered_inits+(5*8),a6
movi #enterinita_mess,a3
movi #enterinit5_mes,a2
move *a13(#stick),a0
move a0,a0
jrz #enter_mess_set_3
movi entered_inits+030h,a4
move a4,a5
movi entered_inits+(5*8)+030h,a6
movi #enterinitb_mess,a3
movi #enterinit6_mes,a2
#enter_mess_set_3
clr a14
move a14,*a4,L ;clear out initials
move a14,*a4(018h) ;clear out initials
PUSHP a4,a5,a6
PUSHP a2
move a3,a2
calla setup_message
move *a13(#stick),a0
addi CLSNEUT|TYPTEXT|00A3h,a0
move a0,@mess_objid
move *a2+,a0,L ;print method
move a2,a4 ;* text string
call a0
jruc #go
SUBR enter_initials_streak
CLR A2
MOVE A2,@IGNORE_CHAR_WIDTH
movi #enterinit7_mes,a2
move *a13(#stick),a0
jrz just_add_to_id
movi #enterinit8_mes,a2
just_add_to_id
PUSH A0
calla setup_message
PULL A0
addi CLSNEUT|TYPTEXT|00A3h,a0
move a0,@mess_objid
move *a2+,a0,L ;print method
move a2,a4 ;* text string
call a0
move @mess_cursx2,a0
addi 8,a0
move a0,@mess_cursx
movk 2,a0
move a0,@mess_spacing
move @p1oldwinstreak,a0
move *a13(#stick),a2
jrz got_right_streak
move @p2oldwinstreak,a0
got_right_streak
movi 9999999,a1
calla dec_to_asc ;convert to ASCII
CALLA copy_string
calla print_string
movi entered_inits,a4
move a4,a5
movi entered_inits+(3*8),a6
movi #enterinita_mess,a3
movi #enterinit1_mes,a2
move *a13(#stick),a0
move a0,a0
jrz #enter_mess_set_1
movi entered_inits+030h,a4
move a4,a5
movi entered_inits+(3*8)+030h,a6
movi #enterinitb_mess,a3
movi #enterinit2_mes,a2
#enter_mess_set_1
clr a14
move a14,*a4,L ;clear out initials
move a14,*a4(018h) ;clear out initials
PUSHP a4,a5,a6
PUSHP a2
move a3,a2
calla setup_message
move *a13(#stick),a0
addi CLSNEUT|TYPTEXT|00A3h,a0
move a0,@mess_objid
move *a2+,a0,L ;print method
move a2,a4 ;* text string
call a0
jruc #go
*********************************
SUBR enter_initials_top_20
movi font9A_ascii,a0
move a0,@message_ascii,L
move @MATCH_TIMERS,a0,L
movi 35,a3
movi FNT9WHT2P,a11
move *a13(#stick),a2
jrz got_right_time
move @MATCH_TIMERS+32,a0,L
movi FNT9RED_P,a11
movi 270,a3
got_right_time
addi CLSNEUT|TYPTEXT|00A3h,a2
move a2,@mess_objid
move a11,@message_palette,L
movi 16,a2
move a2,@mess_cursy
move a3,@mess_cursx
calla BCDBIN
callr val_to_dec_tenths_asc
clr a0
move A0,@IGNORE_CHAR_WIDTH
move a0,@mess_spacing
calla print_string
move @mess_cursx2,a0
addi 6,a0
move a0,@mess_cursx
movi #enterinit9_mes,a4
calla print_string2
movi entered_inits,a4
move a4,a5
movi entered_inits+(3*8),a6
movi #enterinita_mess,a3
movi #enterinit3_mes,a2
move *a13(#stick),a0
move a0,a0
jrz #enter_mess_set
movi entered_inits+030h,a4
move a4,a5
movi entered_inits+(3*8)+030h,a6
movi #enterinitb_mess,a3
movi #enterinit4_mes,a2
#enter_mess_set
clr a14
move a14,*a4,L ;clear out initials
move a14,*a4(018h) ;clear out initials
PUSHP a4,a5,a6
PUSHP a2
move a3,a2
calla setup_message
move *a13(#stick),a0
addi CLSNEUT|TYPTEXT|00A3h,a0
move a0,@mess_objid
move *a2+,a0,L ;print method
move a2,a4 ;* text string
call a0
#go
PULLP a2
movk 13,a0
move a0,@mess_line_spacing
calla setup_message
move *a13(#stick),a0
addi CLSNEUT|TYPTEXT|00A3h,a0
move a0,@mess_objid
move *a2+,a0,L ;print method
move a2,a4 ;* text string
call a0
callr draw_letter_grid ;draw the letter grid
move *a13(#stick),a1
jrnz #right_type
TBL_OBJ #cursor ;create cursor
jruc #cursor_type_set
#right_type
TBL_OBJ #cursor2 ;create cursor
#cursor_type_set
clr a0
move a0,*a8(ODOFF),L
movi 0101h,a0
move a0,*a8(OCONST)
movi #block_size,a0
move a0,*a8(OSIZEX)
move a0,*a8(OSIZEY)
move a8,*a13(#cursorimg),L
move *a13(#stick),a1
jrnz #right_hilite
TBL_OBJ #hilite1 ;create hilite letter
jruc #hilite_set
#right_hilite
TBL_OBJ #hilite2 ;create hilite letter
#hilite_set
move a8,*a13(#hiliteimg),L
clr a9
callr new_cursor_pos ;place them & set char img/pal
;reg use (loop)
; a4 *first initial ram
; a5 *next initial ram
; a6 *last initial ram
; a8 scratch
; a9 cursor position (0-29)
;a10 hold count for repeat motion
;a11 debounce timer
PULLP a4,a5,a6
movi 65,a11
move a11,*a4
callr print_init_string
clr a11
MOVI 700H,B5
clr b3
#loop
;this timer is done the hard way cos its 1:30 in the morning and I dont
;have the energy to be clever
movk 1,b1
cmpi 150*5,b5
jrgt no_need_for_timer
mmtm sp,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10
move b5,b7
movi 150,b1
divs b1,b7
move b3,b3
jrnz we_already_have_it
movi [83+40,0],a0
move *a13(#stick),a1
jrz which_edge_set
movi [322+40,0],a0
which_edge_set
movi [16,0],a1 ;y pos
movi FNT9_5,a2
movi 104+200,a3 ;z pos
movi DMAWNZ|M_SCRNREL,a4 ;DMA flags
move *a13(#stick),a5
addi CLSNEUT|TYPTEXT|00A3h,a5 ;object ID
clr a6 ;x vel
clr a7 ;y vel
movi FNT9WHT_P,b0
calla BEGINOBJWP
move a8,b3
push b3,b5
; CREATE0 do_next_tick
; movi 0B7H,a0
MOVI 0AH,A0
calla triple_sound
pull b3,b5
we_already_have_it
move b3,a8
move b7,a0
sll 5,a0
addi digits_tbl,a0
move *a0,a0,L ;* image
move *a8(OIMG),a1,L
cmp a0,a1
jreq no_change
move *a8(OCTRL),a1
calla change_image
push b3,b5
; create0 do_next_tick
; movi 0B7H,a0
MOVI 0AH,A0
calla triple_sound
pull b3,b5
no_change
mmfm sp,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10
no_need_for_timer
DEC B5 ;have a limit we'll wait
JRZ #done2
move b3,a2
MOVE B5,A0
PUSHP A0,a2,a4,a5,a6
SLEEPK 1
PULLP A0,a2,a4,a5,a6
MOVE A0,B5
move a2,b3
;button check
move *a13(#stick),a0
calla get_but_val_down
move a0,a0
jrz #stick_check
;new press. add a letter.
move a9,a0
cmpi 28,a0
jreq #deletechar ;backspace?
cmpi 29,a0
jreq #done2 ;EOL?
cmp a5,a6
jreq #stick_check ;room for another char?
sla 3,a0 ;x8
addi #init_table2,a0
movb *a0,*a5
addk 8,a5
clr a0
movb a0,*a5 ;always keep a terminator in there.
jruc #added
#deletechar
cmp a4,a5
jreq #stick_check ;no chars to delete!
subk 8,a5
clr a0
movb a0,*a5
callr print_init_string
jruc #stick_check
#added
movi 0b1h,a0
push b3,b5
calla triple_sound
pull b3,b5
;character added.
callr print_init_string
;if that was the last character, move the cursor to the END char.
cmp a5,a6
jrne #stick_check
movi 29,a9
callr new_cursor_pos
#stick_check
dec a11 ;debounce check
jrp #loop ;too soon?
move *a13(#stick),a0
calla get_stick_val_down
move a0,a0
jrz #no_new_stick
movi #tstatic-#debounce_time,a10
movi #debounce_time,a11
jruc #adjust
#no_new_stick
dec a10
jrnz #loop ;holding and waiting
;whee! time to repeat-move
move *a13(#stick),a0
calla get_stick_val_cur
movi #tmoving,a10
#adjust
X16 a0
addi #joytab,a0
move *a0,a0
add a0,a9
jrn #too_low
cmpi 30,a9
jrge #too_high
jruc #just_right
#too_low
addi 30,a9
jruc #just_right
#too_high
subi 30,a9
jruc #just_right
#just_right
;adjust cursor and character position
move a0,a0
jrz no_motion_sound
movi 0c7h,a0
move *a13(#stick),a1
jrz motion_sound_set
inc a0
motion_sound_set
push b3,b5
calla triple_sound
pull b3,b5
no_motion_sound
callr new_cursor_pos
move a9,a0
cmpi 28,a0
jreq #space_it
cmpi 29,a0
jreq #space_it
cmp a6,a5
jreq #loop
sla 3,a0
addi #init_table2,a0
movb *a0,*a5
clr a0
movb a0,*a5(8) ;always keep a terminator in there.
callr print_init_string
jruc #loop
#backspace_it
sla 3,a0
addi #init_table2,a0
subk 8,a5
movb *a0,*a5
addk 8,a5
clr a0
movb a0,*a5 ;always keep a terminator in there.
callr print_init_string
jruc #loop
#space_it
clr a0
movb a0,*a5 ;always keep a terminator in there.
callr print_init_string
jruc #loop
#done2
callr are_inits_dirty
jrnz replace_dirty_inits
; jrz #not_dirty
; move a4,a5
; clr a0
; movb a0,*a5
; callr print_init_string
; movi 28,a9
; callr new_cursor_pos
; jruc #stick_check
;#not_dirty
.if 0
calla are_special_inits
jrnz #not_special_inits
JSRP prog_specials
#not_special_inits
.endif
MOVI 0cbh,A0
MOVE *A13(#stick),a1
jrz select_set
inc a0
select_set
push b3,b5
CALLA triple_sound
pull b3,b5
pushp a4
PUSHP A6
sleep 30
PULLP A6
pullp a4
;; move *a13(#stick),a0
; addi CLSNEUT|TYPTEXT|00A5h,a0
; calla obj_del1c
;
; move *a13(#stick),a0
; addi CLSNEUT|TYPTEXT|00A3h,a0
; calla obj_del1c
move *a4,a0,L
jrnz #initials_have_content
replace_dirty_inits
movk 6,a0
calla RNDRNG0
sll 5,a0
addi #random_initials,a0
move *a0,A0,L
move a0,*a4,L
CLR A1
MOVB A1,*A4(020H)
#initials_have_content
PUSH a0
move *a13(#stick),a0
addi CLSNEUT|TYPTEXT|00A5h,a0
calla obj_del1c
move *a13(#stick),a0
addi CLSNEUT|TYPTEXT|00A3h,a0
calla obj_del1c
PULL a0
CMPI "TJM",a0
jrne no_worry_about_disaster
push a0
movi 129h,a0
move @HCOUNT,a1
srl 1,a1
jrnc we_now_which
inc a0
we_now_which
CALLA ADD_VOICE
pull a0
no_worry_about_disaster
CMPI "SMJ",a0
jrne no_worry_about_yes_indeedly
push a0
movi 214h,a0
CALLA ADD_VOICE
pull a0
no_worry_about_yes_indeedly
PUSH A6
SUB A4,A6
CMPI 18H,A6
JRNE A_FIVE_INITIALER
MOVE *A13(#stick),a1
sll 4,a1
addi which_player,a1
move *a1,a9
ADDI "A",A9
MOVB A9,*A4(18H)
A_FIVE_INITIALER
PULL A6
RETP
;do_next_tick
; SLEEP 12
; MOVI 0B8H,A0
; CALLA triple_sound
; DIE
#random_initials
.byte "MJT",0
.byte "JYT",0
.byte "SAL",0
.byte "JMS",0
.byte "JAZ",0
.byte "RJR",0
.byte "MJL",0
#dw_table
.long 00001ab1h ; FUQ
.long 00001aa3h ; FUC
.long 00001aabh ; FUK
.long 000822b1h ; PHUQ
.long 000822abh ; PHUK
.long 000822a3h ; PHUC
.long 010ace79h ; PUSSY
.long 0102b933h ; PENIS
.long 0024d068h ; BITCH
.long 0009b2b4h ; SLUT
.long 0009a134h ; SHIT
.long 0001d5d4h ; CUNT
.long 0001b134h ; CLIT
.long 0001bc6bh ; COCK
.long 000994e1h ; SEGA
.long 0
; A4 = *beginning of string
; A0 = character to add
;
; Returns
; Z - Not dirty word
; NZ - Dirty word
;
SUBR are_inits_dirty
PUSH a0,a1,a2,a4,a5,a6
move a4,a6
subk 8,a6
#recheck
addk 8,a6
move a6,a4
movb *a6,a2
jrz #not_dirty_word
clr a1
#get_inits_loop
movb *a4,a2
; jrz #gi_done
jrz #recheck
cmpi 20h,a2
jrz #not_alpha
cmpi 21h,a2
jrz #not_alpha
cmpi 19h,a2
jrz #not_alpha
sll 5,a1
subi 40h,a2
andi 1fh,a2
or a2,a1
callr #check_it
#not_alpha
addk 8,a4
jruc #get_inits_loop
#gi_done
#check_it
PUSH a4
movi #dw_table,a4
clr a0
#check_dw_loop
move *a4+,a5,L
; jrz #not_dirty_word
jrz #check_done
cmp a1,a5
jrz #is_dirty
jruc #check_dw_loop
#check_done
PULL a4
rets
#is_dirty
PULL a4,a14 ; This sucks don't change this
movk 1,a0 ; or it will break
jruc #aid_exit
#not_dirty_word
clr a0
#aid_exit
move a0,a0
PULL a0,a1,a2,a4,a5,a6
rets
****************************************
* moves the cursor and hilite char to their new positions.
SUBRP new_cursor_pos
;x pos = #grid_x + #block_size * (index mod 6)
move a9,a1
movk 5,a0
modu a0,a1
movi #block_size,a0
mpyu a0,a1
move *a13(#stick),a3
SLL 6,A3
ADDI WHERE_BLOCK,A3
MOVE *A3(010h),A14
add a14,a1
move *a13(#cursorimg),a8,L
move a1,*a8(OXPOS)
move *a13(#hiliteimg),a8,L
move a1,*a8(OXPOS)
;y pos = #grid_y + #block_size * (index / 6)
move a9,a1
movk 5,a2
divu a2,a1
movi #block_size,a0
mpyu a0,a1
move *a3(030h),a14
add a14,a1
move *a13(#cursorimg),a8,L
move a1,*a8(OYPOS)
move *a13(#hiliteimg),a8,L
move a1,*a8(OYPOS)
;adjust the character image
move a9,a0
sla 3,a0 ;x8
addi #init_table1,a0
movb *a0,a0
X32 a0
addi font9_ascii,a0
move *a0,a0,L
jrnz #good_image
movi OSGEMD_DOT,a0
#good_image
move *a13(#hiliteimg),a8,L
calla civanic
movi FNT9YEL_P,a0
calla pal_getf
move a0,*a8(OPAL)
move *a8(OSIZEX),a14 ;center it
subi #block_size,a14
sra 1,a14
move a14,*a8(ODXOFF)
move *a8(OSIZEY),a14
subi #block_size,a14
sra 1,a14
move a14,*a8(ODYOFF)
rets
****************************************
* deletes the old displayed init string (if any) and makes a new one.
SUBRP print_init_string
push b5,b3
PUSH a0,a1,a2,a3,a4,a5,a6,a7,a8
PUSH a4
move *a13(#stick),a0
addi CLSNEUT|TYPTEXT|00A5h,a0
calla obj_del1c
movi #currentinit1_mes,a2
move *a13(#stick),a3
jrz #current_mess_set
movi #currentinit2_mes,a2
#current_mess_set
calla setup_message
move *a13(#stick),a0
addi CLSNEUT|TYPTEXT|00A5h,a0
move a0,@mess_objid
PULL a4
calla print_string_C2
PULL a0,a1,a2,a3,a4,a5,a6,a7,a8
pull b5,b3
rets
****************************************
* draw the letter grid
SUBRP draw_letter_grid
movi FNT9YEL_P,a0
calla pal_getf
move a0,a11
move *a13(#stick),A1
SLL 6,A1
ADDI WHERE_BLOCK,A1
MOVE *A1+,A0,L
MOVE *A1,A1,L
MOVE A0,B2
SUBI [#block_size,0],B2
movi #init_table1,a9
movi 30,a10
jruc #draw_loop
#draw_incy
MOVE B2,A0
addi [#block_size,0],a1
#draw_incx
addi [#block_size,0],a0
#draw_loop
movb *a9,a2
addk 8,a9
X32 a2
addi font9_ascii,a2
move *a2,a2,L
jrnz #draw_okimg
;bad image
movi OSGEMD_DOT,a2
#draw_okimg
clr a3
movi DMAWNZ,a4
move *a13(#stick),a5
addi CLSNEUT|TYPTEXT|00A3h,a5
clr a6
clr a7
PUSH a0,a1
movi FNT9YEL_P,b0
calla BEGINOBJP
PULL a0,a1
move a11,*a8(OPAL) ;set the palette
;center the image in its' box
move *a8(OSIZEX),a14
subi #block_size,a14
sra 1,a14
move a14,*a8(ODXOFF)
move *a8(OSIZEY),a14
subi #block_size,a14
sra 1,a14
move a14,*a8(ODYOFF)
dec a10
jrz #draw_done
move a10,a6
movi 5,a7
modu a7,a6
jrz #draw_incy
jruc #draw_incx
#draw_done
rets
****************************************
* enter inits config stuff
crap_off .equ 5
WHERE_BLOCK
.LONG [32+crap_off,0] ;X
.LONG [59,0] ;Y
.LONG [273+crap_off,0] ;X
.LONG [59,0] ;Y
#init_table1 .STRING "ABCDEFGHIJKLMNOPQRSTUVWXYZ!",>10,>11,>12
#init_table2 .STRING "ABCDEFGHIJKLMNOPQRSTUVWXYZ!",>20,>11,>12
#grid_x equ 200 ;x position of letter grid
#grid_y equ 100 ;y position of letter grid
#block_size equ 18 ;x & y spacing of letter grid
#tstatic equ 30 ;ticks before repeat motion begins
#tmoving equ 10 ;ticks between repeat motions
#debounce_time equ 8 ;min ticks between stick changes
#enterinit_mod
.long wwfselbkBMOD ;wrestler select map
.word -44,0
.long 0
#currentinit1_mes
JAM_STR osgemd_ascii,10,1,77+crap_off,204,BLUE,print_string_C2
.byte "A",0
.even
#currentinit2_mes
JAM_STR osgemd_ascii,10,1,315+crap_off,204,RUBYPAL,print_string_C2
.byte "A",0
.even
#enterinita_mess
JAM_STR font9_ascii,8,0,76+crap_off,179,FNT9WHT2P,print_string_C2
.byte "ENTER INITIALS",0,0
.even
#enterinitb_mess
JAM_STR font9_ascii,8,0,286+crap_off+29,179,FNT9RED_P,print_string_C2
.byte "ENTER INITIALS",0,0
.even
#enterinit1_mes
JAM_STR font9_ascii,4,0,77+crap_off,38,FNT9WHT2P,print_string_C2
.byte "WIN STREAK !",0,0
.even
#enterinit2_mes
JAM_STR font9_ascii,4,0,317+crap_off,38,FNT9RED_P,print_string_C2
.byte "WIN STREAK !",0,0
.even
#enterinit3_mes
JAM_STR font9_ascii,4,0,77+crap_off,38,FNT9WHT2P,print_string_C2
.byte "FAST VICTORY",0,0
.even
#enterinit4_mes
JAM_STR font9_ascii,4,0,317+crap_off,38,FNT9RED_P,print_string_C2
.byte "FAST VICTORY",0,0
.even
#enterinit5_mes
JAM_STR font9_ascii,4,0,77+crap_off,38,FNT9WHT2P,print_string_C2
.byte "BEATEN GAME",0,0
.even
#enterinit6_mes
JAM_STR font9_ascii,4,0,317+crap_off,38,FNT9RED_P,print_string_C2
.byte "BEATEN GAME",0,0
.even
#enterinit7_mes
JAM_STR font9_ascii,4,0,45+crap_off,16,FNT9WHT2P,print_string_C2
.byte "WINS : ",0,0
.even
#enterinit8_mes
JAM_STR font9_ascii,4,0,285+crap_off,16,FNT9RED_P,print_string_C2
.byte "WINS : ",0,0
.even
#enterinit9_mes
.byte "SEC.",0,0
.even
#entermess_mes
JAM_STR osgemd_ascii,10,0,200+crap_off,10,BLUE,print_string_C2
.byte "ENTER A MESSAGE",0,0
.even
#cursor .word 0,0,10 ;X, Y, Z
.long jmeter ;IMG
.word DMACAL ;CTRL
.word CLSNEUT|TYPTEXT|00A3h
.long 0,0 ;XVEL, YVEL
.even
#cursor2 .word 0,0,10 ;X, Y, Z
.long #jmeter2 ;IMG
.word DMACAL ;CTRL
.word CLSNEUT|TYPTEXT|00A4h
.long 0,0 ;XVEL, YVEL
.even
#jmeter2
.word 175,13,2,2
.long 040427fcH
.word 02000H
.long #jmeter2_p
#jmeter2_p
.word 5
.word 00H,7d00H,07F60H,01E0H,00H
#hilite1 .word 0,0,20 ;X, Y, Z
.long FNT9_A
.word DMAWNZ ;CTRL
.word CLSNEUT|TYPTEXT|00A3h
.long 0,0 ;XVEL, YVEL
.even
#hilite2 .word 0,0,20 ;X, Y, Z
.long FNT9_A
.word DMAWNZ ;CTRL
.word CLSNEUT|TYPTEXT|00A4h
.long 0,0 ;XVEL, YVEL
.even
#joytab ;RLDU
.word 0 ;0000
.word -5 ;0001
.word 5 ;0010
.word 0 ;0011
.word -1 ;0100
.word -6 ;0101
.word 4 ;0110
.word -1 ;0111
.word 1 ;1000
.word -4 ;1001
.word 6 ;1010
.word 1 ;1011
.word 0 ;1100
.word -5 ;1101
.word 5 ;1110
.word 0 ;1111
********************************
*INITIAL ENTRY JOYSTICK TABLE
*INITIAL MATRIX
**************************************************************************
*
* CHECK_INITS
*
* A1 POINTS AT A SET OF INITIALS ENTERED. RETURN .EQ.
* IF THEY'RE ALL SPACES (OR ZERO).
*
**************************************************************************
CHECK_INITS:
MMTM SP,A0,A1,A2
MOVI NUM_INITS,A2
CHECK_NEXT:
MOVB *A1,A0 ;GET AN INITIAL
JRZ SPACE_FOUND ;NULL IS A SPACE
CMPI SPACE,A0 ;IS IT A REAL SPACE?
JRNZ LET_FOUND
SPACE_FOUND:
ADDI BYTE_SIZE,A1
DSJS A2,CHECK_NEXT
CLR A2 ;SET Z BIT ON FALL THROUGH
LET_FOUND:
MMFM SP,A0,A1,A2
RETS
**************************************************************************
*
* CHECK_SCORE
*
* THIS IS CALLED WITH A SCORE IN A0 TO SEE IF IT
* IS HIGH ENOUGH TO MAKE THE TABLE.
*
* THE OTHER PLAYER'S SCORE IS PASSED IN A2. IF
* THE PLAYER MAKES THE LAST POSITION OF THE TABLE,
* THEN HIS SCORE IS COMPARED AGAINST THE OTHER SCORE
* IT MUST BE HIGHER THAN THE OTHER SCORE, OTHERWISE
* HE WILL ENTER HIS INITIALS, BUT THERE WILL BE NO
* PLACE TO PUT THEM WHEN HIS BUDDY IS DONE ENTERING HIS!
*
* 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.
*
**************************************************************************
SUBR CHECK_SCORE
MMTM SP,A1,A3,A9,A10
MOVE A0,A3 ;STASH SCORE IN A3
move *a13(#which_level),a10,L
call a10
; 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 "ENTERED"
CMP A1,A0 ;A0 MUST BE LESS OR EQUAL
JRLO ANSWER_IN_A0 ;NOT LAST ENTRY...RETURN SUCCESS
; JRHI DIDNT_MAKE_HSTD
*
* GUY IS GOING FOR LAST POSITION.....SEE IF HIS BUDDY IS
* GOING TO NOSE HIM OUT:
*
* ^^^^^^^^^^ not anymore !! ^^^^^^^
; CMP A2,A3 ;HI MUST BE HIGHER THAN BUDDY
; JRHI ANSWER_IN_A0
;
;DIDNT_MAKE_HSTD:
CLR A0 ;RETURN FAILURE
ANSWER_IN_A0:
MOVE A0,A0 ;SET EQ BIT ACCORDINGLY
MMFM SP,A1,A3,A9,A10
RETS
SORT_BEATEN_TABLE
PUSH A1
MOVE *A13(#which_tab),A8,L
; MOVI BEATEN_TAB,A8
CALLR ROM_PTRS
MOVE *A13(#which_aud),A0
; MOVI AUD_BEATEN,A0
CALLA GET_AUD
MOVE A1,A0
PULL A1
MOVE A0,A6
CALLR TEST_NUM_ICON
MOVE A3,A5
MOVK 1,A0
MOVI BEATEN_TAB_ENTRIES,A10
TEST_NEXT_BEATEN_ENTRY
CALLR TEST_NUM_ICON
CMP A3,A5
JRGE THIS_IS_IT
INC A0
DSJS A10,TEST_NEXT_BEATEN_ENTRY
NO_MOVEMENT
RETS
THIS_IS_IT
CMP A0,A6
JREQ NO_MOVEMENT
MOVE A6,A10
MOVE A10,A3
MOVE *A13(#which_tab),A8,L
CALLR ROM_PTRS
PUSH A0,A1
MOVE *A13(#which_aud),A0
CALLA GET_AUD
MOVE A1,A0
CALLR GET_HSCR
MOVE A1,A4
PULL A0,A1
PUSH A0,A1
MOVE A0,A1
MOVE *A13(#which_aud),A0
calla KILL_AUD
calla AUD
PULL A0,A1
MMTM SP,A0,A1,A2,A3,A4,A7,A9,A10
JRUC COPY_DOWN_LOOP
TEST_NUM_ICON
PUSH A1
CALLR GET_HSCR
CLR A3
MOVK 8,A4
TEST_NEXT_NYBBLE
SRL 1,A1
JRNC NO_IN_A3
INC A3
NO_IN_A3
SRL 3,A1
DSJS A4,TEST_NEXT_NYBBLE
PULL A1
RETS
COMPARE_INITIALS
MOVK 1,A0 ;START AT 1 AND WORK UP.
CALLR VAL_TAB ;FIX THE TABLE IN CASE ITS BROKEN.
JRC #NOT_MATCHED
COMPARE_NEXT
CALLR COMPARE_INITS
JRNC MATCHED
INC A0
CMP A10,A0
JRNE COMPARE_NEXT
CLR A0
MATCHED
MOVE A0,A0
RETS
#NOT_MATCHED
MOVI -1,A0
RETS
COMPARE_INITS
PUSH A0
MOVE A1,A6
CALLA PT_ENTRY
ADDI HS_INITS,A7 ;POINT AT FIRST INITIAL
MOVI NUM_INITS,A2 ;THIS IS NUMBER OF INITIALS
#INIT_COPY_LOOP
CALLR RC_BYTEI
MOVE A0,A5
JRNZ #NOT_BLANK
MOVI SPACE,A5 ;REPLACE BLANKS WITH SPACES
#NOT_BLANK:
MOVB *A6,A11
JRNZ #NOT_A_SPACE
MOVI SPACE,A11 ;REPLACE BLANKS WITH SPACES
MOVB A11,*A6
#NOT_A_SPACE
CMP A5,A11
JRNE NOT_MATCHED
ADDK 8,A6
DSJ A2,#INIT_COPY_LOOP
PULL A0
CALLR GET_HSCR
OR A1,A4
CLRC
RETS
NOT_MATCHED
PULL A0
SETC
RETS
SPECIAL_ADD_ENTRY
MMTM SP,A0,A1,A2,A3,A4,A7,A9,A10
CALLR ROM_PTRS ;SETUP FOR THIS TABLE
MOVE A0,A4
PUSH A1
CALLR COMPARE_INITIALS
JRNZ INSERT_HERE
JRN DIDNT_MAKE_IT
MOVE A10,A0
INSERT_HERE
PUSH A0
MOVE A0,A1
MOVE *A13(#which_aud),A0
calla KILL_AUD
calla AUD
PULL A0
PULL A1
MOVE A10,A3
SETC
JRUC COPY_DONE
TAG_ENTRY:
MMTM SP,A0,A1,A2,A3,A4,A7,A9,A10
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 SPECIAL_DIDNT_MAKE_IT ;DON'T KNOW WHY I GOT THESE INITS.
MOVE A10,A3 ;LAST GUY IN TABLE IS DESTINATION
JRUC COPY_DOWN_LOOP
SPECIAL_DIDNT_MAKE_IT
MOVK 17,A0
MOVE A10,A3 ;LAST GUY IN TABLE IS DESTINATION
JRUC COPY_DOWN_LOOP
**************************************************************************
*
* 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.
*
* RETURN CARRY SET IF IT DIDN'T MAKE IT INTO REQUESTED TABLE
*
**************************************************************************
ADD_ENTRY:
MMTM SP,A0,A1,A2,A3,A4,A7,A9,A10
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.
*
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
*
* INITAIAL POINTER IS IN A1
* TABLE OFFSET IN A0
*
CALLR PT_ENTRY ;GET ENTRY POINTER IN 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!
DIDNT_MAKE_IT
MMFM SP,A0,A1,A2,A3,A4,A7,A9,A10
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_HIGH_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
#**************************************************************************
*
* 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
*
**************************************************************************
SUBR FIND_LOW_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?
JRLO #FOUND_THE_SPOT
; JRHI #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
LOCKUP
.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
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.
*
**************************************************************************
SET_PAGE
; 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
RETS
**************************************************************************
*
* 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
RETS
#*************************************************************************
*
* INIT_HSTRING
*
* Initializes the special name of the top scorer on the table.
SUBR INIT_HSTRING
MOVI AUD_WINSTREAK,A0
CALLA KILL_AUD
MOVI AUD_PINSPEED,A0
CALLA KILL_AUD
MOVI AUD_BEATEN,A0
CALLA KILL_AUD
MOVI AUD_TAG,A0
CALLA KILL_AUD
rets
#*************************************************************************
*
* INIT_TB
*
* THIS IS CALLED TO SETUP A HIGH SCORE TABLE WITH
* FACTORY ENTRIES.
*
* A8 = ROM TABLE POINTER
*
**************************************************************************
SUBR INIT_TB
MMTM SP,A5,A6,A7,A0
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
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
CALLR INIT_HSTRING
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 '.',A0 ;SPACE?
JREQ VERIFY_PASS ;ITS OK.
CMPI '!',A0 ;SPACE?
JREQ VERIFY_PASS ;ITS OK.
CMPI '%',A0 ;SPACE?
JREQ VERIFY_PASS ;ITS OK.
CMPI '?',A0 ;SPACE?
JREQ VERIFY_PASS ;ITS OK.
CMPI SPACE,A0 ;SPACE?
JREQ VERIFY_PASS ;ITS OK.
CMPI LET_A,A0 ;BETWEEN A-Z?
JRLO VERIFY_FAIL
CMPI LET_Z,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
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
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 ****
*
* 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
; move @SYSCOPY,a0
; sll 32-2,a0
; srl 32-2,a0
; sll 15,a0 ;Page offset
; add a7,a0
movb *a7,a0
sll 32-8,a0
srl 32-8,a0
rets
WC_BYTE
; MOVE A1,-*SP,L
; move @SYSCOPY,a1
; sll 32-2,a1
; srl 32-2,a1
; sll 15,a1 ;Page offset
; add a7,a1
; move a7,a1
move a0,@CMOSWE
movb a0,*a7
; MMFM SP,A1
rets
**************************************************************************
*
* 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
*****************************************************************************
*****************************************************************************
*****
***** 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
;SCRM .MACRO a,b
SCRM .MACRO a
.byte :a:/>1000000,:a:/>10000&>ff,:a:/>100&>ff,:a:&>ff
; .byte ":b:",0
.ENDM
STREAK_ROM_TABLE
SCRM >22122145 ;****ZERO ENTRY...NOT SEEN!
.BYTE "EPJA.",0
ROM_ENTRY_SIZE EQU $-STREAK_ROM_TABLE
SCRM >11
.BYTE "MJTA.",0
SCRM >10
.BYTE "SALB.",0
SCRM >9
.BYTE "JMSC.",0
SCRM >9
.BYTE "JYTD.",0
SCRM >8
.BYTE "MJLE.",0
SCRM >8
.BYTE "JAKF.",0
SCRM >7
.BYTE "OEGA.",0
SCRM >7
.BYTE "SL A.",0
SCRM >7
.BYTE "MDPA.",0
SCRM >6
.BYTE "GBSA.",0
SCRM >6
.BYTE "DJTA.",0
SCRM >6
.BYTE "EPJA.",0
SCRM >5
.BYTE "BIFA.",0
SCRM >5
.BYTE "UNKA.",0
SCRM >5
.BYTE "UTBA.",0
SCRM >4
.BYTE "CRLA.",0
SCRM >4
.BYTE "TDGA.",0
SCRM >4
.BYTE "ASBA.",0
STREAK_TABLE_ENTRIES EQU ($-STREAK_ROM_TABLE)/ROM_ENTRY_SIZE
PIN_SPEED_TAB_ROM_TABLE
SCRM >7000 ;****ZERO ENTRY...NOT SEEN!
.BYTE "EPJA.",0
SCRM >6000
.BYTE "MJTI.",0
SCRM >6100
.BYTE "SALI.",0
SCRM >6200
.BYTE "JMSG.",0
SCRM >6300
.BYTE "JYTF.",0
SCRM >6400
.BYTE "JAKE.",0
SCRM >6500
.BYTE "OEGD.",0
SCRM >6600
.BYTE "MJLC.",0
SCRM >6700
.BYTE "UTBB.",0
SCRM >6800
.BYTE "ASBA.",0
PIN_SPEED_TAB_ENTRIES EQU ($-PIN_SPEED_TAB_ROM_TABLE)/ROM_ENTRY_SIZE
BEATEN_ROM_TABLE
SCRM >22122145 ;****ZERO ENTRY...NOT SEEN!
.BYTE "EPJAB",0
B_ROM_ENTRY_SIZE EQU $-BEATEN_ROM_TABLE
SCRM >11101
.BYTE "MIKE ",0
SCRM >1001
.BYTE "JAMIT",0
SCRM >100
.BYTE "TEAL ",0
SCRM >1000
.BYTE "DINK ",0
SCRM >10000
.BYTE "JAKE ",0
SCRM >100000
.BYTE "DRJ ",0
SCRM >1000000
.BYTE "CHICK",0
SCRM >10000000
.BYTE "SHAWN",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
BEATEN_TAB_ENTRIES EQU ($-BEATEN_ROM_TABLE)/B_ROM_ENTRY_SIZE
INTER_ROM_TABLE
SCRM >22122145 ;****ZERO ENTRY...NOT SEEN!
.BYTE "EPJAB",0
I_ROM_ENTRY_SIZE EQU $-INTER_ROM_TABLE
SCRM >111
.BYTE "MARK ",0
SCRM >101
.BYTE "SAL ",0
SCRM >100
.BYTE "JASON",0
SCRM >1000
.BYTE "LICK ",0
SCRM >10000
.BYTE "JAKE ",0
SCRM >100000
.BYTE "DIESL",0
SCRM >1000000
.BYTE "FUJI ",0
SCRM >10000000
.BYTE "SHAWN",0
SCRM >1000000
.BYTE "BIFF ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
SCRM >0000000
.BYTE " ",0
INTER_TAB_ENTRIES EQU ($-INTER_ROM_TABLE)/I_ROM_ENTRY_SIZE
TAG_ROM_TABLE
SCRM >22122145 ;****ZERO ENTRY...NOT SEEN!
.BYTE "EPJAB",0
T_ROM_ENTRY_SIZE EQU $-TAG_ROM_TABLE
SCRM >9000
.BYTE "BOON ",0
SCRM >9000
.BYTE "SAL ",0
SCRM >9500
.BYTE "ERMAC",0
SCRM >9500
.BYTE "KANO ",0
SCRM >10000
.BYTE "SONYA",0
SCRM >10000
.BYTE "GENE ",0
SCRM >10500
.BYTE "MIKE ",0
SCRM >10500
.BYTE "SHAWN",0
SCRM >11000
.BYTE "JASON",0
SCRM >11000
.BYTE "JOSH ",0
SCRM >11500
.BYTE "JOHN ",0
SCRM >11500
.BYTE "JAKE ",0
SCRM >12000
.BYTE "JOE ",0
SCRM >12000
.BYTE "EDWIN",0
SCRM >12500
.BYTE "BILL ",0
SCRM >12500
.BYTE "MARKP",0
SCRM >13000
.BYTE "STEVE",0
SCRM >13000
.BYTE "TONY ",0
TAG_TAB_ENTRIES EQU ($-TAG_ROM_TABLE)/T_ROM_ENTRY_SIZE
******************************************************************************
.end