1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-02 06:51:04 +00:00
Files
PDP-10.its/src/spcwar/spcwar.164
Lars Brinkhoff 4d32246eea Spacewar! game.
Build for both standalone and timesharing.
2018-02-19 08:21:59 -08:00

3996 lines
102 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE MIT-AI PDP-6/10 Space-War
.MLLIT==1
IF2,{PRINTC "This is version " ? .TYO6 .FNAM2 ? PRINTC "
"}
SUBTTL History of Space War
;WAR -> SWAR -> SUPER -> STAR -> SPACE -> SPACE4 -> NSPACE -> SPCWAR
;Present maintainers of Space-War are
; KLH@MIT-AI, GMP@MIT-MC, and CBF@MIT-ML
; The history of the game will be added here as it is deterined.
; On the ninth of April 1976, the new nine-bit Space-War consoles were completed.
;The consoles were designed and constructed by Kevin Hunter (KH). Ken
;Harrenstein (KLH) and Lee Parks (LSP) spent ten hours wiring the new consoles
;into the PDP-6 alternate data switches bank.
SUBTTL Record of Modifications
;Modified: 04/10/76- GMP
; 04/11/76:
; Converted to seperate display lists for each ship.
; Added capability to dynamically alter ship designs used during a game.
;Modified: 04/12/76: GMP
; Fixed the following bugs caused by previous modification:
; 1. Infinite loop on start-up: Caused by using a null display list.
; 2. Bug causing ships not in game to be displayed in score mode if
; they were in a previous game.
; 3. NXM when RANSUN was on: modifying "wired" register
; 4. Scores were displayed poorly.
; 5. Scores would never reset if game was last restarted at location
; 101. (Old bug)
; Removed SUNLCn from vector of mysteries as it is no longer used.
;Version 139: 04/13/76: GMP
; 1. Finally fixed bug preventing start-up of prgoram.
; 2. Fixed bug causing shields to not be properly displayed.
; 3. Fixed SETF to recoginize upper and lower case responses due to
; recent changes in MIDAS.
; 4. Fixed to add FADR with 0.0 after all FSC's when running on PDP-6.
;Version 141: 04/16/76: GMP
; 1. Fixed bug which caused the game not to end if a star-ship collided
; with a hyper-space star.
;Version 142: 04/17/76: GMP
; 1. Converted to use mnemonic names for 340 display instructions.
;Version 148: 04/29/76: GMP
; 1. Combined SPCWAR and ^COMBO into one assembly job. Several .INSRT
; files were created (see following pages).
; 2. Converted STAR macro to use 340 command names.
; 3. Deleted non-AGB square root routine.
; 4. Change RELATV subroutine to a macro as it was called in only four places.
;Version 153: 10/18/76: GMP
; 1. Fix bug where once a black-hole was used, there would always be a black-hole.
; 2. Add to the Vector of Mysteries:
; VERSION - the version of SPCWAR in SIXBIT, and
; OPTIONS - a bit string specifying the options with which SPCWAR was assembled.
;Version 154: 10/30/76: GMP
; 1. Minor change to make correspondence of ships to control boxes more logical
; (see BUTTNS array).
; 2. Changed name of ships to more mnemonic values.
; 3. Added code to type version number of game on pass 2 of assembly.
;Version 155: 10/30/76: GMP
; 1. Removed $FLARE, $TEXT, and $FBALL assembly parameters.
; 2. Made flares and fireballs the default situation.
;Version 161: 11/05/76: GMP
; 1. Combined all files into a single source as it was already a single assembly.
; 2. Renamed a number of assembly parameters and tables.
; 3. Fixed a minor bug in the generion of flares that caused only half the number
; of vectors requested to appear.
;Version 163: 11/05/76: GMP
; 1. Fixed the bug which caused display to flicker when a ship crossed an X
; boundary on the screen (X=0 or X=1024.).
SUBTTL Acumulator Defintions
; A wired accumulator may not have its value modified without extreme caution.
F=0
P=1 ; PDL pointer (wired)
A=2 ; Temporary registers
B=3
C=4
D=5
T=6
TT=7
MP1=10 ; Index of object being processed
MP2=11
R=12
XFLAG=13
Q=14 ; PDL pointer for current miscellaneous display
; buffer (wired)
S=15
DL=16 ; Pointer to current display linked list (wired)
DP=17 ; Pointer to display list being output (wired)
SUBTTL Assembly Parameter Defintions
; Macro to set a flag according to user's request
DEFINE SETFLG TEXT,FLAG
.TAG LOOP
%RETRY==0
PRINTC "TEXT (" ? PRTVAL \FLAG ? PRINTC "): "
.TTYMAC IFLAG
IFSE [IFLAG][] .STOP
IFSE [IFLAG][YES] FLAG==1 ? .STOP
IFSE [IFLAG][yes] FLAG==1 ? .STOP
IFSE [IFLAG][Y] FLAG==1 ? .STOP
IFSE [IFLAG][y] FLAG==1 ? .STOP
IFSE [IFLAG][NO] FLAG==0 ? .STOP
IFSE [IFLAG][no] FLAG==0 ? .STOP
IFSE [IFLAG][N] FLAG==0 ? .STOP
IFSE [IFLAG][n] FLAG==0 ? .STOP
IFN IFLAG, FLAG==IFLAG ? .STOP
IFDEF IFLAG, FLAG==IFLAG ? .STOP
PRINTC "Undefined value; please retry.
"
%RETRY==1
TERMIN
IFN %RETRY, .GO LOOP
TERMIN
; Miscellaneous macros
DEFINE PRTVAL VALUE ; Macro to print a value
IFE VALUE, PRINTC "NO"
IFE VALUE-1, PRINTC "YES"
IFG VALUE-1, PRINTX /VALUE/
TERMIN
DEFINE NONITS TEXT,FLAG ; Similar to SETFLG below but only if not ITS
IFN $ITS, FLAG==0
IFE $ITS, SETFLG [TEXT] FLAG
TERMIN
; Define default values of conditionals
IF1,[
$ITS== 0 ;Do not run under ITS
$10INT==1 ;Enable interrupt to stop game
$MXSHP==4 ;Maximum number of ships
$MXDSN==4 ;Number of ship designs
$MXSUN==3 ;Maximum number of suns
$MOVIE==0 ;No movies
; Ask the user to change any options
PRINTC "Reply with <RETURN> to use default value.
"
SETFLG [ITS version] $ITS
NONITS [Inter-processor interrupt] $10INT
SETFLG [Maximun number of ships (1-4)] $MXSHP
IFL $MXSHP-3, $SSTYP==1 ; Defaults to new ships
IFL $MXSHP-3, SETFLG [Enterprize and Klingon] $SSTYP
SETFLG [Number of ship designs] $MXDSN
SETFLG [Maximum number of suns (0-3)] $MXSUN
NONITS [Game recording] $MOVIE
PRINTC "
"
]
SUBTTL Miscellaneous Definitions
OBJCTS==50. ;NUMBER OF OBJECT IN GAME
; TAKE CAUTION WHEN INCREASING THIS VALUE AS
; THE GAME MAY SLOW DOWN
CPI== 3.1415926535897932384626433832 ; Double precision value of PI
CPI.5== 1.5707963267948966192313216916
;---------- Lengths and Sizes
FFCPTS==30. ; Number of points in force field circle
LRANTB==200 ; Length of random number table
MDBUFL==5000 ; Length of miscellaneous display buffers
CORSIZ==40000 ; Size of PDP-6 memory (16K)
;---------- Op-Codes and Instructions
PJRST==JRST ; PJRST X replaces PUSHJ P,X ? POPJ P,
JOV==<JFCL 10,> ; jump on overflow
;---------- Device Codes
WCNSLS=420 ; Space-War consoles
..D420=WCNSLS
ITPDEV=20 ; Inter-processor device
..D20=ITPDEV
;---------- Channel Assignments
APRCHN==1 ; APR gets highest priority
FLGCHN==3 ; Special Display Interrupts
DISCHN==4 ; Normal Display
ITPCHN==7 ; Inter-processor Device gets lowest priority
;---------- Initialize Symbols Used in Macros
%DSNNO==0 ; Current ship design number
%MAXLN==0 ; Maximum ship display list length
.X== 8192. ; Initial X coordinate for STAR macro
SUBTTL Miscellaneous Macros
DEFINE SSFIX A,B ;floating to fixed
MULI A,400
TSC A,A
ASH A+1,-243+19.!B(A)
TERMIN
DEFINE SFIX A,B ;faster, but works only for + numbers
MULI A,400
ASH A+1,-243+19.!B(A)
TERMIN
DEFINE GETRAN AC ;get a random # at speed of light
SOSGE AC,RINDEX
IFSE [AC][A] PUSHJ P,RINSET ; if AC = A, needn't preserve.
.ELSE PUSHJ P,RINSTX ; Else must.
MOVE AC,RANTAB(AC)
TERMIN
DEFINE LIMIT XORY,AC ;X REPRESENTS EITHER "X" OR "Y"
FADRB AC,OBJ!XORY(MP1)
JUMPL AC,[SKIPN BOUNCE
JRST [ FADR AC,[1024.0] ;NORMAL +VE WRAP
MOVEM AC,OBJ!XORY(MP1)
JRST .+3]
MOVM AC,AC
MOVEM AC,OBJ!XORY(MP1) ; +VE BOUNCE
MOVNS OBJ!XORY!VL(MP1)
JRST .+3]
CAML AC,[1024.0]
JRST [ SKIPN BOUNCE
JRST [ FSBR AC,[1024.0] ; -VE WRAPAROUND
MOVEM AC,OBJ!XORY(MP1)
JRST .+1]
FSBR AC,[2048.0] ; -VE BOUNCE
MOVM AC,AC
MOVEM AC,OBJ!XORY(MP1)
MOVNS OBJ!XORY!VL(MP1)
JRST .+1]
TERMIN
DEFINE DISPT ;DISPLAY A POINT: PLACED IN CURRENT BUFFER
MOVE MP2,D ;Y IN LH(D) -> LH(MP2)
HLR MP2,C ;X IN LH(C) -> RH(MP2)
AND MP2,[1777,,1777] ;COORDS MODULO 1024.
IOR MP2,[PT%Y\NC%PNT,,PT%X\PT%DSP\NC%PNT] ;MAKE POINT MODE DISP COMMAND
PUSH Q,MP2 ;PUT IN LIST
TERMIN
DEFINE PFDVR AC,LOC ;DIVIDE WITH CHECK FOR OVERFLOW
JOV .+1
SKIPN LOC
JRST [ CAIL AC,0
SKIPA AC,MAXFLO
MOVN AC,MAXFLO
JRST .+3]
FDVR AC,LOC
JOV [ CAIGE AC,0
TROA F,OV%NEG
TRZ F,OV%NEG
MOVM AC,AC
CAML AC,[201400,,0]
JRST [ SETZ AC,
JRST .+1]
MOVE AC,MAXFLO
TRZE F,OV%NEG
MOVN AC,AC
JRST .+1]
TERMIN
DEFINE RELATV AC1,AC2 ;COMPUTE RELATIVE DISTANCE WITH WRAPAROUND
FSBR AC2,AC1
MOVM AC1,AC2
CAML AC1,[512.0]
JRST [ SKIPL AC2
JRST [ FADR AC2,[-1024.0]
JRST .+1]
FADR AC2,[1024.0]
JRST .+1]
TERMIN
DEFINE SLISTS ;generates display list section for ships
REPEAT $MXSHP,[ SDPTRS+.RPCNT,,.+1
]
TERMIN
DEFINE BITDEF A,B,C ;produces definition BITA.B and BITC
BIT!A!.!B==1_<<A-1>*9.+<B-1>>
BIT!C==1_<35.-C>
TERMIN
; Start 340 display
IFE $ITS,[
APR==0
PI==4
DIS==130
NOSYMS
RIM10
DEFINE DSTART AC ;PDP-6 version
MOVE DL,DISLST
MOVE DP,[-1,,[0]-1] ;causes immediate interrupt
CONO DIS,D%INIT+<FLGCHN_3>+DISCHN
TERMIN
]
IFN $ITS,[
DEFINE DSTART ;ITS version
.DSTART DISLST
.VALUE [ASCIZ /: 340 DISPLAY IS NOT AVAILABLE 
/]
TERMIN
]
SUBTTL Define Bit Names
RADIX 10.
%%3==-1
REPEAT 4,[%%1==.RPCNT+1 ? REPEAT 9.,[%%2==.RPCNT+1 ? %%3==%%3+1
BITDEF \%%1,\%%2,\%%3
]]
RADIX 8.
;---------- Miscellaneous Bit Definitions
OV%NEG==BIT35 ; On if floating overflow was negative
APRBIT==1_<7-APRCHN> ; Bit to enable corrsponding channel
FLGBIT==1_<7-FLGCHN>
DISBIT==1_<7-DISCHN>
IFN $10INT, ITPBIT==1_<7-ITPCHN>
IFE $10INT, ITPBIT==0
SUBTTL Bit Definitions - PDP-6 Interrupt System
; ------ PDP-6 APR condition flags
;CONO
A%RPOV==bit18 ;reset the PDL OV flag
A%RIO== BIT19 ;I/O reset
A%RMP== BIT22 ;reset the Memory Protection flag
A%RNXM==BIT23 ;reset the nonexistent Memory flag
A%CCEZ==BIT24 ;turn the Clock Count Enable flag off
A%CCEO==BIT25 ;turn the Clock Count Enable flag on
A%CLKZ==BIT26 ;turn the Clock flag off
A%PCEZ==BIT27 ;turn the PC Change Enable flag off
A%PCEO==BIT28 ;turn the PC Change Enable flag on
A%PCFZ==BIT29 ;turn the PC Change flag off
A%OVEZ==BIT30 ;turn the OV flag enable off
A%OVEO==BIT31 ;turn the OV flag enable on
A%OVFZ==BIT32 ;turn the OV flag off
;33-35 = assign PI channel to APR flags (listed above)
;Reset and clear all flags and I/O
A%STRT==A%RPOV+A%RIO+A%RMP+A%RNXM+A%CCEZ+A%CLKZ+A%PCEZ+A%PCFZ+A%OVEZ+A%OVFZ
;CONI
A%POV== BIT18 ;PDL OV flag set
A%ILOP==BIT22 ;Illegal Instruction flag set
A%NXM== BIT23 ;non-existent Memory flag set
A%CCE== BIT25 ;Clock Count enable on
A%CLK== BIT26 ;Clock Count flag set
A%PCE== BIT28 ;PC Change enable on
A%PCF== BIT29 ;PC Change flag set
A%OVE== BIT31 ;OV enable on
A%OVF== BIT32 ;OV flag set
;33-35 = set to the current PI channel assignment
;-------- PDP-6 Priority Interrupt system flags
;CONO
P%CLR== BIT23 ;clear the PI system
P%ACT== BIT24 ;activate interrupt on channels selected (29-35)
P%CENB==BIT25 ;enable channels selected (")
P%CDSB==BIT26 ;disable channels selected (")
P%OFF== BIT27 ;turn off the PI system
P%ON== BIT28 ;turn on the PI system
;29-35 = channel select: bit 29 selects channel 1,
; bit 35 selects channel 7, etc.
;CONI
P%PIUP==BIT28 ;PI system is on
;29-35 = if a bit is 1, corresponding channel is on.
;---------- 340 display flags
;CONO
D%INIT==BIT1.7 ;initialize display
D%CONT==BIT1.8 ;resume display after special interrupt
;---------- Interprocessor interupt flags
;CONO
I%CENB==BIT1.4 ;reset and enable interrupts
SUBTTL Bit Definitions - 340 Display Commands
; The flags below are for a display command in the right half of a word.
;In this way, they can be used to generate instructions for either half of a word.
;NOTE: These bit definitions will be replaced for the most part by macros.
;---------- Set mode of next command
NC%PMR==0 ;parameter
NC%PNT==BIT22 ;point
NC%VCT==BIT20 ;vector
NC%VCC==BIT20\BIT22 ;vector continue
NC%CHR==BIT21\BIT22 ;character
NC%INC==BIT20\BIT21 ;increment
;---------- Parameter mode command
PM%ELP==BIT23 ;enable lisght pen status change
PM%LPS==12. ;with _ operator to place constant pen status
PM%LPM==004000 ;mask to get light pen status (1 bit)
PM%STP==BIT25 ;stop display
PM%STI==BIT26 ; ... generate interrupt
PM%ESC==BIT29 ;enable scale change
PM%SCS==4. ;shift for scale
PM%SCM==000060 ;mask for scale (2 bits)
PM%EBR==BIT32 ;enable brightness change
PM%BRM==000007 ;mask for brightness (3 bits)
PM%HLT==PM%STP\PM%STI ;parameter mode command to halt display
;---------- Point mode command
PT%X== 0 ;specify X ordinate
PT%Y== BIT19 ;specify Y ordinate
PT%DSP==BIT25 ;display the current point
PT%MSK==001777 ;mask for value of coordinate
PT%NOP==NC%PNT ;no-op command to point mode
;---------- Vector and vector continue command
VC%ESC==BIT18 ;return to parameter mode after this command
VC%DSP==BIT19 ;display this vector
VC%YSN==BIT20 ;sign bit for Y ordinate
VC%YMS==8. ;shift for Y magnitude
VC%YMM==077400 ;mask to get Y magnitude (8 bits)
VC%XSN==BIT28 ;sign for X ordinate
VC%XMM==000177 ;mask for X magnitude (8 bits)
;---------- Special character for 340 character generator
CH%ESC==37 ;return to parameter mode
CH%UC== 35 ;upper case shift
CH%LC== 36 ;lower case shift
CH%LF== 33 ;line feed (any case)
CH%CR== 34 ;carriage-return (any case)
CH%SP== 40 ;space (any case)
SUBTTL APR Interrupt Processing
IFE $ITS,[
IFN $10INT,[
LOC ITPCHN*2+40
JSR ITPBRK
]
LOC APRCHN*2+40
JSR APRBRK ;jump to process clock interrupt (usually)
LOC FLGCHN*2+40
JSR DSPBRK
LOC DISCHN*2+40
BLKO DIS,DP ;put out next command word
JSR DISBRK ;if done
LOC 41
0 ;should not JRST GO since
; may not be completely loaded.
LOC 61
JSR FATAL
]
IFN $ITS,[
LOC 42
JSR TSINT
]
LOC 100
TDCA A,A ;100 is standard starting address.
SETO A, ;101 also starts but preserves scores.
MOVEM A,SAVSCR'
JRST GO
IFE $ITS,[
;interrupt handler for the clock (actually, APR in general)
APRBRK: 0
CONSO APR,A%CLK ;is it 1/60 sec clock interrupt?
JRST APRBR3 ; no - go handle exception
SOSLE CLKCNT ;yes, decrement clock count... time up?
JRST APRB2 ; nope, return.
SETOM CLKSNK ; time's up! clear synch lock
EXCH A,STEPTM ;get step time
MOVEM A,CLKCNT ;store as new clock count
EXCH A,STEPTM ;and restore acc A.
CAMN DP,DISPNS' ;is current dis BLKO same as last tick?
CONO PI,P%act\FLGBIT ; yes - interrupt on FLGCHN to change list
; (DISCHN handler doesn't CONO DIS, to restart!)
MOVEM DP,DISPNS ;and remember current ptr for next tick.
APRB2: CONO A%clkz\A%cceo\APRCHN ;restart clock,
JRST 12,@APRBRK ;and dismiss.
]
CLKSNK: 0 ; Clock synch lock, -1'd every STEPTM 60th's.
CLKCNT: 0 ; current countdown of 1/60th sec ticks before
; -1'ing CLKSNK. (see STEPTM in Vec of Myst.)
IFE $ITS,[
APRBR3: CONSO APR,A%nxm ;skip if non-ex mem
JSR APRBAD ;foo! something we can't handle.
IFE $MOVIE,[
AOS NXMCNT' ;increment cnt
SKIPN NXMSW' ;switch says do anything special?
JSR APRBAD ;no, die
SKIPL NXMSW ; if -1, ignore; if 1, stop but allow proceeding
JRST 4,.+1 ;stop. pushing CONTINUE will ignore the NXM.
CONO APR,A%RNXM+A%RMP
JRST APRB2
]
IFN $MOVIE,[
PUSH P,A ;yes, NXM. something hit end of core. wrap back.
PUSH P,B
SETZM TWICE' ;set flag to do it twice
SOS APRBRK ;point to bad or previous instr.
APRNX1: MOVE B,@APRBRK ;get instr
SETCM A,B ;compl for opcode test
TLNN A,134000 ;skip if ones incorrect for byte instr
TLNE B,640000 ;don't skip if zeros incorrect
JRST APRNX2 ;not a byte instr.
HRRZ A,@B ;byte instr. get rh of pointer
CAIGE A,40000 ;skip if cause has been found
JRST APRNX2 ;jump away if not
HLLZ A,@B ;get lh of ptr
TLZ A,770077 ;mask off
TLO A,440000 ;set up new ptr
HRRI A,PRGEND ;with new addr
MOVEM A,@B ;and insert back
CONO A%rnxm ;reset nxm flag
POP P,B
POP P,A
JRST APRB2 ;return
APRNX2: SKIPE TWICE
JSR FATAL ;not a byte instr at all
SETOM TWICE
AOS APRBRK
JRST APRNX1 ;try next instr
]
APRBAD: 0 ;come here when APR int. handler lost.
CONI APR,APRCSV
JSR FATAL
APRCSV: 0 ;SAVE APR CONDITIONS
] ;END OF IFE $ITS
IFN $ITS,[
TSINT: 0
0
SKIPGE DL,TSINT
.DISMIS TSINT+1 ;IGNORE 2ND WD INTS
TLNN DL,(%PIRLT) ;REALT INT?
.DISMIS TSINT+1
SETOM CLKSNK
.SUSET [.SAMASK,,[%PIRLT]] ;TURN OFF FUTURE INTS
.DISMIS TSINT+1
]
SUBTTL Display Interrupt Processing
IFE $ITS,[
DISBRK: 0
DISBR0: TRNN DL,-1 ;ADDR OF NEXT ITEM IN RH?
MOVE DL,DISLST ;NO, GET PTR TO BEG OF CURRENT DISLIST
MOVE DL,(DL) ;GET ITEM
HLRZ DP,DL ;GET ADDR OF BLKO PTR FOR ITEM
JUMPE DP,DISBR0 ;NOTHING THERE, GET NEXT ITEM
SKIPL DP,(DP) ;GET BLKO PTR
JRST DISBR0 ;AGAIN NOTHING THERE, GET NEXT.
JRST 12,@DISBRK ;RETURN
DSPBRK: 0 ;SPECIAL DISPLAY INTERRUPT
HLRZ DP,DL ;GET ADDR OF BLKO THAT INTERRUPTED
CAIN DP,BKPT1 ;IF WAS DOING FIRST BACKGROUND,
MOVE DL,(DL) ;SKIP NEXT (2ND BACKGND) ITEM.
DSPBR1: TRNN DL,-1
MOVE DL,DISLST
MOVE DL,(DL)
HLRZ DP,DL
JUMPE DP,DSPBR1
SKIPL DP,(DP)
JRST DSPBR1
CONO DIS,D%INIT+<FLGCHN_3>+DISCHN
JRST 12,@DSPBRK ;RETURN
]
DISLST: 0 ;PTR TO CURRENT DISLIST, SET BY DSTART.
DSLST1: MDBPTR,,DSLSTC ;DISPLAY LIST USING FIRST BUFFER
DSLST2: MDBPTR+1,,DSLSTC ; USING SECOND BUFFER
DSLST3: SLISTS ;USED TO DISPLAY SCORES
TDPTR,,0
DSLSTC: SLISTS ;REMAINDER OF DSLST1 AND DSLST2
TDPTR,,[BKPT0,,[BKPT1,,[BKPTR,,0]]]
SDPTRS: BLOCK $MXSHP ;BLKO POINTERS FOR EACH SHIP DISPLAY LIST
TDPTR: 0 ;BLKO POINTER FOR TORPEDOS
MDBPTR: 0 ;HOLDS BLKO FOR MDBUF1
0 ;FOR MDBUF2
BKPT0: -1,,BKVEC'-1 ;HOLDS INITIALIZER FOR STARS
BKPT1: 0 ;HOLDS PTR AT STARS
BKPTR: 0
BKPTRA: -<BKEND-BKBEG>,,<BKBEG-1> ;HOLDS PTR TO ALL STARS
SUBTTL Interprocessor Interrupt handling
; Hack to process interrupts from 10 and do stuff
; like blow up ships, display messages, etc.
; No-op for now until coded to work with new display scheme.
IFE $ITS,[IFN $10INT,[
ITPBRK: 0
CONO ITPDEV,10+ITPCHN ; Reset interprocessor device
JRST 12,@ITPBRK ; and reset channel
]]
SUBTTL Move Backround Star Field
BKINIT: PUSH P,A
SETZM BKTMF' ;zero backround time (star date?)
SETZM BKTIME'
SETZM BKTS'
SETZM BKX' ;zero current start of backround list
MOVE A,BKSTP ;set up star field pointer
MOVEM A,BKSTRT'
MOVE A,[PM%ESC\<0_PM%SCS>\NC%PNT,,PT%X\NC%VCT+0]
;<scale zero, enter point>,,<x = 0, enter vector>
MOVEM A,BKVEC
SETZM BKPT1
IFN $ITS, SETZM BKPTR
IFE $ITS,[
MOVE A,BKPTRA
MOVEM A,BKPTR
]
POP P,A
POPJ P,
;routine to shift the star field and display it
BKMOVE: MOVE A,BKTIME ;get new star time and save it
EXCH A,BKTS
SUB A,BKTS ;compute -delta time
BK0: ADDB A,BKX ;compute current x - delta time
JUMPGE A,BK1 ;if positive do not shift field
;shift the star field
IBP BKSTRT ;look at next halfword
AOS A,BKSTRT ;get address of next word in list
HRRZS A
CAIGE A,BKEND ;skip if past end of field
JRST BK2
MOVE A,BKSTP ;start over at beginning of field
MOVEM A,BKSTRT
BK2: LDB A,BKSTRT ;get next x value
ANDI A,177
JRST BK0 ;and use it as delta time
BK1: HRLI A,PM%ESC\<0_PM%SCS>\NC%PNT
MOVEM A,BKVEC ;go to point mode, scale is 0
MOVE A,BKSTRT ;get pointer to first star to display
SKIPL @BKSTRT ;skip if a vector command
ADDI A,1 ;will output another word
MOVEI A,(A)
SUBI A,BKEND ;compute length to end of list
IFN $ITS,[
CAML A,[-100]
PJRST BKINIT
]
MOVSS A
HRR A,BKSTRT ;get starting address
SKIPGE @BKSTRT ;if a vector command, use previous word instead
SUBI A,1
MOVEM A,BKPT1
POPJ P,
BKSTP: .BP (777777),BKBEG ;byte ptr to beginning of star field.
SUBTTL The VECTOR Of MYSTERIES
VERSIO: .FNAM2 ;the version of Space-War
OPTION: $MXSHP+$MXSUN_3+$ITS_6+$10INT_7+$MOVIE_12
; Specifies options used to assemble SPCWAR:
; 2.2: on if movies enabled
; 2.1: on if flares used in explosions
; 1.9: on if fireballs (ala PDP-9 war in use)
; 1.8: on if 10-6 interrupts enabled
; 1.7: on if ITS version of the game
; 1.6 - 1.4: maximum nummber of suns
; 1.3 - 1.1: maximum number of ships
ZAPPER: 0 ;0=torp game,1=beam game
TNO: 30. ;# of torps
TVL: 12.0 ;torp vel
RLT: 14. ;torp reload time in 30ths (0=one torp per push)
TLF: 110. ;torp life in 30ths
TXTM: 15. ;torp explode time in 30ths
TORBRI: 7 ;torp brightness (0-7)
NSHIPS: $MXSHP ;number of ships (initially max # assembled for)
NFU: 40.0 ;fuel supply
SAC: 0.025 ;spaceship accel
MAA: .08 ;angular accel (radians per 1/30 sec)
SPIN: 0 ;0=normal turn+stop, 1=true space spin
MAALIM: CPI.5 ; when SPIN=1, exceeding this ang. vel. is fatal.
HYPT1: 120. ;time invisible in hyperspace (30ths)
HYPT2: 110. ;time as hyperspace star (30ths)
HYPT3: 120. ;hyperspace reload time (30ths)
HYPBO: 10 ;hyperspace lose rate (fraction of 100 octal)
SSEXTM: 90. ;ss explode time (30ths)
SSBRI: 4 ;ss brightness (0-7)
SHPSIZ: 1.0 ;SS size (ratio - 1.0 normal, 2.0 twice size, etc)
STR: 12.5 ;star capture radius
GRV: 600.0 ;grav constant (gravity strength)
KILLER: 1 ;0=warper sun, 1=killer sun
NSUNS: $MXSUN ; yes!
RANSUN: 0 ;0=specified sun locs, 1=random sun locs each game
BHOLE: 0 ;1=make one sun invisible (black hole)
SUNBRI: 4 ;sun brightness (0-7)
RANST: 0 ;0=fixed start pos., 1=random start pos. (of ships)
EGT: 15. ;delay at end of game (30ths)
SCRTIM: 3*30. ;length of time to display scores (30ths)
ME1: 12.5 ;max collision radius
BOUNCE: 0 ;if non-zero, bounce off edges
FIRBAL: 1 ;if non-zero, fireballs are deadly
SHPMAS: 1.0 ;MASS OF A SHIP
TRPMAS: 0.5 ;MASS OF A TORPEDO
EXSCL: 0 ;explosion scale
FLRSCL: 3 ;FLARE SCALE
BKGTSP: 0.05 ;rate of star flow
GSSBX: 0 ;control selection: 0=consoles, 1=data sws
;(restart if you change gssbx)
SERL: 1 ;scorekeeper series length (0=no scoring)
MSCBRI: 5 ;miscellaneous (flames,expl,etc.) bri. (0-7)
STEPTM: 2 ;clock rate in 1/60th's. 2 means each step = 1/30 sec
FATAL: 0
JRST 4,34000 ;to ddt (tenlod) jsr'ed here when lose
HYPLOS: BLOCK $MXSHP ;REQUIRES BOTH FIRE&HYPER BUTTONS TO HYPER
;(this is a lossage due to use of weird consoles)
;********* Phaser (beam) component **********
RAYLEN: 400. ;length of beam (never over 512.!)
BRATE: 0.005 ;beam power rate
FFRATE: 0.01 ;rate of power loss for f.f.
FHITRT: 0.15 ;power loss rate, attacked f.f..
TDSABL: 5. ;disable time(30ths)
DESTR1: 20. ;destruct time, consecutive hits
DESTR2: 100. ;destruct time, total hits
DISTIM: 450. ;time he is disabled
BMPLN: 90. ;time he can fire beam
BMRLD: 90. ;beam reload time
NOHYPR: 1 ;0 = allow hyperspace, 1 = do not
;********************************
SUBTTL One Time Initialization and Patch Area
PAT:
PATCH: BLOCK 50
PDL: -40,,.
BLOCK 40
MAXFLO: 377777,,777777 ;MAX POSITIVE # (INT. OR FLOAT)
PIE: CPI
PI2: .OP FMPR CPI 2.0
PI1.5: .OP FMPR CPI 1.5
PI.5: .OP FMPR CPI 0.5
PI.25: .OP FMPR CPI 0.25
;one time initialization of the game
GO: MOVE P,PDL
IFE $ITS,[
MOVEI A,400000
SOJGE A,. ;delay to ensure everything loaded
CONO APR,A%STRT+APRCHN ;clear all APR flags and I/O
CONO APR,A%CCEO+APRCHN ;enable clock
IFN $10INT, CONO ITPDEV,10+ITPCHN ;enable interrupts from pdp10
]
PUSHJ P,BKINIT ; Initialize background starfield.
CONO WCNSLS,40 ;enable spacewar consoles
PUSHJ P,CMPASS ;set up shield points for faster display
MOVE A,[DATAI WCNSLS,T] ;for input selection. get datai for consoles
SKIPE GSSBX ;and plug in if gssbx agrees.
MOVE A,[DATAI T] ;else get datai for data switches
IFE $MOVIE [
MOVEM A,GSS ;and put in routine.
]
IFN $MOVIE [
MOVEM A,GSS11 ;and put in routine.
MOVEM A,GSS21 ;(2 ships, 2 input routines)
]
IFN $ITS,[
MOVE A,[600000,,STEPTM] ;interrupt every steptm/60 sec
.REALT A,
JFCL
.SUSET [.SMASK,,[%PIRLT]] ;ENABLE RLT
.SUSET [.SPICLR,,[-1]] ;ENABLE INTS
]
MOVE T,TDISPT ;set up torpedo BLKO pointer
MOVEM T,TDPTR
PUSHJ P,SETSHP ;set ship BLKO pointers
MOVEI A,DSLST3
MOVEM A,DISLST
DSTART ;START 340 NOW WITHOUT SHIP AND TORP AREAS
IFE $ITS,[ CONO PI,P%CLR\P%CENB\P%ON\APRBIT\FLGBIT\DISBIT\ITPBIT
;clear PI system and enable ints for channels
]
SUBTTL Per-Game Initialization
;come here to clear scores before beginning series of games
SERIES: MOVE A,SERL ;reset series length
MOVEM A,SERCNT'
SKIPE SAVSCR ;and clear scores unless requesting save.
JRST GAME
MOVSI A,-$MXSHP ;get number of ships
SETZM SCORE(A) ;zero scores for new series
AOBJN A,.-1
;initialization performed on a once per game basis
GAME: PUSHJ P,RANSET ;set up random # table
MOVSI A,-OBJCTS
SETZM OBJFLG(A) ;clear update address of each object
AOBJN A,.-1
MOVE A,NSHIPS
CAILE A,$MXSHP
MOVEI A,$MXSHP ;NSHIPS may not exceed $MXSHP
MOVEM A,NSHIPS
IMUL A,[-1,,0] ;create AOBJN pointer
MOVEM A,NEGSHP'
MOVE A,NSUNS ;same for NSUNS
CAILE A,$MXSUN
MOVEI A,$MXSUN
MOVEM A,NSUNS
IMUL A,[-1,,0]
MOVEM A,NEGSUN'
IFN $MOVIE,[ PUSHJ P,TAPRT ;do necessary stuff for taping setup
]
;Perform set-up code for objects of those types for which
;set-up is required.
MOVEI R,0
SKIPN SETTBL(R) ;done when zero address
JRST GAME2
PUSHJ P,@SETTBL(R) ;set up this object class
AOJA R,.-3
GAME2: SETZM GEFLG' ;game is in progress
MOVE A,NSHIPS
SUBI A,1 ;set counter that will hit zero when only
MOVEM A,SSING' ; one ship left
MOVE A,EGT ;save end of game delay
MOVEM A,GECNT'
MOVE A,ME1 ;compute collision radius squared
FMPR A,A
MOVEM A,ME12'
SETOB A,MDBFSW ;select an initial display list
MOVE Q,MDBTAB+1(A) ;get BLKO pointer for it
MOVEM Q,MDBCUR
LDB A,[.BP 7,MSCBRI] ;setup command for miscellaneous brightness
IORI A,PM%EBR\NC%PNT
MOVEM A,MDBFBR
JRST ML0B ;and start the game
; Table specifying routines to set up each type of object in the game which
;requires set-up for any reason. Currently, only suns, ships, and torpedos
;require this processing
SETTBL: SETSHP ;STAR-SHIPS
SUNSET ;SUNS (I kept the name for KLH)
SETTRP ;TORPEODS
0 ;end of list
SUBTTL Per-Game Star-Ship Initialization
SETSHP: MOVE B,NEGSHP ;loop control
MOVE C,SSEXTM ;values from vector of mystries for each ship
MOVE T,TNO
MOVN TT,NFU
MOVE D,[%TSS,,SSS] ;initial update routine and type
MOVEI XFLAG,100 ;for computing hyperspace loss rate
MOVE A,SHPMAS ;ship mass
;Set all ships' vlaues except for starting location (see below).
STSHP1: MOVEM T,MTR(B)
MOVEM TT,MFU(B)
MOVEM A,OBJMAS(B)
MOVEM C,MB1(B)
MOVEM D,OBJFLG(B)
MOVEM XFLAG,MHYPP(B)
SETZM OBJXVL(B) ;remaining variables are zeroed
SETZM OBJYVL(B)
SETZM OBJAVL(B)
SETZM MNOGRV(B) ;affected by gravity
SETZM MA1(B)
SETZM MHYP(B)
SETZM BMPOW(B) ;and phasar variables
SETZM BMRLSF(B)
SETZM BMENB(B)
SETZM THENB(B)
SETZM CWENB(B)
SETZM CCWENB(B)
SETZM DISTM(B)
SETZM THITS(B)
SETZM CHITS(B)
SETZM HIT(B)
SETZM DHITS(B)
AOBJN B,STSHP1
SKIPN RANST
JRST STSHP3 ;set fixed locations
;Give each ship a random starting position
MOVE B,NEGSHP
STSHP2: PUSHJ P,RANONE
FMPR A,[1024.0] ;insure in proper range
MOVEM A,OBJX(B)
PUSHJ P,RANONE
FMPR A,[1024.0]
MOVEM A,OBJY(B)
PUSHJ P,RANONE ;and random angle
FMPR A,PI2
MOVEM A,MTH(B)
AOBJN B,STSHP2
JRST STSHP5 ;set up display information
; Give each ship a fixed starting position and angle
STSHP3: MOVE A,NSHIPS
FSC A,233 ;float number of ships
IFE $ITS,[ FADR A,[0.0]
]
MOVE B,PI2
FDVR B,A ;increment to equally place ships on circle
MOVE D,NEGSHP
TLNN D,1
JRST [MOVE C,PI.25 ;even number of ships: first in upper right
JRST .+2] ; and skip next instruction
MOVE C,PI.5 ;odd number of ships: first above center
STSHP4: MOVE A,PIE
FADR A,C ;make ship point to center
MOVEM A,MTH(D)
MOVE A,C
PUSHJ P,SIN
FMPR A,SHPIRD ;distance from center
FADR A,[512.0]
MOVEM A,OBJY(D)
MOVE A,C
PUSHJ P,COS
FMPR A,SHPIRD
FADR A,[512.0]
MOVEM A,OBJX(D)
FSBR C,B ;move around the circle clockwise
AOBJN D,STSHP4
; Set up information relating to generating the ship's display list.
STSHP5: MOVE A,NEGSHP
LDB B,[.BP 7,SSBRI] ;set up brighness instruction for dislay
IORI B,PM%EBR\NC%PNT
MOVEI C,PM%HLT ;stop command for last word of list
STSHP6: MOVE MP2,SHPDSN(A) ;get design index to obtain information
MOVE T,DSNADR(MP2) ;address of generation routine
MOVEM T,SHPADR(A)
MOVN TT,DSNLN(MP2) ;create a BLKO pointer for the list
MOVE T,SDADRS(A)
SUBI T,1
HRL T,TT ;form <-length,,addr-1>
MOVEM T,SHPDPT(A)
MOVE T,DSNSL(MP2) ;ship-lengths
MOVEM T,SHPSL(A)
MOVE T,DSNSL1(MP2)
MOVEM T,SHPSL1(A)
MOVE T,DSNLN2(MP2) ;used to update list address
MOVEM T,SHPLN2(A)
MOVE T,SDADRS(A) ;place display instruction at list start
MOVEM B,0(T)
MOVEM C,1(T) ;make sure nothing happens until update
MOVE T,SHPDPT(A) ;put BLKO pointer where display list expects it
MOVEM T,SDPTRS(A)
AOBJN A,STSHP6
;Insure that all ships not in game have no display lists
MOVE A,NSHIPS
CAIL A,$MXSHP
POPJ P, ;no unused ships
MOVEI A,$MXSHP
SUB A,NSHIPS
IMUL A,[-1,,0] ;make <nships-maxss,,0>
HRR A,NSHIPS ;AOBJN pointer for ships not in game
HLLZM SDPTRS(A) ;makes unused ship have no display list
AOBJN A,.-1
POPJ P, ;that's all
SHPIRD: 350.0 ;initial ship radius from center
SUBTTL Sun and Torpedo Per-Game Initialization
;Procedure to initialize suns for a game
SUNSET: SKIPN S,NEGSUN
POPJ P, ;there are no suns
LDB A,[.BP 7,SUNBRI] ;create command to set sun brightness
IORI A,PM%EBR\NC%PNT
MOVEM A,SUNBR'
MOVE A,[%TSUN,,TWINKL] ;sun type plus name
MOVEM A,OBJFLG+$MXSHP(S)
SETZM SUNINV(S) ;clear black-hole flag
AOBJN S,.-2
SKIPE BHOLE
SETOM SUNINV ;if this switch on, make sun #1 invisible
SKIPN RANSUN
JRST SUNST2 ;suns will be fixed
;Place suns in random locations
MOVE S,NEGSUN
SUNST1: PUSHJ P,RANDOM ;get random position
PUSHJ P,SUNDWN ;put it in
AOBJN S,SUNST1
POPJ P, ;that's all
;Place sun sin fixed positions
SUNST2: MOVE A,NSUNS
FSC A,233 ;float number of suns
IFE $ITS,[ FADR A,[0.0]
]
MOVE B,PI2
FDVR B,A ;put increment to equally space suns
MOVE S,NEGSUN
CAME S,[-1,,0]
JRST SUNST3 ;more than one sun
MOVE A,[512.,,512.] ;one sun, place in center
PUSHJ P,SUNDWN
POPJ P,
SUNST3: TLNN S,1
JRST [MOVE C,[0.0] ;even suns - start at right side
JRST .+2]
MOVE C,PI.5 ;odd - start above center
SUNST4: MOVE A,C
PUSHJ P,SIN
FMPR A,SUNIRD
FADR A,[512.0] ;get Y coordinate (around center)
MOVE T,A
MOVE A,C
PUSHJ P,COS
FMPR A,SUNIRD
FADR A,[512.0] ;and get X coordinate
MOVE TT,A
SSFIX TT,-1. ;fix X into left half on MP1
SSFIX T,-19. ;fix Y into right half of TT
HLL A,MP1 ;put <x,,y> into A
HRR A,TT
PUSHJ P,SUNDWN ;set it
FADR C,B ;get angle of next sun
AOBJN S,SUNST4
POPJ P, ;that's all
SUNIRD: 100.0 ;distance of suns from center
;Procedure to set sun location given [x,,y] in A
SUNDWN: HLRZ MP1,A ;get X into MP1
IDIV MP1,[1024.] ;get remainder in screen limits into MP2
MOVEM MP2,ISUNLX(S)
FSC MP2,233 ;float it
IFE $ITS,[ FADR MP2,[0.0]
]
MOVEM MP2,FSUNLX(S)
MOVEM MP2,OBJX+$MXSHP(S)
HRRZ MP1,A ;now fix Y coordinate
IDIV MP1,[1024.]
MOVEM MP2,ISUNLY(S)
FSC MP2,233
IFE $ITS,[ FADR MP2,[0.0]
]
MOVEM MP2,FSUNLY(S)
MOVEM MP2,OBJY+$MXSHP(S)
POPJ P,
;Procedure to initialize torpedos for a game
SETTRP: LDB A,[.BP 7,TORBRI] ;create command to set brightness of torps
IORI A,PM%EBR\NC%PNT
MOVEM A,TORDIS ;and put at start of list
MOVE T,[PT%NOP,,PT%NOP] ;point no ops
MOVSI A,TORDSB-TORDSE ;set list to noops
MOVEM T,TORDSB(A)
AOBJN A,.-1
MOVE A,TDISPT ;fetch BLKO pointer
MOVEM A,TDPTR ;place into DISLST: torps now displayed
POPJ P,
SUBTTL Main Processing Loop of Space-War
ML0: PUSH Q,[0] ;ENSURE IN PARAM MODE AT END
HLRZ A,Q ;GET LH (USING THAT HELPS CHECK CONSISTENCY)
ADDI A,MDBUFL ;GET CNT OF WDS PUSHED ONTO MDBUF LIST
MOVN A,A
HRLZ A,A
HRR A,MDBCUR ;NOW HAVE BLKO PTR, -<CNT>,,<ADDR-1>
MOVE B,MDBFSW ;GET CURRENT MDBUF SWITCH
MOVEM A,MDBPTR+1(B) ;STORE BLKO PTR IN RIGHT PLACE
MOVEI A,DSLST1+1(B) ;START 340 HACKING LIST JUST FINISHED
MOVEM A,DISLST ;change list
SETCAB B,MDBFSW ;SWITCH TO OTHER MDBUF BUFFER
MOVE Q,MDBTAB+1(B) ;GET PDL PTR FOR IT
MOVEM Q,MDBCUR ;SAVE AS CURRENT
ML0B: PUSH Q,MDBFBR ;put brightness command into list
IFN $MOVIE [
DATAI A ;read the switches
TRNN A,1 ;skip if stopping action
JRST NOSTOP
STOP1: DATAI A
TRNE A,2
JRST [ SKIPE STOPSW'
JRST STOP1
SETOM STOPSW
JRST NOSTOP]
SETZM STOPSW
JRST STOP1
NOSTOP:]
;now before entering synch wait, check to see if game-end
;flag should be set. conditions are:
;1) all ships gone,
;2) all torps gone (in torp game) and all torps/expls done
;3) all fuel gone (in phaser game)
; -- algorithm waits for sole survivor (if any) to come out of
;hyper or finish exploding before setting flag.
SKIPE GEFLG ;if already set flag,
JRST MLSYNC ;obviously don't need to set again!
MOVE D,NEGSHP
SETZ B,
MOVEI C,SSS
ML0E: SKIPN A,OBJFLG(D)
JRST ML0F
CAIE C,(A) ;SHIP IN SSS ROUTINE?
JRST MLSYNC ;NO, NEVER END UNLESS SO.
SKIPE ZAPPER ;PHASER GAME?
JRST [ SKIPG MFU(D) ;SHIP HAS FUEL?
SETO B, ;YES, PROVISIONALLY CLEAR
JRST ML0F] ;NO, CONTINUE SEARCH
SKIPLE MTR(D) ;TORP GAME. SHIP HAS TORPS?
SETO B, ;YEP, PROVISIONALLY CLEAR
ML0F: AOBJN D,ML0E
JUMPE B,[ SETOM GEFLG ;IF SEARCH FAILED, END GAME.
SKIPE ZAPPER
JRST .+1
MOVE A,TLF ;if torp game, extend GECNT so that
CAILE A,30.*10. ;remaining torps have chance to clobber ships.
MOVEI A,30.*10. ;but only for 10 seconds or so.
ADDM A,GECNT
JRST MLSYNC]
SKIPG SSING ;OR IF 1 (SSING=0) SHIP LEFT.
JRST [ MOVEI A,1 ;IF ONLY ONE
CAME A,NSHIPS ;STARTED GAME, THEN OK.
SETOM GEFLG ;ELSE END GAME.
JRST .+1]
MLSYNC: AOSE CLKSNK ;wait for clock sync (STEPTM/60 sec)
IFE $ITS, JRST .-1
IFN $ITS,[
.HANG
MOVE A,[-2,,[.SPIRQC,,[0] ? .SIMASK,,[%PIRLT]]]
.SUSET A
]
SKIPE GEFLG ;GAME-END FLAG SET?
JRST [ SOSG GECNT ;AND EGT COUNTED OUT?
JRST GAMEND ;YES, END OF THIS GAME.
JRST .+1] ;NOT YET, CONTINUE UPDATING STUFF.
PUSHJ P,RANDOM
ANDI A,7
MOVN A,A
ADDM A,RINDEX ;change RINDEX randomly to avoid stepping
;thru table the same # of times every pass.
;update each object in game (look for collisions first)
SETZ MP1,
ML1: SKIPN OBJFLG(MP1)
JRST MQ1 ;object is not active
SKIPG C,OBJFLG(MP1)
JRST MQ4 ;object is not collideable
MOVEI MP2,1(MP1) ;start with objects after this one
ML2: SKIPG D,OBJFLG(MP2)
JRST MQ2B ;obj cannot collide
MOVE A,OBJX(MP1) ;compute distance between them
FSBR A,OBJX(MP2)
MOVM A,A
CAMLE A,ME1
JRST MQ2B
MOVE B,OBJY(MP1)
FSBR B,OBJY(MP2)
MOVM B,B
CAMLE B,ME1
JRST MQ2B
FMPR A,A ;x difference**2
FMPR B,B ;y difference**2
FADR A,B ;difference**2
CAMLE A,ME12 ;are they close enough
JRST MQ2B ; no -continue looking
; Collision! - find types
PUSH P,C
PUSH P,MP1
PUSH P,MP2
HLRZS C
ANDI C,17
HLRZS D
ANDI D,17
CAILE C,(D)
JRST [ EXCH MP1,MP2
EXCH C,D
JRST .+1]
PUSHJ P,@COLTBL(C) ;VECTOR TO APPROPRIATE RTN
POP P,MP2
POP P,MP1
POP P,C
MQ2B: CAIGE MP2,OBJCTS-1 ;check for more collisions here
AOJA MP2,ML2 ;go do more collisions for this object
;now create display list for object
MQ4: SKIPE A,OBJFLG(MP1) ;in case object was removed in coll.
PUSHJ P,(A) ;make the list and other random functions
MQ1: CAIGE MP1,OBJCTS-2 ;next to last object
AOJA MP1,ML1 ; no - continue
AOS MP1 ;yes - make mp1 point to last object
SKIPE A,OBJFLG+OBJCTS-1 ;is it active (do not look for collisions)
PUSHJ P,(A) ; yes - make its display list
SKIPE ZAPPER
PUSHJ P,RAYGUN ;perform phaser manipulations here
;move backround star field
MOVE T,BKGTSP
FADRB T,BKTMF ;increment position of background
SFIX T,-19.
MOVEM TT,BKTIME
PUSHJ P,BKMOVE ;UPDATE DISPLAY COMMANDS
JRST ML0 ;start main loop again
SUBTTL Collision Processing
;collision routine table, indexed by smaller of 2 types involved.
;OBJFLG indices must be in MP1 (smaller) and MP2,
; with object types in C and D respectively.
COLTBL: COLSUN ; 0 - SUN
COLSS ; 1 - SS
COLSS ; 2 - HYPERSPACE SS
COLT ; 3 - TORP
COLFB ; 4 - FIREBALL
;explosion routine table, to explode given object.
;routines assume OBJFLG index in MP1!!
EXPTBL: APOPJ ; 0 - SUN
SEXP ; 1 - SS
SEXP ; 2 - SS
TEXP ; 3 - TORP
APOPJ ; 4 - FIREBALL
;clearing table, to simply flush object from game.
;routines assume OBJFLG index in MP2!!
CLRTBL: APOPJ ; SUN
SCLR ; SS
SCLR ; SS
TCLR ; TORP
APOPJ
APOPJ
APOPJ
TCLR: MOVE T,[PT%NOP,,PT%NOP] ;clear torp's display slot
MOVEM T,TORDSB-TORIDX(MP2)
RANCLR: SETZM OBJFLG(MP2) ;clear random obj's routine slot.
APOPJ: POPJ P,
SCLR: ; Clear a star ship
HLLZM SDPTRS(MP2) ; zero list length: do not display
SETZM OBJFLG(MP2) ; clear routine slot
SOS SSING ; remove 1 more SS from game.
POPJ P,
;random object hit sun.
COLSUN: SETZM OBJXVL(MP2) ;zero velocities so result stays put
SETZM OBJYVL(MP2)
SETOM MNOGRV(MP2) ;indicate gravity doesn't affect it any more.
MOVSI A,(SETZ)
IORM A,OBJFLG(MP2) ;make it non-collidable in future
MOVE MP1,MP2 ;special case: want to explode obj in MP2.
SKIPE KILLER ;are suns deadly? (ha ha)
PJRST @EXPTBL(D) ;go blow him up
CAIE D,%TSS ;hyper sun, but only warps if obj is SS.
PJRST @EXPTBL(D)
SETZM OBJX(MP2) ;sigh, suspend belief and put him in corners.
SETZM OBJY(MP2)
ANDCAM A,OBJFLG(MP2) ;restore collidability
SETZM MNOGRV(MP2) ;gravity affects.
POPJ P,
; SS vs. something (not sun)
COLSS:
CAIN D,%TFB ; vs. fireball?
JRST [ SKIPN FIRBAL ; if so,
JRST APOPJ ;ignore unless FIRBAL says they're dangerous
JRST .+1] ;in which case die!
CAIE D,%TTORP
JRST COLSS2
LDB A,[260500,,OBJFLG(MP2)] ;get creator of torp
JUMPE A,COLSS2 ;skip if no originator, OBJCTSody gets credit.
CAIN A,1(MP1) ;originator index same as victim
SOSA SCORE(MP1) ;yes, take one off score of this clod!
AOS SCORE-1(A) ;no, increment score of creator.
COLSS2: PUSHJ P,MMNTUM ;calc new vel of expl,
PUSHJ P,SEXP ;and explode SS, while
PJRST @CLRTBL(D) ;clearing slot of other object.
; Torp vs. torp or lesser entity
COLT: CAIN D,%TFB ;if vs. fireball,
PJRST TEXP ;blow up regardless of FIRBAL setting.
PUSHJ P,MMNTUM ;calc vel of expl
PUSHJ P,TEXP ;blow up torp,
PJRST @CLRTBL(D) ;and clear other object.
; Fireball vs. fireball or lesser (if anything).
COLFB: POPJ P, ;do nothing.
;fireballs, worry about conservation of momentum
MMNTUM: MOVE C,OBJMAS(MP1) ;compute combined mass
FADR C,OBJMAS(MP2)
;formula is vx=(m1*vx1+m2*vx2)/(m1+m2)
IRP XORY,,[X,Y]
MOVE A,OBJ!XORY!VL(MP1)
FMPR A,OBJMAS(MP1)
MOVE B,OBJ!XORY!VL(MP2)
FMPR B,OBJMAS(MP2)
FADR A,B
FDVR A,C
MOVEM A,OBJ!XORY!VL(MP1)
TERMIN
MOVEM C,OBJMAS(MP1) ;update the mass
POPJ P,
SUBTTL End Of Game Processing
GAMEND: SKIPN SERCNT ;keeping score?
JRST SERIES ; no - start over now
IFN $MOVIE [
SKIPGE MOVIE
JRST GAME ;no score update or display if playbacking
]
MOVE A,NEGSHP
SETOM B
;compute the current scores
MDN11: HRRZ C,OBJFLG(A)
CAIN C,SSS
HRRZ B,A
AOBJN A,MDN11 ;FIND SINGLE LIVE SHIP IF ANY
SKIPL B
AOS SCORE(B) ;ONE POINT FOR BEING SOLE SURVIVOR.
SOSLE SERCNT ;should score be displayed yet?
JRST GAME ; no - just start new game
SETZM MDN3X'
MOVE MP1,NEGSHP
;create the display list of the ships
MOVE A,PI.5
PUSHJ P,TRIGVS ;set up trig. values for angle pi/2 (vertical)
MOVEI A,4 ; and make them four times normal size
IRP V,,[XSIN,SXSIN,XCOS,SXCOS,XSIN45,SXSIN45,XCOS45,SXCOS45]
IMULM A,V
TERMIN
MDN4: MOVE C,[<1024./<$MXSHP+1>>]
FSC C,233 ;FLOAT IT (caution- 6 doesn't normalize!)
FADRB C,MDN3X ;position to display next ship - x
MOVE B,[600.0] ; y coordinate
PUSHJ P,SSDIS ;make the display list
AOBJN MP1,MDN4
SKIPE NOSCR'
JRST [ MOVEI A,PM%HLT
MOVEM A,TORDIS
JRST MDN8] ;skip score
;create the display list of the scores
MOVEI B,0 ;x for score of first ship
MOVE MP1,NEGSHP
MOVEI D,TORDIS ;area where numbers are put
LDB C,[.BP 7,SSBRI] ;make scores as bright as ships
IORI C,PM%ESC\<2_PM%SCS>\PM%EBR\NC%PNT ; ... with a scale of two
MOVEM C,TORDIS ;put into display area
MDN5: MOVE C,[PT%Y\<350.>\NC%PNT,,NC%CHR] ;point mode to charac, y=350.
ADD B,[<1024./<$MXSHP+1>>]
DPB B,[(001200)C] ;set x position
PUSH D,C ;put into list
HRLI D,600 ;make d a byte pointer
MOVE T,SCORE(MP1) ;GET SCORE TO DISPLAY
PUSHJ P,MDNN ;put the number into the list
MOVEI TT,37
IDPB TT,D ;character to stop character mode
SETZB TT,1(D) ;make 1(d) zero, get zero byte
MOVSI T,-4
IDPB TT,D ;four zero bytes insure that
AOBJN T,.-1 ; next command starts in a new word
AOBJP MP1,MDN6
MOVEI TT,NC%PNT ;switch to point mode
MOVEM TT,1(D)
AOJA D,MDN5
MDN6: MOVSI TT,PM%HLT ;put done command into list
MOVEM TT,1(D)
;wait for a signal to continue
MOVE D,SCRTIM ;amount of time score displayed
MDN8: MOVEI A,DSLST3
MOVEM A,DISLST
DSTART
MDN81: SETOB MP2,Q
MOVE MP1,NEGSHP
MDN7:
IFE $MOVIE, PUSHJ P,GSS ;get input value for this ship
IFN $MOVIE [
PUSH P,MOVIE' ;save in case recording
SETZM MOVIE ;zero so nothing happens
PUSHJ P,GSS ;GET INPUT VALUE FOR THIS SHIP
POP P,MOVIE
]
SKIPN B ;skip if thrust on
MOVEI MP2,0 ;do not reset score
TLNN C,200000 ;skip if hyper on
MOVEI Q,0 ;do not retain score
AOBJN MP1,MDN7
JUMPN Q,MDN12 ;if q non-zero, agreed to retain
JUMPN MP2,MDN12 ;if mp2 zero, agree to reset
AOSE CLKSNK ;has a 3oth of a second past?
IFE $ITS, JRST MDN81 ;no, continue polling buttons
IFN $ITS, .HANG
IFN $ITS,[
MOVE A,[-2,,[.SPIRQC,,[0] ? .SIMASK,,[%PIRLT]]]
.SUSET A
]
SOJG D,MDN81 ;yes, have we counted down score display
MDN12: MOVEI B,30. ;fadeout delay in 30ths
;wait and then restart
MDN9: AOSE CLKSNK ;wait for clock sync
IFE $ITS, JRST .-1
IFN $ITS, .HANG
IFN $ITS,[
MOVE A,[-2,,[.SPIRQC,,[0] ? .SIMASK,,[%PIRLT]]]
.SUSET A
]
SOJG B,MDN9 ;and wait for specified delay
JUMPN MP2,[SETZM SAVSCR ;MP2 non-zero means all thrusted
JRST SERIES] ;which means reset scores
MOVE A,SERL ;otherwise, start new series and retain scores.
MOVEM A,SERCNT
JRST GAME ;go start first game of another series
;create a number to display
MDNN: JUMPL T,[MOVEI TT,55 ;IF NEG, ADD - IN FRONT OF ABS VAL.
IDPB TT,D
MOVM T,T
JRST .+1]
MDNN1: IDIVI T,10.
PUSH P,TT ;save last digit
SKIPE T ;if zero quotient, done
PUSHJ P,MDNN1 ; else get next digits...
POP P,TT
ADDI TT,60 ;convert digit to sixbit
IDPB TT,D ;and into buffer
POPJ P,
SUBTTL Star-Ship Update Routine
;Update position, create new display, perform other functions
SSS: PUSHJ P,GSS ;get function indicators
SOS MHYP(MP1) ;decrement time till next hyperspace
SKIPE ZAPPER
JRST LTEST ;different tests for phasers
TLNE C,200000 ;not phaser game - hyper on
JRST HYPGO ; yes - enter hyperspace if ok
;processing if not going into hyperspace
SSNHYP: MOVEM B,SACL' ;save acceleration
MOVEM C,SFLGS' ;save fire, hyper flags
SKIPE SPIN ;conservation of angular momentum on?
JRST [ FDVR A,[10.0] ;yes - first scale MAA down
FADRB A,OBJAVL(MP1) ;then add to rotational speed
CAML A,MAALIM ;if speed too high,
JRST SEXP ;ship flies apart.
JRST .+1]
FADR A,MTH(MP1) ;compute new angle
CAML A,PI2 ;normalize to some extent
FSBR A,PI2
CAIGE A,0
FADR A,PI2
MOVEM A,MTH(MP1) ;store new angle
PUSHJ P,TRIGVS ;set trigonometric values for it (sin, cos, etc)
PUSHJ P,SUNGRV ;get effects of gravity
SKIPE T,SACL ;want to thrust
SKIPLE MFU(MP1) ; yes - fuel left
JRST SSNACL ; no - do not thrust
;compute x and y components of thrust vector
FADRM T,MFU(MP1) ;update fuel left
MOVE T,SACL ;get total acceleartion
FMPR T,FSIN
FADR B,T ;y increment (thrust and gravity)
MOVE T,SACL
FMPR T,FCOS
FADR C,T ;x component
;remainder of processing for new postion
SSNACL: FADRB C,OBJXVL(MP1) ;update velocities from gravity and thrust
FADRB B,OBJYVL(MP1)
LIMIT Y,B ;compute new y and x position
LIMIT X,C
SKIPE T,SACL ;thrusting
SKIPLE MFU(MP1) ; yes - fuel left
JRST FELL ; no - can't thrust
;create the thrust vector (rocket exhaust)
PUSH P,C
PUSH P,B
; PUSHJ P,RANDOM
GETRAN A
SSFIX T,-17.
ANDI A,17
ADD A,TT ;compute a random length
MOVN B,SHPSL(MP1) ;compute x and y coordinates
MOVE C,B ; of center of tail
FMPR B,FCOS
FMPR C,FSIN
FADR B,OBJX(MP1)
FADR C,OBJY(MP1)
SSFIX C,-1 ;convert to fixed values
SSFIX B,-1 ; y in d, x in c
DRWEXH: DISPT ;display a point
SUB D,XSIN ;get address of next point in vector
SUB C,XCOS
SOJG A,DRWEXH ;continue
POP P,B
POP P,C
FELL: PUSHJ P,SSDIS ;make the display list
SKIPE ZAPPER
JRST FFIELD ;for phasers, display force field if any
SOSG MA1(MP1) ;can ss fire yet
SKIPL SFLGS ; and should it fire
JRST SNOTRP ; no to either of above - return
SOSGE MTR(MP1) ;any torps left
JRST SNOTRP ; no - ignore request
;fire a torpedo
MOVE C,TVL
MOVE B,C
FMPR C,FCOS ;c = x component of initial velocity
FADR C,OBJXVL(MP1)
FMPR B,FSIN
FADR B,OBJYVL(MP1) ;b = y component
MOVE D,[-<OBJCTS-TORIDX>,,TORIDX]
SKIPE OBJFLG(D) ;skip if this slot available
AOBJN D,.-1
CAIL D,0 ;if d >= 0 then too many objects
JSR FATAL
MOVEI T,TORPCL ;torp calc routine
MOVEI A,1(MP1) ;get index+1 of ss
DPB A,[260500,,T] ;deposit in creator-field
TLO T,%TTORP ;set type = torp
MOVEM T,OBJFLG(D) ;set to torpedo calculation routine
SETZM MNOGRV(D) ;gravity affects
MOVE T,SHPSL1(MP1) ;compute initial x position
FMPR T,FCOS
FADR T,OBJX(MP1)
MOVEM T,OBJX(D) ;and save it
MOVE T,SHPSL1(MP1) ;compute initial y
FMPR T,FSIN
FADR T,OBJY(MP1)
MOVEM T,OBJY(D) ;and save it
MOVEM B,OBJYVL(D) ;set x, y components of velocity
MOVEM C,OBJXVL(D)
MOVE T,TLF ;set life of torpedo
MOVEM T,MA1(D)
MOVE T,TRPMAS ;set mass of torpedo
MOVEM T,OBJMAS(D)
MOVE T,RLT
MOVEM T,MA1(MP1) ;set reload time till next fire
MOVE T,TXTM
MOVEM T,MB1(D) ;set length of explosion for torpedo
SNOTRP: POPJ P, ;return
SUBTTL Beam Location and Star-Ship Explode
;compute starting position for phaser beam
BEAM: SKIPN RAY(MP1)
POPJ P, ;return if not firing phaser
MOVE B,XSIN ;beam is drawn every 3rd point
IMULI B,3
MOVEM B,BXSIN(MP1) ;adjust y increment
MOVE B,XCOS
IMULI B,3
MOVEM B,BXCOS(MP1) ;adjust x increment
MOVE B,SHPSL1(MP1) ;compute x and y coordinates
MOVE C,B ; of start of phaser
FMPR B,FCOS
FADR B,OBJX(MP1) ;put x in b
FMPR C,FSIN
FADR C,OBJY(MP1) ;put y in c
SSFIX C,-1 ;convert to fixed values
SSFIX B,-1
MOVEM D,DSAVE(MP1) ;y coord of start of beam
MOVEM C,CSAVE(MP1) ;x coordinate of start of beam
POPJ P,0 ;return from sss
;blow up a star ship
SEXP: MOVE T,[SETZ FLARE]
SKIPE FIRBAL
TLZ T,400000 ;can't collide - not fireballs
TLO T,%TFB
MOVEM T,OBJFLG(MP1) ;save address of computation routine
MOVE A,FLRSCL ;get length of flare from exscl
ANDI A,3
MOVE A,FLAREL(A)
MOVEM A,FLARET(MP1)
SETZM FLAREC(MP1) ;no flare yet
MOVE T,MB1(MP1)
MOVEM T,MA1(MP1) ;set length of explosion
HLLZM SDPTRS(MP1) ;zero list - remove from display
SOS SSING ;decrement # ships in game.
POPJ P,0 ;return from sss or caller
SUBTTL Gravity Computation Procedure
SUNGRV: SETZB XFLAG,R ;one stores X vel, other Y.
SETZB B,C
SKIPN MNOGRV(MP1)
SKIPN S,NEGSUN
POPJ P, ;if no sun or no gravity, returns zero accel
SUNGR1: PUSHJ P,CGRAV
FADRB C,XFLAG ;cumulative X
FADRB B,R ;cumulative Y
AOBJN S,SUNGR1
POPJ P,
CGRAV: MOVE T,OBJX(MP1) ;compute distance to sun
FSBR T,FSUNLX(S)
MOVEM T,T1'
FMPR T,T ;delta x**2
MOVE TT,OBJY(MP1)
FSBR TT,FSUNLY(S)
MOVEM TT,T2'
FMPR TT,TT ;delta y**2
FADR T,TT ;et delta r**2
MOVE A,T
PUSHJ P,SQRT ;get r to sun into a
FMPR T,A ;compute r**3
FDVR T,GRV ;divide by gravitational constant
MOVN B,T2
FDVR B,T ;put y component of accel. into b
MOVN C,T1
FDVR C,T ;put x component into c
POPJ P,
SUBTTL Display a Ship
;PUSHJ P,SSDIS
; Function:
; Generates the display list for a ship.
; Inputs:
; MP1: The index of the ship whose display list is created.
; Registers Used:
; B, C, D, T, TT
SSDIS: MOVE T,SHPSL(MP1) ;compute x, y of front of ship
FMPR T,FCOS
FADR C,T
MOVE T,SHPSL(MP1)
FMPR T,FSIN
FADR B,T
SSFIX C,-1 ;put fixed x into d
SSFIX B,-1 ;put fixed y into c
MOVE A,[PT%Y\NC%PNT,,PT%X\PT%DSP\NC%PNT]
TLZ C,776000 ;remove high order bits from data
TLZ D,776000
MOVEM C,SYCOR ;save coordinates of center
MOVEM D,SXCOR
MOVE T,SHPLN2(MP1) ;save for use by generating routine
MOVEM T,CSPLN2
SETZM RLHSW ;start on right half
MOVE T,SDADRS(MP1) ;get address of first word
MOVEI T,1(T) ; by bypassing parameter command
PUSHJ P,@SHPADR(MP1) ;create list
MOVE T,SHPDPT(MP1) ;make ship visible again
MOVEM T,SDPTRS(MP1)
POPJ P,
;PUSHJ P,TRIGVS
; Function:
; Given an angle, computes various trigonometric values which are used to
; generate the display list of a ship oriented at that angle.
; Inputs:
; A: Angle in radians for which the trig values are computed.
; Uses Registers:
; A, B
TRIGVS: MOVEM A,ORNTSV'
PUSHJ P,SIN
FMPR A,SHPSIZ
MOVEM A,FSIN'
MOVEM A,MPFSIN(MP1) ;save sine of angle of orientation (a)
SSFIX A,-1 ;convert to fixed
MOVEM B,XSIN ; for display routine
MOVEM B,SXSIN
MOVE A,ORNTSV
PUSHJ P,COS
FMPR A,SHPSIZ
MOVEM A,FCOS'
MOVEM A,MPFCOS(MP1) ;save cos(a)
SSFIX A,-1 ;save fixed value for
MOVEM B,XCOS ; display routine
MOVEM B,SXCOS
MOVE A,FSIN
FADR A,FCOS
FMPR A,[.7071068] ;sin (ang+45)= (1/(sqrt 2)) (sin+cos)
MOVEM A,FSIN45'
SSFIX A,-1 ;save fixed(sin(a+pie/4))
MOVEM B,XSIN45
MOVEM B,SXSIN45
MOVE A,FCOS
FSBR A,FSIN
FMPR A,[.7071068] ;cos (ang+45) = (1/(sqrt 2))(cos-sin)
MOVEM A,FCOS45'
SSFIX A,-1
MOVEM B,XCOS45 ;save fixed(cos(a+pie/4))
MOVEM B,SXCOS45
POPJ P,
RLHSW: 0 ;specifies which half being generated
CSPLN2: 0 ;length of first half current ship list
SXCOR: 0 ;starting X coordinate of ship
SYCOR: 0
XCOS: 0 ;used to rotate display list
XSIN: 0
SXCOS: 0
SXSIN: 0
XCOS45: 0
XSIN45: 0
SXCOS45: 0
SXSIN45: 0
SUBTTL Enter Hyper-Space and Update Routines for Hyper-Space
;routine to enter hyperspace
HYPGO: SKIPLE MHYP(MP1) ;ok to enter now
JRST SSNHYP ; no - continue as usual
HLLZM SDPTRS(MP1) ;make list zero length: stop display
MOVE A,[SETZ HYPI] ;initially invisible in hyperspace
MOVEM A,OBJFLG(MP1) ; and not collidable
MOVE A,HYPT1
MOVEM A,MHYP(MP1) ;time invisible in hyperspace
POPJ P,0 ;return from sss
;display routine for a ship invisible in hyperspace
HYPI: SOSLE MHYP(MP1) ;time to become visible?
POPJ P, ; no - that's all
;time to reappear. compute a random x, y for object
IRP XORY,,[X,Y]
; PUSHJ P,RANDOM
GETRAN A
ANDI A,1777
TLC A,232000
FAD A,A
MOVEM A,OBJ!XORY(MP1)
TERMIN
MOVEI A,HYPO ;use visible-in-hyperspace routine
TLO A,%THSS ;indicate is HSS.
MOVEM A,OBJFLG(MP1)
MOVE A,HYPT2
MOVEM A,MHYP(MP1) ;set time as hyperspace star
POPJ P,
;display routine for a ship visible as a hyperspace star
HYPO: SOSG MHYP(MP1) ;still a star?
JRST HYPO1 ; no - break out
MOVE C,OBJY(MP1) ;make a star and display it at
SFIX C,-1. ;fix y
MOVE B,OBJX(MP1)
SFIX B,-1. ;fix x
ADD C,[(1)]
DISPT ;make point at x,y+1
SUB D,[(2)]
SUB C,[(1)]
DISPT ;make point at x-1,y-1
ADD C,[(2)]
DISPT ;make point at x+1,y-1
POPJ P,
;break out of hyperspace
HYPO1: MOVN B,HYPBO ;decrement chance of coming out
ADDB B,MHYPP(MP1)
; PUSHJ P,RANDOM
GETRAN A
ANDI A,77
CAMG B,A ;random chance, p=7/8, 6/8, 5/8, ...
JRST SEXP ;lose - explode
MOVE A,[%TSS,,SSS] ;restore to usual starship update routine
MOVEM A,OBJFLG(MP1)
MOVE A,HYPT3 ;set time till hyper legal again
MOVEM A,MHYP(MP1)
PUSHJ P,RANONE ;compute random orientation
FMPR A,PI2
MOVEM A,MTH(MP1)
;compute random velocity
IRP XORY,,[X,Y]
PUSHJ P,RANONE
FMPR A,SAC
FMPR A,[90.0] ;exit at speed up to 3 sec's acceleration
MOVEM A,OBJ!XORY!VL(MP1)
TERMIN
SETZM OBJAVL(MP1) ;stop any spinning
JRST SSS
SUBTTL Torpedo Update Routines
;initial torp routine. this no-op is necessary because torps
;are created by ship update routines before any torps have been
;updated, so when the computer gets farther down the
;OBJFLG list to the torps, any created torps are 'updated' again!
;this leads to strange things like blowing yourself up if you
;fire backwards while moving faster than tvl.
TORPCL: MOVEI B,TRPCAL ;actual torp update routine
HRRM B,OBJFLG(MP1) ;put in OBJFLG slot
POPJ P, ;'no-op' done!
;display routine for a torpedo
TRPCAL: SOSGE MA1(MP1) ;torp life over
JRST TEXP ; yes - blow it up
PUSHJ P,SUNGRV ;compute effects of gravity
FADRB B,OBJYVL(MP1) ;update velocity components
FADRB C,OBJXVL(MP1)
SKIPE GMSLSW ;if torp is homer
JRST [ PUSHJ P,GMSTRN ;go adjust xy vels.
MOVE B,OBJYVL(MP1)
MOVE C,OBJXVL(MP1)
JRST .+1]
LIMIT Y,B ;update coordinates
LIMIT X,C
SFIX C,-1 ;fix coordinates
SFIX B,-1
TLO C,PT%Y\NC%PNT ;y coord
TLO D,PT%X\PT%DSP\NC%PNT ;x coord
HLR C,D
MOVEM C,TORDSB-TORIDX(MP1) ;put coordinates of point into disp list
POPJ P,
;blow up a torpedo
TEXP:
MOVE T,[SETZ MEX]
SKIPE FIRBAL
TLZ T,400000 ;fireballs, CAN collide!
TLO T,%TFB ;say are expl. now
MOVEM T,OBJFLG(MP1) ;save address of explode routine
MOVE T,[PT%NOP,,PT%NOP] ;clear out display of the torp
MOVEM T,TORDSB-TORIDX(MP1)
MOVE T,TXTM
MOVEM T,MA1(MP1) ;save length of explosion
CPOPJ: POPJ P,
SUBTTL Homeing Torpedo Guidance Control
GMSLSW: 0 ;-1 -> XY guidance; 1 -> trigonemetric guidance
GMTINC: .5 ;amount XY coords can be adjusted each step
GMTAA: 0.05 ;angular turn a step for trigonemetric guidance
GMSRNG: 40000.0 ;range**2 within which torp locks on target.
GMSTRN: LDB MP2,[330300,,OBJFLG(MP1)] ;get index of target if any
JUMPG MP2,GMSTR3 ;jump if one exists
LDB C,[260500,,OBJFLG(MP1)] ;no, must look. get creator index
SUBI C,1
MOVE MP2,NEGSHP
GMSTR1: CAIN C,(MP2) ;DON'T HOME ON CREATOR!
JRST GMSTR2
SKIPG A,OBJFLG(MP2) ;find live (collidable) SS
JRST GMSTR2
HRRZ A,A
CAIE A,SSS
CAIN A,HYPO
CAIA
JRST GMSTR2
MOVE A,OBJX(MP1) ;COMPUTE DISTANCE TO IT
FSBR A,OBJX(MP2)
FMPR A,A
MOVE B,OBJY(MP1)
FSBR B,OBJY(MP2)
FMPR B,B
FADR A,B
CAMG A,GMSRNG ;WITHIN RANGE RADIUS?
JRST GMSTR4 ;YES, LOCK ON TARGET!
GMSTR2: AOBJN MP2,GMSTR1
POPJ P, ;no target found, don't alter velocities.
GMSTR4: MOVEI A,1(MP2)
DPB A,[330300,,OBJFLG(MP1)] ;SET TARGET.
JRST GMSTR5
GMSTR7: SETZ A,
DPB A,[330300,,OBJFLG(MP1)]
POPJ P,
GMSTR3: MOVEI MP2,-1(MP2) ;adjust index (since is stored as 1 greater)
SKIPG R,OBJFLG(MP2) ;target now collidable?
JRST GMSTR7 ;no, on next pass will hunt for another.
HRRZ R,R
CAIE R,SSS
CAIN R,HYPO
CAIA
JRST GMSTR7
GMSTR5: MOVE A,OBJX(MP1)
MOVE B,OBJX(MP2)
RELATV A,B
MOVE T,B
MOVE A,OBJY(MP1)
MOVE B,OBJY(MP2)
RELATV A,B
MOVE TT,B
MOVE C,OBJXVL(MP1)
MOVE D,OBJYVL(MP1)
CAIN R,HYPO ;is SS a hyperspace star?
JRST GMSTR6 ;yes, ignore SS 'vel'
FSBR C,OBJXVL(MP2)
FSBR D,OBJYVL(MP2)
GMSTR6: PFDVR D,C ;get slope of TV vec (Torp Vel)
PFDVR TT,T ;of TS vec (Torp-to-SS)
SETZ B, ;clear flags
CAML D,TT
TRO B,1 ;set flag if TV slope > TS slope
XOR T,C ;XOR X COORDS
CAIGE T,0
TRO B,2 ;SET FLAG IF SIGNS DIFFERENT
JRST @(B)[
GMSCCW ;IF SAME X SIGN AND VSL<SSL
GMSCW ;IF SAME X SIGN AND VSL>SSL
GMSCW ;IF DIFF X SIGN AND VSL<SSL
GMSCCW] ;IF DIFF X SIGN AND VSL>SSL
;TURN TV VECTOR CLOCKWISE
GMSCW: TDCA B,B ;HACKY WAY TO CLEAR AND SKIP
;TURN COUNTER-CLOCKWISE
GMSCCW: MOVEI B,1
SKIPL GMSLSW ;if -1 turn cheaply
JRST GMSC50 ;else if 1 go use trig to turn.
MOVE T,OBJXVL(MP1)
MOVE TT,OBJYVL(MP1)
CAIGE D,0 ;SKIP IF VSL POS
TRO B,2 ;SET FLAG IF NEG
CAILE B,0
CAIL B,3
TRO B,20 ;SET IF +VSL/CW OR -VSL/CCW (MEANS SWAP X,Y)
TRNE B,20
EXCH T,TT
CAIGE T,0
TRO B,10
CAIGE TT,0
TRO B,4 ;SET FLAGS TO SIGNS
MOVM T,T
MOVM TT,TT
MOVE C,T
FSBR C,GMTINC
JUMPL C,GMSC30 ;IF |A|-e < 0 THEN HANDLE DIFFERENTLY
MOVE T,C
FADR TT,GMTINC
GMSC20: TRNE B,10 ;WAS ORIGINAL SIGN NEG?
MOVN T,T ;MAKE NEG IF SO
TRNE B,4
MOVN TT,TT ;DITTO
TRNE B,20
EXCH T,TT
MOVEM T,OBJXVL(MP1)
MOVEM TT,OBJYVL(MP1)
POPJ P,
GMSC30: MOVE A,GMTINC
FADR C,TT
JUMPL C,[MOVE A,T
FADR A,TT
JRST .+1]
FADR TT,T
FSBR TT,A
FSBR T,A
MOVM T,T
MOVM TT,TT
TRC B,10
JRST GMSC20
GMSC50: MOVE A,OBJYVL(MP1)
PFDVR A,OBJXVL(MP1) ;get slope of current torp velocity vector
PUSHJ P,ATAN ;FIND ANGLE OF SLOPE RELATIVE TO 0
SKIPGE OBJXVL(MP1)
FADR A,PIE ;ADD PI IF POINT ON OTHER SIDE OF X AXIS
MOVE C,GMTAA ;get turn speed
TRNN B,1
MOVN C,C ;NEGATE CORRECTION IF TURNING CLOCKWISE
FADRB A,C
PUSHJ P,SIN
EXCH A,C ;PUT SIN IN C, SAME ANGLE AS ARG TO COS.
PUSHJ P,COS
MOVE D,A ;COS IN D
MOVE A,OBJXVL(MP1) ;FIND MAGNITUDE OF VELOCITY.
FMPR A,A
MOVE B,OBJYVL(MP1)
FMPR B,B
FADR A,B
PUSH P,C
PUSHJ P,SQRT ;GET VELOCITY IN A
POP P,C
FMPR C,A ;GET Y COMPONENT
FMPR D,A ;GET X COMPONENT
MOVEM C,OBJYVL(MP1)
MOVEM D,OBJXVL(MP1)
POPJ P,
SUBTTL Flare Creation Routines
;routine to create a flare after a star ship blows up and before
; the fireball is displayed.
FLARE: AOS FLAREC(MP1) ;see if flare is complete
AOS A,FLAREC(MP1)
CAMLE A,FLARET(MP1)
JRST FLARE2 ; flare is finished
MOVEM A,MSKIND' ; no - save index into flare mask array
FLAREA: PUSHJ P,SUNGRV ;compute effects of gravity
FADRB B,OBJYVL(MP1)
FADRB C,OBJXVL(MP1) ;compute velocity
LIMIT Y,B ;fix and update coordinates of expl
LIMIT X,C
SFIX C,-1 ;convert to fixed
SFIX B,-1
MOVE A,MSKIND
MOVE A,FLSMSK(A) ;get correct mask for time
MOVEM A,SUNSIZ ;for use by twink2
HLR C,D
ANDCM C,[776000,,776000] ;set up to vector
IOR C,[PT%Y\NC%PNT,,PT%X\PT%DSP\NC%VCT]
MOVE A,C ;put into proper acc
MOVSI T,-10. ;20 vectors sufficient
PUSHJ P,TWINK2+2 ;create explosion
POPJ P, ;that's all
;now make the flare get smaller
FLARE2: MOVEI A,FLARE3
SKIPN FIRBAL
TLO A,400000
TLO A,%TFB
MOVEM A,OBJFLG(MP1)
JRST FLARE3 ;start the flare getting smaller
;make the flare decrease in size
FLARE3: SOSGE A,FLAREC(MP1) ;check if flare done
JRST FLARE4 ;done, make fireball
MOVEM A,MSKIND ;save index of flare
JRST FLAREA ;rest of code same as above
;restore to a fireball
FLARE4: MOVEI A,MEX
SKIPN FIRBAL
TLO A,400000
TLO A,%TFB ;SET TYPE= %TFB
MOVEM A,OBJFLG(MP1) ;set addr of normal explosion
MOVE A,MA1(MP1) ;decrease time left for explosion
SUB A,FLARET(MP1)
MOVEM A,MA1(MP1)
POPJ P, ; that's all
SUBTTL Explosion Update Routine
MEX: SOSGE MA1(MP1) ;is explosion over yet?
JRST MEXNO ; yes - remove object
MOVEI T,200 ;no - compute size of explosion now
SKIPE FIRBAL
JRST MEX1 ;fireballs can never get larger
IMUL T,MA1(MP1)
IDIV T,MB1(MP1) ;will increase with time
MOVEI B,1400
IDIV B,MB1(MP1) ;compute max size
CAMG T,B ;and limit explosion to it
MOVE T,B
MEX1: MOVEM T,EXSIZE'
MOVE T,MA1(MP1) ;use time to go as point count
ASH T,@EXSCL ;for big explosions
SKIPE FIRBAL
MOVEI T,44 ;with fireball always set number of points
PUSH P,T ;save t which is used by cgrav
PUSHJ P,SUNGRV ;compute effects of gravity
POP P,T ;restore saved regs
MEX1A: FADRB B,OBJYVL(MP1) ;update y, x velocities
FADRB C,OBJXVL(MP1)
LIMIT Y,B ;fix them
LIMIT X,C
SFIX C,-1
SFIX B,-1
MOVEM C,EXY' ;and save them
MOVEM D,EXX'
;create random points
EXCH C,D ;put x into c and y into d
MEX2: IRPS CORD,,D C
; PUSHJ P,RANDOM
GETRAN A
TLZ A,776000
IDIV A,EXSIZE
TRNN B,2
LSH A,1
TRNN B,1
MOVNS A
ADD CORD,A
TERMIN
DISPT ;put POINT into list
HRLS MP2
MOVE D,EXY ;restore center coordinates
MOVE C,EXX
SOJGE T,MEX2 ;continue making fireball
POPJ P,
;object has stopped exploding
MEXNO: SETZM OBJFLG(MP1) ;flush object
POPJ P,
SUBTTL Input Routines And Movie Code
;input routines for each star ship
; OUTPUTS ARE:
; a = ang. velocity increment (+ = ccw)
; b = acceleration (if any)
; c bits are:
; 0 - on for fire button
; 1 - on for hyper button
IFN $MOVIE [
MRECPT: 440500,,PRGEND ;initial recording head position
MPLYPT: 440500,,PRGEND ;initial playback head position
TAPRT: DATAI A ;read data sws
TRNN A,10 ;tape hacking enabled?
JRST TRETZ ;no. movie=0
TRNE A,20 ;yes. filming or viewing?
JRST TAPRT1 ;viewing playback.
HRRZ A,MRECPT ;get current addr
AOJ A, ;increment to get next(free) wd
CAILE A,CORSIZ-3 ;see if too high
MOVEI A,PRGEND ;correct if so
SETZM (A) ;zero word as sign of game beginning
SKIPN B,RAN ;make sure ran is non-zero
MOVE B,[123456,,654321]
MOVEM B,1(A) ;store value of ran
MOVEI A,2(A) ;finally done, point to start of record
HRLI A,440500 ;form byte pointer
MOVEM A,MRECPT ;put back, all done
MOVEI A,1 ;return, setting movie to 1
MOVEM A, MOVIE
POPJ P,
TRETZ: SETZM MOVIE
POPJ P,
TAPRT1: HRRZ B,MRECPT ;get current recording addr.
SKIPGE MOVIE ;skip if mrecpt ok
HRRZ B,MPLYPT ;no,we were playing...reverse from mplypt.
TRNE A,100 ;play last thing?
JRST TAPRT4 ;yes, go get it
TRNE A,40 ;playing forward?
JRST TAPRT3 ;no, reverse.
PUSHJ P,TAPFWD ;get next game--playing forward
JRST TAPRT5
TAPRT3: PUSHJ P,TAPREV ;takes arg in b, returns addr of prev. game in b
SKIPL MOVIE
JRST TAPRT5 ;once enuf if this first time
SOJ B, ;set up for next pass
CAIGE B,PRGEND
MOVEI B,CORSIZ-3
TAPRT4: PUSHJ P,TAPREV
TAPRT5: MOVE A,1(B) ;get val. of ran
MOVEM A,RAN ;set it
MOVEI B,2(B) ;get addr of input string
HRLI B,440500 ;convert to byte ptr
MOVEM B,MPLYPT ;store
SETOM MOVIE ;return setting movie neg.
POPJ P,
TAPREV: SETZM TWIC'
TPRV1: SUBI B,PRGEND ;get index (=0 when run off low end)
SKIPN PRGEND(B) ;look for zero word
SKIPN PRGEND+1(B) ;found one! test next for non-z
SOJGE B,.-2 ;loop
JUMPGE B,TPRV2 ;found start of a game!
SKIPE TWIC
JSR FATAL ;found nothing anywhere!
SETOM TWIC
MOVEI B,CORSIZ-3 ;ran off low end, wrap to high end
JRST TPRV1 ;try again
TPRV2: MOVEI B,PRGEND(B) ;insert real addr
POPJ P,
TAPFWD: SETZM TWIC
TPFD1: SUBI B,CORSIZ-3 ;get -<# words to try>
JUMPG B,TPFD2 ;jump if too close to end
SKIPN CORSIZ-3(B) ;zero wd?
SKIPN CORSIZ-2(B) ;if so, next non-z?
AOJLE B,.-2
JUMPLE B,TPFD3 ;found start!
TPFD2: SKIPE TWIC
JSR FATAL ;found nothing
SETOM TWIC
MOVEI B,PRGEND ;reset
JRST TPFD1
TPFD3: MOVEI B,CORSIZ-3(B) ;insert real addr
POPJ P,
;input routines when taping.
GSS1: SKIPL MOVIE ;skip if playbacking!!!!
JRST GSS11
ILDB T,MPLYPT ;load 5 bits from ptr
ROT T,-5 ;get bits into upper part
JRST GSSGOT
GSS11: DATAI 0 ;get input for ship 1
MOVSS T,T ;from right half of word
JRST GSSGOT
GSS2: SKIPL MOVIE ;skip if playbacking!!!
JRST GSS21
ILDB T,MPLYPT
ROT T,-5
JRST GSSGOT
GSS21: DATAI 0 ;get input for ship 2
GSSGOT: SKIPG MOVIE
JRST .+4
ROT T,5 ;get into low bits
IDPB T,MRECPT
ROT T,-5 ;restore
] ;end of IFN $MOVIE !!!
;BYTE POINTERS TO SWITCHES FOR EACH SHIP
BUTTNS: .BP 000777,T ;UPPER-RIGHT CORNER: TOP PLUG ON SWITCHES BANK
.BP 777000,T ;LOWER-RIGHT CORNER: SECOND PLUG
.BP (000777),T ;LOWER-LEFT CORNER: THIRD PLUG
.BP (777000),T ;UPPER-LEFT CORNER: BOTTOM PLUG
;except it wont work with movie mode yet anyway..
GSS: DATAI 0
;pick up inputs for the current ship
LDB T,BUTTNS(MP1) ;can be from any place this way
SETZB A,B ;clear output values
MOVEI C,0
TRNN T,400 ;turn clockwise?
MOVN A,MAA ; yes - put -maa into a
TRNN T,200 ;turn counter-clockwise?
MOVE A,MAA ; yes - put maa into a
TRNN T,100 ;thrust on
MOVE B,SAC ; yes - get acceleration
TRNE T,40 ;hyperspace on?
JRST NOTON ;no
SKIPE HYPLOS(MP1) ;IS IT A LOSSAGE WARCONSOLE?
TRNN T,20 ; YES - DO IT ONLY IF FIRE ALSO ON
TLO C,200000 ;turn on bit 1
NOTON: TRNN T,20 ;fire on?
TLO C,400000 ; yes - turn on bit 0
SKIPN ZAPPER ;all done with phaser input
SKIPE RLT ;is sniping on?
POPJ P,0 ; no - return
;process sniping by checking that fire button was released
JUMPL C,TRIGGR ;firing?
SETZM CHAMBR(MP1) ; no - clear chamber and return
POPJ P,0
TRIGGR: SKIPE CHAMBR(MP1) ;is chamber clear?
JRST JAMMED ; no - can't fire
SETOM CHAMBR(MP1) ;fire and jam
POPJ P,0
JAMMED: TLZ C,400000 ;turn off fire bit
POPJ P,0
SUBTTL Random Number Generators
;Routine to set up random # table
RANSET: PUSH P,A
PUSH P,B
MOVSI B,-LRANTB
RANST1: PUSHJ P,RANDOM
MOVEM A,RANTAB(B)
AOBJN B,RANST1
POP P,B
POP P,A
POPJ P,
;routine to set up index into RANTAB
RINSET: MOVEI A,LRANTB-1
MOVEM A,RINDEX
POPJ P,
;routine for use when AC specified for random # isn't A.
RINSTX: EXCH A,RINDEX
MOVEI A,LRANTB
EXCH A,RINDEX
SOS (P)
SOS (P) ;return to the SOSGE before the call to RINSET.
POPJ P, ;this is necessary to get index in right ac.
RINDEX: 0
RANTAB: BLOCK LRANTB
;routine to compute a random number
;later replace by something more demonstrably random. Note that an indeterministic
;random # can be obtained by crunching the current display BLKO pointer!!
RANDOM: MOVE A,RAN
FMPB A,RAN
TSC A,A
MOVEM A,RANSAV'
MOVE A,RAN
FMPB A,RAN
TSC A,A
HRR A,RANSAV
POPJ P,
RAN: 123456,,654321 ;initial seed
;routine to generate random no. 0.0<#<1.0
RANONE:
; PUSHJ P,RANDOM ;get random pattern
GETRAN A
ANDI A,-1
TLC A,232000 ;float it
FADR A,A
FSC A,-18. ;get 0.0< # <1.0 (pdp-6 doesn't normalize!)
IFE $ITS,[ FADR A,[0.0]
]
POPJ P,
SUBTTL Sun Update
TWINKL: MOVEI S,-$MXSHP(MP1) ;adjust to comfortable index.
SKIPE SUNINV(S)
POPJ P, ;no-op if this sun is black hole.
PUSH Q,SUNBR ;sun brightness
MOVSI T,1
HRLZ D,ISUNLY(S) ;get sun y coord
HRR D,ISUNLX(S) ;get sun x coord
IRP Z,,[AX,AY,SX,SY,[AX,AY],[AX,SY],[SX,AY],[I,SX,SY]]
; PUSHJ P,RANDOM
GETRAN A
ANDI A,7
LTWNK=.
IRP W,,[Z]
IFSE W,AX,ADDI D,1
IFSE W,SX,SUBI D,1
IFSE W,AY,ADD D,T
IFSE W,SY,SUB D,T
TERMIN
MOVE C,D
AND C,[1777,,1777]
IOR C,[PT%Y\NC%PNT,,PT%X\PT%DSP\NC%PNT]
PUSH Q,C
SOJGE A,LTWNK
IRPC W,,[Z]
IFSE [W]I,.ISTOP
IFSE [W]X,HRR D,ISUNLX(S)
IFSE [W]Y,HRL D,ISUNLY(S)
TERMIN
TERMIN
POPJ P,
;display a twinkling object in vector mode
TWINK2: MOVE A,[PT%Y\<512.>\NC%PNT,,PT%X\PT%DSP\<512.>\NC%VCT] ;default is sun
MOVSI T,-4 ;8 lines
PUSH Q,A ;STORE INITIALIZING WD IN MDBUF LIST
LTWK:
; PUSHJ P,RANDOM
GETRAN A
AND A,SUNSIZ ;get x,y increments in each half
MOVS C,A ;put ra,,la in c
HRR C,A ;put ra,,ra into c
HLR A,A ;make a = la,,la
XORI A,VC%DSP\VC%YSN\VC%XSN ;right half restores to center
PUSH Q,A ;put into list
XORI C,VC%DSP\VC%YSN\VC%XSN ;same with c
PUSH Q,C ;put into list
AOBJN T,LTWK
IORI C,VC%ESC ;change last command
MOVEM C,(Q) ; to enter parameter mode
PUSH Q,MDBFBR ;NOW CAN REENTER POINT MODE
POPJ P,0
TWINC: PUSH Q,[PT%Y\<512.>\NC%PNT,,PT%X\PT%DSP\<512.>\NC%INC]
;SET LOC AT CENTER, GO INTO VECINCR MODE
MOVSI C,-8.
TWINC3:
; PUSHJ P,RANDOM
GETRAN A
SETCM B,A ;GET COMPLEMENT INTO B
ANDCM A,[600000,,600000] ;FLUSH ESC AND INTENSIFY BITS
IOR A,[325252,,325252] ;INTENSIFY ON WAY OUT, ALWAYS INCR
ANDCM B,[600000,,600000]
IOR A,[125252,,125252] ;ALWAYS INCR
PUSH Q,A
PUSH Q,B
AOBJN C,TWINC3
IORI A,400000 ;SET LAST HWD TO ESC TO PARAMETER.
MOVEM A,(Q)
PUSH Q,MDBFBR ;REENTER PT MODE
POPJ P,
SUBTTL Phasar Per Loop Processing
; routine to handle phaser beams, called once on each main loop pass
RAYGUN: MOVEM P,RYSAVP' ;save P since may stack instrs on PDL
MOVE MP1,NEGSHP ;counter
RLOOP: SOSLE DISTM(MP1) ;is he still disabled
JRST RLOP1 ;yes
SETZM BMENB(MP1) ;no- give back his powers
SETZM THENB(MP1)
SETZM CWENB(MP1)
SETZM CCWENB(MP1)
RLOP1: SKIPL T,MFU(MP1) ;power? put in t.
JRST RYLOUT ;jump if no power left.
HRRZ A,OBJFLG(MP1)
CAIE A,SSS ;make sure this ship not in hyper or expl.
JRST RYLOUT
MOVE A,BMPOW(MP1)
SKIPE RAY(MP1) ;beam?
JRST BMCHK ;jump if firing beam.
SETZM BMRLSF(MP1) ;clear release flag.
BMINCP: CAMGE A,BMPLN
AOSN A
MOVE A,BMPLN
MOVEM A,BMPOW(MP1)
JRST RYLOUT
BMCHK: JUMPLE A,BMINCP
SKIPE BMENB(MP1) ;nose damaged?
JRST BMINCP ;yes, no firing but continue reload.
SKIPE BMRLSF(MP1) ;check for release.
JRST BMINCP
SOSE BMPOW(MP1)
JRST FIREBM
MOVN A,BMRLD ;set up reload time.
MOVEM A,BMPOW(MP1)
SETOM BMRLSF(MP1) ;set release flag.
;fire beam.
FIREBM: FADR T,BRATE ;beam eats power.
MOVEM T,MFU(MP1)
;initialize for rmiss routine
MOVE D,MPFSIN(MP1)
MOVE B,MPFCOS(MP1)
MOVM T,B ;protection against cos=0
SETZM VERT'
CAMG T,[0.000001]
SETOM VERT
FDVRB D,B ;get slope asl=sin/cos in d.
FMPR B,B ;asl**2
MOVE C,[1.0]
FADR B,C ;asl**2 + 1
FDVR C,B ;1/asl**2 + 1 in c
MOVE MP2,NEGSHP ;INNER LOOP
RLUIP: CAMN MP1,MP2 ;CHECKING SAME SHIP?
JRST RYLIN ;DON'T.
HRRZ A,OBJFLG(MP2) ;MAKE SURE THAT POTENTIAL VICTIM
CAIE A,SSS ;IS NOT HYPER OR EXPL
JRST RYLIN
SETZM HIT(MP2) ;ASSUME NO HIT TIL PROOF.
;adjust coords of other ship
MOVE A,OBJX(MP1)
MOVE B,OBJX(MP2)
RELATV A,B
MOVEM B,X'
MOVE A,OBJY(MP1)
MOVE B,OBJY(MP2)
RELATV A,B
MOVEM B,Y'
;test direction.
XOR B,MPFSIN(MP1) ;sign bit will be 0 if same,1 if diff.
JUMPGE B,OKDIR ;right dir. if either x,y have same sign.
MOVE B,X
XOR B,MPFCOS(MP1)
JUMPL B,RYLIN ;no hit if neither coord matches.
OKDIR: SKIPN FIELD(MP2) ;don't test for ff hit
JRST FLDOFF ;if enemy doesn't have it on!
;test for force field hit.
MOVEI R,0
PUSHJ P,RMISS
CAMG A,RAD2(R) ;a=(dist to center of field)**2
JRST ZAP ;a hit if dist. is less than radius of field.
JRST RYLIN
;test for ship hit (ship has 3 hittable circles, like snowman)
FLDOFF: MOVEI R,3
PUSHJ P,RMISS
CAMG A,RAD2(R)
JRST ZAP ;if rmiss says so.
SOJG R,FLDOFF+1
JRST RYLIN ;here only if no hits at all.
RMISS: MOVE A,COLLOC(R) ;get loc of circle on ship axis
MOVE B,A ;(+:to nose,-:to tail).
FMPR A,MPFSIN(MP2) ;get x,y coords of the loc.
FMPR B,MPFCOS(MP2)
FADR A,Y ;now have y-coord in a
FADR B,X ; x b
SKIPE VERT ;don't try to get dist. if cos=0
JRST REQX
MOVE T,A ;save x,y =center of coll. radius.
MOVE TT,B
FMPR A,D ;a=asl,a*y
FADRB A,B ;a*y+x
FMPR B,C ;(ay+x)/(a**2+1) now have xi in b
MOVE A,B
FMPR A,D ;a*xi now have yi in a
EXCH A,T ;save xi,yi (coords. of intersection of beam
EXCH B,TT ;with perpendicular of x,y) for zap
FSBR A,T ;get y-yi
FSBR B,TT ;get x-xi
FMPR A,A ;y**2
FMPR B,B ;x**2
FADR A,B ;r**2 is now in a;this is the desired result.
POPJ P,0
REQX: MOVEI TT,0 ;put xi=0 in tt for zap
MOVE T,A ;put yi=y in t for zap
MOVE A,B ;if vertical, dist. is just the x diff.
FMPR A,A
POPJ P,
RYLIN: SETZM HIT(MP2) ;NO HIT, BUT CAN COME HERE WITH HIT=-1
AOBJN MP2,RLUIP ;NO HIT ON THIS ONE, CHECK OTHER SHIPS.
MOVE A,RAYLEN ;if here, no hit AT ALL - use standard length.
PUSHJ P,DORAY ;do the ray.
JRST RYLOUT ;NOW BACK TO OUTER LOOP.
ZAP: SETOM HIT(MP2)
FMPR T,T ;yi**2 (from rmiss)
FMPR TT,TT ;xi**2
FADR T,TT ;get rs**2 =dist from inters. to ship
PUSHJ P,SQRT ;ri**2 is still in a from rmiss--get ri.
MOVE B,[.707] ;sin pi/4
FMPR B,RADIUS(R) ;now have rp/(2)**1/2 in b
MOVE C,A ;put ri in c.
MOVE A,T ;arg for sqrt
PUSH P,B
PUSH P,C
PUSHJ P,SQRT ;get rs in a.
POP P,C
POP P,B
CAMG C,B ;skip if ri>rp/sqrt(2)
JRST INNER
;rb=rs-[(ri-rp)/(1-sqrt(2))]
FSBR C,RADIUS(R) ;ri-rp
FDVR C,[-.4144] ;1/(1-sqrt(2))
FSBR A,C ;rb=rs-above
JRST RANGE
;rb=rs-[(1-sqrt(2))*ri +rp]
INNER: FMPR C,[-.4144] ;(1-sqrt(2))*ri
FADR C,RADIUS(R) ;above+rp
FSBR A,C ;rs-above
RANGE: FSBR A,SHPSL1(MP1) ;allow for ship nose
SFIX A,-19. ;fix dist. for comparing with raylen
CAMLE B,RAYLEN ;skip if raylen long enough
JRST RYLIN ;nope
;we have a solid hit--draw beam for this length
MOVE A,B ;arg to doray
PUSHJ P,DORAY ;do it at long last
MOVEM R,HIT(MP2) ;let other know where it's been hit
JUMPN R,[MOVSI T,-5 ;just do sparkle if no f.f.
MOVE A,SXPMSK
JRST NOFLD]
MOVEI A,PM%EBR\7\NC%PNT
MOVEM A,@FFBRI(MP2) ;increase f.f. brightness (flare)
SETOM HIT(MP2) ;-1=hit in f.f.
MOVSI T,-2 ;initialize for twink2
MOVE A,FXPMSK
NOFLD: MOVEM A,SUNSIZ ;set size of sparkle
SUB D,BXSIN(MP1)
SUB C,BXCOS(MP1)
HLR D,C ;y and x from doray are now in left+rt half of d
ANDCM D,[776000,,776000] ;isolate y,x
IOR D,[PT%Y\NC%PNT,,PT%X\PT%DSP\NC%VCT] ;set to go into vector mode
MOVE A,D ;put in right acc. for twink2
PUSHJ P,TWINK2+2 ;bypass twink2's sun-loc initialize
;the beams are done--now handle the hits produced.
MOVE R,HIT(MP2) ;restore R
JUMPG R,SSHIT ;R:-1=f.f. hit, 0=no hit,1,2,3=nose,mid,tail.
MOVE A,[FADRM A,MFU]
ADDI A,(MP2) ;make instr mung right slot
PUSH P,A
PUSH P,[MOVE A,FHITRT] ;this is what the FADRM will FADR.
SETZM DHITS(MP2) ;zero the consec. counters
SETZM CHITS(MP2)
JRST RYLOUT
SSHIT: AOS THITS(MP2) ;total hits in game
AOS CHITS(MP2) ;consecutive hits thus far
AOS A,DHITS(MP2) ;consec. hits for disabler
CAMGE A,TDSABL ;skip if enough hits to disable something
JRST RYLOUT ;ELSE ALL FOR NOW.
MOVE A,DISTIM ;cripple! set up how long he will be disabled
MOVEM A,DISTM(MP2)
SETZM DHITS(MP2) ;reset dhits.
CAIE R,2
JRST SSHIT1 ;not middle, skip.
SETZ B,
MOVE A,MTH(MP2) ;hit middle. see which side to kill.
FSBR A,MTH(MP1) ;ths-th
CAIGE A,0
TRO B,2 ;SET IF NEG
MOVM A,A
CAIGE A,PIE
TRO B,1 ;SET IF ABS VAL<PI
MOVEI A,@(B)[
CWENB(MP2) ;IF POS AND >PI
CCWENB(MP2) ;IF POS AND <PI
CCWENB(MP2) ;IF NEG AND >PI
CWENB(MP2)] ;IF NEG AND <PI
SSHIT1: CAIN R,1
MOVEI A,BMENB(MP2) ;hit nose, disable beam
CAIN R,3
MOVEI A,THENB(MP2) ;hit tail, disable thrust
HRLI A,(SETOM)
PUSH P,A ;PUSH INSTR TO XCT LATER
SSHIT2: MOVE A,DESTR1 ;reached limit,
CAMLE A,THITS ;total hits?
JRST SSHIT4 ;yes, die.
MOVE A,DESTR2 ;else reached limit,
CAMG A,CHITS ;consecutive hits?
JRST RYLOUT ;nope, not yet
SSHIT4: PUSH P,[PUSHJ P,SEXP]
MOVE A,[MOVEI MP1,]
ADDI A,(MP2) ;turn into MOVEI MP1,<IDX>
PUSH P,A ;and xct it before the SEXP call
AOS SCORE(MP1) ;increment score of killing ship
RYLOUT: AOBJN MP1,RLOOP
CAME P,RYSAVP
JRST [ POP P,B ;pop queued instrs off PDL and XCT them.
XCT B
JRST .-1]
POPJ P,
;DRAW THE BEAM (LENGTH IN A)
DORAY: LSH A,-2 ;get proper iterate (div by 4 to get increment)
JUMPGE A,.+2 ;blow up if firing too close
JRST SEXP
HRLZ A,A ;GET CNT
ADD Q,A ;ADD INTO PDL PTR
CAIL Q,
JSR FATAL ;OVERFLOW!
MOVN A,A ;NOW MAKE AOBJN
HRRI A,1(Q) ;GET ADDR (+1 SINCE Q PTS TO LAST PUSHED WD)
MOVE D,DSAVE(MP1)
MOVE C,CSAVE(MP1) ;restore c and d from prev. calc.
HLL B,D ;form display instr.
HLR B,C
AND B,[1777,,1777]
IOR B,[PT%Y\NC%PNT,,PT%X\PT%DSP\NC%PNT]
MOVEM B,(A) ;put it in dis area
ADD D,BXSIN(MP1)
ADD C,BXCOS(MP1)
AOBJN A,.-7 ;loop to form another
HRRI Q,-1(A) ;UPDATE PDL PTR
POPJ P,
SUBTTL ForceField Generator and Test For HyperSpace
LTEST: SETZM RAY(MP1)
TLNN C,400000 ;skip if fire on
JRST NOHYP ;else cannot be hyp
TLNN C,200000 ;skip and hyper if both f.f. and fire on.
JRST NOHYP
SKIPN NOHYPR ;skip if hyperspace disabled
JRST HYPGO
TLZ C,400000 ;can't fire with shields up
NOHYP: SKIPE BMENB(MP1)
TLZ C,400000 ;wipe out fire bit if nose disabled
SKIPE THENB(MP1)
SETZ B, ;wipe out sac if tail disabled
JUMPE A,.+7 ;no action if maa=0
JUMPL A,.+4 ;pos or neg(ccw or cw)
SKIPE CCWENB(MP1) ;ccw ok?
SETZ A, ;erase if no
JRST .+3
SKIPE CWENB(MP1) ;cw ok?
SETZ A, ;ditto if ditto
TLNE C,400000 ;check for fire here
SETOM RAY(MP1) ;set flag if fire
SETZM FIELD(MP1)
TLNE C,200000 ;hyper lever? asking for f.f.
SETOM FIELD(MP1) ;set flag if f.f.
JRST SSNHYP
;routine to form f.f. (force field, deflectors)
FFIELD: SKIPN FIELD(MP1)
JRST BEAM ;go to beam if no field to form
SKIPLE T,MFU(MP1) ;see if still have power
JRST FFDIE ;erase flag+return if not
MOVE A,FFRATE ;field uses power
FADRB A,MFU(MP1) ;use it!
MOVE D,OBJX(MP1)
FSBR D,RADIUS ;adjust so will only have to add positive #'s
JUMPGE D,.+2 ;must allow for wraparound
FADR D,[1024.0]
MOVE C,OBJY(MP1)
FSBR C,RADIUS
JUMPGE C,.+2
FADR C,[1024.0]
SFIX D,-19. ;fix to get scope coords
SFIX C,-1.
HRR D,T ;y in left half, x in right
MOVEI A,1(Q) ;get addr of open dis loc
MOVEM A,FFBRI(MP1) ;store it
PUSH Q,[PM%EBR\7\NC%PNT] ;and put low bri in for f.f.
MOVSI T,-FFCPTS ;# pts per circle
CIRCLE: MOVE MP2,D ;get adjusted origin
ADD MP2,CIRTAB(T) ;add incr. to get circle
AND MP2,[1777,,1777]
IOR MP2,[PT%Y\NC%PNT,,PT%X\PT%DSP\NC%PNT]
PUSH Q,MP2
AOBJN T,CIRCLE
PUSH Q,MDBFBR ;must restore normal brightness
POPJ P,
FFDIE: SETZM FIELD(MP1) ;wipe out ff
POPJ P,
;routine called on pgm startup to initialize f.f. circle coord table
CMPASS: MOVE XFLAG,PI2
MOVEI C,FFCPTS ;GET # PTS TO USE IN CIRCLE
FSC C,233 ;FLOAT IT
IFE $ITS,[ FADR C,[0.0]
]
FDVR XFLAG,C ;NOW HAVE ARC PER POINT
MOVSI R,-FFCPTS
SETZ C, ;zero arg to sin routine
CLOOP: FADR C,XFLAG ;increment argument
MOVE A,C ;put in proper acc
PUSHJ P,SIN
FMPR A,RADIUS ;mul to get right distance from center
FADR A,RADIUS ;adjust to get positive displacement
SSFIX A,-1 ;fix returned value
HLL T,B ;store y in left half
MOVE A,C
PUSHJ P,COS
FMPR A,RADIUS
FADR A,RADIUS ;again get positive displ.
SSFIX A,-1
HLR T,B ;store x in right half
MOVEM T,CIRTAB(R) ;store in table
AOBJN R,CLOOP
POPJ P,
SUBTTL Phasar Tables and Flare Masks
SUNSIZ: 303607,,303607 ;twink2 uses this to mask for vector
SXPMSK: 303607,,303607 ;put in sunsiz for ss hit
FXPMSK: 307617,,307617 ;put in sunsiz for f.f. hit
SUNMSK: 303607,,303607 ;mask for use in making sun
FLSMSK: 300200,,300200 ;mask for each time during a flare
300601,,300601 ; 1
301603,,301603 ; 2
301603,,301603 ; 3
303607,,303607 ; 4
303607,,303607 ; 5
303607,,303607 ; 6
303607,,303607 ; 7
307617,,307617 ; 10
307617,,307617 ; 11
307617,,307617 ; 12
307617,,307617 ; 13
317637,,317637 ; 14
317637,,317637 ; 15
317637,,317637 ; 16
317637,,317637 ; 17
337677,,337677 ; 20
FLAREL: 4 ; length of flare for exscl = 0
10 ; exscl = 1
14 ; exscl = 2
20 ; exscl = 3
HIT: BLOCK $MXSHP
RAY: BLOCK $MXSHP
FIELD: BLOCK $MXSHP ;0=no ff, -1=ff on
BXSIN: BLOCK $MXSHP ;for doray
BXCOS: BLOCK $MXSHP ;for doray
FFBRI: BLOCK $MXSHP ;loc. of ff birghtness word in d-list
DSAVE: BLOCK $MXSHP ;for doray
CSAVE: BLOCK $MXSHP ;for doray
THITS: BLOCK $MXSHP ;total hits in game
CHITS: BLOCK $MXSHP ;consecutive hit counter
DHITS: BLOCK $MXSHP ;disabling hits counter
COLLOC: 0.0 ;loc. of f.f.center
9.0 ;loc of nose center
-7.0 ;loc of tail center
3.0 ;loc of middle center
RADIUS: 20.0 ;radius of f.f. circle
4.0 ;rad. of nose circle
7.0 ;rad of tail circle
4.0 ;rad. of middle circle
RAD2: 400.0 ;radius table squared.
16.0
49.0
16.0
BMPOW: BLOCK $MXSHP ;beam timeout counter (duration and reload)
BMRLSF: BLOCK $MXSHP ;beam release flag(analogous to chambr:)
BMENB: BLOCK $MXSHP ;beam enable/disable
THENB: BLOCK $MXSHP ;thrust
CWENB: BLOCK $MXSHP ;cw turn
CCWENB: BLOCK $MXSHP ;ccw turn
DISTM: BLOCK $MXSHP ;time he is still disabled
CIRTAB: BLOCK FFCPTS ;table for circle coords (used in ff)
SUBTTL Sqaure Root Procedure
; This is AGB's super fast SQRT routine, probably impossible to
;improve on... clobbers B,C.
SQRT: SKIPG B,A
POPJ P,
ASH A,-1
ADD A,[262370613] ; 0.292893/0.840186 B8.
; or 0.414214/0.594101 B9.
TLON A,400
JRST SQRT2
IFN $ITS, FMPRI A,301460 ; 0.594101^101
IFE $ITS, FMPR A,[301460,,0] ; PDP-6 doesn't have FMPRI !!
JRST SQRT3
SQRT2:
IFN $ITS, FMPRI A,300656 ; 0.840186^100
IFE $ITS, FMPR A,[300656,,0]
SQRT3: MOVE C,B
FDV B,A
FAD A,B ? FSC A,-1
FDVR C,A
FAD A,C ? FSC A,-1 ; MORE EXACT THAN FADR
POPJ P,
SUBTTL SIN and COS Procedures
;FLOATING POINT SINE AND COSINE. REENTERABLE.
SIND: FMPR A,[.01745329251994] ;PI/180 (ENTRY PT FOR DEGREES)
JRST SIN
COSD: FMPR A,[.01745329251994]
COS: FADR A,SC1 ;PI/2
SIN: CAMG A,SC9 ;.000211431983 IS SUFFICIENT FOR IDENTITY, 10**-15 IS NECESSARY NOT TO UNDERFLOW
CAMGE A,[-.000211431983] ;ABS X MIGHT CAUSE POLYNOMIAL UNDERFLOW
JRST .+2
POPJ P, ;AND IS SMALL ENOUGH FOR SIN X _ X
FDVR A,SC1 ;PI/2
PUSH P,A
PUSH P,B
MULI A,400
TSC A,A ;CAML A,...SETZB B,-1(P)
ASH B,-243(A)
MOVNS A,B
ANDCMI A,1
TLC A,232000
FAD A,A
FADRB A,-1(P)
TRNE B,2
MOVNS A,-1(P)
FMP A,A
MOVE B,SC9
FMP B,A
FAD B,SC7
FMP B,A
FAD B,SC5
FMP B,A
FAD B,SC3
FMP A,B
FADR A,SC1
FMPRM A,-1(P)
POP P,B
POP P,A
POPJ P,
SC1: 1.5707963267
SC3: -0.64596371106
SC5: 0.07968967928
SC7: -0.00467376557
SC9: 0.00015148419
SUBTTL ATAN Procedure
;FLOATING POINT SINGLE PRECISION ARCTANGENT FUNCTION
;ATAN(X) = X(B0+A1(Z+B1-A2(Z+B2-A3(Z+B3)**-1)**-1)**-1)
;WHERE Z=X^2, IF 0<X<=1
;IF X>1, THEN ATAN(X) = PI/2 - ATAN(1/X)
;IF X>1, THEN RH(D) =-1, AND LH(D) = -SGN(X)
;IF X<1, THEN RH(D) = 0, AND LH(D) = SGN(X)
;THE ROUTINE IS CALLED IN THE FOLLOWING MANNER:
; MOVE A,ARGUMENT
; PUSHJ P,ATAN
;THE ANSWER IS RETURNED IN ACCUMULATOR A
ATAN: MOVEM B, ATANB ;SAVE AC B
ATAN1: MOVM B, A ;GET ABSF OF ARGUMENT
CAMG B, A1 ;IF X<2^-33, THEN RETURN WITH...
POPJ P, ;ATAN(X) = X
MOVEM D, D1 ;SAVE ACCUMULATOR D
HLLO D, A ;SAVE SIGN, SET RH(D) = -1
CAML B, A2 ;IF A>2^33, THEN RETURN WITH
JRST AT4 ;ATAN(X) = PI/2
MOVEM C, C1 ;SAVE ACCUMULATOR C
MOVSI C, 201400 ;FORM 1.0 IN C
CAMG B, C ;IS ABSF(X)>1.0?
TRZA D, -1 ;IF B .LE. 1.0, THEN RH(D) = 0
FDVM C, B ;B IS REPLACED BY 1.0/B
TLC D, (D) ;XOR SIGN WITH .G. 1.0 INDICATOR
MOVEM B, C3 ;SAVE THE ARGUMENT
FMP B, B ;GET B^2
MOVE C, KB3 ;PICK UP A CONSTANT
FAD C, B ;ADD B^2
MOVE A, KA3 ;ADD IN NEXT CONSTANT
FDVM A, C ;FORM -A3/(B^2 + B3)
FAD C, B ;ADD B^2 TO PARTIAL SUM
FAD C, KB2 ;ADD B2 TO PARTIAL SUM
MOVE A, KA2 ;PICK UP -A2
FDVM A, C ;DIVIDE PARTIAL SUM BY -A2
FAD C, B ;ADD B^2 TO PARTIAL SUM
FAD C, KB1 ;ADD B1 TO PARTIAL SUM
MOVE A, KA1 ;PICK UP A1
FDV A, C ;DIVIDE PARTIAL SUM BY A1
FAD A, KB0 ;ADD B0
FMP A, C3 ;MULTIPLY BY ORIGINAL ARGUMENT
TRNE D, -1 ;CHECK .G. 1.0 INDICATOR
FSB A, PIOT ;ATAN(A) = -(ATAN(1/A)-PI/2)
SKIPA C, C1 ;RESTORE ACCUMULATOR C AND SKIP
AT4: MOVE A, PIOT ;GET PI/2 AS ANSWER
SKIPGE D ;LH(D) = -SGN(B) IF B>1.0
MOVNS A ;NEGATE ANSWER
MOVE D, D1 ;RESTORE ACCUMULATOR
MOVE B, ATANB ;RESTORE AC B
POPJ P,
A1: 145000000000 ;2**-33
A2: 233000000000 ;2**33
KB0: 0.1746554388
KB1: 6.762139240
KB2: 3.316335425
KB3: 1.448631538
KA1: 3.709256262
KA2: -7.106760045
KA3: -0.2647686202
C1: 0
C3: 0
D1: 0
PIOT: 201622077325 ;PI/2
ATANB: 0
SUBTTL Ship Design Macro
DEFINE INST IN,CO,ADR ;generates display generating instruction
IFSE CO,X,[IN D,ADR
HLRZ B,D
]
IFSE CO,Y,[IN C,ADR
HLL B,C
TDZ B,[776000,,776000]
IOR B,A
MOVEM B,%DPP(T)
%DPP==%DPP+1
]
TERMIN
;DESIGN NAME,LENGTH,FORM
; Inputs:
; NAME: The name to be used for this ship design. It is given a
; global value of the design index.
; LENGTH: A real number specifying the length of the ship.
; FORM: A list of symbols which define the design of the ship. The
; ship's form is defined by specifying the operations necessary to
; create the right hand side of the ship when the ship is pointing
; straight up. The possible symbols are:
; U - move up one unit,
; D - move down one unit,
; L - move left one unit,
; R - move right one unit,
; UL - move up and left one unit (total length),
; UR - move up and right one unit,
; DL - move down and left one unit,
; DR - move down and right one unit,
; PUSH - remember current location, and
; POP - return to last location saved by PUSH.
DEFINE DESIGN NAME,LENGTH,FORM
%DSLOC==.
%DPP==0
IRPS FELMT,,[FORM]
IFSE [FELMT][D][
INST SUB,X,XCOS
INST SUB,Y,XSIN
]
IFSE [FELMT][R][
INST ADD,X,SXSIN
INST SUB,Y,SXCOS
]
IFSE [FELMT][DR][
INST SUB,X,XCOS45
INST SUB,Y,SXSIN45
]
IFSE [FELMT][L][
INST SUB,X,SXSIN
INST ADD,Y,SXCOS
]
IFSE [FELMT][DL][
INST SUB,X,XSIN45
INST ADD,Y,SXCOS45
]
IFSE [FELMT][U][
INST ADD,X,XCOS
INST ADD,Y,XSIN
]
IFSE [FELMT][UL][
INST ADD,X,XCOS45
INST ADD,Y,SXSIN45
]
IFSE [FELMT][UR][
INST ADD,X,XSIN45
INST SUB,Y,SXCOS45
]
IFSE [FELMT][PUSH][
PUSH P,D
PUSH P,C
]
IFSE [FELMT][POP][
POP P,C
POP P,D
]
TERMIN
SKIPE RLHSW ;check if finished
POPJ P,
SETOM RLHSW ;force left half and completion
MOVNS SXSIN ;else, reverse to do left side
MOVNS SXCOS
MOVE TT,XCOS45
EXCH TT,XSIN45
MOVEM TT,XCOS45
MOVN TT,SXCOS45
EXCH TT,SXSIN45
MOVNM TT,SXCOS45
MOVE C,SYCOR
MOVE D,SXCOR
ADD T,CSPLN2 ;move address to second half
JRST %DSLOC
%CRLOC==.
IFL %MAXLN-<2*%DPP+1>,[%MAXLN==2*%DPP+1]
NAME==%DSNNO
LOC DSNNMS+%DSNNO
.NTHWD 1,SIXBIT /NAME/
LOC DSNADR+%DSNNO
%DSLOC
LOC DSNSL+%DSNNO
.OP FMPR LENGTH 0.5
LOC DSNSL1+%DSNNO
.OP FMPR LENGTH 0.57075
LOC DSNLN+%DSNNO
2*%DPP+1 ;account for brightness command
LOC DSNLN2+%DSNNO
%DPP
LOC %CRLOC
%DSNNO==%DSNNO+1
TERMIN
SUBTTL Ship Designs and Design Tables
;These tables contain information on the above designs
DSNNMS: BLOCK $MXDSN ;names of the designs
DSNADR: BLOCK $MXDSN ;address of display list generator
DSNSL: BLOCK $MXDSN ;half the length of the ship
DSNSL1: BLOCK $MXDSN ;location of gun at front of ship
DSNLN: BLOCK $MXDSN ;total length of display list
DSNLN2: BLOCK $MXDSN ;length of right side display list
; THE STAR-SHIP ENTERPRISE: CONSTELLATION CLASS
DESIGN ENTERPRIZE,24.0,[R,DR,R,DR,DR,D DR,D,D,D,DL,D
DL,L,DL,PUSH,L,L POP,D,D,D,D,R
R,U,U,UR,DR,D D,D,D,D,D,D
D,D,D,D,D,UL DL,U,U,U,U,U
U,U,U,UL,L DL,D,D,DL]
; THE KLINGON WARSHIP
DESIGN KLINGON,24.0,[R,R,DR,D,DL,DL DL,D,D,D,D,D
D,DL,D,D,R,R DR,DR,DR,DR,PUSH,U
POP,D,D,D,PUSH,D D,POP,L,UL,UL,L
L,D,L,L]
; LONG THIN SHIP
DESIGN THINSHIP,30.0,[D,D,D,D,DR,D D,D,D,D,D,D
D,D,D,D,D,D D,D,D,D,PUSH,DR
DR,D,D,D,D,D D,L,POP,D,D,D
D,D,D,D,D,L]
; SHORT FAT SHIP
DESIGN FATSHIP,22.0,[D,D,DR,D,D,DR D,D,DR,D,D,D
D,D,PUSH,DR,D,DR D,DR,D,D,D,D
D,POP,D,D,DL,D D,D,D,PUSH,DR,DR
DR,POP,DL,D,D,L]
SDISTB: BLOCK %MAXLN*$MXSHP ;area for display lists
SDADRS: REPEAT $MXSHP,[ SDISTB+%MAXLN*.RPCNT
]
SUBTTL Ship Tables
;Specify the designs for each ship
IFL $MXSHP-3,[
IFE $SSTYP,[
SHPDSN: THINSHIP ;Old fashioned ships only
FATSHIP
]
IFN $SSTYP,[
SHPDSN: ENTERPRIZE ;New ships only
KLINGON
]
] ;of IFL $MXSHP-3
IFGE $MXSHP-3,[
SHPDSN: ENTERPRIZE ;Upper-right corner when fixed starting positions
KLINGON ;Lower-right corner
THINSHIP ;Lower-left corner
FATSHIP ;Upper-left corner
]
SHPADR: BLOCK $MXSHP ;address of each's ship display generator
SHPDPT: BLOCK $MXSHP ;BLKO pointers for each ship's display list
SHPSL: BLOCK $MXSHP ;half-length of each ship
SHPSL1: BLOCK $MXSHP ;adjusted for the gun
SHPLN2: BLOCK $MXSHP ;length of one side of display list; used to
;increment list address
SUBTTL Object Definition And Property Tables
;Definition of Object Types
%TSUN==0
%TSS==1
%THSS==2
%TTORP==3
%TFB==4
; organization of OBJCTS tables has:
; 1] $MXSHP slots reserved for SS's (exploding, hyperspatial, or otherwise)
; 2] $MXSUN slots reserved for suns
; 3] all remaining slots available for torps or randomness
TORIDX==$MXSHP+$MXSUN ; idx of first torp loc within OBJCTS tables
OBJFLG: BLOCK OBJCTS ;dispatch table for each object.
;bit 4.9 means non-collidable
;000017,,0 field = type bits
;000760,,0 field = index+1 of originator
OBJX: BLOCK OBJCTS ;x pos
OBJY: BLOCK OBJCTS ;y pos
MA1: BLOCK OBJCTS ;counter for length of explosion
MB1: BLOCK OBJCTS ;length of explosion
OBJXVL: BLOCK OBJCTS ;xvel
OBJYVL: BLOCK OBJCTS ;yvel
MNOGRV: BLOCK OBJCTS ;gravity switch: 0 affects, -1 cuts off
OBJMAS: BLOCK OBJCTS ;mass of object with ss = 1.0
FLARET: BLOCK OBJCTS ;length of time as flare
FLAREC: BLOCK OBJCTS ;length of time flare displayed
;Star-Ship tables
OBJAVL: BLOCK $MXSHP ;angular vel
MFU: BLOCK $MXSHP ;fuel
MTR: BLOCK $MXSHP ;torps
MTH: BLOCK $MXSHP ;angle
MPFCOS: BLOCK $MXSHP ;cos mth
MPFSIN: BLOCK $MXSHP ;sin mth
MHYP: BLOCK $MXSHP ;hyperspace counter
MHYPP: BLOCK $MXSHP ;hyperspace survival chances
SCORE: BLOCK $MXSHP ;wins to credit
CHAMBR: BLOCK $MXSHP ;sniping state
;Sun Tables
ISUNLY: BLOCK $MXSUN
ISUNLX: BLOCK $MXSUN
FSUNLY: BLOCK $MXSUN
FSUNLX: BLOCK $MXSUN
SUNINV: BLOCK $MXSUN ;if non-zero, sun is not displayed-- black hole
SUBTTL Display List Area
TORDIS: 0 ;torpedo brightness
TORDSB: REPEAT <OBJCTS-TORIDX>,[ PT%NOP,,PT%NOP
]
TORDSE: PM%HLT
TDISPT: -<TORDSE-TORDIS>,,TORDIS-1
MDBFBR: 0 ;Parametor word to set brightness and point mode
MDBFSW: 0 ;SWITCH INDICATING WHICH MDBUF AREA TO USE
MDBTAB: -MDBUFL,,MDBUF1-1 ;PDL PTRS FOR EACH MDBUF BUFF
-MDBUFL,,MDBUF2-1
MDBCUR: 0 ;Original PDL pointer for current buffer
MDBUF1: BLOCK MDBUFL ; misc. display buffer 1
MDBUF2: BLOCK MDBUFL
CONSTANTS
VARIABLES
SUBTTL Star Field Definition
;STAR RA,DEC,MAG
; Inputs:
; RA: The right ascension of the star. A value of +8191 represents a
; right ascension of zero hours; the value zero represents an RA
; of 24 hours.
; DEC: The declanation of the star. A value of zero corresponds to zero
; declanation; +511 corresponds to +90 degrees; and -511 corresponds
; to -90 degrees.
; MAG: The magnitude of the star as a value from 0 to 7. Seven is the
; brightess.
DEFINE STAR #RA,DEC,MAG
%%DX==%%X-RA
%%X==RA
IFGE %%DX-200',{PRINTC "Offset in vector greeater than maximum (127.) for R.A. = "
PRTVAL RA ? PRINTC "
"}
VC%ESC\<%%DX&VC%XMM>
PM%ESC\<0_PM%SCS>\PM%EBR\<MAG&PM%BRM>\NC%PNT
PT%Y\PT%DSP\<<DEC+777'>&PT%MSK>\NC%VCT
TERMIN
%%X==8192. ;initialize X counter for following field
; This is the backround star field for Space-War. It was copied from the
;field defined in the PDP-1X space war. The field was generated from an
;actual star map. This field in all probability was copied for CIPG's
;PDP-9 space war.
;Note: The following description is only valid for the 340 version of Space-War.
; The actual format of the field after compilation by the macro is described
;below. Each star requires three display instructions (PDP-6 halfwords).
;
;1. The first half word:
; 400000 + <X - X'>
; X' is the previous X coordinate. This is a vector instruction to shift
; to the proper X position. The 400000 causes an escape to parameter mode.
;
;2. The second half word:
; 020110 + <B>
; The scale is set to zero and the brightness to the specified magnitude. The
; next instruction will be in point mode.
;
;3. The third half word:
; 302777 + <Y>
; The Y coordinate is set to the specified value plus 511 to account for the
; coordinate system used by the display. The point is displayed. The next
; instruction will be in vector mode.
; The 340 display must be in vector mode before starting to display the field. This
;restriction does not apply when the display is started at BKBEG0. To select a given
;part of the list for displaying, output a command to the 340 to enter vector mode and
;set the X coordinate properly. Then, do a BLKO (in interrupt vector) from the
;desired place in the list. The 340 will stop the display when it goes of the
;edge of the screen and will raise the EDGE FLAG causing a special interrrupt. If
;however, the BLKO counts out, wraparound of the field may be accomplished by
;continuing the display with a new BLKO pointer starting at BKBEG. Space-War chooses
;the X coordinates in an intelligent manner to cause the star field to shift at
;the specifed rate.
RADIX 10.
BKBEG0: PM%ESC\<0_PM%SCS>\NC%PNT,,PT%X\<0&PT%MSK>\NC%VCT
;[go to point mode with scale zero]
;[set X to zero, enter vector mode]
BKBEG:
.BYTE 18.
STAR 8188,-407,2 ; 2 CETI
STAR 8174,-149,2 ;30 PISC
STAR 8159,144,2 ;28 PISC
STAR 8064,-344,2 ;105 AQAR
STAR 8061,28,2 ;18 PISC
STAR 8059,-418,2 ;104 AQAR
STAR 8049,116,2 ;17 PISC
STAR 8010,-489,2 ;101 AQAR
STAR 7988,278,2 ;70 PEGS
STAR 7981,133,2 ;10 PISC
STAR 7975,16,2 ; 8 PISC
STAR 7969,-482,2 ;99 AQAR
STAR 7952,-470,2 ;98 AQAR
STAR 7923,-222,2 ;93 AQAR
STAR 7919,62,2 ; 6 PISC
STAR 7911,-219,2 ;91 AQAR
STAR 7903,-150,2 ;90 AQAR
STAR 7874,-494,2 ;88 AQAR
STAR 7862,202,2 ;55 PEGS
STAR 7849,334,3 ;54 PEGS,MARKAB
STAR 7844,75,2 ; 4 PISC
STAR 7795,189,2 ;50 PEGS
STAR 7790,-372,3 ;76 AQAR
STAR 7779,-185,2 ;73 AQAR
STAR 7761,-321,2 ;71 AQAR
STAR 7747,266,2 ;46 PEGS
STAR 7727,-440,2 ;66 AQAR
STAR 7717,235,3 ;42 PEGS
STAR 7681,-14,2 ;62 AQAR
STAR 7654,-255,2 ;57 AQAR
STAR 7644,-12,3 ;55 AQAR
STAR 7639,96,2 ;35 PEGS
STAR 7624,20,2 ;52 AQAR
STAR 7604,266,2 ;31 PEGS
STAR 7603,-43,2 ;48 AQAR
STAR 7575,-189,2 ;43 AQAR
STAR 7539,130,3 ;26 PEGS
STAR 7515,-327,2 ;33 AQAR
STAR 7513,104,2 ;22 PEGS
STAR 7513,-18,3 ;34 AQAR
STAR 7499,-60,2 ;31 AQAR
STAR 7404,-377,3 ;49 CAPR
STAR 7394,384,2 ; 9 PEGS
STAR 7391,214,3 ; 8 PEGS
STAR 7379,-440,2 ;43 CAPR
STAR 7365,-390,2 ;40 CAPR
STAR 7353,-189,2 ;23 AQAR
STAR 7347,-453,2 ;39 CAPR
STAR 7318,-137,3 ;22 AQAR
STAR 7299,-506,2 ;36 CAPR
STAR 7267,441,2 ; 1 PEGS
STAR 7263,-393,2 ;32 CAPR
STAR 7230,110,2 ; 8 EQUL
STAR 7223,219,2 ; 7 EQUL
STAR 7199,222,2 ; 5 EQUL
STAR 7192,-268,2 ;13 AQAR
STAR 7170,-401,2 ;23 CAPR
STAR 7161,-461,2 ;22 CAPR
STAR 7096,-213,2 ; 6 AQAR
STAR 7068,-123,2 ; 3 AQAR
STAR 7067,-225,2 ; 2 AQAR
STAR 7066,359,2 ;12 DLPH
STAR 7047,335,2 ;11 DLPH
STAR 7026,354,2 ; 9 DLPH
STAR 7020,475,2 ;29 VULP
STAR 7015,-33,2 ;71 AQIL
STAR 7014,324,3 ; 6 DLPH
STAR 7001,326,2 ; 4 DLPH
STAR 6988,250,2 ; 2 DLPH
STAR 6958,-413,2 ;11 CAPR
STAR 6914,-344,3 ; 9 CAPR
STAR 6913,-297,2 ; 8 CAPR
STAR 6898,-292,2 ; 6 CAPR
STAR 6896,-292,2 ; 5 CAPR
STAR 6882,339,2 ;67 AQIL
STAR 6862,-25,3 ;65 AQIL
STAR 6794,437,3 ;12 SGTE
STAR 6772,140,2 ;60 AQIL
STAR 6766,187,2 ;59 AQIL
STAR 6755,17,2 ;55 AQIL
STAR 6747,196,6 ;53 AQIL,ALTAIR
STAR 6739,430,2 ; 8 SGTE
STAR 6730,416,2 ; 7 SGTE
STAR 6721,236,3 ;50 AQIL
STAR 6693,393,2 ; 6 SGTE
STAR 6688,405,2 ; 5 SGTE
STAR 6665,-35,2 ;41 AQIL
STAR 6657,445,2 ; 9 VULP
STAR 6651,163,2 ;38 AQIL
STAR 6607,3,2 ;32 AQIL
STAR 6602,66,3 ;30 AQIL
STAR 6576,-368,2 ;46 SGTR
STAR 6576,-410,2 ;44 SGTR
STAR 6553,483,2 ; 1 VULP
STAR 6507,-482,3 ;41 SGTR
STAR 6491,-115,3 ;16 AQIL
STAR 6490,312,3 ;17 AQIL
STAR 6478,-498,2 ;39 SGTR
STAR 6465,-134,2 ;12 AQIL
STAR 6457,340,2 ;13 AQIL
STAR 6439,-483,3 ;37 SGTR
STAR 6436,93,2 ;63 SERP
STAR 6386,411,2 ;111 HERC
STAR 6382,-110,2 ;BE SCUT
STAR 6379,465,2 ;110 HERC
STAR 6313,-189,2 ;AL SCUT
STAR 6278,-333,2 ;GA SCUT
STAR 6255,494,2 ;109 HERC
STAR 6254,-469,2 ;21 SGTR
STAR 6247,-204,2 ;XI SCUT
STAR 6236,-66,3 ;58 SERP
STAR 6235,499,2 ;106 HERC
STAR 6234,76,2 ;74 OPHI
STAR 6188,-480,2 ;13 SGTR
STAR 6170,473,2 ;102 HERC
STAR 6159,217,3 ;72 OPHI
STAR 6158,198,2 ;71 OPHI
STAR 6146,57,2 ;70 OPHI
STAR 6125,30,2 ;68 OPHI
STAR 6119,67,2 ;67 OPHI
STAR 6119,381,2 ;93 HERC
STAR 6117,99,2 ;66 OPHI
STAR 6117,-84,2 ;57 SERP
STAR 6107,-222,3 ;64 OPHI
STAR 6047,63,3 ;62 OPHI
STAR 6016,-492,2 ;58 OPHI
STAR 6006,-292,2 ;56 SERP
STAR 5987,-183,2 ;57 OPHI
STAR 5984,-349,3 ;55 SERP
STAR 5975,288,5 ;55 OPHI
STAR 5925,96,2 ;49 OPHI
STAR 5924,-114,2 ;
STAR 5889,-290,2 ;53 SERP
STAR 5888,-478,2 ;40 OPHI
STAR 5868,-8,2 ;41 OPHI
STAR 5860,330,3 ;64 HERC
STAR 5828,-355,3 ;35 OPHI
STAR 5807,293,2 ;60 HERC
STAR 5763,217,2 ;27 OPHI
STAR 5742,235,2 ;25 OPHI
STAR 5713,-241,2 ;20 OPHI
STAR 5641,-236,3 ;13 OPHI
STAR 5620,266,2 ;29 HERC
STAR 5610,-484,2 ; 9 OPHI
STAR 5609,50,2 ;10 OPHI
STAR 5609,494,3 ;27 HERC
STAR 5606,-373,2 ; 8 OPHI
STAR 5589,-186,2 ; 3 OPHI
STAR 5582,-415,2 ; 7 OPHI
STAR 5580,325,2 ;24 HERC
STAR 5565,-451,2 ; 4 OPHI
STAR 5561,441,2 ;20 HERC
STAR 5558,29,2 ;50 SERP
STAR 5536,-101,3 ; 2 OPHI
STAR 5513,-78,3 ; 1 OPHI
STAR 5499,-223,2 ;15 SCOR
STAR 5497,-437,2 ;14 SCOR
STAR 5470,-469,2 ;10 SCOR
STAR 5467,-464,2 ; 9 SCOR
STAR 5459,-445,3 ; 8 SCOR
STAR 5455,-253,2 ;XI SCOR
STAR 5430,-508,3 ; 7 SCOR
STAR 5419,-318,2 ;48 LIBR
STAR 5415,364,2 ;41 SERP
STAR 5394,-374,2 ;46 LIBR
STAR 5387,484,2 ;38 SERP
STAR 5381,109,2 ;37 SERP
STAR 5373,-71,3 ;32 SERP
STAR 5372,420,2 ;35 SERP
STAR 5357,175,2 ;27 SERP
STAR 5357,358,3 ;28 SERP
STAR 5344,153,3 ;24 SERP
STAR 5331,455,2 ;21 SERP
STAR 5326,-440,2 ;43 LIBR
STAR 5291,247,2 ;13 SERP
STAR 5290,-329,2 ;38 LIBR
STAR 5283,-221,2 ;37 LIBR
STAR 5186,-205,3 ;27 LIBR
STAR 5157,-442,2 ;24 LIBR
STAR 5108,57,2 ;110 VIRG
STAR 5074,-90,2 ;16 LIBR
STAR 5045,444,2 ;37 BOOT
STAR 5037,-356,3 ; 9 LIBR
STAR 5013,53,2 ;109 VIRG
STAR 5009,396,2 ;35 BOOT
STAR 4994,-119,2 ;107 VIRG
STAR 4986,322,2 ;30 BOOT
STAR 4984,383,2 ;29 BOOT
STAR 4910,-41,2 ;105 VIRG
STAR 4864,382,2 ;20 BOOT
STAR 4857,-294,2 ;100 VIRG
STAR 4842,448,6 ;16 BOOT,ARCTURUS
STAR 4840,-126,2 ;99 VIRG
STAR 4822,-223,2 ;98 VIRG
STAR 4820,66,2 ;
STAR 4759,46,2 ;93 VIRG
STAR 4721,430,3 ; 8 BOOT
STAR 4691,371,2 ; 5 BOOT
STAR 4679,409,2 ; 4 BOOT
STAR 4606,-2,3 ;79 VIRG
STAR 4603,95,2 ;78 VIRG
STAR 4590,-131,2 ;74 VIRG
STAR 4563,-352,2 ;69 VIRG
STAR 4551,-242,6 ;67 VIRG,SPICA
STAR 4512,-404,2 ;61 VIRG
STAR 4466,411,2 ;42 COMA
STAR 4465,-114,2 ;51 VIRG
STAR 4421,262,3 ;47 VIRG
STAR 4403,409,2 ;36 COMA
STAR 4384,90,3 ;43 VIRG
STAR 4376,-205,2 ;40 VIRG
STAR 4305,245,2 ;30 VIRG
STAR 4304,-21,3 ;29 VIRG
STAR 4290,-170,2 ;26 VIRG
STAR 4249,-356,2 ; 8 CORV
STAR 4236,-363,3 ; 7 CORV
STAR 4185,418,2 ;11 COMA
STAR 4180,-3,2 ;15 VIRG
STAR 4157,-387,3 ; 4 CORV
STAR 4124,-502,3 ; 2 CORV
STAR 4097,211,2 ; 9 VIRG
STAR 4072,163,2 ; 8 VIRG
STAR 4013,53,2 ; 5 VIRG
STAR 4005,344,5 ;94 LEON,DENEBOLA
STAR 3998,473,2 ;93 LEON
STAR 3986,161,2 ; 3 VIRG
STAR 3981,-405,2 ;27 CRAT
STAR 3936,-6,2 ;91 LEON
STAR 3935,-211,2 ;21 CRAT
STAR 3868,-390,2 ;15 CRAT
STAR 3861,252,2 ;78 LEON
STAR 3846,150,2 ;77 LEON
STAR 3836,-324,2 ;12 CRAT
STAR 3821,-71,2 ;74 LEON
STAR 3806,364,3 ;10 LEON
STAR 3805,479,3 ;68 LEON
STAR 3793,-507,2 ;11 CRAT
STAR 3754,179,2 ;63 LEON
STAR 3738,471,2 ;60 LEON
STAR 3736,-44,2 ;61 LEON
STAR 3726,-404,2 ;AL CRAT
STAR 3668,-357,3 ;NU HYDA
STAR 3570,223,2 ;47 LEON
STAR 3557,-3,2 ;30 SEXT
STAR 3534,-372,2 ;42 HYDA
STAR 3496,463,3 ;41 LEON,ALGIEBA
STAR 3495,455,2 ;40 LEON
STAR 3446,-270,2 ;41 HYDA
STAR 3431,283,6 ;32 LEON,REGULUS
STAR 3429,3,2 ;15 SEXT
STAR 3428,239,2 ;31 LEON
STAR 3424,393,3 ;30 LEON
STAR 3415,-286,2 ;40 HYDA
STAR 3385,194,2 ;29 LEON
STAR 3338,-327,2 ;39 HYDA
STAR 3276,236,2 ;14 LEON
STAR 3274,-316,2 ;38 HYDA
STAR 3270,-16,2 ;35 HYDA
STAR 3261,116,2 ;
STAR 3225,-17,2 ;32 HYDA
STAR 3209,-53,2 ;31 HYDA
STAR 3201,-187,5 ;30 HYDA,ALPHARD
STAR 3161,-208,2 ;27 HYDA
STAR 3157,-263,2 ;26 HYDA
STAR 3124,62,2 ;22 HYDA
STAR 3032,279,2 ;65 CANC
STAR 3016,144,3 ;16 HYDA
STAR 2976,141,2 ;13 HYDA
STAR 2968,-300,2 ;12 HYDA
STAR 2967,154,3 ;11 HYDA
STAR 2953,421,2 ;47 CANC
STAR 2951,-156,2 ;
STAR 2947,85,2 ; 7 HYDA
STAR 2944,497,2 ;43 CANC
STAR 2942,-355,2 ; 9 HYDA
STAR 2921,84,2 ; 5 HYDA
STAR 2915,138,2 ; 4 HYDA
STAR 2848,-82,2 ;
STAR 2794,216,2 ;17 CANC
STAR 2768,-288,2 ;19 PUPP
STAR 2757,-431,2 ;16 PUPP
STAR 2751,-61,2 ;29 MONO
STAR 2714,60,2 ;
STAR 2709,-25,2 ;28 MONO
STAR 2704,-412,2 ;
STAR 2597,-212,2 ;26 MONO
STAR 2583,125,6 ;10 CMIN,PROCYON
STAR 2559,-503,2 ;
STAR 2527,278,2 ; 6 CMIN
STAR 2519,208,2 ; 4 CMIN
STAR 2513,193,3 ; 3 CMIN
STAR 2491,-429,2 ;
STAR 2470,504,3 ;55 GEMI
STAR 2460,380,3 ;54 GEMI
STAR 2428,-8,2 ;22 MONO
STAR 2385,-352,2 ;23 CMAJ
STAR 2379,471,2 ;43 GEMI
STAR 2378,-93,2 ;19 MONO
STAR 2342,-385,2 ;20 CMAJ
STAR 2340,-456,2 ;19 CMAJ
STAR 2330,-271,2 ;14 CMAJ
STAR 2328,-457,2 ;15 CMAJ
STAR 2327,303,2 ;38 GEMI
STAR 2291,57,2 ;18 MONO
STAR 2280,-377,7 ; 9 CMAJ,SIRIUS
STAR 2274,296,3 ;31 GEMI
STAR 2266,303,2 ;30 GEMI
STAR 2250,227,2 ;15 MONO
STAR 2245,-320,2 ;
STAR 2239,-413,2 ; 8 CMAJ
STAR 2232,-436,2 ; 7 CMAJ
STAR 2230,375,5 ;24 GEMI
STAR 2204,168,2 ;13 MONO
STAR 2184,-159,2 ;11 MONO
STAR 2179,-107,2 ;10 MONO
STAR 2179,462,2 ;18 GEMI
STAR 2153,106,2 ; 8 MONO
STAR 2152,-407,5 ; 2 CMAJ
STAR 2112,-311,2 ;
STAR 2105,-142,2 ; 5 MONO
STAR 2084,324,2 ;70 ORIO
STAR 2084,368,2 ;69 ORIO
STAR 2059,336,2 ;67 ORIO
STAR 2057,-340,2 ;18 LEPS
STAR 2037,458,2 ;62 ORIO
STAR 2032,-241,2 ; 3 MONO
STAR 2030,220,2 ;61 ORIO
STAR 2020,-70,2 ;
STAR 2002,-323,2 ;16 LEPS
STAR 1990,168,6 ;58 ORIO,BETELGEUZE
STAR 1982,461,2 ;54 ORIO
STAR 1974,-475,2 ;15 LEPS
STAR 1957,287,2 ;134 TAUR
STAR 1951,-221,5 ;53 ORIO
STAR 1948,-338,3 ;14 LEPS
STAR 1936,-511,2 ;13 LEPS
STAR 1910,-46,5 ;50 ORIO
STAR 1909,375,2 ;126 TAUR
STAR 1900,-165,2 ;49 ORIO
STAR 1900,93,2 ;47 ORIO
STAR 1899,-60,2 ;48 ORIO
STAR 1887,480,3 ;123 TAUR
STAR 1885,210,2 ;40 ORIO
STAR 1884,-29,5 ;46 ORIO
STAR 1880,-112,2 ;42 ORIO
STAR 1880,-136,3 ;44 ORIO
STAR 1878,-138,2 ;
STAR 1875,225,3 ;39 ORIO
STAR 1874,214,2 ;37 ORIO
STAR 1868,-407,3 ;11 LEPS
STAR 1861,-168,2 ;36 ORIO
STAR 1860,-8,3 ;34 ORIO
STAR 1857,421,2 ;119 TAUR
STAR 1851,134,2 ;32 ORIO
STAR 1843,-474,3 ; 9 LEPS
STAR 1830,69,2 ;30 ORIO
STAR 1830,497,2 ;114 TAUR
STAR 1819,143,5 ;24 ORIO,BELLATRIX
STAR 1818,40,2 ;25 ORIO
STAR 1817,-57,3 ;28 ORIO
STAR 1816,-180,2 ;29 ORIO
STAR 1807,79,2 ;23 ORIO
STAR 1801,-11,2 ;22 ORIO
STAR 1799,-486,2 ;
STAR 1792,-302,2 ; 6 LEPS
STAR 1779,-158,3 ;20 ORIO
STAR 1762,-189,6 ;19 ORIO,RIGEL
STAR 1756,-297,2 ; 4 LEPS
STAR 1755,-371,3 ; 5 LEPS
STAR 1753,63,2 ;17 ORIO
STAR 1750,-273,2 ; 3 LEPS
STAR 1732,-202,2 ;69 ERID
STAR 1729,352,2 ;15 ORIO
STAR 1723,-119,3 ;67 ERID
STAR 1700,347,2 ;11 ORIO
STAR 1690,488,2 ;102 TAUR
STAR 1690,-460,2 ;
STAR 1687,-167,2 ;65 ERID
STAR 1680,-289,2 ;64 ERID
STAR 1669,36,2 ;10 ORIO
STAR 1654,304,2 ; 9 ORIO
STAR 1646,228,2 ; 7 ORIO
STAR 1644,52,3 ; 8 ORIO
STAR 1638,-128,2 ;61 ERID
STAR 1626,124,2 ; 3 ORIO
STAR 1622,199,2 ; 2 ORIO
STAR 1618,154,3 ; 1 ORIO
STAR 1596,-78,2 ;57 ERID
STAR 1571,-452,2 ;54 ERID
STAR 1557,-330,2 ;53 ERID
STAR 1556,358,2 ;92 TAUR
STAR 1551,280,2 ;90 TAUR
STAR 1544,-81,2 ;48 ERID
STAR 1537,226,2 ;88 TAUR
STAR 1537,371,6 ;87 TAUR,ALDEBARAN
STAR 1526,333,2 ;86 TAUR
STAR 1518,-6,2 ;45 ERID
STAR 1507,364,2 ;
STAR 1496,356,3 ;78 TAUR
STAR 1495,358,2 ;77 TAUR
STAR 1495,432,3 ;74 TAUR
STAR 1485,330,2 ;73 TAUR
STAR 1483,350,2 ;71 TAUR
STAR 1477,403,2 ;68 TAUR
STAR 1476,502,2 ;65 TAUR
STAR 1470,392,2 ;64 TAUR
STAR 1463,394,2 ;61 TAUR
STAR 1446,350,2 ;54 TAUR
STAR 1430,463,2 ;50 TAUR
STAR 1426,-178,2 ;40 ERID
STAR 1423,197,2 ;49 TAUR
STAR 1414,205,2 ;47 TAUR
STAR 1405,-162,2 ;38 ERID
STAR 1358,497,2 ;37 TAUR
STAR 1353,130,2 ;38 TAUR
STAR 1338,278,2 ;35 TAUR
STAR 1328,-314,3 ;34 ERID
STAR 1304,-74,2 ;32 ERID
STAR 1260,-283,2 ;26 ERID
STAR 1243,-230,3 ;23 ERID
STAR 1205,2,2 ;10 TAUR
STAR 1191,-500,2 ;19 ERID
STAR 1185,-223,2 ;18 ERID
STAR 1170,-123,2 ;17 ERID
STAR 1168,287,2 ; 5 TAUR
STAR 1148,214,2 ; 2 TAUR
STAR 1135,198,2 ; 1 TAUR
STAR 1110,-503,2 ;16 ERID
STAR 1104,68,2 ;96 CETI
STAR 1087,-209,2 ;13 ERID
STAR 1076,470,2 ;58 ARIE
STAR 1058,440,2 ;57 ARIE
STAR 1007,84,3 ;92 CETI
STAR 992,194,2 ;91 CETI
STAR 976,-212,2 ; 3 ERID
STAR 947,-487,2 ; 2 ERID
STAR 913,-432,2 ; 1 ERID
STAR 908,221,2 ;87 CETI
STAR 907,-340,2 ;89 CETI
STAR 900,64,3 ;86 CETI
STAR 878,-2,2 ;82 CETI
STAR 838,-357,2 ;76 CETI
STAR 813,182,2 ;73 CETI
STAR 803,-290,2 ;72 CETI
STAR 764,-78,3 ;68 CETI,MIRA
STAR 727,191,2 ;65 CETI
STAR 665,52,2 ;113 PISC
STAR 656,-491,2 ;59 CETI
STAR 621,462,3 ; 6 ARIE
STAR 617,61,2 ;14 PISC
STAR 615,428,2 ; 5 ARIE
STAR 606,-247,2 ;55 CETI
STAR 595,-255,2 ;53 CETI
STAR 570,197,2 ;110 PISC
STAR 566,-375,3 ;52 CETI
STAR 548,113,2 ;106 PISC
STAR 490,338,3 ;99 PISC
STAR 450,-198,2 ;45 CETI
STAR 376,467,2 ;84 PISC
STAR 362,-244,3 ;31 CETI
STAR 329,167,2 ;71 PISC
STAR 273,-38,2 ;20 CETI
STAR 248,160,2 ;63 PISC
STAR 223,-254,2 ;17 CETI
STAR 150,0,0 ;
STAR 82,-214,2 ; 8 CETI
STAR 54,-443,2 ; 7 CETI
STAR 54,447,2 ;89 PEGS
STAR 46,333,3 ;88 PEGS,ALGENIB
STAR 1,-143,2 ;33 PISC
.WALGN ;force to a word boundary
.BYTE ;go back to assembling full-words
BKEND:
RADIX 8.
END GO