From db31c5060f259fb4ad5bb9e83a4e9c35ce941004 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Tue, 22 Jan 2019 21:32:22 +0100 Subject: [PATCH] CRASH - Imlac game. --- build/misc.tcl | 8 + doc/programs.md | 1 + src/imsrc/crash.9 | 698 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 707 insertions(+) create mode 100644 src/imsrc/crash.9 diff --git a/build/misc.tcl b/build/misc.tcl index 1c3c48fe..771a3dc1 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -1182,6 +1182,14 @@ respond "@" "imlac; pong iml_imlac; pong bin\r" respond "@" "\032" type ":kill\r" +# CRASH +respond "*" ":midas imlac;_imsrc; crash\r" +expect ":KILL" +respond "*" ":imtran\r" +respond "@" "imlac; crash iml_imlac; crash bin\r" +respond "@" "\032" +type ":kill\r" + # KLH's Knight TV clock. respond "*" ":midas klh; ts tinyw_klh; clock\r" respond "=" "1\r" diff --git a/doc/programs.md b/doc/programs.md index 7b802fc7..1c8eccf2 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -61,6 +61,7 @@ - COOKIE BEAR, prank. - CMD, DDT subroutines. - CRC, compute file CRC. +- CRASH, Imlac game? - CREATE, creates a text file in your home directory from console input. - CROCK, analog watch. - CROSS, cross assembler for micros. diff --git a/src/imsrc/crash.9 b/src/imsrc/crash.9 new file mode 100644 index 00000000..32328d67 --- /dev/null +++ b/src/imsrc/crash.9 @@ -0,0 +1,698 @@ +TITLE CRASH +PDS4=1 +MAXADR=37777 +.INSRT IMLAC;IMDEFS > +.INSRT IMLAC;DISFIX > +.ADDR.=1 + +DEFINE INFORM A,B,C,D,E + PRINTX\A!B!C!D!E +\ +TERMIN + + LOC 30000 + JMP BEGIN + JMP START + + LOC 30030 + +BEGIN: RCF + JMS RESET + JMP START + +RESET: 0 + LAC NUMTAB+11. + DAC NUM1 + DAC NUM2 + DAC NUM3 + LAC NUMTAB+3 + DAC NUM4 + LAC ABSLEVEL + DAC LEVEL + LAC [22600] + DAC HIGHT + LAC [600] + DAC FUEL + CLA + DAC SP + DAC VEL + DAC UP + LWC 3 + DAC GSUB + COA + DAC IGNORE + LWC 40. + DAC TIME + LAC AFC + DAC DF + LAC CJ + DAC CRACKL + LAC [DGD] + DAC SHPFOO + JMP @RESET + +START: ISZ RANDN + NOP + JMS DISP1 + KSF + JMP START + CAL + KRC + AND [1377] + JMS KEYCHK + JMP START + +KEYCHK: 0 + SAD CR2 + JMP .+3 + SAM CR + JMP COMDV + JMS RESET + JMP @KEYCHK + +COMDV: SAD DV2 + JMP .+3 + SAM DV + JMP COMUV + STA + ADD UP + ASP + CLA + DAC UP + JMP @KEYCHK + +COMUV: SAD UV2 + JMP .+3 + SAM UV + JMP COMHOME + COA + SAM IGNORE + JMP @KEYCHK + ISZ UP + JMP @KEYCHK + +COMHOME:SAD HOME2 + JMP @[100] + SAM HOME + JMP COMLH + JMP @[100] + +COMLH: SAD LH2 + JMP .+3 + SAM LH + JMP COML + LAC IGNORE + ASN + JMP @KEYCHK + LAW 3 + DAC UP + JMP @KEYCHK + +COML: SAD CL2 + JMP .+3 + SAM CL + JMP COMF + LAC CJ + SAM CRACKL + JMP @KEYCHK + LAC FUEL + ASN + JMP @KEYCHK + COA + DAC IGNORE + DAC SP + LWC 3 + DAC GSUB + JMP @KEYCHK + +COMF: SAD FF2 + JMP .+3 + SAM FF + JMP COMNUMS + LAW 200. + ADD FUEL + DAC TEMP + AND [3777] + SAM TEMP + JMP @KEYCHK + LAC TEMP + DAC FUEL + JMP @KEYCHK + +COMNUMS:DAC TEMP + AND [200] + ASZ + JMP IMKBD + LAC TEMP + ADD [257] + DAC TEMP + SUB [272] + ASZ + JMP IMKBD + LAC [260] + DAC TEMP +IMKBD: LAC TEMP + SUB F260 + ASP + JMP @KEYCHK + SUB [10.] + ASM + JMP @KEYCHK + LAC TEMP + SUB F260 + DAC ABSLEVEL + JMP @KEYCHK + +F260: 260 +TEMP: 0 +SP: 0 +HTEMP: 0 +ELJ: DJMP SHPFOO +ABSLEVEL: 2 +UP: 0 +FUEL: 1000 +IGNORE: 1 +N1: 0 +N2: 0 +N3: 0 +N4: 0 +LEVEL: 2 +RANDN: 0 + +NUMTAB: .+1 + DJMS RTN0 + DJMS RTN1 + DJMS RTN2 + DJMS RTN3 + DJMS RTN4 + DJMS RTN5 + DJMS RTN6 + DJMS RTN7 + DJMS RTN8 + DJMS RTN9 + DJMS RTNBLANK + +VEL: 0 +GSUB: -3 +TIME: -20. +DNOPER: DNOP +AFC: DJMP AFCL +CJ: DJMP DF +HOME: 1372 ;CTRL-Z EXITS PROGRAM +UV: 206 +DV: 204 +LH: 210 +CL: 354 +FF: 346 +CR: 215 +HOME2: 20 +UV2: 42 +DV2: 43 +LH2: 41 +CL2: 57 +FF2: 52 +CR2: 62 + +FNDLVI: 0 + LAC XVAL + AND [1777] + DAC INST1 + LAC XVAL + ASM + JMP FNDLV1 + CIA + AND [1777] + IOR [2000] + DAC INST1 +FNDLV1: LAC YVAL + AND [1777] + DAC INST2 + LAC YVAL + ASM + JMP FNDLV2 + CIA + AND [1777] + IOR [2000] + DAC INST2 +FNDLV2: LAC INST1 + AND [1777] + DAC XVAL + LAC INST2 + AND [1777] + DAC YVAL + LAC XVAL + SUB YVAL + ASM + JMP FNDLV3 + LAC INST1 + IOR [14000] ; Y > X, BEAM ON + XAM INST2 + IOR [40000] + DAC INST1 + JMP @FNDLVI +FNDLV3: LAC INST1 + IOR [40000] + DAC INST1 + LAC INST2 + IOR [10000] ; BEAM ON, Y <,= X + DAC INST2 + JMP @FNDLVI + +XVAL: 0 +YVAL: 0 +INST1: 0 +INST2: 0 + +DISP1: 0 + DSF + SSF + JMP @DISP1 + SCF + LAC DS1 + DLA + DON + LAC LEVEL + ASZ + JMP INAIR + LAC DNOPER + DAC ELINE + JMP AELCHK +INAIR: LAC ELJ + DAC ELINE +AELCHK: LAC VEL + ADD HIGHT + DAC HTEMP + CLA + SAM LEVEL + JMP LCHKS + LAC HTEMP + SUB [20220] + ASM + JMP LCHKS + LAC [20217] + DAC HIGHT + COA + SAM SP + JMP NOSP + CLA + DAC VEL + JMP NUMSE2 +NOSP: CLA + DAC IGNORE + DAC UP + DAC GSUB + XAM VEL + ASP + CIA + AND [177774] + ASN + JMP NUMSE2 + AND [177760] + ASZ + JMP EXPLD + LAC DNOPER + DAC CRACKL + JMP NUMSE2 + +LCHKS: CLA + DAC SP + LAC HTEMP + SUB [23612] + ASP + JMP BCHK + ISZ LEVEL + LAC [20120] + DAC HTEMP + JMP NUMS +BCHK: LAC HTEMP + SUB [20120] + ASM + JMP NUMS + STA + ADD LEVEL + DAC LEVEL + LAC [23612] + DAC HTEMP +NUMS: LAC HTEMP + DAC HIGHT +NUMSE2: CLA + DAC N1 + DAC N2 + DAC N3 + DAC N4 + LAC LEVEL + AND [17777] +LP1: SUB [1000.] + ASP + JMP NN2 + ISZ N1 + JMP LP1 +NN2: ADD [1000.] +LP2: SUB [100.] + ASP + JMP NN3 + ISZ N2 + JMP LP2 +NN3: ADD [100.] +LP3: SUB [10.] + ASP + JMP NN4 + ISZ N3 + JMP LP3 +NN4: ADD [10.] + ADD NUMTAB + DAC N4 + LAC @N4 + DAC NUM4 + CLA + SAM N1 + JMP LASTNS + LAW 10. + DAC N1 + CLA + SAM N2 + JMP LASTNS + LAW 10. + DAC N2 + CLA + SAM N3 + JMP LASTNS + LAW 10. + DAC N3 + +LASTNS: LAC N1 + ADD NUMTAB + DAC N1 + LAC @N1 + DAC NUM1 + LAC N2 + ADD NUMTAB + DAC N2 + LAC @N2 + DAC NUM2 + LAC N3 + ADD NUMTAB + DAC N3 + LAC @N3 + DAC NUM3 +NOHIT: ISZ TIME + JMP @DISP1 + LWC 5 + DAC TIME + LAC GSUB + ADD VEL + ADD UP + DAC VEL + LAC FUEL + SUB UP + DAC FUEL + ASM + JMP STILLF + CLA + DAC UP + DAC SP + DAC IGNORE + DAC FUEL +NOF: LAC AFC + DAC DF + JMP @DISP1 +STILLF: LAC FUEL + DAC YVAL + JMS FNDLVI + LAC INST1 + DAC L + LAC INST2 + DAC L+1 + LAC UP + SAL 2 + CIA + ASN + JMP NOF + DAC YVAL + JMS FNDLVI + LAC INST1 + DAC DF + LAC INST2 + DAC DF+1 + JMP @DISP1 + +RTN0: DDSP + INC E,D20 + INC B0M2,BM1M1 + INC BM20,BM11 + INC B02,B02 + INC B11,B20 + INC B1M1,B0M2 + INC D20,D30 + INC D00,X + +RTN1: INC E,DM21 + INC B22,B0M3 + INC B0M3,DM20 + INC B20,B20 + INC D03,D20 + INC D30,X + +RTN2: INC E,DM21 + INC B12,B20 + INC B1M2,BM2M2 + INC BM2M2,B20 + INC B20,D03 + INC D20,D20 + INC D10,X + +RTN3: INC E,DM23 + INC B30,B1M1 + INC BM1M2,BM30 + INC D0M3,B30 + INC B11,BM12 + INC D10,D30 + INC D20,X + +RTN4: INC E,D1M3 + INC B03,B03 + INC BM3M3,B20 + INC B20,D20 + INC D30,X + +RTN5: INC E,DM2M3 + INC B30,B11 + INC B01,BM11 + INC BM20,B03 + INC B30,D0M3 + INC D10,D20 + INC D20,X + +RTN6: INC E,DM2M1 + INC B21,B2M1 + INC B0M1,BM1M1 + INC BM20,BM11 + INC B03,B22 + INC B10,B1M1 + INC D0M2,D20 + INC D30,X + +RTN7: INC E,DM23 + INC B20,B20 + INC BM1M3,BM1M3 + INC D23,D20 + INC D30,X + +RTN8: INC E,B2M1 + INC B0M1,BM1M1 + INC BM20,BM11 + INC B01,B21 + INC B21,BM12 + INC BM20,BM1M2 + INC B2M1,D20 + INC D10,D20 + INC D20,X + +RTN9: INC E,D0M3 + INC B23,BM20 + INC BM11,B01 + INC B11,B20 + INC B0M3,D20 + INC D30,X + +RTNBLANK: INC E,D20 + INC D20,D20 + INC D10,X + +RANDOM: 0 ;RANDOM NUMBER GEN. + LAC RANDN + RAL 2 + XOR RANDN + ASM + ADD [3] + DAC RANDN + JMP @RANDOM + +NBITS==30. ;NUMBER OF PIECES WHEN IT EXPLODES. + +BITS: REPEAT NBITS, DBITS+<.RPCNT*7> + +DBITS: REPEAT NBITS,[ + 0 ;X VELOCITY + 0 ;Y VELOCITY + DGD ;DJMP TO HERE + DLYA 0 ;Y POSITION + DLXA 0 ;X POSITION + DJMS CHUNK ;DRAW THE FROB +IFE .RPCNT, DJMP AFCL-1 ;JUMP BACK INTO REGULAR CODE +IFN .RPCNT, DJMP .-4-7 ;JUMP TO PREVIOUS BIT +] + +BIT1=.-1-4 ;WHERE TO DJMP TO TO START THINGS. + +CHUNK: INC E,B23 + INC BM32,BM2M3 + INC B3M2,X + + +EXPLD: ;HAVE HIT HARD, DRAW EXPLOSION. + + LWC NBITS + DAC CTR1' + LAC [BITS-1] + DAC 10 +EXPLD1: STA + ADD @10 + DAC 11 + JMS RANDOM ;GET X-VELOCITY + AND [17] + ADD [4] + DAC TEMP + LAC 11 ;KLUDGE WHICH RELIES ON LENGTH=7 + RAR 1 + LAC TEMP + LSZ + CIA + DAC @11 ;STORE X-VELOCITY + JMS RANDOM ;GET Y-VELOCITY + AND [17] + ADD [8] + DAC @11 + LAC [DGD] ;THIS MAY HAVE BEEN PATCHED + DAC @11 + LAC HIGHT + DAC @11 ;Y-POS + LAC SHIPX + DAC @11 + + ISZ CTR1 + JMP EXPLD1 + + LWC 3*40. ;EXPLODE FOR 3 SECONDS + DAC TIME + LAC [DJMP BIT1,] + DAC SHPFOO ;PATCH INTO DISPLAY LIST + +EXPLDZ: ;KEEP DISPLAYING BITS AND ACCOUNT FOR VELOCITY + + DSF + SSF + JMP EXPLDZ + SCF + LAC DS1 + DLA + DON + + ISZ TIME + JMP .+2 ;MORE. + JMP BEGIN ;DONE, START NEW GAME. + + LWC NBITS + DAC CTR1 + LAC [BITS-1] + DAC 10 +EXPLDT: LAC @10 + DAC PNTR' + DAC CURBIT' + LAC @PNTR ;X-VELOCITY + DAC XVELOC' + ISZ PNTR + LAC @PNTR ;Y-VELOCITY + ISZ PNTR + ISZ PNTR + ADD @PNTR + DAC TEMP + SUB [023600] + ASM + JMP DISAPR ;WENT OFF TOP OF SCREEN + LAC TEMP + DAC @PNTR + ISZ PNTR + LAC XVELOC + ADD @PNTR + DAC TEMP + SUB [013600] + ASM + JMP DISAPR ;WENT OFF RIGHT SIDE OF SCREEN + ADD [3600] + ASP + JMP DISAPR ;WENT OFF LEFT SIDE OF SCREEN + LAC TEMP + DAC @PNTR +EXPLDN: ISZ CTR1 + JMP EXPLDT + JMP EXPLDZ + +DISAPR: ;THIS GUY DISAPPEARS + LAW 2 + ADD CURBIT + DAC TEMP ;-> DGD + ADD [4] ;-> DJMP + DAC PNTR + LAC @PNTR ;PICK UP HIS DJMP + DAC @TEMP ;CLOBBER HIS DGD (PATCH THIS BIT OUT) + JMP EXPLDN + +VARIABLES +CONSTANTS + +DS1: .+1 + DSTS 3 + DADR + DSTB 3 + DGD + DLXA 1600 + DLYA 1710 +NUM1: DJMS RTNBLANK +NUM2: DJMS RTNBLANK +NUM3: DJMS RTNBLANK +NUM4: DJMS RTN0 + DSTS 1 + DGD + DLXA 0 + DLYA 100 +ELINE: DJMP SHPFOO + DLV B,1777,0 +SHPFOO: DGD +SHIPX: DLXA 1000 +HIGHT: DLYA 1300 + DLV B,20,-10 + DLV B,-20,100 + DLV B,-20,-100 + DLV B,20,10 +CRACKL: DJMP DF + DLV X,-5,15 + DLV X,-5,5 + DLV X,10,10 + DLV X,-3,10 + DLV D,5,-25 +DF: DLV D,0,-1 + DGD +AFCL: DLXA 1700 + DLYA 200 + DLV B,40,0 + DLV D,-20,0 +L: DLV B,0,1000 + DLV D,-20,0 + DLV B,40,0 + DHLT + +IF2 INFORM PROGRAM BREAK IS ,\. + + END BEGIN + \ No newline at end of file