1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-15 14:37:16 +00:00
Files
PDP-10.its/src/mini/space.mac
2022-03-12 16:09:44 +01:00

1685 lines
24 KiB
Plaintext
Executable File
Raw Permalink 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 SPACE WAR BY RCW & MAB
.ENABL ABS
DL11IV=300
DL11OV=304
DL11IS=175610
DL11IB=175612
DL11OS=175614
DL11OB=175616
KBIV=60
KBIS=177560
KBIB=177562
STACK=37776
.MACRO FIX REG
ASR REG
ASR REG
ASR REG
ASR REG
ASR REG
ASR REG
BIC #176000,REG
.ENDM
.PAGE
;SYSTEM DESCRIPTION PARAMETERS
SUNX=1000 ;SUN X POSS
SUNY=1000 ;SUN Y POSS
LS=5 ;SCALE OF LARG EXPLOSION
SS=3 ;SCALE OF SMALL EXPLOSION
SHIPX=-500 ;SHIP POSS REL TO SUN (INITIAL)
SHIPY=0
SHPS=6 ;SCALE OF SHIP DRAWING
GX=40 ;POSSITION OF GRAPHS IN CORNERS
SUNR=36 ;RADIUS OF SUN
SHLDR=3*<SHPS+SS>;RADIUS OD SHEILD
DAMR=2*SHPS ;DAMAGE RADIUS
KILLR=SHPS ;DESTROY RADIUS
BRATE=^D9600 ;RATE OF INTERFACE USED BY TIMER
CRATE=^D20 ;NUMBER OF CALCULATIONS PER SECOND
FRATE=INT7/20 ;FADE RATE
INT7=1600 ;SHOWS LOCATION OF INTESITY BITS
INTMSK=174177 ;COMPLIMENT
LAC=10 ;BASIC LINEAR ACCELERATION
AAC=20 ;ANGULAR
MTIME=200 ;LIFETIME OF A MISSLE
MAXAV=4*100 ;MAX SHIP ANGULAR VELOCITY
MINAV=AAC*14 ;LOWER THRESHHOLD FOR ANGULAR VELOCITY
;THIS NEXT GROUP CONTROLS USE OF RECOURCES.
E.TRN=0
E.SHL=10
E.SHLH=1000
E.ACC=10
P.SHLU=77*400/2
P.TRN=77*400/<CRATE*30>
P.SHLH=77*400/3
PTSHL=77*400/4
M.MISF=77*400/30
.PAGE
;THIS REINITIALIZES THE SYSTEM.
.=760
BEGIN: MOV #17,MIN
CLR SEC
JMP START0
.=1000
JMP RESTRT
START0: TST 177570
BNE START
CLR CT1
MOV #SCOPE3,SCOPE2+2
START:
MOV #340,PSW
MOV #STACK,SP
CLR SECCTR
MOV #STARS1,STARPT
MOV #DIRTBL,DIRPTR
CLR DIWFLG
CLR ENTERD
CLR WINFLG
CLR CT2
CLR KLINGD
CLR WINCT
CLR DDD
;FIX SHIPS
MOV #SHIP1+SDRAW-2,SHIP1+SDEST-2
BIS #INT7,SHIP1+SHEXPL
MOV #SHIP1+XPOSS,R1
ADD #^D317,RANDOM
MOV RANDOM,R2
BIC #176001,R2
MOV (R2)+,(R1)+
SWAB -2(R1)
MOV (R2)+,(R1)+
SWAB -2(R1)
MOV (R2)+,(R1)+
SWAB -2(R1)
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
MOV #INT7,(R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
MOV #77*400,(R1)+
MOV #77*400,(R1)+
MOV #77*400,(R1)+
CLR (R1)+
;NOW SHIP2
MOV #SHIP2+SDRAW-2,SHIP2+SDEST-2
BIS #INT7,SHIP2+SHEXPL
MOV #SHIP2+XPOSS,R1
MOV (R2)+,(R1)+
SWAB -2(R1)
MOV (R2)+,(R1)+
SWAB -2(R1)
MOV (R2)+,(R1)+
SWAB -2(R1)
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
MOV #INT7,(R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
MOV #77*400,(R1)+
MOV #77*400,(R1)+
MOV #77*400,(R1)+
CLR (R1)+
;NOW THE MISSLES
MOV #M,R5
MOV #M+MEND,R4
LOOP
MOV R4,MEXIST-2(R5)
MOV R4,MEXPL-2(R5)
CLR MPOSS(R5)
CLR MPOSS+2(R5)
BIS #INT7,MEXPL(R5)
CLR MPX(R5)
CLR MPY(R5)
CLR MVX(R5)
CLR MVY(R5)
MOV #INT7,MFADE(R5)
MOV #MTIME,MTOUT(R5)
MOV R4,R5
ADD #MEND,R4
CMP R5,#MENDS
WHILE LO
;NOW THW IO
RESTRT:
MOV #340,KBIV+2
MOV #KBIN,KBIV
MOV #340,DL11IV+2
MOV #DL11IN,DL11IV
MOV #340,DL11OV+2
MOV #TIMER,DL11OV
MOV #101,KBIS
MOV #101,DL11IS
MOV #100,DL11OS
CLR DL11OB
SEXEC #SCOPEP
CLR PSW
BB2: TST TOCT
BEQ BB1
TST SIGNL
BNE .-4
DEC SIGNL
DEC TOCT
BNE BB2
JMP TO3
BB1: TST CT1
BLE DP
TST 177570
BNE BB1
CMP SCOPE2+2,#INITMS
BNE 1$
CLR CT1
MOV #SCOPE3,SCOPE2+2
JMP DP
1$: TST SIGNL
BNE .-4
DEC SIGNL
DEC CT1
BNE BB1
MOV #SCOPE3,SCOPE2+2
JMP DP
.PAGE
;THIS IS THE MAIN SCOPE PROGRAM
SCOPEP:
SCOPE2: SJMP INITMS
SCOPE3: SJSR SUN
SJSR STARS
SJSR S
SJSR M
SCOPE1: SJMP SCOPEP
.PAGE
;THIS IS THE MAIN CALCULATION LOOP
RANDOM: .WORD 0
SECCTR: 0
SEC: 0
MIN: 0
CT1:500
CT2: 0
DIGITS: CLR R0
DIG2: CMP R1,#12
BLO DIG1
SUB #12,R1
INC R0
BR DIG2
DIG1: ADD #60,R0
ADD #60,R1
RTS PC
DP:
LOOP
LOOP
TST SIGNL
WHILE NE
DEC SIGNL
INC RANDOM
BIC #40000,@STARPT
CMP STARPT,#STARS1
BNE .+12
BIS #40000,STARS2
BR STRS1
SUB #4,STARPT
BIS #40000,@STARPT
ADD #4,STARPT
STRS1: ADD #4,STARPT
CMP STARPT,#STARS2
BLE .+10
MOV #STARS1,STARPT
MOV R0,-(SP)
MOV R1,-(SP)
MOV R2,-(SP)
ADD #2,DIRPTR
CMP DIRPTR,#DIREND
BLE .+10
MOV #DIRTBL,DIRPTR
MOV @DIRPTR,R0
JSR PC,UVECT
ASR R0
ASR R0
ASR R0
ASR R1
ASR R1
ASR R1
TST R0
BPL .+10
NEG R0
BIS #20000,R0
TST R1
BPL .+10
NEG R1
BIS #20000,R1
BIC #116000,R0
BIC #116000,R1
BIS #40000,R0
BIS #40000,R1
MOV R0,RAY
MOV R1,RAY+2
MOV #20000,R2
BIT R2,R0
BEQ XOR1
BIC R2,R0
BR XOR2
XOR1: BIS R2,R0
XOR2: BIT R2,R1
BEQ XOR3
BIC R2,R1
BR XOR4
XOR3: BIS R2,R1
XOR4: MOV R0,RAY1
MOV R1,RAY1+2
MOV (SP)+,R2
MOV (SP)+,R1
MOV (SP)+,R0
INC SECCTR
CMP SECCTR,#24
BLO AA1
CLR SECCTR
TST SEC
BNE AA2
MOV #74,SEC
DEC MIN
BGE AA2
JMP TIMOUT
AA2: DEC SEC
MOV MIN,R1
JSR PC,DIGITS
MOVB R0,TIME1
MOVB R1,TIME1+1
MOV SEC,R1
JSR PC,DIGITS
MOVB R0,TIME2
MOVB R1,TIME2+1
AA1: TST DDD
BEQ DD1
INC WINCT
CMP WINCT,#<MTIME>
BLE DD1
TST ENTERD
BEQ KLINGW
TST KLINGD
BEQ ENTERW
JMP START
KLINGW: INC KLING
MOV #KLINGM,SCOPEA+2
BR ANYW
ENTERW: INC ENTER
MOV #ENTERM,SCOPEA+2
ANYW: MOV ENTER,R1
JSR PC,DIGITS
MOVB R0,E1
MOVB R1,E1+1
MOV KLING,R1
JSR PC,DIGITS
MOVB R0,K1
MOVB R1,K1+1
MOV #120,CT1
MOV #SCORMS,SCOPE2+2
JMP START
DIRTBL: 0
100*100
40*100
DIREND: 140*100
DIRPTR: 0
DD1: JSR PC,SUNP
JSR PC,SHIPP
JSR PC,MISSLP
ENDL J
.PAGE
;THIS CALCULATES WHAT IF ANYTHING IS HITTING THE SUN
;FIRST CHECK THE SHIPS
SUNP:
MOV #S,R5
LOOP
MOV #SUNX*100,R0
MOV #SUNY*100,R1
MOV XPOSS(R5),R2
MOV YPOSS(R5),R3
JSR PC,DIST
CMP R0,#SHLDR
IF LE
CLR SHLDUP(R5)
ENDF
CMP R0,#KILLR
IF LE
BIT #7,RANDOM
AND EQ
MOV #1,DAMG(R5)
ENDF
CMP R0,#2
IF LE
MOV #1,DESTY(R5)
ENDF
CMP R0,#2
IF LE
CLR XVEL(R5)
CLR YVEL(R5)
CLR AVEL(R5)
ENDF
ADD #SEND,R5
CMP R5,#SHIP2+SEND
WHILE LT
;NOW CHECK MISSLES
MOV #M,R5
MOV #M+MEND,R4
LOOP
CMP R4,MEXIST-2(R5)
IF NE
MOV #SUNX*100,R0
MOV #SUNY*100,R1
MOV MPX(R5),R2
MOV MPY(R5),R3
JSR PC,DIST
CMP R0,#2
IF LE
CLR MVX(R5)
CLR MVY(R5)
MOV R5,R3
ADD #MEXPL,R3
MOV R3,MEXPL-2(R5)
ENDF
ENDF
MOV R4,R5
ADD #MEND,R4
CMP R5,#MENDS
WHILE LT
RTS PC
.PAGE
;THIS UPDATES INFORMATION ON THE SHIPS
SHIPP:
;FIRST WE SEE IF THE SHIPS ARE COLLIDING
TST SHIP1+DESTY
IF EQ
TST SHIP2+DESTY
AND EQ
MOV SHIP1+XPOSS,R0
MOV SHIP1+YPOSS,R1
MOV SHIP2+XPOSS,R2
MOV SHIP2+YPOSS,R3
JSR PC,DIST
CMP R0,#2*DAMR
IF LT
MOV #1,SHIP1+DESTY
MOV #1,SHIP2+DESTY
ENDF
TST SHIP1+SHLDUP
IF NE
TST SHIP2+SHLDUP
AND NE
CMP R0,#2*SHLDR
IF LE
CLR SHIP1+SHLDUP
CLR SHIP2+SHLDUP
ENDF
ELSE
CMP R0,#SHLDR+DAMR
IF LE
CLR SHIP1+SHLDUP
CLR SHIP2+SHLDUP
ENDF
ENDF
ENDF
;NOW LOOK AT EACHSHIP
MOV #S,R5
LPS:
;UPDATE SOME RESOURCE VALUES
TST PV(R5)
IF LT
CLR PV(R5)
ENDF
SUB #E.TRN,EV(R5)
TST EV(R5)
IF GT
ADD #P.TRN,PV(R5)
CMP PV(R5),#77*400
IF GT
MOV #77*400,PV(R5)
ENDF
ENDF
;NOW COMPUTE NEW POSSITION
CLR XACC(R5)
CLR YACC(R5)
CLR AACC(R5)
;ANGULAR THRUST
TST ANACC(R5)
IF NE
IF GT
MOV #AAC*4,R0
ELSE
MOV #-AAC*4,R0
ENDF
SUB #E.ACC,EV(R5)
MOVB PV+1(R5),R1
JSR PC,MULB
SWAB R0
MOVB R0,R1
MOV R1,AACC(R5)
ENDF
;LINEAR THRUST
MOV APOSS(R5),R0
JSR PC,UVECT ;WE NEED THESE LATER TOO
MOV R0,XUV(R5)
MOV R1,YUV(R5)
TST LACC(R5)
IF NE
IF GT
MOV #LAC*4,R0
ELSE
MOV #-LAC*4,R0
ENDF
SUB #E.ACC,EV(R5)
MOVB PV+1(R5),R1
JSR PC,MULB
SWAB R0
MOVB R0,R2
ASL R2
ASL R2
MOV XUV(R5),R0
MOV R2,R1
JSR PC,MULB
SWAB R0
MOVB R0,R1
MOV R1,XACC(R5)
MOV YUV(R5),R0
MOV R2,R1
JSR PC,MULB
SWAB R0
MOVB R0,R1
MOV R1,YACC(R5)
ENDF
;GRAV THRUST
MOV XPOSS(R5),R0
MOV YPOSS(R5),R1
JSR PC,GRAV
ADD R0,XACC(R5)
ADD R1,YACC(R5)
;UPDATE POSSITION
ADD XACC(R5),XVEL(R5)
ADD #100000,XPOSS(R5)
ADD XVEL(R5),XPOSS(R5)
IF VS
ASR XVEL(R5)
ASR XVEL(R5)
ASR YVEL(R5)
ASR YVEL(R5)
ASR XVEL(R5)
ASR YVEL(R5)
ENDF
ADD #100000,XPOSS(R5)
ADD YACC(R5),YVEL(R5)
ADD #100000,YPOSS(R5)
ADD YVEL(R5),YPOSS(R5)
IF VS
ASR XVEL(R5)
ASR XVEL(R5)
ASR YVEL(R5)
ASR YVEL(R5)
ASR XVEL(R5)
ASR YVEL(R5)
ENDF
ADD #100000,YPOSS(R5)
ADD AACC(R5),AVEL(R5)
MOV AVEL(R5),R0
IF LT
NEG R0
ENDF
CMP R0,#MAXAV
IF GT
MOV #MAXAV,R0
TST AVEL(R5)
IF LT
NEG R0
ENDF
MOV R0,AVEL(R5)
ELSE
CMP R0,#MINAV
IF LT
TST ANACC(R5)
AND EQ
CLR AVEL(R5)
ENDF
ENDF
ADD AVEL(R5),APOSS(R5)
BIC #140000,APOSS(R5)
;CHECK SHEILD STATUS
MOV SHLDUP(R5),TEMP1
ADD VANISH(R5),TEMP1
TST TEMP1
IF NE
SUB #E.SHL,EV(R5)
CMP #PTSHL,PV(R5)
IF GT
CLR VANISH(R5)
CLR SHLDUP(R5)
ELSE
TST SHLDUP(R5)
BEQ VA1
MOV R5,R4
ADD #SDEST,R4
CMP R4,SDEST-2(R5)
IF NE
MOV R4,SDEST-2(R5)
SUB #P.SHLU,PV(R5)
ENDF
ENDF
ELSE
TST DESTY(R5)
IF EQ
MOV R5,R4
ADD #SDRAW-2,R4
MOV R4,SDEST-2(R5)
ENDF
ENDF
BR VA2
VA1: MOV R5,R4
ADD #SGRAPH,R4
CMP R4,SDEST-2(R5)
BEQ VA2
MOV R4,SDEST-2(R5)
SUB #P.SHLU,PV(R5)
;CHECK FOR MISSLE FIREING
VA2: TST MISSL(R5)
IF NE
TST MV(R5)
AND GT
CLR MISSL(R5)
TST SHLDUP(R5)
AND EQ
SUB #M.MISF,MV(R5)
;FIND MISSLE SPOT
MOV #M,R4
MOV #M+MEND,R3
LOOP
CMP R3,MEXIST-2(R4)
UNTIL EQ
MOV R3,R4
ADD #MEND,R3
CMP R4,#MENDS
WHILE NE
CMP R4,#MENDS
IF NE
;CREATE NEW MISSLE
MOV R4,R3
ADD #MEXIST,R3
MOV R3,MEXIST-2(R4)
MOV XVEL(R5),MVX(R4)
MOV YVEL(R5),MVY(R4)
MOV XPOSS(R5),MPX(R4)
MOV YPOSS(R5),MPY(R4)
MOV XUV(R5),R1
MOV #SHPS,R0
JSR PC,MULB
ADD R0,MPX(R4)
ASL R0
ADD R0,MPX(R4)
MOV YUV(R5),R1
MOV #SHPS,R0
JSR PC,MULB
ADD R0,MPY(R4)
ASL R0
ADD R0,MPY(R4)
MOV XUV(R5),R0
ASL R0
ASL R0
ASL R0
ADD R0,MVX(R4)
MOV YUV(R5),R0
ASL R0
ASL R0
ASL R0
ADD R0,MVY(R4)
ENDF
ENDF
;SEE IF SHIP IS DESTOYED
TST DESTY(R5)
IF NE
CLR EV(R5)
CLR PV(R5)
CLR MV(R5)
CMP R5,#S
BNE KK1
MOV #1,ENTERD
BR KK2
KK1: MOV #1,KLINGD
KK2: TST WINFLG
BNE KK4
MOV ENTERD,CT2
ADD KLINGD,CT2
CMP CT2,#2 ; BOTH DESTROYED?
BNE KK3
MOV #<MTIME>-74,WINCT
INC WINFLG
KK4:
KK3: MOV #1,DDD
MOV R5,R4
ADD #SHEXPL,R4
CMP R4,SDEST-2(R5)
IF NE
CLR SSR
MOV R4,SDEST-2(R5)
ELSE
SUB #FRATE/2,SFADE(R5)
TST SFADE(R5)
IF LE
CLR SFADE(R5)
ENDF
MOV SFADE(R5),R0
BIC #INTMSK,R0
BIC #INT7,SHEXPL(R5)
BIS R0,SHEXPL(R5)
ENDF
ELSE
;CHECK FOR DAMAGE IF SO PICK A PROBLEM TO MAKE
TST DAMG(R5)
IF NE
CLR SSR
CLR DAMG(R5)
MOV RANDOM,R0
BIC #177761,R0
CASET R0,10
CASE 1
CASE 2
SUB #10*M.MISF,MV(R5)
CASE 3
SUB #20*M.MISF,MV(R5)
CASE 4
ASR PV(R5)
CASE 5
ASR EV(R5)
CASE 6
SUB #30*E.ACC,EV(R5)
CASE 7
MOV #1,ANACC(R5)
CASE 10
MOV #1,DESTY(R5)
ENDC
ENDF
ENDF
;NOW WE PREPARE A NEW DISPLAY, FIRST THE GRAPHS
TST EV(R5)
IF LE
CLR PV(R5)
CLR EV(R5)
ENDF
MOVB EV+1(R5),EG+2(R5)
MOVB EV+1(R5),EG+6(R5)
TST PV(R5)
IF LT
CLR PV(R5)
ENDF
MOVB PV+1(R5),PG+2(R5)
MOVB PV+1(R5),PG+6(R5)
TST MV(R5)
IF LT
CLR MV(R5)
ENDF
MOVB MV+1(R5),MG+2(R5)
MOVB MV+1(R5),MG+6(R5)
CMP R5,#S
BNE NOTDIW
TST DIWFLG
BNE NOTDIW
TST EV(R5)
BNE NOTDIW
TST MV(R5)
BNE NOTDIW
MOV R5,-(SP)
ADD #SEND,R5
TST EV(R5)
BNE NDIW1
TST MV(R5)
BNE NDIW1
INC DIWFLG
MOV #<MTIME>-74,WINCT
INC ENTERD
INC KLINGD
MOV #1,DDD
NDIW1: MOV (SP)+,R5
NOTDIW:
;NOW DRAW THE NEW SHIP,GET NEW POSSITON
MOV XPOSS(R5),R0
FIX R0
MOV R0,SPOSS(R5)
MOV YPOSS(R5),R0
FIX R0
MOV R0,SPOSS+2(R5)
;NOW GET OVX AND OVY
MOV XUV(R5),R1
MOV #SHPS*4,R0
JSR PC,MULB
SWAB R0
MOVB R0,R3
MOV YUV(R5),R1
MOV #SHPS*4,R0
JSR PC,MULB
SWAB R0
MOVB R0,R4
;NOW COMPUTE ALL OFF THE VECTORS IN TEMP
MOV R3,R0
ADD R3,R0
ADD R3,R0
MOV R0,TEMP
MOV R4,R1
ADD R4,R1
ADD R4,R1
MOV R1,TEMP+2
MOV R4,R2
ADD R0,R2
NEG R2
MOV R2,TEMP+4
MOV R3,R2
SUB R1,R2
MOV R2,TEMP+6
MOV R4,R2
SUB R3,R2
MOV R2,TEMP+10
MOV R2,TEMP+16
MOV R4,R2
ADD R3,R2
MOV R2,TEMP+14
NEG R2
MOV R2,TEMP+12
MOV R0,R2
SUB R4,R2
MOV R2,TEMP+20
MOV R3,R2
ADD R1,R2
MOV R2,TEMP+22
NEG R0
MOV R0,TEMP+24
NEG R1
MOV R1,TEMP+26
;NOW MOV THESE INTO THE SCOPE CODE
CLR R3
MOV R5,R4
ADD #SDRAW,R4
LOOP
TST TEMP(R3)
IF LT
NEG TEMP(R3)
BIS #020000,TEMP(R3)
ENDF
BIS #40000,TEMP(R3)
MOV TEMP(R3),(R4)+
TST (R3)+
CMP R3,#30
WHILE LT
CMP R5,#SHIP1
IF EQ
BIC #40000,-4(R4)
BIC #40000,-30(R4)
ENDF
;NOW GO TO NEXT SHIP
ADD #SEND,R5
CMP R5,#SHIP2+SEND
IF LT
JMP LPS
ENDF
RTS PC
.PAGE
TEMP: .BLKW 14
;FINALLY WE UPDATE INFORMATION ON THE MISSLES.
ENTERD: 0
KLINGD: 0
ENTER: 0
KLING: 0
WINCT: 0
WINFLG: 0
DIWFLG: 0
TEMP1: 0
DDD: 0
MISSLP:
MOV #M,R5
MOV #M+MEND,R4
LOOP
CMP R4,MEXIST-2(R5)
IF EQ
JMP SKIP1 ;TOO BIG FOR IF
ENDF
MOV MPX(R5),R0
MOV MPY(R5),R1
JSR PC,GRAV
ADD R0,MVX(R5)
ADD R1,MVY(R5)
MOV MPX(R5),R0
FIX R0
MOV R0,MPOSS(R5)
MOV MPY(R5),R0
FIX R0
MOV R0,MPOSS+2(R5)
ADD MVX(R5),MPX(R5)
ADD MVY(R5),MPY(R5)
MOV MVX(R5),R0
IF LT
NEG R0
FIX R0
BIS #20000,R0
ELSE
FIX R0
ENDF
BIS #40000,R0
MOV R0,MVEL(R5)
MOV MVY(R5),R0
IF LT
NEG R0
FIX R0
BIS #20000,R0
ELSE
FIX R0
ENDF
MOV R0,MVEL+2(R5)
BIT #1777,MVEL(R5)
IF EQ
BIT #1777,MVEL+2(R5)
AND EQ
BIS #40000,MPOSS(R5)
ENDF
;CHECK IF EXPLODED
CMP R4,MEXPL-2(R5)
IF NE ;IE EXPLODED
SUB #FRATE,MFADE(R5)
TST MFADE(R5)
IF LE
MOV R4,MEXIST-2(R5)
MOV R4,MEXPL-2(R5)
BIS #INT7,MEXPL(R5)
CLR MPX(R5)
CLR MPY(R5)
CLR MVX(R5)
CLR MVY(R5)
MOV #INT7,MFADE(R5)
MOV #MTIME,MTOUT(R5)
ENDF
BIC #40000,MVEL(R5)
BIC #40000,MPOSS(R5)
MOV MFADE(R5),R0
BIC #INTMSK,R0
BIC #INT7,MEXPL(R5)
BIS R0,MEXPL(R5)
ELSE ;NOT EXPLODED
DEC MTOUT(R5)
IF LE
MOV R5,R3
ADD #MEXPL,R3
MOV R3,MEXPL-2(R5)
ENDF
MOV #S,R3
LOOP
MOV R3,-(SP)
MOV MPX(R5),R0
MOV MPY(R5),R1
MOV XPOSS(R3),R2
MOV YPOSS(R3),R3
JSR PC,DIST
MOV (SP)+,R3
CMP R0,#SHLDR
IF LE
TST SHLDUP(R3)
AND NE ;HIT ON SHEILD
ASR MVX(R5)
ASR MVY(R5)
MOV R5,R2
ADD #MEXPL,R2
MOV R2,MEXPL-2(R5)
SUB #E.SHLH,EV(R3)
SUB #P.SHLH,PV(R3)
ENDF
CMP R0,#DAMR
IF LE ;POSSIBLE DAMAGE
BIT #7,RANDOM
AND EQ
MOV #1,DAMG(R3)
ASR MVX(R5)
ASR MVX(R5)
ASR MVY(R5)
ASR MVY(R5)
MOV R5,R2
ADD #MEXPL,R2
MOV R2,MEXPL-2(R5)
ENDF
CMP R0,#KILLR
IF LE
MOV #1,DESTY(R3)
MOV XVEL(R3),MVX(R5)
MOV YVEL(R3),MVY(R5)
MOV R5,R2
ADD #MEXPL,R2
MOV R2,MEXPL-2(R5)
ENDF
ADD #SEND,R3
CMP R3,#SHIP2+SEND
IF GE
OUTOF
ENDF
ENDL J
ENDF
SKIP1:
MOV R4,R5
ADD #MEND,R4
CMP R5,#MENDS
IF GE
OUTOF
ENDF
ENDL J
RTS PC
.=22000
;THIS IS THE TABLE OF DATA FOR THE TW0 SHIPS
;AND THEIR DISPLAYS.
INITMS: SGM PNT
PNT 10,650,HIDE
SGM CHAR,4
.ASCII/ WELCOME TO SPACE WAR. YOU ARE INVOLVED IN A SERIES/<15><12>
.ASCII/ OF BATTLES TO DETERMINE THE NEXT RULER OF THE GALAXY./<15><12>
.ASCII/ THE GOOD GUYS (U.S.S. ENTERPRISE, THE SHIP WITH THE LINE/<15><12>
.ASCII/ DOWN THE CENTER, CONTROLLED FROM THE TERMINET) ARE/<15><12>
.ASCII/ ENGAGED IN HOSITILITIES WITH THE KLINGONS/<15><12>
.ASCII/ (THE SHIP WITH NO LINE, CONTROLLED FROM THE GT40 KEYBOARD)./<15><12>
.ASCII/ THIS WAR WILL LAST FOR 15 MINUTES; AT THAT TIME, AN/<15><12>
.ASCII/ INTERGALACTIC COUNCIL WILL DECLARE A WINNER. GOOD LUCK./<15><12>
.EVEN
SJMP SCOPE2
STARS: SGM PNT,3
STARS1: PNT 150,1400
PNT 1350,320
PNT 1200,1200
PNT 1400,170
PNT 400,700
PNT 200,300
PNT 1030,1600
PNT 1450,1620
PNT 730,110
PNT 1605,1550
PNT 100,1000
PNT 1750,1050
PNT 250,776
PNT 1600,450
PNT 234,1245
PNT 775,330
PNT 220,1750
PNT 240,1000
PNT 630,1150
PNT 440,300
PNT 1400,740
PNT 1005,130
PNT 40,650
PNT 550,110
PNT 1150,1430
PNT 620,1330
PNT 1250,207
PNT 530,370
STARS2: PNT 430,1360
SRTS
S:
SHIP1:
SGM PNT
SPOSS=.-S
PNT SUNX+SHIPX,SUNY+SHIPY,HIDE
SJMP S+SDRAW-2
SDEST=.-S
SJSR SHLD
SGM LVEC,4,SOLID
SDRAW=.-S
OVX=0
OVY=SHPS
LVEC 3*OVX,3*OVY,HIDE
LVEC -3*OVX-OVY,-3*OVY+OVX
LVEC OVY-OVX,-OVX-OVY
LVEC OVX+OVY,OVY-OVX
LVEC 3*OVX-OVY,3*OVY+OVX
LVEC -3*OVX,-3*OVY,HIDE
SJMP S+SGRAPH
SHEXPL=.-S
SGM RPNT,7,SDASH
RPNT -LS,-LS
SINTH JIGGLE
SJSR LEXPL
SGRAPH=.-S
SGM PNT
PNT 1700-GX,GX,HIDE
SGM CHAR,4
.BYTE 'E,40,'P,40,'M,0
SGM LVEC,4,SOLID
LVEC -100,30,HIDE
EG=.-S
LVEC 0,77
LVEC 34,-77,HIDE
PG=.-S
LVEC 0,77
LVEC 34,-77,HIDE
MG=.-S
LVEC 0,77
LVEC 34,-77,HIDE
SJMP S+SEND
XPOSS=.-S
<SUNX+SHIPX>*100
YPOSS=.-S
<SUNY+SHIPY>*100
APOSS=.-S
0
XVEL=.-S
0
YVEL=.-S
0
AVEL=.-S
0
XACC=.-S
0
YACC=.-S
0
AACC=.-S
0
XUV=.-S
0
YUV=.-S
0
SFADE=.-S
INT7
SHLDUP=.-S
0
LACC=.-S
0
ANACC=.-S
0
MISSL=.-S
0
DESTY=.-S
0
DAMG=.-S
0
EV=.-S
77*400
PV=.-S
77*400
MV=.-S
77*400
VANISH=.-S
0
SEND=.-S
SHIP2:
SGM PNT
PNT SUNX-SHIPX,SUNY-SHIPY,HIDE
SJMP SHIP2+SDRAW-2
SJSR SHLD
SGM LVEC,4,SOLID
OVX=0
OVY=-SHPS
LVEC 3*OVX,3*OVY
LVEC -3*OVX-OVY,-3*OVY+OVX
LVEC OVY-OVX,-OVX-OVY
LVEC OVX+OVY,OVY-OVX
LVEC 3*OVX-OVY,3*OVY+OVX
LVEC -3*OVX,-3*OVY
SJMP SHIP2+SGRAPH
SGM RPNT,4,SDASH
RPNT -LS,-LS
SINTH JIGGLE
SJSR LEXPL
SGM PNT
PNT GX,GX,HIDE
SGM CHAR,4
.BYTE 'E,40,'P,40,'M,0
SGM LVEC,4,SOLID
LVEC -100,30,HIDE
LVEC 0,77
LVEC 34,-77,HIDE
LVEC 0,77
LVEC 34,-77,HIDE
LVEC 0,77
LVEC 34,-77,HIDE
SJMP SHIP2+SEND
<SUNX-SHIPX>*100
<SUNY-SHIPY>*100
.WORD 200*100,0,0,0,0,0,0,0,0,INT7,0,0,0,0,0,0,77*400,77*400,77*400
.WORD 0
SRTS
.PAGE
;THIS IS THE TABLE OF MISSLES AND EXPLOSIONS
SCORMS: SGM PNT,4
PNT 200,750,HIDE
SGM CHAR
.ASCII/VICTORY GOES TO THE /
SCOPEA: SJMP ENTERM
SCOPEB: SGM PNT
PNT 20,500,HIDE
SGM CHAR,4
.ASCII/U.S.S. ENTERPRISE -- /
E1: .BYTE 0,0
SGM PNT
PNT 20,400,HIDE
SGM CHAR,4
.ASCII/B.K.E. MORONI-CAMORAH -- /
K1: .BYTE 0,0
SJMP SCOPEP
ENTERM: SGM CHAR,4,BLK
.ASCII/ENTERPRISE/
SGM CHAR,4,NOBLK
SJMP SCOPEB
KLINGM: SGM CHAR,4,BLK
.ASCII/MORONI-CAMORAH/
SGM CHAR,4,NOBLK
SJMP SCOPEB
TMS: SGM CHAR,4,BLK
.ASCII/A TIE /
SGM CHAR,,NOBLK
SJMP DMS
M:
SJMP M+MEND
MEXIST=.-M
SGM PNT,3
MPOSS=.-M
PNT SUNX,SUNY,HIDE
SGM LVEC,3,SOLID
MVEL=.-M
LVEC 0,0
SJMP M+MEND
MEXPL=.-M
SGM RPNT,7
RPNT -SS,-SS
SINTH JIGGLE
SJSR SEXPL
SJMP M+MEND
MPX=.-M
0
MPY=.-M
0
MVX=.-M
0
MVY=.-M
0
MFADE=.-M
INT7
MTOUT=.-M
MTIME
MEND=.-M
;NOW WE HAVE A WHOLE BUNCH OF SIMMILAR DATA-
;DISPLAY BLOCKS
.REPT 37
MZ=.
SJMP MZ+MEND
SGM PNT,4
PNT SUNX,SUNY
SGM LVEC,3,SOLID
LVEC 0,0
SJMP MZ+MEND
SGM RPNT,7
RPNT -SS,-SS
SINTH JIGGLE
SJSR SEXPL
SJMP MZ+MEND
.WORD 0,0,0,0,INT7,MTIME
.ENDM
MENDS:
SRTS
.PAGE
;HERE ARE SOME SIMPLE SCOPE SUBROUTINES.
LEXPL: ;LARGE EXPLOSION (SHIPS SUN)
SGM LVEC,,SDASH
LVEC 3*LS,0,HIDE
LVEC -5*LS,-2*LS
LVEC 2*LS,5*LS
LVEC 2*LS,-5*LS
LVEC -5*LS,2*LS
LVEC 5*LS,2*LS
LVEC -2*LS,-5*LS
LVEC -2*LS,5*LS
LVEC 5*LS,-2*LS
SRTS
SEXPL: ;SMALL EXPLOSION SAME AS LARGE SS FOR LS
SGM SVEC,,SDASH
SVEC 3*SS,0,HIDE
SVEC -5*SS,-2*SS
SVEC 2*SS,5*SS
SVEC 2*SS,-5*SS
SVEC -5*SS,2*SS
SVEC 5*SS,2*SS
SVEC -2*SS,-5*SS
SVEC -2*SS,5*SS
SVEC 5*SS,-2*SS
SRTS
SHLD: ;SHEILD FOR A SHIP
T=SHLDR/3
SGM SVEC,2,SOLID
SVEC 2*T,2*T,HIDE
SVEC T,-2*T
SVEC -T,-2*T
SVEC -2*T,-T
SVEC -2*T,T
SVEC -T,2*T
SVEC T,2*T
SVEC 2*T,T
SVEC 2*T,-T
SVEC -2*T,-2*T,HIDE
SRTS
SUN: ;THE SUN DISPLAY
SGM PNT
PNT SUNX,SUNY,HIDE
SGM LVEC,4,SOLID
RAY: LVEC 0,0
SGM PNT
PNT SUNX,SUNY,HIDE
SGM LVEC,4,SOLID
RAY1: LVEC 0,0
SGM PNT
RAYEND: PNT SUNX,SUNY,HIDE
SGM PNT
PNT 740,GX,HIDE
SGM CHAR,4
TIME1: .BYTE 61,65,40,':
TIME2: .BYTE 60,60,40,40
SRTS
ENDMS: SGM PNT,5
PNT 100,600,HIDE
SGM CHAR,4
.ASCII/THE NEW RULER OF THE UNIVERSE IS/
SGM PNT
PNT 200,400,HIDE
ENDA: SJMP EMS
EMS: SGM CHAR,4,BLK
.ASCII/THE U.S.S. ENTERPRISE /
SGM CHAR,4,NOBLK
SJMP DMS
KMS: SGM CHAR,4,BLK
.ASCII/THE B.K.E. MORONI-CAMORAH /
SGM CHAR,4,NOBLK
SJMP DMS
DMS: SGM PNT
PNT 100,50,HIDE
SGM CHAR,3
.ASCII/(DISP WILL BE AUTOMATICALLY RELOADED/<15><12>
.ASCII/ IN A FEW SECONDS)/
SJMP ENDMS
.PAGE
;THIS CUTE LITLE PROGRAM MAKES EXLOPSIONS
;LOOK BETTER BY CUASEING THEM TO FUZZ BY JIGGLING
;IT JUST BINARY COUNTS ON THE SIGN BITS
;OF THE PRECEDING RPNT OR SVEC.
JIGGLE:
MOV R5,-(SP)
MOV SPC,R5
SREXEC ;START UP SCOPE AGAIN
CLR PSW
SUB #4,R5
BIT #100,(R5)
IF EQ
BIS #100,(R5)
ELSE
BIC #100,(R5)
BIT #20000,(R5)
IF EQ
BIS #20000,(R5)
ELSE
BIC #20000,(R5)
ENDF
ENDF
MOV (SP)+,R5
RTI
.PAGE
;HERE ARE SOME UTILLITY ROUTINES
;THEY SIMULATE MULTIPLICATION AND DIVISION
;MULB: R0=R0*R1
MULB:
MOV R2,-(SP)
MOV R0,R2
CLR R0
TST R1
IF LT
NEG R2 ;WANT POSSITIVE MULTIPLIER
NEG R1
ENDF
;NOW WE ARE SET UP DO A SET OF SHIFTS AND ADDS
BR LPST2
LOOP
ASL R2
LPST2:
ASR R1
IF CS
ADD R2,R0
ENDF
WHILE NE
;NOW WE ARE DONE
MOV (SP)+,R2
RTS PC
.PAGE
;DIV: R0=R1/R0 REMAINDER IN R1
DIV:
MOV R0,-(SP)
MOV R1,-(SP)
MOV R2,-(SP)
MOV R3,-(SP)
MOV R0,R2
MOV #1,R3 ;THIS KEEPS TRACK OF SHIFTING
CLR R0
TST R2
IF NE ;NOOP ZERODIVIDE
IF LT ;WANT POSITIVE NUMBERS
NEG R2
ENDF
TST R1
IF LT
NEG R1
ENDF
;NOW WE ARE READY TO SHIFT AND SUBTRACT.
;FIND NUMBER OF BITS IN QUOTIENT
LOOP
CMP R2,R1
UNTIL GT
ASL R3
ASL R2
WHILE PL
ASR R2
ASR R3
BIC #100000,R3
;NOW SHIFT AND SUBTRACT
LOOP
CMP R2,R1
IF LE
BIS R3,R0
SUB R2,R1
ENDF
ASR R2
ASR R3
WHILE NE
ENDF
;NOW WE ARE DONE
MOV (SP)+,R3
MOV (SP)+,R2
TST (SP)+
IF LT
NEG R1
NEG R0
ENDF
TST (SP)+
IF LT
NEG R0
ENDF
RTS PC
.PAGE
;GRAV: THIS ROUTINE TAKES A (16,6) POSSITION VECTOR
;IN (R0,R1) AND RETURNS THE ACCELERATION DUE TO
;GRAVITATIONAL ATTRACTION OF THE SUN IN (R0,R1)
GRAV:
MOV R2,-(SP)
MOV R3,-(SP)
MOV R4,-(SP)
;GET HIGH ORDER 8 BITS OF POSSITON
SWAB R0
BIC #177400,R0
SWAB R1
BIC #177400,R1
;GET 7 BIT DISTANCE FROM SUN
SUB #SUNX/4,R0
SUB #SUNY/4,R1
;NEGATE VECTO AND SAVE IN (R3,R4)
NEG R0
NEG R1
MOV R1,R4
MOV R0,R3
;FIND LENGTH OF VECTOR SQUARED AND PUT IN R2
MOV R0,R1
JSR PC,MULB
MOV R0,R2
MOV R4,R0
MOV R4,R1
JSR PC,MULB
ADD R0,R2
;NOW MULTIPLY (R3,R4) BY G G=400 IS ONLY REASONABLE CHOICE
SWAB R3
SWAB R4
BIC #377,R3
BIC #377,R4
;NOW DEVIDE VECTOR BY LENGTH SQUARED TO GET RESULT
;NOTE WE ARE USING 1/R FORCE LAW.
MOV R2,R0
MOV R4,R1
JSR PC,DIV
MOV R0,R4
MOV R2,R0
MOV R3,R1
JSR PC,DIV
MOV R4,R1
;NOW DONE
MOV (SP)+,R4
MOV (SP)+,R3
MOV (SP)+,R2
RTS PC
.PAGE
;DIST: THIS ROUTINE COMPUTES THE CITY BLOCK
;METRIC DISTANCE BETWEEN TWO VECTORS.
;THE (16,6) VECTORS ARE (R0,R1),(R2,R3)
;THE INTEGER RESULT IN R0
;MAKE INTEGERS (WE DON'T CARE ABOUT TWO LOST BITS)
DIST:
SWAB R0
SWAB R1
SWAB R2
SWAB R3
BIC #177400,R0
BIC #177400,R1
BIC #177400,R2
BIC #177400,R3
;GET DIFFERENCE
SUB R2,R0
SUB R3,R1
;TAKES ABSOLUTE VALUE
TST R0
IF LT
NEG R0
ENDF
TST R1
IF LT
NEG R1
ENDF
;GET METRIC (AND PUT TWO BITS BACK)
ADD R1,R0
ASL R0
ASL R0
RTS PC
.PAGE
;UVECT: THIS ROUTINE DOSE SIN AND COS, IT RETURNS IN (R0,R1)
;A (15,6) UNIT VECTOR IN THE DIRECTION SPECIFIED BY THE ANGLE
;IN R0 (16,6) (THE ANGLE IS IN FRAMITS 256FRAMITS=360DEGREES)
UVECT:
FIX R0
MOV R0,-(SP)
BIC #177700,R0
MOVB SINTAB(R0),R1
NEG R0
ADD #100,R0
MOVB SINTAB(R0),R0
BIT #200,(SP)
IF NE
NEG R0
NEG R1
ENDF
BIT #100,(SP)+
IF NE
MOV R0,-(SP)
MOV R1,R0
MOV (SP)+,R1
NEG R0
ENDF
RTS PC
;THIS IS THE SIN TABLE
SINTAB:
.BYTE 0, 1, 3, 4, 6,10,12,13
.BYTE 14,16,17,21,23,24,26,27
.BYTE 30,32,34,35,36,37,41,42
.BYTE 43,45,46,47,50,51,53,54
.BYTE 55,56,57,61,61,63,63,65
.BYTE 65,66,67,70,70,71,72,73
.BYTE 73,74,74,75,75,76,76,77
.BYTE 77,77,77,77,100,100,100,100,100,0
.PAGE
;TIMER: THIS ROUTINE USES DL11O IN ORDER TO TIME INTERVALS.
;THROUGH SIGNL IT TELLS THE DYNAMIC CALCULATORS WHEN TO RUN
;THE ROUTINE IS ENTERED ON EVER INTERUPT FROM DL11O
SIGNL: .WORD 0
CNTER: .WORD 0
TIMER:
CLR DL11OB ;SET FOR MORE TIMEING
DEC CNTER
IF LE
CLR SIGNL
MOV #<BRATE/10>/CRATE,CNTER
ENDF
RTI
.PAGE
;KBIN: THIS ROUTINE MONETORS KBI IN ORDER TO GET THE CONTROL
;SIGNALS FOR SHIP1, IT JUST TRANSLATES THEM INTO BIT SETTINGS.
;THAT THE DYNAMIC ROUTINES WILL ACT ON LATER.
KBIN:
MOV #101,KBIS
MOV KBIB,INP
BIC #177600,INP
CMP INP,#140
BLE KBIN1
SUB #40,INP
KBIN1: CMPB INP,#3
BNE .+6
JMP TO3
CMPB INP,#4
BNE .+6
JMP TO3
CMPB INP,#<' >
IF EQ
MOV #1,SHIP1+MISSL
ENDF
CMPB INP,#'L
BNE EKB1
COM SHIP1+SHLDUP
BEQ EKB1
CLR SHIP1+VANISH
EKB1: CMPB INP,#'J
IF EQ
CLR SHIP1+LACC
CLR SHIP1+ANACC
ENDF
CMPB INP,#'U
IF EQ
MOV #1,SHIP1+LACC
ENDF
CMPB INP,#'M
IF EQ
MOV #-1,SHIP1+LACC
ENDF
CMPB INP,#'H
IF EQ
MOV #1,SHIP1+ANACC
ENDF
CMPB INP,#'K
IF EQ
MOV #-1,SHIP1+ANACC
ENDF
CMPB INP,#'G
BNE EKB
COM SHIP1+VANISH
BEQ EKB
CLR SHIP1+SHLDUP
EKB: RTI
INP: 0
STARPT: 0
.PAGE
;DL11IN: THIS ROUTINE IS IDENTICAL TO KBIN BUT FOR SHIP2
DL11IN:
MOV #101,DL11IS
MOV R0,-(SP)
MOV DL11IB,R0
BIC #177600,R0
CMPB R0,#17
BNE .+10
TST (SP)+
JMP 166000
CMPB R0,#<' >
IF EQ
MOV #1,SHIP2+MISSL
ENDF
CMPB R0,#'L
BNE EDL1
COM SHIP2+SHLDUP
BEQ EDL1
CLR SHIP2+VANISH
EDL1: CMPB R0,#'J
IF EQ
CLR SHIP2+LACC
CLR SHIP2+ANACC
ENDF
CMPB R0,#'U
IF EQ
MOV #1,SHIP2+LACC
ENDF
CMPB R0,#'M
IF EQ
MOV #-1,SHIP2+LACC
ENDF
CMPB R0,#'H
IF EQ
MOV #1,SHIP2+ANACC
ENDF
CMPB R0,#'K
IF EQ
MOV #-1,SHIP2+ANACC
ENDF
CMPB R0,#'G
BNE EDL
COM SHIP2+VANISH
BEQ EDL
CLR SHIP2+SHLDUP
EDL: MOV (SP)+,R0
RTI
TOCT: 0
TIMOUT: CMP KLING,ENTER
BHI KRULE
BLO ERULE
MOV #TMS,ENDA+2
BR TO2
KRULE: MOV #KMS,ENDA+2
BR TO2
ERULE: MOV #EMS,ENDA+2
TO2: MOV #ENDMS,SCOPE1+2
MOV #350,TOCT
JMP START
TO3: CLR 175614
TSTB 175614
BPL .-4
MOV #17,175616
TSTB 175614
BPL .-4
CLR 175616
TSTB 175614
BPL .-4
CLR 15776
JMP 166000
.END BEGIN