mirror of
https://github.com/rzzzwilson/pymlac.git
synced 2025-06-10 09:32:41 +00:00
3499 lines
61 KiB
NASM
3499 lines
61 KiB
NASM
TITLE MAZE.3 GREG THOMPSON (GAT) 04/11/74
|
||
|
||
; MAZE
|
||
|
||
; Maze is a experiment in 3 dimensional graphics and intertask
|
||
; teleconferencing. It is a hunt and seek game that can involve up to
|
||
; eight Imlacs. The Imlac user is placed in a 16 by 32 square maze and
|
||
; attempts to hunt down and destroy the other inhabitents of the maze (the
|
||
; other Imlac users) before they do the same to him. Each player is
|
||
; represented by his uname (1 through 8 characters) as he moves through the
|
||
; maze. The various keys that are used to move through the maze and to
|
||
; fire are described below.
|
||
;
|
||
; UP ARROW - Move forward 1 square.
|
||
; DOWN ARROW - Back up one square.
|
||
; LEFT ARROW - Turn 90 degrees to the left.
|
||
; RIGHT ARROW- Turn 90 degrees to the right.
|
||
; FUNCTION 4 - Turn 180 degrees around.
|
||
; PAGE XMIT - Peek around the corner to the left.
|
||
; XMIT - Peek around the corner to the right.
|
||
; ESC - Fire.
|
||
; CTRL -Z - Exit maze program.
|
||
; FORM - Erase dispay buffer.
|
||
; FUNCTION 7 - Look at maze from top.
|
||
;
|
||
; The player enters the maze by typing MAZE<cr>; to monit or MAZE^k to
|
||
; DDT, while at an imlac. The screen will be blank for a minute or two
|
||
; while the imlac side of the maze program is loaded after which the player
|
||
; is placed in to the maze along with any other players. A letter on the
|
||
; top of the screen indicates the direction you are currently facing. The
|
||
; unames of the other players are listed on the sides followed their score
|
||
; and the number of times they were shot. Anytime a player is shot the
|
||
; bell will ring and an '!' will be placed next to the shooting players
|
||
; score and an '*' will be placed next to the number of times shot counter
|
||
; of the player that was just shot. Holding down the up or down arrow keys
|
||
; will cause them to repeat. After a shot is fired the player who is being
|
||
; shot at has two seconds to get out of view of the position that the
|
||
; shooting player was at at the time he fired the shot. All other
|
||
; characters typed are placed in a display buffer at the bottom of all the
|
||
; imlac's screen. Holding the Function-7 (or TAB as the case my be) will
|
||
; allow you to view your position in the maze from the top.
|
||
; The 3 buttons on the mouse and the 5 keyset buttons may be used as
|
||
; controls and have the following functions, starting from the left of the
|
||
; mouse; peek left, fire, peek right, turn around, turn left, move
|
||
; forward, turn right, and move backwards.
|
||
; Users may specify their own mazes if they are the first player in a
|
||
; maze by giving a file name after 'maze to use: '. Just a CR will default
|
||
; to the standard maze. User mazes must have a specific format if they are
|
||
; to be able to work. They must begin with a LOC 10020 followed by the label
|
||
; MAZE: on the first of 32. octal words which form a bit map for the
|
||
; maze. The maze must end with LOC 17713, JMP @.+1, 101, and an END.
|
||
; After assembling the maze must be imtraned by using the 'IMTRAN' command.
|
||
; A muddle function exists for printing out formated source mazes. It is
|
||
; initiated by floading 'imlac;maze print' in muddle and then issuing
|
||
; <PRINT-MAZE 'input file spec' 'output file spec'>$ where the output file
|
||
; spec defaults to the TTY. An example of a formated source maze is given
|
||
; below:
|
||
|
||
;.INSRT IMSRC;IMDEFS >
|
||
;
|
||
; LOC 10020'
|
||
;
|
||
; MAZE: 177777 ; HERE IS THE 32 WORD MAZE.
|
||
; 106401 ; NO FOUR SQUARES MAY BE EMPTY.
|
||
; 124675 ; AND SHARE A COMMON CORNER.
|
||
; 121205 ; ALL OUTSIDE WALLS MUST BE FILLED IN.
|
||
; 132055 ; THIS IS THE DEFAULT MAZE.
|
||
; 122741
|
||
; 106415
|
||
; 124161
|
||
; 121405
|
||
; 135775
|
||
; 101005
|
||
; 135365
|
||
; 121205
|
||
; 127261
|
||
; 120205
|
||
; 106765
|
||
; 124405
|
||
; 166575
|
||
; 122005
|
||
; 107735
|
||
; 120001
|
||
; 135575
|
||
; 105005
|
||
; 125365
|
||
; 125225
|
||
; 121265
|
||
; 105005
|
||
; 135375
|
||
; 100201
|
||
; 135675
|
||
; 110041
|
||
; 177777
|
||
;
|
||
; END 101' ; AUTO START BACK INTO CONSOLE PROGRAM
|
||
;
|
||
; Players start in random loctions.
|
||
|
||
; The current default maze is:
|
||
;
|
||
; N O R T H
|
||
;
|
||
;
|
||
; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
||
; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
||
; $$$ $$$$$$ $$$ $$$
|
||
; $$$ $$$$$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$$$$ $$$$$$$$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$$$$ $$$$$$$$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$$$$ $$$ $$$ $$$$$$ $$$
|
||
; $$$ $$$$$$ $$$ $$$ $$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$$$$$$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$$$$$$$$$$ $$$
|
||
; $$$ $$$$$$ $$$ $$$$$$ $$$
|
||
; $$$ $$$$$$ $$$ $$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$$$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$$$$$$$ $$$
|
||
; $$$ $$$ $$$$$$ $$$ $$$
|
||
; $$$ $$$ $$$$$$ $$$ $$$
|
||
; $$$ $$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ $$$
|
||
; $$$ $$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$
|
||
; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$ $$$ $$$
|
||
; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$ $$$
|
||
; W $$$ $$$ $$$$$$$$$ $$$ $$$$$$ $$$ E
|
||
; $$$ $$$ $$$$$$$$$ $$$ $$$$$$ $$$
|
||
; E $$$ $$$ $$$ $$$ $$$ A
|
||
; $$$ $$$ $$$ $$$ $$$
|
||
; S $$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ $$$ S
|
||
; $$$ $$$$$$ $$$$$$$$$$$$$$$ $$$ $$$
|
||
; T $$$ $$$ $$$ $$$ $$$ $$$ T
|
||
; $$$ $$$ $$$ $$$ $$$ $$$
|
||
; $$$$$$$$$ $$$$$$ $$$ $$$$$$$$$$$$$$$ $$$
|
||
; $$$$$$$$$ $$$$$$ $$$ $$$$$$$$$$$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$ $$$
|
||
; $$$ $$$$$$$$$$$$$$$$$$ $$$$$$$$$ $$$
|
||
; $$$ $$$ $$$
|
||
; $$$ $$$ $$$
|
||
; $$$ $$$$$$$$$ $$$$$$ $$$$$$$$$$$$$$$ $$$
|
||
; $$$ $$$$$$$$$ $$$$$$ $$$$$$$$$$$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$$$$$$$$$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$$$$$$$$$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$$$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$$$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$ $$$
|
||
; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$$$$$$$ $$$
|
||
; $$$ $$$$$$$$$ $$$ $$$$$$$$$$$$$$$$$$ $$$
|
||
; $$$ $$$ $$$
|
||
; $$$ $$$ $$$
|
||
; $$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$$$$ $$$
|
||
; $$$ $$$$$$$$$ $$$$$$$$$ $$$$$$$$$$$$ $$$
|
||
; $$$ $$$ $$$ $$$
|
||
; $$$ $$$ $$$ $$$
|
||
; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
||
; $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
||
;
|
||
;
|
||
; S O U T H
|
||
;
|
||
|
||
; MAZE PROTOCOL: MESSAGES ARE SENT TO ALL OTHER IMLACS
|
||
; DO NOT SEND TO ORIGINATING IMLAC
|
||
;
|
||
; 001 -- PLAYER LEAVES GAME
|
||
; <ID>
|
||
;
|
||
; 002 -- PLAYER MOVED
|
||
; <ID>
|
||
; <NEW DIRECTION WITH 100 BIT ON>
|
||
; <NEW XLOC WITH 100 BIT ON>
|
||
; <NEW YLOC WITH 100 BIT ON>
|
||
;
|
||
; 003 -- PLAYER DIED
|
||
; <ID>
|
||
; <ID OF WHO DIED>
|
||
;
|
||
; 004 -- ANNOUNCE NEW PLAYER
|
||
; <ID # OF NEW PLAYER>
|
||
; <6 CHARS OF ID NAME>
|
||
; <2 CHAR # OF HITS WITH 100 BIT ON> (HIGH ORDER 6 BITS THEN LOW ORDER 6 BITS)
|
||
; <2 CHAR # OF DEATHS WITH 100 BIT ON>
|
||
;
|
||
; 014 -- ERASE DISPLAY RING BUFFER
|
||
;
|
||
;
|
||
; IDS MUST BE >= 1 AND <= 8.
|
||
;
|
||
; ALL INCOMING MESSAGES ARE CHECKED FOR LEGALITY. BAD MESSAGES ARE FLUSHED.
|
||
; A NUMBER IN THE STATUS LINE INDICATES THE NUMBER OF BAD MESSAGES RECIEVED.
|
||
; INFORMATION CONCERNING THE LAST BAD MESSAGE RECIEVED IS SAVED FOR LATER EVALUATION.
|
||
;
|
||
; ALL CHARACTERS SUBROUTINES AND THE DJMS TABLE IS UP IN THE CONSOLE PROGRAM (SSV).
|
||
; THE DJMS TABLE IS ACCESSED THROUGH LOCATION 24 OCTAL WHICH STARTS WITH THE ENTRY
|
||
; FOR OCTAL CODE 40 (SPACE).
|
||
;
|
||
; ANY CHARACTERS TYPED ON CONSOLE (>014') ARE SENT TO PDP-10 AND SHOULD
|
||
; BE ECHOED TO ALL! CONSOLES INCLUDING THE ORIGINATOR.
|
||
;
|
||
; ANY OTHER CHARACTERS RECEIVED BY IMLAC ARE DISPLAYED IN A
|
||
; RING BUFFER AT THE BOTTOM OF THE PICTURE.
|
||
;
|
||
; THE FIRST ANNOUNCE NEW PLAYER MESSAGE THE IMLAC RECIEVES DEFINES ITS ID.
|
||
;
|
||
; THIS VERSION REQUIRES A GRAPHICS IMLAC WITH LONG VECTOR HARDWARE
|
||
; MULTI-LEVEL SUBROUTINING, AND 8K DISPLAY ADDRESSING MOD.
|
||
;
|
||
; THE MESSAGE SWITCHING PROGRAM ON THE 10 MUST ALSO KEEP TRACK
|
||
; OF THE CURRENT SCORES OF ALL THE PLAYERS SO WHEN A NEW PLAYER
|
||
; JOINS INTO A ALREADY EXISTING GAME HE MAY RECIEVE THE CURRECT
|
||
; SCORES OF ALL THE PLAYERS.
|
||
;
|
||
; WHEN AN IMLAC WANTS TO JOIN AN EXISTING MAZE THE FOLLOWING OCCURS:
|
||
; 1) THE MAZE PROGRAM IS LOADED INTO HIS IMLAC.
|
||
; 2) THE CURRENT MAZE IS LOADED ON TOP OF THE DEFAULT MAZE
|
||
; IF THE DEFAULT MAZE IS NOT BEING USED.
|
||
; 3) A TYPE 4 MESSAGE IS SENT TO ALL IMLACS ANOUNCING THE
|
||
; NEW IMLAC. THE NEW IMLAC GETS HIS ID FROM THIS MESSAGE.
|
||
; 4) TYPE 4 MESSAGES FOR ALL THE OTHER PLAYERS ARE SENT TO
|
||
; THE NEW IMLAC.
|
||
;
|
||
; WRITTEN BY:
|
||
;
|
||
; HOWARD PALMER STANFORD ORIGINAL IDEA & STAND-ALONE VERSION OF MAZE
|
||
; STEVE COLLEY CAL TECH ORIGINAL IDEA OF MAZE, STAND-ALONE MAZE
|
||
; & CRUDE MULTIPLE PLAYERS
|
||
; GREG THOMPSON M.I.T. FULL MULTIPLE PLAYERS ADDITIONS
|
||
; DAVE LEBLING M.I.T. PDP-10 MESSAGE SWITCHER AND ROBOTS
|
||
; KEN HARRENSTEIN M.I.T. PDP-10 part of fast interaction protocol
|
||
; CHARLES FRANKSTON M.I.T. IMLAC part of fast interaction protocol.
|
||
|
||
; actual program begins here
|
||
|
||
.INSRT IMSRC;IMDEFS >
|
||
; To keep midas from barfing 'RES' at use of these syms in prg.
|
||
IF1 EXPUNGE FIX,MOVE,PTR,EXP
|
||
|
||
FAST==1 ; to assemble fast-protocol version.
|
||
CHEAT==0 ; conditional to assemble cheater stuff
|
||
|
||
.MLLIT==1
|
||
|
||
LOC 10000'
|
||
|
||
.ADDR.=1 ; 8k addressing for display opcodes
|
||
|
||
JMP START ; starting point
|
||
JMP RESTART ; restarting entry point
|
||
JMP LEAVE ; entry to return to ssv (on error)
|
||
JMP RETN ; reenter maze main loop
|
||
|
||
; auto increment register definitions
|
||
DPTR=10' ; index loc 10 used as pointer
|
||
VISPT=11'
|
||
VISPT2=12'
|
||
VISPT3=13'
|
||
VISPT4=14'
|
||
VISPT5=15'
|
||
; index location 16' and 17' used by interupt routine
|
||
|
||
LOC 10020'
|
||
|
||
; here is the 32 word maze: no four squares may be empty and share a
|
||
; common corner, and all outside walls must be filled in
|
||
|
||
MAZE: 177777 ? 106401 ? 124675 ? 121205 ? 132055 ? 122741 ? 106415 ? 124161
|
||
121405 ? 135775 ? 101005 ? 135365 ? 121205 ? 127261 ? 120205 ? 106765
|
||
124405 ? 166575 ? 122005 ? 107735 ? 120001 ? 135575 ? 105005 ? 125365
|
||
125225 ? 121265 ? 105005 ? 135375 ? 100201 ? 135675 ? 110041 ? 177777
|
||
|
||
|
||
; here to wait for the loader signal
|
||
|
||
LOADER: RSF
|
||
JMP .-1
|
||
CLA
|
||
RRC
|
||
AND [177]
|
||
SAM [^A]
|
||
JMP LOADER
|
||
RSF
|
||
JMP .-1
|
||
CLA
|
||
RRC
|
||
AND [177]
|
||
SAM [^A]
|
||
JMP LOADER
|
||
JMP @[40]
|
||
|
||
; dstat, dx, dy, dir is my position and point into info table
|
||
|
||
DSTAT: 0 ; status flag
|
||
DX: 0 ; x position of this imlac
|
||
DY: 0 ; y position of this imlac
|
||
; start out big so we won't show up on map
|
||
DIR: 0 ; direction he is pointing
|
||
; bits 14 and 15 have meaning
|
||
; bit 14,bit 15
|
||
; 0 0 north
|
||
; 0 1 east
|
||
; 1 0 south
|
||
; 1 1 west
|
||
|
||
NEXTBIT:0
|
||
ETEM: 0
|
||
WPTR: 0
|
||
WPTR2: 0
|
||
CNT: 0 ; counters
|
||
CNT2: 0
|
||
KILL: 0 ; last player killed by this imlac
|
||
PTR4: 0 ; pointers
|
||
PTR3: 0
|
||
PTR2: 0
|
||
PTR: 0
|
||
XDELTA: 0
|
||
YDELTA: 0
|
||
BEAMBIT:0
|
||
LASTRIG:0
|
||
LASTLEF:0
|
||
HALLNGTH:0
|
||
MYREAL: 0 ; the real id of this imlac
|
||
MYBIT: 0 ; the id of this imlac
|
||
MYBIT1: 0 ; mybit-1 (normalize to 0-7)
|
||
IID: 0 ; temporary imlac id used for see routine
|
||
MPTR: 0
|
||
BIT: 0
|
||
|
||
; keyboard and keyset input data
|
||
|
||
KEY: 0 ; last key read in
|
||
KEYSET: 0 ; last value from keyset
|
||
KSCNT: 0 ; keyset repeat counter
|
||
|
||
HOME: 1372' ; ctrl z [exits program]
|
||
BACKUP: 204' ; down arrow (backup one square)
|
||
RTURN: 205' ; right arrow (turn 90 degrees right)
|
||
MOVE: 206' ; up arrow (move forward one square)
|
||
LTURN: 210' ; left arrow (turn 90 degrees left)
|
||
TURNA: 234' ; function 4 (turn 180 degrees around)
|
||
PEEKR: 202' ; xmit (peek to the right)
|
||
FIRE: 233' ; esc (fire)
|
||
PEEKL: 216' ; page xmit (peek to the left)
|
||
ERING: 214' ; form (erase ring buffer)
|
||
TOPVW: 211' ; tab (get a top view of maze)
|
||
|
||
TEM1: 0 ; temporarys
|
||
TEM2: 0
|
||
TEM3: 0
|
||
|
||
TOPSW: -1 ; indicates whether a top or inside view
|
||
|
||
IFN FAST,[
|
||
RELCNT: 0 ;counter of rel positions between abs
|
||
]
|
||
|
||
; start of game
|
||
|
||
START: IOF ; disable any interupts
|
||
CLA
|
||
DAC ICNT ; set no message pending
|
||
DAC MYBIT ; indicate we have no id
|
||
MSW ; set initial keyset value
|
||
DAC KEYSET
|
||
LAC [7776'] ; limit ssv's display list
|
||
DAC @[25']
|
||
JMS ERASE ; reset ring buffer
|
||
LAC [MESAGE-1] ; set up you were shot message
|
||
DAC 11'
|
||
LAC [YWSB-1]
|
||
DAC 12'
|
||
LWC 17.
|
||
DAC CNT2
|
||
SETUPN: LAC @12'
|
||
JMS GETCHR
|
||
DAC @11'
|
||
ISZ CNT2
|
||
JMP SETUPN
|
||
;
|
||
; now wait for our id
|
||
;
|
||
JMS CHARIN
|
||
LAC MYBIT ; wait for identifier message to come in
|
||
ASN ; has it been set yet?
|
||
JMP .-3 ; no, keep waiting
|
||
STA
|
||
DAC TOPSW ; display top view
|
||
;
|
||
; place player in maze
|
||
;
|
||
RESTART:KCF ; reset keyboard
|
||
RESET1: JMS RANDOM
|
||
AND [17']
|
||
DAC @DX
|
||
JMS RANDOM
|
||
AND [37']
|
||
DAC @DY
|
||
JMS PNTBIT
|
||
LAC @MPTR
|
||
AND BIT
|
||
ASZ
|
||
JMP RESET1
|
||
JMS RANDOM
|
||
AND [3]
|
||
DAC @DIR
|
||
LAC [AD1] ; reset to main screen
|
||
DAC WHICHD
|
||
IFN FAST,[
|
||
CLA
|
||
DAC RELCNT ; force abs. position out first thing.
|
||
]
|
||
JMP RETN4
|
||
|
||
RETN2: CLA ; look from inside maze
|
||
DAC TOPSW
|
||
;
|
||
; send new position to 10
|
||
;
|
||
RETN4: STA ; set to playing status
|
||
DAC @DSTAT
|
||
JMS PRINT ; build current display
|
||
IFE FAST,[
|
||
JMS ABSMSG ; send out absolute position
|
||
JMP RETN
|
||
]
|
||
IFN FAST,[
|
||
LAC RELCNT
|
||
ASM ; if ge 0, something wants an abs pos sent out.
|
||
JMS ABSMSG ; sigh, send absolute
|
||
JMP RETN ; and continue
|
||
|
||
RELMSG: 0
|
||
IOR MYBIT1
|
||
JMS SEND1
|
||
ISZ RELCNT
|
||
NOP
|
||
JMP @RELMSG
|
||
|
||
] ;end of ifn fast
|
||
|
||
; send new absolute position
|
||
ABSMSG: 0
|
||
IFN FAST,[
|
||
LWC 20 ;number of rel messages before an abs
|
||
DAC RELCNT ;set counter
|
||
]
|
||
LAW 2 ; send moved message code
|
||
JMS SEND1
|
||
LAC MYBIT ; send my id
|
||
JMS SEND1
|
||
LAC @DIR ; send new direction
|
||
AND [3] ; send only lower 2 bits!
|
||
IOR [100']
|
||
JMS SEND1
|
||
LAC @DX ; send new x location
|
||
IOR [100']
|
||
JMS SEND1
|
||
LAC @DY ; send new y location
|
||
IOR [100']
|
||
JMS SEND1
|
||
JMP @ABSMSG ;return
|
||
|
||
;
|
||
; main loop
|
||
;
|
||
RETN: JMS CHARIN ; get stuff from ten
|
||
JMS DISP ; maintain display
|
||
RETN3: KSF ; no, is there a key down?
|
||
JMP KSCHK ; no, now check keyset
|
||
CAL ; yes, read the key
|
||
KRC
|
||
DAC KEY
|
||
LWC 8. ; set up to rept key (time before start repeating)
|
||
DAC REPTCNT
|
||
REPT: LAC KEY
|
||
KEYREPT:SAM HOME ; is it ctrl-z?
|
||
JMP KEYCHK
|
||
LAC MYBIT ; remove me from maze
|
||
DAC ININFO
|
||
JMP GONER
|
||
;
|
||
; check keyset
|
||
;
|
||
KSCHK: CLA
|
||
MSW
|
||
SAM KEYSET ; has it changed?
|
||
JMP .+2 ; yes, so do something about it
|
||
JMP RETN ; no, re-enter main loop
|
||
DAC KEYSET ; save new value
|
||
LWC 15. ; set up to repeat
|
||
DAC KSCNT
|
||
KSREPT: LAC [BACKUP] ; now figure which key to simulate
|
||
DAC PTR
|
||
LAC KEYSET
|
||
IOR [174340'] ; turn on bits to ignore
|
||
CMA\CLL
|
||
ASN
|
||
JMP RETN
|
||
RAR 1
|
||
LSZ
|
||
JMP GOTIT
|
||
XAM PTR
|
||
IAC
|
||
XAM PTR
|
||
JMP .-6
|
||
|
||
GOTIT: LAC @PTR ; get appropriate key
|
||
DAC KEY
|
||
JMP KEYREPT
|
||
;
|
||
; see if we are blowing up
|
||
;
|
||
KEYCHK: LAC BIGEXP ; if so then ignore keys
|
||
ASZ
|
||
JMP RETN ; yes, so wait it out
|
||
;
|
||
; check for various keyboard commands
|
||
;
|
||
KEY1: LAC KEY
|
||
SAM RTURN ; turn right?
|
||
JMP KEY2
|
||
ISZ @DIR
|
||
NOP
|
||
IFN FAST,[
|
||
LAC [20'] ; new protocol for right turn
|
||
JMS RELMSG
|
||
]
|
||
JMP RETN2
|
||
|
||
KEY2: SAM LTURN ; left turn?
|
||
JMP KEY3
|
||
LAC @DIR
|
||
SUB [1]
|
||
DAC @DIR
|
||
IFN FAST,[
|
||
LAC [30'] ; new protocol for left turn
|
||
JMS RELMSG
|
||
]
|
||
JMP RETN2
|
||
|
||
KEY3: SAM MOVE ; move forward?
|
||
JMP KEY4
|
||
JMS MOVER
|
||
JMP RETN
|
||
IFN FAST,[
|
||
LAC [150'] ; new protocol for move forward
|
||
JMS RELMSG
|
||
]
|
||
JMP RETN2
|
||
|
||
KEY4: SAM PEEKL ; peek left?
|
||
JMP KEY5
|
||
JMS MOVER
|
||
JMP RETN
|
||
;ifn fast,[
|
||
; lac [150'] ; new protocol for move forward
|
||
; ior mybit1 ; insert id
|
||
; jms send1
|
||
;]
|
||
LAC @DIR
|
||
SUB [1]
|
||
DAC @DIR
|
||
JMS HOLD
|
||
LAC @DIR
|
||
SUB [1]
|
||
DAC @DIR
|
||
PEEKER: JMS MOVER
|
||
JMP RETN
|
||
JMS ADIR2
|
||
JMP RETN2
|
||
|
||
KEY5: SAM PEEKR ; peek right?
|
||
JMP KEY6
|
||
JMS MOVER
|
||
JMP RETN
|
||
ISZ @DIR
|
||
NOP
|
||
JMS HOLD
|
||
ISZ @DIR
|
||
NOP
|
||
JMP PEEKER
|
||
|
||
KEY6: SAM TURNA ; turn around?
|
||
JMP KEY7
|
||
JMS ADIR2
|
||
IFN FAST,[
|
||
LAC [140'] ; new protocol for turn-around
|
||
JMS RELMSG
|
||
]
|
||
JMP RETN2
|
||
|
||
KEY7: SAM BACKUP ; back up?
|
||
JMP KEY8
|
||
JMS ADIR2
|
||
JMS MOVER
|
||
JMP KEY7NP
|
||
JMS ADIR2
|
||
IFN FAST,[
|
||
LAC [160'] ; new protocol for move backwards.
|
||
JMS RELMSG
|
||
]
|
||
JMP RETN2
|
||
|
||
KEY7NP: JMS ADIR2 ; can't move backwards, restore direction.
|
||
JMP RETN
|
||
|
||
ADIR2: 0
|
||
LAC @DIR
|
||
ADD [2]
|
||
DAC @DIR
|
||
JMP @ADIR2
|
||
|
||
KEY8: SAM FIRE ; fire?
|
||
JMP KEY9
|
||
;
|
||
; look for visible opponent to shoot at
|
||
;
|
||
LAC [THING+4] ; set display list pointer
|
||
DAC PTR
|
||
LWC 8. ; 8 possible imlacs
|
||
DAC CNT2
|
||
LAC [IM1+4] ; set info table pointer
|
||
DAC VISPT
|
||
IAC
|
||
DAC PTR2
|
||
CHKNEXT:LAC @PTR ; get display body
|
||
SAM [DNOP] ; is he visible?
|
||
JMP NOTDNOP
|
||
NOTHIM: LAC VISPT ; no, bump pointers to next player
|
||
ADD [11.]
|
||
BUMPTRS:DAC VISPT
|
||
IAC
|
||
DAC PTR2
|
||
LAC PTR
|
||
ADD [6]
|
||
DAC PTR
|
||
ISZ CNT2 ; did we check them all
|
||
JMP CHKNEXT ; no
|
||
JMP RETN ; yes, return
|
||
|
||
NOTDNOP:SAM JMSEXP ; could he already be exploding?
|
||
JMP FOUNONE ; no, so we found a opponent to shoot at
|
||
JMP NOTHIM ; yes, so don't fire at him
|
||
FOUNONE:LAC @PTR2 ; are we already firing on this guy?
|
||
ASZ ; if so then don't fire again
|
||
JMP NOTHIM
|
||
LWC 80. ; set 2 second delay to allow player to dodge it
|
||
DAC @VISPT
|
||
LAC @DIR
|
||
DAC @VISPT
|
||
LAC @DX ; save our location
|
||
DAC @VISPT
|
||
LAC @DY
|
||
DAC @VISPT
|
||
LAC VISPT ; now check next player
|
||
ADD [7]
|
||
JMP BUMPTRS
|
||
;
|
||
; does he want screen erased?
|
||
;
|
||
KEY9: SAM ERING
|
||
JMP VIEWTOP ; no
|
||
JMS ERASE ; yes, so erase it
|
||
JMP RETN ; then return to main loop
|
||
;
|
||
; look at maze from top
|
||
;
|
||
VIEWTOP:SAM TOPVW ; look at maze from top?
|
||
IFE CHEAT, JMP SENDIT
|
||
IFN CHEAT, JMP CHNGP
|
||
STA ; yes, set flag for top view
|
||
DAC TOPSW
|
||
JMS PRINT ; and build display
|
||
VTWAIT: JMS CHARIN
|
||
JMS DISP
|
||
CAL
|
||
KRB
|
||
SAM TOPVW ; display top view as long
|
||
JMP .+2 ; as key is held down
|
||
JMP VTWAIT
|
||
CLA ; look inside again
|
||
DAC TOPSW
|
||
JMS PRINT
|
||
JMP RETN
|
||
|
||
IFN CHEAT,[
|
||
;
|
||
; secret id switching keys
|
||
;
|
||
; ctrl-rept 0 to :
|
||
; 0 return to original id
|
||
; n changes to id n
|
||
; : complement forward square
|
||
;
|
||
CHNGP: SUB [3260']
|
||
ASP
|
||
JMP SENDIT
|
||
SAM [10.] ; ctrl-rept : ?
|
||
JMP .+2 ; no
|
||
JMP ZAP ; yes
|
||
ASN ; ctrl-repeat 0?
|
||
LAC MYREAL ; if so get my real id
|
||
SUB [9.]
|
||
ASM
|
||
JMP RETN
|
||
ADD [9.]
|
||
DAC TEM1
|
||
SAL 3
|
||
ADD [IML1-8.] ; see if this player is playing
|
||
DAC TEM2 ; by seeing if his name exists
|
||
LAC [DJMS D040,]
|
||
SAM @TEM2
|
||
JMP .+2
|
||
JMP RETN
|
||
LAC TEM1
|
||
JMS GETD ; change us to new id
|
||
JMS PRINT ; display new view
|
||
JMP RETN
|
||
|
||
ZAP: JMS MOV ; set up ptrs to next square
|
||
LAC @MPTR ; now flip bit
|
||
XOR BIT
|
||
DAC @MPTR
|
||
JMS PRINT ; rebuild display
|
||
JMP RETN
|
||
] ;end of ifn cheat.
|
||
|
||
;
|
||
; send other characters to 10
|
||
;
|
||
SENDIT:
|
||
IFN CHEAT, ADD [3260']
|
||
AND [177']
|
||
SAM [15'] ; cr?
|
||
JMP .+2
|
||
JMP SENDOK
|
||
SUB [40'] ; control code?
|
||
ASP
|
||
JMP RETN ; yes, so ignore it
|
||
SUB [100'] ;it's a 40-177 char, see if it's 140-177
|
||
ASP
|
||
ADD [40'] ;no, it's 40-137, get char back.
|
||
ADD [100'] ;yes, 140-177. make it uppercase.
|
||
|
||
SENDOK: JMS SEND1 ; now send it to 10. char is either 40-137 or 15.
|
||
JMP RETN
|
||
;
|
||
; hold a position for as long as the same key is held down
|
||
;
|
||
HOLD: 0
|
||
JMS PRINT ; update display
|
||
HOLD1: JMS CHARIN ; get stuff from ten
|
||
JMS DISP ; maintain display
|
||
CAL
|
||
KRB
|
||
SAM KEY ; is the same key down?
|
||
JMP .+2 ; no, test key set for key still down
|
||
JMP HOLD1 ; yes, hold this location
|
||
TSTKS: CLA
|
||
MSW
|
||
ASN ; do we have the hardware?
|
||
JMP @HOLD ; no, just return
|
||
AND [2400'] ; if either peek left or right still
|
||
XOR [2400']
|
||
ASZ ; down then hold position
|
||
JMP HOLD1
|
||
JMP @HOLD ; return
|
||
|
||
;
|
||
; point mptr to appropriate word maze (y)
|
||
; and bit to appropriate bit in word for our
|
||
; current location
|
||
;
|
||
PNTBIT: 0
|
||
LAC [MAZE]
|
||
ADD @DY
|
||
DAC MPTR
|
||
LAC @DX
|
||
ASZ
|
||
JMP PNT1
|
||
LAC [100000']
|
||
JMP PNT2
|
||
|
||
PNT1: CIA
|
||
DAC CNT
|
||
CLL
|
||
LAC [100000']
|
||
RAR 1
|
||
ISZ CNT
|
||
JMP .-2
|
||
PNT2: DAC BIT
|
||
JMP @PNTBIT
|
||
;
|
||
; move forward one square
|
||
;
|
||
MOV: 0
|
||
CLA ; clear out increments
|
||
DAC TEM1 ; y increment
|
||
DAC TEM2 ; x increment
|
||
JMS PNTBIT ; position to current position
|
||
LAC @DIR ; see which direction we are heading
|
||
AND [1]
|
||
ASZ
|
||
JMP MOVEWE
|
||
JMS CREMENT ; move north or south
|
||
DAC TEM1
|
||
ADD MPTR
|
||
DAC MPTR
|
||
JMP @MOV ; return
|
||
|
||
MOVEWE: JMS CREMENT ; move west or east
|
||
AND [20']
|
||
IOR [RAL 1]
|
||
DAC NOPER
|
||
LAC BIT
|
||
CLL
|
||
NOPER: NOP
|
||
DAC BIT
|
||
JMS CREMENT
|
||
CIA
|
||
DAC TEM2 ; set x increment
|
||
JMP @MOV
|
||
|
||
MOVER: 0
|
||
JMS MOV ; move forwards one square
|
||
LAC @MPTR ; see if it is a wall
|
||
AND BIT
|
||
ASZ
|
||
JMP @MOVER ; a open square
|
||
LAC TEM2 ; update x to this square
|
||
ADD @DX
|
||
DAC @DX
|
||
LAC TEM1 ; update y
|
||
ADD @DY
|
||
DAC @DY
|
||
ISZ MOVER ; and indicate we moved by skipping
|
||
JMP @MOVER
|
||
;
|
||
; return 1 or -1 according to which direction we are heading
|
||
;
|
||
CREMENT: 0
|
||
LAC @DIR
|
||
SAR 1
|
||
AND [1]
|
||
ASN
|
||
LAC [-1]
|
||
JMP @CREMENT
|
||
|
||
;
|
||
; refreshing routine
|
||
;
|
||
REFR: 0
|
||
DSF
|
||
SSF
|
||
JMP @REFR
|
||
SCF
|
||
LAC WHICHD ; get appropriate display list address
|
||
DLA
|
||
DON
|
||
STA ; indicate 40 cycle sync
|
||
DAC SYNC
|
||
JMP @REFR
|
||
|
||
WHICHD: AD1 ; contains address of current display
|
||
SYNC: 0 ; 40 cycle sync flag
|
||
BIGEXP: 0 ; our explosion counter
|
||
JMSEXP: DJMS EXPLOSIN
|
||
|
||
EXP: DDSP
|
||
DDSP
|
||
DDSP
|
||
INC1: DDSP
|
||
INC2: DDSP
|
||
INC3: DDSP
|
||
DRJM
|
||
|
||
EXPLOSIN:DLXA 1000
|
||
DJMS WAIT
|
||
DSTS 3
|
||
INC E,D03
|
||
INC D03,100'
|
||
DJMS EXP
|
||
INC E,D00
|
||
INC4: INC D00,D00
|
||
INC 100',100'
|
||
DJMS EXP
|
||
INC E,D00
|
||
INC5: INC D00,D00
|
||
INC6: INC D00,D00
|
||
INC 100',100'
|
||
DJMP EXP
|
||
;
|
||
; keep display and timed occurances running
|
||
;
|
||
DISP: 0
|
||
JMS REFR ; keep up display
|
||
LAC SYNC ; has the 40 cycle sync occured yet?
|
||
ASM
|
||
JMP @DISP ; no, just return
|
||
CLA ; yes, reset it
|
||
DAC SYNC
|
||
;
|
||
; check for our blowing up
|
||
;
|
||
LAC BIGEXP ; are we blowing up?
|
||
ASN
|
||
JMP CHKOPP ; no
|
||
ISZ BIGEXP ; is it finshed?
|
||
JMP UPDTBIG ; no, update it
|
||
JMP RESTART ; yes, now restart the imlac
|
||
;
|
||
; update 4 pointers
|
||
;
|
||
BUMPPTS:0
|
||
LAC VISPT2
|
||
ADD [5]
|
||
DAC VISPT2
|
||
LAC VISPT3
|
||
ADD [5]
|
||
DAC VISPT3
|
||
LAC VISPT4
|
||
ADD [5]
|
||
DAC VISPT4
|
||
LAC VISPT5
|
||
ADD [5]
|
||
DAC VISPT5
|
||
JMP @BUMPPTS
|
||
;
|
||
; update a dlxa or dlya
|
||
;
|
||
UPDTSUB:0
|
||
LAC @VISPT2 ; get old dlxa or dlya
|
||
ADD @VISPT ; add in increment
|
||
AND [1777'] ; mask to position bits
|
||
DAC TEM2 ; save new position
|
||
LAC @VISPT3 ; get old dlxa or dlya again
|
||
AND [30000'] ; get dlxa or dlya opcode bit
|
||
IOR TEM2 ; or in position
|
||
DAC @VISPT4 ; store it back on top of old dlxa or dlya
|
||
JMP @UPDTSUB ; return
|
||
;
|
||
; update our explosion routine
|
||
;
|
||
UPDTBIG:LWC 8. ; eight pieces to update
|
||
DAC CNT ; set counter
|
||
LAC [BIGX1INC-1] ; set pointer to update list
|
||
DAC VISPT
|
||
LAC [BIGX1-1] ; set pointers to display list
|
||
DAC VISPT2
|
||
DAC VISPT3
|
||
DAC VISPT4
|
||
UPDTLOOP:JMS UPDTSUB ; update x
|
||
JMS UPDTSUB ; update y
|
||
JMS BUMPPTS ; update pointers
|
||
ISZ CNT ; have i done all 8 bits?
|
||
JMP UPDTLOOP ; no, do next one
|
||
; yes, fall through
|
||
; opponents explosion routine
|
||
;
|
||
CHKOPP: LAC [THING-2] ; check explosion timers
|
||
DAC PTR
|
||
LAC [IM1-2]
|
||
DAC PTR2
|
||
LWC 9.
|
||
DAC CNT2
|
||
OPPBUMP:LAC PTR
|
||
ADD [6.]
|
||
DAC PTR
|
||
LAC PTR2
|
||
ADD [11.]
|
||
DAC PTR2
|
||
SUB [9.]
|
||
DAC PTR3
|
||
ISZ CNT2
|
||
JMP OPPLOOP
|
||
JMP UPDATE
|
||
|
||
OPPLOOP:LAC @PTR2 ; see if there is an explosion on this player
|
||
ASN
|
||
JMP OPPBUMP
|
||
ISZ @PTR2 ; yes, but has it run out?
|
||
JMP OPPBUMP
|
||
CLA
|
||
DAC @PTR3 ; yes, so indicate player unactive
|
||
LAC [DNOP]
|
||
DAC @PTR ; turn his explosion off
|
||
JMP OPPBUMP
|
||
;
|
||
; keep updateing random explosion
|
||
;
|
||
UPDATE: JMS RANDOM ; update explosion (get random number)
|
||
AND [77']
|
||
DAC TEM1
|
||
IOR [INC E,B00]
|
||
DAC INC1
|
||
AND [77']
|
||
SAL 3
|
||
SAL 3
|
||
SAL 2
|
||
DAC TEM2
|
||
ADD TEM1
|
||
XOR [INC 344,344]
|
||
DAC INC2
|
||
LAC TEM2
|
||
IOR [INC B00,100']
|
||
DAC INC3
|
||
JMS RANDOM
|
||
AND [77']
|
||
DAC TEM1
|
||
SAL 3
|
||
SAL 3
|
||
SAL 2
|
||
IOR TEM1
|
||
IOR [140300']
|
||
DAC INC4
|
||
XOR [22044']
|
||
DAC INC5
|
||
DAC INC6
|
||
; falls through to bullet checking routine
|
||
|
||
;
|
||
; check for bullet fired and if it hits its mark
|
||
;
|
||
CHKBULL:LAC [THING+3]
|
||
DAC PTR2
|
||
IAC
|
||
DAC PTR3
|
||
LAC [IM1+5]
|
||
DAC PTR
|
||
SUB [5]
|
||
DAC SEEPT
|
||
LWC 8. ; 8 imlacs to check
|
||
DAC CNT2
|
||
DISP1: LAC @PTR
|
||
ASZ
|
||
JMP DISP2
|
||
DISPNO: LAW 11.
|
||
ADD PTR
|
||
DAC PTR
|
||
SUB [5]
|
||
DAC SEEPT
|
||
LAW 6
|
||
ADD PTR2
|
||
DAC PTR2
|
||
IAC
|
||
DAC PTR3
|
||
ISZ CNT2
|
||
JMP DISP1
|
||
;
|
||
; now check for repting keys
|
||
;
|
||
LAC REPTCNT ; rept on?
|
||
ASN
|
||
JMP CHKKS ; no, but check for keyset repeat
|
||
ISZ REPTCNT
|
||
JMP CHKKS
|
||
CLA
|
||
KRB
|
||
SAM KEY
|
||
JMP CHKKS
|
||
SAM MOVE ; only repeat : move forwards?
|
||
JMP .+2
|
||
JMP .+3
|
||
SAM BACKUP ; move backwards?
|
||
JMP CHKKS
|
||
LWC 3.
|
||
DAC REPTCNT
|
||
JMP REPT ; do key again
|
||
|
||
REPTCNT:0
|
||
|
||
CHKKS: LAC KSCNT ; keyset rept on?
|
||
ASN
|
||
JMP @DISP ; no, so return
|
||
ISZ KSCNT
|
||
JMP @DISP
|
||
CLA
|
||
MSW
|
||
SAM KEYSET ; is it the same??
|
||
JMP @DISP
|
||
SAM [3433'] ; move forwards?
|
||
JMP .+2
|
||
JMP .+3
|
||
SAM [3436'] ; move backwards?
|
||
JMP @DISP
|
||
LWC 3.
|
||
DAC KSCNT
|
||
JMP KSREPT
|
||
;
|
||
; if there is still a player visible then kill it
|
||
;
|
||
DISP2: ISZ @PTR ; is it totally fired yet?
|
||
JMP DISPNO
|
||
LAC @SEEPT ; is he still alive
|
||
ASM
|
||
JMP DISPNO
|
||
ISZ PTR
|
||
LAC @PTR ; get our old direction
|
||
AND [3]
|
||
DAC @[SAVEDIR]
|
||
ISZ PTR
|
||
LAC @PTR ; get our old x
|
||
DAC @[SAVEDX]
|
||
ISZ PTR
|
||
LAC @PTR ; get our old y
|
||
DAC @[SAVEDY]
|
||
LAC PTR ; reset pointer
|
||
SUB [3]
|
||
DAC PTR
|
||
SUB [5]
|
||
DAC PTR4 ; set up pointer for see routine
|
||
LAW 9.
|
||
ADD CNT2
|
||
DAC KILL
|
||
DAC IID
|
||
JMS @[SEE] ; see if player hasn't moved out of the way
|
||
JMP DISPNO ; he made it in time
|
||
COA ; no, so shoot him down
|
||
DAC @PTR4 ; indicate that he is now dying
|
||
LAW 3 ; send player killed message
|
||
JMS SEND1
|
||
LAC MYBIT ; send my id
|
||
JMS SEND1
|
||
LAC KILL ; send id of player killed
|
||
JMS SEND1
|
||
LAC [DNOP]
|
||
DAC @PTR2 ; turn off eyes
|
||
LAC JMSEXP ; put in explosion in place of id
|
||
DAC @PTR3
|
||
LAC PTR4 ; point to explosion count
|
||
ADD [9.]
|
||
DAC PTR4
|
||
LWC 60. ; set explosion to last 1 1/2 sec.
|
||
DAC @PTR4
|
||
LAC MYBIT ; bump our score
|
||
JMS UPSCORE
|
||
JMP DISPNO
|
||
|
||
;
|
||
; send a word to the 10
|
||
;
|
||
SEND1: 0
|
||
DAC TEM1 ; save character
|
||
JMS REFR ; keep display up
|
||
TSF ; wait for output flag
|
||
JMP .-2 ; not ready yet
|
||
LAC TEM1 ; get character back
|
||
TPC ; transmit character
|
||
LAC TEM1
|
||
JMP @SEND1 ; return
|
||
;
|
||
; random number generator
|
||
;
|
||
RANDOM: 0
|
||
LAC RND
|
||
ADD MYBIT
|
||
RAL 2
|
||
DAC RND
|
||
XOR @RND
|
||
DAC RND
|
||
JMP @RANDOM
|
||
|
||
RND: 0
|
||
|
||
;
|
||
; update score in info tables and in display list
|
||
; enter with id in ac
|
||
;
|
||
UPSCORE:0
|
||
DAC SAVEID ; save id
|
||
LWC 8. ; now turn all ! and * off
|
||
DAC UPCNT
|
||
LAC [SCORE+3]
|
||
DAC PTSCORE
|
||
CLRALL: LAC [DNOP]
|
||
DAC @PTSCORE
|
||
LAW 5
|
||
ADD PTSCORE
|
||
DAC PTSCORE
|
||
LAC [DNOP]
|
||
DAC @PTSCORE
|
||
LAW 9.
|
||
ADD PTSCORE
|
||
DAC PTSCORE
|
||
ISZ UPCNT
|
||
JMP CLRALL
|
||
LAC SAVEID ; now bump shooting players score
|
||
JMS POSITION ; position us to correct table
|
||
LAC ITEMP1 ; bump pointer to count
|
||
ADD [4]
|
||
DAC ITEMP1
|
||
ISZ @ITEMP1 ; bump score by one
|
||
NOP
|
||
LAC SAVEID ; point to shooting players score in display
|
||
JMS POINTSC
|
||
JMS SCOREIT
|
||
LAW 41' ; insert exclamation mark
|
||
JMS GETCHR
|
||
DAC @PTSCORE
|
||
LAC KILL ; now do shot player shot count
|
||
JMS POSITION
|
||
ADD [10.]
|
||
DAC ITEMP1
|
||
ISZ @ITEMP1 ; bump it also
|
||
NOP
|
||
LAC KILL ; next update the shot count in display
|
||
JMS POINTSC
|
||
ADD [5]
|
||
DAC PTSCORE
|
||
JMS SCOREIT
|
||
LAW 52' ; insert asteric
|
||
JMS GETCHR
|
||
DAC @PTSCORE
|
||
BEL ; ring bell indicating player shot
|
||
JMP @UPSCORE ; return
|
||
|
||
POINTSC:0
|
||
CIA
|
||
DAC UPCNT
|
||
LAC [SCORE-14.] ; point to display list to update score
|
||
ADD [14.]
|
||
ISZ UPCNT
|
||
JMP .-2
|
||
DAC PTSCORE
|
||
JMP @POINTSC
|
||
;
|
||
; score generator subroutine
|
||
; enter with itemp1 -> score to be converted
|
||
; ptscore -> 3 words where djmses are to be placed
|
||
; leave with ptscore -> word 4 (one past the 3 djmses)
|
||
;
|
||
SCOREIT:0
|
||
CLA
|
||
DAC HUNDR
|
||
DAC TENS
|
||
DAC ONES
|
||
LAC @ITEMP1 ; get current score
|
||
SUB [1000.] ; make it mod 1000
|
||
ASM
|
||
JMP .-2
|
||
ADD [1000.]
|
||
DAC @ITEMP1 ; store it back for posterity
|
||
SUB [100.]
|
||
ASP
|
||
JMP DOTENS
|
||
ISZ HUNDR
|
||
JMP .-4
|
||
|
||
DOTENS: ADD [100.]
|
||
SUB [10.]
|
||
ASP
|
||
JMP DOONES
|
||
ISZ TENS
|
||
JMP .-4
|
||
|
||
DOONES: ADD [10.]
|
||
DAC ONES
|
||
LAC HUNDR
|
||
ASN
|
||
JMP ZROSUP
|
||
JMS DODIGIT
|
||
LAC TENS
|
||
DTENS: JMS DODIGIT
|
||
LAC ONES
|
||
JMS DODIGIT
|
||
JMP @SCOREIT
|
||
ZROSUP: LWC 20'
|
||
JMS DODIGIT
|
||
LAC TENS
|
||
ASN
|
||
LWC 20'
|
||
JMP DTENS
|
||
|
||
DODIGIT:0
|
||
ADD [60'-40']
|
||
ADD @[24']
|
||
DAC UPCNT
|
||
LAC @UPCNT
|
||
DACIT: DAC @PTSCORE
|
||
ISZ PTSCORE
|
||
JMP @DODIGIT
|
||
|
||
SAVEID: 0
|
||
PTSCORE:0
|
||
UPCNT: 0
|
||
ONES: 0
|
||
TENS: 0
|
||
HUNDR: 0
|
||
|
||
;
|
||
; build a long vector instruction
|
||
;
|
||
LV: 0
|
||
LAC XDELTA
|
||
AND [40000']
|
||
DAC TEM3
|
||
LAC XDELTA
|
||
ASP
|
||
CIA
|
||
DAC XDELTA
|
||
LAC YDELTA
|
||
AND [20000']
|
||
IOR TEM3
|
||
DAC TEM3
|
||
LAC YDELTA
|
||
ASP
|
||
CIA
|
||
DAC YDELTA
|
||
SUB XDELTA
|
||
ASM
|
||
JMP LV1
|
||
AND [7777']
|
||
IOR [40000']
|
||
DAC @DPTR
|
||
LAC XDELTA
|
||
IOR BEAMBIT
|
||
DAC @DPTR
|
||
LAC YDELTA
|
||
JMP LV2
|
||
|
||
LV1: CIA
|
||
AND [7777']
|
||
IOR [40000']
|
||
DAC @DPTR
|
||
LAC YDELTA
|
||
IOR BEAMBIT
|
||
DAC @DPTR
|
||
LAC XDELTA
|
||
IOR [10000']
|
||
LV2: IOR TEM3
|
||
DAC @DPTR
|
||
JMP @LV
|
||
|
||
;
|
||
; generate new display
|
||
; send i moved message to 10
|
||
; set up possible visible opponents
|
||
;
|
||
PRINT: 0
|
||
LAC @DSTAT ; check status of player
|
||
ASZ ; is he not playing?
|
||
JMP INGAME ; no
|
||
LAW 116' ; yes, display a 'n' then
|
||
JMP SETST
|
||
|
||
HEACT: LAC [DJMS D040,] ; if he is active then don't display anything
|
||
JMP SETST2
|
||
|
||
INGAME: ASP ; is he dying?
|
||
JMP HEACT ; no, then he is active!
|
||
LAW 104' ; yes, then display a 'd' for dead
|
||
SETST: JMS GETCHR ; get the character
|
||
SETST2: DAC @[DEAD] ; put it in display
|
||
LAC @DIR ; first do direction letter
|
||
AND [3]
|
||
ADD [DIRLET]
|
||
DAC TEM1
|
||
LAC @TEM1
|
||
JMS GETCHR
|
||
DAC @[LETTER]
|
||
LAC TOPSW ; see if top or inside view
|
||
ASN
|
||
JMP INSIDE
|
||
TOPV: LAC [DLIST-1] ;write over maze display list
|
||
DAC DPTR
|
||
LAC [DLYA 1600',]
|
||
DAC @DPTR
|
||
LAC [DJMS DNL3,]
|
||
DAC @DPTR
|
||
LWC 32.
|
||
DAC CNT
|
||
LAC [MAZE-1]
|
||
DAC PTR
|
||
LAC @DY
|
||
SAL 3
|
||
SAL 1
|
||
ADD @DX
|
||
IAC
|
||
CIA
|
||
DAC PTR4
|
||
NXTW: LWC 16.
|
||
DAC CNT2
|
||
LAC [100000']
|
||
DAC BIT
|
||
ISZ PTR
|
||
NXTB: ISZ PTR4 ; have we reached our location?
|
||
JMP .+2
|
||
JMP ME
|
||
LAC @PTR ; see is square open or closed
|
||
AND BIT
|
||
ASZ
|
||
JMP ON
|
||
LAC [DJMS SPMAZE,]
|
||
JMP ON+1
|
||
|
||
ME: LAC @DIR ; figure out which arrow to use
|
||
AND [3]
|
||
ADD [ARROWS]
|
||
DAC PTR3
|
||
LAC @PTR3
|
||
JMP ON+1
|
||
|
||
ON: LAC [DJMS CHARMZE,]
|
||
DAC @DPTR
|
||
CLL
|
||
LAC BIT
|
||
RAR 1
|
||
DAC BIT
|
||
ISZ CNT2 ; this line done?
|
||
JMP NXTB
|
||
LAC [DJMS DNL3,]
|
||
DAC @DPTR
|
||
ISZ CNT
|
||
JMP NXTW ; this row done?
|
||
CLA ; dhlt at end
|
||
DAC @DPTR
|
||
JMP @PRINT
|
||
|
||
INSIDE: JMS PNTBIT
|
||
LAC [WALLS]
|
||
DAC WPTR
|
||
IAC
|
||
DAC WPTR2
|
||
CLA
|
||
DAC CNT
|
||
LAC [DLIST-1]
|
||
DAC DPTR
|
||
LAC [20000']
|
||
DAC BEAMBIT
|
||
DSN
|
||
JMP .-1
|
||
LAC @DIR
|
||
AND [1]
|
||
ASZ
|
||
JMP EW
|
||
JMS CREMENT
|
||
DAC TEM1
|
||
CIA
|
||
AND [20']
|
||
IOR [RAL 1]
|
||
DAC NOP2
|
||
XOR [20']
|
||
DAC NOP3
|
||
PRNT1: LAC MPTR
|
||
ADD TEM1
|
||
DAC NEXTBIT
|
||
LAC @NEXTBIT
|
||
AND BIT
|
||
DAC NEXTBIT
|
||
LAC BIT
|
||
CLL
|
||
NOP2: NOP
|
||
AND @MPTR
|
||
JMS LBIT
|
||
LAC BIT
|
||
CLL
|
||
NOP3: NOP
|
||
AND @MPTR
|
||
JMS RBIT
|
||
LAC MPTR
|
||
ADD TEM1
|
||
DAC MPTR
|
||
LAC NEXTBIT
|
||
JMS ENDCHECK
|
||
LAC CNT
|
||
SAM [31.] ; special check
|
||
JMP .+2
|
||
JMP CLOSEOUT
|
||
ISZ WPTR
|
||
ISZ WPTR2
|
||
ISZ CNT
|
||
JMP PRNT1
|
||
EW: JMS CREMENT
|
||
DAC TEM1
|
||
AND [20']
|
||
IOR [RAL 1]
|
||
DAC NOP4
|
||
DAC NOP5
|
||
PRNT2: LAC BIT
|
||
CLL
|
||
NOP5: NOP
|
||
AND @MPTR
|
||
DAC NEXTBIT
|
||
LAC MPTR
|
||
ADD TEM1
|
||
DAC TEM2
|
||
LAC BIT
|
||
AND @TEM2
|
||
JMS LBIT
|
||
LAC MPTR
|
||
SUB TEM1
|
||
DAC TEM2
|
||
LAC BIT
|
||
AND @TEM2
|
||
JMS RBIT
|
||
LAC BIT
|
||
CLL
|
||
NOP4: NOP
|
||
DAC BIT
|
||
LAC NEXTBIT
|
||
JMS ENDCHECK
|
||
ISZ WPTR
|
||
ISZ WPTR2
|
||
ISZ CNT
|
||
JMP PRNT2
|
||
|
||
LBIT: 0
|
||
DAC LASTLEF
|
||
ASZ
|
||
JMP LB1
|
||
LAC @WPTR ; hallway
|
||
CIA
|
||
ADD WALLS
|
||
IOR [10000']
|
||
DAC @DPTR
|
||
LAC @WPTR
|
||
ADD WALLS
|
||
IOR [20000']
|
||
DAC @DPTR
|
||
LAC [DJMS WAIT,]
|
||
DAC @DPTR
|
||
LAC CNT
|
||
ASN
|
||
JMP LB2
|
||
CAL
|
||
DAC XDELTA
|
||
LAC @WPTR
|
||
SAL 1
|
||
CIA
|
||
DAC YDELTA
|
||
JMS LV
|
||
LB2: LAC @WPTR2
|
||
CIA
|
||
ADD WALLS
|
||
IOR [20000']
|
||
DAC @DPTR
|
||
LAC [DJMS WAIT,]
|
||
DAC @DPTR
|
||
CAL
|
||
DAC YDELTA
|
||
LAC @WPTR
|
||
SUB @WPTR2
|
||
DAC XDELTA
|
||
JMS LV
|
||
JMS FIX
|
||
CAL
|
||
DAC XDELTA
|
||
LAC @WPTR2
|
||
SAL 1
|
||
DAC YDELTA
|
||
JMS LV
|
||
LAC [20000']
|
||
DAC BEAMBIT
|
||
CAL
|
||
DAC YDELTA
|
||
LAC @WPTR2
|
||
SUB @WPTR
|
||
DAC XDELTA
|
||
JMS LV
|
||
JMP @LBIT
|
||
|
||
LB1: LAC @WPTR2 ; wall
|
||
CIA
|
||
ADD WALLS
|
||
IOR [10000']
|
||
DAC @DPTR
|
||
LAC @WPTR2
|
||
ADD WALLS
|
||
IOR [20000']
|
||
DAC @DPTR
|
||
LAC [DJMS WAIT,]
|
||
DAC @DPTR
|
||
LAC @WPTR
|
||
SUB @WPTR2
|
||
DAC YDELTA
|
||
CIA
|
||
DAC XDELTA
|
||
JMS LV
|
||
LAC @WPTR
|
||
CIA
|
||
ADD WALLS
|
||
IOR [10000']
|
||
DAC @DPTR
|
||
XOR [30000']
|
||
DAC @DPTR
|
||
LAC [DJMS WAIT,]
|
||
DAC @DPTR
|
||
LAC @WPTR
|
||
SUB @WPTR2
|
||
DAC XDELTA
|
||
DAC YDELTA
|
||
JMS LV
|
||
JMP @LBIT
|
||
|
||
RBIT: 0
|
||
DAC LASTRIG
|
||
ASZ
|
||
JMP RB1
|
||
LAC @WPTR ; hallway
|
||
ADD WALLS
|
||
IOR [10000']
|
||
DAC @DPTR
|
||
XOR [30000']
|
||
DAC @DPTR
|
||
LAC [DJMS WAIT,]
|
||
DAC @DPTR
|
||
LAC CNT
|
||
ASN
|
||
JMP RB2
|
||
CAL
|
||
DAC XDELTA
|
||
LAC @WPTR
|
||
SAL 1
|
||
CIA
|
||
DAC YDELTA
|
||
JMS LV
|
||
RB2: LAC @WPTR2
|
||
CIA
|
||
ADD WALLS
|
||
IOR [20000']
|
||
DAC @DPTR
|
||
LAC [DJMS WAIT,]
|
||
DAC @DPTR
|
||
CAL
|
||
DAC YDELTA
|
||
LAC @WPTR2
|
||
SUB @WPTR
|
||
DAC XDELTA
|
||
JMS LV
|
||
JMS FIX
|
||
CAL
|
||
DAC XDELTA
|
||
LAC @WPTR2
|
||
SAL 1
|
||
DAC YDELTA
|
||
JMS LV
|
||
LAC [20000']
|
||
DAC BEAMBIT
|
||
CAL
|
||
DAC YDELTA
|
||
LAC @WPTR
|
||
SUB @WPTR2
|
||
DAC XDELTA
|
||
JMS LV
|
||
JMP @RBIT
|
||
|
||
RB1: LAC @WPTR2 ; wall
|
||
ADD WALLS
|
||
IOR [10000']
|
||
DAC @DPTR
|
||
XOR [30000']
|
||
DAC @DPTR
|
||
LAC [DJMS WAIT,]
|
||
DAC @DPTR
|
||
LAC @WPTR
|
||
SUB @WPTR2
|
||
DAC XDELTA
|
||
DAC YDELTA
|
||
JMS LV
|
||
LAC @WPTR2
|
||
ADD WALLS
|
||
IOR [10000']
|
||
DAC @DPTR
|
||
LAC @WPTR2
|
||
CIA
|
||
ADD WALLS
|
||
IOR [20000']
|
||
DAC @DPTR
|
||
LAC [DJMS WAIT,]
|
||
DAC @DPTR
|
||
LAC @WPTR
|
||
SUB @WPTR2
|
||
DAC XDELTA
|
||
CIA
|
||
DAC YDELTA
|
||
JMS LV
|
||
JMP @RBIT
|
||
|
||
FIX: 0
|
||
CLL
|
||
LAC NEXTBIT
|
||
ASN
|
||
STL
|
||
CLA
|
||
RAR 3
|
||
DAC BEAMBIT
|
||
JMP @FIX
|
||
|
||
ENDCHECK:0
|
||
ASN
|
||
JMP @ENDCHECK
|
||
CLOSEOUT:LAC CNT ; set length of hallway
|
||
DAC HALLNGTH
|
||
LAC @WPTR2
|
||
ADD WALLS
|
||
IOR [20000']
|
||
DAC @DPTR
|
||
XOR [30000']
|
||
DAC @DPTR
|
||
LAC [DJMS WAIT,]
|
||
DAC @DPTR
|
||
CAL
|
||
DAC YDELTA
|
||
LAC @WPTR2
|
||
SAL 1
|
||
DAC ETEM
|
||
CIA
|
||
DAC XDELTA
|
||
JMS LV
|
||
LAC LASTLEF
|
||
ASZ
|
||
LAC [20000']
|
||
DAC BEAMBIT
|
||
CAL
|
||
DAC XDELTA
|
||
LAC ETEM
|
||
CIA
|
||
DAC YDELTA
|
||
JMS LV
|
||
LAC [20000']
|
||
DAC BEAMBIT
|
||
CAL
|
||
DAC YDELTA
|
||
LAC ETEM
|
||
DAC XDELTA
|
||
JMS LV
|
||
LAC LASTRIG
|
||
ASN
|
||
JMP EN1
|
||
CAL
|
||
DAC XDELTA
|
||
LAC ETEM
|
||
DAC YDELTA
|
||
JMS LV
|
||
EN1: CAL
|
||
DAC @DPTR ; insert the dhlt
|
||
JMS VISIBLE ; now check for visible opponents
|
||
JMP @PRINT
|
||
|
||
;
|
||
; check for visible opponents
|
||
;
|
||
VISIBLE:0
|
||
LWC 9. ; 8 imlacs to do
|
||
DAC CNT2
|
||
LAC [DSPTCH-1] ; set pointer to imlac info tables
|
||
DAC VISPT
|
||
LAC [THING-1] ; set up pointer to dlya's
|
||
DAC VISPT2
|
||
IAC ; point to dsts's
|
||
DAC VISPT3
|
||
ADD [2] ; point to djms's eyes
|
||
DAC VISPT4
|
||
IAC ; point to djms's body (name)
|
||
DAC VISPT5
|
||
VISLOOP:ISZ CNT2 ; have we checked all 8?
|
||
JMP .+2 ; no
|
||
JMP @VISIBLE ; yes, return
|
||
LAC @VISPT ; get address of imlac's info table
|
||
DAC SEEPT
|
||
DAC PTR4
|
||
LAC @SEEPT ; may change it on us, so get status
|
||
ASZ ; is this imlac playing?
|
||
JMP PLAYING ; yes
|
||
JMP .+3
|
||
BLOWING:LAC JMSEXP
|
||
JMP .+2
|
||
NOSEE: LAC [DNOP] ; no, so make him invisble or exploding
|
||
ISZ VISPT2 ; don't change y
|
||
ISZ VISPT3 ; don't change dsts
|
||
DAC @VISPT5 ; set to invisible or exploding
|
||
LAC [DNOP] ; no eyes wanted
|
||
DAC @VISPT4
|
||
BUMP: JMS BUMPPTS ; update pointers to next imlac
|
||
JMP VISLOOP ; now do next imlac
|
||
;
|
||
; active player
|
||
;
|
||
PLAYING:LAW 9. ; set id
|
||
ADD CNT2
|
||
DAC IID
|
||
JMS SEEUS ; see if it can be seen
|
||
JMP NOSEE ; can't be seen
|
||
LAC @PTR4 ; could he be blowing up?
|
||
ASP
|
||
JMP HEVIS ; he is visible
|
||
JMP BLOWING ; he is blowing up
|
||
|
||
SEEUS: 0
|
||
LAC @DIR
|
||
AND [3]
|
||
DAC @[SAVEDIR]
|
||
LAC @DX
|
||
DAC @[SAVEDX]
|
||
LAC @DY
|
||
DAC @[SAVEDY]
|
||
JMS @[SEE]
|
||
JMP @SEEUS
|
||
ISZ SEEUS
|
||
JMP @SEEUS
|
||
|
||
SEEPT: 0
|
||
FTEMP: 0
|
||
|
||
;
|
||
; visible opponnent!
|
||
;
|
||
FIGX: 0
|
||
LAC @[DISTAN] ; now i know i see him
|
||
ADD [WALLS] ; get currect position for name
|
||
DAC FTEMP
|
||
LAC @FTEMP
|
||
CIA
|
||
ADD WALLS
|
||
IOR [20000'] ; make it a dlya
|
||
JMP @FIGX
|
||
HEVIS: JMS FIGX ; figure the new dlxa
|
||
DAC @VISPT2 ; stick it in
|
||
LAC @[DISTAN] ; get distance to opponent
|
||
SAR 3 ; scale it to 2 significant bits
|
||
XOR [3] ; complement meanning
|
||
IOR [DSTS 0] ; make it a dsts instruction
|
||
DAC @VISPT3 ; stick it in display
|
||
JMS FIGEYES ; figure out whether or not eyes should be displayed
|
||
DAC @VISPT4
|
||
LAC IID ; now see which opponent we can see
|
||
ADD [TNUM-1] ; get appropriate name
|
||
DAC TEM2
|
||
LAC @TEM2
|
||
DAC @VISPT5 ; stick appropriate djmp to name in display list
|
||
JMP BUMP ; now do next opponent
|
||
|
||
FIGEYES:0
|
||
LAC @DIR ; see if we are facing each other
|
||
AND [3]
|
||
ADD [4]
|
||
SUB @[IDIR]
|
||
AND [3]
|
||
ADD [EYTAB]
|
||
DAC FTEMP
|
||
LAC @FTEMP
|
||
JMP @FIGEYES
|
||
;
|
||
; shift to the left 13 subroutine
|
||
;
|
||
SAR13: 0
|
||
SAR 3
|
||
SAR 3
|
||
SAR 3
|
||
SAR 3
|
||
SAR 1
|
||
ASN
|
||
LAW 1
|
||
JMP @SAR13
|
||
;
|
||
; blow us up and start again
|
||
;
|
||
ENDER: CLA ; return to inside display
|
||
DAC TOPSW
|
||
LAC [AD2] ; set blow up display as current display
|
||
DAC WHICHD
|
||
LAC [BIGX1INC-1] ; set pointer to increment table
|
||
DAC VISPT
|
||
LWC 4. ; 8 pieces to do but we will set up 2 at a time
|
||
DAC CNT
|
||
BLOWLOOP:JMS RANDOM ; get random number
|
||
JMS SAR13 ; scale it to 2 +- sig bits
|
||
DAC TEM1 ; save for next bit
|
||
DAC @VISPT ; store delta in first x
|
||
JMS RANDOM ; get another random number
|
||
JMS SAR13 ; scale it too
|
||
DAC TEM2 ; also save it
|
||
DAC @VISPT ; store delta in first y
|
||
LAC TEM1 ; get back first delta x
|
||
CIA ; we want to balance explosion so
|
||
DAC @VISPT ; make next bit go opposite direction
|
||
LAC TEM2 ; store second y also in opposite direction
|
||
CIA
|
||
DAC @VISPT
|
||
ISZ CNT ; are we done with setting up deltas
|
||
JMP BLOWLOOP ; no, do next 2
|
||
LAC [BIGX1-1] ; now reset display list dlxas and dlyas
|
||
DAC TEM1
|
||
LWC 8. ; eight bits to do
|
||
DAC CNT
|
||
CLRLOOP:JMS CLRSUB ; reset the dlxa
|
||
JMS CLRSUB ; reset the dlya
|
||
LAC TEM1 ; update pointer to next bit of explosion
|
||
ADD [5]
|
||
DAC TEM1
|
||
ISZ CNT ; did we do all eight bits?
|
||
JMP CLRLOOP ; no, do the rest
|
||
JMP RETN ; wait explosion out
|
||
|
||
CLRSUB: 0
|
||
ISZ TEM1 ; position pointer
|
||
LAC @TEM1 ; get dlxa or dlya
|
||
AND [30000'] ; get opcode bits
|
||
IOR [1000'] ; position to center of screen
|
||
DAC @TEM1 ; stuff it back
|
||
JMP @CLRSUB ; return
|
||
|
||
;
|
||
; tty input handler
|
||
;
|
||
CHARIN: 0
|
||
RSF ; tty input?
|
||
JMP EXIT ; no, so ignore interupt
|
||
CLA
|
||
RRC ; get character
|
||
AND [177'] ; mask to 7 characters
|
||
DAC INCHAR ; save it
|
||
;
|
||
; check to see if we are waiting for characters
|
||
;
|
||
LAC ICNT
|
||
ASN
|
||
JMP SETUP ; no so interpret character we got
|
||
LAC INCHAR ; yes, so stuff character in info table
|
||
DAC @17'
|
||
ISZ ICNT ; was that all we wanted?
|
||
JMP EXIT ; no, wait for more
|
||
JMP @IDSPTCH ; yes, go to routine now
|
||
|
||
SETUP: LAC [ININFO-1] ; set up input buffer
|
||
DAC 17`
|
||
;
|
||
; check for imlac wants out message
|
||
; if he does then do the following:
|
||
; 1) indicate imlac non-active in info table
|
||
; 2) dnop his score, body, eyes and name
|
||
;
|
||
CHK1: LAC INCHAR ; get character read back
|
||
SAM [1] ; is it type 1?
|
||
JMP CHK2 ; no, check next type
|
||
LWC 1 ; wait for one more word [id]
|
||
DAC ICNT
|
||
LAC [DTYP1] ; set up dispatch address
|
||
SETOUT: DAC IDSPTCH
|
||
JMP EXIT ; wait for characters to come in
|
||
|
||
DTYP1: JMS TESTID ; get id of imlac that wants out
|
||
GONER: ASN
|
||
JMS ERROR ; error if id = 0
|
||
JMS POSITION ; get position into info table
|
||
DAC 17'
|
||
LWC 10.
|
||
DAC ICNT2 ; clear info entry
|
||
CLA
|
||
DAC @ITEMP1 ; clear status
|
||
DAC @17' ; clear the rest
|
||
ISZ ICNT2
|
||
JMP .-2
|
||
JMS GETCNT ; now clear display list score
|
||
LAC [SCORE-15.]
|
||
ADD [14.]
|
||
ISZ ICNT2
|
||
JMP .-2
|
||
DAC 17'
|
||
LAC [DNOP] ; dnop all digits
|
||
DAC @17'
|
||
DAC @17'
|
||
DAC @17'
|
||
DAC @17'
|
||
ISZ 17'
|
||
DAC @17'
|
||
DAC @17'
|
||
DAC @17'
|
||
DAC @17'
|
||
JMS GETCNT ; now clear displayed name
|
||
LAC [IML1-9.]
|
||
ADD [8.]
|
||
ISZ ICNT2
|
||
JMP .-2
|
||
DAC 17'
|
||
LAC [DJMS D040,] ; get space
|
||
DAC @17'
|
||
DAC @17'
|
||
DAC @17'
|
||
DAC @17'
|
||
DAC @17'
|
||
DAC @17'
|
||
DAC @17'
|
||
JMS GETCNT ; finally make him invisible
|
||
LAC [THING-4]
|
||
ADD [6]
|
||
ISZ ICNT2
|
||
JMP .-2
|
||
DAC 17'
|
||
LAC [DNOP]
|
||
DAC @17' ; clear eyes
|
||
DAC @17' ; clear body (name)
|
||
LAC ININFO ; see if it is my real it that is leaving
|
||
SAM MYREAL ; if so then exit program, return to ssv
|
||
JMP CHKNR
|
||
;
|
||
; exit routine
|
||
; send player wants out to 10
|
||
; then return to ssv
|
||
;
|
||
LAW 1 ; send i want out code
|
||
JMS SEND1
|
||
LAC MYREAL ; send my id
|
||
JMS SEND1
|
||
LAC [17776'] ; restore ssv's buffer to full buffer
|
||
DAC @[25']
|
||
LEAVE: IOF ; turn off interupts
|
||
JMP @.+1 ; now exit to ssv
|
||
101' ; address of where to exit to
|
||
|
||
CHKNR: SAM MYBIT ; see if it is the guy we are sim.
|
||
JMP EXIT ; if not then we are done
|
||
LAW 1 ; sent leaving message to 10 for him
|
||
JMS SEND1
|
||
LAC MYBIT
|
||
JMS SEND1
|
||
LAC MYREAL ; return to our real id
|
||
JMS GETD
|
||
JMS PRINT ; rebuild display
|
||
JMP EXIT
|
||
;
|
||
; check for moved to new location message
|
||
; if it is then do the folowing:
|
||
; 1) indicate player active in info table
|
||
; 2) update dir, x, and y in info table
|
||
; 3) check visibility and set it correctly
|
||
;
|
||
CHK2:
|
||
IFN FAST,[
|
||
SUB [20'] ; no chance of move if <20
|
||
ASP ; skip if 0 or +
|
||
JMP CHK23 ; negative, not a new protocol move.
|
||
SUB [20'] ; a move if 17< x <40
|
||
ASP
|
||
JMP CHK22 ;ah, if 20=< and <40, definitely new-ptcl move.
|
||
SUB [100'] ; a move if ge 140
|
||
ASP
|
||
JMP INSRTCH ; 40=< and <140, a char.
|
||
CHK22: LAC INCHAR
|
||
JMP @[CHKI20] ;new ptcl move. go hack.
|
||
CHK23:
|
||
]
|
||
LAC INCHAR
|
||
SAM [2] ; is it type 2?
|
||
JMP CHK3 ; no but see if it is type 3
|
||
LWC 4 ; 4 more words to come
|
||
DAC ICNT
|
||
LAC [DTYP2] ; set up dispatch location
|
||
JMP SETOUT
|
||
|
||
DTYP2: JMS TESTID
|
||
DAC IID
|
||
JMS POSITION ; indicate player is active in info tables
|
||
LAC @ITEMP1 ; get current status
|
||
ASZ
|
||
ASP ; ignore message if he is exploding
|
||
JMP .+2
|
||
JMP EXIT
|
||
STA
|
||
DAC @ITEMP1 ; say player is active
|
||
ISZ ITEMP1
|
||
LAC ININFO+1 ; save new direction
|
||
IOR [100']
|
||
AND [103']
|
||
SAM ININFO+1
|
||
JMS ERROR ; direction greater than 3
|
||
AND [3] ; or not in 10n format
|
||
DAC @ITEMP1
|
||
ISZ ITEMP1
|
||
LAC ININFO+2 ; save new x location
|
||
JMS TESTLOC ; make sure it is legal
|
||
DAC @ITEMP1
|
||
ISZ ITEMP1
|
||
LAC ININFO+3 ; save new y location
|
||
JMS TESTLOC
|
||
DAC @ITEMP1
|
||
|
||
;re-entry pt from higher 2k
|
||
|
||
CHK25: JMS GETCNT ; set up pointer to his display list slot
|
||
LAC [THING-7]
|
||
ADD [6]
|
||
ISZ ICNT2
|
||
JMP .-2
|
||
DAC 17'
|
||
JMS SEEUS ; can he be seen?
|
||
JMP NOTVIS ; no
|
||
JMS FIGX ; yes, now figure dlxa
|
||
DAC @17' ; store it away
|
||
LAC @[DISTAN] ; now figure dsts
|
||
SAR 3
|
||
XOR [3]
|
||
IOR [DSTS 0]
|
||
DAC @17'
|
||
ISZ 17' ; skip over wait
|
||
JMS FIGEYES ; next do eyes
|
||
DAC @17' ; store them
|
||
LAC IID ; last is name
|
||
ADD [TNUM-1]
|
||
DAC ITEMP1
|
||
LAC @ITEMP1
|
||
DAC @17'
|
||
JMP MCHK ; see if id is ours
|
||
NOTVIS: LAC [DNOP] ; if not visible then make it so
|
||
ISZ 17' ; skip dlxa
|
||
ISZ 17' ; skip dsts
|
||
ISZ 17' ; skip over wait
|
||
DAC @17' ; clear eyes
|
||
DAC @17' ; clear body (name)
|
||
MCHK: LAC IID ; see if it is us
|
||
SAM MYBIT
|
||
JMP EXIT ; no, done
|
||
JMS PRINT ; if so then update display
|
||
JMP EXIT ; done
|
||
|
||
;
|
||
; check for player shot message
|
||
; if so then do the following:
|
||
; 1) indicate in table that he is blowing up
|
||
; 2) bump shooting players score
|
||
; 3) generate explosion if visible
|
||
; 4) if this imlac got hit then:
|
||
; a) set life flag to shot
|
||
; b) put name of who shot us in whodidit
|
||
;
|
||
CHK3: SAM [3] ; type 3?
|
||
JMP CHK4 ; no, but try type 4
|
||
LWC 2 ; two words to wait for
|
||
DAC ICNT
|
||
LAC [DTYP3] ; set dispatch address
|
||
JMP SETOUT
|
||
|
||
DTYP3: JMS TESTID
|
||
LAC ININFO+1
|
||
ASN
|
||
JMS ERROR ; id zero
|
||
SUB [9.]
|
||
ASP
|
||
JMP .+3
|
||
ADD [9.]
|
||
JMS ERROR ; id greater than 8
|
||
ADD [9.]
|
||
DAC KILL ; save dying id for upscore
|
||
JMS POSITION ; indicate player is dying
|
||
COA
|
||
DAC @ITEMP1
|
||
LAC ITEMP1
|
||
ADD [5]
|
||
DAC ITEMP1
|
||
ADD [4]
|
||
DAC ITEMP2
|
||
CAL ;turn off any firing we have on him
|
||
DAC @ITEMP1
|
||
LWC 60. ; set explosion to last 1 1/2 sec
|
||
DAC @ITEMP2
|
||
LAC ININFO+1 ; see if i was shot
|
||
SAM MYBIT
|
||
JMP NOTME
|
||
LAC ININFO
|
||
ADD [TNUM-1] ; say who did it in whodidit
|
||
DAC ITEMP2
|
||
LAC @ITEMP2
|
||
DAC @[WHODIDIT]
|
||
LAC ININFO ; wait longer in big
|
||
DAC BIGEXP ; explosion if we are playing ourselves
|
||
SAM MYREAL ; so our new starting loc will be in effect
|
||
JMP .+3
|
||
LWC 120.
|
||
JMP .+2
|
||
LWC 80.
|
||
XAM BIGEXP
|
||
JMS UPSCORE ; update scores
|
||
JMP ENDER
|
||
|
||
NOTME: LAC ININFO+1 ; now point into display list
|
||
CIA
|
||
DAC ICNT2
|
||
LAC [THING-2]
|
||
ADD [6]
|
||
ISZ ICNT2
|
||
JMP .-2
|
||
DAC ITEMP2
|
||
SUB [1] ; set pointer to eyes
|
||
DAC ITEMP1
|
||
LAC @ITEMP2 ; is he currently visible?
|
||
SAM [DNOP]
|
||
JMP VIS1 ; yes
|
||
JMP NOEXPLO ; no
|
||
|
||
VIS1: LAC [DNOP]
|
||
DAC @ITEMP1 ; yes, clear eyes
|
||
LAC JMSEXP ; stick in jms to explosion
|
||
DAC @ITEMP2
|
||
NOEXPLO:LAC ININFO ; bump scores
|
||
JMS UPSCORE ; and update scores in display list
|
||
JMP EXIT
|
||
|
||
;
|
||
; check to see if new name specified
|
||
; if so then do the following:
|
||
; 1) fill in approprate name display subroutine
|
||
; 2) if mybit = 0 then assign the id to mybit
|
||
;
|
||
CHK4: SAM [4] ; type 4?
|
||
JMP ERASER ; no, keep looking
|
||
LWC 11. ; 11. more characters to wait for
|
||
DAC ICNT
|
||
LAC [DTYP4] ; set dispatch address
|
||
JMP SETOUT
|
||
|
||
DTYP4: JMS TESTID
|
||
LAC MYBIT ; see if mybit is zero
|
||
ASZ
|
||
JMP GOTMINE
|
||
LAC ININFO ; yes, so set our id
|
||
DAC MYREAL
|
||
JMS GETD
|
||
IFE FAST, DAC @[ORIG] ; indicate origional id in display
|
||
GOTMINE:LAC [ININFO] ; set up pointers for transfer
|
||
DAC 16'
|
||
JMS GETCNT
|
||
LAC [IML1-8.] ; remember 1st char is offset char
|
||
ADD [8.]
|
||
ISZ ICNT2
|
||
JMP .-2
|
||
DAC 17'
|
||
DAC ITEMP2
|
||
CLA
|
||
DAC SPACES
|
||
LWC 6 ; move 6 character name
|
||
DAC ICNT2
|
||
CONVNXT:LAC @16'
|
||
SUB [140'] ; translate to lower case
|
||
ASM
|
||
SUB [40']
|
||
ADD [140']
|
||
SAM [40'] ; space?
|
||
JMP .+2 ; no
|
||
ISZ SPACES ; yes count them for offset char
|
||
JMS GETCHR ; convert to djms
|
||
DAC @17'
|
||
ISZ ICNT2
|
||
JMP CONVNXT
|
||
LAC SPACES ; now fix offset character
|
||
ADD [CENTER]
|
||
DAC ITEMP1
|
||
LAC @ITEMP1
|
||
DAC @ITEMP2
|
||
LAC ININFO ; now store scores
|
||
JMS POSITION
|
||
ADD [4]
|
||
DAC ITEMP1
|
||
JMS FIXSCO ; do # of opponents shot
|
||
LAC ININFO
|
||
JMS POINTSC
|
||
JMS SCOREIT
|
||
LAC ITEMP1
|
||
ADD [6]
|
||
DAC ITEMP1
|
||
JMS FIXSCO ; now do # of times shot
|
||
LAC ININFO
|
||
JMS POINTSC
|
||
ADD [5]
|
||
DAC PTSCORE
|
||
JMS SCOREIT
|
||
JMP EXIT
|
||
|
||
FIXSCO: 0
|
||
LAC @16'
|
||
AND [77']
|
||
SAL 3
|
||
SAL 3
|
||
DAC ITEMP2
|
||
LAC @16'
|
||
AND [77']
|
||
IOR ITEMP2
|
||
DAC @ITEMP1
|
||
JMP @FIXSCO
|
||
|
||
SPACES: 0
|
||
|
||
;
|
||
; set up our id
|
||
;
|
||
; enter with id in ac
|
||
;
|
||
GETD: 0
|
||
DAC MYBIT
|
||
SUB [1]
|
||
DAC MYBIT1 ; store normalized 0-7 id.
|
||
ADD [DSPTCH]
|
||
DAC ITEMP1
|
||
LAC @ITEMP1 ; set up dstat, dx, dy, and dir ptrs
|
||
DAC DSTAT
|
||
IAC
|
||
DAC DIR
|
||
IAC
|
||
DAC DX
|
||
IAC
|
||
DAC DY
|
||
IFE FAST,[
|
||
LAC MYBIT ; now get our id in character
|
||
IOR [60']
|
||
JMS GETCHR
|
||
DAC @[CURENT] ; say our current id in display
|
||
]
|
||
JMP @GETD
|
||
;
|
||
;
|
||
; erase ring buffer?
|
||
;
|
||
ERASER: SAM [14'] ; type 4?
|
||
JMP INSRTCH ; no, just insert into ring buffer
|
||
JMS ERASE
|
||
JMP EXIT
|
||
|
||
ERASE: 0
|
||
LWC 4 ; reset line count
|
||
DAC RINGLC
|
||
LAC [RINGST] ; reset both pointers
|
||
DAC RNGPT
|
||
IAC
|
||
DAC RNGPT2
|
||
LAC [DJMS D012,] ; replace djmp to curser
|
||
DAC @RNGPT
|
||
LAC [DJMS CUR,]
|
||
DAC @RNGPT2
|
||
LAC [DJMP RINGST,]
|
||
DAC @[RING]
|
||
DAC @[RINGEND]
|
||
JMP @ERASE
|
||
|
||
;
|
||
; get djms for a character
|
||
;
|
||
GETCHR: 0
|
||
AND [177'] ; mask to 7 bits
|
||
SAM [12'] ; line feed?
|
||
JMP .+3
|
||
LAC [DJMS D012,]
|
||
JMP STORECH
|
||
SAM [10'] ; back space?
|
||
JMP .+3
|
||
LAC [DJMS D010,]
|
||
JMP STORECH
|
||
SAM [15'] ; cr?
|
||
JMP .+3
|
||
LAC [DJMS D015,]
|
||
JMP STORECH
|
||
SUB [40'] ; don't allow anything below 40
|
||
ASP
|
||
CLA
|
||
ADD [40']
|
||
SUB [140'] ; translate to lower case
|
||
ASM
|
||
SUB [40']
|
||
ADD [140'-40']
|
||
ADD @[24'] ; convert to djms
|
||
DAC ITEMP1
|
||
LAC @ITEMP1
|
||
STORECH:DAC ITEMP1
|
||
JMP @GETCHR
|
||
;
|
||
; insert character into ring buffer
|
||
;
|
||
INSRTCH:JMS FORWARD
|
||
LAC INCHAR
|
||
JMS GETCHR ; get djms for character
|
||
SAM [DJMS D012,]
|
||
JMP NOTNL ; no
|
||
ISZ RINGLC ; yes, but is there room on screen?
|
||
JMP NOTNL
|
||
JMS ROLL
|
||
JMP OK
|
||
|
||
NOTNL: LAC RNGPT2
|
||
SAM RNGPT ; have we filled entire buffer?
|
||
JMP OK ; no
|
||
JMS ROLL ; yes, roll top line off
|
||
OK: LAC [DJMP CUR,]
|
||
DAC @RNGPT2
|
||
JMS BACK ; back up pointer
|
||
LAC ITEMP1 ; get djms again
|
||
DAC @RNGPT2 ; stick in on top of old djmp cur
|
||
JMS FORWARD ; move pointer back up
|
||
LAC INCHAR
|
||
SAM [15']
|
||
JMP EXIT ; done
|
||
LAW 12'
|
||
DAC INCHAR
|
||
JMP INSRTCH
|
||
|
||
FORWARD:0 ; roll rngpt2 forward one slot
|
||
LAC RNGPT2
|
||
IAC
|
||
SAM [RINGEND]
|
||
JMP .+2
|
||
LAC [RINGST]
|
||
DAC RNGPT2
|
||
JMP @FORWARD
|
||
|
||
BACK: 0
|
||
STA
|
||
ADD RNGPT2
|
||
SAM [RING]
|
||
JMP .+2
|
||
LAC [RINGEND-1]
|
||
DAC RNGPT2
|
||
JMP @BACK
|
||
|
||
ROLL: 0 ; roll ringpt forward one line
|
||
LOOK: LAC RNGPT
|
||
IAC
|
||
SAM [RINGEND]
|
||
JMP .+2
|
||
LAC [RINGST]
|
||
SAM RNGPT2
|
||
JMP .+4
|
||
JMS ERASE
|
||
JMS FORWARD
|
||
JMP @ROLL
|
||
DAC RNGPT
|
||
LAC @RNGPT
|
||
SAM [DJMS D012,]
|
||
JMP LOOK
|
||
MOVED: LAC RNGPT
|
||
AND [7777']
|
||
IOR [160000']
|
||
DAC @[RING]
|
||
STA
|
||
ADD RINGLC
|
||
DAC RINGLC
|
||
JMP @ROLL
|
||
|
||
;
|
||
; return from character read
|
||
;
|
||
EXIT: JMP @CHARIN
|
||
|
||
GETCNT: 0
|
||
LAC ININFO ; get id of message originator
|
||
CIA ; make it into a count
|
||
DAC ICNT2
|
||
JMP @GETCNT
|
||
|
||
POSITION:0
|
||
ADD [DSPTCH-1] ; point to correct status indicator
|
||
DAC ITEMP1
|
||
LAC @ITEMP1
|
||
DAC ITEMP1
|
||
DAC SEEPT ; also set seept for type 2 command
|
||
JMP @POSITION
|
||
|
||
TESTID: 0 ; test for valid id in ininfo
|
||
LAC ININFO
|
||
ASN ; also can't be zero
|
||
JMS ERROR ; id zero or same as mybit
|
||
SUB [9.] ; can't be > or = to 9.
|
||
ASP
|
||
JMP TESTOK
|
||
LAC ININFO
|
||
JMS ERROR ; id greater than 8
|
||
TESTOK: LAC ININFO ; all ok so return with id in ac
|
||
JMP @TESTID
|
||
|
||
TESTLOC:0 ; test to see if legal location
|
||
AND [77'] ; minimum is location 1
|
||
ASN
|
||
JMS ERROR ; location zero
|
||
SUB [32.]
|
||
ASP
|
||
JMP .+3
|
||
ADD [32.]
|
||
JMS ERROR ; location greater than 31.
|
||
ADD [32.]
|
||
JMP @TESTLOC
|
||
;
|
||
; error handling routine
|
||
;
|
||
ERROR: 0 ; address of where the error was found
|
||
DAC ERRAC ; save ac error message
|
||
LAC IDSPTCH ; save dispatch address
|
||
DAC ERRDSP
|
||
LWC 11.
|
||
DAC ICNT2 ; now save info area
|
||
LAC [ININFO-1]
|
||
DAC 17'
|
||
LAC [ERRINFO-1]
|
||
DAC 16'
|
||
SVELOP: LAC @17'
|
||
DAC @16'
|
||
ISZ ICNT2
|
||
JMP SVELOP
|
||
ISZ ERRCNT ; bump the error count
|
||
NOP
|
||
LAC ERRCNT ; now display it
|
||
JMS GETCHR
|
||
DAC @[ERRCHAR]
|
||
JMP EXIT ; now ignore bad message
|
||
|
||
ERRAC: 0 ; saved ac
|
||
ERRDSP: 0 ; saved dispatch address
|
||
ERRCNT: 60' ; error count
|
||
|
||
;
|
||
; routines variables
|
||
;
|
||
INCHAR: 0 ; last character read in
|
||
ICNT: 0 ; the number of characters we are waiting for
|
||
ICNT2: 0 ; general purpose counter used in routine
|
||
ITEMP1: 0 ; temporary locations
|
||
ITEMP2: 0 ; another temporary location
|
||
IDSPTCH:0 ; dispatching address for command routines
|
||
RNGPT: RINGST ; first character of ring buffer pointer
|
||
RNGPT2: RINGST+1 ; last character of ring buffer pointer
|
||
RINGLC: -4 ; ring buffer line counter
|
||
ININFO: 0 ; input information from 10 buffer
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
;
|
||
; constants go here at end of this 2k !!!!! any refs to or from
|
||
; succeeding 2k must be indirect-address! bleah!!!!!! (klh)
|
||
;
|
||
|
||
CONSTANTS
|
||
|
||
;loc 14000 ;happens about here anyway, just needs precision.
|
||
|
||
;
|
||
; distances to walls table
|
||
;
|
||
WALLS: 511. ; distances to walls
|
||
450.
|
||
358.
|
||
281.
|
||
225.
|
||
184.
|
||
155.
|
||
133.
|
||
116.
|
||
103.
|
||
92.
|
||
83.
|
||
75.
|
||
70.
|
||
64.
|
||
60.
|
||
56.
|
||
53.
|
||
50.
|
||
47.
|
||
45.
|
||
43.
|
||
41.
|
||
39.
|
||
37.
|
||
35.
|
||
33.
|
||
31.
|
||
29.
|
||
27.
|
||
25.
|
||
;
|
||
; error saving of info information area
|
||
;
|
||
ERRINFO:0 ; holds 2nd character of last bad message
|
||
0 ; holds the rest of the message
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
;
|
||
; n direction letter table
|
||
; e
|
||
; s
|
||
; w
|
||
;
|
||
DIRLET: 116'
|
||
105'
|
||
123'
|
||
127'
|
||
;
|
||
; you were shot by: message
|
||
;
|
||
YWSB: 131'
|
||
117'
|
||
125'
|
||
40'
|
||
127'
|
||
105'
|
||
122'
|
||
105'
|
||
40'
|
||
123'
|
||
110'
|
||
117'
|
||
124'
|
||
40'
|
||
102'
|
||
131'
|
||
72'
|
||
;
|
||
; eyes and arrows table
|
||
;
|
||
EYTAB: DJMS AWAY
|
||
DJMS TOLEFT
|
||
DJMS EYES
|
||
DJMS TORIGHT
|
||
;
|
||
; offset for name table
|
||
;
|
||
CENTER: DJMS OFF6
|
||
DJMS OFF5
|
||
DJMS OFF4
|
||
DJMS OFF3
|
||
DJMS OFF2
|
||
DJMS OFF1
|
||
DNOP
|
||
OFF6: INC E,DM30
|
||
INC DM30,100'
|
||
OFF5: INC E,DM30
|
||
INC DM20,100'
|
||
OFF4: INC E,DM30
|
||
INC DM30,100'
|
||
OFF3: INC E,DM30
|
||
INC DM20,100'
|
||
OFF2: INC E,DM30
|
||
INC DM30,100'
|
||
OFF1: INC E,DM30
|
||
INC DM20,140'
|
||
;
|
||
; djmses to name labels routines
|
||
;
|
||
TNUM: DJMS IML1
|
||
DJMS IML2
|
||
DJMS IML3
|
||
DJMS IML4
|
||
DJMS IML5
|
||
DJMS IML6
|
||
DJMS IML7
|
||
DJMS IML8
|
||
;
|
||
; big explosion info table
|
||
;
|
||
BIGX1INC:0
|
||
BIGY1INC:0
|
||
BIGX2INC:0
|
||
BIGY2INC:0
|
||
BIGX3INC:0
|
||
BIGY3INC:0
|
||
BIGX4INC:0
|
||
BIGY4INC:0
|
||
BIGX5INC:0
|
||
BIGY5INC:0
|
||
BIGX6INC:0
|
||
BIGY6INC:0
|
||
BIGX7INC:0
|
||
BIGY7INC:0
|
||
BIGX8INC:0
|
||
BIGY8INC:0
|
||
;
|
||
; imlac information tables
|
||
;
|
||
DSPTCH: IM1
|
||
IM2
|
||
IM3
|
||
IM4
|
||
IM5
|
||
IM6
|
||
IM7
|
||
IM8
|
||
|
||
IM1: 0 ; status word: -1 active, 1 dying, 0 not in game
|
||
0 ; direction
|
||
0 ; x location
|
||
0 ; y location
|
||
0 ; players score
|
||
0 ; bullet counter
|
||
0 ; my direction at time of fire
|
||
0 ; my x location at time of fire
|
||
0 ; my y location at time of fire
|
||
0 ; explosion timer
|
||
0 ; shot dead counter
|
||
|
||
IM2: REPEAT 11., 0
|
||
IM3: REPEAT 11., 0
|
||
IM4: REPEAT 11., 0
|
||
IM5: REPEAT 11., 0
|
||
IM6: REPEAT 11., 0
|
||
IM7: REPEAT 11., 0
|
||
IM8: REPEAT 11., 0
|
||
|
||
;
|
||
; test to see if player whose id is in iid is visible
|
||
; seept should point to status word in info table
|
||
; distan will contain distance to opponent on return if visible
|
||
; skips if player seen
|
||
;
|
||
SEE: 0
|
||
CLA
|
||
DAC DISTAN
|
||
LAC @[SEEPT] ; set up local seept
|
||
DAC SEEPT2
|
||
ISZ SEEPT2 ; point to direction
|
||
LAC @SEEPT2
|
||
DAC IDIR ; save direction in idir
|
||
ISZ SEEPT2 ; point to x location
|
||
LAC @SEEPT2
|
||
DAC IX ; save it in ix
|
||
ISZ SEEPT2
|
||
LAC @SEEPT2 ; now get y loc
|
||
DAC IY
|
||
LAC SAVEDIR ; see which way we are pointing
|
||
AND [1]
|
||
ASZ
|
||
JMP WEAST ; west or east
|
||
SNORTH: LAC IX ; south or north check his x to my x
|
||
SAM SAVEDX ; does it match?
|
||
JMP @SEE ; no
|
||
LAC IY ; yes, now get the y difference
|
||
SUB SAVEDY
|
||
ASN ; is he in my square?
|
||
JMP @SEE ; yes, then i can't see him
|
||
DAC SEEPT2 ; save distance to him
|
||
ASP ; see if distance positive
|
||
JMP HENORTH ; no, he must be north of me
|
||
CIA ; yes, so he is south of me
|
||
DAC SEEPT2 ; make distance negative
|
||
JMP HESOUTH
|
||
|
||
HEEAST: LAW 2
|
||
HENORTH=HEEAST
|
||
AND SAVEDIR ; see if i am looking north
|
||
ASZ ; if not then i can't see him
|
||
JMP @SEE ; i look south so i can't see him
|
||
JMP CHKLN ; ok so far, now check length of hall
|
||
|
||
HESOUTH:LAW 2
|
||
HEWEST=HESOUTH
|
||
AND SAVEDIR ; see if i am looking south
|
||
ASN ; if not then i can't see him
|
||
JMP @SEE ; i no see him
|
||
JMP CHKLN ; so far so good, but check hallway length
|
||
|
||
WEAST: LAC IY ; check his y to my y
|
||
SAM SAVEDY ; it must match
|
||
JMP @SEE ; can't see him
|
||
LAC IX ; now get the x difference
|
||
SUB SAVEDX
|
||
ASN ; is he in my square?
|
||
JMP @SEE ; yes, so i can't see him
|
||
DAC SEEPT2 ; save the distance to him
|
||
ASP ; but see if positive distance
|
||
JMP HEWEST ; no, negative so he is west of me
|
||
CIA
|
||
DAC SEEPT2
|
||
JMP HEEAST ; he is east of me
|
||
|
||
CHKLN: LAC SEEPT2
|
||
CIA ; set distance to opponent
|
||
DAC DISTAN
|
||
CHKLN1: LAW 1
|
||
AND SAVEDIR
|
||
ASZ
|
||
JMP CHKLN3
|
||
JMS CREM2
|
||
ADD SAVEDY
|
||
DAC SAVEDY
|
||
CHKLN2: LAC [MAZE]
|
||
ADD SAVEDY
|
||
DAC MPTR2
|
||
LAC SAVEDX
|
||
ASZ
|
||
JMP PT1
|
||
LAC [100000']
|
||
JMP PT2
|
||
|
||
PT1: CIA
|
||
DAC MCNT
|
||
CLL
|
||
LAC [100000']
|
||
RAR 1
|
||
ISZ MCNT
|
||
JMP .-2
|
||
PT2: DAC BIT2
|
||
LAC @MPTR2
|
||
AND BIT2 ; see if it is an open square
|
||
ASZ
|
||
JMP @SEE
|
||
ISZ SEEPT2 ; are we as far as the opponent?
|
||
JMP CHKLN1 ; no
|
||
LAC @[IID] ; yes, see if he is me
|
||
SAM @[MYBIT]
|
||
ISZ SEE ; don't skip if so (can't see me)
|
||
JMP @SEE
|
||
CHKLN3: JMS CREM2
|
||
CIA
|
||
ADD SAVEDX
|
||
DAC SAVEDX
|
||
JMP CHKLN2
|
||
|
||
CREM2: 0
|
||
LAC SAVEDIR
|
||
SAR 1
|
||
AND [1]
|
||
ASN
|
||
LAC [-1]
|
||
JMP @CREM2
|
||
|
||
DISTAN: 0
|
||
SAVEDIR:0
|
||
SAVEDX: 0
|
||
SAVEDY: 0
|
||
SEEPT2: 0
|
||
MCNT: 0
|
||
MPTR2: 0
|
||
IY: 0 ; object id y location
|
||
IX: 0 ; object id x location
|
||
IDIR: 0 ; object id imlac direction
|
||
BIT2: 0
|
||
|
||
; chki20 -- routine to handle new-protocol checking and munching,
|
||
; as well as old.
|
||
; put here since no room in lower 2k of core.
|
||
|
||
IFN FAST,[
|
||
|
||
CHKI20: AND [7] ;get normalized id, no need to test range!
|
||
IAC ;make it 1-8.
|
||
DAC @[IID] ;store for what wants it.
|
||
JMS @[POSITION] ;set up itemp1 and seept pointers into info tabs
|
||
LAC @[ITEMP1]
|
||
DAC CTEMP1 ;get itemp1 into a var within our 2k.
|
||
LAC @CTEMP1 ;get current status
|
||
ASZ
|
||
ASP ;ignore this msg if he's exploding
|
||
JMP .+2
|
||
JMP @[EXIT]
|
||
STA
|
||
DAC @CTEMP1 ;say player is active
|
||
LAC CTEMP1
|
||
IAC
|
||
DAC PLRD ;save ptr to direction
|
||
IAC
|
||
DAC PLRX ;save ptr to x coord
|
||
IAC
|
||
DAC PLRY ;save ptr to y coord
|
||
DAC CTEMP1
|
||
DAC @[ITEMP1]
|
||
;itemp1 is now satisfactorily updated, and
|
||
;indices into position tables done, now do function.
|
||
LAC @[INCHAR]
|
||
AND [70'] ;only interested in function digit
|
||
SAR 3
|
||
ADD [JMP PLRVEC]
|
||
DAC PLRJMP
|
||
|
||
PLRJMP: 0
|
||
|
||
PLRVEC: JMP BADVEC
|
||
JMP BADVEC
|
||
JMP PLRTRN ; 2 - right turn
|
||
JMP PLLTRN ; 3 - left turn
|
||
JMP PLFLIP ; 4 - turn around
|
||
JMP PLMOVE ; 5 - move forward
|
||
JMP PLBACK ; 6 - move backward
|
||
BADVEC: JMS @[ERROR] ; 7 - bad
|
||
JMP @[EXIT]
|
||
|
||
PLRD: 0 ;pointer to direction
|
||
PLRX: 0 ;pointer to x coord
|
||
PLRY: 0 ;guess what
|
||
|
||
PLRTRN: LAC @PLRD ;get direction
|
||
IAC ;right turn
|
||
AND [3]
|
||
DAC @PLRD
|
||
JMP PLRDON
|
||
|
||
PLLTRN: LAC @PLRD
|
||
SUB [1] ;left turn
|
||
AND [3]
|
||
DAC @PLRD
|
||
JMP PLRDON
|
||
|
||
PLFLIP: LAC @PLRD
|
||
ADD [2] ;turn right twice to turn-around
|
||
AND [3]
|
||
DAC @PLRD
|
||
JMP PLRDON
|
||
|
||
PLBACK: LAC @PLRD ;backward-- reverse direction then move.
|
||
ADD [2]
|
||
JMP .+2
|
||
|
||
PLMOVE: LAC @PLRD
|
||
AND [3]
|
||
ADD [JMP PLDVEC]
|
||
DAC PLMJMP
|
||
|
||
PLMJMP: 0
|
||
|
||
PLDVEC: JMP PLMNOR ;north
|
||
JMP PLMEA ;east
|
||
JMP PLMSOU ;south
|
||
JMP PLMWES ;west
|
||
|
||
PLMNOR: LAC @PLRY
|
||
SUB [1] ;decrement y coord for north moving
|
||
JMS @[TESTLOC]
|
||
DAC @PLRY
|
||
JMP PLRDON
|
||
|
||
PLMEA: LAC @PLRX
|
||
IAC ;increment x coord for east
|
||
JMS @[TESTLOC]
|
||
DAC @PLRX
|
||
JMP PLRDON
|
||
|
||
PLMSOU: LAC @PLRY
|
||
IAC ; incrment y coord for south
|
||
JMS @[TESTLOC]
|
||
DAC @PLRY
|
||
JMP PLRDON
|
||
|
||
PLMWES: LAC @PLRX
|
||
SUB [1] ; decrement x coord for west
|
||
JMS @[TESTLOC]
|
||
DAC @PLRX
|
||
JMP PLRDON
|
||
|
||
PLRDON: LAC @[IID] ;get player id again
|
||
DAC @[ININFO] ;and fake out stupid routine
|
||
JMP @[CHK25] ;done with new ptcl handling.
|
||
|
||
CTEMP1: 0 ;pointer substi. for itemp1
|
||
] ;end of ifn fast
|
||
|
||
; high 2k constants
|
||
CONSTANTS
|
||
|
||
;
|
||
; name subroutines
|
||
; 5 character name
|
||
;
|
||
IML1: DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DRJM ; return jump
|
||
IML2: DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DRJM
|
||
IML3: DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DRJM
|
||
IML4: DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DRJM
|
||
IML5: DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DRJM
|
||
IML6: DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DRJM
|
||
IML7: DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DRJM
|
||
IML8: DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS D040
|
||
DRJM
|
||
|
||
;
|
||
; gsv character subroutines
|
||
;
|
||
CUR: INC E,D0M1
|
||
INC D0M3,B30
|
||
INC B30,B30
|
||
INC D03,D20
|
||
INC D01,T
|
||
DJMP DLIST
|
||
WAIT: INC E,P ; 40 microsecond wait
|
||
INC P,P
|
||
INC P,P
|
||
INC P,P
|
||
INC P,P
|
||
INC P,P
|
||
INC P,P
|
||
INC P,P
|
||
INC P,P
|
||
INC P,140
|
||
D010: INC E,DM30
|
||
INC DM30,DM30
|
||
INC DM20,140'
|
||
D012: INC E,D0M3 ; end_of_line
|
||
INC D0M3,D0M3
|
||
INC D0M3,D0M3
|
||
INC D0M3,D0M3
|
||
INC X,X
|
||
D015: DLXA 200
|
||
DJMS WAIT
|
||
DRJM
|
||
DNL3: DLXA 540
|
||
DJMP DNL+1
|
||
DNL2: DLXA 1710
|
||
DJMP .+2
|
||
DNL: DLXA 10
|
||
DJMS WAIT
|
||
DJMP D012
|
||
D040: INC E,D30 ; space
|
||
INC D30,D30
|
||
INC D20,X
|
||
EYES: INC E,D03 ; eyes
|
||
INC D03,D03
|
||
INC D03,DM33
|
||
INC B00,B00
|
||
INC D30,D30
|
||
INC B00,B00
|
||
INC DM30,D00
|
||
INC D0M3,D0M3
|
||
INC D0M3,D0M3
|
||
INC D0M3,140'
|
||
CMZE: INC E,B03
|
||
INC B03,B03
|
||
INC B03,B03
|
||
INC B03,B02
|
||
INC B30,B30
|
||
INC B30,B10
|
||
INC B0M3,B0M3
|
||
INC B0M3,B0M3
|
||
INC B0M3,B0M3
|
||
INC B0M2,BM30
|
||
INC BM30,BM30
|
||
INC BM10,B12
|
||
INC B12,B12
|
||
INC B12,B12
|
||
INC B12,B12
|
||
INC B12,B12
|
||
INC B12,DM30
|
||
INC DM30,DM30
|
||
INC DM10,B1M2
|
||
INC B1M2,B1M2
|
||
INC B1M2,B1M2
|
||
INC B1M2,B1M2
|
||
INC B1M2,B1M2
|
||
INC B1M2,D10
|
||
INC 140',140'
|
||
CHARMZE:DJMS CMZE
|
||
DJMP CMZE
|
||
SPMAZE: INC E,D30
|
||
INC D30,D30
|
||
INC D30,D30
|
||
INC D30,D30
|
||
INC D10,140'
|
||
ARROWS: DJMS UPARR
|
||
DJMS RIGHTARR
|
||
DJMS DOWNARR
|
||
DJMS LEFTARR
|
||
RIGHTARR:INC E,D33
|
||
INC D03,D33
|
||
INC B30,B30
|
||
INC B30,B10
|
||
INC BM2M2,B02
|
||
INC B02,B2M2
|
||
INC D3M3,D3M3
|
||
INC D0M3,140'
|
||
LEFTARR:INC E,D33
|
||
INC D03,D33
|
||
INC B22,B0M2
|
||
INC B0M2,BM22
|
||
INC B30,B30
|
||
INC B30,B10
|
||
INC D3M3,D3M3
|
||
INC D0M3,140'
|
||
|
||
UPARR: INC E,D30
|
||
INC D30,D30
|
||
INC D23,B03
|
||
INC B03,B03
|
||
INC B01,BM2M2
|
||
INC B20,B20
|
||
INC BM22,D00
|
||
INC D3M3,D3M3
|
||
INC D3M3,D2M3
|
||
INC D0M1,140'
|
||
|
||
DOWNARR:INC E,D30
|
||
INC D30,D30
|
||
INC D23,B12
|
||
INC BM20,B1M2
|
||
INC B03,B03
|
||
INC B03,B01
|
||
INC D3M3,D3M3
|
||
INC D3M3,D2M3
|
||
INC D0M1,140'
|
||
|
||
AWAY: DLV D,0,20.
|
||
DLV B,0,15.
|
||
DLV B,-2,-5.
|
||
DLV B,4.,0
|
||
DLV B,-2.,5.
|
||
DLV D,0,-35.
|
||
DRJM
|
||
|
||
TOLEFT: DLV D,0,20.
|
||
DLV B,-15.,0
|
||
DLV B,5.,2
|
||
DLV B,0,-4.
|
||
DLV B,-5.,2
|
||
DLV D,15.,-20.
|
||
DRJM
|
||
|
||
TORIGHT:DLV D,0,20.
|
||
DLV B,15.,0
|
||
DLV B,-5.,2.
|
||
DLV B,0,-4.
|
||
DLV B,5.,2.
|
||
DLV D,-15.,-20.
|
||
DRJM
|
||
|
||
;
|
||
;
|
||
; big explosion display list
|
||
;
|
||
AD2: DHVS 2
|
||
DADR ; turn on 8k display addressing
|
||
DLXA 500
|
||
DLYA 1200
|
||
DJMS WAIT
|
||
;
|
||
; you were shot by:
|
||
;
|
||
MESAGE: DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DJMS DNOP
|
||
DLXA 1000
|
||
DLYA 1000
|
||
DJMS WAIT
|
||
;
|
||
; djms to player who did the killing
|
||
;
|
||
WHODIDIT:DJMS D040
|
||
DSTS 3
|
||
BIGX1: DLXA 1000
|
||
BIGY1: DLYA 1000
|
||
DJMS WAIT
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS EXPLOSIN+2
|
||
BIGX2: DLXA 1000
|
||
BIGY2: DLYA 1000
|
||
DJMS WAIT
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS EXPLOSIN+2
|
||
BIGX3: DLXA 1000
|
||
BIGY3: DLYA 1000
|
||
DJMS WAIT
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS EXPLOSIN+2
|
||
BIGX4: DLXA 1000
|
||
BIGY4: DLYA 1000
|
||
DJMS WAIT
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS EXPLOSIN+2
|
||
BIGX5: DLXA 1000
|
||
BIGY5: DLYA 1000
|
||
DJMS WAIT
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS EXPLOSIN+2
|
||
BIGX6: DLXA 1000
|
||
BIGY6: DLYA 1000
|
||
DJMS WAIT
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS EXPLOSIN+2
|
||
BIGX7: DLXA 1000
|
||
BIGY7: DLYA 1000
|
||
DJMS WAIT
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS EXPLOSIN+2
|
||
BIGX8: DLXA 1000
|
||
BIGY8: DLYA 1000
|
||
DJMS WAIT
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS EXPLOSIN+2
|
||
DHLT
|
||
|
||
;
|
||
; start of main display list
|
||
;
|
||
AD1: DHVS 1
|
||
DADR ; turn on 8k display addressing
|
||
; (use 0 bit to indicate which 4k)
|
||
DLXA 50
|
||
DLYA 1300
|
||
DJMS WAIT
|
||
DJMS IML1
|
||
DJMS DNL
|
||
SCORE: DNOP ; display names and scores here
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS DNL
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DLXA 50
|
||
DLYA 1100
|
||
DJMS WAIT
|
||
DJMS IML2
|
||
DJMS DNL
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS DNL
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DLXA 50
|
||
DLYA 700
|
||
DJMS WAIT
|
||
DJMS IML3
|
||
DJMS DNL
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS DNL
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DLXA 50
|
||
DLYA 500
|
||
DJMS WAIT
|
||
DJMS IML4
|
||
DJMS DNL
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS DNL
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DLXA 1724
|
||
DLYA 1300
|
||
DJMS WAIT
|
||
DJMS IML5
|
||
DJMS DNL2
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS DNL2
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DLXA 1724
|
||
DLYA 1100
|
||
DJMS WAIT
|
||
DJMS IML6
|
||
DJMS DNL2
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS DNL2
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DLXA 1724
|
||
DLYA 700
|
||
DJMS WAIT
|
||
DJMS IML7
|
||
DJMS DNL2
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS DNL2
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DLXA 1724
|
||
DLYA 500
|
||
DJMS WAIT
|
||
DJMS IML8
|
||
DJMS DNL2
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DJMS DNL2
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DNOP
|
||
DLYA 1720
|
||
;
|
||
; status line
|
||
;
|
||
DLXA 60
|
||
DJMS WAIT
|
||
IFE FAST,[
|
||
ORIG: DJMS D040 ; origional id
|
||
DJMS D040
|
||
CURENT: DJMS D040 ; current id
|
||
DJMS D040
|
||
]
|
||
DEAD: DJMS D040 ; status of player
|
||
DJMS D040
|
||
ERRCHAR:DJMS D040 ; number of messages in error
|
||
;
|
||
;
|
||
; n, s, e, or w letter
|
||
;
|
||
DLXA 1000
|
||
DJMS WAIT
|
||
DSTS 3
|
||
LETTER: DJMS D040
|
||
;
|
||
; this is where the 8 possible players appear
|
||
;
|
||
; dlxa 1000
|
||
; dlya <position>
|
||
; dsts <scale>
|
||
; djms wait
|
||
; djms <eyes or dnop>
|
||
; djms <name or dnop or explosion>
|
||
;
|
||
DLXA 1000
|
||
THING: DJMS D040
|
||
DJMS D040
|
||
DJMS WAIT
|
||
DJMS D040
|
||
DJMS D040
|
||
DLXA 1000
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS WAIT
|
||
DJMS D040
|
||
DJMS D040
|
||
DLXA 1000
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS WAIT
|
||
DJMS D040
|
||
DJMS D040
|
||
DLXA 1000
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS WAIT
|
||
DJMS D040
|
||
DJMS D040
|
||
DLXA 1000
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS WAIT
|
||
DJMS D040
|
||
DJMS D040
|
||
DLXA 1000
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS WAIT
|
||
DJMS D040
|
||
DJMS D040
|
||
DLXA 1000
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS WAIT
|
||
DJMS D040
|
||
DJMS D040
|
||
DLXA 1000
|
||
DJMS D040
|
||
DJMS D040
|
||
DJMS WAIT
|
||
DJMS D040
|
||
DJMS D040
|
||
;
|
||
; ring buffer
|
||
;
|
||
DSTS 1
|
||
DLXA 200
|
||
DLYA 130
|
||
DJMS WAIT
|
||
RING: DJMP RINGST
|
||
RINGST: DJMS D012
|
||
DJMP CUR
|
||
|
||
BLOCK 160.
|
||
|
||
RINGEND:DJMP RINGST
|
||
;
|
||
; display list for maze starts here
|
||
;
|
||
DLIST: DHLT
|
||
;
|
||
; return to console program after loading
|
||
;
|
||
END LOADER
|