home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.update.uu.se
/
ftp.update.uu.se.2014.03.zip
/
ftp.update.uu.se
/
pub
/
pdp8
/
os278-src.tar.Z
/
os278-src.tar
/
basic.pa
next >
Wrap
Text File
|
1992-09-18
|
46KB
|
2,296 lines
/BASIC.PA FOR OS78 V4
/ORIGINALLY:
/16 OS/8 COMMERCIAL BASIC EDITOR, V7A
/
/
/
/
/
/
/
/
/
/
/
/
/COPYRIGHT (C) 1972, 1973, 1974, 1975, 1978, 1979, 1981, 1982
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/
/
/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
/SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-
/SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER
/COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE
/TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO
/AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
/
/
/THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
/NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
/EQUIPMENT CORPORATION.
/
/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
/SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
/
/
/
/
/
/
/DEC-S8-LBASA-B-LA
/
/COPYRIGHT C 1972, 1973, 1974
/
/DIGITAL EQUIPMENT CORPORATION
/MAYNARD,MASSACHUSETTS 01754
/
/AUGUST 19, 1972
/
/ ASSEMBLE AND LOAD INSTRUCTIONS
/
/ .PAL BASIC
/ .LOAD BASIC
/ .SA SYS BASIC=2000
/
/
VERSON= "B&77^100 /VERSION LOCATED IN CORE AT TAG "VERLOC"
PATCH= "0&77 /LEFT 6BIT HALF = VERSION NUMBER
/RIGHT 6BIT HALF = PATCH LEVEL
/
/FIXES FOR V4 1975
/
/.LINE TOO LONG ERROR MESSAGE
/.CLEAR CD OPTION TABLE AT START UP
/.LIST FROM ACROSS FLD BOUNDRIES
/.MEMORY OVERFLOW
/.INPUT FROM TTY
/ 5-APR-77 ADDED EXTENDED DATE PRINTOUT
/ 13-APR-77 ADDED SCROLLING, SCOPE SUPPORT AND .BASIC COMMAND INTERFACE
/ 30-APR-77 FIX JSW FIELD BUG
/ 1-MAR-78 ADD LINKAGE TO BCOMP V6
/ 27-MAR-78 BUTCHERED FOR 7 BIT ASCII SUPPORT
/ 5-MAR-79 ADD SOURCE FIX FOR CD SWITCH CLEARING BUG
/ 17-FEB-81 MAKE MODIFICATIONS OS78 V4
/ 01-JAN-82 REMOVED BASIC.UF LOOKUP
BCSIZ1= 1000 /SIZE WORD FOR FIELD 1 OF BCOMP
DORUN1= 3200 /ENTRY ADDR FOR BCOMP FROM EDITOR
BCLOC1= 2000 /STARTING ADDR OF BCOMP FIELD 1 LOAD REGION
INFO= 7604 / INFORMATION AREA (FIELD 1)
JSW= 7746 /JOB STATUS WORD IN FIELD 0
CDOPT2= 7642 /HIGH ORDER CD = OPTION AND ALTMODE FLAG
CDOPT3= 7643 /CD SWITCHES [ABC DEF GHI JKL]
CDOPT4= 7644 /CD SWITCHES [MNO PQR STU VWX]
CDOPT5= 7645 /CD SWITCHES [YZ0 123 456 789]
CDOPT6= 7646 /LOW ORDER CD = OPTION
DCWTBL= 7760 /DEVICE CONTROL WORD TABLE IN FIELD 1
OS8RES= 4400 / SWAP AREA FOR OS8
DSKBUF= OS8RES+600 / FILE BUFFER
HANDLR= DSKBUF+400 / INPUT OUTPUT HANDLER ADDRESS
TXTAREA=HANDLR+400 / START OF TEXT AREA
MDATE= 7666 /ADDR OF OS8 DATE IN FIELD 1
BIPCCL= 7777 /ADDR OF DATE EXTENSION IN FIELD 0
AC7775= CLL STA RTL
AC7776= CLL STA RAL
*1
CIF 30 /SYMBIOSIS INTERRUPT LINKAGE
JMP .-1
*3
SWAPT1, 0
SWAPT2, 0
SWAPT3, 0
SWAPT4, 0
SWAPT5, 0
X10, INFO-1
X11, NAMLST-1
X12, 0
X13, 0
X14, 0
X15, 0
X16, 0
X17, 0
*20
RDTMP, 0 /USED BY INPUT ROUTINE
RDPTR, 0
SIZE, 0 /USED BY LINE EDITOR STUFF
TEMP, 0
TEMP2, 0
TOWARD, 0
PTR, 0
PAKPTR, 0
WSPTR, 0
COFLAG, 0 /=0 IF CTRL/O
CHNFLAG,0 /=1 IF BACK FROM RUN, 0 IF OLD
RUNFLAG,0 /=1 IF RUN, 0 IF SAVE
OLDFLAG,0 /=1 IF INPUT COMING FROM FILE
SEQFLAG,0 /=1 IF AUTO SEQ MODE
EOFADR, TXTAREA
CORSIZ, 1
SAVCHR, 0 /CHARACTER SAVE POSITION
LINENO, 0;0 /HOLDS MOST RECENT LINE NUM
EOFLIN, 0;0 /LAST LINE NUMBER
NAME, 0;0;0;0 /NAME BUFFER
FNAME, FILENAME NONAME.BA /CURRENT FILE NAME
DEVHAN, 7607 /ADDRESS OF DEVICE HANDLER, INITIALLY SYS: TO PROTECT
/AGAINST BAD RESPONSE TO "NEW OR OLD--"
DEVNUM, 1 /CURRENT DEVICE NUMBER
SWPNUM, 0 /SWAPPER FLAG (FOR ^C)
CSFLG, 0
TEMPDF, 0
0
JMP I TEMPDF
PAGE
/MAIN EDITOR ENTRY POINTS
JMP I TABCVT /JMP TO ONCE ONLY CODE IN LINE BUFFER IF R COMMAND
/GET A LINE OF INPUT FROM TTY
/STORES ONE 7 BIT CHAR/WORD IN LINE BUFFER
GETLIN, JMP I FILMSG /JMP IF CHAINED TO
DCA TABCVT /SAVE TAB CONVERSION SWITCH
STA /KLUDGE FOR TEXT PROMPTS
TAD I [TYPE /GET ADDR OF PREV MESSAGE
DCA FILMSG
TAD I FILMSG
DCA FILMSG /STORE INLINE IN ALTMODE CODE
GETLUP, TAD I (HEIGHT /RESET SCREEN HEIGHT ON USER INPUT
DCA I (LINCNT
DCA CSFLG /ZERO OUT ^S FLAG WHENEVER WE GET INPUT
TAD [LINE+2 /INIT LINE POINTER
DCA PTR
DCA I (LINE+6 /CLEAR ANY LISTNH OR RUNNH CHARS
TAD SEQFLAG /SEE IF AUTO SEQ MODE
SZA CLA
JMS I (SEQFUD /GENERATE LINE NUMBER IF YES
IGNORE, JMS I [GETCH
DCA TEMP2 /SAVE CHAR
KCC //ENABLE THE KEYBOARD BUFFER FOR VT278
TAD TEMP2 /GET THE CHARACTER BACK
SZA /IGNORE NULLS
TAD (-32 /IGNORE ^Z
SZA
TAD (32-12 /IGNORE LF, VT AND FF
CLL
TAD (-3
SNL CLA
JMP IGNORE /JMP BACK IF ANY OF ABOVE
TAD TEMP2 /CONVERT TABS TO SPACES IF FLAG SET
TAD TABCVT
SNA CLA
TAD [40
SZA
DCA TEMP2 /STORE A SPACE INSTEAD
CLL CMA RTL /CHECK FOR CONTROL C
TAD TEMP2
SNA
JMP I (BYEBYE /ITS ^C EXIT TO OS8
TAD (-12 /CHECK FOR CARRIAGE RETURN
SNA
JMP CARRET /JUMP IF 015 - CARRET.
TAD [15-25 /CHECK FOR ^U
SZA
TAD (25-33 /OR ESC
SZA
JMP NOTALT /JMP IF NONE OF ABOVE
ALT, JMS I [TYPE
MSGALT
DCA SEQFLAG /CLEAR SEQUENCE MODE ON ALTMODE
GETLN2, TAD TABCVT /IS IT A TEXT PROMPT?
SNA CLA
JMP GETLUP /NO
IAC /YES, ECHO THE PROMPT
JMS I [TYPE
FILMSG, START+1
JMP GETLUP
NOTALT, TAD (33-177 /CHECK FOR RUBOUT
SZA
TAD (177-10 /OR BACKSPACE
SNA CLA
JMP ARROW /JUMP IF RUBOUT OR BS
TAD OLDFLAG /INPUT FROM FILE ?
SZA CLA
JMP .+3 /YES, DON'T ECHO
TAD TEMP2
JMS I [TTYOUT /PRINT ON TTY
TAD PTR /SEE IF LINE IS ALREADY FULL
TAD (-LINEND
SPA CLA /SKP IF PTR GE LIMIT
JMP .+5
JMS I [CRLF /LINE IS TOO LONG
JMS I [TYPE
MSGTOO
JMP GETLUP /IGNORE THE LINE
TAD TEMP2
DCA I PTR /STORE THE CHAR
ISZ PTR
JMP IGNORE
ARROW, TAD PTR /SEE IF AT LEFT MARGIN
TAD (-LINE-2
SNA CLA
JMP IGNORE /IGNORE IF YES
STA /ELSE BACK UP THE POINTER
TAD PTR
DCA PTR
TAD OLDFLAG /INPUT FROM FILE ?
SNA CLA
JMS I (PRTBSP /NO, GO PRINT BACKSPACE OR BACKARROW
JMP IGNORE /BACK TO LISTEN LOOP
CARRET, TAD OLDFLAG /INPUT FROM FILE ?
SNA CLA
JMS I [CRLF /NO, PRINT CR-LF
TAD PTR
TAD (-LINE-2
SNA CLA
JMP GETLN2 /IGNORE EMPTY LINES
DCA I PTR /STORE NULL TO DELIMIT END OF LINE
TAD [LINE+2 /LEAVE SCAN POINTER AT START OF LINE
DCA PAKPTR
JMP I GETLIN
TABCVT, RBASIC
PAGE
/GET A BCD LINE NUMBER FROM CONSOLE INPUT BUFFER
/SKIP RETURN IF NUMBER GOTTEN
GETNUM, 0
STA
DCA SHCNT /CLEAR DIGIT FLAG
DCA LINENO /CLEAR REGISTER
GETDIG, DCA LINENO+1
TAD I PAKPTR
TAD (-72 /RANGE CHECK CHAR
CLL
TAD [12
DCA TEMP /TENTATIVELY SAVE DIGIT
SNL
JMP EONUM /END OF NUMBER IF NOT DIGIT (OR EOL)
ISZ PAKPTR /BUMP PTR UP
TAD [7774 /SET SHIFT COUNTER
DCA SHCNT
SHFTLP, TAD LINENO+1
CLL RAL
DCA LINENO+1 /SHIFT A PLACE
TAD LINENO
RAL
DCA LINENO
SZL /SKP IF NUMBER NOT TOO BIG
JMP TOOHI /WRONG, WRONG. GIVE ERROR
ISZ SHCNT
JMP SHFTLP
TAD TEMP /NOW ADD NEW ONE IN
TAD LINENO+1
JMP GETDIG /REITERATE
EONUM, ISZ SHCNT /SEE IF ANY DIGITS SEEN
ISZ GETNUM /TAKE SKIP RETURN IF YES
JMP I GETNUM
SHCNT, 0
TOOHI, TAD OLDFLAG /SUPPRESS MESSAGE IF OLD MODE
SZA CLA
JMP I [MAINLUP
JMS I [TYPE
MSGNER /LINE NUMBER ERROR
JMP I [MAINLUP /BREAK OUT TO MAIN INPUT LOOP
/TYPE A MESSAGE
TYPE, 0
DCA CRSWIT /SAVE CARRIAGE RETURN SWITCH
TAD I TYPE /GET ADDR OF MESSAGE
ISZ TYPE
DCA PASS
TLOOP, JMS I [CTRLO /CHECK FOR CTRL/O
JMP TCRLF /YES, STOP PRINTING
TAD I PASS /GET HIGH CHAR
CLL RTR /SHIFT RIGHT
RTR
RTR
JMS T6CH /TYPE A 6BIT CHAR
TAD I PASS /GET LOWER CHAR
ISZ PASS
JMS T6CH /TYPE ANOTHER 6BIT CHAR
JMP TLOOP
T6CH, 0
AND [77
SNA
JMP TCRLF /RETURN IF AT DELIMITER
TAD [40 /EXPAND TO 7BIT
AND [77
TAD [40
JMS I [TTYOUT /PRINT IT ON CONSOLE
JMP I T6CH
TCRLF, TAD CRSWIT /RETURN THE CARRIAGE ?
SNA CLA
JMS I [CRLF /YES
JMP I TYPE /DONE
CRSWIT, 0
/SKIP OVER A LINE IN MEMORY
/RETURN WITH TEMP AND DF POINTING AT NEXT LINE (OR EOF)
PASS, 0
ISZ TEMP
SKP
JMS FINCR
TAD I TEMP /LINES TERMINATED BY 7 BIT NULL IN LOW 7 BITS
AND [177
SZA CLA
JMP PASS+1
ISZ TEMP
JMP I PASS
JMS FINCR
JMP I PASS
/INCREMENT CURRENT DATA FIELD
FINCR, 0
RDF
TAD [6211
DCA .+1
HLT
JMP I FINCR
/SET NEW WORKSPACE EOF MARKER
/AC = NEW ADDR, DF = FIELD
SETEOF, 0
DCA EOFADR /SAVE ADDR
RDF /GET FLD
TAD [6201
DCA EOFFLD /SAVE IT
TAD [377 /STORE EOF
DCA I EOFADR
JMP I SETEOF
GETEOF, 0
TAD EOFADR /RETRIEVE EOF INFO
DCA TEMP /FIRST ADDR
EOFFLD, CDF
JMP I GETEOF
/CHECK IF FILE EXPANSION WILL FIT
CHKFIT, 0
CLL
TAD EOFADR /AC = NUMBER OF WORDS TO EXPAND BY
SZL CLA
TAD [10 /PROPAGATE CARRY INTO CDF
TAD EOFFLD
RTR /SHIFT FIELD BITS TO AC8-11
RAR
AND [17
TAD CORSIZ /COMPARE TO LIMIT
SPA CLA /SKP IF GT MACHINE SIZE
JMP I CHKFIT /OK, RETURN
CDF /GIVE ERROR
JMS I [TYPE
MSGBIG /MEMORY OVERFLOW
DCA OLDFLAG /KILL OLD STATUS
JMP I [MAINLUP /RETURN TO COMMAND LOOP
PAGE
/MAIN EDITOR COMMAND PROCESSING LOOP
CMDDONE,CDF
JMS I [CRLF /TYPE READY MESSAGE
JMS I [TYPE
MSGRDY
DCA SEQFLAG /CLEAR AUTO SEQ MODE
MAINLUP,CDF
JMS I [GETLIN /GET AN EDITED LINE.
PROCLN, JMS I (GETNUM /TRY TO GET A LINE NUMBER
SKP /SKP IF NO NUMBER SEEN
JMP NOCOMD /NOT A COMMAND
TAD OLDFLAG /IN OLD MODE ?
SNA CLA
JMP I (COMMAND/NO, MUST BE A COMMAND
JMP MAINLUP /OTHERWISE IGNORE
NOCOMD, JMS I (PACK7 /PACK INTO OS/8 FORMAT
TAD PTR /OR A LINE WITH A LINE
CIA /NUMBER ON IT.
TAD [LINE
DCA SIZE /SET UP SIZE OF LINE.
TAD I [LINE+2 /IS LINE EMPTY ??
SNA CLA
DCA SIZE /POSSIBLY ZERO.
TAD LINENO /IS IT > LAST LINE ?
CIA CLL
TAD EOFLIN
SZA CLA
JMP .+4 /HI PART NOT =, FORGET LOW
TAD LINENO+1
CIA CLL
TAD EOFLIN+1 /COMPARE LOW PARTS
SZL CLA
JMP NOTLAST /NOT > LAST
JMS I [GETEOF /GET EOF
TAD TEMP /MAKE IT LOOK LIKE
DCA PTR /A CALL TO FINDLN
TAD LINENO /SAVE NEW LAST LINE
DCA EOFLIN
TAD LINENO+1
DCA EOFLIN+1
RDF
TAD [6201
DCA TEMPDF+1
SKP
NOTLAST,JMS I [FINDLN /GENERAL CASE - SEARCH
INSERT, TAD TEMPDF+1
DCA PTRFLD /GET FIELD OF START OF OLD LINE
TAD PTR
CLL CIA
TAD TEMP
TAD SIZE /WHICH WAY ?
SNA
JMP MOVE /SAME SIZE, MOVE IN NEW LINE
SPA
JMP I (EXPAND /MAKE MORE ROOM FOR NEW LINE
CIA
TAD TEMP /SHRINK THE FILE
DCA TOWARD /MOVE FILE DOWN TO HERE
RDF
TAD [6201
DCA TMPFLD /GET FIELD OF READ POINTER
TAD TOWARD
CLL CMA
TAD TEMP
SNL CLA
TAD [7770
TAD TMPFLD
DCA TWDFLD /GET FIELD OF WRITE POINTER
JMS SHRINK /NOW SHRINK WORKSPACE
MOVE, TAD SIZE
SNA CLA
JMP MAINLUP /IT WAS A DELETE
CDF 00
TAD LINENO /PUT IN LINE NUMBER
DCA I [LINE
TAD LINENO+1
DCA I (LINE+1
MOVENTR,TAD [LINE
DCA TEMP
MOVLUP, CDF /MOVE IN NEW LINE
TAD I TEMP
ISZ TEMP
PTRFLD, HLT
DCA I PTR
ISZ PTR /INCREMENT POINTERS
JMP .+4
TAD PTRFLD /WHATCH OUT FOR FIELDS
TAD [10 /(W.C. OR E.M. ?)
DCA PTRFLD
ISZ SIZE
JMP MOVLUP
JMP MAINLUP
/ROUTINE TO SHRINK WORKSPACE
SHRINK, 0
TMPFLD, HLT
TAD I TEMP
TWDFLD, HLT
DCA I TOWARD /MOVE DOWN
TAD I TOWARD
TAD [-377 /END OF FILE ???
SNA CLA
JMP LWREOF /YES, PUT NEW LINE IN AT END
ISZ TEMP /INCREMENT POINTERS
JMP .+4
TAD TMPFLD /AND FIELDS IF NECESSARY
TAD [10
DCA TMPFLD
ISZ TOWARD
JMP TMPFLD
TAD TWDFLD
TAD [10
DCA TWDFLD
JMP TMPFLD /KEEP SHRINKING
LWREOF, TAD TOWARD /SET NEW EOF
JMS I [SETEOF
JMP I SHRINK
/SCRATCH COMMAND
SCRATCH,JMS CLEARWS
JMP I [CMDDONE
/CLEAR INCORE WORKSPACE
CLEARWS,0
TAD [TXTAREA/SCRATCH FILE
JMS I [SETEOF
DCA EOFLIN /ZERO LAST LINE NUM
DCA EOFLIN+1
JMP I CLEARWS
PAGE
EXPAND, CIA /EXTRA ROOM NEEDED
DCA TOWARD
TAD TOWARD /SEE IF WILL FIT
JMS I (CHKFIT
TAD I TEMP /SAVE THIS PLACE
DCA TEMP2
TAD [177 /NOW MARK THIS PLACE
DCA I TEMP
JMS I [GETEOF /GET EOF
RDF
TAD [6201
DCA TMP2FLD /GET FIELD OF END OF FILE
CLL
TAD TEMP /MOVE FILE UP
TAD TOWARD /TO
DCA TOWARD /HERE
SZL
JMS I [FINCR /MIGHT BE ACROSS A FIELD
RDF
TAD [6201
DCA TWD2FLD /SAVE NEW EOF FIELD
TAD TOWARD /SAVE NEW EOF
JMS I [SETEOF
TMP2FLD,HLT
TAD I TEMP
TWD2FLD,HLT
DCA I TOWARD /MOVE UP ONE WORD
TAD I TOWARD
TAD (-177 /IS THE MARK ?
SNA CLA
JMP LASTWD /YES, PUT IN LAST WORD
CLA CLL CMA
TAD TOWARD /BACK UP POINTERS
DCA TOWARD
SZL
JMP .+4
TAD TWD2FLD /AND FIELDS (MAYBE)
TAD [7770
DCA TWD2FLD
CLA CLL CMA
TAD TEMP
DCA TEMP
SZL
JMP TMP2FLD
TAD TMP2FLD
TAD [7770
DCA TMP2FLD
JMP TMP2FLD
LASTWD, TAD TEMP2 /PUT IN SAVED WORD
DCA I TOWARD
JMP I (MOVE /GO MOVE IN NEW LINE
BYEBYE, KCC //ENABLE THE KEYBOARD BUFFER FOR VT278
CLA IAC
AND SWPNUM /IS OS8 RES IN PLACE ?
SZA CLA /YES IF EVEN NUMBER OF SWAPS
BYE, JMS I [SWAP /PUT BACK OS8
GOODBY, NOP //NOP'D FOR VT278 MODIFICATION
NOP //NOP'D FOR VT278 MODIFICATION
JMP I [7605 /EXIT TO OS8
MSGBIG, TEXT /MEMORY OVERFLOW/
MSGALT, TEXT / DELETED/
MSGWHAT,TEXT /WHAT?/
MSGTOO, TEXT /LINE TOO LONG/
/ROUTINE TO PROCESS CHARACTERS FOR FILENAMES
NAMGCH, 0
JMS I (GETNC /GET A NAME CHAR
JMP I NAMGCH /RETURN TO CALL+1 IF EOL
DCA NCHAR /SAVE CHAR
TAD NCHAR /SEE IF .
TAD (-56
SNA CLA
JMP GOTDOT /JMP IF YES, HANDLE FILENAME EXTENSION
TAD NCHAR /RANGE CHECK CHAR FOR ALPHANUMERIC
CLL
TAD (-60 /TOGGLE LINK ON EACH NEG CONSTANT
SMA
TAD (60-72
SNA
JMP GOTCOL /JMP OUT IF : SEEN, DO DEVICE
SMA
TAD (72-101
SMA
TAD (101-133
SNL CLA /SKP IF 0-9 OR A-Z
JMP I (INERRX /BAD FILE IF OUT OF RANGE
ISZ NAMGCH /SKP RETURN IF OK
GOTCOL, TAD NCHAR /REGET CHAR
AND [77 /RETURN 6 BITS
JMP I NAMGCH
GOTDOT, TAD (NAME+3 /MOVE UP TO EXTENSION FIELD
DCA TEMP2
STA
DCA SIZE /JUST ONE WORD
JMP I (NAMLUP /JMP OUT TO NAME GETTER LOOP
NCHAR, 0
PAGE
/COMMAND LOOKUP AND DISPATCH
COMMAND,DCA SEQFLAG /ALWAYS CLEAR SEQ FLAG ON COMMAND
JMS GETNC /GET CHAR FOR COMMAND
JMP I [WHAT
CLL RTL
RTL
RTL
DCA TEMPDF /SAVE IN TEMP
JMS GETNC
JMP I [WHAT
AND [77 /MASK TO 6BIT
TAD TEMPDF /MAKE PACKED 6BIT WORD
DCA TEMPDF
TAD COMTBL /COMMAND LIST POINTER
DCA TEMP
COMLUP, ISZ TEMP /GET 2 CHAR COMMAND
TAD I TEMP
ISZ TEMP
SNA
JMP WHAT /END OF LIST
TAD TEMPDF /IS THIS IT?
SZA CLA
JMP COMLUP /NO, LOOK AGAIN
TAD I TEMP /GET COMMAND ADDR
DCA TEMP /AND GO TO IT
JMP I TEMP
WHAT, DCA SEQFLAG
JMS I [TYPE /TYPE WHAT?
MSGWHAT
JMP I [MAINLUP
COMTBL, .
-1411
LIST
-1714
OLD
-2301
SAVE
-2225
RUN
-2223
RUNSP
-2303
SCRATCH
-0231
BYE
-1605
NEW
-2205
RENAME
-0504
EDIT
-1601
RENAME
-0405
DELETE
-2305
SEQUENCE
-2705
WEAVE
0
/PRINT HEADING
HEADING,0
TAD (LINE+5 /POINT AT LOCATION OF "NH" IN BUFFER
DCA X17
TAD I X17 /ROUGH TEST
CLL RTL
TAD I X17
TAD (-116^4-110
SNA CLA
JMP I HEADING
JMS I [CRLF /LATER
TAD [FNAME /SET UP FOR CONVERSION
DCA TEMP /POINTER TO FILE NAME
TAD XTITLE /WHERE IT GOES
DCA PTR
JMS CONV /OUTPUT FIRST TWO CHARS
JMS CONV /NEXT TWO
JMS CONV /THIRD TWO
ISZ PTR /SKIP FOR EXT
JMS CONV /OUTPUT EXTENSION
JMS I [TYPE /TYPE HEADING
XTITLE, TITLE
JMS I [CRLF /FOLLOWED BY A CRLF
JMP I HEADING
CONV, 0 /CONVERT TO SIX BIT ASCII
TAD I TEMP /GET NEXT WORD
AND [77 /CHECK FOR 0
SNA /SUBSTITUTE BLANKS
TAD [40
DCA I PTR
TAD I TEMP /DO UPPER CHAR
AND [7700
SNA
CLL CML RAR
TAD I PTR /COMBINE THEM
DCA I PTR
ISZ TEMP
ISZ PTR
JMP I CONV
TITLE, 0;0;0;4040;0 /FOR THE PROG NAME
4040;4040 /SOME BLANKS
VERLOC, VERSON+PATCH /VERSION NUMBER + PATCH LEVEL
4040;4040 /MORE BLANKS
DATE, 0;0;0 /DATE TEMPLATE
DASH6, 5566 /"-6" FOR BUILDING DATE
EODAT, 0 /END OF DATE TEMPLATE
/GET A CHAR FOR A FILE NAME
GETNC, 0
TAD I PAKPTR /GET 7BIT CHAR
SZA
ISZ PAKPTR /BUMP IF NOT AT EOL
TAD [7605 /CONVERT LOWER CASE TO UPPER CASE
CLL
TAD [32
SZL
TAD [-40 /MAKE UPPER
TAD (141 /RESTORE CHAR
SZA
ISZ GETNC
JMP I GETNC /RETURN WITH CHAR
PAGE
/GET CHAR FROM WORKSPACE FILE
/INITIALIZED WITH PTR2FLD AND WSPTR ADDRESSING NEXT WORD
/TEMP = STATE VARIABLE
GETFIL, 0
TAD TEMP
ISZ TEMP
TAD .+3
DCA .+1
HLT
JMP I .+1 /SEQUENCE OF OPERATIONS
PTR2FLD /GET FIRST WORD
FRSTDIG /FIRST DIGIT
DIGIT /SECOND DIGIT
DIGIT /THIRD DIGIT
PTR2FLD /SECOND LINE NO WORD
DIGIT /FOURTH DIGIT
DIGIT /FIFTH DIGIT
LASTDIG /LAST DIGIT
CHAR1 /SPACE FOLLOWING LINE NUMBER
PTR2FLD /GET WORD OF TEXT
FRSTCH /FIRST 3 FOR 2 CHAR
PTR2FLD /GET WORD OF TEXT
SCNDCH /SECOND 3 FOR 2 CHAR
THRDCH /THIRD 3 FOR 2 CHAR
LINFTXT /LINE FEED CHARACTER
PTR2FLD,HLT /CHECK FOR EOF
TAD I WSPTR
CDF
TAD [-377
SNA
JMP I GETFIL /YES, RETURN UNSKIPPED
TAD [377
DCA TEMP2 /NO, SAVE WORD
ISZ WSPTR /BUMP POINTER
JMP GETFIL+1
TAD PTR2FLD
TAD [10
DCA PTR2FLD
JMP GETFIL+1
CHAR1, TAD [40 /GENERATE BLANK FOLLOWING LINE NUMBER
JMP GFRET
LASTDIG,CLA IAC /FORCE LAST DIGIT (EVEN IF 0)
FRSTDIG,DCA SAV3RD /ZERO DIGIT COUNT
DIGIT, TAD TEMP2
RTL
RTL
DCA TEMP2 /SHIFT LEFT ONE DIGIT
TAD TEMP2
RAL
AND [17 /GET DIGIT
SZA
JMP NZDIGIT /ITS NOT ZERO
TAD SAV3RD /IS IT A LEADING ZERO ?
SNA CLA
JMP GETFIL+1/YES, DON'T PRINT IT
NZDIGIT,ISZ SAV3RD /NON ZERO OR NON LEADING ZERO
TAD (60 /SO PRINT IT
JMP GFRET
FRSTCH, TAD TEMP2 /GET CHAR
AND [7400 /ISOLATE HIGH 4 BITS FOR LATER
CLL RTR
RTR
JMP FSCOMN /DO COMMON STUFF (ANYTHING FOR A WORD OF CORE)
SCNDCH, TAD TEMP2 /GET WORD
AND [7400 /AS ABOVE, ISOLATE HI 4 BITS
CLL RTL
RTL
RAL
TAD SAV3RD /ADD TO OTHER BITS
FSCOMN, DCA SAV3RD /SAVE AWAY
TAD TEMP2 /GET CHAR BACK
JMP DOCHAR /DO COMMON LOW CHAR STUFF
THRDCH, TAD (11 /RESET STATE TABLE
DCA TEMP
TAD SAV3RD /LOOK AT THIRD CHAR
SNA
JMP GETFIL+1 /IGNORE IF ITS NULL
DOCHAR, AND [177 /MASK TO 7 BITS
SNA /SKP IF NOT END OF LINE
JMP ZEROTXT /ELSE GENERATE CR/LF
GFRET, ISZ GETFIL
JMP I GETFIL
ZEROTXT,TAD (16 /SETUP FOR LF NEXT
DCA TEMP
TAD [15 /RETURN CR
JMP GFRET
LINFTXT,DCA TEMP /CLEAR SEQUENCER AND RETURN LF
TAD [12
JMP GFRET
SAV3RD, 0
MSGNER, TEXT /LINE NUMBER > 999999/
MSGEDT, TEXT /EDIT COMMAND ERROR/
WSSAVE, 40;104;123;113;72;102;101;123;111;103;56;127;123;0 /"DSK:BASIC.WS"
WSSIZE= .-WSSAVE
PAGE
/GET A FILE NAME AND FETCH ITS HANDLER
GETFN, 0
DCA SAVFLAG /=1 FOR SAVE, 0 FOR OLD OR NEW
TAD CHNFLAG /RETURNING FROM RUN ?
SZA CLA
JMP NOFUSR /YES, DON'T FETCH USR
JMS I [SWAP /GET OS8 RESIDENT
TAD SAVFLAG /IS IT OLD OR NEW ??
SNA CLA
IAC /YES, DON'T SWAP 10000-11777
DCA I (JSW /DO IF SAVE, SO ALTER JSW
CIF 10 /GET THE USR
JMS I [7700
10
NOFUSR, TAD [LINE+2
DCA PAKPTR /RESET CHAR POINTER
BSKIP, JMS I (GETNC /GET A CHAR
JMP ASKNAM /ASK FOR FILE NAME
TAD M40 /BLANK ?
SZA CLA
JMP BSKIP /NO, LOOP
NOSKIP, JMS GETNAM /GET A NAME
SNA CLA
JMP USEDSK /NO DEVICE SPECIFIED, USE DSK:
TAD NAME /PUT IN THE DEVICE NAME
DCA DEV /AS SPECIFIED
TAD NAME+1
DCA DEV+1
JMS GETNAM /FETCH THE FILE NAME
SZA CLA
JMP I (IOERR /BAD SYNTAX IN FILE DESCRIPTOR
JMP GETHAN /GO FETCH THE HANDLER
USEDSK, TAD (0423 /SET DEVICE NAME TO DSK:
DCA DEV
TAD (1300
DCA DEV+1
GETHAN, TAD [HANDLR+1
DCA DEV+2 /ALSO THE HANDLER ORIGIN
CIF 10
JMS I [200 /CALL THE USR
1 /FETCH HANDLER BY NAME
DEV, 0;0;0
JMP I (IOERR /BAD DEVICE
TAD DEV+1 /SAVE THE DEVICE NUMBER
DCA DEVNUM
TAD DEV+2 /AND THE HANDLER ENTRY POINT
DCA DEVHAN
MOVEFN, TAD SAVFLAG /WAS IT A SAVE ?
M40, SMA SZA CLA
JMP I GETFN /YES, JUST RETURN
TAD NAME /NEW OR OLD, ANY NAME GIVEN ?
SNA
JMP I GETFN /NO, PROBABLY JUST A DEVICE
DCA FNAME /YES, SAVE IT
TAD NAME+1
DCA FNAME+1
TAD NAME+2
DCA FNAME+2
TAD NAME+3
DCA FNAME+3
JMP I GETFN
ASKNAM, TAD SAVFLAG /WAS THIS A SAVE ?
SMA SZA CLA /SKP IF NO
TAD FNAME /IT WAS A SAVE, ANY OLD NAME TO USE ?
SNA
JMP ASKNM /NO, GO ASK FOR ONE
DCA NAME /YES, MOVE INTO NAME
TAD FNAME+1
DCA NAME+1
TAD FNAME+2
DCA NAME+2
TAD FNAME+3
DCA NAME+3
JMP I GETFN
ASKNM, CLA IAC /ASK FOR FILE NAME
JMS I [TYPE
ASKFN
TAD (-11 /SET TAB CONVERSION FLAG
JMS I [GETLIN
JMP NOSKIP
SAVFLAG,0
GETNAM, 0 /GET A FILE OR DEVICE NAME
DCA NAME /ZERO THE NAME BUFFER
DCA NAME+1
DCA NAME+2
TAD (201 /USE DEFAULT EXT .BA
DCA NAME+3
TAD (NAME /SETUP POINTER
DCA TEMP2
TAD [7774 /SET SIZE TO 4 WORDS MAX
DCA SIZE
NAMLUP, JMS I (NAMGCH
JMP I GETNAM
CLL RTL
RTL
RTL
DCA I TEMP2 /SAVE IT
JMS I (NAMGCH
JMP I GETNAM
TAD I TEMP2 /COMBINE THE 2
DCA I TEMP2
ISZ TEMP2
ISZ SIZE /ANY MORE ?
JMP NAMLUP
JMP I GETNAM
/RENAME COMMAND
RENAME, CLL CML RAR /SAVE USR AREA
JMS GETFN /GET FILE NAME
CIF 10
JMS I [200 /REMOVE USR
11 /AND RESTORE 10000-11777
JMP RENWFN
/NEW COMMAND
NEW, JMS I (CLEARWS /CLEAR THE WORKSPACE FIRST
JMS GETFN /GET THE FILE NAME
RENWFN, JMS I [SWAP /REMOVE OS8
JMP I [CMDDONE
PAGE
/WRITE THE CURRENT WORKSPACE
PUTFIL, 0
TAD [TXTAREA
DCA WSPTR /GET POINTER TO TEXT
TAD [6201 /GET FIELD OF TEXT
DCA I (PTR2FLD
DCA TEMP /ZERO LINE SEQUENCER
TAD [DSKBUF /GET ADDR OF DISK BUFFER
DCA SWAPT1 /BUFFER POINTER
TAD S7600
DCA SWAPT2 /DOUBLE WORD COUNTER
TAD JMPINS /SET 3 WAY SWITCH
DCA PUTJMP
PFLOOP, JMS I [GETFIL /GET A CHAR FROM TEXT AREA
JMP PFCTLZ /END OF FILE
JMS PUTCH /OUTPUT IT
JMP PFLOOP /DO NEXT CHAR
PFCTLZ, TAD [32 /PUT CTRL-Z
JMS PUTCH
TAD (7201 /BUFFER DUMP COUNT
DCA PFTEMP
JMS PUTCH /FILL WITH ZEROES
ISZ PFTEMP
JMP .-2
JMP I PUTFIL /DONE
PFTEMP, 0
PUTCH, 0 /PUT A CHAR ONTO THE OS8 FILE
DCA SWAPT4 /SAVE THE CHAR
PUTJMP, HLT /JUMP TO CORRECT PLACE
JMP PH1 /FIRST CHAR
JMP PH2 /SECOND CHAR
PH3, TAD JMPINS /RESTORE SWITCH
DCA PUTJMP
TAD SWAPT4 /GET THE CHAR
AND [17 /LOW FOUR BITS
CLL RAR
RTR /INTO THE HIGH PART OF WORD TWO
RTR
TAD I SWAPT1 /COMBINE WITH CHAR 2
DCA I SWAPT1
TAD SWAPT4 /GET THE HIGH FOUR BITS
RTL
RTL /INTO THE HIGH PART OF WORD ONE
AND [7400
TAD I SWAPT3 /COMBINE WITH WORD ONE
DCA I SWAPT3
ISZ SWAPT1 /BUMP POINTER
ISZ SWAPT2 /BUMP DOUBLE WORD COUNT
JMP I PUTCH /RETURN
JMS I [SWAP /SWAP IN OS8
JMS I DEVHAN /WRITE THIS BUFFER
4200
DSKBUF
WRBLOK, 0
JMP I (OUERR
ISZ OUSIZE /ANY ROOM LEFT ?
SKP
JMP NOROOM /NO, ERROR
ISZ WRBLOK /BUMP BLOCK NUMBER
ISZ I (OULEN /BUMP ACTUAL SIZE
JMS I [SWAP /SWAP BACK
TAD [DSKBUF /SET UP BUFFER POINTER
DCA SWAPT1
TAD S7600
DCA SWAPT2 /SET UP COUNT
JMP I PUTCH
PH2, TAD SWAPT1 /SAVE POINTER TO FIRST
DCA SWAPT3
ISZ SWAPT1 /BUMP POINTER
PH1, TAD SWAPT4 /GET CHAR
DCA I SWAPT1 /INTO BUFFER
ISZ PUTJMP /BUMP SWITCH
JMP I PUTCH
JMPINS, JMP PUTJMP+1
OUSIZE, 0
NOROOM, JMS I [TYPE /TYPE FILE TOO BIG MESSAGE
MSGRM
JMP I (IORETN /TAKE ERROR ABORT
MSGRM, TEXT /FILE TOO BIG/
/SWAP OS/8 RESIDENT
SWAP, 0
ISZ SWPNUM /TOGGLE RESIDENCY BIT
S7600, 7600
TAD (OS8RES /SET POINTER TO SAVE AREA
DCA SWAPT1
PATCH5, AC7775 /AC7776 IF ONLY 8K CORE
DCA SWAPT2
TAD S6201 /INIT FIELD
DCA SWPFLD
SWPLUP, TAD S7600 /SET POINTER TO PAGE 7600 IN NEXT FIELD
DCA SWAPT3
SWPLP, TAD I SWAPT1 /SAVE WORD IN SAVE AREA
DCA SWAPT4
SWPFLD, HLT /GET OVER INTO OS/8 FIELD
TAD I SWAPT3 /SAVE A WORD FROM N7600
DCA SWAPT5
TAD SWAPT4 /PUT SAVE AREA WORD IN PLACE
DCA I SWAPT3
S6201, CDF
TAD SWAPT5
DCA I SWAPT1 /NOW PUT IN SAVE AREA
ISZ SWAPT1
ISZ SWAPT3
JMP SWPLP /LOOP FOR THE PAGE
TAD [10 /BUMP CDF
TAD SWPFLD
DCA SWPFLD
ISZ SWAPT2 /BUMP PASS COUNTER
JMP SWPLUP /REITERATE
JMP I SWAP /--RETURN--
ASKFN, TEXT /FILE NAME--/
PAGE
/RUN AND RSPACE COMMANDS
RUNSP, TAD [40 /SET /S SWITCH FOR BRTS TO EXHIBIT FREE SPACE
RUN, DCA I (OS8RES+200+CDOPT4-7600 /IN CD SWITCHES M-X WORD
STA
JMS I [HEADING/GIVE A HEADING
TAD [LINE+1 /SET UP FAKE LINE
DCA X15
TAD [WSSAVE-1
DCA X16
TAD I X16 /TO SAVE BASIC.WS
SNA
JMP .+3
DCA I X15
JMP .-4
DCA I X15
TAD [LINE+2 /RESET SCAN POINTER
DCA PAKPTR
ISZ RUNFLAG /SET RUN FLAG
JMP GFN
/SAVE COMMAND
SAVE, DCA RUNFLAG /CLEAR THE RUN FLAG
TAD DEVNUM /SAVE CURRENT DEVICE NUM
DCA OLDDEV /INCASE WE CHANGE
GFN, CLA IAC /SET SAVFLAG
JMS I [GETFN /GET THE DEV:NAME.EX
TAD XNAME /SET UP ENTER
DCA SAVBLK /POINTER TO FILE NAME
TAD DEVNUM /GET DEVICE NUMBER
CIF 10
JMS I [200 /ENTER FILE
3
SAVBLK, 0 /STARTING BLOCK GOES HERE
0 /SIZE GOES HERE
JMP I (IOERR
TAD SAVBLK /PUT BLOCK NUMBER
DCA I (WRBLOK /INTO WRITE
TAD SAVBLK+1/PUT SIZE
DCA I (OUSIZE /SOMEWHERE TOO
DCA OULEN /ZERO BLOCK COUNT
CIF 10
JMS I [200 /DUMP USR
11
JMS I [SWAP /AND NOW OS8
JMS I (PUTFIL /DO THE SAVE
JMS I [SWAP /GET OS8
TAD RUNFLAG /SET NO SWAP BIT IF RUN
DCA I (JSW
CIF 10 /GET THE USR
JMS I [7700
10
TAD DEVNUM /GET DEVICE NUMBER
CIF 10
JMS I [200 /CLOSE THE FILE
4
XNAME, NAME
OULEN, 0 /SIZE
JMP I (IOERR
TAD RUNFLAG /WAS IT A RUN ?
SZA CLA
JMP I (DORUN /YES
TAD OLDDEV /IS OLD DEVICE
CIA /THE SAME AS
TAD DEVNUM /THE NEW ONE ??
SNA CLA
JMP HNDLOK /YES, THE HANDLER IS OK
TAD OLDDEV /RESTORE DEVICE NUMBER
DCA DEVNUM
TAD [HANDLR+1
DCA DEVN /SET UP HANDLER LOAD ADDR
TAD DEVNUM
CIF 10
JMS I [200
1
DEVN, 0
JMP I (IOERR
TAD DEVN /RESET THE HANDLER ADDRESS
DCA DEVHAN
HNDLOK, CIF 10 /GET RID OF THE USR
JMS I [200
11
JMS I [SWAP /REMOVE OS8 AGAIN
JMP I [CMDDONE
OLDDEV, 0
/FIND A LINE IN THE WORKSPACE
/RETURN WITH DF AND TEMP ADDRESSING NEXT LINE OR EOF
/TEMPDF AND PTR ADDRESS BEGINNING OF LINE IF MATCHING LINE NUMBER
FINDLN, 0
TAD [TXTAREA
DCA TEMP /INIT START OF FIRST LINE
SEARCH, TAD TEMP /COMPARE THE NUMBER OF
DCA PTR /THIS LINE WITH THE SPOT
RDF /SAVE DF OF START OF THIS LINE
TAD [6201
DCA TEMPDF+1
TAD I TEMP /IN THE TEXT AREA.
TAD [-377
SNA
JMP I FINDLN /NEW LINE GOES AT EOF
TAD [377
CLL CIA
TAD LINENO
SNA
JMP SAME1ST
SNL CLA
JMP I FINDLN /INSERT NEW LINE
ISZ TEMP
SKP
JMS I [FINCR
CONTIN, JMS I [PASS /IF ITS GREATER KEEP SEARCHING.
JMP SEARCH
SAME1ST,ISZ TEMP /FIRST HALF OF LINE NUM SAME
SKP
JMS I [FINCR
TAD I TEMP
CLL CIA /CHECK SECOND HALF
TAD LINENO+1
SNA
JMP SAME2ND /REPLACE OLD WITH NEW
SZL CLA
JMP CONTIN
TAD PTR /RESTORE POINTER TO START OF LINE
DCA TEMP
JMS TEMPDF /RESTORE DF ALSO
JMP I FINDLN /INSERT NEW LINE
SAME2ND,JMS I [PASS
JMP I FINDLN
PAGE
/LIST COMMAND
LIST, JMS I (GET2LN /GET LINE NUMBERS
JMP DOALL /JMP IF NONE SPECD
JMP DOONE /JMP IF ONLY ONE
TAD TEMP /GENERAL CASE, GET LINE GT END
DCA SAVEND
JMP LSTCNT /CONTINUE ON
DOALL, TAD EOFADR /LIST TO END OF FILE
DCA SAVEND
TAD I (EOFFLD
DCA I (TMPFLD
JMP LSTCNT
DOONE, TAD WSPTR /JUST ONE LINE IF SINGLE
DCA SAVEND
STA /DISABLE HEADING IF ONE LINE
LSTCNT, DCA I [HEADING
TAD TOWARD /GET START OF REGION TO LIST
DCA WSPTR
TAD I (TWDFLD /GET FIELD TOO
DCA I (PTR2FLD
ISZ I [HEADING
JMS I [HEADING /PRINT THE HEADING
DCA TEMP /CLEAR WORKSPACE GETTER STATE
TAD COFLAG
SNA CLA
JMP I [CMDDONE
LSTLUP, TAD SAVEND /SEE IF NEXT WORD PAST LIMIT
CLL CIA
TAD WSPTR
CLA CML RAL
TAD I (TMPFLD
CIA
TAD I (PTR2FLD
SNL CLA /SKP OUT IF PAST LIMIT
XONWT, JMS I [CTRLO /STOP IF ^O HIT
JMP I [CMDDONE
TAD CSFLG /SEE IF ^S HIT
SZA CLA /SKP IF NO
JMP XONWT /IDLE IF YES TO HOLD SCREEN
JMS I (GETFIL
JMP I [CMDDONE
JMS I [TTYOUT
JMP LSTLUP
SAVEND, 0
/SEARCH FOR SPACE OR TAB
SRCHSP, 0
TAD I PAKPTR /LOOK AT CHAR
SZA
ISZ PAKPTR /BUMP ONLY IF NOT EOL
SZA
TAD [-40 /IS IT SPACE
SZA
TAD (40-11 /OR TAB
SZA CLA
JMP SRCHSP+1 /LOOK AGAIN IF NO
JMP I SRCHSP /RETURN POINTING AT NEXT CHAR OR EOL
/SKIP PAST LEADING SPACES
SKIPSP, 0
TAD I PAKPTR
SNA
JMP I SKIPSP /RETURN IF AT EOL
TAD [-40
SZA
TAD (40-11
SZA CLA
JMP I SKIPSP
ISZ PAKPTR
JMP SKIPSP+1
EDTBUF, ZBLOCK 60
EBEND, 0
CRLF, 0
TAD [15 /SEND CR
JMS I [TTYOUT
TAD [12 /SEND LF
JMS I [TTYOUT
JMP I CRLF
PAGE
/EDIT NNNNNN /OLDSTRING/NEWSTRING(CR) COMMAND
EDIT, JMS I (SRCHSP /LOOK FOR SPACE
JMS I (GETNUM /TRY TO GET LINE NUMBER
JMP EDTERR /ERROR IF NO NUMBER
JMS I [FINDLN /LOOK FOR THE LINE
CDF
TAD TEMPDF+1 /INIT CHAR GETTER FOR START OF LINE
DCA I (PTR2FLD
TAD PTR
DCA WSPTR
TAD PTR /SEE IF NULL LINE (NOT FOUND)
CIA
TAD TEMP
SNA CLA
JMP EDTERR /ERROR IF LINE NOT LOCATED
JMS I (SKIPSP /IGNORE TRAILING BLANKS
TAD I PAKPTR /ERROR IF NO EDIT STRING
SNA
JMP EDTERR
CIA
DCA DELIM /STORE AS DELIMITER
DCA EDTSIZ /CLEAR SIZE OF STRING
TAD (EDTBUF /INIT PTR TO EDIT BUFFER
DCA EDTPTR
GETST1, ISZ PAKPTR /GET NEXT PATTERN CHAR
TAD I PAKPTR
SNA
JMP EDTERR /ERROR IF NO END TO PATTERN
TAD DELIM /SEE IF AT DELIMITER
SNA CLA
JMP GETST2 /END OF PATTERN, GET REPLACEMENT
ISZ EDTSIZ /TALLY SIZE OF PATTERN
TAD I PAKPTR
JMS EDTSAV /SAVE CHAR AWAY
JMP GETST1 /GET NEXT ONE
GETST2, ISZ PAKPTR /NOW STORE THE REPLACEMENT PATTERN
TAD I PAKPTR
SNA
JMP GOTST2 /END OF REPLACEMENT
JMS EDTSAV /SAVE NEXT CHAR
JMP GETST2
GOTST2, JMS EDTSAV /MARK END OF REPLACEMENT
DCA TEMP /CLEAR FILE GETTER STATE
TAD [LINE+2 /SET POINTER TO RESULT LINE
DCA PAKPTR
TAD EDTSIZ /MOVE AN INITIAL STRING IN
CMA
DCA EDTCNT
JMP GETLGO
GETLN, JMS I (EDTGCH /GET A CHAR FROM FILE
JMP EDTERR /ERROR IF UNEXPECTED EOL
JMS I (EDTPUT /PUT IN RESULT STRING
GETLGO, ISZ EDTCNT
JMP GETLN
TAD [LINE+2 /INIT POINTER TO SUBSTRING START
DCA BEGPTR
COMPLP, TAD BEGPTR
DCA PTR
TAD (EDTBUF
DCA EDTPTR
TAD EDTSIZ /COMPARE TO ORIGIONAL STRING
CMA
DCA EDTCNT
JMP COMPGO
COMPAR, TAD I EDTPTR /GET A PATTERN CHAR
CIA
TAD I PTR
SZA CLA
JMP MISMAT /GET ANOTHER FILE CHAR IF MISMATCH
ISZ EDTPTR
ISZ PTR
COMPGO, ISZ EDTCNT
JMP COMPAR /TRY NEXT ONE
TAD BEGPTR /REPLACE WITH NEW STRING NOW
DCA PAKPTR
MOVREP, TAD I EDTPTR
SNA
JMP EOREP /END OF REPLACEMENT
JMS I (EDTPUT /PUT IN LINE
ISZ EDTPTR
JMP MOVREP
EOREP, JMS I (EDTGCH /GET REMAINDER OF LINE
JMP EDTFIN
JMS I (EDTPUT
JMP EOREP
EDTFIN, DCA I PAKPTR /MARK EOL
TAD [LINE+2 /EXHIBIT THE NEW LINE FOR USER
DCA PAKPTR
VIEWLP, TAD I PAKPTR
SNA
JMP VIEWOK
JMS I [TTYOUT
ISZ PAKPTR
JMP VIEWLP
VIEWOK, JMS I [CRLF /RETURN CARRAIGE
TAD [LINE+2
DCA PAKPTR
JMP I (PROCLN /JMP TO PROCESS LINE AS IF TYPED IN
MISMAT, JMS I (EDTGCH /GET ANOTHER CHAR
JMP EDTERR /ERROR IF UNEXPEDTED EOL
JMS I (EDTPUT /PUT IN LINE
ISZ BEGPTR /MOVE UP START OF SEARCH
JMP COMPLP /GO AGAIN
EDTERR, JMS I [TYPE
MSGEDT /EDIT COMMAND ERROR
JMP I [CMDDONE /GO BACK TO EDITOR LOOP
/SAVE EDIT STRING AND SEE IF FITS
EDTSAV, 0
DCA I EDTPTR
ISZ EDTPTR
TAD EDTPTR
TAD (-EBEND /AT END?
SNA CLA
JMP EDTERR /GIVE ERROR
JMP I EDTSAV /ALL RIGHT
EDTPTR, 0
BEGPTR, 0
EDTSIZ, 0
EDTCNT, 0
DELIM, 0
PAGE
HEIGHT, -30 /SET TO SCREEN HEIGHT BY SET COMMAND
SDELAY, -200 /SET TO HOLD SCREEN DELAY BY SET COMMAND
IFNZRO HEIGHT-3000 <__FIX SET COMMAND__>
LINCNT, 0 /THIS WORD IS ZERO TO FLAG THE NEW BASIC EDITOR TO "SET"
CURPOS, 0
STIMER, 0
SCOPFG, 0 /SET NONZERO IF TERMINAL IS A SCOPE
ZERO, 0
/PRINT A CHAR ON TERMINAL
/PAUSE IF LF WAS PRINTED AND DELAY REQUESTED
/SCREENSIZE ALSO SET BY "SET TTY" COMMAND
TTYOUT, 0
AND [177
DCA TCHAR
TAD TCHAR
CLL
TAD [7770 /SEE IF CONTROL CODE
SMA
TAD (10-16
SMA
TAD (16-40
SZL CLA
JMP NOTCTL /JMP IF NO
TAD (136 /ECHO ^
JMS I (TTYO
TAD TCHAR
TAD (-7 /SEE IF BELL
SZA CLA
JMP .+3
TAD TCHAR /YES, SOUND IT
JMS I (TTYO
TAD (100 /MAKE CHAR VISIBLE
NOTCTL, TAD TCHAR
JMS I (TTYO /ECHO IT
TAD TCHAR
TAD (-15 /TEST IF LF WILL FOLLOW
SZA CLA
JMP I TTYOUT /RETURN IF NO
ISZ LINCNT /TEST LINE COUNTER FOR SCREENFULL
JMP I TTYOUT
TAD HEIGHT
DCA LINCNT /NOW RESET SCREEN COUNTER
TAD SDELAY
SNA /SKIP IF DELAY REQUESTED
JMP I TTYOUT /OTHERWISE JUST RETURN AT ONCE
DCA STIMER /SET HOLD SCREEN TIMER
DLOOP, KSF /FIRST TEST IF KEY STRUCK
JMP I TTYOUT /JMP IF NO
KRB /ELSE READ CHAR
AND [177 /MASK TO 7BIT
TAD (-3
SNA
JMP I (BYEBYE /JMP IF ^C SEEN
TAD (3-17
SZA
TAD (17-21 /TEST IF ^Q OR ^S HIT
CLL RTR
SNA CLA
JMP I TTYOUT /RETURN WITH CHAR STILL IN BUFFER IF ANY OF ABOVE SEEN
/PRINT A BACKSPACE
/IF TERMINAL IS A SCOPE, ECHO BS,SP,BS TO RUBOUT AND REPOSITION
/CURSOR. OTHERWWISE ECHO BACKARROW
PRTBSP, 0
TAD SCOPFG /TEST SCOPE BIT
SNA CLA
JMP BKARRW /NOT - ECHO BACKARROW
TAD I PTR /SEE IF CHAR TO BE ZAPPED IS A TAB
CLL
TAD (-11
SNA
JMP ECHOLN /SPECIAL TREATMENT IF YES
SMA
TAD (11-16
SMA
TAD (16-40 /TEST IF CONTROL CODE BEING DELETED
SNL CLA /SKP IF NO
JMS BKSP /ELSE ECHO EXTRA BKSP
JMS BKSP
JMP I PRTBSP /DONE
BKARRW, TAD ("_
JMS I [TTYOUT
JMP I PRTBSP
TCHAR,
BKSP, 0
TAD [10 /ECHO BS
JMS I (TTYO
TAD [40
JMS I (TTYO
TAD [10 /BS
JMS I (TTYO
JMP I BKSP
ECHOLN, TAD [15 /RESET CURSOR
JMS I [TTYOUT
TAD [LINE+2 /POINT AT BEGINNING OF LINE
DCA SWAPT5
ECHOLP, TAD PTR /FIRST SEE IF AT CHAR TO DELETE
CIA
TAD SWAPT5
SNA CLA
JMP I PRTBSP /JMP OUT IF YES
TAD I SWAPT5 /ELSE ECHO IT
JMS I [TTYOUT
ISZ SWAPT5 /BUMP PTR
JMP ECHOLP /DO NEXT
MSGRDY, TEXT /READY/
PAGE
/RANDOM NON FITTING ROUTINES FOR EDIT COMMAND
/GET CHAR FROM WORKSPACE FOR EDIT STATEMENT
/RETURN TO CALL+1 IF EOL
/RETURN TO CALL+2 IF CHAR IN AC
EDTGCH, 0
JMS I (GETFIL /GET A CHAR
HLT /UNREACHABLE
TAD (-15 /SEE IF CR YET
SNA
JMP I EDTGCH /TAKE EOL RETURN IF YES
TAD [15 /RESTORE CHAR
ISZ EDTGCH
JMP I EDTGCH /SKIP RETURN
/PUT A CHAR IN LINE FOR EDIT COMMAND
EDTPUT, 0
DCA I PAKPTR /STORE THE CHAR
ISZ PAKPTR
TAD PAKPTR /SEE IF AT LIMIT
TAD (-LINEND
SZA CLA
JMP I EDTPUT /OK, FITS
JMP I (EDTERR /GIVE ERROR MESSAGE, LINE TOO LONG
/CONTINUATION OF RUN COMMAND
DORUN, TAD (INFO+11/SET UP SOME OF INFO BLOCK
DCA X10
CDF 10
TAD DEVHAN /SAVE DEVICE HANDLER ADDRESS (DSK:)
DCA I X10
CLL CML RTL /SAVE DEVICE NUMBER
DCA I X10
CDF
TAD I (SAVBLK /SAVE STARTING BLOCK
CDF 10
DCA I X10
TAD FNAME /SAVE FILE NAME
DCA I X10
TAD FNAME+1
DCA I X10
TAD FNAME+2
DCA I X10
TAD FNAME+3
DCA I X10
TAD I (INFO+1 /PICK UP START OF BCOMP FIELD 1 STUFF
DCA BCBLOK /STORE IN LINE
CDF /RESET DF
JMS I (7607 /CALL SYS:
BCSIZ1+10 /READ THIS MUCH TO FIELD 1
BCLOC1 /STARTING HERE
BCBLOK, 0 /FROM HERE
JMP WHUPS /ERROR ON SYS!
CIF CDF 10
JMP I (DORUN1 /JMP INTO CONTINUATION OF RUN COMMAND
WHUPS, JMS I [TYPE /TYPE ERROR MESSAGE
MSGSY
JMP I (GOODBY /RETURN TO OS/8
/RECOVERY FROM GENERAL FILE I/O ERRORS
IORETN, DCA OLDFLAG /KILL OLD STATUS
JMS I [SWAP /GET OS/8 OUT
TAD DEVNUM /FORGET TENTATIVE FILE ON CURRENT DEVICE
TAD (OS8RES+200+DCWTBL-7600-1 /(SWAPPED OUT)
DCA TTYO
TAD I TTYO
AND [7770
DCA I TTYO
JMP I [MAINLUP /RETURN TO COMMAND LOOP
TTYO, 0
TLS
TSF
JMP .-1
CLA
JMP I TTYO
MSGSY, TEXT /SYSTEM ERROR/
/PACK COMMAND LINE IN OS/8 FORMAT
PACK7, 0
TAD [LINE+2 /SETUP PACKING POINTERS
DCA PTR
TAD PTR
DCA PTR3
TAD I PAKPTR /DONT STORE LEADING BLANK IN FILE TO SAVE SPACE
TAD [-40
SNA CLA
ISZ PAKPTR
PACKLP, JMS G7BITS /GET CHAR
DCA I PTR /STORE IN BUFFER
ISZ PTR
JMS G7BITS /GET ANOTHER
DCA I PTR
ISZ PTR /STORE ALSO
JMS G7BITS /GET THIRD OF GROUP
RTL
RTL
DCA TMPWD /SAVE FOR LATER
TAD TMPWD
AND [7400 /ISOLATE 4 BITS
TAD I PTR3 /PUT IN HI 4 BITS
DCA I PTR3
ISZ PTR3
TAD TMPWD /REGET PREV CHAR
RTL
RTL
AND [7400 /4 BITS
TAD I PTR3
DCA I PTR3 /STORE THEM
ISZ PTR3
JMP PACKLP /ITERATE
G7BITS, 0
TAD I PAKPTR /GET CHAR
ISZ PAKPTR
SZA /NULL IS END OF LINE MARKER
JMP I G7BITS /RETURN WITH IT OTHERWISE
PAKEOL, DCA I PTR /MARK THE END OF LINE WITH A NULL IN THE LOW 7 BITS
ISZ PTR /TALLY THE NULL
JMP I PACK7 /--RETURN--
TMPWD, 0
PTR3, 0
PAGE
/GET A CHARACTER FROM THE TTY
GETCH, 0
TAD OLDFLAG /INPUT FROM A FILE ?
SZA CLA
JMP FILEIN /YES
KSF
JMP .-1
KRB
AND [177
JMP I GETCH
FILEIN, ISZ COUNT /ANYTHING IN BUFFER ?
JMP NOREAD /YES, NO READ
TAD O7200 /SET BUFFER COUNT
DCA COUNT
TAD [DSKBUF /SET BUFFER POINTER
DCA RDPTR
TAD RDJMP /RESET JUMP
DCA NOREAD
JMS I [SWAP /GET OS8
TAD RDSIZE /ANY ROOM LEFT ?
SNA
JMP INERR /BAD END OF FILE, TREAT AS I/O ERROR
IAC
DCA RDSIZE
JMS I DEVHAN /READ NEXT BLOCK
200
DSKBUF
RDBLOK, 0
JMP CHKSOF /CHECK FOR SOFT ERROR
SOFTOK, ISZ RDBLOK /BUMP BLOCK NUMBER
JMS I [SWAP /AWAY WITH OS8
NOREAD, HLT /3W UNPACK JUMP
JMP INCHR1
JMP INCHR2
INCHR3, TAD RDJMP /RESET SWITCH
DCA NOREAD
TAD I RDPTR /GET LOW 4 BITS
ISZ RDPTR /BUMP POINTER
AND [7400 /MASK IT
CLL RTR /SHIFT RIGHT 4
RTR
DCA TEMP /SAVE
TAD I RDTMP /GET HIGH 4 BITS
AND [7400
TAD TEMP /COMBINE THEM
CLL RTR /SHIFT RIGHT 4
RTR
JMP AND177 /GO FINISH
INCHR2, TAD RDPTR /SAVE ADDR OF FIRST WORD
DCA RDTMP
ISZ RDPTR /BUMP POINTER
INCHR1, TAD I RDPTR /GET NEXT CHAR
ISZ NOREAD /BUMP SWITCH
AND177, AND [177 /MASK 7 BITS
TAD (-32 /CHECK FOR ^Z
SNA
JMP ENDOLD /EOF
TAD [32 /RESTORE CHAR
JMP I GETCH
ENDOLD, DCA OLDFLAG /KILL OLD FLAG
TAD CHNFLAG /WAS IT A RETURN FROM RUN ?
SNA CLA
JMP I [CMDDONE/NO, JUST AN OLD COMMAND
DCA CHNFLAG /KILL FLAG
TAD (INFO-7600+OS8RES+214
DCA X10 /PICK UP NAME FROM INFO BLOCK
TAD I X10 /(WHICH IS SWAPPED OUT)
DCA FNAME
TAD I X10
DCA FNAME+1
TAD I X10
DCA FNAME+2
TAD I X10
DCA FNAME+3
JMP I [CMDDONE/DONE WITH RETURN
CHKSOF, SMA CLA /SKP IF HARD ERROR
JMP SOFTOK
INERR,
OUERR,
O7200, CLA /AC NONZERO IF OUTPUT ERROR
JMS I [TYPE /REPORT THE I/O ERROR
MSGIO
JMP I (IORETN
/OLD AND WEAVE COMMANDS
OLD, JMS I (CLEARWS /CLEAR HIS WORKSPACE NOW!
SKP
WEAVE, CLA STL RAR /PRESERVE HIS WORKSPACE, INCLUDING USR AREA
JMS I [GETFN /GET FILE NAME
CLL CMA RAL /SET RETRY COUNT
DCA TEMP
OLDTRY, TAD [FNAME /POINTER TO FILE NAME
DCA SB /INTO LOOKUP CALL
TAD DEVNUM /GET DEVICE NUMBER
CIF 10
JMS I [200 /LOOKUP FILE
2
SB, 0 /START GOES HERE
RDSIZE, 0 /SIZE GOES HERE
JMP OLDBAD /BAD FILE
CIF 10 /REMOVE USR
JMS I [200
11
TAD SB /MOVE BLOCK
SNA
ISZ RDSIZE /SET COUNT TO 4095 IF NOT D.A.
DCA RDBLOK
CLA IAC /SET SWITCH
DCA OLDFLAG /INPUT COMING FROM FILE
CLA CMA /SET COUNT TO INITIALIZE READ
DCA COUNT
JMS I [SWAP /MOVE OS8
JMP I [MAINLUP/DO OLD
RDJMP, JMP NOREAD+1
COUNT, 0
OLDBAD, DCA FNAME+3 /TRY WITHOUT EXT
ISZ TEMP /OR HAVE WE ALREADY ?
JMP OLDTRY /NO, NOT YET
JMS I [TYPE /REPORT FILE NOT FOUND
MSGNF
JMP ERRDIS
INERRX,
IOERR, JMS I [TYPE /REPORT CATCHALL "BAD FILE" MESSAGE
BADFIL
ERRDIS, CIF 10
JMS I [200 /DISMISS USR
11
JMP I (IORETN /TAKE ERROR RETURN
PAGE
/DELETE BEGIN-END COMMAND
DELETE, JMS GET2LN /GET A PAIR OF LINE NUMBERS
JMP I [WHAT /ERROR IF NONE
NOP /HANDLE SINGLE DELETE NORMALLY
TAD TOWARD /NOW SEE IF SRC GE TARGET
CLL CIA
TAD TEMP
CLA CML RAL
TAD I (TWDFLD
CIA
TAD I (TMPFLD
SNL CLA
JMP I [WHAT /ERROR IF END LT BEGIN
JMS I (SHRINK /DELETE THE LINES
JMP I [CMDDONE /DONE, PRINT "READY"
/GET 2 LINE NUMBERS OF THE FORM NNNN-NNNN
GET2LN, 0
TAD [TXTAREA /ASSUME BEGINNING OF FILE
DCA TOWARD
TAD [6201
DCA I (TWDFLD
JMS I (SRCHSP /SKP TO DELIMITER
TAD I PAKPTR /SEE IF "DELETE -NNNN" CONSTRUCTION
TAD (-55
SNA CLA
JMP FRMSOF /YES, DO FROM START OF FILE
JMS I (GETNUM /TRY TO GET LINE NUMBER
JMP I GET2LN /GIVE ERROR
JMS I [FINDLN /LOOK UP LINE
RDF /RETURN DF = START OF NEXT LINE
CDF
TAD [6201 /SAVE IN CASE SINGLE DELETE
DCA I (TMPFLD
TAD TEMP /SAVE ADDR TOO
DCA WSPTR /IN A SAVE PLACE
TAD PTR /NOW SET POINTER TO START OF DELETION AREA
DCA TOWARD /TARGET PTR FOR MOVE
TAD TEMPDF+1
DCA I (TWDFLD
TAD I PAKPTR /SEE IF ANY MORE
SNA CLA
JMP ONEDEL /DELETE ONE LINE (WHAT A WASTE)
FRMSOF, ISZ PAKPTR /SKIP PAST DELIMITER
JMS I (GETNUM /GET LINE NUMBER
JMP TOEOF /DELETE TO END OF FILE IF "DEL NNN-"
JMS I [FINDLN /LOOKUP LINE
RDF
CDF
TAD [6201 /GET SOURCE TO START SHRINK WITH
DCA I (TMPFLD
ISZ GET2LN
ISZ GET2LN
JMP I GET2LN /RETURN
TOEOF, TAD I (EOFFLD /USE EOF
DCA I (TMPFLD
TAD EOFADR
JMP DELGO
ONEDEL, TAD WSPTR /USE BEGIN OF NEXT LINE IF ONE ONLY
SKP
DELGO, ISZ GET2LN
ISZ GET2LN
DCA TEMP /SET SOURCE PTR
JMP I GET2LN
/SEQUENCE COMMAND
SEQUEN, DCA I (NUM1 /ASSUME START WITH 100
TAD (400
DCA I (NUM1+1
JMS I (SRCHSP /SKIP TO DELIMITER
JMS I (GETNUM /GET START NUMBER
JMP DEFLT /USE DEFAULT IF NONE
TAD LINENO /OK, SAVE START POINT
DCA I (NUM1
TAD LINENO+1
DCA I (NUM1+1
DEFLT, JMS I (SAVNXT /SAVE LINE NUMBER FOLLOWING START OF SEQ
DCA I (NUM2 /ASSUME STEP OF 10
TAD (20
DCA I (NUM2+1
TAD I PAKPTR /SEE IF ANY MORE TO COMMAND
SZA CLA
ISZ PAKPTR /DISCARD DELIMITER IF YES
JMS I (GETNUM
JMP SEQRDY /READY IF NO STEP SPECD
TAD LINENO /COPY STEP
DCA I (NUM2
TAD LINENO+1
DCA I (NUM2+1
SEQRDY, ISZ SEQFLAG /SET FLAG NOW!
JMP I [MAINLUP /GO TO LOOP
/SKIP IF ^O NOT TYPED AND CLEAR 'COFLG'
/RETURN TO CALL+1 IF ^O WAS TYPED AND SET 'COFLG'
/SET OR CLEAR 'CLFLG' IF ^S OR ^Q TYPED OTHERWISE
CTRLO, 0
KSF
JMP CTRLOX /TAKE SKIP RETURN IF NO CHAR HIT
KRS
DCA SAVCHR //SAVE THE CHARACTER
KCC //ENABLE THE KEYBOARD BUFFER FOR VT278
TAD SAVCHR //GET THE CHARACTER BACK
AND [177
TAD (-3 /TEST IF ^C ABORT
SNA
JMP I (BYEBYE /JMP IF YES
TAD (3-17
SNA
JMP GOTCO /JMP IF ^O HIT
TAD (17-21
CLL RTR
SZA /SKP IF ^S OR ^Q HIT
JMP CTRLOX /ELSE EXIT
RAL /LINK ON IF ^S
DCA CSFLG /SAVE FLAG AS APPROPRIATE
CTRLOX, ISZ CTRLO /SKP RETURN IF ^O NOT HIT
CLA IAC
GOTCO, DCA COFLAG /ZERO SAYS NO ECHO
JMP I CTRLO
PAGE
/ROUTINE TO GENERATE AUTO SEQUENCED LINE NUMBERS
SEQFUD, 0
TAD SAVNO+1 /TEST IF INTERLEAVING OF LINES
CLL CIA
TAD NUM1+1
CLA CML RAL
TAD SAVNO
CIA
TAD NUM1
SNL CLA /SKP IF YES
JMP .+3
TAD (7 /WARN HIM BY SOUNDING BELL
JMS I (TTYO
DCA CARRY /CLEAR LZ SUPPRESSION FLAG
TAD NUM1 /PRINT FIRST DIGITS
JMS PRTBCD
TAD NUM1+1 /PRINT SECOND DIGITS
JMS PRTBCD
TAD [40 /PRINT A SPACE
JMS I [TTYOUT
TAD [40
DCA I PTR /STORE IN BUFFER TOO
ISZ PTR
TAD (-6 /NOW INCREMENT BCD LINENO (WHAT A PAIN)
DCA DIGCTR /DO 6 DIGITS
DIGLUP, DCA OVFL1
DCA OVFL2 /CLEAR OVERFLOW WORDS
TAD [7774
DCA CARRY /SET STEP COUNTER
SHIFT4, TAD (-6 /DO 6 WORDS
DCA TEMPDF
TAD (NUM1
DCA TOWARD /USE A FEW TEMPS
CLL
SHIFT6, TAD I TOWARD
RAR
DCA I TOWARD /SHIFT RIGHT ONE BIT
ISZ TOWARD
ISZ TEMPDF
JMP SHIFT6
ISZ CARRY
JMP SHIFT4
TAD OVFL2 /RECIRCULATE STEPSIZE DIGITS
TAD NUM2
DCA NUM2
CLL /ADD THE NEXT DIGIT
TAD OVFL1
TAD OVFL2
RAR
TAD (-2400 /MOD 10
SZL
ISZ CARRY /BUMP CARRY
SNL
TAD (2400 /RESTORE
CLL RAL
TAD NUM1 /STORE NEW DIGIT
DCA NUM1
TAD CARRY /ADD CARRY IN
TAD NUM1+1
DCA NUM1+1
ISZ DIGCTR
JMP DIGLUP /DO ALL 6 DIGITS
TAD CARRY /SEE IF EXCEEDED 999999
SZA CLA
JMP I [WHAT /YES
JMP I SEQFUD /ALL SET, RETURN
/STORE AND PRINT BCD DIGITS FOR SEQ MODE
PRTBCD, 0
DCA OVFL1 /SAVE DIGIT
CLL STA RTL
DCA OVFL2 /3 DIGITS
CVTBCD, TAD OVFL1
RTL
RTL
DCA OVFL1
TAD OVFL1
RAL
AND [17 /ISOLATE DIGIT
SZA
JMP .+4
TAD CARRY /SEE IF LEADING ZERO
SNA CLA
JMP SKIP0 /YES, IGNORE IT
ISZ CARRY /COUNT DIGIT
TAD (60 /MAKE ASCII
DCA I PTR /STORE IN BUFFER
TAD I PTR
ISZ PTR
JMS I [TTYOUT /PRINT IT
SKIP0, ISZ OVFL2
JMP CVTBCD
JMP I PRTBCD
/SAVE LOC OF NUMBER OF FOLLOWING LINE
SAVNXT, 0
JMS I [FINDLN /FIND THE LINE
JMS TEMPDF /SET THE DF TO ITS START
TAD I PTR /GET LINENO
TAD [-377 /SEE IF EOF
SNA
TAD [7400 /SET TO INFINITY IF YES
TAD [377 /RESTORE NUMBER
DCA SAVNO
ISZ PTR /BUMP PTR
SKP
JMS I [FINCR /AND DF IF NEEDED
TAD I PTR /GET THE NEXT WORD
DCA SAVNO+1 /STORE IT
CDF
JMP I SAVNXT /RETURN
CARRY, 0
NUM1, 0;0 /ADJACENCY ASSUMED
OVFL1, 0
NUM2, 0;0
OVFL2, 0 /ADJACENCY ASSUMED
SAVNO, 0;0
DIGCTR, 0
PAGE
/A FEW NON FITTING ERROR MESSAGES
MSGNF, TEXT /FILE NOT FOUND/
MSGIO, TEXT "I/O ERROR"
OLDNEW, TEXT /NEW OR OLD--/
BADFIL, TEXT /BAD FILE/
LINE, /THE TELETYPE LINE BUFFER.
WSNAME, 0;0;40;104;123;113;72;102;101;123;111;103;56;127;123;0 /" DSK:BASIC.WS"
START, JMP RBASIC /IT WAS RAN
CDF 10 /IF CHAINED TO CHECK IF CCL PASSED
TAD I (CDOPT4 /Q SWITCH IN RESPONSE TO .BASIC COMMAND (OS78)
CDF
AND [200 /ISOLATE THE BIT
SZA CLA
JMP RBASIC /TREAT AS .R BASIC IF YES
JMS I (CORE
CLA IAC
DCA I (JSW /NO SWAP
CIF 10
JMS I (7700 /FETCH USR
10
CIF 10
JMS I (200 /RESET SYSTEM TABLES
13
TLS /SET TTY FLAG
JMS I (GETDAT /SET UP TITLE
ISZ CHNFLAG /TELL ABOUT RETURN FROM RUN
JMP I (OLD /READ IN OLD WORK SPACE
RBASIC, CDF 10
DCA I (CDOPT3
DCA I (CDOPT4
DCA I (CDOPT5
DCA I (CDOPT6
CDF 0
TLS
JMS I (CORE
TAD [77
DCA I [TXTAREA
JMS I (GETDAT /SET UP TITLE
FINDSV, TAD I X11 /LOOK UP SOME SAVE FILES
SNA
JMP LUBUF /
DCA XXXXSV /SAVE POINTER TO NAME
CLA IAC
CIF 10
JMS I (200
2
XXXXSV, 0
0
JMP NG
IAC
CDF 10
TAD XXXXSV
DCA I X10 /SAVE BLOCK PLUS 1
CDF /IN INFO AREA
JMP FINDSV
LUBUF, CLA /REMOVED BASIC.UF LOOKUP
CDF 10
DCA I X10
CDF
CLA IAC /TYPE WITH NO CARRIAGE RETURN
JMS I [TYPE /"OLD OR NEW -- "
OLDNEW
JMS I [SWAP
JMS I (CLEARWS /CLEAR THE WORKSPACE IN CASE OF NO RESPONSE
TAD (-11 /SET TAB TO SPACE CONVERSION FLAG HERE
JMP I (MAINLUP
NG, JMS I [TYPE /PART OF SYSTEM MISSING
MISING
JMP I (7605
PAGE
LINEND= .-1 /DEFINE THE END OF THE LINE BUFFER
/THE FOLLOWING ROUTINE ASSUMES THAT THE YEAR IS ALREADY
/SET UP BY A CALL TO "CORE" - JR
GETDAT, 0 /PUT OS8 DATE INTO THE TITLE
CDF 10
TAD I (MDATE /GET DATE WORD
CDF
DCA TEMP2 /SAVE IT
TAD TEMP2
SNA
JMP I GETDAT /NO DATE
AND [7400 /GET MONTH
CLL RTL /SHIFT SOME
RTL
RTL
TAD (MONTHS-3
DCA X12
TAD (DATE-1 /SET UP POINTER TO DATE
DCA X13
TAD TEMP2 /GET DAY
RTR
RAR
AND (37
JMP DAYGO /CONVER TO TEXT
DAYLP, TAD (100-12 /REDUCE AND TALLY QUOTIENT
TAD TEMP
DAYGO, DCA TEMP
TAD TEMP /SEE IF OVERFLOW
AND [77
TAD (7766
SMA CLA
JMP DAYLP /REDUCE MOD 10 IF NOT
TAD TEMP
TAD (6060 /UNPACK TO 6 BIT ASCII
DCA I X13 /INTO DATE
TAD I X12 /GET MONTH CHARS
DCA I X13
TAD I X12
DCA I X13
/ TAD TEMP2 /GET YEAR
/ AND (7
/ TAD (21
/ CLL RTL
/ RTL
/ RTL
/ ISZ X13 /THE WORD WITH -7 IS THERE
/ DCA I X13 /STORE LAST DIGIT OF YEAR
/ABOVE JOB DONE BY "CORE" DURING INIT TIME
JMP I GETDAT
MONTHS, TEXT /-JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC/
NAMLST, BASICN
BCOMPN
BLOADN
BRTSN
BOVN
0
BASICN, FILENAME BASIC.SV
BCOMPN, FILENAME BCOMP.SV
BLOADN, FILENAME BLOAD.SV
BRTSN, FILENAME BRTS.SV
BOVN, FILENAME BASIC.OV
MISING, TEXT /INCOMPLETE SYSTEM/
PAGE
/THIS PAGE GETS WIPED OUT SOON
/ROUTINE TO GET CORESIZE, SETUP DATE IN HEADING
/AND SET SCOPE / TTY FLAG FOR RUBOUT TREATMENT
CORE, 0 /CORE SIZE SUBROUTINE
CDF 10 /GET INTO DATE FIELD
TAD I (MDATE
CDF /RESET FIELD
AND (7 /LOOK AT LOW YEAR BITS
DCA TEMP /HOLD
TAD I (BIPCCL /NOW GET THE EXTENDED BITS
AND (600 /FROM THE 600 BITS
CLL RTR
CLL RTR /SHIFT INTO PLACE
TAD TEMP /ADD TO LOW BITS
ISZ I (DASH6 /BUMP THE YEAR TENS DIGIT
TAD (-12
SMA /SKP IF .LT. 10 OFF OF 1970
JMP .-3 /ELSE DECR AGAIN
TAD (12+60 /CONVERT TO 6 BIT ASCII
CLL RTL
RTL
RTL /SWAP TO LEFT HALF BYTE
DCA I (EODAT /NOW STORE IN DATE TEMPLATE
CDF 10
TAD I (7726 /LOOK AT HLT/CLA HLT SCOPE KLUDGE
CDF
AND [200 /GET SCOPE BIT
DCA I (SCOPFG /AND STORE IT
/STANDARD OS/8 CORESIZE ROUTINE
TAD I (7777
AND COR70
CLL RAR
RTR
SNA
JMP COR0
IAC
DCA CORSIZ
JMP COREX
COR0, CDF
TAD CORSIZ
RTL
RAL
AND COR70
TAD COREX
DCA .+1
COR1, CDF
TAD I CORLOC
COR2, NOP
DCA COR1
TAD COR2
DCA I CORLOC
COR70, 70
TAD I CORLOC
CORX, 7400
TAD CORX
TAD CORV
SZA CLA
JMP COREX
TAD COR1
DCA I CORLOC
ISZ CORSIZ
JMP COR0
COREX, CDF
TAD CORSIZ
CIA
DCA CORSIZ
CLL CML CLA RTL /2
TAD CORSIZ
SZA CLA
JMP I CORE
TAD (AC7776 /SAVE ONLY FIELDS 0 AND 1 IF 8K SYSTEM
DCA I (PATCH5
JMP I CORE
CORLOC, CORX
CORV, 1400
$$