1644 lines
74 KiB
NASM
1644 lines
74 KiB
NASM
.FILE 'ENT.ASM'
|
||
.TITLE "ROBO ENTER YOUR INITIALS AND CUSTOM OPERATOR MESSAGE"
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
;
|
||
; SOFTWARE: ROBERT ASHWORTH
|
||
;
|
||
; COPYRIGHT (C) 1989 WILLIAMS ELECTRONICS GAMES, INC.
|
||
;
|
||
;
|
||
; GET THE SYSTEM STUFF
|
||
|
||
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
|
||
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
|
||
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
|
||
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
|
||
.INCLUDE "IMGTBL.GLO"
|
||
.INCLUDE "ROBO.EQU"
|
||
.INCLUDE "LINK.EQU" ;LINKY EQUATES
|
||
|
||
.BSS SPRAYS,16 ;HOW MANY SPRAYERS ARE RUNNING
|
||
|
||
.TEXT
|
||
.INCLUDE "NARCENT.TBL" ;CONTAINS OUR UNIQUE IMAGES
|
||
*
|
||
* DEFINED IN THIS MODULE
|
||
*
|
||
.GLOBAL P1_INITS, P2_INITS, E_INITS, OP_INITS
|
||
.GLOBAL SPRAYS, KIL_SPRY
|
||
*
|
||
* SPRAY MODULE
|
||
*
|
||
.GLOBAL RES_SCRL, P_SCRIPT, X_PL_SA3, SPR_CHAR
|
||
.GLOBAL P1_SPRAY, P2_SPRAY, E_BRUSH, SC_CRAM
|
||
*
|
||
.GLOBAL P_FORK
|
||
|
||
OP_BLOB
|
||
.LONG 0,0,0,0 ;XV, YV, XP, YP
|
||
.WORD 0,0 ;Z POS 0....NO Z VEL
|
||
.LONG BLANK_OP,1,DUMCOLL ;IMG, Z SIZE, COLLISION VECT
|
||
.WORD DMACAL,BLANK_ID ;WRITE CONSTANT FOR EVERYONE, OBJECT ID
|
||
.LONG 0 ;NO SCANNER BLIP
|
||
|
||
BLANK_BLOB
|
||
.LONG 0,0,0,0 ;XV, YV, XP, YP
|
||
.WORD 0,0 ;Z POS 0....NO Z VEL
|
||
.LONG BLANK_IMG,1,DUMCOLL ;IMG, Z SIZE, COLLISION VECT
|
||
.WORD DMACAL,BLANK_ID ;WRITE CONSTANT FOR EVERYONE, OBJECT ID
|
||
.LONG 0 ;NO SCANNER BLIP
|
||
|
||
LETTER_TEMPLATE
|
||
.LONG 0,0,0,0 ;XV, YV, XP, YP
|
||
.WORD 0,10 ;Z VEL 10....Z POS 0
|
||
.LONG BLANK_IMG,1,DUMCOLL ;IMG, Z SIZE, COLLISION VECT
|
||
.WORD DMACNZ,0 ;WRITE NON-ZERO CONSTANT, OBJECT ID
|
||
.LONG 0 ;NO SCANNER BLIP
|
||
|
||
*FROB .LONG 0,0,0,0 ;WE'LL SET IT UP
|
||
* .WORD 0,10 ;SAME Z AS LETTERS
|
||
* .LONG INIT_BOX,1,DUMCOLL ;THIS IS LETTER SIZE BOX
|
||
* .WORD DMACNZ,FROB_ID ;USE SPECIAL ID FOR BOX
|
||
* .LONG 0 ;NO SCANNER BLIP!
|
||
|
||
P1_HAND .LONG 0,0,0,0
|
||
.WORD 0,22 ;HAND IS CLOSER THAN LETTERS
|
||
|
||
.IF BLUE_P1
|
||
.LONG fing,1,DUMCOLL ;THIS IS LETTER SIZE BOX
|
||
.ELSE
|
||
.LONG b_fing,1,DUMCOLL ;THIS IS LETTER SIZE BOX
|
||
.ENDIF
|
||
|
||
.WORD DMAWNZ,HAND_ID
|
||
.LONG 0
|
||
P1_H2 .LONG 0,0,0,0
|
||
.WORD 0,22
|
||
|
||
.IF BLUE_P1
|
||
.LONG hand,1,DUMCOLL
|
||
.ELSE
|
||
.LONG b_hand,1,DUMCOLL
|
||
.ENDIF
|
||
|
||
.WORD DMAWNZ,HAND_ID
|
||
.LONG 0
|
||
|
||
P2_HAND .LONG 0,0,0,0
|
||
.WORD 0,21 ;HAND IS CLOSER THAN LETTERS
|
||
.IF BLUE_P1
|
||
.LONG b_fing,1,DUMCOLL ;THIS IS LETTER SIZE BOX
|
||
.ELSE
|
||
.LONG fing,1,DUMCOLL ;THIS IS LETTER SIZE BOX
|
||
.ENDIF
|
||
|
||
.WORD DMAWNZ,HAND_ID
|
||
.LONG 0
|
||
P2_H2 .LONG 0,0,0,0
|
||
.WORD 0,21
|
||
|
||
.IF BLUE_P1
|
||
.LONG b_hand,1,DUMCOLL
|
||
.ELSE
|
||
.LONG hand,1,DUMCOLL
|
||
.ENDIF
|
||
|
||
.WORD DMAWNZ,HAND_ID
|
||
.LONG 0
|
||
|
||
*
|
||
* OBJECTS IN OUR LIST ARE SUCH THAT
|
||
* ASCII CHARACTERS HAVE THEIR ASCII LETTER AS
|
||
* THEIR ID'S
|
||
* THE HAND HAND AND FROB HAVE THE FOLLOWING
|
||
* OBJECT ID'S
|
||
*
|
||
*FROB_ID EQU 1
|
||
HAND_ID EQU 2
|
||
BLANK_ID EQU 3
|
||
|
||
|
||
BLOB_DX EQU -1CH*TABLE_UNIT ;START BLOB THIS FAR LEFT
|
||
BLANK_X EQU 013CH ;SIZE OF "AUTOERASE" BLOB
|
||
BLANK_Y EQU 100
|
||
BLANK_OP_X EQU 1FCH ;WIDTH OF BLANK FOR OPERATOR
|
||
BLOB_OP_DX EQU -12*TABLE_UNIT ;BRING TO ZERO
|
||
*
|
||
* ALPHA CONSTANTS.
|
||
* THIS DETERMINES LAYOUT OF THE LETTERS ON THE
|
||
* SCREEN.
|
||
*
|
||
ALPHA_X EQU 5*TABLE_UNIT ;X OFFSET OF ALPHA BLOCK
|
||
ALPHA_Y EQU 5*TABLE_UNIT ;Y OFFSET OF ALPHA BLOCK
|
||
ALPHA_ROWS EQU 3 ;26 LETTERS, SPACE, RUB, END
|
||
ALPHA_COLS EQU 10
|
||
ALPHA_DX EQU 20*TABLE_UNIT ;X UNITS BETWEEN LETTERS
|
||
ALPHA_DY EQU 22*TABLE_UNIT ;Y UNITS BETWEEN LETTERS
|
||
|
||
HAND_X EQU 7BH*TABLE_UNIT
|
||
HAND_Y EQU 40H*TABLE_UNIT
|
||
|
||
HAND_END_X EQU 0B0H*TABLE_UNIT
|
||
HAND_END_Y EQU 42H*TABLE_UNIT
|
||
|
||
END_MIN_X EQU 8CH*TABLE_UNIT
|
||
END_MIN_Y EQU 34H*TABLE_UNIT
|
||
|
||
END_MIN_OP_X EQU 190H*TABLE_UNIT
|
||
HAND_END_OP_X EQU 1B6H*TABLE_UNIT
|
||
|
||
HAND_HOT_DX EQU 18H*TABLE_UNIT ;X FROM UPPER LEFT OF HAND TO HOT SPOT
|
||
HAND_HOT_DY EQU -2*TABLE_UNIT
|
||
|
||
CLOSE_FOR_RUB EQU ALPHA_DX+(8*TABLE_UNIT) ;RUB AND SPACE HAVE LARGER REGIONS.
|
||
CLOSE_X EQU ALPHA_DX ;DISTANCE FROM HAND TO BE TIED TO THAT LETTER
|
||
CLOSE_Y EQU ALPHA_DY
|
||
|
||
HAND_X_ADJ EQU 13*TABLE_UNIT ;X DIFFERENCE FROM CENTER OF
|
||
* ;LETTER TO CENTER OF FINGER
|
||
|
||
HAND_MIN_X EQU 4*TABLE_UNIT
|
||
HAND_MIN_Y EQU 16*TABLE_UNIT
|
||
HAND_MAX_X EQU 0B8H*TABLE_UNIT
|
||
HAND_MAX_Y EQU 42H*TABLE_UNIT
|
||
|
||
OP_MAX_X EQU 1B8H*TABLE_UNIT ;X TRAVEL FOR OPERATOR!
|
||
HAND_MIN_OP_Y EQU 19*TABLE_UNIT
|
||
|
||
Z_TO_SPACE EQU (20*TABLE_UNIT)-ALPHA_DX ;X DISTANCE BEFORE PUTTING SPACE OUT
|
||
SPACE_TO_RUB EQU 25*TABLE_UNIT ;X DISTANCE BETWEEN SPACE AND RUB
|
||
RUB_TO_END EQU 29*TABLE_UNIT ;X DISTANCE BETWEEN RUB AND END
|
||
SPACE_DY EQU 2*TABLE_UNIT
|
||
|
||
FROB_COLOR EQU 0F5F5H ;LASER FLASH FOR FROB
|
||
|
||
BLANK_IMG
|
||
.WORD BLANK_X,BLANK_Y,0,0 ;WIDTH, HEIGHT, OFFSET,OFFSET
|
||
.LONG IROM,NARCS ;SOURCE, PALETTE
|
||
|
||
BLANK_OP
|
||
.WORD BLANK_OP_X,BLANK_Y,0,0 ;WIDTH, HEIGHT, OFFSET,OFFSET
|
||
.LONG IROM,NARCS ;SOURCE, PALETTE
|
||
|
||
P1_INITS
|
||
.LONG 20*TABLE_UNIT ;UPPER LEFT X
|
||
.LONG PLYR_Y ;UPPER LEFT Y
|
||
.WORD BYTE_SIZE ;1 BYTE BETWEEN INITIALS
|
||
.WORD 3 ;GET TOTAL OF 3
|
||
.WORD 3 ;3 LEFT TO GET
|
||
.WORD P1_COLOR ;CONSTANT COLOR
|
||
.LONG RD15FONT ;FONT BASE POINTER
|
||
.WORD 0 ;ZERO SHIFTS TO GET STICK
|
||
*
|
||
* DATA NOT COPIED TO PROCESS AREA
|
||
*
|
||
.WORD END_GAME_PID+1 ;ID FOR THE PROCESS GETTING LETTERS
|
||
.LONG P1_HAND
|
||
.LONG P1_SPRAY ;SPRAY PAINT SCRIPT INITIALIZER
|
||
.LONG E_BRUSH ;SCRIPT TO CHANGE BRUSH TO ERASE
|
||
.LONG 0D0H ;WIDTH IN PIXELS
|
||
.LONG MESS_1 ;PLAYER 1 TITLE STRING
|
||
|
||
P2_INITS
|
||
.LONG 114H*TABLE_UNIT ;UPPER LEFT X
|
||
.LONG PLYR_Y ;UPPER LEFT Y
|
||
.WORD BYTE_SIZE ;1 BYTE BETWEEN INITIALS
|
||
.WORD 3 ;GET TOTAL OF 3
|
||
.WORD 3 ;3 LEFT TO GET
|
||
.WORD P2_COLOR ;CONSTANT COLOR
|
||
.LONG RD15FONT ;FONT BASE POINTER
|
||
.WORD 8 ;8 SHIFTS TO GET STICK
|
||
*
|
||
* DATA NOT COPIED TO PROCESS AREA
|
||
*
|
||
.WORD END_GAME_PID+2 ;ID FOR THE PROCESS GETTING LETTERS
|
||
.LONG P2_HAND
|
||
.LONG P2_SPRAY ;SPRAY PAINT SCRIPT INITIALIZER
|
||
.LONG E_BRUSH ;SCRIPT TO CHANGE BRUSH TO ERASE
|
||
.LONG 0D0H ;WIDTH IN PIXELS
|
||
.LONG MESS_2 ;PLAYER 2 MESSAGE
|
||
|
||
OP_INITS
|
||
.LONG 18*TABLE_UNIT ;UPPER LEFT X
|
||
.LONG OP_Y ;UPPER LEFT Y
|
||
.WORD BYTE_SIZE ;1 BYTE BETWEEN INITIALS
|
||
.WORD CMESS_CHARS ;GET TOTAL OF 30
|
||
.WORD CMESS_CHARS ;30 LEFT TO GET
|
||
.WORD P2_COLOR ;use red
|
||
.LONG RD15FONT ;FONT BASE POINTER
|
||
.WORD 0 ;ZERO SHIFTS TO GET STICK
|
||
*
|
||
* DATA NOT COPIED TO PROCESS AREA
|
||
*
|
||
.WORD END_GAME_PID+1 ;ID FOR THE PROCESS GETTING LETTERS
|
||
.LONG P1_HAND
|
||
.LONG P1_SPRAY ;SPRAY PAINT SCRIPT INITIALIZER
|
||
.LONG E_BRUSH ;SCRIPT TO CHANGE BRUSH TO ERASE
|
||
.LONG 0D0H ;WIDTH IN PIXELS
|
||
.LONG MESS_1 ;PLAYER 1 TITLE STRING
|
||
|
||
**************************************************************************
|
||
* *
|
||
* Parameters on input are: *
|
||
* *
|
||
* Upper left of Region to conduct the entry. *
|
||
* *
|
||
* Spray paint script pointer for spray of first *
|
||
* echo (This should setup brush size, color, *
|
||
* x,y rate etc.) *
|
||
* *
|
||
* Pointer to place to store initials (bytes) *
|
||
* *
|
||
* Distance in memory between successive initials. *
|
||
* *
|
||
* Number of Initials to get. *
|
||
* *
|
||
* ON ENTRY, A8 POINTS AT STRUCTURE HOLDING THE ABOVE DATA *
|
||
* A9 POINTS TO PLACE TO STORE INITIALS *
|
||
* *
|
||
**************************************************************************
|
||
E_INITS:
|
||
MOVE A8,*A13(ENT_DATA),L ;STUFF OUR ROM DATA POINTER
|
||
CLR A1 ;NULLIFY MY LIST OF OBJECTS
|
||
MOVE A1,@WORLDTLX,L ;MAKE SURE OUR SCREEN IS THEIR SCREEN
|
||
MOVE A1,@WORLDTLY,L ;
|
||
|
||
MOVE A1,*A13(ENT_OLIST),L ;WE HAVE NO OBJECTS
|
||
MOVE A1,*A13(ENT_FROB_OBJ),L ;NO FROB LETTER YET
|
||
MOVE A1,*A13(ENT_ANI_TIMER),L ;NO DEBOUNCE TILL WE SAY SO.
|
||
MOVE A1,*A13(ENT_Y_OFFSET),L ;NO HAND ANIMATION TILL WE SAY SO
|
||
MOVE A1,*A13(ENT_PRESSED),W ;NOTHING PRESSED YET
|
||
MOVE A1,*A13(ENT_TIMEOUT),W ;NOT TIMED OUT YET!
|
||
|
||
MOVE A9,*A13(ENT_INIT_PTR),L ;STORE INITIAL STORAGE POINTER
|
||
|
||
CALLR STUFF_ENT_PDATA
|
||
|
||
CALLR E_TITLES ;PUT UP TITLES FOR THIS PLAYER
|
||
|
||
MOVI LET_A,A0 ;SAFETY.....ALWAYS HAVE VALID LETTER
|
||
MOVE A0,*A13(ENT_FROB_ASCII),W
|
||
|
||
CALLR OP_P ;OPERATOR?
|
||
JRZ NO_SP_PROC
|
||
|
||
MOVI SPRAY_PROC,A7 ;POINT AT OUR SPRAYER (A8 IS IN TACT)
|
||
CALLA P_FORK ;START IT UP (W/ OUR ID)
|
||
MOVE A0,*A13(ENT_SPRAY_PROC),L ;SAVE HIS ID......WE WILL
|
||
* ;NEED TO LET HIM FINISH
|
||
* ;WHEN WE DIE.
|
||
*
|
||
* WE NEED A LARGER BLOB FOR OPERATOR!
|
||
*
|
||
NO_SP_PROC
|
||
MOVI OP_BLOB,A14
|
||
MOVI BLOB_OP_DX,A1
|
||
CALLR OP_P ;IS IT OPERATOR MESSAGE?
|
||
JRZ USE_OP_BLOB ;YEP...USE LARGER BLOB!
|
||
MOVI BLANK_BLOB,A14 ;DATA FOR BLANK BLOB
|
||
MOVI BLOB_DX,A1 ;BLOB MUST GO TO LEFT TO GET HAND!
|
||
USE_OP_BLOB
|
||
CLR A2
|
||
|
||
CALLR NEW_OBJ ;SETUP THE OBJECT
|
||
JREQ ENTRY_FAIL ;NOBODY HOME...EXIT
|
||
|
||
MOVI 0,A1 ;CONSTANT IS ZERO WE CAN PATCH!
|
||
MOVE A1,*A0(OCONST),W ;CONSTANT COLOR IS ZERO!
|
||
|
||
CALLA INSOBJ ;NOW PUT IT ON THE REAL LIST
|
||
*
|
||
* OK....WE HAVE THE BLOB
|
||
* NOW WE NEED TO SUPERIMPOSE THE ALPHABET ON TOP OF IT
|
||
*
|
||
CALLR ADD_ALPHABET ;GET US THE ALPHABET
|
||
*
|
||
* Now we have to create a hand
|
||
*
|
||
MOVE *A8(LET_HAND_PTR),A14,L ;FETCH POINTER FOR HAND
|
||
MOVI HAND_X,A1 ;OFFSETS
|
||
MOVE A1,A9 ;OUR RELATIVE HAND X IN A9
|
||
MOVI HAND_Y,A2
|
||
MOVE A2,A10 ;OUR RELATIVE HAND Y IN A10
|
||
|
||
CALLR NEW_OBJ ;DO THE WORK
|
||
JREQ ENTRY_FAIL ;CAN'T GET THE OBJECT
|
||
|
||
CALLA INSOBJ ;NOW PUT IT ON THE REAL LIST
|
||
|
||
MOVE A0,A8 ;A8 HAS HAND PICTURE
|
||
|
||
CALLR NEW_OBJ ;GET 2ND PART OF HAND
|
||
JREQ ENTRY_FAIL
|
||
|
||
MOVE A0,*A13(ENT_HAND_OBJ),L ;PUT IN PROCESS AREA
|
||
CALLR HAND_PART_2 ;FOLLOW MAIN HAND
|
||
CALLA INSOBJ ;AND ON OBJECT LIST
|
||
*
|
||
* NOW WE NEED TO MOVE HAND AROUND, HYPERING FROB
|
||
* AND WATCHING FOR BUTTONS AS WE GO ALONG
|
||
*
|
||
CALLR FETCH_BUTTONS ;SCAN THE BUTTONS INTO PROCESS
|
||
|
||
LETTER_LOOP
|
||
CLR A1 ;ASSUME HAND IS "PRESSING"
|
||
CLR A2 ;NO MOVEMENT WHEN THIS IS THE CASE
|
||
MOVE *A13(ENT_Y_OFFSET),A0,L ;IS HAND IN THE AIR?
|
||
JRNZ HAND_IN_AIR ;YEP....DON'T LET EM MOVE
|
||
*
|
||
* AT THIS POSITION WE CAN DETECT THE "HYPER TO END" CONDITION
|
||
* WHERE THE HAND HAS SUFFICIENTLY LET GO OF THE LAST LETTER.
|
||
* IF THE COUNT TO GET IS ZERO, AND THE X OR Y IS TOO LOW
|
||
* WE HYPER HERE!
|
||
*
|
||
MOVE *A13(ENT_COUNTDOWN),A0,W ;NO LETTERS TO GO?
|
||
JRNZ NOT_END_YET ;LETTERS TO GO.
|
||
|
||
CALLR GET_E_MIN_X ;GET THE MINIMUM X TO NOT HYPER
|
||
CMP A0,A9 ;IF ITS NOT IN TERMI-BOX
|
||
JRLO HYPER_TO_TERMI ;THEN HYPER THERE
|
||
|
||
CMPI END_MIN_Y,A10
|
||
JRHS NOT_END_YET ;ITS IN THERE...LET HIM MOVE
|
||
|
||
HYPER_TO_TERMI
|
||
MOVI HAND_END_X,A9 ;PUT X ON END
|
||
CALLR OP_P ;OPERATOR?
|
||
JRNZ NORMAL_END
|
||
MOVI HAND_END_OP_X,A9 ;USE THE OPERATOR VERSION.
|
||
NORMAL_END
|
||
MOVI HAND_END_Y,A10 ;AND Y ON A10
|
||
JRUC HAND_IN_AIR
|
||
|
||
NOT_END_YET
|
||
CALLR GET_DY_DX ;GET MOVEMENT FOR HAND (A1,A2)
|
||
|
||
HAND_IN_AIR
|
||
ADD A9,A1 ;ADD OUR X TO THE DX
|
||
CALLR GET_MIN_X ;GET THE MINIMUM X IN A3 BASED ON DATA
|
||
CALLR GET_HAND_MAX_X
|
||
MOVE A1,A0 ;COPY COORDINATE
|
||
CALLR LIMIT_RANGE ;GIVE CORRECTED COORDINATE BACK
|
||
MOVE A0,A1 ;THIS IS COORDINATE TO USE
|
||
|
||
ADD A10,A2 ;ADD OUR Y TO THE DY
|
||
CALLR GET_MIN_Y ;GET MINIMUM Y IN A3
|
||
MOVI HAND_MAX_Y,A4
|
||
MOVE A2,A0 ;COPY COORDINATE
|
||
CALLR LIMIT_RANGE ;GIVE CORRECTED COORDINATE BACK
|
||
MOVE A0,A2 ;THIS IS COORDINATE TO USE
|
||
|
||
MOVE A1,A9 ;BACK TO DURABLE REGISTERS
|
||
MOVE A2,A10
|
||
|
||
MOVE A8,A0 ;POINT WITH OBJECT BLOCK
|
||
MOVE *A13(ENT_Y_OFFSET),A3,L ;GET ANIMATION EXTRA
|
||
ADD A3,A2 ;OFFSET WHERE WE DRAW BY THIS
|
||
CALLR STUFF_OBJECT_OFFSET ;PUT THE HAND WHERE WE LANDED
|
||
CALLR HAND_PART_2 ;FINISH HAND
|
||
|
||
CALLR DO_FROB ;MOVE THE FROB, AND HIGHLIGHT
|
||
* ;LETTER FROB IS ON.
|
||
|
||
CALLR HANDLE_BUTTONS ;DO ACTIONS WARRANTED BY BUTTONS
|
||
JRC ENTRY_FINISHED ;NOT FINISHED!
|
||
|
||
SLEEP 1
|
||
|
||
MOVE *A13(ENT_TIMEOUT),A0,W ;HAVE WE TIMED OUT?
|
||
JRNZ ENTRY_FINISHED ;YEP.....GET OUT OF HERE!
|
||
JRUC LETTER_LOOP
|
||
|
||
ENTRY_FINISHED
|
||
ENTRY_FAIL
|
||
MOVE *A13(ENT_OLIST),A8,L ;GET 1ST ON LIST
|
||
JRZ NOTHING_THERE ;NOTHING THERE...THAT'S ODD!
|
||
*
|
||
* THIS FREES UP THE LIST AND RETURNS THE BLOB OBJECT
|
||
* (IF FOUND) IN A8)
|
||
*
|
||
CALLR FREE_A8 ;FREE THE LIST OF OBJECTS IN A8
|
||
MOVE A8,*A13(ENT_OLIST),L ;THIS IS NOW A VALID LIST
|
||
|
||
NOTHING_THERE
|
||
CLR A0
|
||
MOVE A0,*A13(ENT_CONST),W ;MAKE OUR CONSTANT ZERO
|
||
CALLR E_TITLES ;THIS WILL ERASE THE TITLES
|
||
|
||
*
|
||
* NOW WE NEED TO KILL THE SPRAYER PROCESS ONCE ITS FINISHED
|
||
* WRITING
|
||
*
|
||
MOVE *A13(ENT_SPRAY_PROC),A8,L ;GET HIS ID
|
||
WAIT_SP_LOOP
|
||
SLEEP 8
|
||
|
||
CALLR OP_P ;OPERATOR?
|
||
JRZ NO_SP_WAIT ;THEN NO SPRAY TO WAIT FOR
|
||
|
||
MOVE *A8(SPIN_BUSY),A0,W
|
||
JRNZ WAIT_SP_LOOP ;WAIT WHILE HE FINISHES
|
||
|
||
NO_SP_WAIT
|
||
MOVE *A13(PROCID),A0,W ;NOW KILL HIM
|
||
MOVI 0FFFFH,A1
|
||
CALLA KILALL ;THIS WILL DO IT!
|
||
*
|
||
* LASTLY....GET RID OF THE AUTOERASE BLOB
|
||
*
|
||
MOVE *A13(ENT_OLIST),A0,L ;GET THE BLOB
|
||
JRZ NO_BLOB ;IT WASN'T FOUND!
|
||
|
||
CALLA DELPAL ;TRASH IT!
|
||
CALLA DELOBJ
|
||
|
||
NO_BLOB
|
||
JAUC SUCIDE ;DIE WHEN WE'RE DONE...OUR ID IS MONITORED
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_HAND_MAX_X *
|
||
* *
|
||
* THIS IS CALLED TO STUFF THE MAXIMUM DISTANCE THE HAND *
|
||
* MAY TRAVEL INTO A4. IT USES DIFFERENT NUMBERS BASED *
|
||
* ON BEING OPERATOR MESSAGE OR PLAYER. *
|
||
* *
|
||
**************************************************************************
|
||
GET_HAND_MAX_X
|
||
MOVI HAND_MAX_X,A4 ;ASSUME PLAYER.
|
||
CALLR OP_P ;OPERATOR?
|
||
JRNZ GHMXX ;NOPE
|
||
MOVI OP_MAX_X,A4
|
||
GHMXX RETS
|
||
|
||
GET_E_MIN_X
|
||
MOVI END_MIN_X,A0 ;ASSUME PLAYER.
|
||
CALLR OP_P ;OPERATOR?
|
||
JRNZ GMXX ;NOPE
|
||
MOVI END_MIN_OP_X,A0
|
||
GMXX RETS
|
||
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FREE_A8 *
|
||
* *
|
||
* THIS IS CALLED TO FREE UP THE OBJECT LIST PASSED IN *
|
||
* A8. IT RETURNS IN A8 THE BLANKING OBJECT (NOT *
|
||
* FREED UP) IF FOUND. *
|
||
* *
|
||
**************************************************************************
|
||
FREE_A8
|
||
MMTM SP,A0,A9,A10
|
||
|
||
CLR A9 ;PLACE FOR THE BLOB OBJ
|
||
|
||
MOVE A8,A8 ;LIST NULL?
|
||
JREQ FREE_A8_X ;YEP...WE'RE DONE!
|
||
|
||
TRASH_LOOP
|
||
MOVE *A8(OSLINK),A10,L ;GET NEXT IN LIST
|
||
|
||
MOVE *A8(OID),A0 ;CHECK ID
|
||
CMPI BLANK_ID,A0 ;DON'T TRASH BLANK IMMEDIATELY
|
||
JRNE TRASH_IT
|
||
|
||
MOVE A8,A9 ;SAVE THE BLANKER
|
||
JRUC NEXOBJ
|
||
|
||
TRASH_IT
|
||
MOVE A8,A0 ;DELETE THIS ONE
|
||
CALLA DELPAL
|
||
CALLA DELOBJ
|
||
|
||
NEXOBJ MOVE A10,A8 ;ANY MORE ON LIST?
|
||
JRNZ TRASH_LOOP ;YEP...DO ANOTHER
|
||
|
||
FREE_A8_X
|
||
MOVE A9,A8 ;RETURN THE BLOB IF FOUND
|
||
JREQ FREE_X ;NOT THERE...QUIT
|
||
|
||
CLR A0 ;NULL OUT ITS FWD LINK
|
||
MOVE A0,*A8(OSLINK),L ;THIS DOES IT
|
||
|
||
FREE_X
|
||
MMFM SP,A0,A9,A10
|
||
RETS
|
||
|
||
GET_MIN_X
|
||
MMTM SP,A4,A0
|
||
MOVI HAND_MIN_X,A3 ;ASSUME NORMAL
|
||
CALLR GET_E_MIN_X
|
||
MOVE A0,A4 ;OTHER POSSIBILITY IS CURRENT MIN
|
||
CALLR CHOOSE_MIN
|
||
MMFM SP,A4,A0
|
||
RETS
|
||
|
||
GET_MIN_Y
|
||
MMTM SP,A4
|
||
MOVI HAND_MIN_OP_Y,A3
|
||
CALLR OP_P ;OPERATOR?
|
||
JRZ GMYO ;YEP
|
||
MOVI HAND_MIN_Y,A3 ;ASSUME NORMAL
|
||
GMYO MOVI END_MIN_Y,A4 ;THIS IS OTHER POSSIBILITY
|
||
CALLR CHOOSE_MIN
|
||
MMFM SP,A4
|
||
RETS
|
||
|
||
CHOOSE_MIN
|
||
MMTM SP,A0
|
||
MOVE *A13(ENT_COUNTDOWN),A0,W ;ALL LETTERS EXHAUSTED?
|
||
JRNZ CHOOSE_NORMAL ;CHOOSE THE NORMAL ONE
|
||
MOVE *A13(ENT_Y_OFFSET),A0,L ;ANIMATION?
|
||
JRNZ CHOOSE_NORMAL ;DON'T HYPER TILL HE LETS GO
|
||
MOVE A4,A3 ;CHOOSE ALTERNATE
|
||
CHOOSE_NORMAL
|
||
MMFM SP,A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SPRAY_PROC *
|
||
* *
|
||
* THIS IS THE PROCESS THAT RUNS THE SPRAY PAINTER IN *
|
||
* STEP WITH THE ENTER INITIALS "HAND MOVING" PROCESS. *
|
||
* *
|
||
* IT GETS THE "ENTER SCRIPT" IN A8. *
|
||
* *
|
||
* A9 POINTS TO WHERE INITALS ARE GOING TO BE STUFFED *
|
||
* *
|
||
* THE PROCESS THAT WE ARE WATCHING IS PASSED IN A10. *
|
||
* *
|
||
* WE WILL HAVE OUR OWN STORAGE AREA THAT CONTAINS *
|
||
* OUR OWN COPY OF THE INITIALS ENTERED. *
|
||
* *
|
||
* WE WILL SPAWN A PROCESS TO DO OUR SPRAYING. IT WILL *
|
||
* DO A COMPLETE SETUP WITH THE SCRIPTS PROVIDED. *
|
||
* WE WILL GIVE IT AN X OFFSET FOR THE CURRENT DIGIT. *
|
||
* *
|
||
* WE WILL HAVE A WORD THAT INDICATES WE ARE NOT UP TO *
|
||
* DATE. THE OTHER PROCESS WILL MAKE SURE WE HAVE *
|
||
* GOTTEN UP TO DATE BEFORE KILLING US. *
|
||
* *
|
||
**************************************************************************
|
||
SPIN_BUSY EQU PDATA ;WORD - NON ZERO MEANS WE'RE BUSY
|
||
SPIN_SCRIPT_1 EQU SPIN_BUSY+WORD_SIZE ;LONG - SETUP SCRIPT
|
||
SPIN_ERASE_SCR EQU SPIN_SCRIPT_1+LONG_SIZE ;LONG - SCRIPT FOR ERASE BRUSH
|
||
SPIN_LET_POINT EQU SPIN_ERASE_SCR+LONG_SIZE ;LONG - POINTER TO FETCHED INITS
|
||
SPIN_LETTERS EQU SPIN_LET_POINT+LONG_SIZE ;WORD - NUMBER OF LETTERS TO FETCH
|
||
SPIN_DX EQU SPIN_LETTERS+WORD_SIZE ;LONG - DISTANCE BETWEEN LETTERS
|
||
SPIN_DRONE_DONE EQU SPIN_DX+LONG_SIZE ;WORD - FLAG FROM OUR DRONE
|
||
SPIN_DISTANCE EQU SPIN_DRONE_DONE+WORD_SIZE ;WORD - DISTANCE BETWEEN HIS LETTERS
|
||
SPIN_OUR_DATA EQU SPIN_DISTANCE+WORD_SIZE ;1 BYTE PER.....OUR VERSION
|
||
|
||
SPRAY_PROC
|
||
MOVI PALETTE_SETUP_PROC,A7 ;FORK TO GUY TO FIX PALETTES
|
||
CALLA P_FORK
|
||
|
||
MOVE A9,*A13(SPIN_LET_POINT),L ;SAVE LETTER POINTER
|
||
|
||
MOVE *A8(LET_SCRIPT),A0,L ;FETCH OUR SCRIPT POINTER
|
||
MOVE A0,*A13(SPIN_SCRIPT_1),L ;SAVE IT
|
||
|
||
MOVE *A8(LET_ERASE),A0,L ;FETCH SCRIPT FOR ERASE BRUSH
|
||
MOVE A0,*A13(SPIN_ERASE_SCR),L ;SAVE IT
|
||
|
||
MOVE *A8(LET_WIDTH),A0,L ;X UNITS PER SPRAY LETTER
|
||
MOVE A0,*A13(SPIN_DX),L ;SAVE THIS
|
||
|
||
MOVE *A8(ENT_COUNT-PDATA),A0,W ;GET NUMBER OF LETTERS
|
||
* (THIS IS FROM ROM NOT PROCESS STORE)
|
||
MOVE A0,*A13(SPIN_LETTERS),W ;SAVE LETTER COUNT.
|
||
|
||
MOVE *A8(ENT_INIT_SIZE-PDATA),A0,W ;STORE LETTER TO LETTER DISTANCE
|
||
MOVE A0,*A13(SPIN_DISTANCE),W
|
||
*
|
||
* NOW SET OUR DATA TO ALL SPACES
|
||
*
|
||
MOVE A13,A1 ;POINT IN OUR PROCESS AREA
|
||
ADDI SPIN_OUR_DATA,A1 ;POINT AT OUR COPY OF LETTERS
|
||
CLR A2 ;NOT YET ENTERED = 0
|
||
*
|
||
SP_LOOP_1
|
||
MOVB A2,*A1 ;PUT ONE OUT
|
||
ADDI BYTE_SIZE,A1
|
||
DSJS A0,SP_LOOP_1 ;NOW WE HAVE ALL SPACES
|
||
*
|
||
* THIS IS THE TOP OF OUR STEADY LOOP
|
||
* FIRST INDICATE WE'RE IN SYNC WITH THE
|
||
* OTHER GUY
|
||
*
|
||
STEADY_LOOP
|
||
CLR A0
|
||
MOVE A0,*A13(SPIN_BUSY),W
|
||
|
||
SLEEP 1 ;WAIT A FRAME
|
||
*
|
||
* NOW THAT WE'RE UP.....SCAN THROUGH THE 2 COPIES OF THE
|
||
* LETTERS.
|
||
*
|
||
* FIRST LOOK FROM RIGHT TO LEFT FOR ERASURES NECESSARY
|
||
*
|
||
CHANGE_LOOP
|
||
MOVE *A13(SPIN_LETTERS),A3,W ;NUMBER OF LETTERS TO LOOK AT
|
||
MOVE A3,A0 ;OFFSET OF FIRST IS 1 LESS
|
||
DEC A0 ;A0 HAS OFFSET
|
||
|
||
MOVI BYTE_SIZE,A1 ;THIS IS DISTANCE IN OUR P-STORE
|
||
MPYU A0,A1 ;THIS IS OFFSET OF LAST BYTE
|
||
MOVE A13,A2
|
||
ADDI SPIN_OUR_DATA,A2 ;POINT A2 AT OUR DATA
|
||
ADD A1,A2 ;ADD OFFSET TO GET TO END
|
||
|
||
MOVE *A13(SPIN_DISTANCE),A6,W ;memory distance between hit bytes
|
||
MOVE A6,A1
|
||
MPYU A0,A1 ;GET TO LAST
|
||
|
||
MOVE *A13(SPIN_LET_POINT),A4,L ;HIS POINTER IN A1
|
||
ADD A4,A1 ;POINT AT LAST
|
||
|
||
CHECK_FOR_RUB
|
||
MOVB *A1,A4 ;PLAYERS
|
||
MOVB *A2,A5 ;SPRAYED
|
||
CMP A4,A5
|
||
JRZ LETS_MATCH ;DIFFERENT ONE!
|
||
*
|
||
* IF A5 IS ZERO, THIS REQUIRES SPARYING....LET OTHER LOOP CATCH IT!
|
||
*
|
||
MOVE A5,A5
|
||
JRNZ CHANGED_LETTER ;WE NEED TO REMOVE OUR PAINT
|
||
|
||
LETS_MATCH
|
||
SUB A6,A1
|
||
SUBI BYTE_SIZE,A2
|
||
DEC A0 ;KICK OFFSET
|
||
DSJS A3,CHECK_FOR_RUB
|
||
*
|
||
* NO RUBOUTS....LOOK FROM RIGHT TO LEFT FOR LETTERS TO SPRAY
|
||
*
|
||
CLR A0 ;THIS IS OFFSET
|
||
MOVE *A13(SPIN_LET_POINT),A1,L ;HIS POINTER IN A1
|
||
MOVE A13,A2
|
||
ADDI SPIN_OUR_DATA,A2 ;POINT A2 AT OUR DATA
|
||
MOVE *A13(SPIN_LETTERS),A3,W ;NUMBER OF LETTERS TO LOOK AT
|
||
MOVE *A13(SPIN_DISTANCE),A6,W ;memory distance between hit bytes
|
||
|
||
CHECK_LETS
|
||
MOVB *A1,A4 ;PLAYERS
|
||
MOVB *A2,A5 ;SPRAYED
|
||
CMP A4,A5
|
||
JRNZ CHANGED_LETTER ;DIFFERENT ONE!
|
||
|
||
ADD A6,A1
|
||
ADDI BYTE_SIZE,A2
|
||
INC A0 ;KICK OFFSET
|
||
DSJS A3,CHECK_LETS
|
||
|
||
JRUC STEADY_LOOP ;ALL MATCH....SLEEP NOW!
|
||
*
|
||
* WE HAVE A DIFFERENCE. IF THE SPRAY THERE IS NOT A SPACE
|
||
* WE MUST ERASE DOWN TO A SPACE. THE NEXT ITERATION WILL
|
||
* CAUSE US TO DRAW OVER THE SPACE.
|
||
*
|
||
* IF THE SPRAY THERE IS A SPACE, WE DRAW THE NEW LETTER.
|
||
*
|
||
|
||
CHANGED_LETTER
|
||
MOVI 1,A6
|
||
MOVE A6,*A13(SPIN_BUSY),W ;INDICATE WE'RE CATCHING UP
|
||
*
|
||
* A5 HAS WHAT IS SPRAYED WHERE WE'RE INTERESTED IN
|
||
*
|
||
MOVE A5,A5 ;IS OUR COPY BLANK?
|
||
JRZ PLOT_LETTER ;YEP...PLOT THE LETTER
|
||
*
|
||
* A5 IS NOT A SPACE....WE MUST ERASE THE ASCII A5
|
||
*
|
||
* MOVI SPACE,A6 ;INIDICATE IN OUR PROCESS
|
||
CLR A6 ;INDICATE THAT *NOW* THERE'S NOTHING
|
||
MOVB A6,*A2 ;THAT WE HAVE PUT A SPACE THERE
|
||
|
||
JSRP ERASE_A5 ;ERASE THAT LETTER
|
||
JRUC CHANGE_LOOP ;NOW COMPARE WHAT RESULTS
|
||
*
|
||
* A5 HAS NEW LETTER TO PLOT
|
||
*
|
||
PLOT_LETTER
|
||
MOVE A4,A5 ;GET NEW LETTER IN A5
|
||
MOVB A5,*A2 ;INDICATE THAT THIS IS WHAT IS SPRAYED
|
||
JSRP DRAW_A5 ;PLOT THE CHARACTER IN A5
|
||
JRUC CHANGE_LOOP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DRAW_A5 *
|
||
* ERASE_A5 *
|
||
* *
|
||
* LETTER IS IN A5. *
|
||
* LETTER NUMBER (1ST IS ZERO) IN A0. *
|
||
* FORK TO SPRAYER TO MAKE THE LETTER AND WAIT FOR IT TO *
|
||
* FINISH. *
|
||
* *
|
||
**************************************************************************
|
||
ERASE_A5
|
||
MOVE *A13(SPIN_ERASE_SCR),A8,L ;INDICATE ERASE
|
||
JRUC DRAW_A5_1
|
||
|
||
DRAW_A5
|
||
CLR A8
|
||
DRAW_A5_1
|
||
CMPI SPACE,A5 ;USE UNDERSCORE FOR SPACE.
|
||
JRNZ NOT_SPACE
|
||
MOVI UNDERSCORE,A5
|
||
NOT_SPACE
|
||
MOVE A5,A9 ;PASS CHAR IN A9
|
||
MOVE A13,A10 ;PASS OUR PROCESS STORE IN A10
|
||
MOVE A0,A11 ;PASS X OFFSET IN A11
|
||
|
||
MOVI SPRAY_DRONE,A7
|
||
CALLA P_FORK ;START UP THE PROCESS
|
||
|
||
CLR A0
|
||
MOVE A0,*A13(SPIN_DRONE_DONE),W ;NOW WAIT FOR DRONE TO FINISH
|
||
DRAW_2 SLEEP 4
|
||
MOVE *A13(SPIN_DRONE_DONE),A0,W
|
||
JREQ DRAW_2
|
||
RETP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SPRAY_DRONE *
|
||
* *
|
||
* THIS PROCESS IS CREATED TO SPRAY OUT A CHARACTER. *
|
||
* A8 = ERASE SCRIPT (ZERO FOR NONE) *
|
||
* A9 = ASCII CHARACTER *
|
||
* A10 = OTHER PROCESS WITH SOME RELEVANT DATA *
|
||
* A11 = CHARACTER NUMBER (X OFFSET AFTER SETUP SCRIPT) *
|
||
* *
|
||
* *
|
||
**************************************************************************
|
||
SPRAY_DRONE
|
||
CALLA RES_SCRL ;MAKE SURE OUR Y IS IN SYNC
|
||
MOVE *A10(SPIN_SCRIPT_1),A4,L ;GET SETUP SCRIPT
|
||
MMTM SP,A8,A9,A10,A11 ;SAVE OUR DATA
|
||
JSRP P_SCRIPT
|
||
MMFM SP,A8,A9,A10,A11 ;SAVE OUR DATA
|
||
|
||
MOVE A8,A4 ;CHANGE BRUSHES IF NEEDED
|
||
JREQ NO_BLANK_BRUSH
|
||
|
||
MMTM SP,A8,A9,A10,A11 ;SAVE OUR DATA
|
||
JSRP P_SCRIPT
|
||
MMFM SP,A8,A9,A10,A11 ;SAVE OUR DATA
|
||
|
||
NO_BLANK_BRUSH
|
||
*
|
||
* NOW WE'RE READY TO DRAW...EXCEPT....THAT WE MUST
|
||
* MOVE THE X OVER BY THE NUMBER OF CHARCTERS WE'RE DRAWING
|
||
*
|
||
MOVE *A10(SPIN_DX),A0,L ;THIS IS X UNITS PER CHAR
|
||
MPYU A0,A11 ;MULT INTO CHAR COUNT
|
||
MOVE A11,A3 ;FOR ADD SCALED A3 TO X
|
||
CALLA X_PL_SA3 ;CALL THE MODULE THAT KNOWS OFFSETS
|
||
|
||
MOVE @SPRAYS,A0,W
|
||
INC A0 ;1 MORE SPRAY GOING
|
||
MOVE A0,@SPRAYS,W ;STORE IT!
|
||
|
||
CMPI 1,A0 ;TURN ON TIME?
|
||
JRNZ ALREADY_ON ;NOPE
|
||
SOUND1 START_SPRAY ;START SPRAY SOUND
|
||
|
||
ALREADY_ON
|
||
MOVE A9,A0 ;GET SET FOR SPRAY
|
||
ANDI BYTE_MASK,A0 ;CUZ I'M PARANOID
|
||
MOVE A10,A4 ;SAVE OTHER PROCESS PTR
|
||
*
|
||
* WE'RE ABOUT TO START A SPRAY...START SOUND
|
||
*
|
||
JSRP SPR_CHAR
|
||
|
||
MOVE @SPRAYS,A0,W
|
||
DEC A0 ;1 MORE SPRAY GOING
|
||
MOVE A0,@SPRAYS,W ;STORE IT!
|
||
JRNZ DONT_SHUTOFF
|
||
|
||
SOUND1 KIL_SPRY ;TURN IT OFF!
|
||
|
||
DONT_SHUTOFF
|
||
MOVI 1,A0
|
||
MOVE A0,*A4(SPIN_DRONE_DONE),W
|
||
JAUC SUCIDE ;AND DIE!
|
||
|
||
START_SPRAY
|
||
.WORD >F3DE,>10,>80AD,0 ;START SPRAY PAINT
|
||
KIL_SPRY
|
||
.WORD >F3DE,>10,>807F,0 ;KILL SPRAY PAINT
|
||
|
||
**************************************************************************
|
||
* *
|
||
* PALETTE_SETUP_PROC *
|
||
* *
|
||
* THIS PROCESS IS CREATED TO SETUP THE PALETTES *
|
||
* FOR THE SPRAYERS....THIS WILL KEEP ANTS OFF *
|
||
* THE SCREEN EACH LETTER. *
|
||
* *
|
||
**************************************************************************
|
||
PALETTE_SETUP_PROC
|
||
MOVI SC_CRAM,A4
|
||
JSRP P_SCRIPT
|
||
JAUC SUCIDE ;THIS IS ALL WE DO!
|
||
|
||
**************************************************************************
|
||
* *
|
||
* HAND_PART_2 *
|
||
* *
|
||
* THIS IS CALLED TO CHANGE THE POSITION OF THE 2ND PART *
|
||
* OF THE HAND BASED ON THE POSITION OF THE 1ST PART OF THE *
|
||
* HAND. THE 1ST PART IN POINTED TO BY A8. *
|
||
* *
|
||
* THE 2ND PART IS IN THE PROCESS STORE AREA AT ENT_HAND_OBJ *
|
||
* *
|
||
**************************************************************************
|
||
HAND_PART_2
|
||
MMTM SP,A0,A1
|
||
MOVE *A13(ENT_HAND_OBJ),A0,L ;GET PART 2 POINTER
|
||
MOVE *A8(OXVAL),A1,L ;GET X OF MAIN PART
|
||
ADDI -21*TABLE_UNIT,A1
|
||
MOVE A1,*A0(OXVAL),L
|
||
|
||
MOVE *A8(OYVAL),A1,L ;GET Y OF MAIN PART
|
||
ADDI 32H*TABLE_UNIT,A1
|
||
MOVE A1,*A0(OYVAL),L
|
||
MMFM SP,A0,A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* HANDLE_BUTTONS *
|
||
* *
|
||
* THIS IS CALLED TO WATCH FOR AND ACT ON THE BUTTONS FOR *
|
||
* DOING THE ENTERING. *
|
||
* *
|
||
**************************************************************************
|
||
HANDLE_BUTTONS
|
||
MOVE *A13(ENT_ANI_TIMER),A0,W ;ARE WE DEBOUNCING?
|
||
JREQ NOT_BOUNCING
|
||
DEC A0 ;COUNT DOWN DEBOUNCE TIMER
|
||
MOVE A0,*A13(ENT_ANI_TIMER),W
|
||
CALLR FETCH_BUTTONS ;KEEP READING BUTTONS TO
|
||
* ;NUMB OUT BOUNCING STATES
|
||
JRUC NO_BUT_WORK ;RETURN NOT FINISHED YET.
|
||
*
|
||
* FIRST ESTABLISH IF WE'RE LOOKING FOR OPEN OR CLOSE.
|
||
* IF ENT_PRESSED ZERO WE'RE LOOKING FOR CLOSE.
|
||
* IF ITS NON-ZERO WE'RE LOOKING FOR OPEN ON THAT BUTTON
|
||
*
|
||
NOT_BOUNCING
|
||
MOVE *A13(ENT_PRESSED),A2,W ;WELL?
|
||
JREQ HB_OPEN ;WE'RE OPEN.....HANDLE 1 WAY
|
||
*
|
||
* WE'RE CLOSED....WATCH THE SWITCH INDICATE BY A2 FOR OPEN.
|
||
*
|
||
CALLR FETCH_BUTTONS ;A0 HAS CURRENT BUTTONS
|
||
|
||
AND A2,A0 ;IS THE ONE WE WANT CLOSED?
|
||
JRNZ NO_BUT_WORK ;STILL CLOSED....HANG STATE.
|
||
*
|
||
* BUTTON WENT FROM CLOSED TO OPEN.
|
||
*
|
||
CLR A0
|
||
MOVE A0,*A13(ENT_PRESSED),W ;INDIATE WE'RE LOOKING AGAIN!
|
||
|
||
JRUC START_DEBOUNCE ;AND NULLIFY QUICK HIT
|
||
*
|
||
* WE'RE LOOKING FOR CLOSURES
|
||
*
|
||
HB_OPEN
|
||
MOVE *A13(ENT_Y_OFFSET),A0,L ;DECAY HAND BACK TO BASE
|
||
JRNN NO_HAND_ANI ;ITS THERE!
|
||
ADDI 5*TABLE_UNIT,A0 ;ADD A UNIT
|
||
JRN STORE_AS_IS ;STILL NEGATIVE?
|
||
CLR A0 ;WENT POSITIVE...MAKE ZERO
|
||
STORE_AS_IS
|
||
MOVE A0,*A13(ENT_Y_OFFSET),L
|
||
|
||
NO_HAND_ANI
|
||
CALLR FETCH_BUTTONS ;LOOK FOR CLOSED THIS FRAME
|
||
NOT A1 ;OPEN LAST FRAME
|
||
AND A1,A0 ;CLOSED THIS FRAME
|
||
ANDI BUTTON_BITS,A0 ;JUST IN THESE BITS.
|
||
JREQ NO_BUT_WORK ;NO ONE CLOSED....EXIT
|
||
|
||
MOVI 1,A1 ;WALK OUT TO THE 1ST ONE
|
||
LOOK_FOR_BIT
|
||
RL 1,A1
|
||
MOVE A1,A2
|
||
AND A0,A2
|
||
JREQ LOOK_FOR_BIT
|
||
*
|
||
* A1 HAS THE BUTTON THAT'S PRESSED
|
||
*
|
||
MOVE A1,*A13(ENT_PRESSED),W ;TELL PROCESS THIS IS THE ONE
|
||
|
||
MOVI -10*TABLE_UNIT,A0
|
||
MOVE A0,*A13(ENT_Y_OFFSET),L ;THIS WILL PUNCH BUTTON
|
||
|
||
MOVE *A13(ENT_FROB_OBJ),A0,L ;GET OBJECT WE'RE PRESSING
|
||
JRZ SKIP_X_ADJ ;NONE THERE....SKIP
|
||
|
||
MOVE *A0(OXVAL),A2,L ;GET X POSITION OF LETTER
|
||
MOVE *A0(OIMG),A1,L ;GET IMAGE POINTER
|
||
MOVE *A1,A1,W ;GET WIDTH
|
||
SLL 15,A1 ;HALF WIDTH
|
||
ADD A1,A2 ;ADD THIS IN.
|
||
SUBI HAND_X_ADJ,A2 ;MOVE DISTANCE SO HAND LINES UP
|
||
MOVE *A13(ENT_X_COR),A1,L ;GET BASE UPPER LEFT
|
||
SUB A1,A2 ;FORM X OFFSET FROM THIS
|
||
MOVE A2,A9 ;AND PLACE THIS IN X OFFSET REG!
|
||
|
||
SKIP_X_ADJ
|
||
CALLR ACT_ON_BUTTON ;DO AN ACTION
|
||
|
||
START_DEBOUNCE
|
||
MOVI 2,A0 ;3 FRAME DEBOUNCE
|
||
MOVE A0,*A13(ENT_ANI_TIMER),W ;STORE IT
|
||
MOVE *A13(ENT_COUNT),A0,W ;DID ACTION SAY EXIT?
|
||
JREQ EXIT_DETECTED
|
||
|
||
NO_BUT_WORK
|
||
CLRC ;RETURN "LOOP"
|
||
RETS
|
||
|
||
EXIT_DETECTED
|
||
SETC ;RETURN EXIT CODE
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* ACT_ON_BUTTON *
|
||
* *
|
||
* THIS IS CALLED ON THE FOREWARD PRESS OF ANY BUTTON *
|
||
* DURING ENTER YOUR INITIALS. ITS JOB IS TO *
|
||
* MAKE NECESSARY ADJUSTMENTS TO THE PROCESS AREA *
|
||
* TO REFLECT THE BUTTON PRESS. THIS IS INVOLOVED *
|
||
* ONLY WITH DATA CHANGES AND NOT THE PHYSICAL ANIMATION *
|
||
* AND DEBOUNCE. *
|
||
* *
|
||
**************************************************************************
|
||
ACT_ON_BUTTON
|
||
CALLR OP_P ;OPERATOR?
|
||
JRNZ AB00 ;NOPE
|
||
|
||
SOUND1 BEEP_1 ;MAKE A BEEP.
|
||
|
||
AB00 MOVE *A13(ENT_FROB_ASCII),A0,W ;GET THE "LETTER"
|
||
CMPI FONT_SPACE,A0 ;IS IT A SPACE?
|
||
JRNE AB1 ;NOPE
|
||
MOVI SPACE,A0 ;REPLACE WITH A SPACE
|
||
JRUC AB2 ;AND CONTINUE
|
||
|
||
AB1 CMPI FONT_RUB,A0 ;RUB?
|
||
JREQ DO_RUBOUT ;NO
|
||
|
||
CMPI FONT_END,A0 ;END?
|
||
JREQ DO_END
|
||
|
||
CMPI FONT_CR,A0 ;CR FOR OPERATOR IS "END"
|
||
JREQ DO_END
|
||
*
|
||
* A0 HAS A CHARACTER TO ENTER
|
||
*
|
||
AB2 MOVE *A13(ENT_COUNTDOWN),A1,W ;ANY LEFT TO GET?
|
||
JREQ NO_ACTION ;NOPE....WE HAVE A PROBLEM
|
||
|
||
MOVE *A13(ENT_INIT_PTR),A2,L ;GET PLACE TO PUT INITIAL
|
||
MOVB A0,*A2 ;PUT IT OUT
|
||
MOVE *A13(ENT_INIT_SIZE),A3,W
|
||
ADD A3,A2 ;PUSH POINTER TO NEXT INITIAL
|
||
MOVE A2,*A13(ENT_INIT_PTR),L ;PUT POINTER BACK IN MEMORY
|
||
|
||
DEC A1 ;1 LESS IN COUNTER
|
||
MOVE A1,*A13(ENT_COUNTDOWN),W ;PUT COUNTER BACK
|
||
|
||
NO_ACTION
|
||
RETS ;AND WE'RE DONE!
|
||
|
||
DO_RUBOUT
|
||
MOVE *A13(ENT_COUNTDOWN),A1,W ;GET NUMBER WE NEED
|
||
MOVE *A13(ENT_COUNT),A2,W ;IS THIS NUMBER WE STARTED NEEDING?
|
||
CMP A1,A2
|
||
JREQ NO_ACTION ;YEP....NO ACTION!
|
||
|
||
MOVE *A13(ENT_INIT_PTR),A3,L ;GET POINTER TO WHERE WE STASHED
|
||
MOVE *A13(ENT_INIT_SIZE),A4,W ;GET DISTANCE BETWEEN
|
||
SUB A4,A3 ;MOVE POINTER TO LAST LETTER
|
||
CLR A4 ;PUT "NULL" AT CURRENT LETTER
|
||
MOVB A4,*A3
|
||
MOVE A3,*A13(ENT_INIT_PTR),L ;PUT POINTER BACK
|
||
INC A1
|
||
MOVE A1,*A13(ENT_COUNTDOWN),W ;PUT NEW COUNT BACK
|
||
RETS
|
||
|
||
DO_END
|
||
CLR A0
|
||
MOVE A0,*A13(ENT_COUNT),W ;SET START COUNT TO ZERO TO
|
||
RETS ;SIGNAL END RECEIVED.
|
||
|
||
BEEP_1 .WORD >F3DF,>10,>80A2,0 ;LOW BEEP
|
||
|
||
**************************************************************************
|
||
* *
|
||
* DO_FROB *
|
||
* *
|
||
* THIS IS CALLED TO TAKE CARE OF THE FROB AND THE THING *
|
||
* THE FROB IS ON. THE FROB OBJECT IS IN A10. THE *
|
||
* HAND OBJECT IS IN A8. WE WANT TO FIND THE "LETTER" *
|
||
* OBJECT THAT IS CLOSEST TO A PARTICULAR OFFSET OF *
|
||
* THE HAND. WE MOVE THE FROB TO BOX THAT ITEM, AND *
|
||
* HIGHLIGHT THAT LETTER (BY CHANGING ITS CONSTANT). *
|
||
* *
|
||
* WE ARE RESPONSIBLE FOR CHANGING THE LAST ONE THAT *
|
||
* WAS HIGHLIGHTED TO ITS NORMAL COLOR. *
|
||
* *
|
||
**************************************************************************
|
||
DO_FROB MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7
|
||
MOVE *A8(OXVAL),A1,L ;GET POSITION OF HAND
|
||
MOVE *A8(OYVAL),A2,L
|
||
ADDI HAND_HOT_DX,A1 ;MOVE TO "HOT" POINT
|
||
ADDI HAND_HOT_DY,A2
|
||
MOVE *A13(ENT_Y_OFFSET),A3,L ;GET DELTA Y
|
||
SUB A3,A2 ;"UN-DO" ANIMATION TO GET REAL POINT
|
||
|
||
MOVE *A13(ENT_OLIST),A3,L ;WALK THROUGH OUR OBJECTS
|
||
JRZ NO_FROB_NOW ;DON'T CHANGE IT.
|
||
|
||
DF1 MOVE *A3(OID),A7,W ;GET THE ID OF THE CURRENT GUY
|
||
* CMPI LET_A,A7 ;IS IT A LETTER OF SPECIAL CHAR?
|
||
CMPI EX_PT,A7 ;IS IT A LETTER OF SPECIAL CHAR?
|
||
JRLO SKIP_OBJ ;NOPE...SKIP THIS ONE
|
||
|
||
MOVE A1,A4 ;MOVE HAND X TO DESTRUCTABLE PLACE
|
||
MOVE *A3(OXVAL),A5,L ;GET THE X OF THIS LETTER
|
||
*
|
||
* NOW FIND CENTER OF THE IMAGE AT THIS POINT
|
||
*
|
||
MOVE *A3(OIMG),A6,L ;THIS IS IMAGE POINTER
|
||
MOVE *A6,A6,W ;THIS IS DX IN PIXELS
|
||
SLL 15,A6 ;ALIGN, BUT DIVIDE BY 2!
|
||
ADD A6,A5 ;THIS IS X WE ARE INTERESTED IN!
|
||
|
||
SUB A5,A4 ;THIS WILL BE POS IF HAND IS ON RIGHT
|
||
JRN SKIP_OBJ ;THIS IS A NO GO!
|
||
*
|
||
* THIS IS WHERE SPECIAL CASE FOR RUB, SPACE, END WILL GO
|
||
*
|
||
CMPI FONT_SPACE,A7 ;ARE WE 3 SPECIAL GUYS?
|
||
JRLO NOT_RUB ;YEP...USE LARGER X
|
||
|
||
CMPI CLOSE_FOR_RUB,A4 ;RUB HAS A LARGER RANGE!
|
||
JRLS RUB_IN_RANGE ;WE'RE CLOSE ENOUGH FOR RUB
|
||
|
||
NOT_RUB
|
||
CMPI CLOSE_X,A4 ;ARE WE CLOSE ENOUGH IN X TO CONSIDER?
|
||
JRHI SKIP_OBJ ;NOPE....TRY NEXT OBJECT
|
||
|
||
RUB_IN_RANGE
|
||
MOVE A2,A4
|
||
|
||
MOVE *A3(OYVAL),A5,L ;GET THE Y OF THIS LETTER
|
||
SUB A5,A4 ;THIS WILL BE POS IF HAND IS ON RIGHT
|
||
JRN SKIP_OBJ ;THIS IS A NO GO!
|
||
|
||
CMPI CLOSE_Y,A4 ;ARE WE CLOSE ENOUGH IN X TO CONSIDER?
|
||
JRHI SKIP_OBJ ;NOPE....TRY NEXT OBJECT
|
||
*
|
||
* WE HAVE THE LETTER TO FROB AROUND
|
||
*
|
||
MOVE *A13(ENT_FROB_OBJ),A6,L ;GET LAST FROB
|
||
JREQ FROB_UNDEF ;THIS IS THE 1ST FROB
|
||
CMP A3,A6 ;SAME FROB?
|
||
JREQ NO_FROB_NOW ;YEP....NOTHING TO DO
|
||
|
||
MOVE *A13(ENT_CONST),A0,W ;GET THE CONSTANT
|
||
MOVE A0,*A6(OCONST),W ;RESTORE "BACKGROUND" COLOR FOR LETTER
|
||
|
||
FROB_UNDEF
|
||
MOVE A3,*A13(ENT_FROB_OBJ),L ;STORE THE CURRENT ONE
|
||
MOVE A7,*A13(ENT_FROB_ASCII),W ;STORE THE "ASCII" FOR THIS ONE
|
||
*
|
||
* A7 HAS THE ASCII OR SPECIAL CODE TO FROB AROUND
|
||
* NOW GET A DX AND DY FOR THIS CODE
|
||
*
|
||
MOVI FROB_COLOR,A0
|
||
MOVE A0,*A3(OCONST),W ;MAKE CURRENT LETTER GLOW
|
||
JRUC NO_FROB_NOW ;WE'RE READY TO EXIT.
|
||
|
||
SKIP_OBJ MOVE *A3(OSLINK),A3,L ;WALK TO NEXT
|
||
JRNZ DF1
|
||
|
||
NO_FROB_NOW
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_FROB_DY_DX *
|
||
* *
|
||
* THIS IS CALLED BY DO_FROB TO GET AN OFFSET TO CENTER *
|
||
* THE BOX AROUND THE VARIOUS FIGURES. A FIXED OFFSET *
|
||
* SHOULD WORK FOR A-Z.....THE SP RUB AND END WILL *
|
||
* REQUIRE THEIR OWN SPECIAL OFFSETS. *
|
||
* *
|
||
**************************************************************************
|
||
*GET_FROB_DY_DX
|
||
* MOVI -9*TABLE_UNIT,A1
|
||
* MOVI -2*TABLE_UNIT,A2
|
||
* RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* LIMIT_RANGE *
|
||
* *
|
||
* THIS IS CALLED TO COMPARE THE NUMBER IN A0 *
|
||
* TO THE RANGE (UNSIGNED) IN A3,A4. IF IT IS *
|
||
* SMALLER THAN A3 WE RETURN A3 IN A0. IF IT IS *
|
||
* LARGER THAN A4 WE RETURN A4 IN A0. ELSE WE *
|
||
* RETURN A0 AS IS. *
|
||
* *
|
||
**************************************************************************
|
||
LIMIT_RANGE
|
||
CMP A3,A0 ;IS A0 TOO LOW
|
||
JRHS LR1 ;NOPE
|
||
|
||
MOVE A3,A0
|
||
LR1 CMP A4,A0
|
||
JRLS LR2
|
||
|
||
MOVE A4,A0
|
||
LR2 RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_DY_DX *
|
||
* *
|
||
* THIS IS CALLED IN STEADY STATE FOR ENTER YOUR INITIALS. *
|
||
* IT CHECKS THE JOYSTICK AND RETURNS THE DISTANCE *
|
||
* TO MOVE IN X IN A1, AND THE DISTANCE IN Y IN A2. *
|
||
* *
|
||
* THIS DOES NOT HANDLE THE LIMITING. THIS IS *
|
||
* DONE BY THE CALLER. *
|
||
* *
|
||
**************************************************************************
|
||
GET_DY_DX
|
||
MMTM SP,A0,A3
|
||
CLR A1
|
||
CLR A2
|
||
|
||
CALLR GET_STICK_IN_A3
|
||
|
||
MOVE A3,A0 ;COPY
|
||
ANDI 1,A0 ;IS UP PRESSED?
|
||
JRZ NOT_UP
|
||
|
||
ADDI -3*TABLE_UNIT,A2 ;
|
||
|
||
NOT_UP
|
||
MOVE A3,A0
|
||
ANDI 2,A0
|
||
JRZ NOT_DOWN
|
||
|
||
ADDI 3*TABLE_UNIT,A2
|
||
|
||
NOT_DOWN
|
||
MOVE A3,A0
|
||
ANDI 4,A0
|
||
JRZ NOT_LEFT
|
||
|
||
ADDI -4*TABLE_UNIT,A1
|
||
|
||
NOT_LEFT
|
||
ANDI 8,A3
|
||
JRZ NOT_RIGHT
|
||
|
||
ADDI 4*TABLE_UNIT,A1
|
||
NOT_RIGHT
|
||
MMFM SP,A0,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* FETCH_BUTTONS *
|
||
* *
|
||
* THIS IS CALLED TO READ THE CURRENT STATE OF THE *
|
||
* CURRENT PLAYERS BUTTONS INTO THE PROCESS *
|
||
* AREA. THE OLD BUTTONS ARE RETURNED IN A1. *
|
||
* THE NEW BUTTONS ARE RETURNED IN A0 AND *
|
||
* STORED IN THE PROCESS AREA. *
|
||
* *
|
||
* WE ALSO RETURN A COMPARE OF THE LAST AND CURRENT STATE *
|
||
* *
|
||
**************************************************************************
|
||
FETCH_BUTTONS
|
||
MMTM SP,A3
|
||
CALLR GET_STICK_IN_A3 ;GET A NEW STICK
|
||
|
||
MOVE A3,A0
|
||
ANDI BYTE_MASK,A0 ;JUST KEEP THIS PLAYER
|
||
|
||
MOVE *A13(ENT_LAST_BUTTON),A1,W ;SHOW LAST STATE
|
||
CMP A0,A1 ;RETURN THE COMPARISON
|
||
MOVE A0,*A13(ENT_LAST_BUTTON)
|
||
MMFM SP,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* GET_STICK_IN_A3 *
|
||
* *
|
||
* THIS GETS THE 8 SWITCHES FOR THE CURRENT PLAYER *
|
||
* IN THE LOW BYTE OF A3. THE HARDWARE IS 1 FOR OPEN, *
|
||
* BUT THIS ROUTINE RETURNS: *
|
||
* *
|
||
* BIT = 0 MEANS SWITCH OPEN *
|
||
* BIT = 1 MEANS SWITCH CLOSED *
|
||
* *
|
||
* THEY READ AS FOLLOWS: *
|
||
* *
|
||
* MSB LSB *
|
||
* ROCKET JUMP FIRE CROUCH RIGHT LEFT DOWN UP *
|
||
* *
|
||
**************************************************************************
|
||
GET_STICK_IN_A3
|
||
MMTM SP,A0
|
||
MOVE *A13(ENT_STICK),A0,W ;GET THE SHIFT COUNT
|
||
MOVE @SWITCH,A3,W ;READ THE STICK
|
||
NEG A0 ;BRAIN DAMAGE SRL USES 2'S COMPLE.
|
||
SRL A0,A3 ;SHIFT BASED ON PLAYER NUMBER
|
||
NOT A3 ;INVERT SO 1 IS CLOSED
|
||
ANDI BYTE_MASK,A3 ;KEEP JUST THIS PLAYER'S BYTE
|
||
MMFM SP,A0
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* NEW_OBJ *
|
||
* *
|
||
* A14 = STFOBJ POINTER *
|
||
* A1 = RELATIVE X OFFSET FROM UPPER LEFT OF AREA *
|
||
* A2 = RELATIVE Y OFFSET FROM UPPER LEFT OF AREA *
|
||
* *
|
||
* RETURN A0 POINTS AT NEW OBJECT *
|
||
* .EQ. IF FAIL *
|
||
* .NE. IF OK *
|
||
* *
|
||
* CALL INSOBJ AFTER WE RETURN *
|
||
* *
|
||
**************************************************************************
|
||
NEW_OBJ
|
||
CALLA GPALOBJ ;GET THE STUFF NECESSARY
|
||
JREQ RET_FAIL
|
||
CALLA STFOBJ ;STUFF IT
|
||
|
||
CALLR LINK_TO_ME ;STRING IT ONTO OUR LIST
|
||
CALLR STUFF_OBJECT_OFFSET ;SET IT THERE!
|
||
MOVE A0,A0 ;RETURN .NE.
|
||
RET_FAIL
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* ADD_ALPHABET *
|
||
* *
|
||
* THIS IS CALLED TO GET ALL OF THE LETTER OBJECTS. *
|
||
* *
|
||
**************************************************************************
|
||
ADD_ALPHABET
|
||
MMTM SP,A1,A2,A3,A4,A5,A6,A7
|
||
|
||
CALLR OP_P ;IS IT THE OPERATOR
|
||
JRZ ADD_OPABET ;YEP...PUT HIS SET OUT!
|
||
|
||
MOVI ALPHA_Y,A2
|
||
MOVI LET_A,A3 ;THIS IS THE "CURRENT" LETTER
|
||
MOVI ALPHA_ROWS,A4 ;THIS IS ROW COUNTER
|
||
NEXT_ROW
|
||
MOVI ALPHA_X,A1 ;RESET X TO LEFT MARGIN
|
||
MOVI ALPHA_COLS,A5
|
||
NEXT_LET
|
||
MOVI RD15FONT,A6 ;POINT AT C-SET
|
||
CALLR SETUP_LETTER ;SETUP THIS LETTER
|
||
ADDI ALPHA_DX,A1 ;PUSH TO NEXT X POSITION
|
||
CMPI LET_Z,A3 ;DID WE JUST DO THE Z?
|
||
JREQ SPECIAL_LETS ;YEP....DO THE ODDBALLS
|
||
INC A3 ;NEXT ASCII LETTER
|
||
DSJS A5,NEXT_LET
|
||
|
||
ADDI ALPHA_DY,A2 ;NEXT ROW POSITION
|
||
DSJS A4,NEXT_ROW
|
||
|
||
SPECIAL_LETS
|
||
MOVI FONT_END,A7 ;LAST LETTER WILL BE "END"
|
||
FINISH_OP
|
||
ADDI Z_TO_SPACE,A1 ;ADD EXTRA
|
||
ADDI SPACE_DY,A2 ;PUSH SPACE DOWN A LITTLE
|
||
MOVI FONT_SPACE,A3 ;POINT AT SPACE
|
||
CALLR SETUP_LETTER ;SETUP THIS LETTER
|
||
|
||
SUBI SPACE_DY,A2 ;RESTORE Y TO "PRE" SPACE
|
||
ADDI SPACE_TO_RUB,A1 ;PUSH TO RUB X POSITION
|
||
MOVI FONT_RUB,A3
|
||
CALLR SETUP_LETTER ;SETUP THIS LETTER
|
||
|
||
ADDI RUB_TO_END,A1 ;DISTANCE TO "END" POSITION
|
||
MOVE A7,A3 ;GET "LAST" SYMBOL.
|
||
CALLR SETUP_LETTER
|
||
|
||
MMFM SP,A1,A2,A3,A4,A5,A6,A7
|
||
RETS
|
||
|
||
OP_COLS EQU 23
|
||
|
||
**************************************************************************
|
||
* *
|
||
* ADD_OPABET *
|
||
* *
|
||
* THIS IS CALLED TO PUT OUT THE CHARACTER SET FOR THE *
|
||
* OPERATOR. IT USES ALOT MORE OR THE CHARACTERS! *
|
||
* *
|
||
**************************************************************************
|
||
ADD_OPABET
|
||
MOVI OP_TABLE,A7
|
||
MOVI ALPHA_Y,A2
|
||
MOVI ALPHA_ROWS,A4 ;THIS IS ROW COUNTER
|
||
NEXT_ROW1
|
||
MOVI ALPHA_X,A1 ;RESET X TO LEFT MARGIN
|
||
MOVI OP_COLS,A5
|
||
NEXT_LET1
|
||
MOVB *A7,A3 ;FETCH NEXT LETTER
|
||
JRZ OP_LETS_DONE ;NO MORE!
|
||
ANDI BYTE_MASK,A3 ;KILL SIGN EXTEND
|
||
ADDI BYTE_SIZE,A7 ;PUSH THE POINTER
|
||
|
||
MOVI RD15FONT,A6 ;POINT AT C-SET
|
||
CALLR SETUP_LETTER ;SETUP THIS LETTER
|
||
ADDI ALPHA_DX,A1 ;PUSH TO NEXT X POSITION
|
||
DSJS A5,NEXT_LET1
|
||
|
||
ADDI ALPHA_DY,A2 ;NEXT ROW POSITION
|
||
DSJS A4,NEXT_ROW1
|
||
|
||
OP_LETS_DONE
|
||
MOVI FONT_CR,A7 ;"CR" SYMBOL REPLACES END
|
||
JRUC FINISH_OP ;THIS WILL WRAP IT UP!
|
||
|
||
**************************************************************************
|
||
* *
|
||
* OP_P *
|
||
* *
|
||
* THIS IS CALLED TO SEE IF THE CURRENT GET_LET *
|
||
* RUNNING IS FOR THE OPERATOR MESSAGE. *
|
||
* *
|
||
* .EQ. YES *
|
||
* .NE. NO *
|
||
* *
|
||
**************************************************************************
|
||
OP_P MMTM SP,A0
|
||
MOVE *A13(ENT_Y_COR),A0,L ;GET THE Y BASE
|
||
CMPI OP_Y,A0
|
||
MMFM SP,A0
|
||
RETS
|
||
|
||
OP_TABLE .STRING "ABCDEFGHI123"
|
||
.BYTE ASCII_DQ
|
||
.BYTE FONT_RQUOTE
|
||
.STRING "'.,!?()-/"
|
||
.STRING "JKLMNOPQR456"
|
||
.STRING "#$%&:;<=>[]"
|
||
.STRING "STUVWXYZ"
|
||
.BYTE FONT_SPACE
|
||
.STRING "7890"
|
||
.STRING "^_{}|"
|
||
.BYTE FONT_EPOUND
|
||
.BYTE 0
|
||
.EVEN
|
||
|
||
**************************************************************************
|
||
* *
|
||
* SETUP_LETTER *
|
||
* *
|
||
* THIS IS CALLED TO GET AN OBJECT FOR A LETTER. *
|
||
* A1,A2 HAS RELATIVE OFFSET POSITON FOR LETTER. *
|
||
* A3 IS THE ASCII REP OF THE LETTER. *
|
||
* A6 HAS FONT LIST OF LETTERS (E.G. RD15FONT) *
|
||
* *
|
||
**************************************************************************
|
||
SETUP_LETTER
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A14
|
||
MOVE A3,A7 ;SAVE ASCII IN A7
|
||
SUBI EX_PT,A3 ;EXPT IS FIRST CHAR.....NOW WE'RE AT BASE
|
||
JRC BAD_LETTER ;LETTER TOO LOW FOR SET
|
||
|
||
SLL 5,A3 ;MAKE LONG WORD OFFSET
|
||
ADD A3,A6 ;NOW A6 POINTS AT IMAGE STRUCTURE.
|
||
MOVE *A6,A6,L ;FETCH THE IMAGE STRUCTURE
|
||
*
|
||
* A6 POINTS AT X,Y WIDTH IN PIXELS.
|
||
*
|
||
MOVI ALPHA_DX,A8 ;THIS IS INTER CHARACTER WIDTH
|
||
MOVE *A6,A0,W ;GET THE X WIDTH OF LETTER
|
||
SLL 16,A0 ;SHIFT UP TO PIXEL UNITS
|
||
SUB A0,A8 ;THIS IS EXCESS WHITESPACE
|
||
SRA 1,A8 ;THIS IS AMOUNT TO INDENT (COULD BE NEGATIVE!)
|
||
ADD A8,A1 ;ADD THIS TO THE PASSED X POSITION
|
||
|
||
MOVI LETTER_TEMPLATE,A14 ;POINT AT STUFF FOR OBJECT
|
||
|
||
CALLA GETOBJ ;GET AN OBJECT PALETTE AND OBJECT
|
||
JREQ BAD_LETTER ;CAN'T GET OBJECT....EXIT
|
||
|
||
MOVE A0,A3 ;OBJECT IN A3
|
||
|
||
MOVI NARCS,A0 ;USE NARCS PALETTE
|
||
CALLA GETFPAL ;GET A PALETTE
|
||
|
||
JRZ NO_PALETTE ;COULD NOT GET THE PALETTE
|
||
MOVE A0,@CURPAL,W ;STUFF THIS IN CURRENT PAL
|
||
|
||
MOVE A3,A0 ;GET OBJECT IN A0
|
||
MOVI LETTER_TEMPLATE,A14 ;SET FOR STUFFING
|
||
CALLA STFOBJ ;STUFF SOME STUFF
|
||
CALLR STUFF_OBJECT_OFFSET ;ADD IN A1, A2 AND STORE OFFSET
|
||
|
||
MOVE A7,*A0(OID),W ;PUT ASCII LETTER AS THE ID
|
||
|
||
MOVE A6,A1 ;GIVE IMAGE POINTER FOR ANI
|
||
MOVE A0,A8 ;OBJECT STRUCTURE FOR ANI
|
||
MOVE *A0(OFLAGS),A4,W ;FETCH THE OFLAGS
|
||
CALLA ANI ;SET NEW ANIMATION PICTURE
|
||
|
||
MOVE *A13(ENT_CONST),A1,W ;GET THE CONSTANT
|
||
MOVE A1,*A0(OCONST),W ;PUT IN OBJECT BLOCK
|
||
|
||
CALLA INSOBJ ;NOW PUT ON OBJECT LIST
|
||
CALLR LINK_TO_ME ;LINK IT IN SO WE HAVE IT!
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A14
|
||
RETS
|
||
*
|
||
* ERROR EXITS
|
||
*
|
||
NO_PALETTE
|
||
MOVE A3,A0 ;GET OBJECT POINTER BACK IN A0
|
||
CALLA FREEOBJ
|
||
|
||
BAD_LETTER
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A14
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STUFF_OBJECT_OFFSET *
|
||
* *
|
||
* THIS IS CALLED TO TAKE A NEWLY CREATED OBJECT IN A0 *
|
||
* AND TO POSITION IT AT X=A1, Y=A2 AWAY FROM OUR UPPER *
|
||
* LEFT CORNER. *
|
||
* *
|
||
**************************************************************************
|
||
STUFF_OBJECT_OFFSET
|
||
MMTM SP,A1,A2
|
||
CALLR ADD_BASE_TO_A1_A2
|
||
MOVE A1,*A0(OXVAL),L ;STORE IN OBJECT
|
||
MOVE A2,*A0(OYVAL),L ;STORE IN OBJECT
|
||
MMFM SP,A1,A2
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* ADD_BASE_TO_A1_A2 *
|
||
* *
|
||
* THIS CHANGES A1,A2 FROM AN X,Y OFFSET (FROM *
|
||
* OUR UPPER LEFT CORNER) TO ABSOULE X AND Y *
|
||
* COORDINATES BY ADDING IN THE UPPER LEFT CORNER. *
|
||
* *
|
||
**************************************************************************
|
||
ADD_BASE_TO_A1_A2
|
||
MMTM SP,A3
|
||
MOVE *A13(ENT_X_COR),A3,L ;GET X FOR CORNER
|
||
ADD A3,A1 ;MOVE IN BY A1
|
||
|
||
MOVE *A13(ENT_Y_COR),A3,L ;GET Y FOR CORNER
|
||
ADD A3,A2 ;MOVE IN BY A2
|
||
MMFM SP,A3
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* LINK_TO_ME *
|
||
* *
|
||
* THIS IS CALLED TO LINK THE OBJECT BLOCK IN A0 *
|
||
* TO THE LIST FOR THE CONTROLLING PROCESS. *
|
||
* *
|
||
* THE LIST STARTS AT END_OLIST OFFSET IN THE *
|
||
* CONTROLLING PROCESS STORE AREA. *
|
||
* *
|
||
**************************************************************************
|
||
LINK_TO_ME
|
||
MMTM SP,A1
|
||
MOVE *A13(ENT_OLIST),A1,L ;GET THE LIST POINTER
|
||
MOVE A1,*A0(OSLINK),L ;STORE OUR LIST AS HIS PTR
|
||
MOVE A0,*A13(ENT_OLIST),L ;STORE HIM AS HEAD OF LIST
|
||
MMFM SP,A1
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STUFF_ENT_PDATA *
|
||
* *
|
||
* THIS IS CALLED TO STUFF THE ROM DATA INTO THE *
|
||
* ENTRY PROCESS AREA. *
|
||
* *
|
||
* A8 = DATA FOR AREA *
|
||
* *
|
||
**************************************************************************
|
||
STUFF_ENT_PDATA
|
||
MMTM SP,A8,A1,A2
|
||
MOVE A13,A1 ;USE A1 FOR PROCESS AREA
|
||
ADDI PDATA,A1 ;POINT A1 AT PDATA
|
||
MOVI ENT_STRUCT_IN_WORDS,A2 ;THIS IS COUNT OF WHAT TO MOVE
|
||
STUFF1 MOVE *A8+,*A1+,W
|
||
DSJS A2,STUFF1
|
||
MMFM SP,A8,A1,A2
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* E_TITLES *
|
||
* *
|
||
* THIS IS CALLED BEFORE ENTER YOUR INITIALS TO PUT UP *
|
||
* TITLES FOR PLAYER 1 OR PLAYER 2. *
|
||
* *
|
||
* ENT_DATA POINTS AT PLAYER ROM STRUCTURE FOR PLAYER *
|
||
* *
|
||
* NEED TO SAVE ONLY A8,A9,A10,A11 *
|
||
* *
|
||
**************************************************************************
|
||
E_TITLES
|
||
MMTM SP,A8,A9,A10,A11
|
||
|
||
CALLR OP_P ;OPERATOR?
|
||
JRZ ET_X ;YEP...NO MESSAGE!
|
||
|
||
MOVE *A13(ENT_DATA),A1,L ;FETCH THE DATA POINTER
|
||
CLR A0 ;NO SLEEP TIME
|
||
MOVE *A13(ENT_CONST),A6,W ;USE THIS RAM VERSION OF COLOR
|
||
MOVE *A1(LET_MESS),A8,L ;THIS IS THE MESSAGE
|
||
MOVE *A1(ENT_X_COR-PDATA),A9,L ;GET X OFFSET
|
||
ADDI 12H*TABLE_UNIT,A9 ;PLACE FOR MESSAGE
|
||
SRL 16,A9 ;SHIFT IT DOWN
|
||
MOVE *A1(ENT_Y_COR-PDATA),A3,L ;GET X OFFSET
|
||
SUBI 0C0H*TABLE_UNIT,A3
|
||
ANDI 0FFFF0000H,A3 ;MASK Y
|
||
ADD A3,A9 ;THIS POINTS AT PLACE FOR "PLAYER"
|
||
|
||
MOVI 00000002H,A10 ;SMALL SPACING
|
||
MOVI RD20FONT,A11
|
||
JSRP STRLNRM
|
||
*
|
||
* NOW PUT THE "ENTER YOUR INITIALS" PART
|
||
*
|
||
MOVE *A1(ENT_X_COR-PDATA),A9,L ;GET X OFFSET
|
||
ADDI 4*TABLE_UNIT,A9 ;PLACE FOR MESSAGE
|
||
SRL 16,A9 ;SHIFT IT DOWN
|
||
MOVE *A1(ENT_Y_COR-PDATA),A3,L ;GET X OFFSET
|
||
SUBI 0A0H*TABLE_UNIT,A3
|
||
ANDI 0FFFF0000H,A3 ;MASK Y
|
||
ADD A3,A9 ;THIS POINTS AT PLACE FOR "PLAYER"
|
||
|
||
MOVI MESS_3,A8 ;POINT AT TEXT STRING
|
||
MOVI RD15FONT,A11
|
||
|
||
MOVI 00000001H,A10 ;SMALL SPACING
|
||
|
||
JSRP STRLNRM
|
||
ET_X MMFM SP,A8,A9,A10,A11
|
||
RETS
|
||
|
||
**************************************************************************
|
||
* *
|
||
* STRING DEFINITIONS *
|
||
* *
|
||
**************************************************************************
|
||
|
||
MESS_1 .BYTE "PLAYER 1",0
|
||
MESS_2 .BYTE "PLAYER 2",0
|
||
MESS_3 .BYTE "ENTER YOUR INITIALS:",0
|
||
|
||
*****************************************************************************
|
||
.EVEN ;AFTER BYTE BLOCK WE EVEN IT OUT!
|
||
*****************************************************************************
|
||
.END
|
||
|