From 44e74a7f2bea117d79759d43cbf6c920e83989b3 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 18 Apr 2022 17:57:12 +0200 Subject: [PATCH] Nova programs. NOVCON .008 has an assembler error: NOROOM+5 17011 0 1 19 TMC 4357 TMC supposedly means Too Many Constants. --- build/misc.tcl | 30 + build/timestamps.txt | 8 + src/nova/_lodee.0_11 | Bin 0 -> 4958 bytes src/nova/debug.1 | 1081 +++++++++++++++++++++++++++++ src/nova/displa.51 | 1554 ++++++++++++++++++++++++++++++++++++++++++ src/nova/ndtest.1 | Bin 0 -> 6308 bytes src/nova/novcon._008 | Bin 0 -> 4965 bytes src/nova/novten.1 | 141 ++++ src/nova/pnovcn.1 | 153 +++++ src/nova/time.machin | 1239 +++++++++++++++++++++++++++++++++ 10 files changed, 4206 insertions(+) create mode 100755 src/nova/_lodee.0_11 create mode 100755 src/nova/debug.1 create mode 100755 src/nova/displa.51 create mode 100755 src/nova/ndtest.1 create mode 100755 src/nova/novcon._008 create mode 100755 src/nova/novten.1 create mode 100755 src/nova/pnovcn.1 create mode 100644 src/nova/time.machin diff --git a/build/misc.tcl b/build/misc.tcl index e72b3a83..16c53501 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -1660,6 +1660,36 @@ expect "MIDAS" respond "\n" "TS NVMIDS_NVMIDS >\r" expect ":KILL" +# Nova programs. +respond "*" ":nvmids\r" +expect "NVMDS" +respond "\n" ".LODEE\r" +expect ":KILL" +respond "*" ":nvmids\r" +expect "NVMDS" +respond "\n" "DEBUG\r" +expect ":KILL" +respond "*" ":nvmids\r" +expect "NVMDS" +respond "\n" "DISPLA\r" +expect ":KILL" +respond "*" ":nvmids\r" +expect "NVMDS" +respond "\n" "NDTEST\r" +expect ":KILL" +respond "*" ":nvmids\r" +expect "NVMDS" +respond "\n" "NOVTEN\r" +expect ":KILL" +respond "*" ":nvmids\r" +expect "NVMDS" +respond "\n" "PNOVCN\r" +expect ":KILL" +respond "*" ":nvmids\r" +expect "NVMDS" +respond "\n" "TIME MACHIN\r" +expect ":KILL" + # 11LOGO respond "*" ":cwd 11logo\r" respond "*" ":plx143 /H/M/CL BIN,N CREF_SYSTEM,TYI,READ,EVAL,TURTLE,ZEND\r" diff --git a/build/timestamps.txt b/build/timestamps.txt index 828b4b5a..c790dc81 100644 --- a/build/timestamps.txt +++ b/build/timestamps.txt @@ -1600,6 +1600,14 @@ nilcom/thread.8 198109291240.03 nilcom/vsaid.57 198002230700.52 nilcom/yesnop.44 198109011735.21 nova/-read-.-this- 197609090702.48 +nova/_lodee.0_11 197103061932.19 +nova/debug.1 197312212120.12 +nova/displa.51 197112071936.51 +nova/ndtest.1 197404151501.40 +nova/novcon._008 197103061932.19 +nova/novten.1 197308282059.02 +nova/pnovcn.1 197503090320.44 +nova/time.machin 197107061413.42 paulw/algfac.45 198106280247.18 paulw/csimp2.63 198107070349.35 paulw/csimp.299 198106301657.28 diff --git a/src/nova/_lodee.0_11 b/src/nova/_lodee.0_11 new file mode 100755 index 0000000000000000000000000000000000000000..84b1880bffa370a87aaf2fdba4add40e90dad207 GIT binary patch literal 4958 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 + JMP GETEN5 ;NO--READ NEXT + JMP GETEN3 ;YES--ALL READ +GETEN7: SUBZL B,B + STA B,GETFL ;SET FAIL FLAG AND LEAVE + JMP @CCLOCK +GETC: 0 +GETC1: 0 + +;MOVE TO-- +;UNPACK COORDINATES, AND IF PEN IS +;DOWN, DRAW LINE AND INSERT IN LIST +;OF LISTS FOR APPROPRIATE TIME + +MVTO: SUB C,C ;UNPACK XY COORDS + JSR NPK1 + LDA C,[1777] + AND C,A + AND C,B + STA A,XT + STA B,YT + LDA C,SHIPFL + MOV% C,C(SZR) ;ARE WE SHIPPING? + JMP MVTO2 ;YES + + LDA C,CURX + LDA D,CURY + STA A,CURX ;CHANGE CURRENT X,Y + STA B,CURY + STA C,XF + STA D,YF + LDA B,STIME + MOV% B,B(SNR) ;PENUP? + JMP MVTO1 + + JSR @CDRAW ;NO, DRAW LINE + LDA A,DRLEN + LDA B,CDROUT ;ADDR TO B + SUB C,C ;LISTAD SHOULD BE ZERO + STA C,LISTAD + JSR @CINST ;INSERT IN DISPLAY LIST AREA +MVTO1: JSR @CPTUP ;UPDATE POINTER + JMP @CONTIN + +MVTO2: JSR @CDRAAD ;ADD TO LIST + JMP @CONTIN + +CPTUP: PTUP + + +;UNPACK-- +;UNPACK COORDINATES FROM TEN FOR MVTO & PTAT + +NPK1: LDA A,GETWD(C) + LDA B,[17] + AND B,A + MOVS A,A + LDA B,GETWD+1(C) + ADD B,A + MOVZR A,A + MOVZR A,A + STA A,NPKA + LDA A,GETWD+1(C) + LDA B,[3] + AND B,A + MOVS A,A + LDA B,GETWD+2(C) + ADD A,B + LDA A,NPKA + JMP 0(D) +NPKA: 0 +PX: 0 +PY: 0 +PXP: 0 +PYP: 0 +PXPP: 0 +PYPP: 0 + + +;POINTER AT-- +;POINTER LOCATION NAMED BY THREE VERTICES +;UNPACK COORDINATES AND +;COMPILE DISPLAY LIST FOR POINTER + +PTAT: SUB C,C ;UNPACK X,Y + JSR NPK1 + STA A,PX + STA B,PY + LDA A,GETWD+3 ;UNPACK X',Y' + MOVZL A,A + MOVZL A,A + LDA C,[6] + STA C,CTEMP + LDA B,GETWD+4 + MOVZR B,B + DSZ CTEMP + JMP .-2 + ADD B,A + STA A,PXP + LDA A,GETWD+4 + LDA C,[77] + AND C,A + LDA B,GETWD+5 + LDA C,[4] + STA C,CTEMP + MOVZL A,A + MOVZR B,B + DSZ CTEMP + JMP .-3 + ADD B,A + STA A,PYP + LDA C,[5] ;UNPACK X'',Y'' + JSR NPK1 + STA A,PXPP + STA B,PYPP + +;FALLS THROUGH + + +;FALLS IN + +PTATA: JSR @CSSHIP ;START APPENDING + LDA A,CURX ;DRAW FROM (CURX, CURY) + LDA B,CURY + STA A,XF + STA B,YF + LDA A,PXP ;TO (PXP, PYP) + LDA B,PYP + JSR ADR + LDA A,PXPP ;TO (PXPP, PYPP) + LDA B,PYPP + JSR ADR + LDA A,PX ;TO (PX, PY) + LDA B,PY + JSR ADR + LDA A,CURX ;TO (CURX, CURY) + LDA B,CURY + JSR ADR + +PTAT2: JSR @CEESHI ;TERMINATE LIST + LDA A,DRLEN + LDA B,CDROUT + LDA C,CPTBUF + JSR XFER ;TRANSFER LIST FROM DROUT TO PTBUF + + LDA A,CURX ;CHANGE XF AND YF TO CURRENT POS + LDA B,CURY + STA A,XF + STA B,YF + JSR PTUP1 + JMP @CONTIN + +ADR: STA A,XT ;(CALLED WITH JSR) + STA B,YT + JMP @CDRAAD + + +;POINTER UP-- +;UPDATE POINTER TO (CURX, CURY) + +PTUP: LDA A,CURX + LDA B,CURY +PTUP1: SUBZR C,C + ADD C,A ;POINT MODE X + LDA C,[120000] + ADD C,B ;POINT MODE Y + LDA C,CPTBUF + STA A,2(C) ;STORE AT TOP OF POINTER DISPLAY LIST + STA B,3(C) + JMP 0(D) + + +;TRANSFER-- +;BLT LENGTH A FROM B TO C + +XFER: STA D,XFERR + STA A,.+4 + STA B,.+4 + STA C,.+4 + JSR @CBLT + 0 ;LENGTH + 0 ;SOURCE ADDRR + 0 ;DEST ADDR + JSR @XFERR + +XFERR: 0 + + +;BLOCK TRANSFER-- +;TRANFER BLOCK 0(D) OF LENGTH 1(D) TO +;2(D) + +BLT: DSZ 1(D) + LDA A,1(D) + STA A,20 + DSZ 2(D) + LDA A,2(D) + STA A,21 +BLT1: LDA A,@20 + STA A,@21 + DSZ 0(D) + JMP BLT1 + JMP 3(D) + + +;PENDOWN-- +;IF TIME NAMED BY 10 IS 7777 MAKE STIME -1 (INFINITY) +;OTHERWISE MAKE STIME TIME NAMED BY PDP10 + +PDWN: LDA C,[17] + LDA A,GETWD + AND C,A + MOVS A,A + LDA B,GETWD+1 + ADD B,A + LDA B,[7777] ;N=INFINITY? + LDA C,SHIPFL + MOV% C,C(SZR) + JMP PDWN1 + + SUB% A,B(SNR) + LDA A,[-1] + STA A,STIME + JMP @CONTIN + +PDWN1: SUB% A,B(SZR) ;PENDOWN? + SUB C,C ;YES--(IF PDWN SBMFL=1, ELSE =0) + STA C,SBMFL + JMP @CONTIN + + +;HIDE-- +;TURN ON HIDE FLAG +;SHOW-- +;TURN OFF HIDE FLAG + +SHOW: SUB A,A(SKP) +HIDE: SUBZL A,A + STA A,HDFLG + JMP @CONTIN + + +;DISPLAY-- +;DISPLAY DISPLAY LIST NAMED BY PDP-10 STARTING AT CURRENT LOCATION +;IN CURRENT PENDOWN MODE + +DST: LDA A,STIME + MOV% A,A(SNR) + JMP @CONTIN + JSR DLP ;DOES LIST WITH THAT NAME EXIST? + ;YES, AC2 POINTS TO NAME (IF NO, NEVER RETURNS) + LDA D,1(C) + STA D,LISTAD + JSR @CINST ;MOVETO CURRENT DISPLAY LIST AREA + JMP @CONTIN + +DSTLP: 0 ;LENGTH OF SOURCE LIST SAVE HERE + + + ;THIS SUBROUTINE SEARCHES FOR DISPLAY LIST IN ACTIVE DISPLAY LIST + ;AREA, WITH NAME THAT MATCHES NAME IN PDP-10 COMMAND +DLP: STA D,DSTLP ;SAVE RETURN ADDRESS + LDA A,GETWD+1 ;NAME OF DESIRED LIST + SUBZR B,B + ADD B,A ;STORED VERSION OF LIST NAME + LDA B,CBOT ;ADDRESS OF BOTTOM OF DISPLAY LIST BUFFER + LDA C,CTOP ;ADDRESS OF FRAME TIME OR LIST NAME + +DLP1: LDA D,0(C) ;TIME OR NAME + SUB% A,D(SNR) ;IS NAME DESIRED ONE? + + JMP @DSTLP ;YES, RETURN TO CALLING ROUTINE + + LDA D,[4] ;CHECK NEXT LIST + ADD D,C + ADCZ% B,C(SZC) ;HAVE ALL LISTS BEEN CHECKED? + JMP @CONTIN ;YES, IGNORE PDP-10 INSTRUCTION + JMP DLP1 ;NO, CONTINUE SEARCH + + + +;DISPLAY REMOVE-- +;REMOVE LIST SHIPPED FROM 10 FROM ACTIVE AREA +;REMOVE ALL REFERENCES TO LIST + +DREM: JSR DLP ;SEARCH FOR LIST WITH SAME NAME + ;SUCCESS, AC2 IS ADDRESS OF NAME + SUB A,A ;0 + STA A,0(C) ;MAKE FRAMES ZERO + + LDA D,1(C) ;ADDRESS OF DISPLAY LIST + STA D,PO + STA D,LISTAD + LDA B,0(D) + STA B,N + STA A,1(C) ;ZERO ADDRESS + + JSR @CREM ;REMOVES DISPLAY LIST + + LDA C,CTOP ;REMOVE ALL REFERENCES TO THIS LIST + LDA B,CBOT + LDA A,LISTAD +DREM3: LDA D,1(C) + SUB% A,D(SZR) + JMP DREM4 + SUB D,D + STA D,0(C) + STA D,1(C) + STA D,2(C) + STA D,3(C) +DREM4: LDA D,[4] + ADD D,C + ADCZ% B,C(SZC) + JMP @CONTIN + JMP DREM3 + + +;SHIP-- +;GET DISPLAY LIST INSTRUCTIONS FROM PDP10 +;TURN ON SHIP FLAG +;SAVE NAME OF LIST, INITIALIZE DRAW PARAMETERS + +SHIP: JSR @CSSHIP ;INITIALIZE DRAAD + LDA A,GETWD+1 + STA A,LISTN ;NAME OF LIST + + LDA A,CURX ;FIX TEMP X AND Y COORDS + LDA B,CURY + STA A,XF + STA B,YF + + JMP @CONTIN ;CONTINUE + +LISTN: 0 + +SSHIP: SUBZL A,A + STA A,SHIPFL ;SHIPFL=1 + STA A,SBMFL + SUB A,A + STA A,DBMFL ;DBMFL=0 + STA A,XDIR + STA A,YDIR + LDA B,CDROUT + STA B,20 ;AUTO-INC + STA A,@20 ;SPACE FOR NULL,X,Y + STA A,@20 + STA A,@20 + LDA A,[DRANEW] ;CODE MODE + STA A,DRASV ;MAKE DRAW THINK THIS IS LAST WORD COMPILED + JMP 0(D) + + +;END SHIP-- +;TURN OFF SHIP FLAG, STORE COMPILED LIST +;(COMPLEMENT BEAM IF NECESSARY TO LEAVE OFF) + + +ESHIP: LDA A,SHIPFL + MOV% A,A(SNR) + JMP @CONTIN ;IGNORE IF NOT SHIPPING + JSR @CEESHI ;FINISH UP LIST + +ESHIP1: LDA A,DRLEN ;LENGTH TO A + LDA B,CDROUT ;ADDRESS TO B + LDA C,LISTN ;NAME + + LDA D,STIME + STA D,LISTN ;SAVE STIME IN LISTN + + SUBZR D,D + ADD D,C ;STORED FORM OF NAME + STA C,STIME ;LIST NAME IN STIME + + SUB C,C ;BE SURE LISTAD IS ZERO + STA C,LISTAD + + JSR @CINST ;INSERT IN DL + LDA A,LISTN + STA A,STIME ;RESTORE CURRENT TIME + JMP @CONTIN + +EESHIP: SUB A,A + STA A,SHIPFL + + LDA A,DRASV ;LAST WORD COMPILED + STA D,DRARET ;DRAW RETURN ADDRESS + LDA C,DBMFL ;CURRENT STATE OF BEAM + MOV% C,C(SNR) ;COMPLEMENT BEAM? + JMP @ENCOMP ;NO + JMP @ECOMP ;YES + +ENCOMP: DRATR0 ;JUMP HERE IF BEAM ALREADY OFF +ECOMP: DRATRA ;JUMP HERE TO COMPLEMENT BEAM + + +;WIPE-- +;REMOVES ALL DISPLAY LISTS +;WITH POSITIVE OR INFINITE (-1) TIME LEFT + +WIPE: LDA C,CTOP2 + LDA B,CBOT + SUB A,A + +WIPE1: LDA A,[4] + ADD A,C + ADCZ% B,C(SZC) ;ARE WE AT BOTTOM OF LIST OF LISTS? + JMP @CONTIN ;YES + + LDA A,0(C) ;NO,GET TIME + MOV% A,A(SNR) + JMP WIPE1 + INCZL% A,A(SEZ) ;IS TIME -1 OR POSITIVE? + JMP WIPE1 ;NO,GET NEXT LIST + + SUB A,A ;YES, WIPE OUT + STA A,0(C) ;MAKE TIME ZERO + + LDA D,3(C) ;CHECK TO SEE IF THIS IS A REFERENCE + MOV% D,D(SNR) + JMP WIPE2 + STA A,1(C) ;ZERO OUT REFERENCE + STA A,2(C) + STA A,3(C) + JMP WIPE1 + +WIPE2: LDA D,1(C) + STA D,PO ;ARG FOR REM + LDA B,0(D) + STA B,N + STA C,WPTR ;SAVE POINTER + STA A,1(C) ;ZERO ADDRESS + JSR @CREM ;REMOVE LIST + + LDA B,CBOT ;RESTORE CBOT + LDA C,WPTR ;RESTORE POINTER + JMP WIPE1 + +WPTR: 0 + ;NEWFRAME--DECREMENT FRAME TIMES AND UPDATE DISPLAY LISTS + +NFRM: JSR @CFRAM + JMP @CONTIN + + +;CLOCK-- +;FIND NEXT ACTIVE LIST ANDJUMP TO DSO + +CLOCK: LDA A,CTOP2 + LDA B,CBOT ;CHECK FOR PKPTR + LDA C,PKPTR + JSR @CDLIM + + JSR DPICK + SUB A,A ;FAILî + STA A,DISAD ;SUCCEED + + LDA A,CTOP2 + LDA B,CBOT ;CHECK FOR PKPTR + LDA C,PKPTR + JSR @CDLIM + + JMP @CPKR + +CPKR: DSO + + +;DPICK-- +;PICK NEXT ACTIVE DISPLAY LIST + +DPICK: SUB A,A ;CLEAR FLAGS + STA A,DPFLG +DPICK1: LDA A,PKPTR + LDA B,[4] + ADD B,A + STA A,PKPTR + LDA B,CBOT + SUBZ% B,A(SNC) ;A>=B? + JMP DPICK2 ;NO + LDA A,CTOP2 + STA A,PKPTR + LDA B,DPFLG ;FLAG ON? + MOV% B,B(SZR) + JMP 0(D) ;YES + SUBZL B,B ;SET FLAG + STA B,DPFLG + LDA B,HDFLG ;DISPLAY POINTER? + MOV% B,B(SZR) + JMP DPICK1 ;NO + LDA A,CDISAD ;SUCCEED + JMP 1(D) +DPICK2: MOV A,C + LDA B,0(C) + MOV% B,B(SNR) + JMP DPICK1 + INCL% B,B(SZC) + JMP DPICK1 ;NOT A DISPLAY LIST + LDA B,2(C) + MOV% B,B(SNR) + JMP 1(D) + STA D,DPFLG ;SET UP REFERENCE + LDA D,1(C) + STA B,2(D) + LDA B,3(C) + STA B,3(D) + LDA D,DPFLG + JMP 1(D) ;RETURN TO SUCCESS +DPFLG: 0 + + +;INSERT-- +;INSERT BLOCK IN DISPLAY LIST +;THIS SUBROUTINE LOOKS FOR +;EMPTY BLOCKS IN DISPLAY LIST AREA +;WHICH ARE LARGE ENOUGH TO ACCOMODATE +;DISPLAY LIST. +;CALLED WITH THE DISPLAY LIST +;LENGTH IN INLEN, AND THE ADDRESS IN +;INADR + +INST: STA D,INRET + STA A,INLEN ;A CONTAINS LENGTH + STA B,INADR ;B CONTAINS ADDRESS + SUB B,B ;SWITCH OFF + LDA D,CBOT ;ADDR OF FINAL PSTN + LDA C,R ;PREVIOUS INSERTION + + + ;CHECK LIST OF DISPLAY LISTS (CTOP-CBOT) + ;FOR SOME SPOT WE CAN INSERT THE ADDRESS + ;AND TIME OF THE CURRENT LIST +INST0: LDA A,[4] ;FIND NEXT POSITION + ADD A,C + ADCZ% C,D(SZC) ;IS THIS FINAL PSTN IN LIST OF DISPLAY LISTS? + JMP INST1 ;NO, SEE IF WE CAN INSERT INFORMATION HERE + + MOV% B,B(SNR) ;YES--SWITCH ON? + ;HAVE WE BEEEN THROUGH LIST OF LISTS ONCE ALREADY? + JMP INST2 ;NO, SET SWITCH + + ERROR 1 ;TOO MANY LISTS!!! + +INST1: LDA A,0(C) ;FRAME TIME + MOV% A,A(SNR) ;IS IT ZERO? + JMP INST3 ;YES, USE THIS LOCATION + JMP INST0 ;NO, FIND NEXT POSITION + +INST2: INC B,B ;SET SWITCH + LDA C,CTOP ;MOVE BACK TO TOP OF LIST OF LISTS + JMP INST1 + + + ;INSERT TIME AND LENGTH IN PROPER + ;SPOT IN LIST OF DISPLAY LISTS + ;ACC C CONTAINS ADDRESS WHERE TIME + ;WILL BE INSERTED + ;FIRST, FIND SECOND FREE BLOCK + +INST3: STA C,R + LDA A,LISTAD + MOV% A,A(SNR) + JMP INST3A + LDA B,CURX ;CREATE REFERENCE + SUBZR A,A + ADD A,B + STA B,2(C) ;X COORDINATE + MOVZR A,A + MOVOR A,A + LDA B,CURY + ADD A,B + STA B,3(C) ;Y-COORDINATE + LDA B,STIME + STA B,0(C) + LDA B,LISTAD + STA B,1(C) ;ADDRESS REFERENCE + JMP @INRET + + +INST3A: LDA D,CROV ;ADDR OF ROVING POINTER TO DISPLAY LIST AREA + SUB B,B ;PUT SWITCH OFF (SWITCH WILL NOW BE USED + STA B,INSTS ;TO CHECK HOW MANY TIMES WE HAVE GONE + ;OVER DISPLAY LIST AREA) + + ;IN DISPLAY AREA, ROV IS POINTER TO + ;FIRST FREE BLOCK. THE FIRST ADDRESS + ;IN EACH BLOCK CONTAINS THE LENGTH OF THE + ;BLOCK, THE SECOND ADDRESS POINTS TO THE + ;NEXT FREE BLOCK. THE SECOND ADDRESS + ;OF THE LAST FREE BLOCK CONTAINS ZERO. + +;FALLS THROUGH + + +INST4: LDA C,1(D) ;ADDR OF NEXT FREE BLOCK + MOV% C,C(SZR) ;END OF DISPLAY AREA? + JMP INST5 ;NO, SEE IF BLOCK IS THE RIGHT LENGTH + + LDA B,INSTS + MOV% B,B(SNR) ;YES--SWITCH ALREADY ON? + ;HAVE WE BEEEN THROUGH DISPLAY AREA ONCE ALREADY? + JMP INST4A ;NO, PUT SWITCH ON + + ERROR 2 ;DISPLAY AREA FULL!!! + + ;PUT SWITCH ON, GO BACK TO TOP OF DSPL LIST AREA +INST4A: ISZ INSTS ;SWITCH ON + LDA D,CAVAIL ;PTR TO TOP OF LIST AREA + JMP INST4 + + + + ;FREE BLOCK FOUND + ;FIRST, SEE IF IT IS LONG ENOUGH TO ACCOMODATE + ;DISPLAY LIST. THEN SEE IF IT IS ONE LONGER THAN DISPLAY LIST. + ;IF SO DO NOT USE. IF IT EXACTLY EQUALS + ;DISPLAY LIST, FIX POINTER TO NEXT FREE BLOCK (EXCEPT + ;IF IT IS FIRST BLOCK. + + ;IS THIS LEGAL LOCATION? +INST5: STA D,INDST ;(DLB>LEGAL LOCS>DLT) + LDA A,CDLT + LDA B,CDLB + JSR @CDLIM + LDA D,INDST + + LDA A,0(C) ;LENGTH OF FREE BLOCK + LDA B,INLEN ;LENGTH TO BE INSERTED + SUBZ B,A(SZC) ;A0 ADD DX TO XF + SUBZL B,D + STA D,XF + + LDA A,YDIR ;SAME FOR YF + LDA D,YF + MOVZR D,D + MOV% A,A(SNR) + ADDZL C,D(SKP) + SUBZL C,D + STA D,YF + + LDA A,DRASV ;RECLAIM + +;FALLS THROUGH + +DRAW3: SUBZ% B,C(SZC) ;CALCULATE DY-DX + JMP DRAHZY ;DY .GE. DX + + MOV B,D ;DX>DY, B>D + MOV C,B ;PUT DX=S IN ACC D, DY=R IN ACC B + LDA C,DRAZ ;MAKE HRZ INSTRUCTION COUNT X + STA C,DRAHRZ + LDA C,DRAO + JMP DRAW4 + +DRAHZY: MOV C,D + LDA C,DRAO ;DY=S IN ACC D, DX=R IN ACC B + STA C,DRAHRZ ;MAKE HRZ INSTRUCTION COUNT Y + LDA C,DRAZ + +DRAW4: STA C,DRAHRZ+1 + STA D,DRACNT ;SET UP COUNTER + + LDA C,SHIPFL + MOV% C,C(SNR) ;SHIPPING? + JMP DRAW5 ;NO + + STA A,DRASV + MOV B,D ;SAVE B + LDA B,DRACNT + SUB A,A + LDA C,[7] + DIV ;C/(A_16 +B)=B REM A + + LDA A,20 + ADD A,B + INC B,B + INC B,B ;HIGHEST POSSIBLE ADDRESS + LDA A,[LOADER] ;ADDRES OF LOADER + SUBZ% A,B(SZC) ;LIST TOO LONG? + JMP DRAW6 ;YES + + MOV D,B ;NO, RESTORE B + LDA A,DRASV ;RECLAIM LAST INSTRUCTION OF LAST LIST + LDA D,DRACNT ;D + +DRAW5: MOV B,C ;R IN ACC C + JMP DRALP1 ;ENTER BASIC ASSEMBLING LOOP + +DRAW6: ERROR 3 ;LIST TOO LONG!!! + + +DRAT: 0 ;TEMP STORAGE +DRALP: ADD C,B ;BASIC ASSEMBLING LOOP + MOVL% A,A(SNC) ;SEE IF PACKED WORD IS FULL + JMP DRALP1 ;WORD NOT FULL + + STA A,@20 ;STORE OLD WORD + LDA A,20 + STA B,DRAT + LDA B,[LOADER] + SUBZ% B,A(SNC) + JMP DRALP0 + ERROR 4 + +DRALP0: LDA B,CDROUT ;SEE THAT STUFF IS >DROUT + SUBZ% A,B(SZC) + HALT + + LDA B,DRAT + LDA A,[DRANEW] ;START NEW WORD + +DRALP1: STA B,DRAT ;SAVE DR, ORIGINAL ENTRY TO LOOP + MOVZL B,B(SZC) ;2*DR + JMP DRAHRZ ;DR IS NEGATIVE + ADCZ% D,B(SNC) ;2*DR-S + JMP DRAHRZ ;2*DR.LE.S + + MOVOL A,A ;2*DR>S + MOVOL A,A ;DIAGONAL INSTRUCTION + LDA B,DRAT ;RESTORE DR + SUB D,B ;DR-S + JMP DRALP2 + +DRAHRZ: 0 ;HRZ INSTRUCTION FROM DRASO GOES HERE + 0 ;AND HERE + LDA B,DRAT ;RESTORE DR + +DRALP2: DSZ DRACNT ;SEE IF MORE INSTRUCTIONS ARE LEFT + JMP DRALP + +;FALLS THROUGH + + +;FALLS IN + +DRATR: LDA C,SHIPFL + MOV% C,C(SZR) ;SHIPPING? + JMP DRATR2 ;YES + +DRATRA: JSR DRBM ;BEAM OFF + +DRATR0: LDA B,[DRANEW] + SUB% A,B(SNR) ;IS WORD ONLY CODE MODE? + JMP DRATR1 + JSR DRALJ ;NO, LEFT JUSTIFY & STORE + +DRATR1: LDA B,20 ;CALCULATE LENGTH OF ASSEMBLED PROGRAM + LDA A,CDROUT + SUB A,B + INC B,B + STA B,@CDROUT + STA B,DRLEN ;SAVE LENGTH + JMP @DRARET ;RETURN TO CALLING PROGRAM + + +DRATR2: JSR DRAFU ;IS WORD FULL? + STA A,DRASV ;SAVE CURRENT WORD + JMP @DRARET ;RETURN + +DRARX: NEG B,B + ADD D,B +DRARX1: LDA D,XDIR + MOV% D,D(SZR) + JMP @DRAXR ;ALREADY COMPLEMENTED +DRARX2: JSR DRA4S ;MAKE ROOM FOR 4 BITS + ADDZL A,A ;COMPLEMENT X DEFLECTION COUNTER + MOVZL A,A + MOVOL A,A + LDA D,XDIR + COM D,D + STA D,XDIR + JSR DRAFU ;WORD FULL? + JMP @DRAXR + +DRAXR: DRAW2 + + +DRARY: SUB D,C(SKP) ;YT<0, SKIP NEXT INSTRUCTION +DRARY1: NEG C,C + LDA D,YDIR + MOV% D,D(SZR) + JMP @DRARYR ;Y DEFLECTION ALREADY COMPLEMENTED +DRARY2: JSR DRA4S ;MAKE ROOM FOR 4 BITS + ADDZL A,A ;COMPLEMENT Y DEFLECTION COUNTER +DRAO: MOVOL A,A ;INSTRUCTIONS GO TO DRAHRZ FROM HERE +DRAZ: MOVZL A,A ;AND HERE + LDA D,YDIR + COM D,D + STA D,YDIR + JSR DRAFU ;WORD FULL? + JMP @DRARYR + +DRARYR: DRAW2A + + +DRBM: STA D,DRBMR + JSR DRA4S ;SPACE FOR 4 BITS? + ADDZL A,A ;CHANGE BEAM + MOVOL A,A + MOVOL A,A + JSR DRAFU ;WORD FULL? + JMP @DRBMR + +DRBMR: 0 + +DRA4S: STA D,DRALJR ;SEE IF ROOM FOR 4 BITS + LDA D,[17_12.] + AND% D,A(SNR) + JMP @DRALJR ;YES, RETURN + JMP DRALJ1 + +DRALJ: STA D,DRALJR ;LEFT JUSTIFY +DRALJ1: MOVZL A,A(SNC) + JMP DRALJ1 + MOVR A,A + STA A,@20 + LDA A,[DRANEW] + JMP @DRALJR + +DRALJR: 0 + + +DRAFU: MOVL% A,A(SNC) ;WORD FULL? + JMP 0(D) ;NO + STA A,@20 ;YES, STORE + LDA A,[DRANEW] ;START NEW WORD + JMP 0(D) + +;IN QUEUE-- +;INSERT 8 BIT WORD INTO PDP10 QUEUE + +INQ: LDA C,RPQ ;INSERT IN PDP-10 QUEUE + LDA B,CPQBOT + SUBZ% B,C(SNC) ;IF AT BOTTOM + JMP INQ1 + LDA C,CPQTOP ;MOVE TO TOP + JMP .+2 +INQ1: INC C,C + LDA B,FPQ + SUB% B,C(SNR) + JMP INQ2 ;QUEUE OVERFLOW + + STA A,0(C) + STA C,RPQ + JMP 0(D) + +INQ2: HALT + JMP @CRESET + +;OUT QUEUE-- +;TAKE 8 BIT WORD FROM PDP10 QUEUE TO +;ACC A + +OUTQ: INTDS + LDA C,FPQ + LDA B,RPQ + SUB% B,C(SNR) ;IF FRONT = REAR Q EMPTY + JMP OUTQ2+1 + SUBZ% B,C(SNC) + JMP OUTQ1 + LDA C,CPQTOP + JMP .+2 +OUTQ1: INC C,C + LDA A,0(C) + STA C,FPQ + +OUTQ2: INC D,D + INTEN + JMP 0(D) + +CPQBOT: PQBOT +CPQTOP: PQTOP +RPQ: PQTOP +FPQ: PQTOP + + +;DELIMIT-- +;SUBROUTINE CHECKS THAT +;C IS WITHING LEGAL BOUNDS + +DLIM: ADCZ% C,A(SZC) ;IS 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 Je&z!L{sr~<3~~Sf literal 0 HcmV?d00001 diff --git a/src/nova/novten.1 b/src/nova/novten.1 new file mode 100755 index 00000000..0e4e8782 --- /dev/null +++ b/src/nova/novten.1 @@ -0,0 +1,141 @@ +TITLE TEN-NOVA TESTER + +TENI==6 +TENO==7 +;READ A CHAR FROM THE TEN +RTEN: SKPDN TENI + JMP .-1 + DIAS 0,TENI + JMP (3) + +;WRITE A CHAR TO THE TEN +WTEN: SKPBZ TENO + JMP .-1 + DOAS 0,TENO + JMP (3) + +;THIS ROUTINE JUST ECHOES +SECHO: IORST + INTDS +ECHO: JSR RTEN + JSR WTEN + JMP ECHO + + ;THIS ROUTINE SENDS CHARACTERS TO THE TEN AND EXPECTS +; THEM TO BE ECHOED. IT CHECKS THEM FOR ACCURACY. + +STEST: IORST ;I/O RESET + INTDS ;DISABLE INTEREUPTS + LDA 2,[ERRLST-1] + STA 2,21 + LDA 2,[CHRLST-1] + STA 2,20 + LDA 0,[40] + LDA 1,[-100] + STA 0,@20 + INC 0,0 + INC 1,1(SZR) + JMP .-3 + LDA 0,[0] + STA 0,@20 ;TERMINATE CHAR LIST + STA 0,CT1H + STA 0,CT1L + STA 0,CT2L + STA 0,CT2H + STA 2,20 ;REINIT AUTO INC LOC +TEST: READS 0 ;READ CONSOLE SWITCHES + MOVZL% 0,0(SNC) ;IF SIGN BIT ON USE CHAR IN SWITCHES + LDA 0,@20 ;OTHERWISE GET CHAR FROM LIST + LDA 1,[177] + AND 1,0(SNR) ;MASK OFF HIGH BITS + STA 2,20 ;IF CHAR IS ZERO, RESET LOC 20 + JSR WTEN ;SEND CHAR TO TEN + MOV 0,1 ;REMEMBER CHAR SENT + ISZ CT2L + JMP TEST1 + ISZ CT2L + JMP TEST1 + HALT +TEST1: JSR RTEN ;RECIEVE CHAR FROM TEN + LDA 3,[177] + AND 3,0 ;MASK OFF PARITY BIT + SUB% 0,1(SNR) ;IS IT THE ONE WE SENT? + JMP TEST ;YES + HALT ;NO + LDA 2,21 ;SAVE THE GOOD AND BAD CHARS + LDA 3,[16776] + SUBZ 2,3 ;CARRY=1 IF (3) >= (2) + LDA 3,[ERRLST-1] + MOV 3,3(SNC) + STA 3,21 + STA 0,@21 + STA 1,@21 + LDA 2,[CHRLST-1] + ISZ CT1L + JMP TEST + ISZ CT1H + JMP TEST + HALT + + + CONSTANTS +CT1L: 0 ;COUNT OF ERRORS +CT1H: 0 +CT2L: 0 ;COUNT OF CHARS SENT +CT2H: 0 +CHRLST: BLOCK 200. +ERRLST: 0 + END STEST + ;THIS ROUTINE SENDS CHARACTERS TO THE TEN AND EXPECTS +; THEM TO BE ECHOED. IT CHECKS THEM FOR ACCURACY. + +STEST: IORST ;I/O RESET + INTDS ;DISABLE INTEREUPTS + LDA 2,[ERRLST] + STA 2,21 + LDA 2,[CHRLST] + STA 2,20 + LDA 0,[40] + LDA 1,[-100] + STA 0,@20 + INC 0,0 + INC 1,1(SZR) + JMP .-2 + LDA 0,[0] + STA 0,CT1H + STA 0,CT1L +TEST: READS 0 ;READ CONSOLE SWITCHES + MOVZL% 0,0(SNC) ;IF SIGN BIT ON USE CHAR IN SWITCHES + MOV 0,@20 ;OTHERWISE GET CHAR FROM LIST + LDA 1,[377] + AND 1,0(SNR) ;MASK OFF HIGH BITS + STA 2,20 ;IF CHAR IS ZERO, RESET LOC 20 + JSR WTEN ;SEND CHAR TO TEN + MOV 0,1 ;REMEMBER CHAR SENT + JSR RTEN ;RECIEVE CHAR FROM TEN + SUB% 0,1(SNR) ;IS IT THE ONE WE SENT? + JMP TEST ;YES + HALT ;NO + LDA 2,21 ;SAVE THE GOOD AND BAD CHARS + LDA 3,[16776] + SUBZ 1,3 + LDA 3,[ERRLST] + MOV 3,3(SZC) + STA 3,21 + STA 0,@21 + STA 1,@21 + LDA 2,[CHRLST] + ISZ CT1L + JMP TEST + ISZ CT1H + JMP TEST + HALT + + + CONSTANTS +CT1L: 0 ;COUNT OF ERRORS +CT1H: 0 +CHRLST: BLOCK 200. +ERRLST: 0 + END STEST +  \ No newline at end of file diff --git a/src/nova/pnovcn.1 b/src/nova/pnovcn.1 new file mode 100755 index 00000000..c5e0ebc4 --- /dev/null +++ b/src/nova/pnovcn.1 @@ -0,0 +1,153 @@ + +TITLE NOVA CONSOLE +;console program using the plasma panel +DSP=21 +TENI=6 +TENO=7 + +LOC 17000 + +BEG: INTDS + LDA 0,[414] ;FORM FEED WITH 400 BIT + DOAS 0,DSP +CLOOP: SKPDZ TENI + JMP RCH10 + SKPDN TTI + JMP CLOOP +TTYRCH: DIAS 0,TTI + SKPBZ TENO + JMP .-1 + DOAS 0,TENO + JMP CLOOP + +RCH10: DIAS 0,TENI + LDA 1,[177] + AND 1,0 + SUB% 0,1(SNR) + JMP CLOOP + LDA 1,[3] + SUB% 0,1(SNR) + JMP BLK + LDA 1,[15] + SUBZ% 0,1(SNR) + JMP DCH + LDA 1,[40] + SUBZ% 1,0(SNC) + JMP CLOOP + LDA 1,[140] + SUBZ% 0,1(SZC) + JMP DCH + LDA 1,[173] + SUBZ% 0,1(SBN) + JMP CLOOP + LDA 1,[40] + SUB 1,0 +DCH: LDA 1,[400] + ADD 1,0 + JSR WTD + DOAS 0,DSP + LDA 1,[15+400] + SUB% 1,0(SZR) + JMP CLOOP + LDA 0,[12+400] + JSR WTD + DOAS 0,DSP + JSR CLINE + DIAS 0,TENI + STA 0,SAV + LDA 1,[-36] + JSR CLINE+1 + LDA 0,[15+400] + JSR WTD + DOAS 0,DSP + LDA 0,SAV + JMP RCH10+1 + +SAV: 0 +CLINE: LDA 1,[-44] + LDA 0,[40+400] + STA 3,CLINR +CLRLN: JSR WTD + DOAS 0,DSP + INC 1,1(SZR) + JMP CLRLN + JMP @CLINR +CLINR: 0 + +WTD: STA 3,WTDR + LDA 3,TIMEC ;TIME OUTCONSTANT + STA 3,TIMOTC +WTD1: ISZ TIMOTC + JMP .+2 + JMP TIMOT + SKPBZ DSP + JMP WTD1 + JMP @WTDR +TIMOT: JMP .+1 ;IN CASE WANT TO PATCH WITH HALT + JMP @WTDR + +TIMOTC: 0 +TIMEC: 176000 +WTDR: 0 + +CONSTANTS + +BLK: JSR GET + MOV 3,1 + JSR GET + MOV 3,2 + MOVL% 1,1(SNC) + JMP STBLK +L: JSR GET + STA 3,(2) + INC 2,2 + INC 1,1(SZR) + JMP L + JMP BLK + +STBLK: MOVZR 1,1(SNR) + MOV 1,1(SNC) + HALT + LDA 0,[^G] + DOAS 0,TTO + MOVL% 2,2(SZC) + HALT + JMP (2) + +GET: STA 3,GX + STA 2,G2 + JSR CH + MOVS 3,2 + ADDZL 2,2 + JSR CH +REPEAT 3,ADDZL 3,3 + ADD 3,2 + JSR CH + ADD 2,3 + LDA 2,G2 + JMP @GX +GX: 0 +G2: 0 + +CH: STA 3,CX + SKPDN 6 + JMP .-1 + DIAS 3,6 + LDA 0,[177] + AND 0,3 + MOVZR 0,0 + AND 3,0 + SUB% 0,3(SNR) + HALT + MOV 0,3 + JMP @CX +CX: 0 + +CONSTANTS +DLIST: 14 +LOC 17640 +DLEND: 0 + 123456 + +END BEG + \ No newline at end of file diff --git a/src/nova/time.machin b/src/nova/time.machin new file mode 100644 index 00000000..02edcd4c --- /dev/null +++ b/src/nova/time.machin @@ -0,0 +1,1239 @@ + +TITLE TIME MACHINE III.9 + +;STARTING ADDRESS 2. + +;USES INTERRUPT FOR REAL TIME CLOCK, AND TELETYPE. + +;THERE ARE THREE MAIN PARTS: +; 1) TAKE CARE OF DIFFERENT MODES THE TIME MACHINE CAN BE IN. +; 2) DISPLAY STUFF. +; 3) TAKING AND INTERPRETTING COMMANDS FROM TELETYPE. + +;MACROS + +DEFINE SKIP + JMP .+2 +TERMIN +;COMPARE WORDS. +; COMPARES THE NEXT CHARACTERS IN THE INPUT BUFFER TO +; THE GIVEN WORD. IF THEY DON'T MATCH, +; IT RESETS IPTR SO IT CAN BE USED AGAIN. +DEFINE CWORD WRD,ADD,NUM + LDA 2,A!WRD + IFSN !NUM!,S,[ LDA 0,[!NUM!] + STA 0,VAL +] + JSR @IWORD + JMP ADD ;RETURNS HERE IF MATCH +; RETURNS NEXT LOCATION IF NO MATCH. +TERMIN +;COMPARE LETTERS. +; COMPARES A LETTER IN 2 WITH THE GIVEN LETTER. +; IF THEY MATCH IT JUMPS TO THE ADDRESS AND ADDS +; THE NUMBER TO COM. IF THERE IS AN S INSTEAD OF +; A NUMBER, IT USES THE PREVIOUS VALUE. +DEFINE CLET LET,ADD,NUM + LDA 2,["!LET!] + IFSN !NUM!,S,[ LDA 0,[!NUM!] + STA 0,VAL +] + JSR @ILET + JMP ADD +TERMIN +;COMPARE TO RIGHT OR LEFT. +; LIKE CLET BUT DOESN'T CHANGE COM. +; USED IN TESTING FOR R OR L, ETC. +DEFINE CRL LET,ADD + LDA 3,["!LET!] + SUB% 1,3(SNR) + JMP ADD +TERMIN +;A TEST WORD. +; SETS UP THE GIVEN WORD AS A TEST WORD +DEFINE TSTWRD W +A!W!: . + ASCIZ \!W!\ +TERMIN + +;VARIABLES STORAGE AREA. + DISP==41 + BOX==30 + NPTR==30 + ENDPTR==22 + PTR==23 + PPTR==24 + IPTR==26 + WPTR==27 + LOC 140 +MASK: 0 +DISJOB: MSGLST +OKPTR: 0 +MSGPTR: 0 +TIME: 0 +ADDR: 0 +DELAY: 0 +DTIME: 0 +DTCNT: 0 +TMAX: 0 +XMCON: 101777 +TEMPO: 0 +SLIDEN: 0 ;RATE OF SLIDES +SFACT: 0 +BTSNX: 0 ;A TEMPORARY FOR BTSNUM +BEATD: 0 ;0 IF BEATS ARE TO BE DISPLAYED +BEATPC: 1252 +BEATPR: 0 +BMOVE: 0 +PMOVE: 0 +PIECEY: 120500 +BEATY: 120300 +OLDTIM: 0 +CLOCK: 0 +SHWFLG: 0 +DRMFLG: 0 +ONE: 0 +COM: 0 +ICNT: 0 +VAL: 0 +RET0: 0 +RET1: 0 +RET2: 0 +CRNRET: 0 +AMSGL: MSGLST +AJBLST: JOBLST +TOPLST: 0 +APTIME: PTIME-1 +AIBUFF: INBUFF-1 +IDSPLY: DISPLA +IREPLA: REPLAY +ITFREQ: TFREQ +ISTPTR: SETPTR +IWORD: WORDS +IERROR: ERROR +IOKCOM: OKCOM +IMODE: MODE +IDEBUG: 6200 +ILET: LET +IACTION: ACTION +IACT1: ACT1 +IEVAL: EVAL +IYBTS: YBTS +IEOS1: EOS1 +IEOS2: EOS2 +IEOS3: EOS3 +ISCLD: SCLD +ISNUMD: SNUMD +ITMPOD: TEMPOD +ITNUMD: TNUMD +ICRNXT: CRNXT + P1END==. + ;LOCS 0-4 + LOC 0 + 0 + INTRPT +;LOC. 2. STARTING ADD. + IORST + JMP INIT +;LOC. 4. RESTARTING ADD. + JMP RINIT + LOC P1END +;REINITIALIZE. +; START OVER, BUT DON'T TYPE THE 'STARTING' MESSAGE. +RINIT: SUB 1,1(SKP) +;INITIALIZE. +INIT: LDA 1,[14] ;TO SET MASK FOR 'STARTING MESSAGE'. + INTDS + LDA 0,AIBUFF ;TTY INPUT BUFFER-1 + STA 0,IPTR + LDA 0,[77] ;LENGTH OF TTY BUFFER. + STA 0,ICNT + LDA 0,[177771] + MSKO 0, ;ENABLE CLOCK, TTI. DISABLE TTO. + LDA 0,[2] ;SET REAL TIME CLOCK TO + DOAS 0,RTC ;INTERRUPT EVERY 10 MIL-SEC. + SKIP +;RESET COMMAND TYPED. +RSET: SUB 1,1 + STA 1,MASK + LDA 0,BEATPC + STA 0,BEATPR ;BEAT PERIOD. + LDA 2,[4] + STA 2,SFACT ;SCALING FACTOR + LDA 1,[17770] ;INITIAL MAX. TIME. + STA 1,TMAX + LDA 1,[12] + STA 1,TEMPO + SUB 0,0 + STA 0,BMOVE ;AM'T BEATS MOVED. + STA 0,PMOVE ;AM'T PIECE MOVED. + STA 0,CLOCK + INC 0,0 + STA 0,DRMFLG + STA 0,ONE + INTEN + JMP RSTART + +; +;SCALE. +; SCALE THE NUMBER IN AC1. +SCAL: LDA 2,SFACT ;SCALING FACTOR. + SUB 0,0 + MOVL% 1,1(SZC) ;NUMBER NEG.? + JMP .+3 ;YES. + DIV ;NUMBER/SFACT. + JMP 0(3) + NEG 1,1 ;MAKE IT POS. + DIV + NEG 1,1 ;MAKE ANSWER NEG. + JMP 0(3) +; +;BEATS NUMBER HACK +; TURNS OUT THAT 6000.*TEMPO/ X IS USEFUL TO COMPUTE TWICE +; CALL WITH AC1 = X . RETURN ANSWER IN AC1 +; SKIP RETURN UNLESS OVERFLOW OCCURS. +BTSNUM: STA 1,BTSNX + SUB 0,0 + LDA 1,[13560] ;6000. + LDA 2,TEMPO + MUL + LDA 2,BTSNX + DIV + MOV% 0,0(SZC) ;DIV SETS CARRY ON OVERFLOW + JMP 0(3) + MOVZL 0,0 ;THIS IS HOW YOU ROUND QUOTIENTS + SUBZ 2,0(SZC) + INC 1,1 ;ROUND IT UP + JMP 1(3) ;SKIP RETURN + +;INTRO MODE. +; IN THIS MODE, BEATS ARE SOUNDED, BUT NOT DISPLAYED. +; WHEN THE DRUM IS HIT, PUT THAT AT TIME = 0 AND ENTER RESTART. +INTRO: SUBZL 0,0 ;1 + STA 0,SHWFLG + LDA 0,AMSGL + STA 0,TOPLST ;TOP OF DISPLAY LIST. + SUB 0,0 + STA 0,DTIME +INTLUP: JSR TALOT + SUB 3,3 + DIAS 1,BOX + MOVR 1,1(SNC) ;BIT 15 IS 0 + JMP DHIT ;WHEN DRUM HIT. + LDA 1,BEATPR ;-1 MEANS BEATS OFF. + COM% 1,1(SNR) + JMP W0 + LDA 0,DTIME + SUBZ 1,0(SNC) ;SKIP IF DTIME>=BEATPR. + JMP WAIT0 + LDA 0,[4] + DOAS 0,BOX ;SOUND THE BONGO. +W0: STA 3,DTIME ;0 +WAIT0: STA 3,TIME + JSR WAIT ;DISPLAY STUFF WHILE WAITING FOR CLOCK. + JMP INTLUP +;DRUM WAS HIT. +; MAKE NEXT BEAT FOLLOW CORRECTLY. +DHIT: LDA 0,BEATPR ;TIME PER BEAT. + LDA 1,DTIME ;TIME SINCE LAST BEAT. + COM% 0,0(SZR) ;SKIP IF BEATS OFF. + SUBZ 1,0(SNC) ;TIME LEFT TIL NEXT BEAT. + SUB 0,0 + STA 0,BMOVE + +;RESTART MODE. +; IN THIS MODE THE PIECE CAN BE TAPPED IN ON THE DRUM. +RSTART: JSR RRI ;INITIALIZE POINTERS,TIME,&SHWFLG. +; RETURNS WITH AC0=0, AC1=ADD.-1 OF TIME LIST, +; AC2=-1. + STA 1,ENDPTR + STA 0,PMOVE + STA 2,@ENDPTR ;PUT -1 AT END OF TIME LIST. + LDA 0,AJBLST + STA 0,TOPLST ;TOP OF DISPLAY LIST. +INLOOP: JSR CHKTU ;CHECK FOR TIME UP. +;TIME ISN'T UP. TEST THE DRUM. + DIAS 1,BOX + MOVZR 1,1(SNC) ;BIT 15 IS 0 WHEN + JMP DRUMON ;THE DRUM IS ON. + SUB 1,1 + STA 1,DRMFLG + JMP WAIT1 +;THE DRUM IS ON, BUT IS IT A NEW HIT? +DRUMON: LDA 1,DRMFLG ;IF 0, THEN THIS + MOV 1,1(SZR) ;IS AN NEW HIT. + JMP WAIT1 + ISZ DRMFLG ;SET DRMFLG=1. + LDA 0,DTIME ;TIME SINCE LAST DRUM HIT. + STA 0,@PPTR ;PUT INTO NEXT LOCATION IN TIME LIST. + STA 1,DTIME ;AC1=0. + COM 1,1 ;PUT -1 AT THE END + STA 1,@ENDPTR ;OF THE TIME LIST. +WAIT1: JSR TALOT + JSR BTBONG ;BONG THE BONGO IF TIME FOR NEXT BEAT. + JSR WAIT ;DISPLAY STUFF WHILE WAITING FOR CLOCK. + JMP INLOOP + +;RESTART/REPLAY INITIALIZATION. +; INITIALIZE STUFF USED BY BOTH ROUTINES. +; RETURN WITH AC0=0, AC1=APTIME, AC2=-1. +RRI: LDA 1,APTIME ;ADD.-1 OF TIME LIST. + STA 1,PTR + STA 1,PPTR + ADC 2,2 + STA 2,SHWFLG + STA 2,OLDTIM + SUB 0,0 + STA 0,TIME + STA 0,DTIME + JMP 0(3) + +;REPLAY MODE. +; IN THIS MODE, THE PIECE THAT IS STORED IN THE TIME LIST IS PLAYED BACK. +REPLAY: JSR RRI + LDA 1,PMOVE ;AMOUNT THE PIECE MOVED. +;ADD UP PMOVE+DTIMES UNTIL THE SUM >=0. +NUTHER: LDA 0,@PPTR ;NEXT DTIME. + COM% 0,0(SNR);END OF LIST = -1. + JMP NOPIC ;NO TIMES FIT. + ADD 0,1(SNR);AC1=PMOVE + SUM OF DTIMES. + JMP PICBON ;THE SUM = 0. + MOVL% 1,1(SZC) + JMP NUTHER ;THE SUM < 0. +RLOOP: STA 1,DTCNT ;DTCNT = TIME UNTIL NEXT PIECE. + JSR WAIT + JSR CHKTU ;CHECK FOR TIME UP. + JSR BTBONG + JSR TALOT + LDA 0,DTCNT + LDA 1,DTIME + SUBZ 0,1(SNC) ;SKIP IF DTIME >= DTCNT + JMP RLOOP+1 +PICBON: STA 1,DTIME + LDA 0,[2] + DOAS 0,BOX ;SOUND THE BONGO FOR THE PIECE. + LDA 1,@PPTR ;NEXT DTIME. + JMP RLOOP +NOPIC: MOV 0,1 + JMP RLOOP +; +;WAIT. +; DISPLAY STUFF WHILE WAITING FOR CLOCK TO INT. +WAIT: STA 3,RET1 + JSR @IDSPLY + DSZ CLOCK ;CLOCK IS SET TO 1 BY CLOCK INT. ROUTINE. + JMP .-2 + JMP @RET1 ;THE CLOCK HAS INTERRUPTED. +; +;CHECK FOR TIME UP. +; COMPARE TIME TO THE MAXIMUM TIME. +CHKTU: LDA 0,TIME + LDA 1,TMAX ;MAX. TIME. + SUBZ% 1,0(SZC) + JMP TIMEUP + JMP 0(3) + +;SHOW-ALL MODE. +; IN THIS MODE, THE ENTIRE PIECE IS DISPLAYED. +; TIME IS SET TO THE LARGEST VALUE SO THE DISPLAY ROUTINE WILL SHOW ALL. +SHWALL: SUBZL 0,0 ;1 + STA 0,SHWFLG + JSR TALOT + LDA 1,TMAX + STA 1,TIME + JSR WAIT + JMP SENTRY ;SHOW-ALL'S ENTRY IN TIMEUP. + +;TEST A LOT. +; TESTS FOR RUBOUT, CARRIAGE RETURN, ^G, STARTING MESSAGE, SPACE-BAR, +; AND SLIDES. +TALOT: STA 3,RET0 + LDA 0,MASK + LDA 3,AMSKA + ADD 0,3 + LDA 0,SLIDEN ;SLIDE RATE + LDA 1,PMOVE ;AM'T PIECE MOVED. + LDA 2,BMOVE ;AM'T BEATS MOVED. + JMP @0(3) +AMSKA: .+1 + TFREQ + COMINT ;FOR RUBOUT. + COMINT ;FOR CR + XSTL ;SLIDE TOGETHER LEFT. + XSTR ;ETC. + XSPL + XSPR + XSBL + XSBR + XSEL + XSER + BREAK + SMSG ;STARTING MESSAGE. + RSET +XSBL: SUB 0,2(SKP) +XSBR: ADD 0,2 + JMP SDONE +XSTL: SUB 0,2(SKP) +XSTR: ADD 0,2(SKP) +XSPL: SUB 0,1(SKP) +XSPR: ADD 0,1 +SDONE: STA 1,PMOVE + STA 2,BMOVE + JMP TFREQ +XSEL: LDA 1,TMAX ;TIME OF END OF SCREEN + SUBZ 0,1(SZC) ;SKIP IF TOO SMALL + STA 1,TMAX + JMP TFREQ +XSER: LDA 1,TMAX + ADD 0,1 + STA 1,BTSNX ;A TEMP + JSR SCAL ;START TURNING INTO X-COORD. + LDA 0,[3777] + SUBZ% 0,1(SZC) ;SKIP IF OKAY + JMP TFREQ + LDA 1,BTSNX + STA 1,TMAX +;SEE ABOUT CHANGING BEAT FREQUENCY. +TFREQ: DSZ ONE ;IS EITHER 0 OR 1. + ISZ ONE + JMP @RET0 + DIAS 0,BOX + MOVR 0,0 + MOVR 0,0(SNC) ;BIT IS 0 FOR SPEED-UP. + JMP SPDUP + MOVR 0,0(SNC) +SLDN: ISZ BEATPR ;INC. BEATPR TO DECREASR FREQ. + JMP @RET0 +SPDUP: DSZ BEATPR ;DEC. BEATPR TO INCREASE FREQ. + JMP @RET0 + JMP SLDN + + +;BEAT BONG. +; DECIDES WHETHER TO BONG THE BONGO FOR THE BEATS. +BTBONG: LDA 1,TIME + LDA 2,BMOVE + MOVL% 2,2(SZC) ;SKIP IF NEGATIVE. + JMP BMNEG + SUBZ 2,1(SNC) ;TIME-BMOVE. + JMP 0(3) ;TIME < BMOVE. NO BEATSYET. + SKIP +BMNEG: SUB 2,1 ;BMOVE NEG. TIME > BMOVE THEREFORE. + SUB 0,0 + LDA 2,BEATPR + COM% 2,2(SNR) ;BEATPR = -1 MEANS BEATS OFF. + JMP 0(3) + DIV ;(TIME - BMOVE)/BEATPR. THIS EQUALS THE NUMBER OF BEATS BEING DISPLAYED. + LDA 0,BMOVE + MUL ;NUMBER OF BEATS BEING DISPLAYED * BEATPR + BMOVE. +; THIS IS THE TIME OF THE LAST BEAT BEING DISPLAYED. + MOVZL% 1,1(SZC) ;SKIP IF LAST TIME >= 0. + JMP 0(3) ;IF LAS TIME < 0, THEN IT ISN'T BEING DISPLAYED. + LDA 0,OLDTIM + STA 1,OLDTIM ;THE LAST TIME BECOMES THE NEW OLDTIM. + COM% 0,0(SNR) ;WHEN INITIALIZED, OLDTIM WAS SET TO -1. + JMP BONG ;THE FIRST TIME THAT OLDTIM IS CHANGED SHOULD ALWAYS CAUSE A BONG. + ADD 2,0 ;BEATPR + OLDTIM. + SUBZ 0,1(SNC) ;SKIPS IF OLDTIM + BEATPR <= LASTIM. + JMP 0(3) ;THERE IS NO BONGING TO DO. +BONG: LDA 0,[4] + DOAS 0,BOX ;BONG THE BONGO. + JMP 0(3) + +;TIME IS UP. +; TIME HAS BECOME > XMAX. +; DECIDE WHAT MODE TO GO INTO. +TIMEUP: LDA 0,[400] ;2 SECOND DELAY. + STA 0,DELAY +SENTRY: DIAS 0,BOX ;GET SWITCHES. +; THE BITS MEAN: BIT 9=WAIT, +; BIT 10=SAVE,BIT 11=SHOWALL, +; BIT 12=RESTART. + MOVS 0,0 ;SWAP INFO INTO TOP BYTE. + MOVL 0,0 + MOVL 0,0(SNC) ;TEST FOR WAIT. + JMP NOWAIT + DSZ DELAY + JMP SHWALL ;SHOW ALL WHILE DELAYING. +NOWAIT: MOVL 0,0(SNC) ;TEST FOR SAVE. + JMP NOSAVE + MOVL 0,0(SNC) ;TEST FOR SHOW-ALL. + JMP @IREPLA + SUBZL 1,1 ;1. + STA 1,DELAY ;SO THAT AFTER SHOW-ALL PROG. WON'T WAIT. + JMP SHWALL +NOSAVE: MOVL 0,0 ;THROW AWAY SHOW ALL BIT. + MOVL 0,0(SNC) ;TEST FOR RESTART. + JMP INTRO + JMP RSTART + +;COMMAND INTERPRETER. +; INTERPRETS COMMANDS IN THE INPUT BUFFER. +COMINT: DSZ MASK ;MASK IS EITHER 1 OR 2. + DSZ MASK + JMP RUBOUT +;CARRIAGE RETURN. + LDA 0,[177773] + MSKO 0, ;DISABLE TTI. TTO REMAINS DISABLED. + LDA 0,AIBUFF ;ADD-1 OF INPUT BUFFER. + STA 0,IPTR ;AUTO-INCREMENTING. + SUB 0,0 + STA 0,COM ;INDEX OF COMMAND +;SET POINTERS. + JSR @ISTPTR +;COMPARE INPUT BUFFER WITH TEST WORDS. + CWORD MOVE,WRD2,0 + CWORD RESET,YRSET,S + CWORD DEBUG,@IDEBUG,S + CWORD DISPLAY,WRD2,100 + CWORD HIDE,WRD2,40 + CWORD SLIDE,WRD2,12 + CWORD SET,WRD2,S + JMP LET1 +;RUBOUT. +; DELETE PREVIOUS CHAR. IF NONE, THEN ISSUE NEW LINE. +RUBOUT: DSZ IPTR + LDA 0,@IPTR ;PREVIOUS CHAR. + INC% 0,0(SNR) ;WORD BEFORE BUFFER = -1. + JMP @IOKCOM + DSZ IPTR + DOAS 0,TTO + ISZ ICNT + JMP @ITFREQ +;YES RESET +YRSET: LDA 0,[15] + STA 0,MASK + JMP @IOKCOM +;THESE ARE TEST WORDS. +IRP W,,[MOVE,RESET,DEBUG,DISPLAY,HIDE,SLIDE,SET] + TSTWRD W +TERMIN + +;NOT A WORD. COMPARE TO TEST LETTERS. +LET1: LDA 1,@IPTR + CLET M,WRD2,0 + CLET L,@IACTION,S + CLET R,@IACT1,S + CLET B,@IYBTS,S + CLET D,WRD2,100 + CLET H,WRD2,40 + CLET S,WRD2,12 + JMP @IERROR ;THE FIRST WORD IN THE BUFFER ISN'T VALID. +;COMPARE 2ND WORD TO TEST WORDS. +WRD2: JSR @ISTPTR + CWORD TOG,WRD3,0 + CWORD TEMPO,WRD3,S + CWORD PIECE,WRD3,2 + CWORD BEATS,WRD3,4 + CWORD END,WRD3,6 + CWORD SCALE,WRD3,10 +;NOT A WORD. COMPARE TO TEST LETTERS. + LDA 1,@IPTR + CLET S,WRD3,S + CLET E,WRD3,6 + CLET B,WRD3,4 + CLET P,WRD3,2 + CLET T,WRD3,0 + JMP @IERROR ;THE SECOND WORD WASN'T VALID. +;THESE ARE TEST WORDS. +IRP W,,[PIECE,BEATS,TEMPO,END,SCALE] + TSTWRD W +TERMIN +ATOG: . + ASCIZ \TOGETHER\ + +;COMPARE 3RD WORD TO TEST WORDS. +WRD3: JSR @ISTPTR + CWORD LEFT,ACTION,0 + CWORD RIGHT,ACT1,S +;NOT A WORD. COMPARE TO TEST LETTERS. + LDA 1,@IPTR + CRL L,ACTION + CRL R,ACT1 + CRL <,ACTION + CRL >,ACT1 +;THERE'S NO THIRD WORD. +;SOME COMMANDS DON'T HAVE A 3RD WORD, THOUGH. + DSZ IPTR ;SET IPTR TO VERY NEXT CHAR. + LDA 2,COM ;IS IT HIDE BEATS OR DISPLAY BEATS + LDA 1,[104] + SUB% 1,2(SNR) + JMP YDB ;DISPLAY BEATS + LDA 1,[44] + SUB% 1,2(SNR) + JMP YHB ;HIDE BEATS + JSR @IEVAL + LDA 2,COM + LDA 1,[12] + SUB% 1,2(SNR) + JMP YST ;SET TEMPO. + LDA 1,[16] + SUB% 2,1(SNR) + JMP YBTS+1 ;'SB' HAS COM OF 16. + LDA 1,[22] + SUB% 2,1(SZR) + JMP @IERROR +;THE COMMAND IS 'SET SCALE'. + STA 0,SFACT + LDA 1,TMAX + JMP EON ;IS THE END-OF-SCREEN ON THE SCREEN? + +;ACTION. +; CHOOSE ROUTINE TO DO COMMAND. +ACT1: ISZ COM +ACTION: DSZ SHWFLG ;1 IF IN SHOW-ALL OR INTRO. + JMP @IMODE ;SLIDE AND MOVE NOT VALID NOW. + ISZ SHWFLG ;PUT SHWFLG BACK UP. + LDA 1,[12] + LDA 3,COM + SUBZ% 1,3(SZC) ;SKIP IF THIS IS A MOVE. + JMP NOTMV + LDA 2,ACOMRA ;ADDRESS OF THE COMMAND ARRAY. + ADD 3,2 + STA 2,ADDR + JSR EVAL ;EVALUATE NUMBER IN INPUT BUFFER. + LDA 1,TMAX + LDA 2,PMOVE + LDA 3,BMOVE + JMP @ADDR +;HERE ARE THE TEST WORD FOR WORD 3. + TSTWRD LEFT + TSTWRD RIGHT +;COMMAND ARRAY. +ACOMRA: .+1 + SUB 0,3(SKP) ;MTL + ADD 0,3(SKP) ;MTR + JMP XMPL + JMP XMPR + JMP XMBL + JMP XMBR + JMP XMEL + JMP XMER + JMP ERROR ;NOT VALID. + JMP ERROR ;NOT VALID + +; +XMBL: SUB 0,3(SKP) ;3 HAS BMOVE. +XMBR: ADD 0,3 + JMP MOVED ;ALL MOVING DONE. +XMPL: SUB 0,2(SKP) +XMPR: ADD 0,2 +MOVED: STA 2,PMOVE + STA 3,BMOVE + JMP OKCOM +XMER: ADD 0,1 + STA 1,TMAX +;IS THE END-OF-SCREEN ON THE SCREEN? +EON: JSR SCAL + LDA 0,[3777] + SUBZ% 0,1(SNC) + JMP OKCOM ;END STILL ON SCREEN. +;UNSCALE XMCON INTO TIME. + LDA 1,XMCON + MOVZL 1,1 + SUB 0,0 + LDA 2,SFACT + MUL + JMP ENDMV +XMEL: SUBZ% 1,0(SZC) ;SKIP IF AC0