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 00000000..84b1880b Binary files /dev/null and b/src/nova/_lodee.0_11 differ diff --git a/src/nova/debug.1 b/src/nova/debug.1 new file mode 100755 index 00000000..565018d8 --- /dev/null +++ b/src/nova/debug.1 @@ -0,0 +1,1081 @@ + PTP==34 + LOC 6200 + + +;AN ORIGIN TAPE MUST BE SUPPLIED PRIOR +;TO THIS TAPE + +;MULTI-BREAKPOINT DEBUGGER + + INTDS + STA 3,SAC+3 ;SAVE AC3 + JSR SAVAC ;AND THE REST OF THE REGISTERS + SUB 0,0 + STA 0,@INFL ;CLEAR INTERRUPT ON + STA 0,TTFLG ;CLEAR TTI,TTO DONE FLAGS + STA 0,TPACT ;AND CLEAR TRAP ACTIVE + JSR RMBRK + JMP ENTER +;PUTBR PUT BREAK POINTS INTO THE PROGRAM + +;RMBRK REMOVE BREAK POINTS AND RESTORE TO THEIR +; ORIGINAL VALUES + +PUTBR: SUB 0,0(SKP) ;CLEAR AC0 +RMBRK: ADC 0,0 ;SET AC0 + LDA 2,PTBR5 ;GET A COUNTER + STA 2,INTFL ;AND SAVE IT + STA 3,PTBR8 ;SAVE RETURN + LDA 3,PTBR6 ;GET BP BLOCK POINTER +PTBR0: LDA 1,PTBR7 + ADD 1,3 ;UPDATE BLOCK POINTER + INC 2,2 ;UPDATE STORAGE REGISTER + LDA 1,1(3) ;GET BREAK LOCATION + MOVL% 1,1(SZC) ;AND TEST IF ACTIVE + JMP PTBR2 ;NO + MOV 0,0(SZR) ;TEST IF PUTTING OR REMOVING + JMP PTBR1 ;REMOVING + + LDA 1,@1(3) ;PUTTING IN + STA 1,2(3) ;SAVE INSTRUCTION + LDA 1,3(3) ;GET BREAK INSTRUCTION + STA 1,@1(3) ;AND STORE IT + JMP PTBR2 ;CONTINUE +;REMOVE BREAK POINT +PTBR1: LDA 1,2(3) ;GET INSTRUCTION + STA 1,@1(3) ;PUT BACK INTO PROGRAM + + ;PUT BREAK POINTER INTO PAGE ZERO +PTBR2: LDA 1,4(3) + STA 1,3(2) + LDA 1,0(3) + NEGL% 1,1(SNC) + SUBZL 1,1 + STA 1,0(3) +PTBR3: DSZ INTFL ;DECREMECOUNT + JMP PTBR0 ;NOT DONE + MOV 0,0(SZR) + JMP @PTBR8 ;DONE, EXIT + + STA 0,TRPNO + LDA 3,TTFLG ;NOW, FIX UP THE TTY FLAGS + MOVR 3,3(SNC) + NIOC TTI ;TTO DONE WAS A 0 + MOVR 3,3(SNC) + NIOC TTO ;TTI DONE WAS A 0 + LDA 3,SAC+4 ;RESTORE CRY + MOVR 3,3 + LDA 0,SAC ;AND THE AC'S + LDA 1,SAC+1 + LDA 2,SAC+2 + LDA 3,SAC+3 + JMP @PTBR8 +PTBR5: 4 +PTBR6: BPBLK-5 +PTBR7: 5 +PTBR8: 0 ;SAVED RETURN + +;SAVE AC'S +SAVAC: STA 0,SAC + STA 1,SAC+1 + STA 2,SAC+2 + SUBCL 0,0 + STA 0,SAC+4 + JMP 0(3) ;AND RETURN + +;SAVED ACCUMULATORS AND CARRY +SAC: 0 + 0 + 0 + 0 + 0 + +;POINTERS +TRPC0: B2 +RLOC0: RLOC +TTFLG: 0 +INFL: INFL0 +PROCD: PRCD +CHB: "B +TRPNO: 0 +INTFL: 0 +TPACT: 0 + + + +;PROCEED COMMAND +PR0: SUBZL 0,0 ;SET COUNT TO +1 +PR: LDA 3,TPACT ;TEST TRAP ACTIVE + MOV 3,3(SNR) + JMP ERROR ;NONE ACTIVE, ERROR + STA 0,-1(3) ;OK, SET COUNT +PR1: JMP @PROCD ;DO INSTRUCTION AND CONTINUE + + + + + +;TRAP ENTRIES +TRP1: SKPBN CPU ;TEST INTERRUPT + JMP TRPCM+3 ;IT IS OFF + INTDS ;TURN IF OFF + ISZ INTFL ;AND SET FLAG + JMP TRPCM+3 + +TRP2: SKPBN CPU + JMP TRPCM+2 + INTDS + ISZ INTFL + JMP TRPCM+2 + +TRP3: SKPBN CPU + JMP TRPCM+1 + INTDS + ISZ INTFL + JMP TRPCM+1 + +TRP4: SKPBN CPU + JMP TRPCM + INTDS + ISZ INTFL + + + + +;COMMON TRAP CODE + +TRPCM: ISZ TRPNO ;SET THE TRAP NUMBER + ISZ TRPNO + ISZ TRPNO + STA 3,SAC+3 + JSR SAVAC ;SAVE REGISTERS + LDA 3,INTFL ;GET INTERRUPT FLAG + STA 3,@INFL ;AND STORE IT + JSR RMBRK ;GO REMOVE ALL BREAK POINTS + LDA 0,TRPNO ;GET TRAP NUMBER + JSR @TRPC0 ;GO FORM ADDRESS IN AC0,AC2 + STA 2,TPACT + LDA 0,0(2) ;GET TRAP LOCATION + STA 0,@RLOC0 ;AND SAVE IT + SKPBN TTO + SKPBZ TTI ;WAIT FOR BOTH TTI,TTO TO FINISH + JMP .-2 ;ONE IS STILL BUSY + SUB 3,3 ;CLEAR AC3 + SKPDZ TTO ;TEST TTO DONE + INCZL 3,3 ;SET, SET AC3 BIT 14 + SKPDZ TTI + INC 3,3 ;TTI SET, SET BIT 15 + STA 3,TTFLG ;SET FLAG + DSZ -1(2) ;TEST COUNT + JMP @PROCD ;PROCEED, HASN'T EXPIRED YET + JSR CRLF ;GO PRINT CR,LF + JSR @OCTL0 ;TYPE ADDRESS IN AC0 + 7-5 ;5 DIGITS + LDA 1,CHB + JSR @TYP0 ;TYPE A "B + LDA 0,TRPNO ;TYPE THE TRAP NUMBER + JSR @OCTL0 + 7-1 ;1 DIGIT +ENTER: JSR CRLF + JMP @.+1 + A0 ;TYPE CONTENTS OF AC'S + + + +;SET A BREAK POINT, IE FIND +;AND INCATIVE ONE +B1: MOVL 0,0 + MOVZR 0,0 ;CLEAR BIT0 + LDA 2,PTBR6 ;GET BLOCK ADDRESS + LDA 1,PTBR7 + NEG 1,3 ;FORM COUNT IN AC3 +B3: LDA 1,PTBR7 ;GET +5 + ADD 1,2 ;AND UPDATE ADDRESS + INC 3,3(SNR) ;TEST FOR COMPLETION + JMP ERROR ;YES, ALL ACTIVE, ERROR + LDA 1,1(2) ;GET ACTIVE LOCATION + MOVL% 1,1(SNC) ;TEST IF ACTIVE + SUB% 0,1(SNR) ;YES, IS IT SAME AS ARG? + SUBZL 1,1(SKP) ;OK, USE THIS ONE + JMP B3 ;NO, TRY AGAIN + STA 1,0(2) ;STORE COUNT + STA 0,1(2) ;AND THE ADDRESS + JMP EQUAL+2 + + + + + + +;= TYPE EXPRESSION IN AC0 +EQUAL: JSR @OCTL0 ;CALL PRINTER + 7-6 ;6 DIGITS + JSR CRLF ;TYPE CR,LF +;NOW, BEGIN INPUT +BGN: JSR INPUT ;CALL INPUT + 177777 ;INPUT MASK + CTBL1 ;TABLE IF NO NUMBER + CTBL2 ;TABLE IF NUMBER + JMP 0(3) ;EXECUTED IF NUMBER + +;TYE CR,LF +CRLF: LDA 1,CN15 + MOV 3,2 + JSR @TYP0 + LDA 1,CN12 + JSR @TYP0 + JMP 0(2) +QUEST: "? +CN15: 15 +INPT9: +CN12: 12 + 0 ;LIST TERMINATOR +OCTL0: OCTAL + + + +ERROR: LDA 1,QUEST ;GET ? + JSR @TYP0 + JMP BGN-1 ;TYPE CR,LF +CN70: 70 +CN60: 60 +CPRD: ". +CDLR: "$ +C54: 54 +CN177: 177 + + + +;INPUT SUBROUTINE TO INPUT A +; NUMBER, DECODE THE BREAK CHARACTER, TYPE A RESPONSE +; AND TRANSFER TO THE PROPER HANDLER WITH THE EXPRESSION +; IN AC0 +; +;CALLING SEQUENCE: +; JSR INPUT +; INPUT MASK +; TABLE IF NO NUMBER +; TABLE IF NUMBER +; RETURN IF NUMBER WITH SUBROUTINE ADDRESS IN AC3 + +INPUT: STA 3,INP10 ;SAVE THE CALLING LOCATION + SUB 0,0 + STA 0,EXPFL ;CLEAR THE EXPRESSION FLAG +INPT0: SUB 1,1(SKP) + SUBZL 1,1 + STA 0,EXPVL ;SET EXPRESSION + STA 1,COMBN ;SET COMBINATION FLAG + SUB 2,2 ;CLEAR VALUE OF CURRENT ATOM +INPT1: NIOC TTI + SKPDN TTI ;GET A CHARACTER + JMP .-1 + DIA 1,TTI + JSR @TYP0 + LDA 0,CN177 + AND 0,1 ;CRUNCH TO 7 BITS + SUB% 0,1(SNR) + JMP ERROR ;A RUBOUT, ERROR + LDA 0,CN70 ;TEST FOR A DIGIT + LDA 3,CN60 + SUBL% 0,1(SZC) + SUBZ% 3,1(SNC) + JMP INPT3 ;NOT A DIGIT +;A DIGIT, BUILD NUMBER IN AC0 + SUB 3,1 ;AC1=DIGIT + MOVZL 2,2 + MOVZL 2,2 ;MULTIPLY ATOM BY 8 + MOVZL 2,2 + ADD 1,2 +INPT2: SUBZL 0,0 + STA 0,EXPFL ;SET EXPRESSION FLAG + JMP INPT1 ;AND GET NEXT CHARACTER + +TYP0: TYPE + + +;NOT A DIGIT, CHECK FOR . $ +INPT3: LDA 0,CPRD ;GET ". + SUB% 1,0(SZR) + JMP .+3 ;NOT A PERIOD + LDA 2, ADDRS ;YES, GET VALUE OF . + JMP INPT2 + + LDA 0,CDLR ;GET "$ + SUB% 1,0(SZR) + JMP .+3 ;NO + LDA 2,@LOC1 ;YES, GET $ VALUE + JMP INPT2 ;AND PROCEED + + + +;OK, NOW COMBINE CURRENT NUMBER WITH EXPRESSION + LDA 3,COMBN ;GET COMBINATION FLAG + LDA 0,EXPVL ;GET EXPESSION + MOV 3,3(SZR) + SUB 2,0(SKP) ;DO A SUBTRACT + ADD 2,0 ;DO AN ADD +;NOW, AC0=EXPRESSION VALUE + LDA 3,C54 ;TEST FOR + + ADC% 1,3(SNR) + JMP INPT0 ;YES, PROCEED + INC 3,3 ;NO, TEST FOR - + SUB% 1,3(SNR) + JMP INPT0+1 ;YES, PROCEED + +;NOW, GET TABLE POINTERS + LDA 3,INP10 ;GET CALLING ADDRESS + LDA 2,0(3) + AND 2,0 ;MASK THE NUMBER + LDA 2,2(3) ;GET POINTER FOR NUMBER INPUT + + DSZ EXPFL ;TEST FOR NUMBER + LDA 2,1(3) ;NO-GET THE OTHER POINTER + STA 0,COMBN ;SAVE THE EXPRESSION + + +;NOW, LOOKUP THE CHARACTER IN THE TABLE +INPT4: LDA 3,0(2) ;GET FROM TABLE + LDA 0,CN177 ;GET A 7 BIT MASK + AND 0,3(SNR) + JMP ERROR ;0, TABLE ENDED + SUB% 1,3(SNR) ;COMPARE + JMP INPT5 ;FOUND + INC 2,2 ;ADVANCE TABLE POINTER + INC 2,2 + JMP INPT4 +INPT5: LDA 0,1(2) ;GET SUBROUTINE ADDRESS + STA 0,EXPVL ;SAVE ADDRESS + LDA 1,0(2) ;GET FROM TABLE + LDA 2,LEFT ;GET MASK + ANDS 1,2 ;GET MESSAGE NUMBER IN AC3 + LDA 3,TBPNT ;GET TABLE POINTER + ADD 2,3 ;FORM POINTER IN AC3 + LDA 2,0(3) ;GET STRING ADDRESS + MOVL% 1,1(SZC) ;TEST FOR SPECIAL EXAMINE MODE + JMP INPT7 ;YES +INPT6: LDA 1,0(2) ;GET CHARACTER + MOV 1,1(SNR) ;TEST FOR ZERO + JMP .+4 ;OK, EXIT + JSR @TYP0 ;GO TYPE THE CHARACTER + INC 2,2 + JMP INPT6 ;AND PROCEED + + LDA 3,EXPVL ;SUBROUTINE ADDRESS + LDA 2,INP10 + LDA 0,COMBN ;GET THE EXPRESSION INTO AC0 + ISZ EXPFL ;TEST FOR NUMBER + JMP 3(2) ;NUMBER + JMP 0(3) ;NO NUMBER + +INPT7: LDA 1,SLS ;TYPE SLASH, SPACE + JSR @TYP0 + JSR TSPC + MOV 2,1 ;GET INPUT MASK +INPT8: ADC 2,2 ;SET TO / MODE + JMP EX1 ;AND PROCEED + + + +INP10: 0 +EXPFL: 0 ;EXPRESSION FLAG +EXPVL: 0 ;EXPRESSION VALUE +COMBN: 0 ;COMBINATION FLAG +MODE: 0 +LEFT: 17*400 +TBPNT: MESTBL ;POINTER TO MESSAGE TABLE + + +;PROCESS LINE:FEED +LF0: ISZ ADDRS ;INCREMENT ADDRESS + JMP .+3 +;PROCESS UP-ARROW +UPR0: DSZ ADDRS ;DECREMENT ADDRESS + JMP .+1 + LDA 0,ADDRS ;OK, TYPE THE ADDRESS + JSR @OCTL0 + 7-5 + LDA 1,SLS ;GET A SLASH + LDA 2,MODE + INC% 2,2(SZR) ;TEST MODE + LDA 1,EXC ;GET AN ! + JSR @TYP0 + JSR TSPC ;TYPE A SPACE + LDA 0,ADDRS ;GET ADDRESS +EX0: ADC 1,1 ;GET INPUT MASK INTO AC1 + + + + +;AC0-ADDRESS +;AC1-INPUT MASK +;AC2-MODE + +EX1: MOVL 0,0 + MOVZR 0,0 ;CLEAR BIT 0 + STA 0,LOC1 ;AND SAVE LOCATION + STA 1,MSK ;SAVE MASK + INC% 2,2(SZR) ;TEST MODE + JMP .+5 ;IN ! MODE + LDA 0,@LOC1 ;IN / MODE, GET VALUE + JSR @OCTL6 ;AND TYPE IT + 7-6 ;6 DIGITS + JSR TSPC ;TYPE A SPACE + JSR INPUT ;DO INPUT +MSK: 0 + CTBL3 ;COMMAND IF NO NUMBER + CTBL3 ;COMMAND IF NUMBER + STA 0,@LOC1 ;EXECUTED IF NUMBER + JMP 0(3) ;GO CALL HANDLER +LOC1: 0 +EXC: "! +SLS0: +SLS: "/ +C40: 40 + 0 +ADDRS: 0 +OCTL6: OCTAL + + + +;PROCESS A SLASH +SLSH: ADC 2,2(SKP) ;SET AC2=-1 +;PROCESS AN EXCLAMATION +EXCL: SUBZL 2,2 ;SET AC2=+1 + STA 2,MODE ;AND SET MODE + STA 0,ADDRS ;STORE ADDRESS + JMP EX0 +TSPC: LDA 1,C40 +TYPE: DOAS 1,TTO + SKPDN TTO + JMP .-1 + JMP 0(3) + + + +;BREAK POINT COMMANDS +;B0 PRINT ALL BREAKPOINTS +;N1 EXAMINE A BREAK POINT COUNT +;D0 DELETE ALL BREAKPOINTS +;D1 DELETE A BREAKPOINT + +B0: JSR PRINT ;CALL PRINTING SUBROUTINE + BPBLK+1 ;BREAK-POINT BLOCK + 5 ;DELTA ADDRESS + "B ;PRINT "B + +N1: JSR B2 ;GO CALCULATE ADDRESS + LDA 1,0(2) ;GET CADDRESS + MOVL 1,1(SZC) ;TEST ACTIVE + JMP RETN ;INACTIVE, ERROR + ADCZR 1,1 ;SET DEPOSIT MASK TO 77777 + ADC 2,2 ;SET TO / MODE + ADD 2,0 ;FORM REAL ADDRESS + JMP EX1 ;AND PROCEED + +D1: JSR B2 ;GO CALCULATE ADDRESS + ADCZL 3,3 ;SET CONT AND ENTER D0 + JMP D0+3 + +D0: LDA 2,B0+1 ;GET ADDRESS + LDA 0,B0+2 ;GET CONSTANT + NEG 0,3 ;FORM COUNT + SUBZR 1,1 ;SET AC1=100000 +D2: INC 3,3(SNR) ;TEST FOR COMPLETION + JMP RETN ;YES, EXIT + STA 1,0(2) ;NO, CLEAR BREAK POINT + ADD 0,2 ;UPDATE ADDRESS + JMP D2 ;AND PROCEED + +;B2 FORM (AC0.AND.3)*5+BPBLK+1 INTO AC0,AC2 +B2: LDA 1,CN3 + AND 1,0 + MOVZL 0,1 + MOVZL 1,1 + ADD 1,0 + LDA 1,B0+1 + ADD 1,0 + MOV 0,2 + JMP 0(3) +CN3: 3 + + ;TAPE 2-DEBUGGER + + +;SUBROUTINE TO PRINT 4 LINES +; +;CALLING SEQUENCE: +; JSR PRINT +; INITIAL ADDRESS +; DELTA ADDRESS +; CHARACTER +; RETURN IS MADE TO "BGN" + +PRINT: STA 3,PRN3 ;SAVE AC3 + SUB 0,0 ;CLEAR AC0 + LDA 1,0(3) ;GET INITIAL ADDRESS + +PRN0: STA 0,PRN4 ;SAVE # + STA 1,F1 ;SAVE ADDRESS + JSR OCTAL ;PRINT # + 7-1 ;1 DIGIT + LDA 2,PRN3 ;GET AC3 + LDA 1,2(2) ;GET CHARACTER + JSR TYPE ;AND TYPE IT + LDA 0,@F1 + MOVR 1,1(SNC) ;TEST THE MODE + MOVL% 0,0(SNC) + JMP .+2 + JMP PRN1 ;INACTIVE BP, DON'T PRINT + JSR TSPC + JSR OCTAL + 7-6 ;PRINT AS 6 DIGITS +PRN1: JSR TSPC ;TYPE SPACE + LDA 1,F1 ;NOW, GET ADDRESS + ISZ PRN4 ;INCREMENT NUMBER + LDA 3,PRN3 ;GET AC3 + LDA 2,1(3) ;GET DELTA DDRESS + ADD 2,1 ;UPDATE ADDRESS + LDA 0,PRN4 ;GET NUMBER + LDA 3,CN3 + ADC% 3,0(SZR) ;AND TEST FOR DONE + JMP PRN0 ;NO +RETN: JMP @.+1 ;RETURN + BGN-1 + +PRN3: 0 +PRN4: 0 ;NUMBER + + + +;ACCUMULATOR COMMANDS +;A0 PRINT ALL AC'S +;A1 EXAMINE AN AC + +A1: LDA 1,CN3 + AND 1,0 + LDA 1,A0+1 + ADD 1,0 ;FORM ADDRESS + ADC 2,2 ;SET TO / MODE + JMP EX0 ;AND PROCEED + +A0: JSR PRINT ;CALL PRINTER + SAC ;INITIAL ADDRESS + 1 ;DELTA ADDRESS + "A ;PRINT A + +RUN: 0 ;SAVED RUN LOCATION + + +;OCTAL PRINTER +;CALLING SEQUENCE: +; +; JSR OCTAL (AC0=NUMBER TO BE PRINTED +; 7-NUMBER OF OCTAL DIGITS +; RETURN + +OCTAL: LDA 1,0(3) ;GET ARGUMENT + STA 1,INST ;AND SAVE IT + INC 3,3 + STA 3,ADR ;SAVE UPDATED RETURN + SUBZR 2,2(SKP) ;GET A BIT IN LOC 0 + SUB 2,0(SKP) +OCTL1: LDA 1,C57 ;GET A 0-1 + INC 1,1 + SUBZ% 2,0(SZC) ;COMPARE + JMP .-4 ;TOO SMALL, ADD 1 TO DIGIT + JSR OCTL2 ;OUTPUT THIS DIGIT + MOVZR 2,2 ;AND MOVE THE OUTPUT + MOVZR 2,2 ;NUMBER 1 OCTAL POSITION + MOVZR 2,2(SZR) + JMP OCTL1 ;DO THE NEXT + JMP @ADR ;ALL DONE, EXIT + + +OCTL2: DSZ INST ;TEST FOR IGNORING + JMP 0(3) ;STILL IGNORING + ISZ INST + JMP TYPE + +C57: 57 + + ;PROCEED FROM TRAP BY EXECUTING TRAP INSTRUCTION +;AND PLACING ACTIVE TRAPS BACK INTO PROGRAM + +PRCD: LDA 0,@RLOC ;GET THE INSTRUCTION + STA 0,INST ;AND SAVE IT FOR EXECUTION + LDA 1,MSK1 ;GET MASK FOR BITS 0,2 + AND 0,1 + LDA 3,MSK1+1 ;TEST FOR AN IO INSTRUCTION + SUB 1,3(SNR) + JMP PRCD0 ;YES + MOVL% 0,0(SNC) ;NO, TEST FOR ALC + JMP PRCD2 ;NO, IT IS MEM REF + +PRCD0: JSR @PTBR ;PUT IN THE BREAK POINTS +INST: 0 ;EXECUTE THE INSTRUCTION + DSZ RLOC ;IT DIDN'T SKIP + ISZ RLOC ;IT DID SKIP + ISZ RLOC + JMP GO+1 +;R RUN PROGRAM +RN: LDA 0,RUN ;GET LOCATION +RN1: MOVL 0,0, ;USE ARGUMENT + MOVZR 0,0 ;BUT CLEAR BIT 0 + STA 0,RLOC +GO: JSR @PTBR ;PUT IN THE BREAKPOINTS + DSZ INFL0 ;TEST IF INTERRUPT IS ON + JMP @RLOC ;NO, EXIT WITH IT OFF + INTEN ;YES, TURN IT ON + JMP @RLOC ;AND EXIT +MSK1: 160000 + 060000 +PTBR: PUTBR +CLF: CRLF +RLOC: 0 + + + +;PROCESS MEMORY REFERENCE INSTRUCTION +;DO ALL INDEXING TO CALCULATE AN INITIAL +;EFFECTIVE ADDRESS, AND TEH DO ALL +;NECESSARY DEFER CYCLES + +PRCD2: LDA 1,MSK4 ;GET AN 8 BIT MASK + MOV 1,2 ;AND PUT A COPY INTO AC2 + ANDS 0,2 ;8 BITS INTO LH OF AC2 + MOVL% 2,2(SZC) ;TEST BIT 8 OF INSTRUCTION + ADDS 1,2(SKP) + MOVS 2,2 ;POSITIVE EXTEND +;NOW, EXAMINE THE INDEX FIELD + LDA 3,MSK5 ;MASK FOR BITS 6,7 + AND 0,3(SNR) ;PUT INDEX BITS INTO AC3 + AND 1,2 ;X=0, AC2 TO 8 BITS + LDA 1,MSK5+1 ;GET BIT 7 CONSTANT + SUB 0,0 ;CLEAR AC0 + SUB 1,3(SNR) ;TEST FOR X=1 + LDA 0,RLOC ;YES, USE TRAP LOCATION + SUB 1,3(SNR) ;TEST FOR X=2 + LDA 0,@SAC2 ;YES, USE AC2 + SUB 1,3(SNR) + LDA 0,@SAC3 ;UES AC3 + ADD 0,2 ;AC2=EFFECTIVE ADDRESS(FIRST STAGE) + +;NOW, TEST THE DEFER BIT + LDA 0,INST + LDA 1,MSK5+2 + AND% 0,1(SNR) + JMP PRCD5 ;BIT 5=0, GO DO INSTRUCTION + +;DO THE DEFER CYCLE +PRCD3: LDA 3,MSK5+3 ;BITS 1-11 + AND 2,3 + LDA 1,MSK5+4 ;TEST FOR 000 000 000 01X XXX + SUB 1,3(SZR) + JMP PRCD4 ;NOT AUTO UP OR DOWN + LDA 0,C10 ;TEST FOR UP OR DOWN + AND 2,0(SNR) + JMP .+4 ;UP + DSZ 0(2) ;DOWN + JMP PRCD4 ;CONTINUE + JMP PRCD4 + ISZ 0(2) ;UP + JMP PRCD4 +ADR: 0 +F1: 0 + + +;DO THE DEFER +PRCD4: LDA 2,0(2) ;FETCH + MOVL% 2,2(SZC) ;TEST BIT 0 + JMP PRCD3 ;SET, DO ANOTHER + +;AC2=EFFECTIVE ADDRESS +;DO THE INSTRUCTION +PRCD5: LDA 0,INST ;TEST FOR JMP OR JSR + LDA 1,MSK1+1 ;TEST FOR LDA STA + AND 0,1(SZR) + JMP PRCD6 ;YES + LDA 1,MSK6 ;MASK FOR BITS 3,4 + AND 0,1(SNR) + JMP .+7 ;A JUMP + LDA 3,MSK6+1 ;BIT 4 + SUB 1,3(SZR) + JMP PRCD6 ;NOT JSR + LDA 0,RLOC ;JSR + INC 0,0 + STA 0,@SAC3 ;SET AC3 + STA 2,RLOC ;SET THE NEW PC + JMP GO ;AND DO A JMP +;LDA OR STA, ISZ OR DSZ +PRCD6: STA 2,ADR + LDA 1,MSK6+2 ;CLEAR OUT BITS 5-15 + AND 1,0 + LDA 1,MSK6+3 + ADD 1,0 ;FORM REL INSTRUCTION + STA 0,INST ;RESTORE INSTRUCTION + JMP PRCD0 ;AND PROCEED + +;CONSTANTS, ETC +SAC2: SAC+2 +SAC3: SAC+3 +C10: 10 +MSK4: 377 +MSK5: 001400 ;BITS 6,7 + 000400 ;BIT 7 + 002000 ;BIT 5 + 077760 ;BITS 1-11 + 000020 + +MSK6: 014000 ;BITS 3,4 + 004000 ;BIT 4 + 174000 ;BITS 0-4 + ADR-INST+2400 ;RELATIVE+@ +INFL0: 0 + + +;PROCESS MULTI-FIELD COMMAND + +MLTFL: MOVL 0,0 + MOVZR 0,0 ;CLEAR BIT 0 + STA 0,F1 + JSR @INPT + 77777 + CTBL5 + CTBL4 + STA 0,F2 + JMP 0(3) +INPT: INPUT + + +;SEARCH ALL OF MEMORY +SRCHA: ADCZR 0,0 ;GET ENDING ADDRESS +;SEARCH TO C(AC0) +SRCH0: STA 0,F2 ;SAVE FINAL ADDRESS + SUB 0,0 ;GET FIRST ADDRESS + STA 0,F1 ;AND STORE IT + +;DO A SEARCH +SRCH: NIOC TTI ;CLEAR INPUT DONE + LDA 0,@F1 + LDA 1,MASK + AND 0,1 + LDA 2,WORD1 + SUB% 1,2(SZR) + JMP SRCH1 + LDA 0,F1 + JSR @OCTL ;PRINT ADDRESS + 7-5 + JSR @TSPCE + LDA 0,@F1 + JSR @OCTL + 7-6 + JSR @CLF +SRCH1: LDA 0,F1 + LDA 1,F2 + SKPDN TTI ;STOP IF KEY STRUCK + SUB 0,1(SNR) + JMP @BEGIN + ISZ F1 + JMP SRCH +F2: 0 +MASK: 0 +WORD1: 0 +OCTL: OCTAL +TSPCE: TSPC +TYP: TYPE +BEGIN: BGN-1 +SA: 0 + + +;PUNCH MEMORY +PN: JSR HWHCH ;HALT IF TTO +PBLK: LDA 2,F1 ;GET FIRST ADDRESS + STA 2,SA + LDA 0,F2 ;GET LAST ADDRESS + SUBL% 2,0(SZC) + JMP PDONE ;PUNCHING IS DONE + MOV 2,1 + ADC 0,1 ;AC1=COUNT + LDA 3,C20 ;GET 20 OCTAL + ADDZ% 1,3(SNC) ;SEE IF COUNT.GE.20 + NEG 3,1 ;YES, SET TO 20(8) + MOV 2,3 + SUB 1,3 + STA 3,F1 ;STORE UPDATED F1 + STA 1,ADR ;SAVE COUNT + JSR PWORD ;PUNCH COUNT + MOV 2,1 + JSR PWORD ;PUNCH ADDRESS + +;NOW, CALCULATE THE CHECKSUM + LDA 0,ADR + MOV 0,1 ;GET A COUNT + ADD 2,1 ;ADD ADDRESS TO CHECKSUM +CHK: LDA 3,0(2) ;GET WORD + ADD 3,1 ;ADD INTO CHECKSUM + INC 2,2 ;INCREMENT ADDRESS + INC 0,0(SZR) ;INCREMENT COUNT + JMP CHK ;NON-ZERO, PROCEED + NEG 1,1 ;OK, NEGATE THE SUM + JSR PWORD ;AND PUNCH IT + LDA 2,SA ;GET FIRST ADDRESS + LDA 1,0(2) ;GET WORD + JSR PWORD ;AND PUNCH IT + INC 2,2 ;INCREMENT ADDRESS + ISZ ADR ;TEST FOR COMPLETION + JMP .-4 ;NOT DONE, DO THE NEXT + SUBZL 2,2 ;PUNCH 2 BLANKS + MOVZL 2,2 + JSR BLNK + JMP PBLK ;DO THE NEXT BLOCK +C20: 20 + + + +;PUNCH THE WORD IN AC1 +PWORD: STA 3,SRTN ;SAVE THE RETURN + JSR PUN ;PUNCH BITS 8-15 + MOVS 1,1 + JSR PUN ;NOW PUNCH BITS 0-7 + JMP @SRTN ;AND RETURN +SRTN: 0 ;SAVED RETURN + +;PUNCH BLANKS IN AC2 +BLNK: STA 3,SRTN + NEG 2,2 + SUB 1,1 + JSR PUN ;PUNCH THE BLANK + INC 2,2(SZR) + JMP .-3 + JMP @SRTN ;ALL DONE, RETURN + +;PUNCH C(AC1) +PUN: LDA 0,PUNCH ;TEST WHICH DEVICE + MOV 0,0(SNR) + JMP @TYP ;USE THE TTO + DOAS 1,PTP ;USE THE PTP + SKPDN PTP + JMP .-1 + JMP 0(3) ;AND RETURN + +;HALT IF PUNCHING IS TO THE TTO +HWHCH: LDA 0,PUNCH + MOV 0,0(SNR) + HALT + JMP 0(3) +PUNCH: 0 ;0,USE TTO, 1,USE PTP + +E1: MOVL 0,2(SKP) ;ENTRY IF ARG +E2: SUBZR 2,2(SKP) ;ENTRY IF NO ARG + MOVZR 2,2 + JSR HWHCH + SUBZL 1,1 + JSR PWORD ;PUNCH A 1 + MOV 2,1 + JSR PWORD ;PUNCH ADDRESS + COM 2,1 + JSR PWORD ;PUNCH CHECKSUM +PDONE: JSR HWHCH ;HALT IF TTO + JMP @BEGIN ;AND RETURN + + +;F PUNCH TAPE FEEDS +F: MOVZL 0,2 + MOVZL 2,2 + ADDZL 0,2 ;MULTIPLY AC0 TIMES 10 + JSR HWHCH ;HALT IF TTO + JSR BLNK + JMP PDONE + + + +;BREAK POINT BLOCK +;BLOCK FORMAT +;0 COUNT +;1 LOCATION (BIT0=1 INDICATES INACTIVE) +;2 INSTRUCTION +;3 BP INSTRUCTION +;4 ENTRY POINT +BPBLK: 1 + 100000 + HALT + JMP @10 + TRP1 + + 1 + 100000 + HALT + JMP @11 + TRP2 + + 1 + 100000 + HALT + JMP @12 + TRP3 + + 1 + 100000 + HALT + JMP @13 + TRP4 + + + + +;DEFINE MESSAGE TABLE +MESTBL: +MESG1=400*0 + INPT9-1 ;CR,LF +MESG2=400*1 + INPT9+1 ;NOTHING +MESG3=400*2 + SLS0+1 ;SPACE +MESG4=400*3 + SLS0 ;/ SPACE +MESG5=400*4 + INPT9 ;LINE FEED +MESG6=400*5 + SLUF ;SLUFF +MESG7=400*6+100000 + -1 ;INPUT MASK +MESG8=400*7+100000 + 1 +MESG9=400*10+100000 + 3 +MESG0=400*11+100000 + 77777 + + ;CONTROL TABLE 1 +;PROCESSED IF NOT NUMBER +CTBL1: "M+MESG7 ;M EXAMINE MASK + MASK + + "C+MESG8 ;C EXAMINE CARRY + SAC+4 + + "E+MESG1 ;PUNCH END BLOCK + E2 + + "H+MESG8 ;H EXAMINE TTO/PTP + PUNCH + + "I+MESG8 ;I EXAMINE INTERRUPT + INFL0 + + "W+MESG7 ;W EXAMINE WORD + WORD1 + + "T+MESG9 ;T EXAMINE TTI/TTO + TTFLG + + "P+MESG1 ;P PROCEED + PR0 + + "R+MESG1 ;R RUN + RN + + "A+MESG1 ;A EXAMINE AC'S + A0 + + "B+MESG1 ;B EXAMINE BREAKPOINTS + B0 + + "L+MESG0 ;L EXAMINE START LOCATION + RUN + + "S+MESG1 ;S SEARCH ALL OF MEMORY + SRCHA + + + + "D+MESG1 ;D DELETE BREAKPOINTS + D0 + + "^+MESG2 + UPR0 + +CTBL3: 12+MESG6 + LF0 + + "^+MESG1 + UPR0 + + 15+MESG5 + BGN + + 0 + + + +;CONTROL TABLE 2 +;PROCESSED IF NUMBER +CTBL2: 12+MESG6 + ERROR + + 15+MESG5 + ERROR + + "/+MESG3 + SLSH + + "!+MESG3 + EXCL + + "P+MESG1 ;P PROCEED FROM BREAKPOINTS + PR + + "N+MESG4 ;N EXAMINE BP COUNT + N1 + + "S+MESG1 ;S SEARCH TO ARG + SRCH0 + + + + "A+MESG4 ;A EXAMINE AN AC + A1 + + "B+MESG2 ;B SET A BREAKPOINT + B1 + + "D+MESG1 ;D DELETE A BREAKPOINT + D1 + + "R+MESG1 ;R RUN PROGRAM + RN1 + + ",+MESG2 + MLTFL + + "=+MESG2 ;= TYPE EXPRESSION + EQUAL + + "E+MESG1 ;E END BINARY TAPE + E1 + + "F+MESG1 ;F PUNCH TAPE FEED + F + + 0 + + + + +;MULTI-FIELD CONTROL TABLE +CTBL4: "S+MESG1 + SRCH + + "P+MESG1 ;P PUNCH MEMORY + PN + +CTBL5: 0 + +SLUF: 15 + 01 + 0 + + +END BGN-1 + +  \ No newline at end of file diff --git a/src/nova/displa.51 b/src/nova/displa.51 new file mode 100755 index 00000000..cf4c6649 --- /dev/null +++ b/src/nova/displa.51 @@ -0,0 +1,1554 @@ + + TITLE NOVA DISPLAYî + + A==0 ;ACCUMULATORS + B==1 + C==2 + D==3 + + RTC==14 ;IO DEVICES + DSPL==41 + PDPI==6 + PDPO==7 + + DRANEW==3 ;CODE MODE SHIFTED RIGHT + ACK==6 ;PDP10 ERROR ACKNOWLEDGE + + LEN==7000 ;DISPLAY AREA LENGTH + LLEN==2000 ;LISTS OF LISTS LENGTH + + LOADER==17000 ;ADDRESS OF NOVA BLOCK LOADER (HIGHEST LEGAL ADDR +1) + + +DEFINE ERROR X + LDA A,[X] + JMP @CTENER +TERMIN + + LOC 0 + 0 +CINTRP: INTRP +CRESET: RESET +VERS: .FNAM2_-18. + + + LOC 50 + +TENCOM: 200 ;PDP10 COMMAND CODES -- MVTO + 220 ;PTAT + 260 ;PDWN + 100 ;SHIP + 120 ;ESHIP + 140 ;DST + 160 ;DREM + 300 ;SHOW + 320 ;HIDE + 360 ;RESET + 340 ;WIPE + 240 ;NFRM +FDL: 0 ;BADCOM -- USE ALSO AS FAKE DISPLAY LIST +DCOM: MVTO ;COMMAND SUBROUTINES + PTAT + PDWN + SHIP + ESHIP + DST + DREM + SHOW + HIDE + RESET +CWIPE: WIPE + NFRM +CONTIN: CLOCK + CCLOCK=CONTIN +TENCT: 3 ;MVTO + 10 ;PTAT + 2 ;PDWN + 2 ;SHIP + 1 ;ESHIP + 2 ;DST + 2 ;DREM + 1 ;SHOW + 1 ;HIDE + 1 ;RESET + 1 ;WIPE + 1 ;NFRM + 1 ;BADCOM +GETWD: BLOCK 10 + + +CFDL: FDL +CDLT: DLT +CDLB: DLB +CLDL: DLB-DLT+1 +CAVAIL: AVAIL +CROV: ROV +CTOP: DLLT +CTOP2: DLLT-4 +CBOT: DLLB +PO: 0 +N: 0 +R: DLLT-4 +CBLT: BLT +CDRAW: DRAW +CDRAAD: DRAAD +CDRBM: DRBM +CFRAM: FRAM +CREM: REM +CINST: INST +COUTQ: OUTQ +CINQ: INQ +CPTBUF: PTBUF ;CPTBUF-1 MUST BE NON-0 +CTENER: TENERR +CGETEN: GETEN +CSSHIP: SSHIP +CEESHI: EESHIP +CDLIM: DLIM + +CTEMP: 0 +CTEMP1: 0 +STIME: 0 +PKPTR: DLLT-4 +GETCT: 0 +CPX: PX +LISTAD: 0 +CPQ: CPQTOP +CDISAD: CPTBUF-1 +DISAD: CPTBUF-1 +DRARET: 0 +DRACNT: 0 +DRLEN: 0 +DRASV: 0 +CDROUT: DROUT +CURX: 0 +CURY: 0 +XF: 0 +YF: 0 +XT: 0 +YT: 0 +HDFLG: 1 ;FLAGS +ERRFL: 0 +GETFL: 0 +SHIPFL: 0 +SBMFL: 0 +DBMFL: 0 +XDIR: 0 +YDIR: 0 + +;INTERRUPT-- +;IF PDP-10 INTERRUPTS INSERT WORD IN 10 QUEUE + +ITSVA: 0 ;ACCUMULATORS AND CARRY SAVED HERE +ITSVB: 0 +ITSVC: 0 +ITSVD: 0 +ITSVCY: 0 + +INTRP: STA A,ITSVA ;SAVE ACCUMULATORS + STA B,ITSVB + STA C,ITSVC + STA D,ITSVD + MOVL D,D ;SAVE CARRY + STA D,ITSVCY + + + SKPDZ PDPI ;CHECK PDP-10 INPUT + JMP ITPDP + + DIBC A,CPU ;CLEAR "PHANTOM INTERRUPT" + HALT ;STOP + + JMP ITRES ;RESTORE WORLD + + +ITPDP: DIAS A,PDPI + LDA B,[ACK] + SUB A,B(SNR) + JMP ITPDP2 ;CHAR IS ERROR ACKNOWLEDGE + + LDA D,ERRFL + MOV% D,D(SZR) + JMP ITRES ;WAITING FOR 10 TO ACKNOWLEDGE ERROR + + LDA C,[37] ;MASK FOR ALL BUT DATA BITS + ANDZR C,A(SNC) + JMP ITPDP1 + ADDZL A,A ;SHIFT LEFT 4 + ADDZL A,A + STA A,PWORD + JMP ITRES +ITPDP1: LDA B,PWORD + ADD B,A + JSR @CINQ + JMP ITRES + +ITPDP2: STA B,ERRFL ;RESET ERROR FLAG + JMP ITRES + +PWORD: 0 ;PDP-10 WORD SAVED HERE + +ITRES: LDA A,ITSVCY ;RESTORE INTERRUPTS + MOVR A,A + LDA A,ITSVA ;RESTORE ACCUMULATORS + LDA B,ITSVB + LDA C,ITSVC + LDA D,ITSVD + + INTEN ;ENABLE INTERRUPTS + JMP @0 ;RETURN TO ADDRESS INTERRUPTED FROM + + +;RESET-- +;RESTART PROGRAM +;RESET POINTERS AND VARIABLES +;WIPE OUT BUFFERS + +RESET: INTDS + + LDA B,CDLB + LDA C,CTOP + LDA D,[4] + SUB A,A(SKP) ;A/0 (SKIPA) +RSZDL: ADD D,C + STA A,0(C) ;ZERO DLLT THRU DLB + STA A,1(C) + SUBZ% B,C(SNC) + JMP RSZDL + + LDA D,CDLT ;FIX DL + LDA C,CLDL + STA C,0(D) + STA A,1(D) + + LDA C,CROV ;FIX AVAIL AND ROV + STA A,0(C) + STA A,1(C) + LDA C,CAVAIL + STA A,0(C) + STA D,1(C) +RSZCN: IRPS X,,[STIME SBMFL DBMFL SHIPFL CURX CURY +GETFL PO N 20 DRASV XDIR YDIR] + STA A,X + TERMIN + + LDA C,CPX + IRPS X,,0 1 2 3 4 5 + STA A,X(C) + TERMIN + + LDA A,CTOP2 + STA A,PKPTR + STA A,R + + + SUBZL A,A + STA A,HDFLG + LDA A,[2] + STA A,@CPTBUF + LDA A,CDISAD + STA A,DISAD + LDA C,CPQ + LDA A,0(C) + STA A,1(C) + STA A,2(C) + +;FALLS THROUGH + + +;FALLS IN + +RSIO: IORST ;RESET IO DEVICES + LDA A,[176777] ;MASK OUT ALL BUT PDPI (AND CPU) + MSKO A, + NIOS PDPI ;PDP10 INPUT + NIOC PDPO ;PDP10 OUTPUT + LDA D,CFDL + ADC A,A + DOB D,DSPL ;FAKE DISPLAY LIST (NULL WORD) + DOCS A,DSPL ;LENGTH=1 + + INTEN + + JMP @CGETEN + + +;DISPLAY OUT-- +;GET NEXT ACTIVE DISPLAY LIST FROM DISAD +;GIVE ADDRESS OF START OF DISPLAY INSTRUCTIONS +;AND LENGTH OF DISPLAY INSTRUCTIONS TO DISPLAY + +DSO: SKPBZ DSPL + JMP .-1 ;DISPLAY STILL BUSY + LDA C,DISAD + MOV% C,C(SNR) + JMP DSO2 ;NOTHING TO DISPLAY + LDA D,1(C) ;ADDR OF LOAD DISPLAY LIST + LDA A,0(D) ;LOAD LENGTH OF DISPL LIST + NEG A,A + INC A,A ;-(LENGTH-1) + INC D,D ;START OF DISP INSTRUCTIONS + MOVL% A,A(SNC) + JMP DSO3 + DOB D,DSPL ;ADDRESS TO B BUFFER + DOCS A,DSPL ;LENGTH TO C BUFFER + +DSO2: JMP @CGETEN + +DSO3: HALT ;TRAP FOR POSITIVE LENGTH + +;FALLS THROUGH + +;FALLS IN + +;GET 10-- +;TRY TO READ PDP10 CODES FROM QUEUE +;JUMP TO APPROPRIATE SUBROUTINE WHEN +;CODE IS RECOGNIZED + +GETEN: LDA A,GETFL + MOV% A,A(SZR) ;READY TO READ CODE? + JMP GETEN6 ;NO + JSR @COUTQ ;TRY TO READ CODE + JMP @CCLOCK ;FAIL + STA A,GETWD ;SUCCEED + LDA C,[360] ;MASK ALL BUT CODE BITS + AND C,A + SUB C,C(SKP) ;IDENTIFY CODE (SKIPA) + +GETEN1: INC C,C + LDA B,TENCOM(C) + MOV B,B(SNR) ;0=ERROR CANT IDENTIFY + JMP GETEN2 + SUB% A,B(SZR) + JMP GETEN1 + +GETEN2: STA C,GETC ;FOUND CODE + LDA A,TENCT(C) ;NUMBER OF WORDS TO READ + STA A,GETCT + DSZ GETCT + JMP GETEN4 +GETEN3: SUB B,B ;ALL WORDS READ + STA B,GETFL + LDA C,GETC + JMP @DCOM(C) +GETEN4: SUBZL C,C +GETEN5: STA C,GETC1 ;NUMBER OF WORDS READ +GETEN6: JSR @COUTQ ;TRY TO READ NEXT WORD + JMP GETEN7 ;FAIL + LDA C,GETC1 + STA A,+GETWD(C) + INC C,C + LDA A,GETCT + ADCZ% A,C(SNC) ;GETC1>GETCT? + 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 C= (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