1
0
mirror of https://github.com/PDP-10/its.git synced 2026-05-23 05:52:16 +00:00
Files
PDP-10.its/src/syseng/musrun.15
Lars Brinkhoff 2fae7bf7f1 MUSRUN - play music files.
The PDP-6 must be attached.  Type L and a file name to load it.  Start
the PDP-6 from 0.  Toggle switch 1 on.  Set address switches to 0 to
play from the memory indicator lights.
2020-04-02 05:54:26 +02:00

964 lines
27 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE MUSRUN 6/10
RELOCATABLE ;LOADED WITH H10D WHICH IS ASSEMBLED WITH OFFSET
IF1,.INSRT DSK:JSF;STNDRD MACROS
REL0:: ;RELOCATABLE 0
;AC DEFINITIONS
FF=0
A=1
AA=2
B=3
C=4
D=5
E=6
G=10
T=14
TT=15
Q=16
P=17
;IO CHANNELS
TYIC==1 ;TYPEIN
TYOC==2 ;TYPEOUT
UTYIC==3 ;LOADER IN
UTYOC==4 ;DUMPER OUT
USRIC==6 ;PDP10 IN
USROC==7 ;PDP10 OUT
;FLAG DEFINITIONS
GETTY==RHF FF,1 ;ONE => GE TTY
PDPO==RHF FF,2 ;ONE => PDP10 IS OPEN
ARGF==RHF FF,4 ;ARGUMENT TYPED
ARGCF==RHF FF,10 ;ARGUMENT COMPLETED
UTYIO==RHF FF,20 ;CLOSE UTYIC ON ERROR
FFFLG==RHF FF,40 ;USED BY GETFIL
LAFLG==RHF FF,100 ;NO USED BUT LOOKED AT BY GETFIL
MINUSF==RHF FF,200 ;MINUS SIGN TYPED
RTYIF==RHF FF,400 ;AVAIL. FOR MISC.
RUNF==RHF FF,1000 ;MUSRUN THINKS PDP10 IS RUNNING
NUPRGF==RHF FF,2000 ;PROGRAM IN PDP10 IS NEW PROGRAM
UTYOO==RHF FF,4000 ;DELETE UTYOC ON ERROR
;RANDOM
LPDL==40 ;LENGTH OF PDL
UTIBFL==200 ;LENGTH OF LOADER BUFFER
LCMBUF==40 ;LENGTH OF TYPEIN BUFFER
IODEV PI,PI ;SO TSDDT WILL TYPE IT OUT
STIME==1 ;STANDARD WAIT TIME IN THIRTIETHS
UTOBFL==UTIBFL&<-2> ;LENGTH OF DUMPER BUFFER (MUST BE EVEN)
MOBY==0 ;FOR 16K
;MACROS
DEFINE CMD CHAR,ROUT,BLURB
DEF CHR,\<CHAR>-40,[
<ROUT>-REL0
]
IFSE [BLURB],CONCAT CHB,\<CHAR>-40,==0
IFSN [BLURB],[DEF CHB,\<CHAR>-40,[
[ASCIZ \BLURB\]-REL0
]]
TERMIN
DEFINE TAG ADR
DEF TAG,\TAGNR,[
ADR=],\.,[+OFST
]
TAGNR==TAGNR+1
TERMIN
TAGNR==0
IF1,[REPEAT 100,[CONCAT CHR,\.RPCNT,==0
CONCAT CHB,\.RPCNT,==0
]
]
;TTY ROUTINES
;USE STANDARD ONES SO NOT TOO HARD TO KEEP UP WITH SYSTEMS
DEFINE RTYIQM ;MACRO EXECUTED ON RUBOUT TO BEG OF BUFFER
ERR HUH
TERMIN
.INSRT JSF;DSK:STNDRD TTY
SIXTYO: JUMPE AA,CPOPJ ;TYPE OUT SIXBIT WORD IN AA
MOVEI A,0
LSHC A,6
ADDI A,40
PUSHJ P,TYO
JRST SIXTYO
SPACE4: PUSHJ P,.+1 ;TYPE OUT FOUR SPACES
SPACE2: PUSH P,CTYO ;TYPE OUT TWO SPACES
SPACE: MOVEI A,40 ;TYPE OUT ONE SPACE
CTYO: JRST TYO ;(CONTAINS TYO IN RIGHT HALF)
CRFF: TESTF E,GETTY ;GETTY => CLEAR SCREEN OR OTHER => TYPE CRLF
JRST FORMF
JRST CRLF
TMPLOC 41,JSR UUOH
DEFINE UUOIRP A
IRPS UUO,,[GET BGET PUT BPUT
ACCESS CTYPE TYPE ERR]
A
TERMIN
TERMIN
UUOIRP MINUUO==77-.IRPCNT, ;GET OP CODE OF MINIMUM UUO
UUOIRP UUO=<MINUUO+.IRPCNT>_33, ;DEFINE UUO'S
UUOH: 0 ;UUO PROCESSOR
PUSH P,A ;SAVE A
PUSH P,AA ;SAVE AA
PUSH P,B ;SAVE B
PUSH P,C ;SAVE C
MOVEI C,-C(P) ;SET POINTER TO PUSH'ED AC'S FOR ACRLOC
HRRZ B,40 ;GIVE UUO ROUTINE RH OF LOCATION 40
LDB AA,[270400,,40] ;GET AC FIELD FOR UUO PROCESSOR
LDB A,[331100,,40] ;GET OP CODE
CAIGE A,MINUUO ;IF TOO SMALL,
ILUUO: .VALUE ;THEN COMPLAIN
PUSHJ P,@UUODTB-MINUUO(A) ;CALL ROUTINE FOR INDIVIDUAL UUO
JRST .+2 ;NON-SKIP RETURN POINT
AOS UUOH ;ROUTINE SKIPPED, INCREMENT RETURN POINT
POP P,C ;RESTORE C
POP P,B ;RESTORE B
POP P,AA ;RESTORE AA
POP P,A ;RESTORE A
JRST 2,@UUOH ;RETURN
UUODTB: UUOIRP A!UUO ;DISPATCH TABLE
;MAYBE RELOCATE AA (DOESN'T WORK FOR 0)
ACRLOC: CAIG AA,C ;IF .LE. MAXIMUM PUSHED AC,
ADDI AA,(C) ;THEN RELOCATE TO POINT TO AC ON PDL
POPJ P,
;GET THE CONTENTS OF THE AC POINTED TO BY AA INTO A
GETAC: PUSHJ P,ACRLOC ;RELOCATE AA
MOVE A,(AA) ;GET THE AC
POPJ P,
;RELOCATE AA, HRRO IT INTO A, AND SKIP-RETURN
GETACP: PUSHJ P,ACRLOC ;RELOCATE AA
HRROI A,(AA) ;GET THE AOBJN POINTER TO IT
JRST POPJ1 ;SKIP-RETURN
;GET AC,ADR ;GETS THE CONTENTS OF ADR (IN THE PDP10) INTO AC
;BGET AC,ADR ;GETS PDP10 CORE BLOCK STARTING AT ADR INTO BLOCK IN PDP6 SPECIFIED BY AOBJN POINTER IN AC
AGET: PUSHJ P,GETACP ;GET AOBJN POINTER TO AC, SKIP OVER .+1
ABGET: PUSHJ P,GETAC ;GET AOBJN POINTER FROM AC
.ACCESS USRIC,B ;SET UP POINTER TO PDP10 CORE
.IOT USRIC,A ;DO THE TRANSFER
POPJ P,
;PUT AC,ADR ;PUT CONTENTS OF AC INTO PDP10 LOCATION ADR
;BPUT AC,ADR ;PUT PDP6 BLOCK SPECIFIED BY AOBJN POINTER IN AC INTO PDP10 BLOCK STARTING AT ADR
APUT: PUSHJ P,GETACP ;GET AOBJN POINTER TO AC, SKIP-RETURN
ABPUT: PUSHJ P,GETAC ;GET THE AOBJN POINTER FROM AC
.ACCESS USROC,B ;SET UP POINTER TO PDP10 CORE
.IOT USROC,A ;DO THE TRANSFER
POPJ P,
;ACCESS IOCH,ADR ;SAME AS OLD VERSION OF .ACCESS
AACCES: DPB AA,[270400,,.+1] ;DEPOSIT IO CHANNEL
.ACCESS 0,B ;DO THE ACCESS ("0," FOR MACRO FOR PHASING IN)
POPJ P,
;CTYPE "CH ;TYPE OUT THE ASCII CHARACTER CH (PUSHJ TO TYO)
ACTYPE: MOVE A,B ;GET CHARACTER IN A
JRST TYO ;TYPE IT OUT AND RETURN
;TYPE [ASCIZ /STRING/] ;TYPE OUT "STRING" CALLING TO TYO
;ATYPE IS IN STNDRD TTY ROUTINES
;ERR [ASCIZ /STRING/] ;TYPE OUT STRING AND RETURN TO ERRET (ERROR)
AERR: TMODF ZE,UTYIO ;IF UTYIC SHOULD BE CLOSED,
.CLOSE UTYIC, ;THEN CLOSE IT
TESTF E,UTYOO ;IF FILE OPEN ON UTYOC SHOULD BE DELETED,
PUSHJ P,FLUSHO ;THEN DELETE IT
PUSHJ P,ATYPE ;TYPE OUT THE TEXT STRING,
LDB A,[270400,,40] ;GET AC FIELD,
CAIL A,NERRS ;IF ILLEGAL AC FIELD,
ILLERR: .VALUE ;THEN COMPLAIN
MOVE P,[-LPDL,,PDL] ;RESTORE PDL,
JRST @ERRDTB(A) ;GO TO RETURN POINT
ERRDTB: ERRET ;0, NORMAL ERROR RETURN POINT
NERRS==.-ERRDTB
IFGE NERRS-20,[PRINTC /TOO MANY ERR DISPATCHES.
/]
GETFIL: HRLM A,DNAM ;MODE FOR OPEN
PUSHJ P,SPACE ;TYPE OUT A SPACE
SETF FFFLG ;USED TO KEEP TRACK OF FILENAME COUNT
GFIL1: MOVEI C,0 ;INITIALIZE WORD
MOVE B,[440600,,C] ;SET UP BP FOR INPUT
GFIL2: PUSHJ P,RTYI ;GET CHARACTER IN A
CAIN A,": ;IF COLON...
JRST GCOL ;THEN PROCESS AS SUCH
CAIN A,"; ;SIMILARLY FOR SEMICOLON
JRST GSEMC
CAIN A,15 ;IF CARRIAGE RETURN...
MOVEI A,0 ;THEN CLEAR A
CAIN A," ;IF CONTROL Q...
JRST GFILCQ ;THEN GET NEXT CHARACTER AND TREAT AS NON-SYNTACTICAL
CAILE A,40 ;LOGICAL SPACE? (INCLUDING CR AND, WHEN ENABLED, LA)
JRST GFILC
JUMPE C,GFIL5 ;IGNORE NULL FILENAMES
EXCH C,FN2 ;NON-FIRST FILENAME, MOVE INTO SECOND,
TMODF ZE,FFFLG
MOVE C,[SIXBIT /MUSIC/] ;THIS FIRST NAME TYPED IN, CLOBBER FN1 TO "MUSIC"
MOVEM C,FN1 ;MOVE SECOND TO FIRST
GFIL5: JUMPN A,GFIL1 ;A=0 IF CHARACTER=CR OR ENABLED LA
POPJ P, ;DONE
GCOL: JUMPE C,GFIL1 ;IF HE WANTS THE NULL DEVICE HE GETS TO TYPE IT IN
HLRM C,DNAM ;MOVE TO RH OF DEVICE LOCATION
JRST GFIL1 ;LOOP
GSEMC: JUMPE C,GFIL1 ;NO NULL SYSTEM NAMES PLEASE
MOVEM C,SNAM ;MOVE TO SYSTEM NAME LOCATION
JRST GFIL1 ;LOOP
GFILCQ: PUSHJ P,RTYI ;CONTROL Q EATS UP THE NEXT CHARACTER
GFILC: SUBI A,40 ;CONVERT CHARACTER TO SIXBIT
TLNE B,770000 ;TOO MANY CHARACTERS?
IDPB A,B ;NO
JRST GFIL2 ;LOOP
;FFFLG USED TO SORT OUT FILENAMES
DNAM: (SIXBIT /DSK/) ;ROUTINE OUTPUTS HERE
FN1: SIXBIT /@/
FN2: SIXBIT /@/
SNAM: SIXBIT /PDP10/ ;SYSTEM NAME
BEG: MOVEI FF,0 ;INITIALIZE FLAGS
MOVE P,[-LPDL,,PDL]
PUSHJ P,TYINIT ;INITIALIZE TTY
PUSHJ P,CRFF ;TYPE CRLF OR CRFF
TYPE [ASCIZ /MUSRUN./]
MOVE AA,[.FNAM2]
PUSHJ P,SIXTYO
.SUSET [.SSNAM,,[SIXBIT /PDP10/]]
PUSHJ P,10INIT ;MUST BE LAST IN INITIALIZATION DUE TO POSSIBILITY OF FAILURE
GCMD1: PUSHJ P,CRRR
ERRET: CLEARF ARGF\ARGCF\MINUSF\RTYIF
SETZM OVAL
SETZM DVAL
SETZM VALUE
SETZM RTYIP ;COMMAND POINTER FOR TYPEIN WITH RUBOUT
GCMD: PUSHJ P,TYI
CAIL A,40
CAILE A,140
JRST N6B ;NOT SIXBIT
MOVEI T,-40(A)
IDIVI T,3
LDB T,DTBP(TT)
JUMPE T,ERRET ;IF NOT COMMAND THEN CLEAR STATUS OF ARG, BUT OTHERWISE IGNORE
PUSHJ P,REL0(T)
JRST GCMD1 ;ROUTINE DIDN'T SKIP, REINITIALIZE ARGUMENTS
JRST GCMD ;ROUTINE SKIPPED, DON'T REINITIALIZE
JRST ERRET ;ROUTINE SKIPPED TWICE, REINITIALIZE BUT DON'T TYPE CRRR
N6B: CAIN A,177 ;IF RUBOUT,
ERR HUH ;THEN RESET COMMAND STATUS
;INSERT NON-SIXBIT COMMANDS HERE
JRST ERRET ;REINITIALIZE ARGUMENT STATUS, OTHERWISE IGNORE
CMD "?,QUEST,LIST COMMANDS
QUEST: MOVE B,[441400,,BTB]
MOVEI T,40
PUSHJ P,CRFF
QUESTL: ILDB AA,B
CAIN AA,7777 ;DONE?
POPJ P, ;YES
JUMPE AA,QUSTL2 ;NO, BUT JUMP IF INACTIVE CHARACTER
MOVE A,T ;GET CHARACTER IN A FOR TYPEOUT
PUSHJ P,TYO ;TYPE OUT THE CHARACTER
PUSHJ P,SPACE4 ;TYPE 4 SPACES
TYPE REL0(AA) ;TYPE THE BLURB
PUSHJ P,CRLF ;NEW LINE
QUSTL2: AOJA T,QUESTL
;GET THE CURRENT VALUE INTO A AND SKIP, OR DON'T SKIP IF NO VALUE
ARGET: TESTF N,MINUSF ;IF MINUS NOT TYPED,
SKIPA A,VALUE ;THEN RETURN VALUE
MOVN A,VALUE ;RETURN NEGATIVE OF VALUE
TESTF E,ARGF
POPJ1: AOS (P) ;ARGUMENT EXISTS
CPOPJ: POPJ P,
;NUMBERS
REPEAT 10.,CMD "0+.RPCNT,NUM
NUM: TESTF E,ARGCF
ERR HUH ;ERROR IF CURRENT VALUE COMPLETED
SUBI A,"0 ;CONVERT CHARACTER TO DIGIT
MOVEI AA,10 ;UPDATE OCTAL VALUE
IMULM AA,OVAL
ADDM A,OVAL
MOVEI AA,10. ;UPDATE DECIMAL VALUE
IMULM AA,DVAL
ADDM A,DVAL
MOVE AA,CRADIX ;UPDATE VALUE IN CURRENT RADIX
IMULM AA,VALUE
ADDM A,VALUE
SETF ARGF
JRST POPJ1 ;SKIP-RETURN SO NOT TO KILL CURRENT VALUE
CMD ".,PT,FORCE CURRENT VALUE TO DECIMAL
CMD "',SQUOT,FORCE CURRENT VALUE TO OCTAL
PT: SKIPA A,DVAL
SQUOT: MOVE A,OVAL
TMODF ZE,ARGF ;BARF IF NO ARGUMENT
VALRET: TMODF OE,ARGF ;ENTRY TO RETURN VALUE IN A, BARF IF ARGUMENT
ERR HUH
TMODF OE,ARGCF ;BARF IF CURRENT VALUE COMPLETE
ERR HUH ;ERROR IF NO CURRENT VALUE OR CURRENT VALUE COMPLETED
MOVEM A,VALUE
JRST POPJ1
OVAL: 0 ;CURRENT VALUE, UPDATED IN OCTAL
DVAL: 0 ;CURRENT VALUE, UPDATED IN DECIMAL
VALUE: 0 ;CURRENT VALUE, UPDATED IN CURRENT RADIX, OR FINAL
CRADIX: 8 ;CURRENT RADIX
RCHAR: "' ;CHARACTER TO DOCUMENT RADIX ON TYPEOUT
CMD "R,RDXSEL,SELECT DEFAULT RADIX
RDXSEL: PUSHJ P,ARGET ;GET ARGUMENT IN A
ERR HUH ;NO ARGUMENT SPECIFIED
MOVEM A,CRADIX
MOVEI B,40
CAIN A,8
MOVEI B,"'
CAIN A,10.
MOVEI B,".
MOVEM B,RCHAR
POPJ P,
CMD "=,EQLS,PRINT OUT VALUE IN CURRENT RADIX
EQLS: PUSHJ P,ARGET
ERR HUH
RTYO: PUSHJ P,RDXTYO
MOVE A,RCHAR
JRST TYO
RDXTYO: IDIV A,CRADIX
JUMPE A,RDXTY2
HRLM AA,(P)
PUSHJ P,RDXTYO
HLRZ AA,(P)
RDXTY2: MOVEI A,60(AA)
JRST TYO
CMD "-,MINUS
MINUS: TESTF E,ARGF ;IF ARGUMENT,
ERR HUH ;THEN COMPLAIN
SETF MINUSF ;SET FLAG,
JRST POPJ1 ;RETURN
DK: TESTF E,ARGCF ;"K" WITHOUT ARGUMENT, MULTIPLY THE WORLD BY 1000,
ERR HUH ;UNLESS ARGUMENT COMPLETED
MOVEI A,1000
IMULM A,OVAL
MOVEI A,1000.
IMULM A,DVAL
MOVE A,CRADIX
REPEAT 3,IMULM A,VALUE
JRST POPJ1
CMD "Q,WIPOUT,VALRET AN ALTX. REQUIRES .
WIPOUT: PUSHJ P,LOSSNP ;LOSE IF USER TYPES OTHER THAN A .
.VALUE [ASCIZ /./]
POPJ P,
CMD "X,RETTY,RETURN TTY TO DDT
RETTY: PUSHJ P,PDPCLS ;GIVE UP PDP10 WHENEVER GIVING UP TTY
.VALUE [0]
JRST 10INIT ;TRY TO OPEN THE PDP10 UP AGAIN
LOSSNP: PUSHJ P,TYI ;LOSE IF NEXT CHARACTER IS NOT A PERIOD
CAIE A,".
ERR HUH
POPJ P,
CMD "O,10INIT,OPEN THE PDP10 FOR MUNGING
10INIT: TESTF E,ARGF ;IF ARGUMENT,
JRST TYPSET ;THEN SET NUPRGF FROM BOTTOM BIT
.SUSET [.RUNAM,,UNAME]
MOVEI A,6 ;BLOCK IMAGE INPUT
HRLM A,PDPNAM
.OPEN USRIC,PDPNAM ;OPEN IT FOR INPUT
ERR [ASCIZ / PDP10 NOT AVAILABLE.
/]
MOVEI A,7
HRLM A,PDPNAM
.OPEN USROC,PDPNAM
ERR [ASCIZ / PDP10 NOT AVAILABLE FOR OUTPUT.
/]
SETF PDPO
POPJ P,
CMD "C,PDPCLS,CLOSE THE PDP10
PDPCLS: .CLOSE USRIC,
.CLOSE USROC,
CLEARF PDPO
POPJ P,
CMD "E,STADR,HAS VALUE OF STARTING ADDRESS
STADR: SKIPN GOINST ;IF NO STARTING ADDRESS,
ERR [ASCIZ / NO CURRENT STARTING ADDRESS.
/]
HRRZ A,GOINST ;GET IT
JRST VALRET
TYPSET: PUSHJ P,ARGET ;ARG SPECIFIED TO O, GET IT
.VALUE ;SHOULDN'T HAPPEN
DPB A,[FLGBP NUPRGF,] ;DEPOSIT IN NUPRGF
POPJ P,
CMD "L,LOAD,LOAD FROM SPECIFIED FILE
LOAD: PUSHJ P,LOSSNO ;LOSS IF PDP10 NOT OPEN
PUSHJ P,ARGET ;GET ARGUMENT (INTERPRETED AS MASK),
MOVNI A,1 ;OR USE -1 IF NONE
MOVE E,A ;SAVE AS MASK FOR LOAD
SETZM SNAM ;DEFAULT SYSTEM NAME IS CURRENT ONE
MOVEI A,6 ;MODE FOR OPEN
PUSHJ P,GETFIL ;READ FILE DESCRIPTION
SKIPE SNAM ;IF SYSTEM NAME SPECIFIED,
.SUSET [.SSNAM,,SNAM] ;THEN USE IT
.OPEN UTYIC,DNAM ;OPEN THE FILE
ERR [ASCIZ /FNF? /] ;NOT FOUND?
SETF UTYIO ;TELL ERR TO CLOSE FILE IF OPEN
MOVEI AA,41 ;FOR CAIX'S
SETZM 10SV41 ;DEFAULT C(41)
SETOM 41SW ;INDICATE MUSRUN HAS THE REAL 41
TRNE E,2 ;IF 1.2 BIT OF LOAD MASK SET,
PUSHJ P,PDPRS ;THEN CLEAR CORE
PUSHJ P,GWD ;GET A WORD
CAME A,[JRST 1] ;IF NOT END OF LOADER,
JRST .-2 ;THEN WAIT SOME MORE
PUSHJ P,GWD ;GET HEADER
HRRZ C,A ;GET RH (PRESUMABLE NOT NULL PROGRAM)
MOVNI G,1 ;WILL NOT MATCH ANY CAIG
CLEARF NUPRGF ;INITIALLY ASSUME OLD PROGRAM
CAIN C,2000 ;IF IT WANTS TO LOAD INTO 2000 FIRST,
PUSHJ P,LDNUP ;THEN NEW PROGRAM, USE THE ONE ALREADY IN CORE
JRST LOAD3 ;LOAD DATA AND MAYBE PROGRAM
LOAD1: PUSHJ P,GWD ;GET A WORD
LOAD3: JUMPGE A,LDJBLK ;IF POSITIVE THEN JUMP BLOCK
CAILE G,(A) ;IF NEW PROGRAM AND LOADING BELOW DATA,
SETF RTYIF ;THEN SUPRESS FURTHER LOADING INTO CORE
MOVE C,A
MOVE D,A
LOAD2: CAMGE A,[-UTIBFL,,0] ;IF BIGGER THAN BUFFER,
HRLI A,-UTIBFL ;THEN USE BUFFER LENGTH
HRRI A,UTIBUF ;MAKE IT POINT TO THE BUFFER
PUSHJ P,LODRED ;READ IN A BLOCK
TESTF E,RTYIF ;IF NOT LOADING,
JRST LOAD4 ;THEN DON'T LOAD
ADDI B,(D) ;C(B)+UTIBUF=1+LAST LOCATION IN BLOCK
CAIL AA,(D) ;IF 41 LOWER THAN FIRST WORD IN BLOCK,
CAIG B,UTIBUF+41 ;OR 1+LAST LOCATION IN BLOCK <= 41,
JRST NOLD41 ;THEN DON'T LOAD 41
MOVEI TT,41 ;LOAD INTO 41
SUBI TT,(D) ;MAKE TT POINT TO RELEVANT WORD IN BLOCK
MOVEI T,0 ;WORD TO BE SUBSTITUTED
EXCH T,UTIBUF(TT) ;SUBSTITUTE AND SAVE ORIGINAL
MOVEM T,10SV41 ;SAVE FOR STARTING IT UP
;DROPS THROUGH
;(CODING DROPS THROUGH FROM PREVIOUS PAGE)
NOLD41: TESTF N,NUPRGF ;IF NOT LOADING DATA FOR NEW PROGRAM,
ACCESS USROC,(D) ;THEN SET UP POINTER TO PDP10 CORE
MOVE T,A ;GET BUFFER POINTER AGAIN
.IOT USROC,T ;LOAD INTO PDP10 CORE
LOAD4: HLRS A ; -NUMBER OF WORDS PROCESSED
HRLI A,-1(A) ;C(A):=<-# PROCESSED-1,,-# PROCESSED> = -<# PROCESSED,,# PROCESSED>
SUBB D,A ;D HAD ORIGINAL AOBJN POINTER, ANSWER=NEW AOBJN POINTER
JUMPL A,LOAD2 ;JUMP IF MORE BUFFERINGS IN THIS BLOCK
PUSHJ P,GWD ;GET FILE'S VERSION OF CHECKSUM
CAME A,C ;IF NOT EQUAL TO CALCULATED ONE,
ERR [ASCIZ /CHECKSUM ERROR. /] ;THEN COMPLAIN
JRST LOAD1 ;GO GET ANOTHER BLOCK
;FILE HAS NEW PROGRAM, LOAD THE ONE ALREADY IN PDP6 CORE INSTEAD
LDNUP: MOVEI G,2000 ;FOR CAIG TO SEE IF FILE HEADER WANTS TO LOAD PROGRAM RATHER THAN DATA
SETF NUPRGF ;DOCUMENT NEW PROGRAM BEING LOADED
MOVE T,[JRST RDI"] ;STARTING INSTRUCTION FOR PROGRAM
MOVEM T,GOINST ;SAVE AS STARTING INSTRUCTION
MOVEM T,10SV41 ;ALSO SAVE AS CONTENTS OF LOCATION 41
ACCESS USROC,MUST" ;SET UP POINTER TO PDP10 CORE FOR LOADING DATA
POPJ P, ;RETURN
;JUMP BLOCK ENCOUNTERED DURING LOAD
LDJBLK: TESTF E,NUPRGF ;IF NEW PROGRAM,
JRST NUJBLK ;THEN STILL HAVE TO LOAD PROGRAM
.CLOSE UTYIC, ;CLOSE INPUT FILE
MOVEM A,GOINST ;SAVE AS STARTING INSTRUCTION
MBST: TRNE E,1 ;BIT 1.1 OF MASK,
JRST STNOAR ;TO START UP WHEN LOADED
POPJ P, ;OTHERWISE JUST RETURN
;JUMP BLOCK OR EQUIVALENT ENCOUNTERED WHILE READING DATA FOR NEW PROGRAM
NUJBLK: .CLOSE UTYIC, ;CLOSE INPUT FILE
MOVE T,[LODBEG"-LODEND",,LODBEG] ;GET AOBJN POINTER TO PROGRAM IN CORE
BPUT T,100 ;LOAD PROGRAM INTO PDP10
TLC A,(JFCL)
TLNN A,-1 ;IF JUMP BLOCK JFCL,
PUT A,TMPO ;THEN SET INITIAL TEMPO
JRST MBST ;MAYBE START IT UP
GWD: HRROI T,A ;GET A WORD IN A
GBLK: .IOT UTYIC,T ;ENTRY TO INPUT A BLOCK
JUMPGE T,CPOPJ ;IF ENTIRE BLOCK WAS TRANSFERED THEN RETURN
ERR [ASCIZ /EOF? /] ;END OF FILE ENCOUNTERED
LODRED: MOVE T,A ;READ IN A BLOCK IN SBLK FORMAT
PUSHJ P,GBLK ;GET THE BLOCK
MOVE B,A ;SO NOT TO MUNG A
CCKS: ;ENTRY FROM DUMPER TO CALCULATE CHECKSUM
LODRD1: ROT C,1 ;CHECKSUM IN C, UPDATE IT
ADD C,(B) ;" " "
AOBJN B,LODRD1 ;DO IT FOR THE ENTIRE BLOCK
POPJ P, ;RETURN WITH CALCULATED CHECKSUM IN C
CMD "Z,ZEROC,[CLEAR CORE, REQUIRES PERIOD]
ZEROC: PUSHJ P,LOSSNO ;LOSS IF PDP10 NOT OPEN
PUSHJ P,LOSSNP ;LOSE IF NEXT CHARACTER NOT PERIOD.
PDPRS: .RESET USROC, ;WIPE IT OUT
CLEARF RUNF\NUPRGF ;DOCUMENT FACT THAT IT'S NOT "RUNNING"
POPJ P,
;ROUTINE TO GENERATE ERROR IF PDP10 NOT OPEN
LOSSNO: TESTF N,PDPO
ERR [ASCIZ / PDP10 NOT OPEN.
/]
POPJ P,
CMD "G,START,START UP PDP10
START: PUSHJ P,LOSSNO ;LOSE IF PDP10 NOT OPEN
PUSHJ P,ARGET ;GET ARGUMENT IF ANY
JRST STNOAR ;NO ARGUMENT
HRLI A,(JRST) ;TURN INTO JRST
MOVE B,GOINST ;GET OLD STARTADR IF ANY
MOVEM A,GOINST ;SET NEW ONE TEMPORARILY
PUSHJ P,START1 ;START IT UP
MOVEM B,GOINST ;RESTORE OLD STARTING ADDRESS
POPJ P, ;RETURN
STNOAR: SKIPN GOINST ;IF NO CURRENT STARTING ADDRESS,
ERR [ASCIZ / NO STARTING ADDRESS.
/]
START1: AOSN 41SW ;IF FILE JUST LOADED (PDP10 LOC 41 TO BE IGNORED)
JRST START2 ;THEN SKIP FOLLOWING CODING
GET T,41 ;GET PDP10'S 41
MOVEM T,10SV41 ;SAVE IT
START2: PUSHJ P,STARTR ;ACTUALLY START IT UP (IF IT'S RUNNING)
MOVEI Q,STIME ;STANDARD SLEEP TIME
.SLEEP Q, ;WAIT
GET A,DUNSW
AOJE A,STRFJ ;IF DUNSW WAS SET THEN RETURN
CLEARF RUNF ;NOT RUNNING, INDICATE "FACT"
MOVE T,10SV41 ;RETRIEVE SAVED C(41)
PUT T,41 ;PUT IT WHERE IT BELONGS
RNNG: TYPE [ASCIZ / RUNNING?/]
POPJ P,
STARTR: MOVE A,[GOBEG-GOEND,,GOBEG]
BPUT A,10GO ;DEPOSIT STARTING ROUTINE
MOVE A,[JRST 10GO] ;INSTRUCTION TO START UP START ROUTINE
PUT A,41 ;PUT IT IN 41
POPJ P,
CMD "S,PSTOP,STOP PLAYING
PSTOP: PUSHJ P,LOSSNO ;LOSS IF NOT OPEN
TESTF N,NUPRGF ;IF OLD PROGRAM,
JRST OPSTOP ;THEN HAVE TO GIVE IT COMMAND
MOVNI T,1 ;PREPARE TO STOP NEW PROGRAM
PUT T,H10CMD ;MUSIC PROGRAM PUTS EXECUTION LOCATION IN H10CMD WHEN STOPPED FROM PLAYING,
;POSSIBILITY THAT IT WON'T BE PLAYING WHEN STOPPED
MOVE T,[QUITB"-QUITE",,QUITC"] ;GET AOBJN POINTER TO QUIT AREA IN CORE
BPUT T,QUITB ;CLOBBER PDP10 WITH QUIT ROUTINE
MOVEI T,STIME
.SLEEP T,
GET A,CMDQ"
CAME A,[JFCL]
TYPE [ASCIZ / RUNNING?/]
GET T,H10CMD ;GET "PC" WHERE PLAYING
MOVEM T,MPC ;SAVE FOR REFERENCE WITH B AND K COMMANDS
POPJ P,
OPSTOP: JSP Q,XCTCMD ;OLD PROGRAM, STOP WITH COMMAND
SETZ WAIT" ;RH PRESUMABLY NOT USED, BUT...
SETZ WAIT
;HAVE THE MUSIC PROGRAM EXECUTE A COMMAND
;CALLED AS FOLLOWS:
; JSP Q,XCTCMD
; DATA SWITCHES,,DISPATCH ;IF NO ARGUMENT
; DATA SWITCHES,,DISPATCH ;IF ARGUMENT
XCTCMD: PUSHJ P,LOSSNO ;ENTRY FROM OTHER ROUTINES TO MAKE 10 EXECUTE A COMMAND
PUSHJ P,ARGET ;IF NO ARGUMENT,
XCMD1: SOJ Q, ;THEN DECREMENT PLACE TO GET COMMAND FROM
SKIPN TT,1(Q) ;GET COMMAND IN AA, IF ZERO THEN COMPLAIN.
ERR [ASCIZ / ARGUMENT? /]
TESTF E,NUPRGF ;IF NEW PROGRAM,
JRST NUPRGC ;THEN DO IT RIGHT
HLL A,1(Q) ;GET PSEUDO-DATA SWITCHES
MOVEM A,10CMD ;SET UP COMMAND
MOVE A,[XCTBEG-XCTEND,,XCTBEG]
BPUT A,XCTLOC
MOVEI A,STIME
.SLEEP A,
GET A,10SW
JUMPGE A,STRFJ ;IF SWITCH AOS'ED THEN EVERYTHING OK
TESTF N,RUNF ;IF RUN FLAG NOT SET,
JRST RNNG ;THEN SAY "RUNNING?"
TYPE [ASCIZ / OLDPRG?/]
POPJ P,
STRFJ: SETF RUNF
POPJ P,
;HAVE THE NEW PROGRAM EXECUTE A COMMAND
NUPRGW: MOVEI T,7 ;LOOP POINT, PROGRAM NOT READY, WAIT 1/4 SECOND AND CHECK AGAIN
.SLEEP T,
.LISTEN T, ;BUT IF CHARACTER TYPED AT CONSOLE,
JUMPN T,[ERR] ;THEN RETURN ON NO-TYPEOUT ERROR CONDITION
;ENTRY POINT
NUPRGC: GET T,H10CMD+1 ;GET CURRENT CONTENTS OF COMMAND LOCATION
CAME T,[JFCL 1] ;IF NOT CLOBBERED TO JFCL 1,
JRST NUPRGW ;THEN WAIT FOR SAME (READY FOR COMMAND)
HRLI TT,(JRST) ;TURN DISPATCH INTO INSTRUCTION
MOVE T,A ;GET ARGUMENT TO PDP10 IN T
MOVE A,[-2,,T]
BPUT A,H10CMD" ;PUT T AND TT INTO PDP10 COMMAND AREA
POPJ P,
CMD "K,KWIT,SAME AS SB=
KWIT: TESTF E,ARGF ;IF ARGUMENT,
JRST DK ;THEN A THOUSAND
PUSHJ P,LOPGNO ;LOSS IF OLD PROGRAM OR OF PDP10 NOT OPEN
PUSHJ P,PSTOP ;STOP PLAYING
PUSHJ P,BMPC1 ;GET LOCATION (SEVERAL ERROR EXITS)
PUSHJ P,SPACE2 ;TYPE TWO SPACES
JRST RTYO ;TYPE OUT IN CURRENT RADIX AND RETURN
CMD "B,BMPC,HAS VALUE OF PLACE LAST STOPPED
BMPC: PUSHJ P,BMPC1 ;GET LOCATION
JRST VALRET ;RETURN IT
BMPC1: PUSHJ P,LOPGNO ;LOSS IF OLD PROGRAM OR PDP10 NOT OPEN
SKIPGE A,MPC ;GET LOCATION, SKIP IF VALID
ERR [ASCIZ / WASN'T PLAYING.
/]
LSH A,-1 ;MAKE IT NOT NECESSARILY EVEN
POPJ P, ;RETURN IT
;ROUTINE TO CAUSE ERROR IF OLD PROGRAM OR PDP10 NOT OPEN
LOPGNO: TESTF N,NUPRGF
ERR [ASCIZ / OLD PROGRAM.
/]
JRST LOSSNO ;IT MET THE FIRST TEST, NOW TRY THE SECOND
CMD "J,RESUME,PLAY FROM SPECIFIED PLACE OR CONTINUE
RESUME: PUSHJ P,LOPGNO
PUSHJ P,ARGET ;GET ARGUMENT
JRST RESUM1 ;USE DEFAULT
LSH A,1 ;SHIFT TO GUARANTEE EVEN-NESS
ANDI A,37777 ;MAKE SURE IT'S IN CORE
RESUM2: JSP Q,XCMD1 ;DO IT
PLAYSL" ;PLAY FROM SELECTED LOCATION
PLAYSL
RESUM1: SKIPGE A,MPC ;NO ARG SPECIFIED, TRY TO PROCEDE
ERR [ASCIZ / WHERE FROM? /]
JRST RESUM2
CMD "T,STMPO,TEMPO (SET IT OR HAS VALUE OF)
STMPO: PUSHJ P,LOPGNO ;LOSS IF OLD PROGRAM OR PDP10 NOT OPEN
PUSHJ P,ARGET ;GET ARG
JRST STMP1 ;NO ARGUMENT, RETURN VALUE
ANDI A,377777 ;AND TO SAME AS MUSIC PROGRAM DOES
CAIGE A,100 ;DO TEST DONE BY MUSIC PROGRAM
ERR [ASCIZ / BAD TEMPO.
/]
PUT A,TMPO"
POPJ P,
STMP1: GET A,TMPO" ;ARG NOT SPECIFIED BY T COMMAND, RETURN VALUE OF TEMPO
JRST VALRET
CMD "P,GOPLAY,START PLAYING (TEMPO MAY BE SPECIFIED)
GOPLAY: JSP Q,XCTCMD
MOVE PLAYNT"
200001,,PLAYST"
CMD "A,ADJUST,ADJUST TO MACHINE SPEED OR SET PITCH
ADJUST: JSP Q,XCTCMD
10000,,ADJST"
100000,,TUNE"
CMD "Y,YUMP,DUMP CORE ONTO SPECIFIED FILE
YUMP: PUSHJ P,LOSSNO ;LOSS IF NOT OPEN
MOVEI A,MUST ;WHERE TO START DUMPING FROM IF NEW PROGRAM
MOVEM A,MSTLOC ;SAVE AS SUCH
GET A,TMPO ;GET TEMPO ASSUMING NEW PROGRAM
MOVEM A,TMPSAV ;SAVE IT FOR JFCL BLOCK DUMPED OUT AT END
TESTF N,NUPRGF ;IF NOT NEW PROGRAM,
PUSHJ P,MFIND ;THEN FIND THE REAL "MUST" AND TEMPO
SETZM SNAM ;DEFAULT SYSTEM NAME IS CURRENT ONE
MOVEI A,7 ;MODE FOR OPEN
PUSHJ P,GETFIL ;GET FILE DESCRIPTION
SKIPE SNAM ;IF SYSTEM NAME SPECIFIED
.SUSET [.SSNAM,,SNAM] ;THEN SET IT
.OPEN UTYOC,DNAM ;NOW TRY TO OPEN OUTPUT FILE
ERR [ASCIZ /BAD DEVICE NAME? /]
SETF UTYOO ;ERR ROUTINE TO DELETE FILE
MOVE T,[-1,,[JRST 1]]
.IOT UTYOC,T ;OUTPUT A JRST 1
MOVE D,MSTLOC ;GET LOCATION OF DATA AREA
;DATA AREA CONSISTS OF PAIRS OF WORDS TO BE DUMPED OUT IN SBLK FORMAT
;IF FIRST WORD OF A PAIR IS ZERO THEN END OF DATA
ACCESS USRIC,(D) ;SET UP POINTER TO USER CORE
MOVEI D,2000 ;PRETEND THE DATA STARTS AT 2000, KEY TO IT BEING "NEW PROGRAM"
YUMP1: MOVE T,[-UTOBFL+2,,UTOBUF+1]
.IOT USRIC,T ;READ INTO OTHER THAN FIRST AND LAST WORDS OF BUFFER
MOVE B,[-UTOBFL+2,,UTOBUF+1] ;SET UP AOBJN POINTER FOR ZERO SEARCH
YUMP2: SUB D,[2,,0] ;UPDATE LH OF WHAT WILL BE ALL AOBJN POINTERS
;NOTE THIS DUMPS OUT THE ZEROS FINALLY FOUND
;THIS FOR THE BENEFIT OF PRS PROGRAMS WHICH USE IT AS EOF INDICATION
SKIPN (B) ;IF FIRST WORD OF PAIR IS ZERO,
JRST YUMP3 ;THEN DONE, OUTPUT REMAINDER OF BUFFER THEN JFCL BLOCK
AOBJN B,.+2 ;UPDATE POINTER
ERR [ASCIZ /INTERNAL ERROR.
/]
AOBJN B,YUMP2 ;DO IT FOR THE ENTIRE BUFFER
YUMP3: JUMPGE D,YJBLK ;IF D POSITIVE THEN ZERO WORD BLOCK
MOVE C,D ;INITIALIZE CHECKSUM AS HEADER
MOVE B,C ;LH OF AOBJN POINTER TO BUFFER,
HRRI B,UTOBUF+1 ;RH OF "
MOVEM D,UTOBUF ;SAVE HEADER FOR OUTPUT
PUSHJ P,CCKS ;CALCULATE CHECKSUM (UPDATES B)
MOVEM C,(B) ;STORE CHECKSUM AT NEXT LOCATION IN BUFFER
HLLZ T,D ;GET - # DATA WORDS IN BLOCK
ADD T,[-2,,UTOBUF] ;INCREMENT COUNT (DECREMENT) BY 2, RELOCATE RH TO POINT TO BUFFER
.IOT UTYOC,T ;OUTPUT BUFFER
CAIGE T,UTOBUF+UTOBFL ;IF LESS THAN THE ENTIRE BUFFER WAS OUTPUT,
JRST YJBLK ;THEN DONE OUTPUTTING DATA
MOVEI D,UTOBFL-2(D) ;INCREMENT TO NEXT BLOCK
JRST YUMP1 ;DUMP NEXT BLOCK
;END OF DATA WHILE DUMPING
YJBLK: MOVE A,TMPSAV ;GET SAVED TEMPO
HRLI A,(JFCL) ;TURN INTO JFCL
;JFCL BLOCK => SET TEMPO FROM RH
MOVE T,[-1,,A]
.IOT UTYOC,T ;OUTPUT THE JFCL BLOCK
.CLOSE UTYOC, ;FILE THE OUTPUT
CLEARF UTYOO ;ERR NEED WORRY ABOUT OUTPUT NO LONGER
POPJ P, ;DONE
;TRY TO GET THE FILE OPEN FOR WRITING DELETED
FLUSHO: .GENSYM A, ;GET A UNIQUE SYMBOL
MOVEM A,FLDBLK+3 ;SET FIRST FILENAME FOR RENAME ATTEMPT
MOVEI A,UTYOC ;OUTPUT CHANNEL
HRRZM A,FLDBLK+2 ;CHANNEL ON WHICH OPEN...
SETZM FLDBLK+1 ;WHEN FN11 ZERO, FOR RENAME WHILE OPEN FOR WRITING
.FDELE FLDBLK ;TRY TO RENAME IT
JFCL ;DON'T CARE IF IT WORKS
.CLOSE UTYOC, ;MAYBE RENAMED, NOW FILE IT
MOVE A,DNAM ;GET DEVICE NAME ON WHICH OPENED
MOVEM A,FLDBLK+2 ;SET DEVICE NAME FOR DELETE
SETZM FLDBLK+5 ;INDICATE DELETE
.FDELE FLDBLK+2 ;TRY TO DELETE IT
JFCL ;DON'T OBJECT IF IT LOSES
CLEARF UTYOO ;ERR ROUTINE NEED NO LONGER WORRY ABOUT IT
POPJ P, ;DONE, RETURN
FLDBLK=.-1 ;FIRST WORD OF "RENAME WHILE OPEN FOR WRITING" BLOCK IGNORED
0 ;ALWAYS 0, TELLS SYSTEM THIS RENAME WHILE OPEN FOR WRITING
UTYOC ;CHANNEL ON WHICH OPEN (RENAME) OR DEVICE NAME FOR DELETE
0 ;GEN'D-SYM (FN1)
SIXBIT /FOOBAZ/ ;FN2
0 ;FOR DELETE
;MUSIC PROGRAM IN CORE IS OF UNKNOWN TYPE, FIND DATA AREA AND TEMPO
MFIND: MOVEI B,100 ;PLACE TO START LOOKING
MOVEI D,MFIND2 ;PLACE TO GO IF CORE EXHAUSTED DURING SEARCH
JSP Q,FIND ;STARTING FROM 100, LOOK...
-1,, ;FOR A WORD, THE LEFT HALF OF WHICH...
DATAI ;IS A DATAI
DPB A,[270400,,MFNDA] ;SAVE THE DATAI DESTINATION AS THE AC FIELD FOR NEXT SEARCH
JSP Q,FIND ;STARTING FROM WHERE IT LEFT OFF, LOOK FOR A WORD...
-1#(66000) ;NOT LOOKING AT THE MODIFICATION AND CONDITION FIELDS OF THE TEST INSTRUCTION...
MFNDA: TLNE 200000 ;WHICH LOOKS AT THE PROPER DATA SWITCH FOR PLAYING
HRRZ B,UTOBUF+1(C) ;GET THE RIGHT HALF OF THE NEXT WORD (SHOULD BE A JUMP, SHOULD ALSO BE IN BUFFER)
JSP Q,FIND ;STARTING FROM THERE, FIND THE TEMPO INSTRUCTION (IDIVI 15,<TEMPO>)
-1,, ;LOOK ONLY AT THE LEFT HALF
IDIVI 15, ;ALL KNOWN MUSIC PROGRAMS USE AC 15
TLZ A,-1 ;TEMPO IN RH OF A
MULI A,122700 ;UPDATE WITH APPROPRIATE FUDGING
DIVI A,62213 ;THIS NUMBER DETERMINED AT EXECUTION TIME BY NEW PROGRAM, BUT THIS SHOULD DO FOR APPROXIMATION
MOVEM A,TMPSAV ;SAVE AS TEMPO
JSP Q,FIND ;NOW LOOK FOR A WORD,
-1,, ;WHICH HAS IN THE LEFT HALF,
MOVE 16, ;A MOVE INTO AC16
GET A,(A) ;GET WHAT IT IS MOVING FROM,
TLC A,617
TLNN A,-1 ;IF SIXBIT BYTE POINTER INDEXED BY 17,
JRST MFIND3 ;THEN FOUND
TLC A,440000 ;ALSO TRY THE OTHER FLAVOR
TLNE A,-1
MFIND2: ERR [ASCIZ / CAN'T FIND DATA AREA.
/]
SOJ A,
MFIND3: MOVEM A,MSTLOC ;HURRAY, THE DATA HAS BEEN FOUND!
POPJ P,
MSTLOC: 0 ;LOCATION OF DATA AREA IN PDP10 CORE (USED BY DUMP)
TMPSAV: 0 ;SAVES TEMPO DURING DUMP
;DO A MASKED WORD SEARCH STARTING FROM LOCATION POINTED TO BY B
;CALLED AS FOLLOWS:
;MOVEI B,<LOCATION>
;JSP Q,FIND
;<MASK FOR SEARCH>
;<WORD BEING SEARCHED FOR>
;POINTER TO ERROR RETURN IN D
;DOESN'T SEARCH TOP 200 LOCATIONS IN MEMORY
FIND: CAIL B,MOBY+40000-UTOBFL ;IF FOLLOWING .IOT WOULD CAUSE ILLUAD,
JRST (D) ;THEN EXIT
MOVE T,[-UTOBFL,,UTOBUF] ;SET UP POINTER TO BUFFER
BGET T,(B) ;GET CRUFT
MOVSI C,-UTOBFL ;SET UP AOBJN POINTER FOR SEARCH
FIND1: MOVE A,UTOBUF(C) ;GET WORD
TDC A,1(Q) ;COMPLEMENT COMPARISON BITS (MATCH => BIT WILL BE OFF)
TDNN A,(Q) ;TEST MASKED BITS
JRST FIND2 ;FOUND
AOJ B, ;INCREMENT PDP10 LOCATION
AOBJN C,FIND1 ;KEEP GOING, BUT IF BUFFER RUNS OUT,
JRST FIND ;THEN RELOAD BUFFER AND KEEP GOING
FIND2: TDC A,1(Q) ;WORD FOUND, RESTORE TO ORIGINAL STATE
JRST 2(Q) ;RETURN
;PDP10 VARIABLES
TAG 10GO
GOBEG: CONO 635550 ;IO RESET, CLEAR NXMEM FLAG, ETC.
CONO PI,11577 ;PI OFF, ETC.
MOVE 1,BAR ;ROUTINE USED TO START UP THE TEN
MOVEM 1,41
TAG DUNSW
SETOM DUNSW ;SWITCH SO 6 KNOWS WHETHER 10 IS RUNNING PROPERLY
GOINST: 0 ;STARTING INSTRUCTION LOADED FROM FILE OR SPECIFIED BY ARGUMENT TO "G"
TAG BAR
10SV41: 0 ;C(41) FROM FILE LOADED OR PDP10 CORE
GOEND: ;END OF ROUTINE TO START UP 10
XCTBEG: ;BEGINNING OF MUSIC PROGRAM VARIABLES
TAG XCTLOC
10CMD: 0 ;COMMAND TO PDP10
TAG 10SW
-1 ;SWITCH TO TELL 10 TO EXECUTE COMMAND
XCTEND: OFST==37777-.
REPEAT TAGNR,CONCAT TAG,\.RPCNT,
TAGNR==0
PDPNAM: (SIXBIT /USR/)
UNAME: 0
JNAME: SIXBIT /PDP10/
41SW: 0 ;-1=> 10SV41 HAS C(41) VIA LOAD
MPC: -1 ;-1 OR PLACE WHERE PLAYING WHEN LAST STOPPED
HUH: ASCIZ /? / ;FREQUENT ERROR "MESSAGE"
;COMMAND DISPATCH TABLE
DTBP: POINTS 12.,DTB(T)
DTB: .BYTE 12.
REPEAT 100,[CONCAT CHR,\.RPCNT
]
.WALGN
.BYTE
;BLURB TABLE
BTB: .BYTE 12.
REPEAT 100,[CONCAT CHB,\.RPCNT
]
-1 ;FOR END OF TABLE DETECTION
.WALGN
.BYTE
PAT":
PATCH": BLOCK 40 ;PATCH AREA
PATCHE"=.-1
CONST: CONSTANTS
VARIABLES
PDL: BLOCK LPDL+1
UTOBUF: ;DUMPER BUFFER
UTIBUF: BLOCK UTIBFL ;LOADER BUFFER
END BEG