From 29f02fe11266a08ab96fcb0bcb04bc0bea98066d Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Wed, 19 Dec 2018 19:43:40 +0100 Subject: [PATCH] Dazzle Dart - video game. --- Makefile | 4 +- build/misc.tcl | 4 + doc/hal/dazzl.dart | 117 +++ doc/programs.md | 1 + src/bs/dazzle.68 | 2329 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 2453 insertions(+), 2 deletions(-) create mode 100644 doc/hal/dazzl.dart create mode 100644 src/bs/dazzle.68 diff --git a/Makefile b/Makefile index d0ff0430..50abd2f0 100644 --- a/Makefile +++ b/Makefile @@ -27,13 +27,13 @@ SRC = syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \ macsym lmcons dmcg hack hibou agb gt40 rug maeda ms kle aap common \ fonts zork 11logo kmp info aplogo bkph bbn pdp11 chsncp sca music1 \ moon teach ken lmio1 llogo chsgtv clib sys3 lmio turnip mits_s rab \ - stan_k + stan_k bs DOC = info _info_ sysdoc sysnet syshst kshack _teco_ emacs emacs1 c kcc \ chprog sail draw wl pc tj6 share _glpr_ _xgpr_ inquir mudman system \ xfont maxout ucode moon acount alan channa fonts games graphs humor \ kldcp libdoc lisp _mail_ midas quux scheme manual wp chess ms macdoc \ aplogo _klfe_ pdp11 chsncp cbf rug bawden llogo eak clib teach pcnet \ - combat pdl minits mits_s chaos + combat pdl minits mits_s chaos hal BIN = sys2 emacs _teco_ lisp liblsp alan inquir sail comlap c decsys \ graphs draw datdrw fonts fonts1 fonts2 games macsym maint imlac \ _www_ hqm gt40 llogo bawden diff --git a/build/misc.tcl b/build/misc.tcl index 7ba1d830..0284b04b 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -490,6 +490,10 @@ respond "designs" "\r" respond "suns" "\r" expect ":KILL" +# Dazzle Dart, video game for the Logo group PDP-11/45 +respond "*" ":palx bs;_dazzle\r" +expect ":KILL" + # MLIFE respond "*" ":midas;324 games;ts mlife_rwg;mlife\r" expect ":KILL" diff --git a/doc/hal/dazzl.dart b/doc/hal/dazzl.dart new file mode 100644 index 00000000..d7ee23f4 --- /dev/null +++ b/doc/hal/dazzl.dart @@ -0,0 +1,117 @@ +.xgp +.font 0 30vr kst +.font 1 30vri kst +.font 2 36vbee kst +.spw 16 +.adjust +.ds +.ce +2Dazzle Dart: +.ce +Reflections on Computer Games0 +.ce +Harold Abelson +.ce +;Copyright (C) 1975 -- Harold Abelson, Andy diSessa, Nat Goodman +.sp + One of the striking things about the current crop of +"educational computer games" is the generally tame and above +all 1stingy0 way in which they use computational resources. +Computer programs select random numbers, display game boards, and +prompt players to guess secret words or numbers. In almost +every case these things can be done, not +to mention done better, without using a computer +at all. It is +short-sighted and wasteful to have powerful machines simply replace +spinners, game boards and flash cards. + The game of Spacewar is a notable +exception. It is exciting, fast-moving and uses +the unique capabilities of computer-controlled graphics. +It is also anathema to large time-sharing systems and other +CPU-second Scrooges, and perhaps this is the reason why, in almost +fifteen years, Spacewar is the only game of its caliber which +has become widely known. We would like to offer +Dazzle Dart as another illustration of a game which makes +effective use of interactive +computation. + Dazzle Dart was designed and implemented at M.I.T.'s LOGO Lab by Hal +Abelson, Andy diSessa, and Nat +Goodman. The basic idea +for the game, and the name as well, +come from Malcolm Jameson's 1941 science fiction story "Bullard Reflects." +Briefly, Dazzle Dart is a team game similar to hockey. Instead of hitting a +puck, the attacking team tries to shine a "beam of light" into a goal. +The players control moveable mirrors which are used to deflect the beam. Since +the beam moves "instantaneously" players must react to the entire +configuration of all the "men" on the field. The rules require teammates +to score, not +by "direct hits," but by setting up reflection patterns +among all the players. +(Figure 1) +.block 15 +.sp 15 + The rules and +parameters (size of playing field, size and speed of the pieces, etc.) +in the current M.I.T. version of Dazzle Dart have been arranged to +make a good game for two teams of two players each, although we intend to experiment +with larger teams. Players can move vertically or horizontally +(or both at once), +rotate clockwise and counterclockwise, +and the player controlling the beam fire it or pass +it to his teammate. All the action happens in "real time" +and with our current speed settings it takes about 5 seconds +for a player to move down the field or to rotate through 180 degrees. The +playing field and starting positions are shown in Figure 2. +Players may not move off the field or into the semicircular "forbidden zone" in front of +each goal. A team has 30 seconds in which to score, after which it loses control of the beam. +.block 15 +.sp 15 +.ss +.rline 16 +1. Goals count for one point. In order to score, the beam must be +reflected at least once before hitting the goal. The defending team can +score a two-point "touchback" by deflecting the beam into the attacker's home goal. +.sp +2. The beam will reflect at most twice. If a player +is hit on the "third bounce" he gains +control of the beam. This not only discourages firing at random but also allows the +defending team to "steal the beam." One effective way +to do this is to guard the player who has the beam +and move directly in front of and parallel to him at the moment of firing. Stealing the beam resets the clock and +starts a new playing period. +.sp +3. The player with the beam can instantaneously "pass" it +to his teammate by pressing a switch. This +feature makes both team members equally dangerous. In fact, a good +scoring tactic is for the +attacking player who does not have the beam to set up for a shot and +then rapidly pass and +fire. +.sp +.ds +.rline -16 + Here are some examples of how Dazzle Dart is played. Figure +3 shows how the triangle team can score with a fast break from the +opening position. In Figure 4, however, we see that this allows double-square +to not only block the shot but to steal the beam for his teammate. Figure +5 shows how the triangles could lose a point by both guarding single-square, +who has the beam. A pass would allow double-square +to easily score by +reflecting off the back +of single-triangle. Finally in Figure 6 we see how a skillful block could turn this +goal into a touchback. +.block 15 +.sp 15 + There are, of course, many possible variations on +these rules. We urge you to explore some of them, as well +as to invent even better computer games. There is a serious issue +here for research in computers in education where "frivolous games" +often serve as models for more serious work. As technology +makes the use of small +stand-alone computers more feasible than in the past, we +can begin to appreciate how often our work is limited, in +imagination as well as performance, by the economics of +time sharing. Too much current work in CAI is modeled upon +Twenty Questions +and Tic-tac-toe. + \ No newline at end of file diff --git a/doc/programs.md b/doc/programs.md index e4cca085..e3ebddcc 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -67,6 +67,7 @@ - D, SUDS drawing program - DATE, print date and time. - DATSRV, server for RFC 867 Daytime protocol. +- Dazzle Dart, video game. - DCROCK, digital watch. - DDTDOC, interactive DDT documentation. - DECUUO, TOPS-10 and WAITS emulator. diff --git a/src/bs/dazzle.68 b/src/bs/dazzle.68 new file mode 100644 index 00000000..975bf747 --- /dev/null +++ b/src/bs/dazzle.68 @@ -0,0 +1,2329 @@ + .TITLE DAZZLE DART + + + .STITL MACROS + +;CONVERT ADDRESS TO DISPLAY PUSHJ +; ARGUMENT IS AC +.MACR MAKEPJ F + .XLIST + SUB #DISREL,F + ASR F + BIS #DPUSHJ,F + .LIST +.ENDM + +;CONVERT DISPLAY CONTROLLER ADDRESSES TO REAL WORLD ADDRESSES +; ARG IS AC +.MACR MAKEAD F + .XLIST + ASL F + ADD #DISREL,F + .LIST +.ENDM + + .MACR SPUSH AA + .XLIST + MOV AA,-(P) + .LIST + .ENDM + + .MACR SPOP AA + .XLIST + MOV (P)+,AA + .LIST + .ENDM + + .MACR FPUSH FF + .XLIST + STF FF,-(P) + .LIST + .ENDM + + + .MACR FPOP FF + .XLIST + LDD (P)+,FF + .LIST + .ENDM + + +.MACR REPT1 A,B + .XLIST + .REPT A + B + .ENDR + .LIST +.ENDM + +.MACR REPT2 A,B,C + .XLIST + .REPT A + B + C + .ENDR + .LIST + +.ENDM + .STITL SYSTEM PARAMETERS + CIRC==1 + + +A=%0 +B=%1 +C=%2 +D=%3 +E=%4 +F=%5 +U=%5 +M=%5 +P=%6 +SP=%6 +PC=%7 + +FA==%0 +FB==%1 +FC==%2 +FD==%3 +FE==%4 +FF==%5 + +NDISP==0 +MNUSRS==2 + ;PROGRAMMABLE CLOCK +;BREAK LEVEL 6 +PCBRV=104 ;PROGRAMMABLE CLOCK BREAK VECTOR +PCS=172540 ;PROGRAMMABLE CLOCK STATUS +PCSTBF=172542 ;PROGRAMMABLE CLOCK SET BUFFER +PCCNT=172544 ;PROGRAMMABLE CLOCK COUNTER +;TK DISPLAY +NGCSR=164040 ;DISPLAY CONTROL AND STATUS REGISTER +NGREL=164042 ;DISPLAY RELOCATION REGISTER +;CONSOLE SWITCHES +SWB=177570 + +;SWITCH BOX STUFF +DEVADD=160104 ;PLACE NUMBER OF BOX HERE TO SELECT +DEVICE=160106 ;ACTUAL IN/OUT BUFFER + +PENUF==1 + + +ADDX=150000 +ADDY=144000 +ADDXY=ADDX!ADDY +DPUSHJ=100000 +DPOP=140200 +DPOPJ=140100 +DSTOP=140400 +DRSTXY=143000 ;RESET X AND Y TO 0 +DINC=40000 +TLEN==100 ;LENGTH OF TURTLE DISPLAY LIST (IN BYTES) +TURSIZE==6 ;(DO NOT MAKE BIGGER THAN 8) + + +TKRUN==4000 +TKGO==10000 +TKSTOP==20000 + +DPDLL==20. + + .=PCBRV + CLKBRK ;PROGRAMMABLE CLOCK + 300 ;IS ON BR6 + + + + .=400 + .=.+200 +SPDLP: . ;PDL + .=1000 + +;DISPLAY DIRECTION CODES + +DREC: .BYTE 10 + .BYTE 0 + .BYTE 20 + .BYTE 30 + .BYTE 60 + .BYTE 70 + .BYTE 50 + .BYTE 40 + .EVEN + TIME: 0 +TIMER: 0 ;COUNTS IN SECONDS + +;DISPLAY SYSTEM VARIABLES + +DFLAGS: .WORD 0 +;VARIABLES AND CONSTANTS FOR DISPLAY SYSTEM + +;THESE MUST BE IN THIS ORDER +DORBEG==. +CURX: .WORD 0,0 ;CURX = CURRENT X POSITION +; THE FIREST WORD IS THE INTEGER PART +; THE SECOND WORD IS THE FRACTION PART +CURY: .WORD 0,0 ;CURY = CURRENT Y POSITION +CURA: 0 ;CURA = THE CURRENT ANGLE +DOREND==. ;MARKS END OF THESE VARIABLES +;END OF ORDER + +STB: 0 ;STATIC AREA BOTTOM +STT: 0 ;STATIC AREA TOP.POINTS TO TOP OF STATIC DISPLAY AREA +DYB: 0 ;DYNAMIC BOTTOM. POINTS TO BOT OF DY AREA +DYR: 0 ;ROVING POINTER USED BY DISPLAY STORAGE ALLOCATIN ROUTINES +DYT: 0 ;POINTER TO DYNAMIC AREA TOP +MIRT: 0 ;POINTER TO TEMP TOP OF MIRROR +TEM1: 0 ;USED BY THE TURTLE DRAWER +TEM2: 0 +TEM3: 0 + +DIREC: 0 +PI: 40511 + 7732 + 121041 + 64303 + + +;VARIABLES AND CONSTANTS FOR DAZZLE DART + +DAZSTR==. +MAXMRS==10. +MAXBMS==10. +LARGE==77000 ;A LARGE FLOATING POINT NUMBER + + +RTURNF==1 ;BIT CODE FOR MRBOX +LTURNF==2 +RSLIDF==4 +LSLIDF==10 +BKTRF==20 +FDTRF==40 +PASSF==100 +FIREF==200 +R360: .WORD 36066,5542 ;1/360. +;VARIABLES -- ONE COPY +WALLB: .WORD 0,0 +WALLT: .WORD 0,0 +TEN: .WORD 0,0 +TURNSP: .WORD 40440,0 +SPEED: .WORD 40440,0 +FFBDR: .WORD 0,0 ;RAD OF FBDN ZONE +FFBDR2: .WORD 0,0 ;SQUARE OF ABOVE +FFBDH: .WORD 0,0 ;HT OF FBDN ZONE IN FLOATING POINT +FFBDW: .WORD 0,0 ;WDTH +FFBDB: .WORD 0,0 ;BOUNDARY OF FBDN ZONE +REFSIZ: .WORD 41400,0 ;32. +TARD: .WORD 0,0 +SX: .WORD 0,0 +SY: .WORD 0,0 +BMX: .WORD 0,0 +BMY: .WORD 0,0 +CNT: .WORD 0,0 +TARX: .WORD 0,0 +TARY: .WORD 0,0 + +NUMMRS: 12. +NUMBMS: 3 +GOLTIM: 5. ;WAIT THIS MANY SECONDS AFTER HITTING GOAL +DIGIT: </2>!DPUSHJ ;DISPLAY SUBROUTINES TO DRAW DIGITS + </2>!DPUSHJ + </2>!DPUSHJ + </2>!DPUSHJ + </2>!DPUSHJ + </2>!DPUSHJ + </2>!DPUSHJ + </2>!DPUSHJ + </2>!DPUSHJ + </2>!DPUSHJ + + ;MIRROR VARIABLES + VARBEG==. +CX: REPT2 MAXMRS+8,0,0 +CY: REPT2 MAXMRS+8,0,0 +TX: REPT2 MAXMRS+8,0,0 +TY: REPT2 MAXMRS+8,0,0 +BX: REPT2 MAXMRS+8,0,0 +BY: REPT2 MAXMRS+8,0,0 +ANGM: REPT2 MAXMRS+8,0,0 +COSM: REPT2 MAXMRS+8,0,0 +SINM: REPT2 MAXMRS+8,0,0 +DBOT: REPT2 MAXMRS,0,0 +DIRE: REPT2 MAXMRS,0,0 +CONTRO: REPT2 MAXMRS,0,0 +BN: 0 +BMLOST: 0 +SMN: 0 +TARN: 0 +MRFIRE: 0 + VAREND==. +BMR: 0 ;WHO'S GOT THE BEAM? +WALMAX: 200. ;WALLS AT PLUS OR MINUS THIS NUMBER +GOLSIZ: 25. ;GOALS AT PLUS AND MINUS THIS +GOLHT: 10. ;HEIGHT OF GOALS +FBDR: 90. ;RAD OF FBDN ZONE +FBDH: 30. ;HEIGHT OF FORBIDDEN ZONE +FBDW: 100. ;HALF THE WIDTH OF FBDN ZONE +TMOUT: 30. ;MUST SHOOT WITHIN THIS MANY SECONDS +MXPAS: 10. ;MAX NUM OF ALLOWED PASSES + +;INITIAL VALUES FOR MIRRORS AS INTEGERS +ICX: 50. + -50. + REPT1 MAXMRS+6,0 +ICY: 0 + 0 + 100. + -100. + REPT1 MAXMRS+4,0 +IANGM: 180. + 0. + 90. + 270. + REPT1 MAXMRS+4,0 +HIT: 0 ;A FLAG USED BY FIRE ROUTINES +CPAS: 0 +SC1: 0 +SC2: 0 +PSC1: 0 +PSC2: 0 +PCPAS: 0 +PTIM: 0 ;POINTERS TO DISPLAY LIST +NBDR: 0 ;COUNTER FOR BEAM DRAWER +BMCRP: 0 ;POINTER INTO NEXT AREA +BMCRS: REPT1 4*,0 ;SAVE BEAM CORS HERE + + .STITL CLOCKBREAK + +CLKBRK: DEC TIME + BGT CLK1 + MOV #60.,TIME + DEC TIMER + BGE CLK1 ;DONT ALLOW IT TO BECOME NEGATIVE + + CLR TIMER +CLK1: RTT + .STITLE DAZZLE +START: RESET + MOV SPDLP,P + MOV DISREL,NGREL + CLR BMR +RSTRT: MOV #60.,TIME + MOV TMOUT,TIMER + MOV #115,PCS + CLR SC1 + CLR SC2 + +;DAZZLE DART + +DAZZLE: MOV #60.,TIME + MOV TMOUT,TIMER + MOV MXPAS,CPAS + JSR PC,STARTD + LDFPS #0 ;INTEGER,FLOATING + JSR PC,DZCLR ;CLEAR OUT MIRROR VARIABLES + JSR PC,MRALOC ;ALLOCATE BUFFERS + JSR PC,DZINIT ;INITIALIZE VARIABLES + JSR PC,WLINIT ;INITIALIZE WALL VARIABLES + JSR PC,DRWALL ;DRAW THE WALLS + JSR PC,SCINIT ;AREA FOR DRAWING SCORE + JSR PC,MRST ;INITIALZE STATIC (IE BEAM) AREA + +;THE MAIN LOOP +DZMAIN: BIT #20000,SWB + BEQ DZM0 + BPT +DZM0: TST TIMER ;DID HE FIRE IN TIME? + BGT DZM01 + MOV TMOUT,TIMER + MOV #60.,TIME + MOV MXPAS,CPAS + ADD #4,BMR ;GIVE BEAM AWAY + BIC #177763,BMR + INC BMLOST +DZM01: JSR PC,MOVEAL ;MOVE ALL MIRRORS + CLR HIT ;BEAM COMPUTATION + CLR NBDR + TST MRFIRE + BEQ DZM1 + JSR PC,FBEAM + BR DZM1 +;DELETE PREVIOUS INSTRUCTION TO ALLOW FIRING TO RESET TIME + MOV TMOUT,TIMER + MOV #60.,TIME + +DZM1: JSR PC,DWAIT + + + ;YES. SO NOW IT IS OKAY TO MUNGE DISPLAY LISTS. + JSR PC,DRAWAL ;DRAW ALL NEW THINGS + JSR PC,DR.BM + MOV PTIM,D ;PRINT TIME + MOV TIMER,B + JSR PC,NPRNT + MOV PCPAS,D ;PRINT PASSES LEFT + MOV CPAS,B + JSR PC,NPRNT + TST HIT + BEQ DZM2 ;DIDN'T HIT GOAL + JMP GOLWAT ;GO TO WAIT AND RESTART + +DZM2: JSR PC,DIGO ;START THE DISPLAY BACK UP + BR DZMAIN + +;HAS THE DISPLAY FINISHED YET? +DWAIT: SPUSH A + SPUSH B + MOV #NDISP,A +DWAIT1: MOV A,B + SWAB B +DWAIT2: MOV B,NGCSR + BIT #TKRUN,NGCSR + BNE DWAIT2 + DEC A + BGE DWAIT1 + SPOP B + SPOP A + RTS PC + +;WAIT WHILE RUNNING DISPLAY AND THEN RESTART + +GOLWAT: JSR PC,SCCOMP + JSR PC,DWAIT + MOV #60.,TIME + MOV GOLTIM,TIMER + JSR PC,PRSCR ;PRINT THE SCORE +GOLW1: JSR PC,DWAIT + JSR PC,DIGO + TST TIMER + BGT GOLW1 +GOLWR: JSR PC,DISTOP + ADD #4,BMR + BIC #177763,BMR + JMP DAZZLE + +DIGO: SPUSH C + MOV #TKGO,C + JSR PC,DIMUNG + SPOP C + RTS PC + +DISTOP: SPUSH C + MOV #TKSTOP,C + JSR PC,DIMUNG + SPOP C + RTS PC + +DIMUNG: SPUSH A + SPUSH B + MOV #NDISP,A +DMUNG1: MOV A,B + SWAB B + BIS C,B + MOV B,NGCSR + DEC A + BGE DMUNG1 + SPOP B + SPOP A + RTS PC + + + +SCCOMP: MOV NUMMRS,A + ADD #20.,A + CMP A,HIT ;WAS TOP GOAL HIT? + BNE SCGBOT +SCGTOP: INC SC2 + BIT #4,BMR + BNE SCRET + INC SC2 ;TOP GOAL HIT BY DEFENSE? + BR SCRET +SCGBOT: INC SC1 + BIT #4,BMR + BEQ SCRET + INC SC1 ;BOTTOM GOAL HIT BY DEFENSE? +SCRET: RTS PC + +;PRINT THE SCORE +PRSCR: MOV PSC1,D + MOV SC1,B + JSR PC,NPRNT + MOV PSC2,D + MOV SC2,B + JSR PC,NPRNT + RTS PC + +NPRNT: CLR -(D) ;CLEAR OUT OLD NUMBER + CLR -(D) + CLR -(D) + ADD #6,D + CLR A + CMP B,#999. + BLE NPRNT1 + BPT +NPRNT1: DIV #10.,A + ASL B + MOV DIGIT(B),-(D) + TST A + BEQ NPRNT2 + MOV A,B + CLR A + BR NPRNT1 +NPRNT2: RTS PC + +;MOVE ALL MIRRORS + +MOVEAL: MOV NUMMRS,M +MOVELP: JSR PC,MOVE ;MOVE ONE MIRROR + SUB #4,M + BGE MOVELP + RTS PC + +;MOVE ONE MIRROR. +; CALL WITH INDEX IN M +MOVE: JSR PC,MRBOX ;A _ CONTROL BOX +; BITS ARE CODED AS + SPUSH A + MOV A,CONTRO(M) + BIT #,A + BEQ MVNOTU + BIT #RTURNF,A + BEQ MVLTU ;ITS A LEFT TURN +MVRTU: CLR A ;A FLAG FOR MVTURN +MVLTU: JSR PC,MVTURN ;TURN THIS MIRROR +MVNOTU: MOV (P),A + BIT #,A + BEQ MVNOTR + BIT #FDTRF,A + BEQ MVBKTR ;BACKWARDS TRANSLATION +MVFDTR: CLR A +MVBKTR: JSR PC,MVTRAN ;TRANSLATE THIS MIRROR +MVNOTR: MOV (P),A ;NOW CHECK FOR SLIDING + BIT #,A + BEQ MVNOTS + BIT #LSLIDF,A + BEQ MLSLD + CLR A +MLSLD: JSR PC,MVSLID +MVNOTS: TST (P)+ + RTS PC + +;READ THE BOX +MRBOX: MOV M,A + ASH #8,A + MOV A,DEVADD + CLR DEVICE +MRB1: TST DEVICE ;INPUT IS COMPLETE WHEN M.S.B.= 1 + BPL MRB1 + MOV DEVICE,A + COM A ;DEVICE BITS ARE INVERTED +MRB9: RTS PC + + +;DRAW ALL THE MIRROS THAT NEED TO BE DRAWN +; +DRAWAL: MOV NUMMRS,M +DRAWLP: JSR PC,DRAW ;DRAW ONE MIRROR + SUB #4,M + BGE DRAWLP + CLR BMLOST + RTS PC + + +;DRAW ONE MIRROR. +; CALL WITH INDEX IN M +DRAW: SPUSH CONTRO(M) ;CONTROL BOX WORD + BIT #PASSF,(P) ;PASS THE BEAM? + BEQ DRAW0 + CMP M,BMR + BNE DRAW0 + TST CPAS ;PASSES USED UP? + BEQ DRAW0 + DEC CPAS + ADD #8.,BMR + BIC #177763,BMR + INC BMLOST + BIC #PASSF,CONTRO(M) ;TURN OF FLAG SO WE DON'T LOOP + CMP (P)+,(P)+ ;WHEN WE GO TO REDRAW ALL MIRRORS + BR DRAWAL ;WHAT A KLUDGE! +DRAW0: TST BMLOST + BNE DRAW1 ;IF BEAMER CHANGES REDRAW MIRRORS ANYWAY +; BITS ARE CODED AS + BIT #,(P) + BEQ DRNOTU +DRAW1: JSR PC,DR.MIR ;REDRAW THE MIRROR +DRNOTU: BIT #,(P) + BEQ DRNOTR + JSR PC,DRTRAN ;TRANSLATE THIS MIRROR +DRNOTR: CMP M,BMR ;DOES THIS GUY HAVE THE BEAM? + BNE NOTFIR + CLR MRFIRE + BIT #FIREF,(P) ;IS MIRROR 0 FIRING + BEQ NOTFIR + INC MRFIRE ;YES. SET FLAG +NOTFIR: TST (P)+ + RTS PC + +;TURN THIS MIRROR. +; CALL WITH A = 0 IFF RIGHT TURN +;UPDATE VARIABLES ONLY +MVTURN: LDF ANGM(M),FA + TST A + BEQ MTURT ;RIGHT TURN + SUBF TURNSP,FA ;LEFT TURN + BR .+6 +MTURT: ADDF TURNSP,FA + + JSR PC,MOD360 ;MAKE ANGM MOD 360 + STF FA,ANGM(M) +MRTUR1: JSR PC,MRANG ;GET SIN, COS, AND DIREC + JSR PC,MRTUUP ;UPDATE REST OF TURNED VARIABLES + RTS PC + +;DO ANGLE CRAP +MRANG: STF FA,FE + JSR PC,SINDEG ;FA _ SIN FA + STF FA,SINM(M) + LDF FE,FA + JSR PC,COSDEG + STF FA,COSM(M) + ASH #2,C ;TRIG LEAVES QUADRANT INFO IN C + MOV C,DIRE(M) + RTS PC + + +;INCREMENATL MOD360 ROUTINE. CLOBBERS FC +MOD360: LDCIF #360.,FC + TSTF FA ;IS ANGLE NEGATIVE? + CFCC + BLT MODNEG ;YES + CMPF FA,FC ;IS ANGLE > 360. + CFCC + BLT MODRTS ;NO. ANGLE IS OKAY + SUBF FC,FA ;ELSE ANGLE = ANGLE - 360 +MODRTS: RTS PC + ;ANGLE IS NEGATIVE, SO +MODNEG: ADDF FC,FA ;ANGLE = ANGLE + 360 + RTS PC + + + +;UPDATE VARIABLES THAT HAVE BEEN TURNED +MRTUUP: LDF COSM(M),FA + MULF REFSIZ,FA + STF FA,FF ;DY + + LDF SINM(M),FA + MULF REFSIZ,FA + STF FA,FE ;DX + + ADDF CX(M),FA + STF FA,TX(M) + + LDF FF,FA ;DY + ADDF CY(M),FA + STF FA,TY(M) + + LDF CX(M),FA + SUBF FE,FA + STF FA,BX(M) + + LDF CY(M),FA + SUBF FF,FA + STF FA,BY(M) + + RTS PC + + +;SLIDE THIS MIRROR +;A=0 IF SLIDE TO RIGHT +MVSLID: LDCIF #-1,FA ;FOR TURTLE CONTROLS USE---LDF SINM(M),FA + CLRF FB ;FOR TURTLE--LDF COSM(M),FB + NOP ;SPACE FOR TURTLE PATCH + BR MVTRS + +;TRANSLATE THIS MIRROR +; A = 0 IFF THE DIRECTION IS FORWARD +MVTRAN: LDCIF #-1,FB ;FOR TURTLE---LDF SINM(M),FB + NEGF FB ;= COS (ANGM+90) + CLRF FA ;FOR TURTLE---LDF COSM(M),FA + NOP +MVTRS: MULF SPEED,FA ;DX + MULF SPEED,FB ;DY + TST A ;FD OR BK ? + BEQ FDMOVE + NEGF FA ;BACKWARD, SO NEGATE DX AND DY + NEGF FB +FDMOVE: STF FA,FE + STF FB,FF + ADDF CX(M),FA ;NEW X + ADDF CY(M),FB + LDF FA,FD + JSR PC,CHKBND ;IN BOUNDS? + BNE NOTBND ;OUT OF BOUNDS. DO NOTHING +YBND: LDF FB,FD + JSR PC,CHKBND ;IN BOUNDS? + BNE NOTBND ;OUT OF BOUNDS. DO NOTHING + JSR PC,FBDCH ;CHECK TO SEE IF IN FORBIDDEN ZONE + BNE NOTBND +MRTR1: JSR PC,MRTRUP ;UPDATE VARIABLES +NOTBND: RTS PC + +;CHECK TO SEE IF ENTERING FORBIDDEN ZONE + .IFZ CIRC + +FBDCH: FPUSH FA + FPUSH FB + ABSF FA + CMPF FFBDW,FA + CFCC + BLT FBOK + ABSF FB + CMPF FFBDB,FB + CFCC + BGT FBOK + FPOP FB ;INSIDE FORBIDDEN ZONE + FPOP FA + CLZ + RTS PC + +FBOK: FPOP FB + FPOP FA + SEZ + RTS PC + + .ENDC + + .IFZ CIRC-1 + +FBDCH: FPUSH FA + FPUSH FB + FPUSH FC + STF FB,FC + MULF FA,FA + ADDF WALLT,FC + MULF FC,FC + ADDF FA,FC + CMPF FFBDR2,FC + CFCC + BGT FBNO + SUBF WALLT,FB + MULF FB,FB + ADDF FA,FB + CMPF FFBDR2,FB + CFCC + BGT FBNO + FPOP FC ;OK + FPOP FB + FPOP FA + SEZ + RTS PC + +FBNO: FPOP FC + FPOP FB + FPOP FA + CLZ + RTS PC + + .ENDC + + +;UPDATE VARIABLES DUE TO TRANSLATION +MRTRUP: STF FA,CX(M) + STF FB,CY(M) + + LDF FE,FC ;DX + ADDF TX(M),FC + STF FC,TX(M) + + LDF FF,FC + ADDF TY(M),FC + STF FC,TY(M) + + LDF FE,FC + ADDF BX(M),FC + STF FC,BX(M) + + LDF FF,FC + ADDF BY(M),FC + STF FC,BY(M) + + RTS PC + + +;MUNGE DISPLAY LIST TO TRANSLATE THIS MIRROR +DRTRAN: LDF CX(M),FA + LDF CY(M),FB + JSR PC,ROUND + STCFI FA,D + STCFI FB,E + MOV DBOT(M),A + JSR PC,MTO.R1 ;ACTUALLY PUT IN THE ADDX AND ADDY COMMANDS + RTS PC + + +;DRAW A MIRROR +DR.MIR: MOV DBOT(M),A + MOV A,MIRT ;MIRT WILL BE POINTER TO TOP OF TURTLE DLIST SO FAR + CMP -(A),-(A) + MOV #DRSTXY!DPOPJ,-(A) + SPUSH A + MOV DIRE(M),DIREC + LDCIF #TURSIZ,FB + LDF SINM(M),FA + MULF FB,FA ;DX OF 1ST TURTLE SIDE + MULF COSM(M),FB ;DY OF 1ST SIDE + JSR PC,ROUND + STCFI FA,D + STCFI FB,E + MOV M,A + ASR A + JSR PC,@DR.TU(A) + JSR PC,DR.REF ;THE REFLECTOR + MOV #DRSTXY,@(P)+ ;RESTORE THIS WORD + RTS PC + +;DISPATCH TABLE FOR POINTERS +;THESE ROUTINES SHOULD BE CALLED WITH D,E AND DIREC SET +;AND LEAVE MIRT POINTING TO WHERE REFLECTOR CODE SHOULD START + +DR.TU: DR.TUR + DR.TSQ + DR2TR + DR2SQ + REPT1 MAXMRS-4,DR.TUR + +DR.TUL: DR.TUR ;DISPATCH TABLE FOR THE "2 FIGURE "ROUTINES + DR.TS1 + + +;DRAW A TRIANGULAR POINTER +DR.TUR: SPUSH M + SPUSH DIREC + SPUSH D + SPUSH D + SUB E,2(SP) ;NOW SIZE * (SIN - COS) ON STACK + ADD E,(SP) ;NOW SIZE * (SIN + COS) ON STACK + +;SIDE 1--WILL BE AN ADDXY + MOV MIRT,A + MOV A,TEM3 + CMP (A)+,(A)+ + MOV A,MIRT + JSR PC,MTO.R1 + +;SIDE 2 + ADD #30,DIREC ;SIDE 2 IS 3*45 DEGREES RIGHT OF SIDE 1 + MOV (SP)+,D ;DX IS SIZE * (COSA + SINA) + MOV (SP)+,E ;DY IS SIZE * (COSA - SINA) + JSR PC,DR.TSD ;DRAW THE SIDE + +;SIDE 3 HAS THE SAME INCREMENTS AS SIDE 2. +;JUST THE DIRECTION IS DIFFERENT + MOV DIREC,B + ADD #20,B ;SIDE 3 IS 2*45 DEGREES RIGHT + BIC #177707,B ;LEAVE ONLY THE 3 BITS + SWAB B ;PUT THE DIREC BITS IN TOP BYTE + MOV MIRT,C ;POINTS TO WORD ABOVE LAST ONE OF TURTLE DLIST + MOV C,A + SUB D,C ;SINCE D POINTS TO BOTTOM WORD OF SIDE 2 + ;C-D IS NUMBER OF BYTES IN SIDE 2'S DLIST + ASR C ;C/2 = NUMBER OF WORDS +DR.TS3: MOV (D)+,E ;NEXT WORD OF SIDE 2'S DLIST + BIC #34000,E ;CLEAR THE DIRECTION BITS THEREIN + BIS B,E ;AND SET THEM FROM THE NEW DIREC IN B + MOV E,(A)+ ;STORE IN DLIST + DEC C ;NUMBER OF WORDS IN SIDE 2'S DLIST + BGT DR.TS3 ;THERE ARE MORE WORDS + +;SIDE 4 IS IDENTICAL TO SIDE 1, + SPOP DIREC + SPOP M + MOV TEM3,B ;COPY THE SAME ADDXY + MOV (B)+,(A)+ + MOV (B)+,(A)+ + MOV #DPOPJ,(A) + MOV A,MIRT + RTS PC + +; DRAW ONE SIDE OF THE TURTLE +; DIREC CONTAINS THE DIRECTION +; MIRT POINTS TO TOP OF TURTLE DISPLAY LIST SO FAR +; C,D = + OR - DX OR DY +DR.TSD: BIC #177707,DIREC ;BITS MAY HAVE BEEN SET BY THE SUBTRACTING + JSR PC,DR.STUP + ADD MIRT,D ;D = NEW TOP OF TURTLE + MOV D,MIRT + JSR PC,DR.ASC ;ACTUALLY CREAT THE DISPLAY LIST + RTS PC + + +;THE 2 FIGURE ROUTINES USE C AS A FLAG TO DECIDE +;BETWEEN TRIANGLE AND SQUARE +DR2TR: CLR C + JSR PC,DR.TU1 + RTS PC + +DR2SQ: MOV #2,C + ASR D ;SQUARE IS HALF AS BIG AS TRI + ASR E + JSR PC,DR.TU1 + RTS PC + +;DRAW POINTER AS TWO TRIANGLES +;DLIST IS ADDXY,PUSHJ TO TRIANGLE,ADDXY,PUSHJ,ADDXY, +;PUSHJ TO REFLECTOR,POPJ,TIRANGLE CODE,REFLECTOR CODE + +DR.TU1: SPUSH D + SPUSH E + MOV MIRT,A ;POINTER TO START OF CODE + ADD #4,A + MOV A,TEM1 ;FIRST PUSHJ WILL GO HERE + JSR PC,MTO.R1 ;PUT IN ADDXY. D,E ALREADY SET + MOV TEM1,A + ADD #6,A + MOV A,TEM2 ;POINTER TO 2ND PUSHJ + MOV (P),E + MOV 2(P),D + ASL D + ASL E + NEG D + NEG E ;SET UP FOR 2ND ADDXY + JSR PC,MTO.R1 + MOV TEM2,A + ADD #10.,A ;LEAVE ROOM FOR ADDXY,PUSH TO REF AND POPJ + MOV A,MIRT ;TRIANGLE CODE WILL START HERE + MOV A,B + MAKEPJ B + MOV B,@TEM1 + MOV B,@TEM2 ;PUT IN PUSHJ'S TO TURTLE CODE + MOV #DPOPJ,-(A) ;THE FINAL POPJ + TST -(A) + MOV A,TEM1 ;POINTER TO PUSHJ TO REFLECTOR + MOV (P),E + MOV 2(P),D + JSR PC,MTO.R1 ;THE FINAL ADDXY + SPOP E + SPOP D + JSR PC,@DR.TUL(C) ;DECIDE BETWEEN SQUARE AND TRIANGLE + ADD #2,MIRT ;REFLECTOR CODE WILL START HERE + MOV MIRT,A + MAKEPJ A + MOV A,@TEM1 + RTS PC + +;DRAW POINTER AS A SQUARE +;MADE UP OF ADDXY (DX,DY) +;SIDES ARE (-2DY,2DX),(-2DX,-2DY),(2DY,-2DX) +;ADDXY (DX,DY) + +DR.TSQ: ASR D ;SQUARE IS HALF AS BIG AS TRIANGLE + ASR E +DR.TS1: SPUSH DIREC ;ENTRY FOR "2-SQUARE" WHICH ALREADY ASR'ED D AND E + SPUSH DYB ;THIS WILL FAKE OUT THE + ;ERROR CONDITION ON THE LINE DRAWER + MOV #DISEND,DYB + SPUSH STT ;FOR LINE DRAWER WE WILL MUNG STT + SPUSH M + SPUSH D + SPUSH E + MOV MIRT,A ;FIRST WORD OF CODE WILL GO HERE + CMP (A)+,(A)+ + MOV A,MIRT + JSR PC,MTO.R1 ;FIRST ADDXY + MOV MIRT,STT ;FOR LINE DRAWER + MOV (P),D ;SET UP DX AND DY FOR SIDE 2 + MOV 2(P),E + ASL D + ASL E + NEG E + JSR PC,XYDIR + JSR PC,DR.LIN ;SIDE 2 + MOV (P),E + ASL E + NEG E + MOV 2(P),D + ASL D + NEG D + JSR PC,XYDIR + JSR PC,DR.LIN ;SIDE 3 + MOV (P),D + MOV 2(P),E + ASL D + ASL E + NEG D + JSR PC,XYDIR + JSR PC,DR.LIN ;SIDE 4 + SPOP E + SPOP D + MOV STT,A + CMP (A)+,(A)+ + MOV A,MIRT + MOV #DPOPJ,(A) ;LAST WORD OF CODE + JSR PC,MTO.R1 ;FINAL SIDE + SPOP M + SPOP STT + SPOP DYB + SPOP DIREC + RTS PC + +;THE REFLECTOR PART OF THE MIRROR +DR.REF: SPUSH M + LDF TX(M),FA ;GET DX,DY TO TOP OF MIRROR + LDF CX(M),FB + JSR PC,ROUND + SUBF FB,FA ;DX + STCFI FA,D + + LDF TY(M),FA + LDF CY(M),FB + JSR PC,ROUND + SUBF FB,FA ;DY + STCFI FA,E + + MOV MIRT,A ;HACK THE DISPLAY LIST + CMP (A)+,(A)+ + MOV #DPOPJ,(A) + MOV A,MIRT + JSR PC,MTO.R1 ;ACTUALLY PUTS IN THE ADDX, ADDY + + ;GET DX,DY FROM TOP TO BOTTOM OF MIRROR + LDF BX(M),FA + LDF TX(M),FB + JSR PC,ROUND + SUBF FB,FA ;DX + STF FA,FC + STCFI FA,D + + LDF BY(M),FA + LDF TY(M),FB + JSR PC,ROUND + SUBF FB,FA ;DY + STCFI FA,E + SPUSH D + SPUSH E + + ADD #40,DIREC + BIC #177707,DIREC + JSR PC,DR.STUP ;SET UP TO DRAW LINE + ADD MIRT,D ;POINTER TO NEW TOP + MOV D,MIRT + MOV #DPOPJ,(D) + JSR PC,DR.ASC ;ACTUALLY ASSEMBLE DISPLAY CODE + MOV 4(P),M + CMP M,BMR ;SPECIAL REFLECTOR FOR BEAMER + BNE DR.RER + DIVF TEN,FA + DIVF TEN,FC + STCFI FA,D + STCFI FC,E + NEG D + MOV MIRT,A + CMP (A)+,(A)+ + MOV #DPOPJ,(A) + MOV A,MIRT + JSR PC,MTO.R1 + SPOP E + SPOP D + NEG E + NEG D + JSR PC,XYDIR + SPUSH STT ;FAKE OUT ERROR CONDINTION IN DR.LIN + SPUSH DYB + MOV #DISEND,DYB + MOV MIRT,STT + JSR PC,DR.LIN + MOV #DPOPJ,@STT + SPOP DYB + SPOP STT + BR DR.RE1 + +DR.RER: SPOP E + SPOP D +DR.RE1: SPOP M + RTS PC + + +;ALLOCATE DISPLAY BUFFERS FOR EACH MIRROR +; A = MAX LENGTH OF DISPLAY CODE PLUS DPOPJ +MRALOC: + ;CALCULATE SIZE OF EACH MIRROR DISPLAY BUFFER + LDF REFSIZ,FA ;= 1/2 SIZE OF MIRROR + STCFI FA,B + CLR A + DIV #4,A ;=((1/2 SIZE)/8)*2 + ;= # OF WORDS OF DISPLAY CODE FOR WHOLE MIRROR + TST B ;IF THERE IS A REMAINDER + BEQ DAZ1 ; + INC A ;ROUND UP +DAZ1: ASL A ;TURN INTO BYTE COUNT + ADD #,A ;LEAVE ROOM FOR TURTLE, ETC + + MOV NUMMRS,M + MOV DYT,B +MRAL1: SUB A,B ;B -> FIRST USABLE WORD + MOV B,DBOT(M) + MOV #ADDX,-(B) + MOV #ADDY,-(B) + MOV #DRSTXY,-(B) + SUB #4,M + BGE MRAL1 ;LOOP ON + MOV B,DYB ;BOTTOM OF MIRROR BUFFERS + RTS PC + + +;INITIALIZE STATIC AND LIGHT BEAM AREAS. +;PUT IN A PUSHJ TO EACH MIRROR +MRST: MOV STT,A + MOV NUMMRS,M + MOV M,B + ASR B + ADD B,A + CMP (A)+,(A)+ + MOV A,STT + MOV A,STB ;THIS IS ALSO BOTTOM OF BEAM AREA + MOV #DSTOP,(A) + MOV #DRSTXY,-(A) +MRST1: MOV DBOT(M),E + SUB #6,E ;E -> THE DRSTXY AT THE BEGINNING + MAKEPJ E + MOV E,-(A) + SUB #4,M + BGE MRST1 + RTS PC + + +;INITIALIZE + +DZINIT: MOV NUMMRS,M + MOV M,A + ASR A +DZILP: LDCIF IANGM(A),FA + LDCIF ICX(A),FB + LDCIF ICY(A),FC + STF FA,ANGM(M) + STF FB,CX(M) + STF FC,CY(M) + SPUSH A + JSR PC,MRTUR1 ;GETS SINM, COSM, ETC. AND DRAWS MIRROR + JSR PC,DR.MIR + JSR PC,DRTRAN + SPOP A + SUB #4,M + SUB #2,A + BGE DZILP + RTS PC + +DZCLR: MOV #VARBEG,A +DZCLR0: CLR (A)+ + CMP A,#VAREND + BLO DZCLR0 + LDCIF #20.,FA + STF FA,TEN + CLR BMLOST + RTS PC + +;INITIAL WALL VARIABLES + +WLINIT: MOV NUMMRS,M + LDCIF WALMAX,FA + STF FA,WALLT + STF FA,FB ;WALL1--(200,200) TO (-200,200) + STF FA,FC + STF FA,FD + NEGF FC + STF FC,WALLB + FPUSH FA + LDCIF #90.,FA ;ANGLE=90 DEGREES + STF FA,FE + FPOP FA + JSR PC,WLINI1 + NEGF FB ;WALL2--(200,-200) TO (200,200) + NEGF FC + CLRF FE ;ANGLE=0 + JSR PC,WLINI1 + NEGF FA ;WALL3--(-200,-200) TO (200,-200) + NEGF FD + FPUSH FA + LDCIF #90.,FA ;ANGLE=90 DEGREES + STF FA,FE + FPOP FA + JSR PC,WLINI1 + NEGF FB ;WALL4--(-200,200) TO (-200,-200) + NEGF FC + CLRF FE ;ANG=0 + JSR PC,WLINI1 + LDCIF GOLSIZ,FA ;GOAL1 (-25,200) TO (25,200) + STF FA,FC + NEGF FA + NEGF FD + FPUSH FA + LDCIF #90.,FA ;ANGLE=90 DEGREES + STF FA,FE + FPOP FA + JSR PC,WLINI1 + ADD #4.,M ;SKIP GOALS 2 + NEGF FB ;GOAL3 (-25,-200) TO (25,-200) + NEGF FD + JSR PC,WLINI1 + LDCIF FBDW,FA ;SET UP FBDN ZONE VARIABLES IN FLOATING POINT + STF FA,FFBDW + LDCIF FBDH,FA + STF FA,FFBDH + LDCIF FBDR,FA + STF FA,FFBDR + MULF FA,FA ;RADIUS AND SQUARE OF FBDN ZONE + STF FA,FFBDR2 + LDF WALLT,FB + SUBF FA,FB + STF FB,FFBDB + RTS PC + +WLINI1: FPUSH FA + FPUSH FB + FPUSH FC + FPUSH FD + ADD #4,M + STF FA,BX(M) + STF FB,BY(M) + STF FC,TX(M) + STF FD,TY(M) + LDF FE,FA + STF FA,ANGM(M) + JSR PC,MRANG + FPOP FD + FPOP FC + FPOP FB + FPOP FA + RTS PC + + +;DRAW THE WALLS +DRWALL: LDF WALLB,FA + LDF WALLT,FB + STCFI FA,D + SPUSH D ;WALLB + STCFI FB,-(P) ;WALLT + MOV D,E + JSR PC,MTO.AD ;PUT IN SETXY TO BOTTOM LEFT + SPOP E ;WALLT + SUB (P),E ;WALLB-WALLT = WALLSIZE + MOV E,(P) + CLR D ;DX = 0 + CLR DIREC ;VERTICAL LINE + JSR PC,DR.LIN + MOV (P),D ;DX = WALLSIZE + CLR E ;DY = 0 + MOV #20,DIREC + JSR PC,DR.LIN + MOV (P),E ;DY = WALLSIZE + CLR D ;DX = 0 + MOV #40,DIREC + JSR PC,DR.LIN + SPOP D ;DX = WALLSIZE + CLR E ;DY = 0 + MOV #60,DIREC + JSR PC,DR.LIN + JSR PC,DR.GLS ;DRAW THE GOALS + JSR PC,DR.FB ;DRAW FORBIDDEN ZONE + RTS PC + +;DRAW THE GOALS +DR.GLS: JSR PC,DR.RST ;PUT IN A RESET + MOV WALMAX,E + MOV GOLSIZ,D + NEG D + JSR PC,MTO.AD ;SETXY AT FIRST GOAL + JSR PC,DR.G1 ;DRAW FIRST GOAL + MOV WALMAX,E + ASL E + ADD GOLHT,E + NEG E + CLR D + JSR PC,MTO.AD ;SETXY AT 2ND GOAL + JSR PC,DR.G1 ;DRAW 2ND GOAL + RTS PC + +DR.G1: MOV GOLHT,E ;DRAW A GOAL + MOV GOLSIZ,D + ASL D + JSR PC,DR.SQ + RTS PC + +DR.RST: MOV STT,A ;PUT IN A RESET + MOV #DRSTXY,(A)+ + MOV #DSTOP,(A) + MOV A,STT + RTS PC + + .IFZ CIRC + +DR.FB: JSR PC,DR.RST + MOV FBDW,D + NEG D + MOV WALMAX,E + NEG E + JSR PC,MTO.AD + MOV FBDW,D + ASL D + MOV FBDH,E + JSR PC,DR.SQ ;DRAW BOTTOM FBDN ZONE + MOV WALMAX,E ;POSITION FOR TOP ZONE + ASL E + SUB FBDH,E + CLR D + JSR PC,MTO.AD + MOV FBDW,D + MOV FBDH,E + ASL D + JSR PC,DR.SQ + RTS PC + .ENDC + + + .IFZ CIRC-1 +DR.FB: CLR A ;FLAG TO DRAW TOP + JSR PC,DR.FB0 + MOV #-1,A + JSR PC,DR.FB0 + RTS PC + +DR.FB0: SPUSH A + JSR PC,DR.RST ;PUT IN A RESET + CLRF CURX + CLRF CURY + BIS #PENUF,DFLAGS + LDF WALLT,FB + TST (P) + BEQ DR.F0T ;NEGATE YCOR FOR BOTTOM + NEGF FB +DR.F0T: CLRF FA + SUBF FFBDR,FA + JSR PC,MOVETO + BIC #PENUF,DFLAGS ;PENDOWN + SPOP A ;TOP--BOTTOM FLAG + LDCIF #180.,FA + STF FA,FE + JSR PC,DR.FBS + RTS PC + +DR.FBS: SPUSH A +DR.FB2: LDF FE,FA + LDCIF #3,FB + SUBF FB,FA + STF FA,FE + JSR PC,SINDEG + MULF FFBDR,FA + FPUSH FA ;SAVE Y-COORDINATE + LDF FE,FA + JSR PC,COSDEG + MULF FFBDR,FA ;X--COORDINATE + FPOP FB + SUBF WALLT,FB + TST (P) + BNE D.FBSB + NEGF FB ;NEGATE IT WHEN DRAWING TOP +D.FBSB: JSR PC,MOVETO + TSTF FE + CFCC + BGT DR.FB2 + SPOP A + RTS PC + + .ENDC + + +;LEAVE ROOM IN DISPLAY LIST FOR SCORE AND TIME +SCINIT: JSR PC,DR.RST + MOV #-150.,D + MOV WALMAX,E + ADD #20.,E + CMP (A)+,(A)+ + MOV A,STT + JSR PC,MTO.R1 ;ADDXY TO UPPER LEFT + MOV STT,A + CLR (A)+ + CLR (A)+ + CLR (A)+ ;3 DIGITS. 0 IS DISPLAY NOP + MOV A,PSC1 ;POINTER BEYOND LAST WORDOF SCORE 1 + JSR PC,SCIN0 + MOV A,PCPAS + JSR PC,SCIN0 ;ROOM FOR NUM PASSES LEFT + MOV A,PTIM + JSR PC,SCIN0 + MOV A,PSC2 + MOV A,STT + MOV #DSTOP,(A) + RTS PC + +SCIN0: CMP (A)+,(A)+ ;LEAVE ROOM FOR A 3-DIGIT NUMBER + MOV A,PSC2 + CLR E + MOV #50.,D + JSR PC,MTO.R1 + MOV PSC2,A + CLR (A)+ + CLR (A)+ + CLR (A)+ + RTS PC + +;DRAW A SQUARE +;D IS WIDTH AND E IS HEIGHT +DR.SQ: SPUSH D + SPUSH E + CLR D + CLR DIREC + JSR PC,DR.LIN + CLR E + MOV 2(P),D + MOV #20,DIREC + JSR PC,DR.LIN + CLR D + MOV (P),E + MOV #40,DIREC + JSR PC,DR.LIN + CLR E + MOV 2(P),D + MOV #60,DIREC + JSR PC,DR.LIN + SPOP E + SPOP D + RTS PC + +;SAVE BEAM COORDS FOR DRAW ROUTINE +; CALL BMSTRT FOR FIRST BEAM. +; CALL BMCONT FOR SUBSEQUENT ONES + +STRTBM: MOV #BMCRS,A + STF FA,(A)+ + STF FB,(A)+ + MOV A,BMCRP + +CONTBM: INC NBDR + MOV BMCRP,A + STF FC,(A)+ + STF FD,(A)+ + MOV A,BMCRP + RTS PC + +;DRAW THE BEAM! +DR.BM: JSR PC,BMCS + TST NBDR + BLE DR.BMR ;NO BEAMS + MOV #BMCRS,A + LDF (A)+,FA + LDF (A)+,FB + LDF (A)+,FC + LDF (A)+,FD + SPUSH A + JSR PC,STRTB1 + SPOP A + +DR.BM1: DEC NBDR + BLE DR.BMR + LDF (A)+,FC + LDF (A)+,FD + SPUSH A + JSR PC,CONTB1 + SPOP A + BR DR.BM1 + +DR.BMR: RTS PC + +;FA = X OF FIRST POINT +;FB = Y OF FIRST POINT +STRTB1: BIS #PENUF,DFLAGS + CLRF CURX + CLRF CURY + FPUSH FC + FPUSH FD + JSR PC,MOVETO + FPOP FD + FPOP FC + BIC #PENUF,DFLAGS + +;FC = X OF NEW POINT. +;FD = Y OF NEW POINT +CONTB1: SPUSH M + STF FC,FA ;X + STF FD,FB ;Y + JSR PC,MOVETO + SPOP M + RTS PC + + +;CLEAR BEAM SCREEN +BMCS: MOV STB,STT + MOV #DSTOP,@STT + RTS PC + + +;FIRST BEAM + +FBEAM: CLR BN ;BEAM NUMBER + MOV BMR,SMN ;SOURCE OF BEAM + LDD #LARGE,FA + STF FA,TARD ;TARGET DISTANCE + MOV BMR,M ;MIRROR INDEX + LDD CX(M),FA ;SET UP SOURCE + STF FA,SX + LDD CY(M),FB + STF FB,SY + LDD COSM(M),FC + STF FC,BMX ;BEAM VECTOR COORDS + LDD SINM(M),FD + NEGD FD ;BM PRRP TO MIRROR + STF FD,BMY + MULD FB,FC ;BMX*SY + MULD FA,FD ;BMY*SX + SUBD FD,FC + STF FC,CNT ;L(X)=BM(PERP).(X-S)=BMY*X-BMX*Y+(BMX*SY-BMY*SX) + CLR M + +CHKMRS: CMP M,SMN ;STARTING MIRROR? + BEQ ENDMRS + LDD BMY,FA ;BEAM THRU MIRROR? + MULD TX(M),FA + LDD BMX,FB + MULD TY(M),FB + SUBD FB,FA ;L(T) IN FA + ADDD CNT,FA + LDD BMY,FB + MULD BX(M),FB + LDD BMX,FC + MULD BY(M),FC + SUBD FC,FB + ADDD CNT,FB ;L(B) IN FB + LDD FA,FC ;L(T) IN FC + MULD FB,FA + CFCC ;L(T)*L(B)<0? + BGE ENDMRS + LDD FB,FA ;COMPUTE INTERSECTION, I=B+D*(T-B) + SUBD FC,FB ;D=L(B)/(L(B)-L(T)) IN FA + DIVD FB,FA + LDD TX(M),FC + SUBD BX(M),FC + MULD FA,FC + ADDD BX(M),FC ;TTARX IN FC + LDD TY(M),FD + SUBD BY(M),FD + MULD FA,FD + ADDD BY(M),FD ;TTARY IN FD + LDD FC,FA ;COMPUTE TARGET DISTANCE + SUBD SX,FA ;TTARD=BM.(TTAR-S) + MULD BMX,FA + LDD FD,FB + SUBD SY,FB + MULD BMY,FB + ADDD FB,FA ;TTARD IN FA + CFCC ;MIRROR IN DIRECTION OF BEAM? + BLE ENDMRS + CMP M,NUMMRS ;IS THIS A WALL? + BLE CHKMR1 + JMP WALLS +CHKMR1: CMPD TARD,FA ;CLOSEST MIRROR SO FAR? + CFCC + BLE ENDMRS + MOV M,TARN ;TTAR BECOMES TAR + STF FA,TARD + STF FC,TARX + STF FD,TARY + +ENDMRS: CMP M,NUMMRS ;CHECKED ALL MIRRORS? + BEQ .ENDMR + MOV NUMMRS,A ;CHECKED ALL WALLS? + ADD #16.,A + CMP M,A + BLT .RTRN +BMERR: RTS PC +.RTRN: ADD #4,M ;CHECK REST + JMP CHKMRS +.ENDMR: LDD #LARGE,FA ;HIT A MIRROR? + CMPD TARD,FA + CFCC + BEQ .RTRN ;NO, DO WALLS + LDD SX,FA ;DRAW BEAM + LDD SY,FB + LDD TARX,FC + LDD TARY,FD + TST BN ;IS THIS FIRST BEAM? + BEQ .FBM + JSR PC,CONTBM + BR ENDBM +.FBM: JSR PC,STRTBM +ENDBM: INC BN ;ALL BEAMS? + CMP BN,NUMBMS + BNE NEWBM + CLR HIT + CMP TARN,NUMMRS ;HIT A MIRROR ON FINAL BOUNCE? + BGT FBM.R + MOV TARN,B ;DID BEAM CHANGE TEAMS? + MOV BMR,C + MOV #177773,D + BIC D,B + BIC D,C + CMP B,C + BEQ ENDBM1 ;NO--SAME TEAM + MOV TMOUT,TIMER ;YES--RESET CLOCK + MOV #60.,TIME ;RESET CLOCK + MOV MXPAS,CPAS ;RESET NUM PASSES +ENDBM1: MOV TARN,BMR ;LAST GUY HIT GETS BEAM + MOV #1,BMLOST +FBM.R: RTS PC + +NEWBM: MOV TARN,M ;INDEX TO TARGET + LDD TARX,FA ;TAR BECOMES SOURCE + STF FA,SX + LDD TARY,FA + STF FA,SY + MOV TARN,SMN + LDD #LARGE,FA + STF FA,TARD + LDD ANGM(M),FA ;REFLECT + MULD #40400,FA + STF FA,FE ;2*ANGLE IN FE + JSR PC,SINDEG + STF FA,FD + LDD FE,FA + STF FD,FE ;SIN 2*ANG IN FE + JSR PC,COSDEG ;COS 2*ANG IN FA + LDD BMX,FC ;BMX IN FC + LDD BMY,FB ;BMY IN FB + MULD FE,FB + MULD FA,FC + SUBD FC,FB ;NEW BMX IN FB, YSIN -XCOS + LDD FE,FD + MULD BMX,FD + MULD BMY,FA ;NEW BMY IN FA,XSIN +YCOS + ADDD FD,FA + STF FB,BMX + STF FA,BMY + MULD SY,FB ;COMPUTE NEW CNT + MULD SX,FA + SUBD FA,FB + STF FB,CNT + CLR M ;RESET MIRROR NUMBER + JMP CHKMRS + +WALLS: MOV M,TARN ;WALL BECOMES TARGET + STF FD,TARY + STF FC,TARX + LDD SX,FA + LDD SY,FB + TST BN ;FIRST BEAM? + BEQ .FWBM + JSR PC,CONTBM ;DRAW BEAM + BR .GLCHK ;GO TO CHECK GOALS +.FWBM: JSR PC,STRTBM +.GLCHK: ADD #16.,M ;CHECK GOAL + LDD TX(M),FA + SUBD TARX,FA + LDD TARX,FB + SUBD BX(M),FB + MULD FB,FA + CFCC + BGT GOAL ;(T-X)*(X-B)>0 IMPLIES GOAL + CLR HIT + RTS PC + + +GOAL: MOV M,HIT + TST BN + BNE GOAL1 + CLR HIT +GOAL1: RTS PC + +;STARTDISPLAY +STARTD: MOV #NDISP,A + ASL A +STARD1: MOV #DSTOP,DISREL(A) + MOV #DPDLL,D + MUL A,D + ADD #,D + ASR D + MOV D,DISPDL(A) + SUB #2,A + BGE STARD1 + + MOV #DORBEG,F ;ZERO VARIOUS USER DISPLAY VARS + MOV #DOREND,D ;LAST WORD +SDLOOP: CLR (F)+ ;ZERO WORD + CMP F,D + BLE SDLOOP + +;SET FIRST 2 WORDS OF DLIST +;AND SET THE BUFFER VARIABLES + MOV #DLIST,D + MOV #,(D)+ + MOV #DSTOP,(D) + MOV D,STB ;STATIC AREA BOTTOM + MOV D,STT ;STATIC AREA TOP + + MOV #DISEND,B + CLR -(B) ;SET UP DUMMY FREE AREA + MOV B,DYT ;DYNAMIC AREA TOP + CLR -(B) + MOV B,DYB ;DYNAMIC AREA BOTTOM + MOV B,DYR ;DYNAMIC AREA ROVING POINTER + +;NOW MAKE A PUSHJ TO THE DISPLAY LIST +;AND STUFF IT INTO THE HARDWARE FIRST LOCATION FOR THIS DISPLAY + MOV #DLIST,D + MAKEPJ D + CLR A +SDLP1: MOV D,DISREL(A) + ADD #2,A + CMP A,#2*NDISP + BLE SDLP1 + + +;AND LAST BUT NOT LEAST + MOV #DISREL,NGREL + RTS PC + + +;MOVE FROM CURX,CURY TO POINT IN FA,FB +MOVETO: JSR PC,ROUND + STF FA,FC ;SAVE NEW POINT FOR A MOMENT + STF FB,FD + SUBF CURX,FA ;DX + SUBF CURY,FB ;DY + STF FC,CURX ;UPDATE CURX, CURY TO NEW POINT + STF FD,CURY + STCFI FA,D ;PUT DX IN D + STCFI FB,E ;PUT DY IN E + + BNE MTO.1 ;CHECK FOR DX=DY=0 + TST D + BEQ MTO.R ;JUST RETURN + +MTO.1: BIT #PENUF,DFLAGS ;IS PEN UP? + BNE MTO.PU ;YES + +;THE PEN IS DOWN + JSR PC,XYDIR ;CALCULATE DIREC + JSR PC,DR.LIN ;AND DRAW LINE!! + +MTO.R: RTS PC + + +;THE PEN IS UP +;PUT ADDX AND ADDY COMMANDS INTO DISPLAY LIST +;HAVE TO EXPAND STATIC AREA AND PUT IN ADD COMMANDS +MTO.PU: MTO.AD: MOV #STT,A + JSR PC,STXPND ;STATIC AREA EXPAND + +MTO.RM: MOV A,STT ;A WAS SET IN STXPND + MOV #DSTOP,(A) ;DISPLAY JUMP TO TURTLE +MTO.R1: BIC #176000,D ;IN CASE EITHER DX OR DY WERE NEGATIVE + BIC #176000,E ;CLEAR THE TOP 6 BITS + BIS #ADDY,E ;TURN E INTO ADDY COMMAND + MOV E,-(A) ;STORE IN DLIST + BIS #ADDX,D ;TURN D INTO ADDX COMMAND + MOV D,-(A) ;STORE IN DLIST + RTS PC + + + + ;ROUNDS FA AND FB +ROUND: ADDF #40000,FA ;FA <- FA + 1/2 + STCFI FA,-(P) ;INTEGERIZE FA + LDCIF (P)+,FA ;FA <- INTEGER (FA) + CFCC ;IS FA > 0? + BGE .+6 ;YES + SUBF #40200,FA ;FA <- FA - 1 (TO ROUND AWAY FROM 0) + ADDF #40000,FB ;REPEAT SAME PROCESS FOR FB + STCFI FB,-(P) + LDCIF (P)+,FB + CFCC + BGE .+6 + SUBF #40200,FB + RTS PC + ;CHECK THE NUMBER IN FD. +; SEZ IF IN BOUNDS. CLZ IF OUT OF BOUNDS +CHKBND: ABSF FD + CMPF WALLT,FD + CFCC + BLT ERROOB ;YES, ERROR +CBRND: SEZ + RTS PC +ERROOB: CLZ + RTS PC + +;STATIC AREA EXPAND. +; IS THERE ROOM IN STATIC AREA FOR 2 DISPLAY WORDS? +; RETURN POINTER TO NEW STATIC TOP IN A +STXPND: MOV (A),A ;ROUTINE IS CALLED WITH ADDRESS OF VARIABLE + CMP (A)+,(A)+ ;A _ A+4 + CMP A,DYB ;COMPARE A WITH DYNAMIC BOTTOM + BLO STXPN8 ;THERE'S ROOM! + BPT +STXPN8: RTS PC + +;SIN AND COSINE FUNCTIONS +SINDEG: MOV #-1,A + BR TRIG +COSDEG: MOV #1,A +TRIG: MOV #1,B + TSTF FA + CFCC + BGE TRIG1 + NEGF FA + MUL A,B +TRIG1: DIVF #41464,FA ;DIVIDE BY 45 + MODD #40200,FA ;SEPERATE FRACTION AND INTEGER + MODD #37400,FB + MULF #41000,FB ;MOD 8 + STCFI FB,C + ASL C + ADD C,PC + BR .TRIG0 + BR .TRIG1 + BR .TRIG2 + BR .TRIG3 + BR .TRIG4 + BR .TRIG5 + BR .TRIG6 + MUL A,B + BR .TRIG7 +.TRIG6: MUL A,B + NEG A + BR .TRIG0 +.TRIG4: NEG B + BR .TRIG0 +.TRIG3: NEG B + MUL A,B + BR .TRIG7 +.TRIG2: NEG A + MUL A,B + BR .TRIG0 +.TRIG5: NEG B +.TRIG1: NEG A +.TRIG7: SUBF #40200,FA ;WE WANT 45 - ANGLE + NEGF FA +.TRIG0: MULF PI,FA + MULF #37600,FA ;CONVERT FROM DEGREES TO RADIANS + LDD FA,FD + MULF FD,FD + NEGF FD ;-ANGLE SQUARED INTO FD + LDCFD #40200,FB ;COUNTING CONSTANT "1" + STF FB,FF + TST A + BLT .TRIG9 ;WE WANT SIN + LDD FB,FA + CLRF FB +.TRIG9: LDD FA,FC + TSTF FD + CFCC + BEQ TRIG11 +TRIG10: ADDF FF,FB + DIVF FB,FC + ADDF FF,FB + DIVF FB,FC + MULF FD,FC + ADDF FC,FA + CMPF #41100,FB + CFCC + BGE TRIG10 +TRIG11: TST B + BGE .+4 + NEGF FA + RTS PC + + + +;XYDIR +; CALL WITH D=DX, E=DY +; CALCULATE DIREC BASED ON DX AND DY +XYDIR: CLR A ;BUILD INDEX IN A + TST D ;IS DX POSITIVE + BGE XYDIR1 + NEG D ;ABSOLUTE VALUE OF DX + TST (A)+ ;PUT 2 INTO A +XYDIR1: TST E ;IS DY POSITIVE + BGE XYDIR2 + NEG E ;ABSOLUTE VALUE OF DY + INC A ;INCREMENT INDEX +XYDIR2: CMP D,E ;WILL GENERATE CARRY IF D* ;PDL AREA FOR OUR DISPLAYS + +;DISPLAY LISTS FOR DIGITS + +DIG.0: 145775 + 150017 + 55400 + 70400 + 55000 + 70400 + 54400 + 71000 + 54400 + 71000 + 64401 + 72004 + 40400 + 71000 + 40400 + 70400 + 41000 + 70400 + 40000 + 42400 + 44400 + 40400 + 45406 + 40400 + 47400 + 54400 + 44400 + 51003 + 54400 + 44400 + 54000 + 55000 + 150013 + 144003 + DPOPJ + +DIG.1: 150001 + 144010 + 45407 + 54000 + 54000 + 57000 + 72000 + 44000 + 44400 + 150013 + 144013 + DPOPJ + + +DIG.2: 150000 + 144004 + 41400 + 44400 + 40400 + 44400 + 40400 + 44400 + 40400 + 45400 + 40400 + 44400 + 54400 + 45400 + 54400 + 44400 + 54400 + 44400 + 54400 + 44400 + 57000 + 64377 + 66437 + 44000 + 46400 + 150011 + 144014 + DPOPJ + +DIG.3: 150004 + 145775 + 55400 + 44400 + 54400 + 44400 + 54400 + 44400 + 54400 + 45400 + 54400 + 44400 + 40400 + 45400 + 40400 + 44400 + 40400 + 44400 + 40400 + 44400 + 41400 + 72425 + 46425 + 42400 + 70400 + 40400 + 70400 + 40400 + 73400 + 5440 + 70400 + 64401 + 54400 + 70400 + 55000 + 70400 + 150025 + 145772 + DPOPJ + +DIG.4: 150014 + 144014 + 54000 + 54000 + 40000 + 42000 + 47000 + 70000 + 70000 + 71000 + 40255 + 41001 + 150030 + 145766 + DPOPJ + +DIG.5: 144013 + 44000 + 45400 + 70000 + 71400 + 54000 + 55400 + 40400 + 44100 + 54400 + 44400 + 54400 + 44400 + 54400 + 44400 + 57000 + 70400 + 55000 + 71000 + 54400 + 71000 + 54400 + 71400 + 40400 + 71000 + 40400 + 70400 + 40400 + 70400 + 41000 + 150027 + 144005 + DPOPJ + +DIG.6: 150014 + 144007 + 41000 + 70401 + 40400 + 70400 + 40400 + 73020 + 64401 + 70400 + 54400 + 70400 + 54400 + 64401 + 54000 + 56400 + 44400 + 55000 + 44400 + 54400 + 45000 + 54400 + 46000 + 40400 + 45000 + 40400 + 44400 + 41000 + 44400 + 42000 + 70401 + 40400 + 70400 + 40400 + 73020 + 64401 + 70400 + 54400 + 70400 + 54400 + 64401 + 55000 + 150023 + 144004 + DPOPJ + +DIG.7: 150000 + 144011 + 41400 + 44000 + 44000 + 60125 + 60112 + 63052 + 150027 + 144013 + DPOPJ + +DIG.8: 144001 + 150005 + 45000 + 40400 + 45000 + 41000 + 44400 + 42000 + 70400 + 41000 + 71000 + 40400 + 72000 + 54400 + 71000 + 55000 + 70400 + 56000 + 44400 + 55000 + 45000 + 54400 + 46000 + 54400 + 45400 + 56000 + 44400 + 54400 + 70400 + 55400 + 70400 + 54400 + 71000 + 54400 + 72000 + 40400 + 71000 + 40400 + 70400 + 40000 + 45400 + 40400 + 45000 + 150012 + 144000 + DPOPJ + +DIG.9: 144006 + 150011 + 41400 + 70400 + 40400 + 70400 + 40400 + 70400 + 40400 + 73000 + 55000 + 71000 + 54400 + 70400 + 56400 + 44400 + 55000 + 45000 + 54400 + 44400 + 54400 + 46000 + 40400 + 45000 + 40400 + 44400 + 40400 + 44400 + 41400 + 60104 + 60210 + 61002 + 150017 + 144016 + DPOPJ + +DLIST: DSTOP ;THE START OF THE DISPLAY LIST + + .=.+6000 + +DISEND: +PATCH: +PAT: + .END START + \ No newline at end of file