; UPDATE 2 25 APR 1972 FIX ERROR RETURNS IN GETELT & FILECK ; UPDATE 1 21 APR 1972 FIX GETELT'S ELEMENT DISPLACEMENT .TITLE BFUP ; BFUP ;***********************************************************************BFUP ; *BFUP ; B F U P *BFUP ; ; UPDATE 1 21 APR 1972 FIX GETELT'S ELEMENT DISPLACEMENT .TITLE BFUP ; BFUP ;***********************************************************************BFUP ; *BFUP ; B F U P *BFUP ; *BFUP ; PROGRAM IDENTIFICATION: BFUP - BATCH FILE UT; UPDATE 1 OF DOSBUT FROM UTIL.V/3. CORE TASK 14. - DOS BOOT. ; UPDATE 2 12 APR 1972 INCREASE BUFFER SIZE ; UPDATE 1 21 MAR 1972 ADDRESS IN D+SKTTTAPE ;*********************************************************************** ; * ; THIS MODULE WILL REBOOT DOS OF THE RF-11 BY FAKING THE *DBUT ; HARDWARE BOOTSTRAP CODE. *DBUT ; ; UPDATE 1 14 MAR 1972 CLEAN UP ;***********************************************************************RCOM ; R O S C O M *RCOM ; *RCOM ; PROGRAM IDENTIFICATION: ROSCOM - CENTRALIZED ROS COMMAND STRING*RCOM ; PARSING. *RCOM ; *RCOM *BFUP ; PROGRAM IDENTIFICATION: BFUP - BATCH FILE UTILITY PROCESSOR *BFUP ; *BFUP ; PURPOSE: THIS SERIES OF ROUTINES ALLOWS A USER TO MANIPULATE *BFUP ; A BATCH FILE AND ITS ELEMENTS. THE FUNCTIONS *BFUP ; PROVIDED ARE: *BFUP ; BFINIT - INITIALIZE A ROS FILE FOR BFUP USE *BFUP ; ILITY PROCESSOR *BFUP ; *BFUP ; PURPOSE: THIS SERIES OF ROUTINES ALLOWS A USER TO MANIPULATE *BFUP ; A BATCH FILE AND ITS ELEMENTS. THE FUNCTIONS *BFUP ; PROVIDED ARE: *BFUP ; BFINIT - INITIALIZE A ROS FILE FOR BFUP USE *BFUP ; BFENTR - ENTER A NEW ELEMENT IN THE BFUP *BFUP ; * ;*********************************************************************** .TITLE DOSBUT ; DBUT .DEF DOSHED ; DBUT STSIZE = 50. ; NUMBER OF WORDS IN STACK. DBUT ; ; TASK #14. - TRANSFER CONTROL TO DOS VIA FAKED ROM BOOT. DOSHED: .WORD 1 ; THREAD WORD DBUT .WORD RE ; PURPOSE: ROSCOM, BY PROVIDING A COMMON, CENTRALIZED HANDLING OF*RCOM ; ALL ROS COMMAND STRING PARSING, GIVES A STANDARD, *RCOM ; CONSISTENT SYNTAX AND NON-REDUNDENCY IN CODE. *RCOM ; *RCOM ; METHOD: THE METHOD USED IS MODULAR. THE USER PERFORMS ALL *RCOM ; REQUIRED I/O. ROSCOM ENTRY POINTS PROVIDE THE *RCOM ; FOLLOWING SERVICES: BFENTR - ENTER A NEW ELEMENT IN THE BFUP *BFUP ; DIRECTORY AND PREPARE IT FOR CREATION *BFUP ; BFOPEN - MARK AN EXISTING ELEMENT AS BEING READ*BFUP ; AND RETRIEVE THE LOCATION AND LENGTH *BFUP ; BFCLOS - FREE AN OPEN ELEMENT *BFUP ; UPDATE DIRECTORY ENTRY IF ELEMENT IS *BFUP ; BEING CREATED  DIRECTORY AND PREPARE IT FOR CREATION *BFUP ; BFOPEN - MARK AN EXISTING ELEMENT AS BEING READ*BFUP ; AND RETRIEVE THE LOCATION AND LENGTH *BFUP ; BFCLOS - FREE AN OPEN ELEMENT *BFUP ; UPDATE DIRECTORY ENTRY IF ELEMENT IS *BFUP ; BEING CREATED *BFUP ; BFDELT - MARK AN EXISTING ELEMENT S100 ; START ADD .WORD 0,0 ; NO INIT OR MAX TIME .BYTE STSIZE ; STACK SIZE .BYTE 1 ; PRIORITY .WORD 0 ; CURRENT TIME .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT .ENDC ; .BYTE 0 ; CPU LEVEL .BYTE 14. ; TASK #. .WORD 0 ; STACK POINTER .=.+STSIZE+STSIZ *RCOM ; 1) DETERMINE THE NUMBER OF FIELDS IN A STRING. *RCOM ; 2) RETURN THE ADDRESS OF A SPECIFIED FIELD AND *RCOM ; ITS LENTH. *RCOM ; 3) RETURN VALUE OF A SPECIFIED NUMERIC FIELD. *RCOM ; *RCOM ; THESE FUNCTIONS ARE PROVIDED BY THESE ROUTINES: *RCOM ;  *BFUP ; BFDELT - MARK AN EXISTING ELEMENT FOR DELETION *BFUP ; *BFUP ; METHOD: THE METHOD USED IS TO USE THREE TYPES OF TABLES. *BFUP ; THESE ARE: *BFUP ; 1) BFUP COMMUNICATIONS BLOCK WHICH CONTAINS ALL *BFUP ; COMMUNICATION BETWEEN BFUP AND THE USER. IT IS*BFUP ; PROVIDFOR DELETION *BFUP ; *BFUP ; METHOD: THE METHOD USED IS TO USE THREE TYPES OF TABLES. *BFUP ; THESE ARE: *BFUP ; 1) BFUP COMMUNICATIONS BLOCK WHICH CONTAINS ALL *BFUP ; COMMUNICATION BETWEEN BFUP AND THE USER. IT IS*BFUP ; PROVIDED BY THE USER. *BFUP ; E ; STACK AREA RES100: RESET ; CLEAR BUSS REGISTERS MOV #10.,R3 ; SET RETRY COUNTER RES110: DEC R3 ; COUNT THIS TRY BNE RES120 ; HAVEN'T RUN OUT YET HALT ; TRIED THEM ALL. BR RES100 ; HE HIT 'CONT' TO TRY AGAIN RES120: MOV #177462,R0 ; GET ADDRESS OF RF-11 WORD COUNT REG. MOV #177400,(R0) ; PUT A -256 (4 SECT) COUNT IN IT. MOV  1) NPARAM (EMT #29) *RCOM ; 2) SCAN (EMT #27) *RCOM ; 3) NUMFLD (EMT #28) *RCOM ; *RCOM ; USAGE: THE LINKAGE TO EACH ROUTINE IS: *RCOM ; *RCOM ; NPARAM: ED BY THE USER. *BFUP ; WORD 0 STATUS CODE OF OPERATION *BFUP ; WORD 1 ID OF ROS FILE TO USE *BFUP ; WORD 2&3 ELEMENT NAME IN RAD50 (6 CHARS)*BFUP ; WORD 4 BYTE 0 RESERVED FOR BFUP USE *BFUP ; WORD 4 BYTE 1 ELEMENT TYPE *BFUP ; WORD 5 ELEMENT'S RELATIVE START SECTOR* WORD 0 STATUS CODE OF OPERATION *BFUP ; WORD 1 ID OF ROS FILE TO USE *BFUP ; WORD 2&3 ELEMENT NAME IN RAD50 (6 CHARS)*BFUP ; WORD 4 BYTE 0 RESERVED FOR BFUP USE *BFUP ; WORD 4 BYTE 1 ELEMENT TYPE *BFUP ; WORD 5 ELEMENT'S RELATIVE START SECTOR*BFUP ; WORD 6 ELEMENT'S LENGTH IN SECT #5,-(R0) ; SET DISK FUNCTION FOR READ/GO RES130: TSTB (R0) ; WAIT HERE UNTIL BIT 7 GOES ON FOR BPL RES130 ; DONE TST (R0) ; CHECK FOR ERRORS BMI RES110 ; ERROR. GO TRY ALL OVER AGAIN. JMP @#0 ; ALL A-OK. TRANSFER CONTROL TO CODE ; READ IN WHICH STARTS AT WORD 0. ; 'RESET' SET MEMORY ADDRESS TO 0. .END  *RCOM ; MOV #STRING,-(SP) ; ADDRESS OF FIRST CHARACTER. *RCOM ; MOV NC,-(SP) ; NUMBER OF CHARACTERS. *RCOM ; EMT 29 ; NPARAM *RCOM ; MOV (SP)+,NUM ; GET NUMBER OF FIELDS. *RCOM ; *RCOM ; SCAN: *RCOM ; BFUP ; WORD 6 ELEMENT'S LENGTH IN SECTORS *BFUP ; *BFUP ; 2) ELEMENT DIRECTORY ENTRY WHICH RECORDS EACH *BFUP ; ELEMENT'S PERTINENT INFORMATION ON DISK. *BFUP ; SECTORS 0-31. ARE USED. EACH ENTRY REQUIRES *BFUP ; 8 WORDS. THEREFOR EACH SECTOR HOLDS 8 ENTRIES *BFUP ; GIVING A TOTORS *BFUP ; *BFUP ; 2) ELEMENT DIRECTORY ENTRY WHICH RECORDS EACH *BFUP ; ELEMENT'S PERTINENT INFORMATION ON DISK. *BFUP ; SECTORS 0-31. ARE USED. EACH ENTRY REQUIRES *BFUP ; 8 WORDS. THEREFOR EACH SECTOR HOLDS 8 ENTRIES *BFUP ; GIVING A TOTAL OF 256 BLOCKS. THE FIRST ENTRY *BFUP ; IS U MOV NTH,-(SP) ; # OF REQUIRED FIELD. *RCOM ; MOV #STRING,-(SP) ; ADDRESS OF FIRST CHARACTER. *RCOM ; MOV NC,-(SP) ; NUMBER OF CHARACTERS. *RCOM ; EMT 27 ; SCAN *RCOM ; MOV (SP)+,FIELD ; ADD. OF FIRST CHAR. IN FIELD.*RCOM ; ; IF 0, FIELD IS VOID OR *RCOM ; ; NONEXISTENT.AL OF 256 BLOCKS. THE FIRST ENTRY *BFUP ; IS USED FOR FILE HOUSE KEEPING WHICH LEAVES *BFUP ; A MAXIMUM OF 255 ELEMENTS/FILE. *BFUP ; *BFUP ; 3) FILE DATA BLOCK - THIS IS THE FIRST DIRECTORY *BFUP ; ENTRY (REFERED TO AS 'ENTRY 0') AND CONTAINS *BFUP ; THE FILES STATUS, FLAGS, ETC. *BFUP SED FOR FILE HOUSE KEEPING WHICH LEAVES *BFUP ; A MAXIMUM OF 255 ELEMENTS/FILE. *BFUP ; *BFUP ; 3) FILE DATA BLOCK - THIS IS THE FIRST DIRECTORY *BFUP ; ENTRY (REFERED TO AS 'ENTRY 0') AND CONTAINS *BFUP ; THE FILES STATUS, FLAGS, ETC. *BFUP ; ; UPDATE 1 OF UTIL (OVERLAY) FROM UTIL.V03. ; UPDATE 2 12 APR 1972 INCREASE BUFFER SIZE ; UPDATE 1 21 MAR 1972 ADDRESS IN D+SKTTTAPE ;*********************************************************************** ; * ; THIS MODULE IS AN OVERLAY TASK TO COPY THE DDC DISK TO DECTAPE.*UTIL ; SECTORS 0-8191. ARE TRANSFERED. MASK IS NOT USED. THE TASK *UTIL ; IS ACTIVATED BY THE OPERATOR KEY IN 'UT'. *RCOM ; MOV (SP)+,LENTH ; # OF CHARACTERS IN FIELD. *RCOM ; MOV (SP)+,ERROR ; STATUS CODE *RCOM ; ; =0 REQUEST COMPLETED *RCOM ; ; >0 FIELD NONEXISTENT. *RCOM ; ; VALUE IS # OF EXISTING *RCOM ; ; FIELDS. *RCOM ; !; *BFUP ; THE USER MAY DEFINE HIS ROS FILE TO ANY SIZE > 32 *BFUP ; SECTORS. EACH ELEMENT WILL ONLY USE THE SPACE IT *BFUP ; REQUIRES. TO PERMIT THIS, ONLY 1 ELEMENT MAYBE *BFUP ; CREATED AT A TIME IN EACH BFUP FILE. ON THE OTHER *BFUP ; HAND, UP TO 127 ELEMENTS MAYBE READ AT ONE TIME. *BFUP ; THE SPACE OVER THE 32 SEC" *BFUP ; THE USER MAY DEFINE HIS ROS FILE TO ANY SIZE > 32 *BFUP ; SECTORS. EACH ELEMENT WILL ONLY USE THE SPACE IT *BFUP ; REQUIRES. TO PERMIT THIS, ONLY 1 ELEMENT MAYBE *BFUP ; CREATED AT A TIME IN EACH BFUP FILE. ON THE OTHER *BFUP ; HAND, UP TO 127 ELEMENTS MAYBE READ AT ONE TIME. *BFUP ; THE SPACE OVER THE 32 SECTORS USED FOR THE DIRECTORY *BFUP ; IS COMPLETLY AVAI# *UTIL ; * ;*********************************************************************** .TITLE UTIL .DEF UTLHED ; UTIL .DEF COMPID ; SCRATCH FILE TYPE FOR COMPRESS USE. UTIL ; ; PARAMETERS MAXSEC = 8191. ; HIGHEST SECTOR TO BE SAVED NBLOCK = 16. ; # OF DECTAPE BLOCKS FOR TRANSFER UTIL$ *RCOM ; NUMFLD: *RCOM ; MOV NTH,-(SP) ; # OF REQUIRED FIELD. *RCOM ; MOV #STRING,-(SP) ; ADDRESS OF FIRST CHARACTER. *RCOM ; MOV NC,-(SP) ; NUMBER OF CHARACTERS. *RCOM ; EMT 28 ; NUMFLD *RCOM ; MOV (SP)+,VALUE ; VALUE OF FIELD, IF%TORS USED FOR THE DIRECTORY *BFUP ; IS COMPLETLY AVAILABLE FOR USER DATA. *BFUP ; *BFUP ; EACH USER REQUEST WILL, IF'COMPLETED, UPDATE THE *BFUP ; ELEMENTS DIRECTORY AND, IF REQUIRED, THE FILE'S *BFUP ; DATA BLOCK. IF NOT COMPLETED IT WILL RETURN AN ERROR *BFUP ; CODE IN THE COMMUNICATIONS BLOCK. *BFUP ; &LABLE FOR USER DATA. *BFUP ; *BFUP ; EACH USER REQUEST WILL, IF'COMPLETED, UPDATE THE *BFUP ; ELEMENTS DIRECTORY AND, IF REQUIRED, THE FILE'S *BFUP ; DATA BLOCK. IF NOT COMPLETED IT WILL RETURN AN ERROR *BFUP ; CODE IN THE COMMUNICATIONS BLOCK. *BFUP ; *BFUP' BUFSIZ = 256.*NBLOCK ; # WORDS IN BUFFER UTIL STSIZE = 100 ; # WORDS IN STACKS EXIT = 4 TTYOUT = 13 TTYIN = 14 DECTAP = 15 DISCIO = 23 NOCHKP = 30 ; NO CHECKPOINT UTIL LF = 12 ; AN ASCII LF CR = 15 ; AN ASCII CR .PAGE ; ; TASK #15. - SAVE DDS DISK ON 4 DECTAPES-CURRENTLY ONLY FIRST 8192 ; SECTORS AR( NUMERIC. *RCOM ; MOV (SP)+,ERROR ; STATUS CODE *RCOM ; ; =-2 VOID FIELD *RCOM ; ; =-1 NON-NUMERIC FIELD *RCOM ; ; = 0 REQUEST COMPLETED *RCOM ; ; > 0 FIELD NONEXISTENT. *RCOM ; ; VALUE IS # OF EXISTING*RCOM ; ) *BFUP ; ONLY ONE CALL TO BFUP CAN BE ACTIVE. CONTROL IS NOT *BFUP ; RETURNED UNTIL A REQUEST IS COMPLETED. *BFUP ; *BFUP ; DEFINITIONS: FILE - A ROS DEFINED FILE *BFUP ; BFUP FILE - A FILE PROCESSED BY BFINIT TO SETUP *BFUP ; THE BFUP DIREC* ; ONLY ONE CALL TO BFUP CAN BE ACTIVE. CONTROL IS NOT *BFUP ; RETURNED UNTIL A REQUEST IS COMPLETED. *BFUP ; *BFUP ; DEFINITIONS: FILE - A ROS DEFINED FILE *BFUP ; BFUP FILE - A FILE PROCESSED BY BFINIT TO SETUP *BFUP ; THE BFUP DIRECTORY. *BFUP ; ELEMENT - A SINGLE+E SAVED SINCE LAST HALF IS RESERVED FOR DOS USE. UTLHED: .WORD 1 ; THREAD WORD UTIL .WORD DKS100 ; START ADD .WORD 0,0 ; NOT INIT OR MAX TIME .BYTE STSIZE ; STACK SIZE .BYTE 1 ; PRIORITY .WORD 0 ; CURRENT TIME .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT .ENDC ; .BYTE $O, ; FIELDS. *RCOM ; *RCOM ; SUBROUTINES USED: PUSHR, POPR, ASCBIN *RCOM ; *RCOM ; REGISTERS USED: ALL REGISTERS ARE RESTORED. *RCOM ; *RCOM ; SYNTAX: THE SYNTAX OF A ROS COMMAND STRING IS ONE OR MORE -TORY. *BFUP ; ELEMENT - A SINGLE COLLECTION OF DATA IN A BFUP *BFUP ; FILE. IT IS IDENTIFIED BY A UNIQUE *BFUP ; 6 CHARACTER NAME AND TYPE CODE. *BFUP ; TYPE - EACH ELEMENT IS FLAGED AS TO ITS TYPE. *BFUP ; CURRENT TYPES ARE: *BFUP ; 0 - OBJECT (OUTPUT OF RASM) *BFUP ; . COLLECTION OF DATA IN A BFUP *BFUP ; FILE. IT IS IDENTIFIED BY A UNIQUE *BFUP ; 6 CHARACTER NAME AND TYPE CODE. *BFUP ; TYPE - EACH ELEMENT IS FLAGED AS TO ITS TYPE. *BFUP ; CURRENT TYPES ARE: *BFUP ; 0 - OBJECT (OUTPUT OF RASM) *BFUP ; 1 - LOAD (OUTPUT OF ROSLOD) *BFUP ; /VTYP ; CPU LEVEL - OVERLAY FILE TYPE. UTIL .BYTE $UTLNO ; TASK NUMBER. UTIL .WORD 0 ; STACK SIZE .WORD 206 ; FILE ID FOR OVERLAY LOAD ELEMENT. UTIL .=.+STSIZE+STSIZE ; RESERVE STACK AREA. UTIL ; T/O LISTS KBLIST: .WORD 1 ; THREAD WORD .BYTE 0,2 ; TTY, EXIT 2 .WORD 0 ; NO I/O COMPLETE ROUTINE 0 *RCOM ; ALPHANUMERIC FIELDS, SEPERATED BY COMMAS AND TERMINATED*RCOM ; BY THE END OF THE STRING. BLANKS ARE NOT COMPRESSED *RCOM ; AND ARE TREATED AS NON-NUMERIC CHARACTERS. *RCOM ; *RCOM ; PROGRAMMER: 53 *RCOM ; VERSION: 1 *RCOM ; DATE: 17 JAN 72 1 1 - LOAD (OUTPUT OF ROSLOD) *BFUP ; 2 - GENERAL SYMBOLIC *BFUP ; 3 - RASM SYMBOLIC *BFUP ; 4 - FORTRAN SYMBOLIC *BFUP ; 5 - DATA SYMBOLIC *BFUP ; *BFUP ; LINKAGE: ALL BFUP ROUTINES ARE USED WITH A ST2 2 - GENERAL SYMBOLIC *BFUP ; 3 - RASM SYMBOLIC *BFUP ; 4 - FORTRAN SYMBOLIC *BFUP ; 5 - DATA SYMBOLIC *BFUP ; *BFUP ; LINKAGE: ALL BFUP ROUTINES ARE USED WITH A STANDARD LINKAGE. *BFUP ; IT IS: 3 .BYTE 0,1 ; NO ERROR TASK-PRIORITY REQUEST .WORD 0,0 ; ERROR, SYSTEM KBADD: .WORD 0 ; ADDRESS OF DATA BUFFER DKLIST: .WORD 1 ; THREAD WORD .BYTE 1,2 ; DISK#1 - EXIT TYPE 2 .WORD 0 ; NO I/O COMPLETE .BYTE 0,3 ; NO ERROR TASK-LEVEL #3 DKERR: .WORD 0,0 ; ERROR,SYSTEM .WORD DBUFF ; ADDRESS OF DATA BUFFER DTLIST: .WORD 4 *RCOM ; CATALOGUE NUMBER: *RCOM ; *RCOM ;***********************************************************************RCOM .TITLE ROSCOM RCOM ; RCOM CSAVE = 12. ;OFFSET FOR PUSHR/POPR REG SAVE 5ANDARD LINKAGE. *BFUP ; IT IS: *BFUP ; *BFUP ; MOV #COMBLK,-(SP) (RASM) *BFUP ; EMT BFUP ROUTINE *BFUP ; *BFUP ; CALL BFUP ROUTINE(COMBLK) (FORTRAN) *BFUP ; 6 *BFUP ; *BFUP ; MOV #COMBLK,-(SP) (RASM) *BFUP ; EMT BFUP ROUTINE *BFUP ; *BFUP ; CALL BFUP ROUTINE(COMBLK) (FORTRAN) *BFUP ; *BFUP ; 71 ; THREAD WORD DTUNIT: .BYTE 0,2 ; DEVICE - EXIT TYPE 2 .WORD 0 ; NO I/O COMPLETE .BYTE 0 ; NO ERROR TASK DTFUN: .BYTE 0 ; DECTAPE FUNCTION - 0=READ 1=WRITE DTERR: .WORD 0,0 ; ERROR - SYSTEM .WORD TBUFF ; DATA BUFFER .PAGE ; I/O BUFFERS MES1: .WORD MES1LN,0 ; # CHARACTERS .BYTE CR,LF .ASCII /*** MOUNT DECTAPES 0,1,2,3/ HRCOM NC = CSAVE+2 ;OFFSET TO FIRST ARG(# CHARACTERS) RCOM STRING = NC+2 ;OFFSET TO STRING ADDRESS RCOM NTH = STRING+2 ;OFFSET TO FIELD NUMBER RCOM FIELD = CSAVE+2 ;OFFSET TO ADD OF FIELD RCOM NUM = CSAVE+4 ;OFFSET TO NUMBER OF FIELDS RCOM LENTH = CSAVE+4 ;OFFSET TO LENTH OF FIELD RCOM VALUE = CSAVE+4 ;OFFE *BFUP ; WHERE COMBLK IS THE ADDRESS OF A BFUP COMMUNICATIONS *BFUP ; BLOCK *BFUP ; *BFUP ; THE VARIOUS ROUTINES REQUIRE THE FOLLOWING INFO. *BFUP ; BFINIT ROS ID *BFUP ; BFENTR ROS ID, NAME, TYPE F WHERE COMBLK IS THE ADDRESS OF A BFUP COMMUNICATIONS *BFUP ; BLOCK *BFUP ; *BFUP ; THE VARIOUS ROUTINES REQUIRE THE FOLLOWING INFO. *BFUP ; BFINIT ROS ID *BFUP ; BFENTR ROS ID, NAME, TYPE *BFUP ; BFOPEN ROS ID, NAME, TYPE G; .BYTE CR ; NEW LINE .ASCII /SET SWITCHES=-1 TO RESTORE DISK/ .BYTE CR ; .ASCII /HIT WHEN READY: / MES1LN =.-MES1-4 .EVEN MES2: .WORD 0,0 ; GO AHEAD - JUST A CR. MES3: .WORD MES3LN,0 ; DISK ERROR .BYTE CR,LF .ASCII /DISK ERROR - ABORTED/ MES3LN =.-MES3-4 .EVEN MES4: .WORD MES4LN,0 ; TAPE ERROR .BYTE CR,LF .ASCII /DECTA""""""" """""""""""""""DDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDD """"""""""""""""""""DDDDDDDDDADD+B C dQDd dP@ckOKr%P.q Qbq Rc gpO gpPr%Q/*iiKP7iKQ7 RinMOK_$Da ͋,L w:B8 ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & I *BFUP ; BFOPEN ROS ID, NAME, TYPE *BFUP ; BFCLOS ROS ID, NAME, TYPE, LENGTH *BFUP ; BFDELT ROS ID, NAME, TYPE *BFUP ; *BFUP ; ALL RETURN A STATUS CODE. ADDITIONALLY, BFENTR *BFUP ; AND BFOPEN RETURN A RELATIVE START SECTOR FOR *BFUP ; TRANSFJ *BFUP ; BFCLOS ROS ID, NAME, TYPE, LENGTH *BFUP ; BFDELT ROS ID, NAME, TYPE *BFUP ; *BFUP ; ALL RETURN A STATUS CODE. ADDITIONALLY, BFENTR *BFUP ; AND BFOPEN RETURN A RELATIVE START SECTOR FOR *BFUP ; TRANSFERS TO BEGIN AT. *BFUP ; KPE ERROR - ABORTED/ MES4LN =.-MES4-4 .EVEN DBUFF: .WORD NDISCS+1 ; FILE ID - ALL OF DISK .BYTE 0 ; USE SPECIFIED SEC # DKFUN: .BYTE 0 ; FUNCTION 0=READ 1=WRITE .WORD 0,0,0 ; DISCIO USE TBUFF: ; TAPE BUFFER BLKSEC: .WORD 0 ; SECTOR OR BLOCK # .WORD BUFSIZ ; # WORDS TO TRANSFER BUFFER: .=.+BUFSIZ+BUFSIZ ; RESERVE BUFFER .EVEN LSET TO VALUE OF NUMERIC FIELD RCOM ERROR = VALUE+2 ;OFFSET TO STATUS CODE RCOM .PAGE RCOM ; THIS SUBROUTINE, 'NPARAM', COUNTS THE NUMBER OF FIELDS IN A ROS RCOM ; COMMAND STRING AND RETURNS THE VALUE TO THE CALLER. ALL USED RCOM ; REGISTERS ARE RESTORED. RCOM ; RCOM MERS TO BEGIN AT. *BFUP ; *BFUP ; BFUP STATUS CODES ARE: *BFUP ; 0 *BFUP ; 1 *BFUP ; 2 *BFUP ; 3 N *BFUP ; BFUP STATUS CODES ARE: *BFUP ; 0 *BFUP ; 1 *BFUP ; 2 *BFUP ; 3 *BFUP ; 4 O.PAGE DKS100=. EMT NOCHKP ; NO CHECKPOINTS. UTIL MOV #COMPID+2,R0 ; GET ADDRES IN DISCIO OF FILE ID CLR (R0)+ ; TO USE FOR DUMPING ENTIRE DISK AREA MOV #400,(R0)+ ; MOV #MAXSEC+1,(R0)+ ; SET SIZE OF AREA CLR (R0)+ ; CLR R0 ; DISK SECTOR CLR R1 ; TAPE BLOCK # MOV #BLKSEC,R2 ; SET ADDRESS OF SECTOP .DEF NPARAM ; RCOM .REF PUSHR,POPR ; RCOM ; RCOM ; NPARAM'S STACK LOOKS AS FOLLOWS: RCOM ; RCOM ; RCOM ; STRING ADD. AT CALL Q *BFUP ; 4 *BFUP ; 5 *BFUP ; 6 *BFUP ; 7 *BFUP ; 8 *BFUP ; 9 *BFUP ; 10 R *BFUP ; 5 *BFUP ; 6 *BFUP ; 7 *BFUP ; 8 *BFUP ; 9 *BFUP ; 10 *BFUP ; SR/BLOCK NUMBER. MOVB #5,DTUNIT ; INITIALIZE TO DECTAPE UNIT 0 MOV #MES1,KBADD ; PUT OUT INSTRUCTIONS MOV #KBLIST,-(SP) ; EMT TTYOUT ; TTYOUT MOV #MES2,KBADD ; GET GO AHEAD MOV #KBLIST,-(SP) ; EMT TTYIN ; TTYIN MOV @#177570,R3 ; GET SWITCH VALUE CMP R3,#-1 ; =-1 TAPE TO DISK ELSE DISK TO TAPE BNE DKS120 ; MOT RCOM ; # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; R5 AFTER PUSHR RCOM ; R4 RCOM ; R3 RCOM ; R2 RCOM ; U *BFUP ; 11 *BFUP ; *BFUP ; SUBROUTINES USED: PUSHR, POPR, DISCIO *BFUP ; *BFUP ; ALL REGISTERS ARE RESTORED *BFUP ; *V 11 *BFUP ; *BFUP ; SUBROUTINES USED: PUSHR, POPR, DISCIO *BFUP ; *BFUP ; ALL REGISTERS ARE RESTORED *BFUP ; *BFUP ; PROGRAMMER: 53 WVB #1,DKFUN ; SET TAPE TO DISK - DISK WRITE CLRB DTFUN ; TAPE READ BR DKS200 ; DKS120: CLRB DKFUN ; DISK TO TAPE - DISK READ MOVB #1,DTFUN ; TAPE WRITE DKS200: CMP R3,#-1 ; DO STUFF BNE DKS220 ; BRANCH FOR DISK TO TAPE JSR PC,DT ; READ TAPE JSR PC,DK ; WRITE DISK BR DKS250 ; TO TO COMMON DKS220: JSR PC,DK X R1 RCOM ; R0 <=SP RCOM ; RCOM ; # FIELDS READY FOR RETURN RCOM ; PC FOR RETURN <=SP RCOM ; RCOM NPARAM =. ; ENTRY POINT YBFUP ; PROGRAMMER: 53 *BFUP ; DATE: 7-APR-72 *BFUP ; REVISION: *BFUP ; CATALOGUE NUMBER: *BFUP ; *BFUP ;***********************************************************************BFUP .REF PUSHR,POPR ; Z *BFUP ; DATE: 7-APR-72 *BFUP ; REVISION: *BFUP ; CATALOGUE NUMBER: *BFUP ; *BFUP ;***********************************************************************BFUP .REF PUSHR,POPR ; BFUP .PAGE [ ; READ DISK JSR PC,DT ; WRITE TAPE DKS250: ADD #BUFSIZ/256.,R1 ; ADJUST TAPE BLOCK # ADD #BUFSIZ/64.,R0 ; ADJUST DISK SECTOR #. CMP R0,#MAXSEC ; ALL DONE (> MAX SEC#)? BGE DKSEND ; YES CMP R1,#512. ; FULL TAPE? BLT DKS200 ; NO - GET NEXT CLR R1 ; YES - GET NEXT TAPE UNIT INC DTUNIT ; BR DKS200 ; OK\ RCOM JSR R5,PUSHR ; SAVE ALL REGISTERS RCOM MOV NC(SP),R4 ; GET NUMBER OF CHARACTERS IN FIELD. RCOM MOV STRING(SP),R5 ; GET THE ADDRESS OF THE CHAR, STRING. RCOM ADD R5,R4 ; CONVERT R4 TO ADDRESS OF STRING END. RCOM CLR R1 ; CLEAR COMMA COUNTER RCOM NPRA10: JSR PC,GETCOM ; LOOK FOR A COMMA. RCOM INC ] BFUP .PAGE BFUP ; PARAMETERS USED BY BFUP BFUP ; BFUP ; FILE & ELEMENT STATUS (BYTES) BFUP STAVAL = 0 ; ELEMENT AVAILABLE - FILE FREE BFUP STOPEN = 1 ; ELEMENT BEING READ BFUP ^ BFUP ; PARAMETERS USED BY BFUP BFUP ; BFUP ; FILE & ELEMENT STATUS (BYTES) BFUP STAVAL = 0 ; ELEMENT AVAILABLE - FILE FREE BFUP STOPEN = 1 ; ELEMENT BEING READ BFUP STXUSE = -1 ; ELEMENT BEING CREATED _ - GO FOR MORE DKSTER: MOV #MES4,KBADD ; TAPE ERROR BR DKSERR ; GO TO COMMON CODE DKSDER: MOV #MES3,KBADD ; DISK ERROR DKSERR: MOV #KBLIST,-(SP) ; WRITE ERROR MESSAGE EMT TTYOUT ; DKSEND: EMT EXIT ; EXIT ; DISK I/O HERE DK: MOV R0,(R2) ; SET DISK SECTOR #. MOV #DKLIST,-(SP) ; WRITE DISK SECTORS EMT DISCIO ; TST DKERR ; ANY ERRORS ` R1 ; INCREMENT COUNTER. ALWAYS AT LEAST RCOM TST R0 ; 1 FIELD. WAS A COMMA FOUND? RCOM BNE NPRA10 ; YES. LOOK FOR ANOTHER. RCOM MOV R1,NUM(SP) ; STORE # FOUND FOR CALLER. RCOM NPRF10: JSR R5,POPR ; RESTORE REGISTERS. RCOM NPRF20: MOV (SP)+,(SP) ; MOVE RETURN ADDRESS UP FOR RETURN. RCOM RTS PC ; GO BACK TO CALLER. aSTXUSE = -1 ; ELEMENT BEING CREATED BFUP STDELT = -2 ; ELEMENT DELETED BFUP STFWRT = 200 ; FILE HAS ELEMENT BEING CREATED BFUP ; BFUP ; ELEMENT TYPES (BYTE - SIGN BIT USED BY ROSLOAD) BFUP TYOBJ = 0 ; OBJECT ELEMENT BFUP TYLOD = 1 ; LOAD ELE BFUP STDELT = -2 ; ELEMENT DELETED BFUP STFWRT = 200 ; FILE HAS ELEMENT BEING CREATED BFUP ; BFUP ; ELEMENT TYPES (BYTE - SIGN BIT USED BY ROSLOAD) BFUP TYOBJ = 0 ; OBJECT ELEMENT BFUP TYLOD = 1 ; LOAD ELEMENT BFUP TYSYM = 2 ; BNE DKSDER ; YES - SHUT DOWN RTS PC ; ; DECTAPE I/O HERE DT: MOV R1,(R2) ; SET TAPE BLOCK #. MOV #DTLIST,-(SP) ; READ TAPE BLOCK EMT DECTAP ; TST DTERR ; ANY ERRORS BNE DKSTER ; YES - SHUT DOWN RTS PC ; .END d RCOM .PAGE RCOM ; THIS SUBROUTINE, 'SCAN', RETURNS TO THE CALLER THE THE ADDRESS OF, ANDRCOM ; THE NUMBER OF CHARACTERS IN, A SPECIFIED FIELD. ALL REGISTERS ARE RCOM ; RESTORED. RCOM ; RCOM .DEF SCAN ; RCOM .REF PUeMENT BFUP TYSYM = 2 ; SYMBOLIC ELEMENT (UNSPECIFIED) BFUP TYASM = 3 ; ASSEMBLER SYMBOLIC ELEMENT BFUP TYFOR = 4 ; FORTRAN SYMBOLIC ELEMENT BFUP TYDATA = 5 ; DATA ELEMENT BFUP ; BFUP ; DIRECTORY ENTRIES (OFFSETS) BFUP DNAME1f; UPDATE 2 14 MAR 1972 ADD WORD TO I/O LISTS, CLEAN UP ; UPDATE 1 13 MAR 1972 FIX .REFS & .DEFS .TITLE RCMTST RCT ;***********************************************************************RCT ; *RCT ; THIS TASK (#13.) IS USED TO TEST THE FOLLOWING: *RCT ; 1) ROSCOM *RCT ; g; UPDATE 3 16 MAR 1972 ; CLEAN UP ; UPDATE 2 14 MAR 1972 ADD WORD TO I/O LISTS, CLEAN UP ; UPDATE 1 13 MAR 1972 FIX .REFS & .DEFS .TITLE RCMTST RCT ;***********************************************************************RCT ; *RCT ; THIS TASK (#13.) IS USED TO TEST THE FOLLOWING: *RCT ; 1) ROSCOM hSHR,POPR ; RCOM ; RCOM ; SCAN'S STACK LOOKS AS FOLLOWS: RCOM ; RCOM ; FIELD # AT CALL RCOM ; STRING ADD. RCOM ; # CHARACTERS i = 0 ; FIRST TRIAD OF NAME BFUP DNAME2 = 2 ; SECOND TRIAD OF NAME BFUP DSTAT = 4 ; ELEMENT STATUS BFUP DTYPE = 5 ; ELEMENT TYPE BFUP DHOUR = 6 ; TIME OF CREATION BFUP DMIN = 7 ; BFUP DSEC = 8. ; j 2) BFUP VIA ROSCOM. *RCT ; *RCT ; IT ALSO WILL ALLOW DISK FILES TO BE DUMPED TO THE LINE PRINTER *RCT ; ITS IPL ENTRY 'RCIPL' WILL ALSO PLACE THE BFUP FILE DIRECTORY *RCT ; ENTRY IN SLOT #1 OF THE CORE DIRECTORY, 'FILE'. *RCT ; *RCT ; DATE: 4-MAR-72 k *RCT ; 2) BFUP VIA ROSCOM. *RCT ; *RCT ; IT ALSO WILL ALLOW DISK FILES TO BE DUMPED TO THE LINE PRINTER *RCT ; ITS IPL ENTRY 'RCIPL' WILL ALSO PLACE THE BFUP FILE DIRECTORY *RCT ; ENTRY IN SLOT #1 OF THE CORE DIRECTORY, 'FILE'. *RCT ; *RCT l RCOM ; PC FOR RETURN <=SP RCOM ; R5 AFTER PUSHR RCOM ; R4 RCOM ; R3 RCOM ; R2 RCOM ; R1 RCOM ; R0 m BFUP DYEAR = 9. ; DATE OF CREATION BFUP DDAY = 10. ; BFUP DMONTH = 11. ; BFUP DSTSEC = 12. ; FIRST SECTOR (RELATIVE) IN ELEMENT BFUP DLENTH = 14. ; NUMBER OF SECTORS IN ELEMENT BFUP ; BFUP ; COMMUNICATn *RCT ; *RCT ;***********************************************************************RCT .REF FILE,HEADER,TSTAT,TPRTY,TASKS .DEF RCIPL ; R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 CR = 15 LF = 12 BFILE = 200 ; ROS ID FORo; DATE: 4-MAR-72 *RCT ; *RCT ;***********************************************************************RCT .REF FILE,HEADER,TSTAT,TPRTY,TASKS .DEF RCIPL ; R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 CR = 15 LF = 12 p <=SP RCOM ; RCOM ; ERROR CODE READY FOR RETURN RCOM ; # CHAR. IN FIELD RCOM ; ADD. OF FIELD RCOM ; PC FOR RETURN <=SP RCOM ; qION BLOCK (OFFSETS) BFUP BFERR = 0 ; ERROR WORD BFUP BFRFIL = 2 ; ROS FILE ID (THE BFUP FILE) BFUP BFELN1 = 4 ; FIRST TRIAD OF ELEMENT NAME BFUP BFELN2 = 6 ; SECOND TRIAD OF ELEMENT NAME BFUP BFSTAT = 8. ; FOR SYSTEM USE - USUALLY STATUS BFUP BFTYPE = 9. ; ELEMENT TYPE. r BFUP FILE RCTPRT = NPRIOR ; PRIORIITY LEVEL FOR THIS TASK. RCTNUM = 13. ; THIS TASK'S NUMBER .PAGE RCIPL: MOV #RCTNUM,R0 ; GET TASK# CMP R0,#TASMAX ; IS # 7 SYS MAX BLE RCI010 ; NO. HALT ; YES. RCI010: CMP R0,TASKS ; DO WE NEED TO UPDATE TASKS? BLE RCI020 ; NO MOV R0,TASKS ; YES RCI020: CLRB TSTAT(R0) ; CLEAR TASKsBFILE = 200 ; ROS ID FOR BFUP FILE RCTPRT = NPRIOR ; PRIORIITY LEVEL FOR THIS TASK. RCTNUM = 13. ; THIS TASK'S NUMBER .PAGE RCIPL: MOV #RCTNUM,R0 ; GET TASK# CMP R0,#TASMAX ; IS # 7 SYS MAX BLE RCI010 ; NO. HALT ; YES. RCI010: CMP R0,TASKS ; DO WE NEED TO UPDATE TASKS? BLE RCI020 ; NO MOV R0,TASKS ; YES t RCOM SCAN =. ; ENTRY POINT RCOM JSR R5,PUSHR ; SAVE ALL REGISTERS RCOM MOV NTH(SP),R3 ; GET NUMBER OF FIELD TO FIND. RCOM MOV NC(SP),R4 ; GET NUMBER OF CHARACTERS IN STRING RCOM MOV STRING(SP),R5 ; GET BEGINNING STRING ADDRESS RCOM ADD R5,R4 ; COMPUTE ENDING ADDRESS OF STRING. RCOM CLR R1 u BFUP BFSEC = 10. ; FIRST SECTOR IN ELEMENT BFUP BFLNTH = 12. ; LENGTH (IN SECTORS) OF ELEMENT BFUP ; BFUP ; MISCELLANEOUS BFUP DIRMAX = 32. ; # OF SECTORS IN DIRECTORY BFUP $DSKIO = 23 ; EMT # OF DISCIO BFUP $GTIME = 31v'S STATUS MOVB #RCTPRT,TPRTY(R0) ; SET PRIORITY ASL R0 ; MAKE TASK # INTO WORD INDEX MOV #RCHEAD,HEADER(R0); SET HEADERS ADDRESS MOV #1,RCHEAD ; SET THREAD WORD TO 1 FOR USRE. ; MAKE FILE ENTRY FOR BFUP. MOV #FILE,R0 ; GET ADDRESS OF FILE TABLE. MOV #BFILE,(R0)+ ; SET BFUP FILE ID. MOV #100.,(R0)+ ; SET START SECTOR ADDRESS MOV #607,(R0)+ ; SET: NO PROTECwRCI020: CLRB TSTAT(R0) ; CLEAR TASK'S STATUS MOVB #RCTPRT,TPRTY(R0) ; SET PRIORITY ASL R0 ; MAKE TASK # INTO WORD INDEX MOV #RCHEAD,HEADER(R0); SET HEADERS ADDRESS MOV #1,RCHEAD ; SET THREAD WORD TO 1 FOR USRE. ; MAKE FILE ENTRY FOR BFUP. MOV #FILE,R0 ; GET ADDRESS OF FILE TABLE. MOV #BFILE,(R0)+ ; SET BFUP FILE ID. MOV #100.,(R0)+ ; SET START SECTOR ADDRESS x ; CLEAR COMMA COUNTER RCOM MOV R5,R2 ; SAVE PREVIOUS FIELD START ADD. IN R2 RCOM SCAN10: INC R1 ; COUNT FIELD CURRENTLY CHECKING. RCOM CMP R1,R3 ; IS THIS THE FIELD WE WANT? RCOM BEQ SCAN20 ; YES. RCOM MOV R5,R2 ; SAVE PREVIOUS FIELD START ADD. IN R2. RCOM JSR PC,GETCOM ; GET START OF NEXT FIELD. y ; EMT # OF GET TIME BFUP $GDATE = 32 ; EMT # OF GET DATE BFUP DSKSIZ = 64. ; # WORDS IN A DISK SECTOR BFUP WFUN = 3 ; WRITE FUNCTION - DISCIO (WITH WRT CHK)BFUP RFUN = 0 ; READ FUNCTION - DISCIO BFUP BHEAD = 14. ; #BYTES FOR DISCIO IN BUFFER BFUP ; zT, DEVICE #1, CORE ; DIRECTORY, FILE TYPE=7. MOV #2500.,(R0)+ ; SET LENGTH OF FILE IN SECTORS. RTS PC ; RETURN TO IPL. .PAGE ; TASK HEADER RCHEAD: .WORD 1 ; THREAD WORD .WORD START ; ENTRY POINT .WORD 0,0 ; NO INIT OR MAX TIME .BYTE 100. ; STACK SIZE .BYTE RCTPRT ; PRIORITY .WORD 0 ; CURREN{ MOV #607,(R0)+ ; SET: NO PROTECT, DEVICE #1, CORE ; DIRECTORY, FILE TYPE=7. MOV #2500.,(R0)+ ; SET LENGTH OF FILE IN SECTORS. RTS PC ; RETURN TO IPL. .PAGE ; TASK HEADER RCHEAD: .WORD 1 ; THREAD WORD .WORD START ; ENTRY POINT .WORD 0,0 ; NO INIT OR MAX TIME .BYTE 100. ; STACK SIZE .BYTE RCTPRT ; PRIORI|RCOM TST R0 ; COMMA(FIELD) FOUND? RCOM BNE SCAN10 ; YES. GO SEE IF IS ONE WANTED. RCOM CLR FIELD(SP) ; NO. FIELD REQUESTED NON-EXISTANT. RCOM CLR LENTH(SP) ; CLEAR FIELD, LENTH. SET ERROR TO RCOM MOV R1,ERROR(SP) ; # OF EXISTING FIELDS. RCOM BR SCAN30 ; RETURN TO CALLER. RCOM SCAN20: MOV R2,FIELD(SP) ; FO} BFUP ; FOR ENTRY 0 IN SECTOR 0 (OFFSETS) BFUP FID = BHEAD ; ROS FILE ID # BFUP FNDNUM = BHEAD+2 ; # OF NEXT DIRECTORY ENTRY BFUP FSTAT = BHEAD+3 ; FILE'S STATUS BFUP ; 0 - FREE BFUP ; >0 - # READS IN PROGRESS BFUP ~T TIME .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT .ENDC .BYTE 0,RCTNUM ; CPU LEVEL, TASK NUMBER. .WORD 0 ; STACK POINTER .=.+200. ; STACK AREA. ; TTY I/O LIST KBLIST: .WORD 1 ; THREAD WORD .BYTE 0,2 ; TTY, EXIT TYPE2 .WORD 0,0,0 ; NO ERROR, IO COMPLET - LEVEL #0., SYST .WORD 0 ; SYS WORD KBADD:TY .WORD 0 ; CURRENT TIME .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT .ENDC .BYTE 0,RCTNUM ; CPU LEVEL, TASK NUMBER. .WORD 0 ; STACK POINTER .=.+200. ; STACK AREA. ; TTY I/O LIST KBLIST: .WORD 1 ; THREAD WORD .BYTE 0,2 ; TTY, EXIT TYPE2 .WORD 0,0,0 ; NO ERROR, IO COMPLET - LEVEL #0., SYST UND FIELD AFTER. STORE ADD FOR USERRCOM CLR ERROR(SP) ; CLEAR STATUS CODE. RCOM DEC R5 ; SET R5 TO POINT TO LAST CHARACTER OF RCOM SUB R2,R5 ; STRING, THEN SUB BEGINNING ADD TO GET RCOM MOV R5,LENTH(SP) ; LENTH. RETURN TO USER. RCOM SCAN30: JSR R5,POPR ; RESTORE ALL REGISTERS RCOM RTS PC ; RETURN TO CALLER. RCOM ; SIGN BIT SET IFF WRITE IN PROG. BFUP FDIRSC = BHEAD+4 ; SECTOR # TO CONTAIN NEXT DIRECTORY ENTBFUP FNSEC = BHEAD+6 ; SECTOR # FOR NEXT ELEMENT (ITS DATA) BFUP FFLAG1 = BHEAD+12. ; THESE 2 WORDS MUST CONTAIN THE RAD50 BFUP FFLAG2 = BHEAD+14. ; /.BFUP./ AS A FLAG INDICATING THE BFUP ; FILE HAS BEEN INITIALIZED BY BFINIT BFUP .PAGE .WORD 0 ; ADDRESS OF BUFFER. ; ; DISK I/O LIST DKLIST: .WORD 1 ; THREAD WORD .BYTE 1,2 ; DEVICE 1, EXIT TYPE 2 .WORD 0 ; NO IOO COMPLETE .BYTE 0,3 ; NO ERR TASK, LEVEL 3 DKERR: .WORD 0 ; STATUS (0 = OK) .WORD 0 ; SYS WORD .WORD DKDAT ; ADDRESS OF DATA BUFFER. DKDAT: .WORD BFILE ; FILE ID. .BYTE 0 .WORD 0 ; SYS WORD KBADD: .WORD 0 ; ADDRESS OF BUFFER. ; ; DISK I/O LIST DKLIST: .WORD 1 ; THREAD WORD .BYTE 1,2 ; DEVICE 1, EXIT TYPE 2 .WORD 0 ; NO IOO COMPLETE .BYTE 0,3 ; NO ERR TASK, LEVEL 3 DKERR: .WORD 0 ; STATUS (0 = OK) .WORD 0 ; SYS WORD .WORD DKDAT ; ADDRESS OF DATA BUFFER. DKDAT: .WORD BFILE .PAGE RCOM ; THIS SUBROUTINE, 'NUMFLD', IS USED TO RETRIEVE AND CONVERT TO BINARY RCOM ; THE SPECIFIED FIELD. ALL REGISTERS ARE RESTORED. RCOM ; RCOM .DEF NUMFLD ; RCOM .REF SCAN,ASCBIN ; RCOM ; BFUP ; TABLES, LISTS, ETC BFUP ; BFUP BFBUSY: .BYTE 0 ; BFUP BUSY FLAG: =0 NO, =1 YES BFUP .EVEN BFUP ; DISKI/O LIST BFUP DSKLST: .WORD 1 ; THREAD WORD BFUP .BYTE 1 ; USE SPECIFIED SECTOR DKFUN: .BYTE 0 ; FUNCTION .WORD 0,0,0 ; FOR DISEI0 USE DKADD: .WORD 0 ; RELATIVE SECTOR ADDRESS .WORD 64. ; # WORDS TO TRANSFER. .=.+200 ; DISK 64 WORD BUFFER. MES1: .WORD MES1LN .WORD 0 ; RESERVED .BYTE CR,LF ; .ASCII /SELECT THE DESIRED TEST:0=ROSCOM, 1=BFUP/ .ASCII /: / MES1LN =.-MES1-4 ; FILE ID. .BYTE 0 ; USE SPECIFIED SECTOR DKFUN: .BYTE 0 ; FUNCTION .WORD 0,0,0 ; FOR DISEI0 USE DKADD: .WORD 0 ; RELATIVE SECTOR ADDRESS .WORD 64. ; # WORDS TO TRANSFER. .=.+200 ; DISK 64 WORD BUFFER. MES1: .WORD MES1LN .WORD 0 ; RESERVED .BYTE CR,LF ; .ASCII /SELECT THE DESIRED TEST:0=ROSCOM, 1=BFUP/ RCOM ; NUMFLD'S STACK LOOKS THIS WAY: RCOM ; RCOM ; FIELD # AT CALL RCOM ; STRING ADD. RCOM ; # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; ; DEVICE CODE BFUP .BYTE 2 ; EXIT TYPE BFUP .WORD 0 ; NO EXIT ROUTINE BFUP .BYTE 0 ; NO ERROR TASK BFUP .BYTE NDPRT1 ; LOWEST DISK PRIORITY BFUP DSKERR: .WORD 0 ; ERROR WORD BFUP .WORD 0 ; DISCIO USE .EVEN MES2: .WORD 1 ; READ IN ANSWER .WORD 0 ; MES2N: .BYTE 0 ; .EVEN MES3: .WORD MES3LN ; ROSCOM TEST .WORD 0 .BYTE CR,LF .ASCII /ROSCOM TEST - ENTER STRING TO BE PARSED/ .ASCII /: / MES3LN =.-MES3-4 .EVEN MES4: .WORD MES4LN,0 ; REQUEST FIELD # AND CONVERSION .BYTE CR,LF .ASCII /ENTRY CONVERSION & FIELD #/ .BYTE CR .ASCII /: / MES1LN =.-MES1-4 .EVEN MES2: .WORD 1 ; READ IN ANSWER .WORD 0 ; MES2N: .BYTE 0 ; .EVEN MES3: .WORD MES3LN ; ROSCOM TEST .WORD 0 .BYTE CR,LF .ASCII /ROSCOM TEST - ENTER STRING TO BE PARSED/ .ASCII /: / MES3LN =.-MES3-4 .EVEN MES4: .WORD MES4LN,0 ; REQUEST FIELD # AND CONVERSION .BYTE CR,LF .ASCII /ENT FIELD # AT CALL RCOM ; STRING ADD. OF SCAN RCOM ; # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; RCOM ; FIELD # ON RETURN RCOM ; STRING ADD. FROM SCAN BFUP DSKADD: .WORD 0 ; ADDRESS OF BUFFER FOR TRANSFER BFUP ; BFUP ; DISK BUFFER FOR SECTOR 0 (ALWAYS) BFUP ZBUF: .WORD 0 ; ROS FILE ID BFUP .BYTE 0 ; USE SPECIFIED SECTOR BFUP ZFUN: .BYTE 0 ; TRANSFER FUNCTION BFUP .WORD 0,0,0 ; RE,LF .ASCII /(X, P, N,12, OR S,49): / MES4LN =.-MES4-4 .EVEN MES5: .WORD MES5LN,0 ; NO EXISTENT FIELD .BYTE CR,LF .ASCII /REQUESTED FIELD IS NON-EXISTANT/ MES5LN =.-MES5-4 .EVEN MES6: .WORD MES6LN,0 ; NON-NUMERIC FIELD .BYTE CR,LF .ASCII /NUMERIC CONVERSION REQUESTED OF NON-NUMERIC FIELD/ MES6LN =.-MES6-4 .EVEN MES7: .WORD MES7LN,0 ; .BYTE CR,LF .ASCIIRY CONVERSION & FIELD #/ .BYTE CR .ASCII /(X, P, E, N,12, OR S,49): / MES4LN =.-MES4-4 .EVEN MES5: .WORD MES5LN,0 ; NO EXISTENT FIELD .BYTE CR,LF .ASCII /REQUESTED FIELD IS NON-EXISTANT/ MES5LN =.-MES5-4 .EVEN MES6: .WORD MES6LN,0 ; NON-NUMERIC FIELD .BYTE CR,LF .ASCII /NUMERIC CONVERSION REQUESTED OF NON-NUMERIC FIELD/ MES6LN =.-MES6-4 .EVEN MES7: .WORD MES7LN,0 RCOM ; # CHARACTERS RCOM ; PC FOR RETURN RCOM ; ERROR FROM SCAN RCOM ; # CHAR. IN FIELD RCOM ; ADD. OF FIELD <=SP RCOM ; RCOM ; 0 SERVED FOR DISCIO USE BFUP ZSEC: .WORD 0 ; SECTOR 0 - ALWAYS BFUP .WORD DSKSIZ ; # WORDS TO TRANSFER - 1 SECTOR BFUP .=.+DSKSIZ+DSKSIZ ; RESERVE THE BUFFER BFUP ZBFEND =.-2 ; ADDRESS OF LAST CELL IN ZBUF BFUP ; BFUP ; DISK BUFFER FOR ALL OTHER SECTORS BFUP /THE NUMERIC VALUE IS: / MES7FD: .WORD 0,0,0 MES7LN =.-MES7-4 .EVEN MES8: .WORD MES8LN,0 ; .BYTE CR,LF .ASCII /THE REQUESTED FIELD IS:/ .BYTE CR,CR,LF MES8LN =.-MES8-4 STRNG2: .=.+72. .EVEN MES9: .WORD 72.,0 ; GET A STRING STRING: .=.+72. MES10: .WORD 6,0 ; ROSCOM TEST WANTED .BYTE CR,LF MES10N: .ASCII /C,NN/ .EVEN MES11: .WORD MES11L,0 ; VOID FIELD ; .BYTE CR,LF .ASCII /THE NUMERIC VALUE IS: / MES7FD: .WORD 0,0,0 MES7LN =.-MES7-4 .EVEN MES8: .WORD MES8LN,0 ; .BYTE CR,LF .ASCII /THE REQUESTED FIELD IS:/ .BYTE CR,CR,LF MES8LN =.-MES8-4 STRNG2: .=.+72. .EVEN MES9: .WORD 72.,0 ; GET A STRING STRING: .=.+72. MES10: .WORD 6,0 ; ROSCOM TEST WANTED MES10N: .ASCII /C,NN/ .EVEN MES11: .WORD MES11L,0 ; VO FOR ASCBIN CONVERSION RCOM ; STRING ADD. RCOM ; # CHARACTERS RCOM ; PC FOR RETURN RCOM ; ERROR FROM SCAN RCOM ; # CHAR. IN FIELD RCOM ; ADD. OF FIELD ABUF: .WORD 0 ; ROS FILE ID BFUP .BYTE 0 ; USE SPECIFIED SECTOR BFUP AFUN: .BYTE 0 ; TRANSFER FUNCTION BFUP .WORD 0,0,0 ; RESERVED FOR DISCIO USE BFUP ASEC: .WORD 0 ; SECTOR # OF TRANSFER BFUP .WORD DSKSIZ ; # WORDS TO TRANSFER - 1 SECTOR BFUP .=.+DSKSIZ+DSKSIZ ; RESERVE .BYTE CR,LF .ASCII /REQUESTED FIELD IS VOID/ MES11L =.-MES11-4 .EVEN MES12: .WORD MES12L,0 ; # FIELDS .BYTE CR,LF .ASCII /# FIELDS: / MES12N: .ASCII /XXXXXX/ MES12L =.-MES12-4 .PAGE ; HERE TO DETERMINE WHICH TEST START: MOV #MES1,KBADD JSR PC,TYPEO MOV #MES2,KBADD JSR PC,TYPEI MOVB MES2N,R0 ; GET CHARACTER SUB #60,R0 ; STRIP OFF ASCII ID FIELD .BYTE CR,LF .ASCII /REQUESTED FIELD IS VOID/ MES11L =.-MES11-4 .EVEN MES12: .WORD MES12L,0 ; # FIELDS .BYTE CR,LF .ASCII /# FIELDS: / MES12N: .ASCII /XXXXXX/ MES12L =.-MES12-4 .PAGE ; HERE TO DETERMINE WHICH TEST START: MOV #MES1,KBADD JSR PC,TYPEO MOV #MES2,KBADD JSR PC,TYPEI MOVB MES2N,R0 ; GET CHARACTER SUB #60,R0 ; STRIP OF RCOM ; R0 RCOM ; R1 RCOM ; R2 RCOM ; PS RCOM ; ADD. OF STRING (WRD1) STATUS ON RETURN RCOM ; PC FOR RETURN <=SP VALUE ON RETURN RCOM ; NOTTHE BUFFER BFUP ABFEND =.-2 ; ADDRESS OF LAST CELL IN ABUF. BFUP .PAGE ; BFUP ;***********************************************************************BFUP ; *BFUP ; BFINIT IS USED TO INITIALIZE A ROS FILE INTO A BFUP FILE. *BFUP ; THIS IS DONE BY INITIALIZING THE DIRECTORY AND ENTRY 0 IN IT. *BFUP ; THE BLT START CMP R0,#2 BGE START ASL R0 JMP @TAB(R0) TAB: .WORD TEST1 ; ROSCOM TEST .WORD START ; BFUP TEST .PAGE ; HERE TO TEST ROSCOM TEST1: MOV #MES3,KBADD JSR PC,TYPEO MOV #MES9,KBADD ; GET STRING JSR PC,TYPEI TEST1A: MOV #MES4,KBADD ; TYPE OF TEST JSR PC,TYPEO MOV #MES10,KBADD ; GET ANS. JSR PC,TF ASCII BLT START CMP R0,#2 BGE START ASL R0 JMP @TAB(R0) TAB: .WORD TEST1 ; ROSCOM TEST .WORD START ; BFUP TEST .PAGE ; HERE TO TEST ROSCOM TEST1: MOV #MES3,KBADD JSR PC,TYPEO MOV #MES9,KBADD ; GET STRING JSR PC,TYPEI TEST1A: MOV #MES4,KBADD ; TYPE OF TEST JSR PC,TYPEO MOV #MES10,KBADD ; GET ANS. E: ASCBIN MOVES PC DOWN ONE AND SAVES R0-R5 ON RCOM ; STACK. RCOM ; RCOM ; ERROR CODE FOR RETURN RCOM ; VALUE RCOM ; PC FOR RETURN <=SP RCOM ; PROCEEDURE IS: *BFUP ; 1) READ SECTOR 0 *BFUP ; 2) IF NOT A BFUP FILE, ZERO SECTORS 1 - 33 *BFUP ; 3) IF A BFUP FILE ONLY ZERO SECTORS IF STATUS BYTE OF COM *BFUP ; BLOCK IS ONE. IF THE STATUS = 0, RETURN TO THE CALLER. *BFUP ; 4) BUILD ENTRY ZERO *BFUP ; YPEI MOV #MES10N,R0 MOVB (R0),R1 ; GET FIRST CHARACTER CMP #'X,R1 ; RESTART BEQ START CMP #'P,R1 ; 4OW MAY FIELDS BEQ TEST1P ADD MES10+2,R0 ; BUMP R0 TO ADD. OF LAST CHAR.+1 MOVB -(R0),R2 ; GET LAST CHARACTER MOVB (R0),R3 ; GET PENULTIMATE CHARACTER SUB #60,R2 ; COVER LAST - STRIP OFF ASCII CMP R3,#', JSR PC,TYPEI MOV #MES10N,R0 MOVB (R0),R1 ; GET FIRST CHARACTER CMP #'E,R1 ; EXIT TO ROS BEQ TEXIT CMP #'X,R1 ; RESTART BEQ START CMP #'P,R1 ; 4OW MAY FIELDS BEQ TEST1P ADD MES10+2,R0 ; BUMP R0 TO ADD. OF LAST CHAR.+1 MOVB -(R0),R2 ; GET LAST CHARACTER MOVB -(R0),R3 ; GET PENULTIMATE CHARACTER RCOM NUMFLD =. ; ENTRY POINT RCOM MOV NTH-CSAVE(SP),-(SP) ; PUT FIELD # ON STACK FOR SCAN.RCOM MOV STRING-CSAVE+2(SP),-(SP); PUT STRING ADD ON STACK. RCOM MOV NC-CSAVE+4(SP),-(SP) ; PUT # CHAR ON STACK. RCOM JSR PC,SCAN ; FIND NTH FIELD. RCOM CLR VALUE-CSAVE+6(SP) ; CLEAR VALUE. RCOM TST ERROR-CS *BFUP ; THE FOLLOWING SUBROUTINES ARE USED: PUSHR, POPR, FILECK *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFINIT ; BFUP BFINIT =. ; ENTRY POINT BFUP JSR ; IS PEN. # ',' BEQ TEST1B ; YES-ONLY 1 CHAN SUB #60,R3 ; NO. ASSUME #. STRIP OFF ASCII MOV R3,R4 ; MULTIPLY BY 10. ASL R4 ; R4 = 2* R3 ASL R4 ; R4 = 4* R3 ADD R4,R3 ; R3 = 5* R3 ASL R3 ; R3 = 10*R3 ADD R3,R2 ; R2 = FIELD # - R1 = CONVERSION CODE TEST1B: ; WHICH CONVERSION CMP SUB #60,R2 ; COVER LAST - STRIP OFF ASCII CMP R3,#', ; IS PEN. # ',' BEQ TEST1B ; YES-ONLY 1 CHAN SUB #60,R3 ; NO. ASSUME #. STRIP OFF ASCII MOV R3,R4 ; MULTIPLY BY 10. ASL R4 ; R4 = 2* R3 ASL R4 ; R4 = 4* R3 ADD R4,R3 ; R3 = 5* R3 ASL R3 ; R3 = 10*R3 ADD R3,R2 ; R2 = FIELD #AVE-2(SP) ; REQUEST COMPLETED? RCOM BEQ NUMA10 ; YES RCOM MOV ERROR-CSAVE-2(SP),ERROR-CSAVE+6(SP) ; NO RCOM NUMA05: ADD #6,SP ; SET ERROR, ADJUST SP, AND RETURN RCOM BR NPRF20 ; BUMPS PC UP 1 ON STACK RCOM ; RCOM NUMA10 =. ; HERE IF NO ERROR. R5,PUSHR ; SAVE ALL REGISTERS BFUP MOV 14.(SP),R5 ; GET ADDRESS OF COM BLOCK INTO R5 BFUP JSR PC,FILECK ; GO MAKE SURE WE HAVE A FILE BFUP BNE INIT10 ; NOT A ROS/BFUP FILE BFUP TSTB BFSTAT(R5) ; IS REINITIALZATION REQUESTED BFUP BEQ INIT99 ; NO. - ALL DONE BFUP INIT10: ; HERE TO ZERO SECTORS #'N,R1 ; NUMERIC CONVERSION BEQ TEST1N CMP #'S,R1 ; STRING CONVERSION BNE TEST1A ; HERE FOR STRINGS MOV R2,-(SP) ; FIELD # MOV #STRING,-(SP) ; STRING ADD. MOV STRING-2,-(SP) ; # CHARS EMT 27. ; SCAN MOV (SP)+,R5 ; FIELD BEG. ADD. MOV (SP)+,R4 ; # OF CHARS. MOV (SP)+,R0 ; ERROR STATUS BEQ TEST1E - R1 = CONVERSION CODE TEST1B: ; WHICH CONVERSION CMP #'N,R1 ; NUMERIC CONVERSION BEQ TEST1N CMP #'S,R1 ; STRING CONVERSION BNE TEST1A ; HERE FOR STRINGS MOV R2,-(SP) ; FIELD # MOV #STRING,-(SP) ; STRING ADD. MOV STRING-2,-(SP) ; # CHARS EMT 27. ; SCAN MOV (SP)+,R5 ; FIELD BEG. ADD. MOV (SP)+,R4 RCOM TST FIELD-CSAVE-2(SP) ; IS THIS A VOID FIELD? RCOM BNE NUMA15 ; NO. RCOM MOV #-2,ERROR-CSAVE+6(SP) ; SET ERROR -2 (VOID FIELD). RCOM BR NUMA05 ; ADJUST SP. RCOM ; RETURN TO CALLER (BUMPS PC ON STACK). RCOM ; RCOM ; HERE IF MUST CONVERT. NOT R 32 - 1 BFUP ; FIRST BUILD A BUFFER OF ZEROS. BFUP MOV #ZBFEND+2,R1 ; ADDRESS OF LAST WORD +2 TO ZERO. BFUP INIT20: CLR -(R1) ; ZERO THE BUFFER BFUP CMP #ZBUF+BHEAD,R1 ; DONE YET? BFUP BLO INIT20 ; NO. BFUP MOV #ZBUF,DSKADD ; YES - NOW LET'S ZERO THE DISK. BFUP MOVB #W ; NO ERROR TEST1D: MOV #MES5,KBADD ; ERROR JSR PC,TYPEO BR TEST1A ; NEXT TEST1E: TST R4 BNE TEST1G TEST1F: MOV #MES11,KBADD ; VOID FIELD JSR PC,TYPEO BR TEST1A ; NEXT TEST1G: MOV #STRNG2,R3 ; PUT STRING INTO OUTPUT BUFFER MOV #MES8,R0 ; GET ADDRESS OF FIRST WORD IN BUFFER MOV R4,(R0) ; SET VAR. SIZE OF MESS. IN BYTE COUNT ADD ; # OF CHARS. MOV (SP)+,R0 ; ERROR STATUS BEQ TEST1E ; NO ERROR TEST1D: MOV #MES5,KBADD ; ERROR JSR PC,TYPEO BR TEST1A ; NEXT TEST1E: TST R4 BNE TEST1G TEST1F: MOV #MES11,KBADD ; VOID FIELD JSR PC,TYPEO BR TEST1A ; NEXT TEST1G: MOV #STRNG2,R3 ; PUT STRING INTO OUTPUT BUFFER MOV #MES8,R0 ; GET ADDRESS OF FIRST WORD IN BUFFEE-ENTRANT, THEREFORE USE LEVEL 7. RCOM ; RCOM NUMA15 =. ; RCOM NUMSAV: MOV R0,-(SP) ; SAVE NEED GENERAL REGISTERS. RCOM MOV R1,-(SP) ; RCOM MOV R2,-(SP) ; RCOM NSAVE =.-NUMSAV ; COMPUTE NUMBER SAVED REGISTERS IN NUM FUN,ZFUN ; SET DISK FUNCTION BFUP MOV #DIRMAX,ZSEC ; SET SECTOR TO TRANSFER -BEGIN WITH 32BFUP INIT30: JSR PC,DISKBF ; GO ZERO A SECTOR BFUP BEQ INIT50 ; NO DISC I/O ERRORS. BFUP CMP #9.,DSKERR ; FILE FULL? BFUP BEQ INIT97 ; YES BFUP BR INIT98 ; ALL OTHER ERRORS. #MES8LN,(R0) ; ADD FIXED SIZE MOV (R0),KBADD ; SET ADDRESS IN TTY I/O LIST TEST1H: MOVB (R5)+,(R3)+ ; TRANSFERR STRING BYTE BY BYTE DEC R4 BNE TEST1H ; MORE TO COME WITH JOHNNY JSR PC,TYPEO BR TEST1A .PAGE ; HERE FOR NUMERIC FIELDS TEST1N: MOV R2,-(SP) ; FIELD # MOV #STRING,-(SP) ; STRING ADD MOV STRING-2, -(SP) ; # CHAR IN STRING EMT 28. R MOV R4,(R0) ; SET VAR. SIZE OF MESS. IN BYTE COUNT ADD #MES8LN,(R0) ; ADD FIXED SIZE MOV (R0),KBADD ; SET ADDRESS IN TTY I/O LIST TEST1H: MOVB (R5)+,(R3)+ ; TRANSFERR STRING BYTE BY BYTE DEC R4 BNE TEST1H ; MORE TO COME WITH JOHNNY JSR PC,TYPEO BR TEST1A TEXIT: EMT 4 ; EXIT TO ROS .PAGE ; HERE FOR NUMERIC FIELDS TEST1N: MOV R2,-(SP) RCOM MOVB @#PS,-(SP) ; AND PS RCOM MOVB #340,-(SP) ; LOCKOUT ALL INTERRUPTS. RCOM MOV #WRD1,R0 ; CLEAR SIX BYTES FOR ASCBIN RCOM CLR (R0)+ ; RCOM CLR (R0)+ ; RCOM CLR (R0)+ ; LEAVE R0 POINTING AT WRD3, BYT0 RCOM TST (R0)+ ; BU BFUP INIT50: DEC ZSEC ; DECREMENT SECTOR COUNT BFUP BGT INIT30 ; GO ZERO NEW SECTOR IF NOT #0. BFUP BLT INIT99 ; HAVE NOW DONE #0, GO HOME BFUP MOV #ZBUF+BHEAD,R2 ; HERE TO SETUP ENTRY ZERO IN SECTOR 0. BFUP ; R2 HAS ADDRESS OF FIRST WORD. BFUP MOV BFRFIL(R5),(R2)+; SETUP ENTRY 0. FIRST PUT FILE ID IN ITBFUP MOV #1,(R2)+ ; NUMPAR MOV (SP)+,R5 ; VALUE MOV (SP)+,R4 ; STATUS BGT TEST1D BEQ TEST1O ; OK (=0) INC R4 BLT TEST1F ; VOID (=-2) MOV #MES6,KBADD ; NON-NUMERIC JSR PC,TYPEO JMP TEST1A TEST1O: MOV R5,-(SP) ; RE-CONVERT MOV #MES7FD,-(SP) EMT 16 ; BINASC MOV #MES7,KBADD JSR ; FIELD # MOV #STRING,-(SP) ; STRING ADD MOV STRING-2, -(SP) ; # CHAR IN STRING EMT 28. ; NUMPAR MOV (SP)+,R5 ; VALUE MOV (SP)+,R4 ; STATUS BGT TEST1D BEQ TEST1O ; OK (=0) INC R4 BLT TEST1F ; VOID (=-2) MOV #MES6,KBADD ; NON-NUMERIC JSR PC,TYPEO JMP TEST1A TEST1O: MOV R5,-(SP)MP TO BYTE 1+1. RCOM MOV FIELD-CSAVE+NSAVE+2(SP),R1 ; GET ADD OF FIRST CHAR.RCOM MOV LENTH-CSAVE+NSAVE+2(SP),R2 ; GET # OF CHAR IN FIELDRCOM ADD R2,R1 ; SET R2 TO CONTAINT THE NUMBER OF RCOM ; CHARACTERS IN THE FIELD. RCOM NUMA20: MOVB -(R1),-(R0) ; MOVE A CHARACTER INTO FIELD RCOM DEC R2 ; COUNT THE CHARACTER RCOM ; THEN SET # OF NEXT DIRECTORY ENTRY. BFUP ; AND FILE'S STATUS (0). THE SECTOR OF BFUP CLR (R2)+ ; DIRECTORY ENTRY IS ZERO. BFUP MOV #DIRMAX,(R2)+ ; SECTOR # OF NEXT ELEMENT. BFUP CMP (R2)+,(R2)+ ; SKIP 2 UNUSED WORDS - THEY ARE ZERO. BFUP MOV (PC)+,(R2)+ ; SET TWO WORD FLAG INDICATING FILE IS BFUP .RAD50 /.BF/ ; SET UP FOR BFUP. PC,TYPEO JMP TEST1A .PAGE ; HERE FOR # OF FIELDS TEST1P: MOV #STRING,-(SP) ; STRING ADD MOV STRING-2,-(SP) ; # CHAR EMT 29. ; NPARAN MOV #MES12N,-(SP) ; VALUE ON STACK - PUT ADD ON EMT 14. MOV #MES12,KBADD JSR PC,TYPEO BR TEST1A .PAGE TYPEO: MOV #KBLIST,-(SP) ; TTY I/O LIST EMT 11. RTS PC TYPEI: MOV #KBLIST,-(SP) ; RE-CONVERT MOV #MES7FD,-(SP) EMT 16 ; BINASC MOV #MES7,KBADD JSR PC,TYPEO JMP TEST1A .PAGE ; HERE FOR # OF FIELDS TEST1P: MOV #STRING,-(SP) ; STRING ADD MOV STRING-2,-(SP) ; # CHAR EMT 29. ; NPARAN MOV #MES12N,-(SP) ; VALUE ON STACK - PUT ADD ON EMT 14. MOV #MES12,KBADD JSR PC,TYPEO JMP TEST1A BNE NUMA20 ; MORE TO GO? IF SO, GOOD DO IT. RCOM MOV R0,-(SP) ; DONE. PUT ADDRESS OF STRING ON STACK RCOM JSR PC,ASCBIN ; GO CONVERT IT. RCOM MOV (SP)+,VALUE-CSAVE+6+NSAVE+4(SP) ; PUT VALUE ON STACK RCOM TST (SP)+ ; COMPLETED? RCOM BEQ NUMA40 ; YES RCOM DEC ERROR-CSAVE+6+NSAVE+2(SP); BFUP MOV (PC)+,(R2)+ ; BFUP .RAD50 /UP./ ; BFUP BR INIT30 ; GO WRITE SECTOR ZERO OUT. BFUP INIT97: JMP BFER07 ; TO FAR FOR BRANCHES BFUP INIT98: JMP BFERDK ; BFUP INIT99: JMP ENDBF ; BFUP .PAGE EMT 12. RTS PC .PAGE .END ; GO BACK FOR MORE .PAGE TYPEO: MOV #KBLIST,-(SP) ; TTY I/O LIST EMT 11. RTS PC TYPEI: MOV #KBLIST,-(SP) EMT 12. RTS PC .PAGE .END NO. SET ERR TO-1(ALREADY 0). RCOM NUMA40: MOVB (SP)+,@#PS ; ALLOW INTERRUPTS. RCOM MOV (SP)+,R2 ; RESTORE REGISTERS RCOM MOV (SP)+,R1 ; RCOM MOV (SP)+,R0 ; RCOM BR NPRF20 ; GO BACK AFTER BUMPING PC ON STACK. RCOM WRD1: .WORD 0,0,0 ; 6 BYTE AREA FOR ASCBIN RCOM ; BFUP ;***********************************************************************BFUP ; *BFUP ; BFENTR PROVIDES THE USER WITH THE MEANS TO MAKE A NEW ENTRY IN A *BFUP ; BFUP FILES DIRECTORY AND AT THE SAME TIME OPENING THE NEW ELEMENT *BFUP ; AND FILE FOR INPUT FROM THE USERS PROGRAM. *BFUP ; *; PSTP .TITLE PSTRAP ; PSTP ;***********************************************************************PSTP ; P S T R A P *PSTP ; *PSTP ; PROGRAM IDENTIFICATION: PSTRAP *PSTP ; ; UPDATE 1 16 MAR 1972 FIX ERROR MESSAGE .TITLE PSTRAP ; PSTP ;***********************************************************************PSTP ; P S T R A P *PSTP ; *PSTP ; PROGRAM IDENTIFICATION: PSTRAP *PSTP ; .PAGE RCOM ; THIS SUBROUTINE, 'GETCOM', IS USED BY SEVERAL OF THE ROS COMMAND RCOM ; STRING PARSING ROUTINES. ON ENTRY IT EXPECTS THAT R5 CONTAIN THE RCOM ; ADDRESS OF THE NEXT CHARACTER TO BE PROCESSED. R4 CONTAINS THE RCOM ; ADDRESS OF THE END OF THE COMMAND STRING. R0 IS CLEARED. RCOM ; GETCOM BEGINS SCAN WITH THE CHARACTER POINTED TO BY R5 AND CONTINUES RCOM ; SEARCHING UNTIL THE NEXT COMMA IS FOUND. WHENBFUP ; THE BFUP COMMUNICATIONS BLOCK SPECIFIES THE ELEMENT NAME, TYPE, *BFUP ; STATUS, AND ROS FILE ID. THE STATING SETOR IS RETURNED IN THE BLOCK *BFUP ; FOR THE USER'S I/O. *BFUP ; *BFUP ; BFENTR MARKS THE FILE AND ELEMENT AS OPEN FOR INPUT. *BFUP ; *BFUP ; SUBROUTINES USED ARE: PUSHR,POPR, *PSTP ; PURPOSE: PROVIDES HANDLING OF THE UNUSED PROCESSOR TRAPS: *PSTP ; BUS ERROR TRAP ( 4) *PSTP ; RESERVED INSTRUCTION TRAP (10) *PSTP ; TRACE TRAP (20) *PSTP ; *PSTP ; USAGE: WHEN ONE OF THE UNUSED TRAPS IS ACTIVATED, CONTROL *PSTP ; *PSTP ; PURPOSE: PROVIDES HANDLING OF THE UNUSED PROCESSOR TRAPS: *PSTP ; BUS ERROR TRAP ( 4) *PSTP ; RESERVED INSTRUCTION TRAP (10) *PSTP ; TRACE TRAP (20) *PSTP ; *PSTP ; USAGE: WHEN ONE OF THE UNUSED TRAPS IS ACTIVATED, CONTROL *PSTP ; IS PASSED TO TH THE COMMA IS FOUND, R0 RCOM ; IS INCREMENTED, AND R5 IS BUMPED TO POINT TO THE NEXT CHARACTER(WHICH RCOM ; MAY NOT EXIST). RCOM ; IF A COMMA IS NOT FOUND, THE SEARCH IS HALTED AT THE END OF THE RCOM ; COMMAD STRING. RCOM ; THE STACK IS NOT USED. RCOM ; RCOM GETCOM =.  FILECK *BFUP ; ALL REGISTERS ARE RESTORED *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFENTR ; BFUP BFENTR =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE ALL REGISTERS BFUP IS PASSED TO THE ENTRY POINT 'PSTRAP' WHERE THE ERROR *PSTP ; IS PROCESSED. THE TRANSFER IS ACCOMPOLISHED BY *PSTP ; PLACING 'PSTRAP'S' ADDRESS IN THE TRAP AT SYSTEM *PSTP ; INITALIZATION VIA THE ENTRY POINT 'PSTIPL'. THE *PSTP ; LINKAGE IS: *PSTP ; *PSTP ; PSTIPL - JSR PC,PSTIPL E ENTRY POINT 'PSTRAP' WHERE THE ERROR *PSTP ; IS PROCESSED. THE TRANSFER IS ACCOMPOLISHED BY *PSTP ; PLACING 'PSTRAP'S' ADDRESS IN THE TRAP AT SYSTEM *PSTP ; INITALIZATION VIA THE ENTRY POINT 'PSTIPL'. THE *PSTP ; LINKAGE IS: *PSTP ; *PSTP ; PSTIPL - JSR PC,PSTIPL *PS ; ENTRY POINT RCOM CLR R0 ; CLEAR FLAG TO COMMA NOT FOUND. RCOM GETC10: CMPB (R5)+,#054 ; IS THIS CHARACTER A COMMA& RCOM BEQ GETC20 ; YES. RCOM CMP R5,R4 ; NO. END OF STRING? RCOM BLO GETC10 ; NO. TRY AGAIN. RCOM BR GETC30 ; YES. RETURN. ; UPDATE 2 4 APR 1972 FIX SCAN,NUMFLD,GETCOM ; UPDATE 1 14 MAR 1972 CLEAN UP ;***********************************************************************RCOM ; R O S C O M *RCOM ; *RCOM ; PROGRAM IDENTIFICATION: ROSCOM - CENTRALIZED ROS COMMAND STRING*RCOM ; PARSING. *RCOM ; *PSTP ; *PSTP ; PSTRAP - TRAP VIA LOCATION 4, 10, OR 20. *PSTP ; *PSTP ; PSTP ; THE SYSGEN PARAMETER '$PST' IS USED TO CONTROL ROS HANDLING OF PSTP ; A PROCESSOR TRAP VIA EITHER AN ERROR TRAP(4 & 10) OR AN UNUSED PSTP ; TRAPTP ; *PSTP ; PSTRAP - TRAP VIA LOCATION 4, 10, OR 20. *PSTP ; *PSTP ; PSTP ; THE SYSGEN PARAMETER '$PST' IS USED TO CONTROL ROS HANDLING OF PSTP ; A PROCESSOR TRAP VIA EITHER AN ERROR TRAP(4 & 10) OR AN UNUSED PSTP ; TRAP(20). RCOM GETC20: INC R0 ; SET FLAG TO FOUND. RCOM RTS PC ; RETURN TO CALLER. RCOM GETC30: RTS PC ; RETURN TO CALLER RCOM .END ; RCOM *RCOM ; PURPOSE: ROSCOM, BY PROVIDING A COMMON, CENTRALIZED HANDLING OF*RCOM ; ALL ROS COMMAND STRING PARSING, GIVES A STANDARD, *RCOM ; CONSISTENT SYNTAX AND NON-REDUNDENCY IN CODE. *RCOM ; *RCOM ; METHOD: THE METHOD USED IS MODULAR. THE USER PERFORMS ALL *RCOM ; REQUIRED I/O. ROSCOM ENTRY POINTS PROVIDE THE (20). PSTP ; IT IS ONLY EVALUATED IF THE TRAP OCCURES FROM A TASK. IN THAT PSTP ; CASE, IF $PST=1, A JSR PC,UPST WILL BE EXECUTED. NO OTHER PSTP ; ACTION WILL BE TAKEN. IF $DST=0, THE STANDARD ROS PROCEEDURE PSTP ; WILL BE FOLLOWED. IF $PST=-1, THE STANDARD ROS PROCEEDURE WILL PSTP ; BE FOLLOWED AFTER WHICH, A JSR PC,UPST WILL BE EXECUTED. PSTP ; THE PS WILL BE AT THE LEVEL PRIOR TO THE TRAP PSTP ; IT IS ONLY EVALUATED IF THE TRAP OCCURES FROM A TASK. IN THAT PSTP ; CASE, IF $PST=1, A JSR PC,UPST WILL BE EXECUTED. NO OTHER PSTP ; ACTION WILL BE TAKEN. IF $DST=0, THE STANDARD ROS PROCEEDURE PSTP ; WILL BE FOLLOWED. IF $PST=-1, THE STANDARD ROS PROCEEDURE WILL PSTP ; BE FOLLOWED AFTER WHICH, A JSR PC,UPST WILL BE EXECUTED. PSTP ; THE PS WILL BE AT THE LEVEL PRIOR TO THE TRAP WHEN THE JSR PSTP ; ; UPDATE 1 21 MAR 1972 ADDRESS IN D+SKTTTAPE ;*********************************************************************** ; * ; THIS MODULE CONTAINS TO UTILITY TASKS: * ; 1. #14.-REBOOT DOS * ; 2. #15.-ROS/DDS DIST TO DECTAPE/DECTAPE TO DISK * ; * ;********* *RCOM ; FOLLOWING SERVICES: *RCOM ; 1) DETERMINE THE NUMBER OF FIELDS IN A STRING. *RCOM ; 2) RETURN THE ADDRESS OF A SPECIFIED FIELD AND *RCOM ; ITS LENTH. *RCOM ; 3) RETURN VALUE OF A SPECIFIED NUMERIC FIELD. *RCOM ; *RCOM ; THESE FUNCTWHEN THE JSR PSTP ; IS EXECUTED. PSTP ; *PSTP ; PROGRAMMER: 53 *PSTP ; VERSION: 0 *PSTP ; CATALOGUE NUMBER: *PSTP ; *PSTP ;***************** IS EXECUTED. PSTP ; *PSTP ; PROGRAMMER: 53 *PSTP ; VERSION: 0 *PSTP ; CATALOGUE NUMBER: *PSTP ; *PSTP ;********************************************************************************************************* .TITLE UTIL .REF UTLIPL .DEF HEADER,TSTAT,TPRTY,TASKS .DEF COMPID ; TO DUMP DISK ; ; PARAMETERS MAXSEC = 8191. ; HIGHEST SECTOR TO BE SAVED BUFSIZ = 256. ; # WORDS IN BUFFER (/ DECTAPE BLOCK) STSIZE = 100 ; # WORDS IN STACKS EXIT = 4 TTYOUT = 13 TTYIN = 14 DECTAP = 15 DISCIO = 23 LF IONS ARE PROVIDED BY THESE ROUTINES: *RCOM ; 1) NPARAM (EMT #29) *RCOM ; 2) SCAN (EMT #27) *RCOM ; 3) NUMFLD (EMT #28) *RCOM ; *RCOM ; USAGE: THE LINKAGE TO EACH ROUTINE IS: *RCOM ; ******************************************************PSTP .PAGE PSTP .DEF PSTIPL ; PSTP ; PSTP PSTIPL =. ; INITLAZATION ENTRY POINT PSTP MOV #PSTRAP,R0 ; GET ADDRESS OF TRAP HANDLER. PSTP MOV #4,R2 ; GET ADDRESS OF FIRST TRAP ****************************PSTP .PAGE PSTP .DEF PSTIPL ; PSTP ; PSTP PSTIPL =. ; INITLAZATION ENTRY POINT PSTP MOV #PSTRAP,R0 ; GET ADDRESS OF TRAP HANDLER. PSTP MOV #4,R2 ; GET ADDRESS OF FIRST TRAP PSTP = 12 ; AN ASCII LF CR = 15 ; AN ASCII CR ; UTLIPL: MOV #15.,R0 ; INITALIZE TASK HEADERS UTPL10: CMP R0,#TASMAX ; BLE UTPL20 ; HALT ; UTPL20: CMP R0,TASKS ; BLE UTPL30 ; MOV R0,TASKS ; UTPL30: CLRB TSTAT(R0) ; MOVB #1,TPRTY(R0) ; DEC R0 ; CLRB TSTAT(R0) *RCOM ; NPARAM: *RCOM ; MOV #STRING,-(SP) ; ADDRESS OF FIRST CHARACTER. *RCOM ; MOV NC,-(SP) ; NUMBER OF CHARACTERS. *RCOM ; EMT 29 ; NPARAM *RCOM ; MOV (SP)+,NUM ; GET NUMBER OF FIELDS. *RCOM ; *RCOM ; SCAN: PSTP MOV #340,R3 ; PUT BASIC CPU LEVEL IN R3 PSTP PSTI10: MOV R0,(R2)+ ; SET ADDRES FOR TRANSFER PSTP INC R3 ; INC CPU TO GET CODE PSTP MOV R3,(R2)+ ; SET TRAP CPU LEVEL PSTP CMP R2,#36 ; DONE YET? PSTP BLO PSTI10 ; NO. PSTP CLR $PSTCT MOV #340,R3 ; PUT BASIC CPU LEVEL IN R3 PSTP PSTI10: MOV R0,(R2)+ ; SET ADDRES FOR TRANSFER PSTP INC R3 ; INC CPU TO GET CODE PSTP MOV R3,(R2)+ ; SET TRAP CPU LEVEL PSTP CMP R2,#36 ; DONE YET? PSTP BLO PSTI10 ; NO. PSTP CLR $PSTCT ; CLEAR THE COUNTE; MOVB #1,TPRTY(R0) ; ASL R0 ; MOV #REBOOT,HEADER(R0); TST (R0)+ ; MOV #DKSAVE,HEADER(R0); RTS PC ; .PAGE ; ; TASK #14. - TRANSFER CONTROL TO DOS VIA FAKED ROM BOOT. REBOOT: .WORD 1 ; THREAD WORD .WORD RES100 ; START ADD .WORD 0,0 ; NO INIT OR MAX TIME .BYTE STSIZE ; STACK SIZE .B *RCOM ; MOV NTH,-(SP) ; # OF REQUIRED FIELD. *RCOM ; MOV #STRING,-(SP) ; ADDRESS OF FIRST CHARACTER. *RCOM ; MOV NC,-(SP) ; NUMBER OF CHARACTERS. *RCOM ; EMT 27 ; SCAN *RCOM ; MOV (SP)+,FIELD ; ADD. OF FIRST CHAR. IN FIELD.*RCOM ; ; IF 0, FIELD IS VOID OR *RCOM ; CLEAR THE COUNTER USED FOR # OF TRAPS PSTP MOV #1,R0 ; PUT A 1 IN REG FOR RESETTING I/O PSTP MOV R0,PSMES1 ; THREAD WORDS. PSTP MOV R0,PSMES2 ; PSTP RTS PC ; RETURN TO CALLER PSTP .PAGE PSTP .DEF $PSTCT,$OLDPS,$PCSAV,$TCODE ; R USED FOR # OF TRAPS PSTP MOV #1,R0 ; PUT A 1 IN REG FOR RESETTING I/O PSTP MOV R0,PSMES1 ; THREAD WORDS. PSTP MOV R0,PSMES2 ; PSTP RTS PC ; RETURN TO CALLER PSTP .PAGE PSTP .DEF $PSTCT,$OLDPS,$PCSAV,$TCODE ; PSTP .REF YTE 1 ; PRIORITY .WORD 0 ; CURRENT TIME .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT .ENDC ; .BYTE 0 ; CPU LEVEL .BYTE 14. ; TASK #. .WORD 0 ; STACK POINTER .=.+STSIZE+STSIZE ; STACK AREA RES100: RESET ; CLEAR BUSS REGISTERS MOV #10.,R3 ; SET RETRY COUNTER RES110: ; ; NONEXISTENT. *RCOM ; MOV (SP)+,LENTH ; # OF CHARACTERS IN FIELD. *RCOM ; MOV (SP)+,ERROR ; STATUS CODE *RCOM ; ; =0 REQUEST COMPLETED *RCOM ; ; >0 FIELD NONEXISTENT. *RCOM ; ; VALUE IS # OF EXISTING *RCOM ; PSTP .REF ACTIVE,DSPTCH ; PSTP .IFLE $PST ; INCLUDE IFF ROS TRAP HANDLER USED. PSTP .REF $CTASK,LERTYP,ABORT ; PSTP .ENDC PSTP .IFNZ $PST ; INCLUDE IFF USER TRAP HANDLER USED. PSTP .REF UPST ; REFERENCE THE ENTRY POINT PSTP .ENDC ACTIVE,DSPTCH ; PSTP .IFLE $PST ; INCLUDE IFF ROS TRAP HANDLER USED. PSTP .REF $CTASK,LERTYP,ABORT ; PSTP .ENDC PSTP .IFNZ $PST ; INCLUDE IFF USER TRAP HANDLER USED. PSTP .REF UPST ; REFERENCE THE ENTRY POINT PSTP .ENDC DEC R3 ; COUNT THIS TRY BNE RES120 ; HAVEN'T RUN OUT YET HALT ; TRIED THEM ALL. BR RES100 ; HE HIT 'CONT' TO TRY AGAIN RES120: MOV #177462,R0 ; GET ADDRESS OF RF-11 WORD COUNT REG. MOV #177400,(R0) ; PUT A -256 (4 SECT) COUNT IN IT. MOV #5,-(R0) ; SET DISK FUNCTION FOR READ/GO RES130: TSTB (R0) ; WAIT HERE UNTIL BIT 7 GOES ON FOR BPL RE; FIELDS. *RCOM ; *RCOM ; NUMFLD: *RCOM ; MOV NTH,-(SP) ; # OF REQUIRED FIELD. *RCOM ; MOV #STRING,-(SP) ; ADDRESS OF FIRST CHARACTER. *RCOM ; MOV NC,-(SP) ; NUMBER OF CHARACTERS. *RCOM ; EMT 28 ; NUMFLD *RCOM ; PSTP PSTRAP =. ; TRAP ENTRY POINT PSTP MOV @#PS,$TCODE ; GET NEW PS PSTP BIC #177740,$TCODE ; LEAVE JUST CONDITION CODES. PSTP MOV (SP)+,$PCSAV ; GET PC OF TRAP (BEFORE) PSTP MOV (SP)+,$OLDPS ; GET PS OF TRAP (BEFORE) PSTP INC $PSTCT ; COUNT NUMBER OF TRAPS. PSTP PSTRAP =. ; TRAP ENTRY POINT PSTP MOV @#PS,$TCODE ; GET NEW PS PSTP BIC #177740,$TCODE ; LEAVE JUST CONDITION CODES. PSTP MOV (SP)+,$PCSAV ; GET PC OF TRAP (BEFORE) PSTP MOV (SP)+,$OLDPS ; GET PS OF TRAP (BEFORE) PSTP INC $PSTCT ; COUNT NUMBER OF TRAPS. PSTP TST ACTIS130 ; DONE TST (R0) ; CHECK FOR ERRORS BMI RES110 ; ERROR. GO TRY ALL OVER AGAIN. JMP @#0 ; ALL A-OK. TRANSFER CONTROL TO CODE ; READ IN WHICH STARTS AT WORD 0. ; 'RESET' SET MEMORY ADDRESS TO 0. .PAGE ; ; TASK #15. - SAVE DDS DISK ON 4 DECTAPES-CURRENTLY ONLY FIRST 8192 ; SECTORS ARE SAVED SINCE LAST HALF IS RESERVED FOR DOS USE. DKSAVE: .W MOV (SP)+,VALUE ; VALUE OF FIELD, IF NUMERIC. *RCOM ; MOV (SP)+,ERROR ; STATUS CODE *RCOM ; ; =-2 VOID FIELD *RCOM ; ; =-1 NON-NUMERIC FIELD *RCOM ; ; = 0 REQUEST COMPLETED *RCOM ; ; > 0 FIELD NONEXISTENT. *RCOM ; ; PSTP TST ACTIVE ; TASK OR ROS? PSTP BNE PSTB00 ; BRANCH IF TASK PSTP PSHALT: HALT ; HALT IF ROS SINCE ROS IS, BY PSTP BR PSHALT ; DEFINITION, ERROR FREE. PSTP PSTB00 =. ; HERE IF A TASK. PSTP .IFLE $PST ; INCLUDE IFF ROS TRAP HANDLER USED. PSTP MOV $CTASK,-(SP) ; PUVE ; TASK OR ROS? PSTP BNE PSTB00 ; BRANCH IF TASK PSTP PSHALT: HALT ; HALT IF ROS SINCE ROS IS, BY PSTP BR PSHALT ; DEFINITION, ERROR FREE. PSTP PSTB00 =. ; HERE IF A TASK. PSTP .IFLE $PST ; INCLUDE IFF ROS TRAP HANDLER USED. PSTP MOV $CTASK,-(SP) ; PUSH TASK# ON STACK FOR ABORORD 1 ; THREAD WORD .WORD DKS100 ; START ADD .WORD 0,0 ; NOT INIT OR MAX TIME .BYTE STSIZE ; STACK SIZE .BYTE 1 ; PRIORITY .WORD 0 ; CURRENT TIME .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT .ENDC ; .BYTE 0 ; CPU LEVEL .BYTE 15. ; TASK # .WORD 0 VALUE IS # OF EXISTING*RCOM ; ; FIELDS. *RCOM ; *RCOM ; SUBROUTINES USED: PUSHR, POPR, ASCBIN *RCOM ; *RCOM ; REGISTERS USED: ALL REGISTERS ARE RESTORED. *RCOM ; *RCOM ; SYSH TASK# ON STACK FOR ABORT PSTP JSR PC,ABORT ; ABORT THE TASK. PSTP MOV #PSMES1,R2 ; THEN NEED TO SET UP MESSAGES, IF ANY.PSTP CMP (R2),#1 ; BLOCK #1 FREE? PSTP BEQ PSTB10 ; YES. PSTP MOV #PSMES2,R2 ; NO. IS BLOCK #2 FREE? PSTP CMP (R2),#1 ; PSTP T PSTP JSR PC,ABORT ; ABORT THE TASK. PSTP MOV #PSMES1,R2 ; THEN NEED TO SET UP MESSAGES, IF ANY.PSTP CMP (R2),#1 ; BLOCK #1 FREE? PSTP BEQ PSTB10 ; YES. PSTP MOV #PSMES2,R2 ; NO. IS BLOCK #2 FREE? PSTP CMP (R2),#1 ; PSTP BNE PSTC00 ; STACK SIZE .=.+STSIZE+STSIZE ; RES STACK ; T/O LISTS KBLIST: .WORD 1 ; THREAD WORD .BYTE 0,2 ; TTY, EXIT 2 .WORD 0 ; NO I/O COMPLETE ROUTINE .BYTE 0,1 ; NO ERROR TASK-PRIORITY REQUEST .WORD 0,0 ; ERROR, SYSTEM KBADD: .WORD 0 ; ADDRESS OF DATA BUFFER DKLIST: .WORD 1 ; THREAD WORD .BYTE 1,2 ; DISK#1 - EXINTAX: THE SYNTAX OF A ROS COMMAND STRING IS ONE OR MORE *RCOM ; ALPHANUMERIC FIELDS, SEPERATED BY COMMAS AND TERMINATED*RCOM ; BY THE END OF THE STRING. BLANKS ARE NOT COMPRESSED *RCOM ; AND ARE TREATED AS NON-NUMERIC CHARACTERS. *RCOM ; *RCOM ; PROGRAMMER: 53 *RCOM ; VERSION: 1 BNE PSTC00 ; NO. PSTP PSTB10: CLR -(SP) ; SET CPU LEVEL FOR 'LERTYP' TO RETURN PSTP MOV R2,-(SP) ; TO. ALSO PUSH ADDRESS OF MODULE. PSTP CMP (R2)+,(R2)+ ; MOVE R2 TO SECOND ARG OF ERR MODULE PSTP MOVB $CTASK,(R2)+ ; PUT TASK# OF TRAP IN BYTE ZERO. PSTP MOVB $TCODE,(R2) ; PUT CODE OF ERROR IN BYTE ONE AND PSTP ASL (R2)+ ; SHIFT IT ; NO. PSTP PSTB10: CLR -(SP) ; SET CPU LEVEL FOR 'LERTYP' TO RETURN PSTP MOV R2,-(SP) ; TO. ALSO PUSH ADDRESS OF MODULE. PSTP CMP (R2)+,(R2)+ ; MOVE R2 TO ARG #1 OF ERROR MODULE PSTP MOVB $CTASK,(R2)+ ; PUT TASK # IN FIRST ARG. PSTP CLRB (R2)+ ; CLEAR UPPER BYTE PSTP MOV $TCODE,(R2)+ ; PUT ERROR CODE IN SECOND ARG. T TYPE 2 .WORD 0 ; NO I/O COMPLETE .BYTE 0,3 ; NO ERROR TASK-LEVEL #3 DKERR: .WORD 0,0 ; ERROR,SYSTEM .WORD DBUFF ; ADDRESS OF DATA BUFFER DTLIST: .WORD 1 ; THREAD WORD DTUNIT: .BYTE 0,2 ; DEVICE - EXIT TYPE 2 .WORD 0 ; NO I/O COMPLETE .BYTE 0 ; NO ERROR TASK DTFUN: .BYTE 0 ; DECTAPE FUNCTION - 0=READ 1=WRITE DTERR: *RCOM ; DATE: 17 JAN 72 *RCOM ; CATALOGUE NUMBER: *RCOM ; *RCOM ;***********************************************************************RCOM .TITLE ROSCOM RCOM ; RCOM CSAVE = TO READ PROPERLY. PSTP MOV $PCSAV,(R2)+ ; PUT ADDRESS OF TRAP IN ARG 3. PSTP MOV $PSTCT,(R2) ; PUT # ERRORS IN ARG 4. PSTP JSR PC,LERTYP ; PSTP PSTC00 =. ; HERE WHEN MESSAGE, IF ANY, IS DONE. PSTP .ENDC PSTP .IFNZ $PST ; INCLUDE IFF USER TRAP HANDLER USED. PSTP PSTP MOV $PCSAV,(R2)+ ; PUT ADDRESS OF TRAP IN THIRD ARG. PSTP MOV $PSTCT,(R2) ; PUT # OF ERRORS IN FOURTH ARG. PSTP JSR PC,LERTYP ; PSTP PSTC00 =. ; HERE WHEN MESSAGE, IF ANY, IS DONE. PSTP .ENDC PSTP .IFNZ $PST ; INCLUDE IFF USER TRAP HANDLER USED. PSTP .IFG $PST .WORD 0,0 ; ERROR - SYSTEM .WORD TBUFF ; DATA BUFFER .PAGE ; I/O BUFFERS MES1: .WORD MES1LN,0 ; # CHARACTERS .BYTE CR,LF .ASCII /*** MOUNT DECTAPES 0,1,2,3/ ; .BYTE CR ; NEW LINE .ASCII /SET SWITCHES=-1 TO RESTORE DISK/ .BYTE CR ; .ASCII /HIT WHEN READY: / MES1LN =.-MES1-4 .EVEN MES2: .WORD 0,0 ; GO AHEAD - JUST A CR12. ;OFFSET FOR PUSHR/POPR REG SAVE RCOM NC = CSAVE+2 ;OFFSET TO FIRST ARG(# CHARACTERS) RCOM STRING = NC+2 ;OFFSET TO STRING ADDRESS RCOM NTH = STRING+2 ;OFFSET TO FIELD NUMBER RCOM FIELD = CSAVE+2 ;OFFSET TO ADD OF FIELD RCOM NUM = CSAVE+4 ;OFFSET TO NUMBER OF FIELDS RCOM LENTH = CSAVE+4 ;OFFSET TO LENTH OF FIELD .IFG $PST ; ONLY INCLUDE IF ONLY USER ROUTINE PSTP TST (SP)+ ; GET RID OF PC FROM STACK PSTP MOVB (SP)+,@#PS ; RESET CPU LEVEL TO THAT BEFORE TRAP PSTP .ENDC PSTP JSR PC,UPST ; TRANSFER TO THE USERS ROUTINE PSTP .ENDC PSTP JMP DSPTCH ; FINALLY FINISH; ONLY INCLUDE IF ONLY USER ROUTINE PSTP TST (SP)+ ; GET RID OF PC FROM STACK PSTP MOVB (SP)+,@#PS ; RESET CPU LEVEL TO THAT BEFORE TRAP PSTP .ENDC PSTP JSR PC,UPST ; TRANSFER TO THE USERS ROUTINE PSTP .ENDC PSTP JMP DSPTCH ; FINALLY FINISH UP. PS. MES3: .WORD MES3LN,0 ; DISK ERROR .BYTE CR,LF .ASCII /DISK ERROR - ABORTED/ MES3LN =.-MES3-4 .EVEN MES4: .WORD MES4LN,0 ; TAPE ERROR .BYTE CR,LF .ASCII /DECTAPE ERROR - ABORTED/ MES4LN =.-MES4-4 .EVEN DBUFF: .WORD NDISCS+1 ; FILE ID - ALL OF DISK .BYTE 0 ; USE SPECIFIED SEC # DKFUN: .BYTE 0 ; FUNCTION 0=READ 1=WRITE .WORD 0,0,0 ; DI RCOM VALUE = CSAVE+4 ;OFFSET TO VALUE OF NUMERIC FIELD RCOM ERROR = VALUE+2 ;OFFSET TO STATUS CODE RCOM .PAGE RCOM ; THIS SUBROUTINE, 'NPARAM', COUNTS THE NUMBER OF FIELDS IN A ROS RCOM ; COMMAND STRING AND RETURNS THE VALUE TO THE CALLER. ALL USED RCOM ; REGISTERS ARE RESTORED. RCOM ; UP. PSTP .IFLE $PST ; INCLUDE IFF ROS TRAP HANDLER USED. PSTP PSMES1: .WORD 1 ; ERROR BLOCK #1. THREAD WORD. PSTP .WORD 90. ; ERROR NUMBER PSTP .WORD 0,0,0,0 ; FOUR ARGUMENTS PSTP PSMES2: .WORD 1 ; ERROR BLOCK #2. THREAD WORD PSTP .WORD 90. ; ERROR NUMBER PSTP .WORTP .IFLE $PST ; INCLUDE IFF ROS TRAP HANDLER USED. PSTP PSMES1: .WORD 1 ; ERROR BLOCK #1. THREAD WORD. PSTP .WORD 90. ; ERROR NUMBER PSTP .WORD 0,0,0,0 ; FOUR ARGUMENTS PSTP PSMES2: .WORD 1 ; ERROR BLOCK #2. THREAD WORD PSTP .WORD 90. ; ERROR NUMBER PSTP .WORD 0,0,0,0 ; FOURSCIO USE TBUFF: ; TAPE BUFFER BLKSEC: .WORD 0 ; SECTOR OR BLOCK # .WORD BUFSIZ ; # WORDS TO TRANSFER BUFFER: .=.+BUFSIZ+BUFSIZ ; RESERVE BUFFER .EVEN .PAGE DKS100=. MOV #COMPID+2,R0 ; GET ADDRES IN DISCIO OF FILE ID CLR (R0)+ ; TO USE FOR DUMPING ENTIRE DISK AREA MOV #400,(R0)+ ; MOV #MAXSEC+1,(R0)+ ; SET SIZE OF AREA CLR (R0)+  RCOM .DEF NPARAM ; RCOM .REF PUSHR,POPR ; RCOM ; RCOM ; NPARAM'S STACK LOOKS AS FOLLOWS: RCOM ; RCOM ; D 0,0,0,0 ; FOUR ARGUMENTS PSTP .ENDC PSTP $PSTCT: .WORD 0 ; TOTAL NUMBER OF TRAPS PSTP $OLDPS: .WORD 0 ; SAVE PS FROM BEFORE THE TRAP PSTP $PCSAV: .WORD 0 ; SAVE PC FROM BEFORE THE TRAP PSTP $TCODE: .WORD 0 ; TYPE OF TRAP. THE CODE IS: PSTP ; 1 = BUS ERROR  ARGUMENTS PSTP .ENDC PSTP $PSTCT: .WORD 0 ; TOTAL NUMBER OF TRAPS PSTP $OLDPS: .WORD 0 ; SAVE PS FROM BEFORE THE TRAP PSTP $PCSAV: .WORD 0 ; SAVE PC FROM BEFORE THE TRAP PSTP $TCODE: .WORD 0 ; TYPE OF TRAP. THE CODE IS: PSTP ; 1 = BUS ERROR (4) PSTP  ; CLR R0 ; DISK SECTOR CLR R1 ; TAPE BLOCK # MOV #BLKSEC,R2 ; SET ADDRESS OF SECTOR/BLOCK NUMBER. MOVB #5,DTUNIT ; INITIALIZE TO DECTAPE UNIT 0 MOV #MES1,KBADD ; PUT OUT INSTRUCTIONS MOV #KBLIST,-(SP) ; EMT TTYOUT ; TTYOUT MOV #MES2,KBADD ; GET GO AHEAD MOV #KBLIST,-(SP) ; EMT TTYIN ; TTYIN  RCOM ; STRING ADD. AT CALL RCOM ; # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; R5 AFTER PUSHR RCOM ; R4 RCOM ; R3 RCOM ; R2  (4) PSTP ; 2 = RESERVED INSTRUSTION (10) PSTP ; 3 = DEBUG (14) PSTP ; 4 = IOT (20) PSTP ; 5 = POWER FAIL/RESTART (24) PSTP ; 6 = EMT (30) PSTP ; 7 = 'TRAP' (34) PSTP .END  ; 2 = RESERVED INSTRUSTION (10) PSTP ; 3 = DEBUG (14) PSTP ; 4 = IOT (20) PSTP ; 5 = POWER FAIL/RESTART (24) PSTP ; 6 = EMT (30) PSTP ; 7 = 'TRAP' (34) PSTP .END ;  MOV @#177570,R3 ; GET SWITCH VALUE CMP R3,#-1 ; =-1 TAPE TO DISK ELSE DISK TO TAPE BNE DKS120 ; MOVB #1,DKFUN ; SET TAPE TO DISK - DISK WRITE CLRB DTFUN ; TAPE READ BR DKS200 ; DKS120: CLRB DKFUN ; DISK TO TAPE - DISK READ MOVB #1,DTFUN ; TAPE WRITE DKS200: CMP R3,#-1 ; DO STUFF BNE DKS220 ; BRANCH FOR DISK TO TAPE  RCOM ; R1 RCOM ; R0 <=SP RCOM ; RCOM ; # FIELDS READY FOR RETURN RCOM ; PC FOR RETURN <=SP RCOM ; ; PSTP PSTP  JSR PC,DT ; READ TAPE JSR PC,DK ; WRITE DISK BR DKS250 ; TO TO COMMON DKS220: JSR PC,DK ; READ DISK JSR PC,DT ; WRITE TAPE DKS250: ADD #BUFSIZ/256.,R1 ; ADJUST TAPE BLOCK # ADD #BUFSIZ/64.,R0 ; ADJUST DISK SECTOR #. CMP R0,#MAXSEC ; ALL DONE (> MAX SEC#)? BGE DKSEND ; YES CMP R1,#512. ; FULL TAPE? BLT DK  RCOM NPARAM =. ; ENTRY POINT RCOM JSR R5,PUSHR ; SAVE ALL REGISTERS RCOM MOV NC(SP),R4 ; GET NUMBER OF CHARACTERS IN FIELD. RCOM MOV STRING(SP),R5 ; GET THE ADDRESS OF THE CHAR, STRING. RCOM ADD R5,R4 ; CONVERT R4 TO ADDRESS OF STRING END. RCOM CLR R1 ; CLEAR COMMA COUNTER RCOM NPRA10: JSR PC,GETCOM ; ; UPDATE 2 12 APR 1972 INCREASE BUFFER SIZE ; UPDATE 1 21 MAR 1972 ADDRESS IN D+SKTTTAPE ;*********************************************************************** ; * ; THIS MODULE CONTAINS TO UTILITY TASKS: * ; 1. #14.-REBOOT DOS * ; 2. #15.-ROS/DDS DIST TO DECTAPE/DECTAPE TO DISK * ;  MOV 14.(SP),R5 ; GET ADDRESS OF BFUB BLOCK. BFUP JSR PC,FILECK ; MAKE SURE ROS/BFUP FILE BFUP BNE ENTA99 ; BRANCH IF NOT A ROS/BFUP FILE BFUP ; ZBUF NOW HAS SECTOR 0 IN IT. BFUP TSTB ZBUF+FSTAT ; CHECK FILE'S STATUS - ONLY ONE WRITE BFUP BMI BFER03 ; AT A TIME. BFUP JSR PC,GETELT ; SEE IF CS200 ; NO - GET NEXT CLR R1 ; YES - GET NEXT TAPE UNIT INC DTUNIT ; BR DKS200 ; OK - GO FOR MORE DKSTER: MOV #MES4,KBADD ; TAPE ERROR BR DKSERR ; GO TO COMMON CODE DKSDER: MOV #MES3,KBADD ; DISK ERROR DKSERR: MOV #KBLIST,-(SP) ; WRITE ERROR MESSAGE EMT TTYOUT ; DKSEND: EMT EXIT ; EXIT ; DISK I/O HERE DK: MOV R0,(R2) ; LOOK FOR A COMMA. RCOM INC R1 ; INCREMENT COUNTER. ALWAYS AT LEAST RCOM TST R0 ; 1 FIELD. WAS A COMMA FOUND? RCOM BNE NPRA10 ; YES. LOOK FOR ANOTHER. RCOM MOV R1,NUM(SP) ; STORE # FOUND FOR CALLER. RCOM NPRF10: JSR R5,POPR ; RESTORE REGISTERS. RCOM NPRF20: MOV (SP)+,(SP) ; MOVE RETURN ADDRESS UP FOR RETURN. RCOM * ;*********************************************************************** .TITLE UTIL .REF UTLIPL .DEF HEADER,TSTAT,TPRTY,TASKS .DEF COMPID ; TO DUMP DISK ; ; PARAMETERS MAXSEC = 8191. ; HIGHEST SECTOR TO BE SAVED NBLOCK = 16. ; # OF DECTAPE BLOCKS FOR TRANSFER UTIL BUFSIZ = 256.*NBLOCK ; # WORDS IN BUFFER UTIL STSIZE = 100 AN FIND EXISTING ELEMENT. BFUP BEQ ENTA30 ; SKIP NEXT BLOCK IF NOT FOUND BFUP TSTB (R0) ; IS ELEMENT FREE BFUP BNE BFER11 ; NO - CAN'T DELETE IT THEN. BFUP MOVB #STDELT,(R0) ; SET DELETED STATUS-R0 POINTS FROM GET BFUP TSTB R3 ; ALL IN SECTOR ZERO? BFUP BEQ ENTA30 ; YES BFUP SET DISK SECTOR #. MOV #DKLIST,-(SP) ; WRITE DISK SECTORS EMT DISCIO ; TST DKERR ; ANY ERRORS BNE DKSDER ; YES - SHUT DOWN RTS PC ; ; DECTAPE I/O HERE DT: MOV R1,(R2) ; SET TAPE BLOCK #. MOV #DTLIST,-(SP) ; READ TAPE BLOCK EMT DECTAP ; TST DTERR ; ANY ERRORS BNE DKSTER ; YES - SHUT DOWN  RTS PC ; GO BACK TO CALLER. RCOM .PAGE RCOM ; THIS SUBROUTINE, 'SCAN', RETURNS TO THE CALLER THE THE ADDRESS OF, ANDRCOM ; THE NUMBER OF CHARACTERS IN, A SPECIFIED FIELD. ALL REGISTERS ARE RCOM ; RESTORED. RCOM ; RCOM .DEF SCAN ;  ; # WORDS IN STACKS EXIT = 4 TTYOUT = 13 TTYIN = 14 DECTAP = 15 DISCIO = 23 LF = 12 ; AN ASCII LF CR = 15 ; AN ASCII CR ; UTLIPL: MOV #15.,R0 ; INITALIZE TASK HEADERS UTPL10: CMP R0,#TASMAX ; BLE UTPL20 ; HALT ; UTPL20: CMP R0,TASKS ; BLE UTPL30 ; MOV R0,TASKS ; UT MOVB #WFUN,AFUN ; NO - MUST WRITE THIS SECTOR TO DISK. BFUP JSR PC,DISKBF ; SECTOR # STILL SET - GO DO I/O BFUP BNE BFERDK ; NO-ERROR. BFUP ENTA30: ; OLD ELEMENT NOW DELETED BFUP MOV #ZBUF+BHEAD,R2 ; GET ADDRESS FOR ZBUF USE BFUP MOVB ZBUF+FDIRSC,R0 ; IS EVERYTHING IN SECTOR 0? BFUP BEQ ENTA50 ; YES RTS PC ; .END  RCOM .REF PUSHR,POPR ; RCOM ; RCOM ; SCAN'S STACK LOOKS AS FOLLOWS: RCOM ; RCOM ; FIELD # AT CALL RCOM ; STRING ADD. RCOM ; PL30: CLRB TSTAT(R0) ; MOVB #1,TPRTY(R0) ; DEC R0 ; CLRB TSTAT(R0) ; MOVB #1,TPRTY(R0) ; ASL R0 ; MOV #REBOOT,HEADER(R0); TST (R0)+ ; MOV #DKSAVE,HEADER(R0); RTS PC ; .PAGE ; ; TASK #14. - TRANSFER CONTROL TO DOS VIA FAKED ROM BOOT. REBOOT: .WORD 1 ; THREAD WORD .WORD RES1 BFUP MOV R0,ASEC ; NO-MUST READ IN DESIRED SECTOR BFUP MOV #ABUF+BHEAD,R2 ; GET ADDRESS FOR ABUF USE BFUP MOV #ABUF,DSKADD ; SET BUFFER ADD INTO I/O LIST. BFUP MOVB #RFUN,AFUN ; SET READ FUNCTION BFUP JSR PC,DISKBF ; READ IN THE SECTOR. BFUP BNE BFERDK ; BRANCH IF DISK I/O ERRORS. BFUP ENTA50: MOVBSYMBOLIC ELEMENT (UNSPECIFIED) BFUP TYASM = 3 ; ASSEMBLER SYMBOLIC ELEMENT BFUP TYFOR = 4 ; FORTRAN SYMBOLIC ELEMENT BFUP TYDATA = 5 ; DATA ELEMENT BFUP ; BFUP ; DIRECTORY ENTRIES (OFFSETS) BFUP DNAME1 = 0 ; FIRST TRIAD OF NAME BFUP # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; R5 AFTER PUSHR RCOM ; R4 RCOM ; R3 RCOM ; R2 RCOM ; R1 00 ; START ADD .WORD 0,0 ; NO INIT OR MAX TIME .BYTE STSIZE ; STACK SIZE .BYTE 1 ; PRIORITY .WORD 0 ; CURRENT TIME .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT .ENDC ; .BYTE 0 ; CPU LEVEL .BYTE 14. ; TASK #. .WORD 0 ; STACK POINTER .=.+STSIZE+STSIZE  ZBUF+FNDNUM,R1 ; GOT CURRENT DIR. SECTOR - R0 POINTS TOBFUP BIC #177770,R1 ; IT - LET'S BUILD THE ENTRY NOW - WE BFUP ASL R1 ; KNOW WE HAVE ROOM-ALWAYS UPDATE IN BFUP ASL R1 ; BFCLOS. R1 IS SET TO ADDRESS IN BUFFBFUP ASL R1 ; BFUP ASL R1 ; BFUP ADD R2,R1 ; ADD ADDRESS TO POINT  DNAME2 = 2 ; SECOND TRIAD OF NAME BFUP DSTAT = 4 ; ELEMENT STATUS BFUP DTYPE = 5 ; ELEMENT TYPE BFUP DHOUR = 6 ; TIME OF CREATION BFUP DMIN = 7 ; BFUP DSEC = 8. ; BFUP DYEAR = 9. ; DATE O! RCOM ; R0 <=SP RCOM ; RCOM ; ERROR CODE READY FOR RETURN RCOM ; # CHAR. IN FIELD RCOM ; ADD. OF FIELD RCOM ; PC FOR RETURN <=SP RCOM ; " ; STACK AREA RES100: RESET ; CLEAR BUSS REGISTERS MOV #10.,R3 ; SET RETRY COUNTER RES110: DEC R3 ; COUNT THIS TRY BNE RES120 ; HAVEN'T RUN OUT YET HALT ; TRIED THEM ALL. BR RES100 ; HE HIT 'CONT' TO TRY AGAIN RES120: MOV #177462,R0 ; GET ADDRESS OF RF-11 WORD COUNT REG. MOV #177400,(R0) ; PUT A -256 (4 SECT) COUNT IN IT. MOV # TO CORRECT BUFFERBFUP ; R1 NOW POINTS TO WORD OF BUFF TO STARTBFUP MOV R5,R4 ; GET ADD OF COM BLOCK BFUP CMP (R4)+,(R4)+ ; ADD 4 TO POINT TO NAME WR01 BFUP MOV (R4)+,(R1)+ ; MOVE WORD 1 OF ELEM NAME BFUP MOV (R4)+,(R1)+ ; MOVE WORD 2 BFUP MOV (R4)+,(R1)+ ; SET TYPE OF ELEMENT BFUP MOVB #S$F CREATION BFUP DDAY = 10. ; BFUP DMONTH = 11. ; BFUP DSTSEC = 12. ; FIRST SECTOR (RELATIVE) IN ELEMENT BFUP DLENTH = 14. ; NUMBER OF SECTORS IN ELEMENT BFUP ; BFUP ; COMMUNICATION BLOCK (OFFSETS) BFUP BFER% RCOM SCAN =. ; ENTRY POINT RCOM JSR R5,PUSHR ; SAVE ALL REGISTERS RCOM MOV NTH(SP),R3 ; GET NUMBER OF FIELD TO FIND. RCOM BLE SCAN90 ; FIELD NUMBER MUST POSITIVE & NON-ZERORCOM MOV NC(SP),R4 ; GET NUMBER OF CHARACTERS IN STRING RCOM MOV STRING(SP),R5 ; GET BEGINNING STRI&#5,-(R0) ; SET DISK FUNCTION FOR READ/GO RES130: TSTB (R0) ; WAIT HERE UNTIL BIT 7 GOES ON FOR BPL RES130 ; DONE TST (R0) ; CHECK FOR ERRORS BMI RES110 ; ERROR. GO TRY ALL OVER AGAIN. JMP @#0 ; ALL A-OK. TRANSFER CONTROL TO CODE ; READ IN WHICH STARTS AT WORD 0. ; 'RESET' SET MEMORY ADDRESS TO 0. .PAGE ; ; TA'TXUSE,-2(R1) ; SET STATUS OF ELEMENT IN DIRECTORY BFUP EMT $GTIME ; GET HOUR, MIN, & SEC OF CREATION BFUP MOVB (SP)+,(R1)+ ; SET HOUR BFUP MOVB (SP)+,(R1)+ ; SET MIN BFUP MOVB (SP)+,(R1)+ ; SET SEC BFUP EMT $GDATE ; GET DAY, MONTH, & YEAR OF CREATION BFUP MOVB (SP)+,(R1)+ ; SET YEAR (R = 0 ; ERROR WORD BFUP BFRFIL = 2 ; ROS FILE ID (THE BFUP FILE) BFUP BFELN1 = 4 ; FIRST TRIAD OF ELEMENT NAME BFUP BFELN2 = 6 ; SECOND TRIAD OF ELEMENT NAME BFUP BFSTAT = 8. ; FOR SYSTEM USE - USUALLY STATUS BFUP BFTYPE = 9. ; ELEMENT TYPE. BFUP BFSEC = 10. ; FIRST SECTOR)NG ADDRESS RCOM ADD R5,R4 ; COMPUTE ENDING ADDRESS OF STRING. RCOM CLR R1 ; CLEAR COMMA COUNTER RCOM MOV PC,R0 ; SET R0 FOR FIELD 0. RCOM SCAN20: CMP R1,R3 ; HAVE WE FOUND THE CORRECT FIELD? RCOM BEQ SCAN60 ; AT LAST! GO HANDLE IT. RCOM TST R0 ; WAS A COMMA FOUND LAST TIME? RCOM BEQ *SK #15. - SAVE DDS DISK ON 4 DECTAPES-CURRENTLY ONLY FIRST 8192 ; SECTORS ARE SAVED SINCE LAST HALF IS RESERVED FOR DOS USE. DKSAVE: .WORD 1 ; THREAD WORD .WORD DKS100 ; START ADD .WORD 0,0 ; NOT INIT OR MAX TIME .BYTE STSIZE ; STACK SIZE .BYTE 1 ; PRIORITY .WORD 0 ; CURRENT TIME .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT + BFUP MOVB (SP)+,(R1)+ ; SET DAY BFUP MOVB (SP)+,(R1)+ ; SET MONTH BFUP MOV ZBUF+FNSEC,(R4) ; SET STARTING SECTOR INTO COM BLOCK BFUP MOV (R4),(R1)+ ; AND INTO ENTRY BFUP CLR (R1) ; CLEAR LENGTH ENTRY IN DIRECTORY BFUP BISB #STFWRT,ZBUF+FSTAT ; MARK FILE AS WRITE IN PROG. BFUP TST R0 , IN ELEMENT BFUP BFLNTH = 12. ; LENGTH (IN SECTORS) OF ELEMENT BFUP ; BFUP ; MISCELLANEOUS BFUP DIRMAX = 32. ; # OF SECTORS IN DIRECTORY BFUP $DSKIO = 23 ; EMT # OF DISCIO BFUP $GTIME = 31 ; EMT # OF GET TIME BFUP $GDATE = -SCAN40 ; NO - THEN ALL DONE RCOM MOV R5,R2 ; SAVE R2 - NEW FIELDS START ADDRESS RCOM INC R1 ; INCREMENT FIELD # COUNTER (ALWAYS AT RCOM ; LEAST 1 FIELD (WHICH MAY BE VOID) RCOM JSR PC,GETCOM ; LOOK FOR A FIELD-ADVANCE R5-SET R0 RCOM BR SCAN20 ; GO SEE IF FIELD IS ONE WANTED RCOM SCAN40: CLR R5 ; NOT FOUND - FIELD LENTH . .ENDC ; .BYTE 0 ; CPU LEVEL .BYTE 15. ; TASK # .WORD 0 ; STACK SIZE .=.+STSIZE+STSIZE ; RES STACK ; T/O LISTS KBLIST: .WORD 1 ; THREAD WORD .BYTE 0,2 ; TTY, EXIT 2 .WORD 0 ; NO I/O COMPLETE ROUTINE .BYTE 0,1 ; NO ERROR TASK-PRIORITY REQUEST .WORD 0,0 ; ERROR, SYSTEM KBADD: .WORD / ; JUST SECTOR 0? BFUP BEQ ENTA70 ; NO - HERE TO PUT OUT DIRECTORY SECTOR.BFUP MOVB #WFUN,AFUN ; SET FUNCTION FOR A WRITE BFUP JSR PC,DISKBF ; AND WRITE IT OUT BFUP BNE BFERDK ; ERROR BFUP ENTA70: MOV #ZBUF,DSKADD ; SET UP TO DO SECTOR 0 BFUP MOVB #WFUN,ZFUN ; SET FUNCTION FOR A WRITE 0 32 ; EMT # OF GET DATE BFUP DSKSIZ = 64. ; # WORDS IN A DISK SECTOR BFUP WFUN = 3 ; WRITE FUNCTION - DISCIO (WITH WRT CHK)BFUP RFUN = 0 ; READ FUNCTION - DISCIO BFUP BHEAD = 14. ; #BYTES FOR DISCIO IN BUFFER BFUP ; BFUP ; FOR ENTRY 0 IN SECTOR 0 (OFFSETS) 1=0 RCOM SCAN50: CLR R2 ; FIELD ADDRESS =0 RCOM BR SCAN80 ; GO TO COMMON CODE RCOM SCAN60: CLR R1 ; HERE IF FOUND IT. - ERROR CODE =0 RCOM SUB R2,R5 ; COMPUTE # OF CHARACTERS - GETCOM ALWAYRCOM DEC R5 ; LEAVES R5 2 PAST FIELD END. RCOM BEQ SCAN50 ; IF FIELD LEN.=0, VOID FIELD. GO SETUP.RCOM SCAN80: MOV R1,ERR2 0 ; ADDRESS OF DATA BUFFER DKLIST: .WORD 1 ; THREAD WORD .BYTE 1,2 ; DISK#1 - EXIT TYPE 2 .WORD 0 ; NO I/O COMPLETE .BYTE 0,3 ; NO ERROR TASK-LEVEL #3 DKERR: .WORD 0,0 ; ERROR,SYSTEM .WORD DBUFF ; ADDRESS OF DATA BUFFER DTLIST: .WORD 1 ; THREAD WORD DTUNIT: .BYTE 0,2 ; DEVICE - EXIT TYPE 2 .WORD 0 ; NO I/O C3 BFUP JSR PC,DISKBF ; AND WRITE SECTOR 0 OUT. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE BFUP ENTA99: JMP BFER02 ; TO FAR FOR A BRANCH BFUP .PAGE BFUP ;***********************************************************************BFUP ; 4 BFUP FID = BHEAD ; ROS FILE ID # BFUP FNDNUM = BHEAD+2 ; # OF NEXT DIRECTORY ENTRY BFUP FSTAT = BHEAD+3 ; FILE'S STATUS BFUP ; 0 - FREE BFUP ; >0 - # READS IN PROGRESS BFUP ; SIGN BIT SET IFF WRITE IN PROG. BFUP FDIRSC = 5OR(SP) ; COMMON EXIT -SET ERROR CODE RCOM MOV R2,FIELD(SP) ; SET FIELD START ADDRESS RCOM MOV R5,LENTH(SP) ; SET FIELD LENGTH RCOM SCAN90: JSR R5,POPR ; RESTORE REGISTERS RCOM RTS PC ; RETURN TO CALLER. RCOM .PAGE RCOM ; THIS SUBROUTINE, 'NUMFLD', IS USED TO RETRIEVE AND CONVERT TO 6OMPLETE .BYTE 0 ; NO ERROR TASK DTFUN: .BYTE 0 ; DECTAPE FUNCTION - 0=READ 1=WRITE DTERR: .WORD 0,0 ; ERROR - SYSTEM .WORD TBUFF ; DATA BUFFER .PAGE ; I/O BUFFERS MES1: .WORD MES1LN,0 ; # CHARACTERS .BYTE CR,LF .ASCII /*** MOUNT DECTAPES 0,1,2,3/ ; .BYTE CR ; NEW LINE .ASCII /SET SWITCHES=-1 TO RESTORE DISK/ .BYTE CR 7 *BFUP ; BFDELT PROFICES THE BATCH USER WITH A MEANS TO MARK AN ELEMENT AS *BFUP ; DELETED. AN ERROR CODE IS SET IF THE ELEMENT IS NOT FOUND. *BFUP ; NOTE: A DELETED ELEMENT AND ITS DIRECTORY ENTRY STILL EXIST. *BFUP ; BFPACK MUST BE USED TO COMPRESS THE FILE. *BFUP ; *BFUP ;SUBROUTINES USED: GETELT, FILECK, PUSHR, DISKBF *8BHEAD+4 ; SECTOR # TO CONTAIN NEXT DIRECTORY ENTBFUP FNSEC = BHEAD+6 ; SECTOR # FOR NEXT ELEMENT (ITS DATA) BFUP FFLAG1 = BHEAD+12. ; THESE 2 WORDS MUST CONTAIN THE RAD50 BFUP FFLAG2 = BHEAD+14. ; /.BFUP./ AS A FLAG INDICATING THE BFUP ; FILE HAS BEEN INITIALIZED BY BFINIT BFUP .PAGE BFUP ; TABLES, LISTS, ETC 9BINARY RCOM ; THE SPECIFIED FIELD. ALL REGISTERS ARE RESTORED. RCOM ; RCOM .DEF NUMFLD ; RCOM .REF SCAN,ASCBIN ; RCOM ; RCOM ; NUMFLD'S STACK LOOKS THIS WAY: RCOM ; : ; .ASCII /HIT WHEN READY: / MES1LN =.-MES1-4 .EVEN MES2: .WORD 0,0 ; GO AHEAD - JUST A CR. MES3: .WORD MES3LN,0 ; DISK ERROR .BYTE CR,LF .ASCII /DISK ERROR - ABORTED/ MES3LN =.-MES3-4 .EVEN MES4: .WORD MES4LN,0 ; TAPE ERROR .BYTE CR,LF .ASCII /DECTAPE ERROR - ABORTED/ MES4LN =.-MES4-4 .EVEN DBUFF: .WORD NDISCS+1 ; FILE ID - ALL OF DISK .BYTE ;BFUP ; *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFDELT ; BFUP BFDELT =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SA< BFUP ; BFUP BFBUSY: .BYTE 0 ; BFUP BUSY FLAG: =0 NO, =1 YES BFUP .EVEN BFUP ; DISKI/O LIST BFUP DSKLST: .WORD 1 ; THREAD WORD BFUP .BYTE 1 ; DEVICE CODE BFUP .BYTE 2 = RCOM ; FIELD # AT CALL RCOM ; STRING ADD. RCOM ; # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; FIELD # AT CALL RCOM ; STRING ADD. OF SCAN > 0 ; USE SPECIFIED SEC # DKFUN: .BYTE 0 ; FUNCTION 0=READ 1=WRITE .WORD 0,0,0 ; DISCIO USE TBUFF: ; TAPE BUFFER BLKSEC: .WORD 0 ; SECTOR OR BLOCK # .WORD BUFSIZ ; # WORDS TO TRANSFER BUFFER: .=.+BUFSIZ+BUFSIZ ; RESERVE BUFFER .EVEN .PAGE DKS100=. MOV #COMPID+2,R0 ; GET ADDRES IN DISCIO OF FILE ID CLR (R0)+ ; TO USE FOR?VE THE REGISTERS BFUP MOV 14.(SP),R5 ; GET ADDRESS OF COM BLOCK BFUP JSR PC,FILECK ; IS IT A ROS/BFUP FILE? BFUP BNE BFER02 ; NOT A BFUP FILE - BAD! BFUP JSR PC,GETELT ; SEE IF WE CAN FIND THE ELEMENT BFUP BEQ BFER06 ; NOT FOUND BFUP TSTB (R0) ; IS ELEMENT FREE BFUP @ ; EXIT TYPE BFUP .WORD 0 ; NO EXIT ROUTINE BFUP .BYTE 0 ; NO ERROR TASK BFUP .BYTE NDPRT1 ; LOWEST DISK PRIORITY BFUP DSKERR: .WORD 0 ; ERROR WORD BFUP .WORD 0 ; DISCIO USE BFUP DSKADD: .WORD 0 ; ADDRESS OF BUFFER FOR TRANSFERA RCOM ; # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; RCOM ; FIELD # ON RETURN RCOM ; STRING ADD. FROM SCAN RCOM ; # CHARACTERS RCOM ; PC FOR RETURN B DUMPING ENTIRE DISK AREA MOV #400,(R0)+ ; MOV #MAXSEC+1,(R0)+ ; SET SIZE OF AREA CLR (R0)+ ; CLR R0 ; DISK SECTOR CLR R1 ; TAPE BLOCK # MOV #BLKSEC,R2 ; SET ADDRESS OF SECTOR/BLOCK NUMBER. MOVB #5,DTUNIT ; INITIALIZE TO DECTAPE UNIT 0 MOV #MES1,KBADD ; PUT OUT INSTRUCTIONS MOV #KBLIST,-(SP) ; EMT TTYOUT ; C BNE BFER11 ; NO - CAN'T DELETE IT THEN BFUP MOVB #STDELT,(R0) ; SET ELEMENTS STATUS AS DELETED. BFUP TSTB R3 ; EVERYTHING IN SECTOR ZERO? BFUP BEQ BFDL20 ; YES. BFUP MOVB #WFUN,AFUN ; WRITE DIRECTORY SECTOR OUT. DISCIO BFUP JSR PC,DISKBF ; LIST ALL SET UP FROM GETELT BFUP BNE BFERDK ; DISCIO ED BFUP ; BFUP ; DISK BUFFER FOR SECTOR 0 (ALWAYS) BFUP ZBUF: .WORD 0 ; ROS FILE ID BFUP .BYTE 0 ; USE SPECIFIED SECTOR BFUP ZFUN: .BYTE 0 ; TRANSFER FUNCTION BFUP .WORD 0,0,0 ; RESERVED FOR DISCIO USE BFUP ZSEC: .WORD 0 E RCOM ; ERROR FROM SCAN RCOM ; # CHAR. IN FIELD RCOM ; ADD. OF FIELD <=SP RCOM ; RCOM ; 0 FOR ASCBIN CONVERSION RCOM ; STRING ADD. RCOMFTTYOUT MOV #MES2,KBADD ; GET GO AHEAD MOV #KBLIST,-(SP) ; EMT TTYIN ; TTYIN MOV @#177570,R3 ; GET SWITCH VALUE CMP R3,#-1 ; =-1 TAPE TO DISK ELSE DISK TO TAPE BNE DKS120 ; MOVB #1,DKFUN ; SET TAPE TO DISK - DISK WRITE CLRB DTFUN ; TAPE READ BR DKS200 ; DKS120: CLRB DKFUN ; DISK TO TAPE - DISK READ MOGRROR BFUP MOV #ZBUF,DSKADD ; SET ADD. OF ZBUF INTO I/O LIST. BFUP BFDL20: MOVB #WFUN,ZFUN ; HAVE TO DO THIS TWICE BFUP JSR PC,DISKBF ; NOW DO SECTOR ZERO. BFUP BNE BFERDK ; DISK I/O ERROR BFUP BR ENDBF ; ALL DONE - RETURN TO USER. BFUP .PAGE BFUP ;*****H ; SECTOR 0 - ALWAYS BFUP .WORD DSKSIZ ; # WORDS TO TRANSFER - 1 SECTOR BFUP .=.+DSKSIZ+DSKSIZ ; RESERVE THE BUFFER BFUP ZBFEND =.-2 ; ADDRESS OF LAST CELL IN ZBUF BFUP ; BFUP ; DISK BUFFER FOR ALL OTHER SECTORS BFUP ABUF: .WORD 0 ; ROS FILE ID I ; # CHARACTERS RCOM ; PC FOR RETURN RCOM ; ADD. OF STRING (WRD1) STATUS ON RETURN RCOM ; PC FOR RETURN <=SP VALUE ON RETURN RCOM ; NOTE: ASCBIN MOVES PC DOWN ONE AND SAVES R0-R5 ON RCOM ; STACK. RCOM ; JVB #1,DTFUN ; TAPE WRITE DKS200: CMP R3,#-1 ; DO STUFF BNE DKS220 ; BRANCH FOR DISK TO TAPE JSR PC,DT ; READ TAPE JSR PC,DK ; WRITE DISK BR DKS250 ; TO TO COMMON DKS220: JSR PC,DK ; READ DISK JSR PC,DT ; WRITE TAPE DKS250: ADD #BUFSIZ/256.,R1 ; ADJUST TAPE BLOCK # ADD #BUFSIZ/64.,R0 ; ADJUST DISK SECTOR #. CMP R0,#MAXSK******************************************************************BFUP ; *BFUP ; THIS CODE TAKES CARE OF SFTTING THE ERROR WORD. THE LOW BYTE WILL *BFUP ; CONTAIN THE BFUP STATUS AND THE HIGH BYTE THE DISCIO STATUS, IF *BFUP ; APPLICABLE. AFTER THE ERROR STATUS IS SET, CONTROL IS TRANSERED *BFUP ; TO ENDBF TO RETURN TO THE USER *BFUP ; L BFUP .BYTE 0 ; USE SPECIFIED SECTOR BFUP AFUN: .BYTE 0 ; TRANSFER FUNCTION BFUP .WORD 0,0,0 ; RESERVED FOR DISCIO USE BFUP ASEC: .WORD 0 ; SECTOR # OF TRANSFER BFUP .WORD DSKSIZ ; # WORDS TO TRANSFER - 1 SECTOR BFUP .=.+DSKSIZ+DSKSIZ ; RESERVE THE BUFFER BFUP ABFEND =.-2 ; M RCOM ; ERROR CODE FOR RETURN RCOM ; VALUE RCOM ; PC FOR RETURN <=SP RCOM ; RCOM NUMFLD =. ; ENTRY POINT RCOM MOV NTH-CSAVE(SP),-(SP) ; PUT FIELD # ON STACK FOR SCAN.RCOM NEC ; ALL DONE (> MAX SEC#)? BGE DKSEND ; YES CMP R1,#512. ; FULL TAPE? BLT DKS200 ; NO - GET NEXT CLR R1 ; YES - GET NEXT TAPE UNIT INC DTUNIT ; BR DKS200 ; OK - GO FOR MORE DKSTER: MOV #MES4,KBADD ; TAPE ERROR BR DKSERR ; GO TO COMMON CODE DKSDER: MOV #MES3,KBADD ; DISK ERROR DKSERR: MOV #KBLIST,-(SP) ; WRITE ERROR O *BFUP ;***********************************************************************BFUP BFER12: INCB (R5) ; ONLY 127 OPEN (READ) ELEMENTS/FILE BFUP BFER11: INCB (R5) ; ELEMENT NOT FREE BFUP BFER10: INCB (R5) ; SPECIFIED ELEM CAN NOT BE CLOSED BFUP BFER09: INCB (R5) ; DISK I/O ERROR BFUP BFER08: INCB (R5) ; BFUP IS BUSY - ONLY ONE USER AT A TIMEBFUP BFER07: INCBPADDRESS OF LAST CELL IN ABUF. BFUP .PAGE ; BFUP ;***********************************************************************BFUP ; *BFUP ; BFINIT IS USED TO INITIALIZE A ROS FILE INTO A BFUP FILE. *BFUP ; THIS IS DONE BY INITIALIZING THE DIRECTORY AND ENTRY 0 IN IT. *BFUP ; THE PROCEEDURE IS: *BFUPQ MOV STRING-CSAVE+2(SP),-(SP); PUT STRING ADD ON STACK. RCOM MOV NC-CSAVE+4(SP),-(SP) ; PUT # CHAR ON STACK. RCOM JSR PC,SCAN ; FIND NTH FIELD. RCOM CLR VALUE-CSAVE+6(SP) ; CLEAR VALUE. RCOM TST ERROR-CSAVE-2(SP) ; REQUEST COMPLETED? RCOM BEQ NUMA10 ; YES RCOM MOV ERROR-CSAVE-2(SP),ERROR-CSAVE+RMESSAGE EMT TTYOUT ; DKSEND: EMT EXIT ; EXIT ; DISK I/O HERE DK: MOV R0,(R2) ; SET DISK SECTOR #. MOV #DKLIST,-(SP) ; WRITE DISK SECTORS EMT DISCIO ; TST DKERR ; ANY ERRORS BNE DKSDER ; YES - SHUT DOWN RTS PC ; ; DECTAPE I/O HERE DT: MOV R1,(R2) ; SET TAPE BLOCK #. MOV #DTLIST,-(SP) ; READ TAPE BLOCK S (R5) ; ROS FILE FULL BFUP BFER06: INCB (R5) ; REQUEST ELEMENT DOESN'T EXIST BFUP BFER05: INCB (R5) ; ELEMENT ASSIGNED FOR EXCLUSIVE USE. BFUP BFER04: INCB (R5) ; ELEMENT ALREADY IN EXCLUSIVE MODE BFUP BFER03: INCB (R5) ; FILE ALREADY HAS ELEMENT BEING CREATEDBFUP BFER02: INCB (R5) ; THIS ROS FILE NOT BFUP INITIALIZED BFUP BFER01: INCB (R5) ; ROS FILE AS SPECIFIET ; 1) READ SECTOR 0 *BFUP ; 2) IF NOT A BFUP FILE, ZERO SECTORS 1 - 33 *BFUP ; 3) IF A BFUP FILE ONLY ZERO SECTORS IF STATUS BYTE OF COM *BFUP ; BLOCK IS ONE. IF THE STATUS = 0, RETURN TO THE CALLER. *BFUP ; 4) BUILD ENTRY ZERO *BFUP ; *BFUP ; THE FOLLOWING SUBROUTINES ARE USED: PU6(SP) ; NO RCOM NUMA05: ADD #6,SP ; SET ERROR, ADJUST SP, AND RETURN RCOM BR NPRF20 ; BUMPS PC UP 1 ON STACK RCOM ; RCOM NUMA10 =. ; HERE IF NO ERROR. RCOM TST FIELD-CSAVE-2(SP) ; IS THIS A VOID FIELD? RCOM BNE NUMA15 ; NO. RCOM MO EMT DECTAP ; TST DTERR ; ANY ERRORS BNE DKSTER ; YES - SHUT DOWN RTS PC ; .END WD DOESN'T EXIST BFUP BR ENDBF ; GO BACK TO USER BFUP BFERDK: ASL (R5) ; DISK ERR STATUS-SHIFT TO EVEN DIGIT(8)BFUP BR BFER09 ; THEN PUT BFUP ERROR CODE IN LOW BYTE BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; ENDBF IS USED ASXUSHR, POPR, FILECK *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFINIT ; BFUP BFINIT =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE ALL REGISTERS BFUP YV #-2,ERROR-CSAVE+6(SP) ; SET ERROR -2 (VOID FIELD). RCOM BR NUMA05 ; ADJUST SP. RCOM ; RETURN TO CALLER (BUMPS PC ON STACK). RCOM ; RCOM ; HERE IF MUST CONVERT. RCOM ; RCOM NUMA15: MOV (SP)+,(SP) ; BUMP STRING ADDRES[ A COMMON CLOSING FOR ALL BFUP ROUTINES. IT WILL: *BFUP ; 1) RESTORE REGISTER *BFUP ; 2) CLEAR THE BFUP BUSY FLAG *BFUP ; 3) RESTORE TO THE BATCH USER *BFUP ; *BFUP ; THE LINKAGE IS EITHER A 'JMP ENDBF' OR A 'BR ENDBF'. *BFUP ; \ MOV 14.(SP),R5 ; GET ADDRESS OF COM BLOCK INTO R5 BFUP JSR PC,FILECK ; GO MAKE SURE WE HAVE A FILE BFUP BNE INIT10 ; NOT A ROS/BFUP FILE BFUP TSTB BFSTAT(R5) ; IS REINITIALZATION REQUESTED BFUP BEQ INIT99 ; NO. - ALL DONE BFUP INIT10: ; HERE TO ZERO SECTORS 32 - 1 BFUP ; FIRST BUILD ]S DOWN 2 CELLS RCOM MOV (SP)+,(SP) ; RCOM JSR PC,ASCBIN ; GO CONVERT FIELD RCOM MOV (SP)+,VALUE-CSAVE+4(SP) ; PUT RETURNED VALUE IN ARG RCOM TST (SP)+ ; ERROR? RCOM BEQ NPRF20 ; NO - GO RETURN RCOM DEC ERROR-CSAVE(SP) ; YES - SET CODE RCOM BR _ *BFUP ; SUBROUTINES USED: POPR *BFUP ; *BFUP ;***********************************************************************BFUP ENDBF =. ; ENTRY POINT BFUP JSR R5,POPR ; RESTORE ALL REGISTERS BFUP MOV (SP)+,(SP) ; BUMP RETURN ADDRESS OVER ARG ADDRESS. BFUP CLRB BFBUSY `A BUFFER OF ZEROS. BFUP MOV #ZBFEND+2,R1 ; ADDRESS OF LAST WORD +2 TO ZERO. BFUP INIT20: CLR -(R1) ; ZERO THE BUFFER BFUP CMP #ZBUF+BHEAD,R1 ; DONE YET? BFUP BLO INIT20 ; NO. BFUP MOV #ZBUF,DSKADD ; YES - NOW LET'S ZERO THE DISK. BFUP MOVB #WFUN,ZFUN ; SET DISK FUNCTION BFUP MOaNPRF20 ; DONE - RETURN RCOM .PAGE RCOM ; THIS SUBROUTINE, 'GETCOM', IS USED BY SEVERAL OF THE ROS COMMAND RCOM ; STRING PARSING ROUTINES. ON ENTRY IT EXPECTS THAT R5 CONTAIN THE RCOM ; ADDRESS OF THE NEXT CHARACTER TO BE PROCESSED. R4 CONTAINS THE RCOM ; ADDRESS OF THE END OF THE COMMAND STRING. R0 IS CLEARED. RCOM ; GETCOM BEGINS SCAN WITH THE CHARACTER POINTED TO BY R5 Ac ; CLEAR THE BUSY FLAG BFUP RTS PC ; RETURN TO THE CALLER BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; BFOPEN PROVIDES THE BATCH USER WITH MEANS OF OPENING AN EXISTING *BFUP ; BFUP ELEMENT FOR OUTPUT TO A USERS PROGRAM. IF THE SPECIFIED FIdV #DIRMAX,ZSEC ; SET SECTOR TO TRANSFER -BEGIN WITH 32BFUP INIT30: JSR PC,DISKBF ; GO ZERO A SECTOR BFUP BEQ INIT50 ; NO DISC I/O ERRORS. BFUP CMP #9.,DSKERR ; FILE FULL? BFUP BEQ INIT97 ; YES BFUP BR INIT98 ; ALL OTHER ERRORS. BFUP INIT50: DEC ZSEC ; DECREMENT SECTOR CeND CONTINUES RCOM ; SEARCHING UNTIL THE NEXT COMMA IS FOUND. WHEN THE COMMA IS FOUND, R0 RCOM ; IS INCREMENTED, AND R5 IS BUMPED TO POINT TO THE NEXT CHARACTER(WHICH RCOM ; MAY NOT EXIST). RCOM ; IF A COMMA IS NOT FOUND, THE SEARCH IS HALTED AT THE END OF THE RCOM ; COMMAD STRING. RCOM ; THE STACK IS NOT USED. RCOM ; gLE *BFUP ; IS A ROS/BFUP FILE AND THE REQUESTED ELEMENT CAN BE FOUND, THE # OF *BFUP ; OPEN ELEMENTS IN THE FILE IS INCREMENTED, THE ELEMENT IS MARKED AS *BFUP ; OPEN FOR READ IF AVAILABLE, AND THE STARTING SECTOR AND LENGTH ARE *BFUP ; RETURNED TO THE USER VIA THE COMMUNICATIONS BLOCK. *BFUP ; *BFUP ; SUBROUTINES USED: GETELT, ENDBF, DISKBF, FILECK, PUSHR *BFUP ; hOUNT BFUP BGT INIT30 ; GO ZERO NEW SECTOR IF NOT #0. BFUP BLT INIT99 ; HAVE NOW DONE #0, GO HOME BFUP MOV #ZBUF+BHEAD,R2 ; HERE TO SETUP ENTRY ZERO IN SECTOR 0. BFUP ; R2 HAS ADDRESS OF FIRST WORD. BFUP MOV BFRFIL(R5),(R2)+; SETUP ENTRY 0. FIRST PUT FILE ID IN ITBFUP MOV #1,(R2)+ ; THEN SET # OF NEXT DIRECTORY ENTRY. BFUP i RCOM GETCOM =. ; ENTRY POINT RCOM CLR R0 ; CLEAR FLAG TO COMMA NOT FOUND. RCOM GETC10: CMPB (R5)+,#054 ; IS THIS CHARACTER A COMMA& RCOM BEQ GETC20 ; YES. RCOM CMP R5,R4 ; NO. END OF STRING? RCOM BLO GETC10 ; NO. TRY AGAIN. k *BFUP ; ALL REGISTERS ARE RESTORED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFOPEN ; BFUP BFOPEN =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SZVE ALL REGISTERS l ; AND FILE'S STATUS (0). THE SECTOR OF BFUP CLR (R2)+ ; DIRECTORY ENTRY IS ZERO. BFUP MOV #DIRMAX,(R2)+ ; SECTOR # OF NEXT ELEMENT. BFUP CMP (R2)+,(R2)+ ; SKIP 2 UNUSED WORDS - THEY ARE ZERO. BFUP MOV (PC)+,(R2)+ ; SET TWO WORD FLAG INDICATING FILE IS BFUP .RAD50 /.BF/ ; SET UP FOR BFUP. BFUP MOV (PC)+,(R2)+ ; RCOM TST (R5)+ ; BUMP R5 SO THAT ALWAYS 2 AFTER STRING RCOM BR GETC30 ; YES. RETURN. RCOM GETC20: INC R0 ; SET FLAG TO FOUND. RCOM GETC30: RTS PC ; RETURN TO CALLER RCOM .END ; RCOM oBFUP MOV 14.(SP),R5 ; SAVE COM BLOCK ADD. IN R5. BFUP JSR PC,FILECK ; IS THIS A VALID FILE, ETC. BFUP BNE BFER02 ; NOT A ROS FILE - BAD. BFUP JSR PC,GETELT ; SEE IF WE CAN FIND REQUESTED ELEMENT BFUP BEQ BFER06 ; NOT FOUND BFUP INCB ZBUF+FSTAT ; FOUND IT. SET STATUS AS OPEN IN FILE BFUP BPL OPEN10 ; CAp BFUP .RAD50 /UP./ ; BFUP BR INIT30 ; GO WRITE SECTOR ZERO OUT. BFUP INIT97: JMP BFER07 ; TO FAR FOR BRANCHES BFUP INIT98: JMP BFERDK ; BFUP INIT99: JMP ENDBF ; BFUP .PAGE ; BFUP ;*********************qPLACE. MAINBR:  TSTB  SECMOD  ;  BNE  MAIN31      ; OF ASSEMBLY LOC. COUNTER MAIN33: SUB  @USERPC ,@R4 ; RESULT=RESULT-USER'S PC.  SUB  #2,@R4  ; RESULT = RESULT-2  ASR  @R4   ; SHIFT RESULT RIGHT 1-BIT  BCS  MAIN31  ; ADDRESSING ERROR IF ODD  MOVB  @R4,R0  ; PROPAGATE BYTES SIGN IN R0  CMP  @R4,R0  ; RESULT = R0 ?  BNE  MAIN31  ; NOPE, ADDRESSING ERROR  BR  MAIN3H sN WE OPEN ANY MORE FOR (READ)? BFUP DECB ZBUF+FSTAT ; NO. RESET COUNTER. BFUP BR BFER12 ; AND GO DO ERROR STUFF. BFUP OPEN10: MOVB #STOPEN,(R0) ; SET ELEM. STATUS BFUP ADD #DSTSEC-DSTAT,R0; BUMP R0 TO POINT TO START SECTOR BFUP MOV (R0)+,BFSEC(R5) ; SET START SECTOR INTO COM BLOCK BFUP MOV (R0),BFLNTH(R5) ; SET LENGTH INTO COM BLOCK. BFUP t**************************************************BFUP ; *BFUP ; BFENTR PROVIDES THE USER WITH THE MEANS TO MAKE A NEW ENTRY IN A *BFUP ; BFUP FILES DIRECTORY AND AT THE SAME TIME OPENING THE NEW ELEMENT *BFUP ; AND FILE FOR INPUT FROM THE USERS PROGRAM. *BFUP ; *BFUP ; THE BFUP COMMUNICATIONS BLOCK SPECIFIES THE ELEMENT NAME, TYPEu ; FINAL COMAND PROCESSING .PAGE PAL MAINC0:  ; CONDITION CODE OPERATES, WAIT, HALT, RTI   ;   SINGULAR PROCESSING  CMPB  SAVTERM ,#-5 ; TERMINATOR SEMICOLON ?  BEQ  MAIN3W  ; YES, EXIT  CMPB  SAVTERM ,#-4 ; TERMINATOR CAR-RET?  BEQ  MAIN3W  ; YES, EXIT  INCB  QERROR  ; NO, SET 'Q' ERROR  BR  MAIN3W  ; SET SIZE = 1 .PAGw TSTB R3 ; ALL IN SECTOR 0? BFUP BEQ OPEN20 ; YES BFUP MOVB #WFUN,AFUN ; OUTPUT DIRECTORY SECTOR - ABUF BFUP JSR PC,DISKBF ; GO DO I/O. #ABIUF IN DSKADD. BFUP BNE BFERDK ; ERROR BFUP MOV #ZBUF,DSKADD ; SET ZBUF ADDRESS IFF USED ABUF. BFUP OPEN20: MOVB #WFUN,ZFUN ; HERE TO x, *BFUP ; STATUS, AND ROS FILE ID. THE STATING SETOR IS RETURNED IN THE BLOCK *BFUP ; FOR THE USER'S I/O. *BFUP ; *BFUP ; BFENTR MARKS THE FILE AND ELEMENT AS OPEN FOR INPUT. *BFUP ; *BFUP ; SUBROUTINES USED ARE: PUSHR,POPR, FILECK *BFUP ; ALL REGISTERS ARE RESTOREDyE PAL MAIN3A:  ; TRAP MNEMONIC PROCESSING  CLR  R0   ; R0 = 0  JSR PC, EXPE3 ; CALL EXPRESSION, ; MINIMAL TERMINATOR  TST  REGTYPE  ; EXPRESSION TYPED REGISTER ?  BEQ  MAIN3C  ; NOPE  INCB  RERROR  ; YES, SET REGISTER ERROR  CLR  @R4   ; RESULT = 0 MAIN3C:  TSTB  RSLMOD  BEQ  MAINCA CMPB #-1,RSLMOD  BEQ  MAINCB  ; .GLOBL  IN{OUTPUT SECTOR 0. BFUP JSR PC,DISKBF ; DO IT. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; BFCL| *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFENTR ; BFUP BFENTR =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE ALL REGISTERS BFUP MOV 14.(SP),R5 ; GET ADDRESS OF BFUB BLOCK. }CB  AERROR MAINCA: MOVB  RESULT+1 ,TERROR ; RESULT'S HIGH     ; ORDER BYTE     ; SETS TRUNCATION ERROR  BR  MAIN3H  ; BUILD THE COMAND WORD MAINCB:  JSR PC, RLDBYT  ; GLOBAL ADDITIVE RELOCATION  BR  MAINCA  ; OBJECT CODE 5 .PAGE PAL MAIN3F:  ; RTS MNEMONIC PROCESSING  CLR  R0   ; R0 = 0  JSR PC, EXPE3 ; CALL EXPRESSION, ; MINIMAL RETURN OS PROVIDES THE USER WITH MEANS OF 'UNOPENING' AN ELEMENT. THIS *BFUP ; WILL CHANGE BOTH THE ELEMENT'S AND TASK'S STATUS. IF THE ELEMENT *BFUP ; CAN NOT BE FOUND, AND ERROR CODE WILL BE RETURNED. WHEN CLOSING AN *BFUP ; ELEMENT OPENED BY BFENTR, THE USER MUST SUPPLY THE LENGTH OF THE *BFUP ; ELEMENT. *BFUP ; *BFUP ; SUBROUTINES USED: PUSHR, FILECK, GETELT, DISKB BFUP JSR PC,FILECK ; MAKE SURE ROS/BFUP FILE BFUP BNE ENTA99 ; BRANCH IF NOT A ROS/BFUP FILE BFUP ; ZBUF NOW HAS SECTOR 0 IN IT. BFUP TSTB ZBUF+FSTAT ; CHECK FILE'S STATUS - ONLY ONE WRITE BFUP BMI BFER03 ; AT A TIME. BFUP JSR PC,GETELT ; SEE IF CAN FIND EXISTING ELEMENT. BFUP BEQ ENTA30 ;  BGT  MAIN3G  ; NON-VOID EXPRESSION EXITED  INCB  QERROR  ; QUESTIONABLE SYNTAX MAIN3G: JSR PC, RFORCE ; CALL REGISTER FORCE MAIN3H: BISB  @R4,@R6  ; SET THE REGISTER FIELD     ; WITHIN THE COMAND WORD  BR  MAIN3W  ; COMPLETE COMAND PROCESSING .PAGE PAL MAINC1:  ; UNARY MNEMONICS PROCESSED  JSR PC, SYNTAX ; CALL THE SYNTAX ANALYZER  BEQ  MAIN3V  F *BFUP ; *BFUP ; ALL REGISTERS ARE RESTORED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFCLOS ; BFUP BFCLOS =. ; ENTRY POINT BFUP JSR SKIP NEXT BLOCK IF NOT FOUND BFUP TSTB (R0) ; IS ELEMENT FREE BFUP BNE BFER11 ; NO - CAN'T DELETE IT THEN. BFUP MOVB #STDELT,(R0) ; SET DELETED STATUS-R0 POINTS FROM GET BFUP TSTB R3 ; ALL IN SECTOR ZERO? BFUP BEQ ENTA30 ; YES BFUP MOVB #WFUN,AFUN ; NO - MUST WRITE THIS SECTOR TO DISK. BFUP ; ONE FIELD ENCOUNTERED MAIN3L: INCB  QERROR  ; QUESTIONABLE SYNTAX  MOV  #37,@R5  ; INDIRECT IMMEDIATE MODE  MOVB  #2,@R3  ; MAXIMIZE SIZE TO 2 WORDS  BR  MAIN3U  ; CLEAR THE NEXT OBJECT WORD     ; COMPLETE CONSTRUCTING     ; THE COMAND WORD .PAGE PAL MAIN3Q:  ; JSR MNEMONIC PROCESSING  CLR  R0  JSR PC, EXPE2  BGT  MAIN3R  INCB  R5,PUSHR ; SAVE THE REGISTERS BFUP MOV 14.(SP),R5 ; PUT ADDRESS OF COM BLOCK INTO R5 BFUP JSR PC,FILECK ; IS THE FILE OK BFUP BNE BFER02 ; NO.-NOT BFUP. BFUP JSR PC,GETELT ; SEE IF WE CAN FIND THE ELEMENT. BFUP BEQ BFER06 ; NOT FOUND BFUP CMPB #STOPEN,(R0) ; STATUS = OPEN-READ  JSR PC,DISKBF ; SECTOR # STILL SET - GO DO I/O BFUP BNE BFERDK ; NO-ERROR. BFUP ENTA30: ; OLD ELEMENT NOW DELETED BFUP MOV #ZBUF+BHEAD,R2 ; GET ADDRESS FOR ZBUF USE BFUP MOVB ZBUF+FDIRSC,R0 ; IS EVERYTHING IN SECTOR 0? BFUP BEQ ENTA50 ; YES BFUP MOV R0,ASEC ; NO-MUS QERROR MAIN3R: JSR PC, RFORCE  SWAB  @R4   ; SWAP RESULT'S BYTES  ASR  @R4  ASR  @R4  BIS  @R4,@R6  CMPB  #',,@CURBYTE  BNE  MAIN3L  JSR PC, ITEM  BLE  MAINC1  INCB  ITEMIN  BR  MAINC1 .PAGE PAL MAINC2:  ; BINARY MNEMONICS PROCESSED  JSR PC, SYNTAX ; CALL SYNTAX ANALYZER  BGT  MAIN3V  ; TWO FIELDS ENCOUNTERED      BFUP BEQ CLSA30 ; YES BFUP CMPB #STXUSE,(R0) ; NO - THEN IS IT OPEN-WRITE BFUP BNE BFER10 ; NO - ERROR BFUP MOV BFLNTH(R5),DLENTH-DSTAT(R0); PUT ELEM. LEN IN DIRECTORY BFUP ADD BFLNTH(R5),ZBUF+FNSEC ; AND ADD TO FILE SECTOR POINTERBFUP BICB #STFWRT,ZBUF+FSTAT ; REMOVE WRITE STATUS ON FILE BFUP INCB ZBT READ IN DESIRED SECTOR BFUP MOV #ABUF+BHEAD,R2 ; GET ADDRESS FOR ABUF USE BFUP MOV #ABUF,DSKADD ; SET BUFFER ADD INTO I/O LIST. BFUP MOVB #RFUN,AFUN ; SET READ FUNCTION BFUP JSR PC,DISKBF ; READ IN THE SECTOR. BFUP BNE BFERDK ; BRANCH IF DISK I/O ERRORS. BFUP ENTA50: MOVB ZBUF+FNDNUM,R1 ; GOT CURRENT DIR. SECTOR - R0 POINTS TOBFUP  ; NOT TWO FIELDS FOUND  INCB  QERROR  ; QUESTIONABLE SYNTAX  MOV  #2727,@R5  ; CONSTRUCT DEFAULT COMMAND     ; USE TWO IMMEDIATE MODES  MOVB  #4,@R3  ; SIZE = 4  CLR  TBBUF+4  ; TBBUF(4,5) = 0 MAIN3U: CLR  TBBUF+2  ; TBBUF(2,3) = 0 MAIN3V: BIS  @R5,@R6  ; PLACE THE ADDRESSING BITS     ; INTO THE COMAND WORD MAIN3W: INCB  @R3   ; SIZE = SIZE+2  INCB  @R3 MAIN3X: MOV  (R6UF+FNDNUM ; UPDATE DIRECTORY # COUNTER BFUP BNE CLSA20 ; SKIP IF DIR. NOT FULL BFUP MOV #-1,ZBUF+FDIRSC ; DIRECTORY FULL - SET DIR SEC=-1 BFUP BR CLSA40 ; BFUP CLSA20: BITB #7,ZBUF+FNDNUM ; DIRECTORY NOT FULL - IS SECTOR FULL? BFUP BNE CLSA40 ; NO. BFUP INC ZBUF+FDIRSC ; YES - INCREMENT DIRECTORY  BIC #177770,R1 ; IT - LET'S BUILD THE ENTRY NOW - WE BFUP ASL R1 ; KNOW WE HAVE ROOM-ALWAYS UPDATE IN BFUP ASL R1 ; BFCLOS. R1 IS SET TO ADDRESS IN BUFFBFUP ASL R1 ; BFUP ASL R1 ; BFUP ADD R2,R1 ; ADD ADDRESS TO POINT TO CORRECT BUFFERBFUP ; R1 NOW POINT)+,TBBUF ; TBBUF(0) = COMMAND WORD JMP EXIT  ; EXIT THE MNEMONIC PROCESSOR .PAGE PAL EOFFLG:  ; END-OF-FILE OR END-OF-MEDIA FLAGS PROCESSED ;IS THIS THE EOD OF THE 1ST ;DATA SET OF TWO DATA SETS? TSTB SICNT ;NON 0 INDICATES TWO DATA SETS BEQ EOF1  ;ONLY ONE DATA SET CMP #SILB2,SILB BEQ EOF1  ;ALREADY ON 2ND DEC SITAPE ;LAST TAPE BNE EOF4  ;NO MOV SILB ,SECTOR COUNTBFUP BR CLSA40 ; BFUP CLSA30: DECB ZBUF+FSTAT ; HERE FOR OPEN-READ BFUP CLSA40: CLRB (R0) ; CLEAR STATUS IN DIRECTORY BFUP MOVB #WFUN,ZFUN ; ALL ENTRIES DONE - SET TO DO WRITE. BFUP TST R3 ; TO DISK - FIRST, ALL IN SECTOR 0? BFUP BEQ CLSB20 ; YES BFUP MOVB #WFUN,AFS TO WORD OF BUFF TO STARTBFUP MOV R5,R4 ; GET ADD OF COM BLOCK BFUP CMP (R4)+,(R4)+ ; ADD 4 TO POINT TO NAME WR01 BFUP MOV (R4)+,(R1)+ ; MOVE WORD 1 OF ELEM NAME BFUP MOV (R4)+,(R1)+ ; MOVE WORD 2 BFUP MOV (R4)+,(R1)+ ; SET TYPE OF ELEMENT BFUP MOVB #STXUSE,-2(R1) ; SET STATUS OF ELEMENT IN DIRECTORY BFUP EM-(R6) ;CLOSE EMT CLS TSTB PAPASS BNE EOF2 CMPB MAXPASS ,PASS ;NOT PARAMETER FILE. BNE EOF3 ;PARAMETER FILE EOF2: MOV SILB ,-(R6) ;RELEASE DATA SET. EMT RLS EOF3: MOV #SILB2,SILB ;SWITCH TO 2ND MOV #SIFB2,SIFB ;DATA SET. MOV SITAP2 ,SITAPE ;TAPE COUNT CMPB #1,PASS ;OPEN ALREADY BNE EOF5  ;DONE FOR 1ST PASS JMP SETP4 EOF1: DEC SITAPE ;LAST TAPE BNE EOF4  ;NO ;SIMULATE .END INC ERRSUM UN ; SET ABUF FOR WRITE ALSO. BFUP JSR PC,DISKBF ; NO - I/O LIST SET UP FROM GETELT BFUP BNE BFERDK ; ERROR BFUP MOV #ZBUF,DSKADD ; SET ZBUF ADD. ONLY IF USED ABUF. BFUP CLSB20: JSR PC,DISKBF ; HERE TO DO SEDTOR 0. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE. T $GTIME ; GET HOUR, MIN, & SEC OF CREATION BFUP MOVB (SP)+,(R1)+ ; SET HOUR BFUP MOVB (SP)+,(R1)+ ; SET MIN BFUP MOVB (SP)+,(R1)+ ; SET SEC BFUP EMT $GDATE ; GET DAY, MONTH, & YEAR OF CREATION BFUP MOVB (SP)+,(R1)+ ; SET YEAR BFUP MOVB (SP)+,(R1)+ ; SET DAY ;DECLARE AS ERROR MOV #1,JMPADR ;FOR TRANSFER ADDR. CLRB BINOUT ;ON BINARY. JSR PC,EBBUF JMP SIMEND EOF4: MOV SILB ,-(R6) ;CLOSE EMT CLS EOF5: JMP SETP0 .PAGE PAL ERRTAB:   ; ASSEMBLY ERROR TABLE     ; SINGLE WORD ENTRIES :     ; ASCII CHARACTER (LOW BYTE)     ; ERROR INDICATOR (HIGH BYTE)  .BYTE  'L   ; INPUT LINE BUFFER OVERFLOW L BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; THE SUBROUTINE GETELT IS USED BY BFUP TO SCAN A SPECIFIED BFUP *BFUP ; DIRECTORY FOR A GIVEN ELEMENT (NAME & TYPE). *BFUP ; *BFUP ; INPUT TO GETELT IS:  BFUP MOVB (SP)+,(R1)+ ; SET MONTH BFUP MOV ZBUF+FNSEC,(R4) ; SET STARTING SECTOR INTO COM BLOCK BFUP MOV (R4),(R1)+ ; AND INTO ENTRY BFUP CLR (R1) ; CLEAR LENGTH ENTRY IN DIRECTORY BFUP BISB #STFWRT,ZBUF+FSTAT ; MARK FILE AS WRITE IN PROG. BFUP TST R0 ; JUST SECTOR 0? BFUP BEQ ERROR: .BYTE  0  .BYTE  'P   ; PHASE ERROR PERROR: .BYTE  0  .BYTE  'Q   ; QUESTIONABLE SYNTAX QERROR: .BYTE  0  .BYTE  'A   ; ADDRESSING ERROR AERROR: .BYTE  0  .BYTE  'R   ; REGISTER ERROR RERROR: .BYTE  0  .BYTE  'D   ; DOUBLE DEFINITION REFERENCED DERROR: .BYTE  0  .BYTE  'M   ; MULTIPLY DEFINED LABEL MERROR: .BYTE  0  .BYTE  'B   ; BOUNDING ERROR BERROR: .BYTE  0  *BFUP ; R5 = ADDRESS OF COMMUNICATIONS BLOCK *BFUP ; SECTOR ZERO IN THE ZBUF *BFUP ; DISKIO LIST SETUP FOR ROS FILE *BFUP ; *BFUP ; OUTPUT FROM GETELT IS: *BFUP ; R3 = SECTOR # CONTAINING SPECIED ELEMENTS DIRECTORY ENTRY *ENTA70 ; NO - HERE TO PUT OUT DIRECTORY SECTOR.BFUP MOVB #WFUN,AFUN ; SET FUNCTION FOR A WRITE BFUP JSR PC,DISKBF ; AND WRITE IT OUT BFUP BNE BFERDK ; ERROR BFUP ENTA70: MOV #ZBUF,DSKADD ; SET UP TO DO SECTOR 0 BFUP MOVB #WFUN,ZFUN ; SET FUNCTION FOR A WRITE BFUP JSR PC,DISKBF ; AND WRITE SECTOR 0 OUT.  .BYTE  'I   ; ILLEGAL CHARACTER ERROR IERROR: .BYTE  0  .BYTE  'N   ; NUMBER ERROR NERROR: .BYTE  0  .BYTE  'T   ; TRUNCATION ERROR TERROR: .BYTE  0  .BYTE  'U   ; UNDEFINED SYMBOL REFERENCED UERROR: .BYTE  0 MAXERR: ERROR:  .BYTE  0 SICNT: .BYTE 0   ; NON 0 INDICATES 2 INPUT FILES. ; ; SITAPE: .WORD 0 ;NUMBER OF TAPES CURRENT FILE PAPASS: .WORD 0 ; NON-0 INDICATES PARAMETER FILE SITAP1: .WORD 0 ;NUMBER OFBFUP ; R2 = ADDRESS OF LAST CELL IN LAST EXAMED BUFFER (ZBUF OR ABUF) *BFUP ; R0 = ADDRESS IN BUFFER OF STATUS BYTE OF ENTRY IF FOUND *BFUP ; = 0 IF ELEMENT NOT FOUND *BFUP ; Z STATUS BIT SET IFF ELEMENT NOT FOUND *BFUP ; ABUF CONTAINS SECTOR WITH THE ELEMENT'S DIRECTORY ENTRY (UNLESS*BFUP ; ENTRY FOUND IN SECTOR 0. *BFUP ;  BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE BFUP ENTA99: JMP BFER02 ; TO FAR FOR A BRANCH BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; BFDELT PROFICES THE  TAPES FILE ONE. SITAP2: .WORD 0 ; NUMBER OF TAPES IN FILE 2 CONTOP: .WORD 0 ;TOP OF .CSECT TABLE USRTOP: .WORD 0 ;TOP OF UST STKBOT: .WORD 0 ;1ST ADDRESS ABOVE STACK RESULT: .WORD 0 ;EXPRESSION ACCUMULATOR LOPASS: .WORD 0 QUANTITY:.WORD 0 ;ITEM'S QUANTITATIVE VALUE PAGING: .WORD 0 ;LINE COUNTER (OCTAL), MODULO   ;ONE PAGE (52. LINES) PAGCNT: .WORD 0 ;CUMULATIVE PAGE COUNTER (OCTAL) LINENO:  .WORD 0 ;ASSEMBLER LINE NUMBER FOR UPDATE MAXLINES:.WORD  *BFUP ; SUBROUTINES USED: DISKBF *BFUP ; *BFUP ; ALL UNUSED REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP GETELT =. ; ENTRY POINT BFUP BATCH USER WITH A MEANS TO MARK AN ELEMENT AS *BFUP ; DELETED. AN ERROR CODE IS SET IF THE ELEMENT IS NOT FOUND. *BFUP ; NOTE: A DELETED ELEMENT AND ITS DIRECTORY ENTRY STILL EXIST. *BFUP ; BFPACK MUST BE USED TO COMPRESS THE FILE. *BFUP ; *BFUP ;SUBROUTINES USED: GETELT, FILECK, PUSHR, DISKBF *BFUP ; 70 ;MAXIMUM NUMBER LINES PER PAGE LISTON: .WORD 0 ;0 = LIST AS USUAL, 1 = SUPPRESS NON-ASSEMBLY LISTKEY:.WORD 0 ;0 = PRINT CURRENT LINE, 1 = DON'T PRINT LINE LASTLN: .WORD 0 BASE08: .WORD 0 ;OCTAL NUMBER CONSTRUCTION BOPASS: .WORD 0 BASE10: .WORD 0 ;DECIMAL NUMBER CONSTRUCTION TITLEA: .WORD 0 ;TITLE OF OBJECT MODULE TITLEB: .WORD 0 ;FROM .TITLE OR DEFAULT   ;.MAIN. ABSPC: .WORD 0 ;ABSOLUTE SECTION PC STPASS: .WORD 0 USERPC: .WORD 0 ;ADDR OF DOTS VALUE WORD MOV #ZBUF+FID+FFLAG2+2-FID,R0 ; PUT ADDRESS OF ENTRY 1, BFUP ; SECTOR 0 INTO R0 BFUP MOV #ZBFEND,R2 ; ADDRESS OF LAST WORD IN BUFFER BFUP CLR R3 ; SECTOR # OF SEARCH BFUP GETA10: CMP (R0)+,BFELN1(R5); DOES FIRST TRIAD MATCH? BFUP BNE GETA20 ; NO BFUP CMP (R0)+,BFELN2(R5); YES. DOE *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFDELT ; BFUP BFDELT =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE THE REGISTERS BFUP MOV 14.(SP),R5  REGTYP: .WORD 0 ;REGISTER TYPING INDICATOR TSTORE: .WORD 0 .EVEN TBBUF: .BYTE 0 ; TEMPORARY BINARY BUFFER - MUST HAVE .BYTE 0 ; A EVEN BOUNDARY. .BYTE 0 .BYTE 0  .BYTE  0  .BYTE  0 DECNUM: .BYTE  0   ; DECIMAL NUMBER INDICATOR FRCABS: .BYTE 0   ; NON-0 IF A FORCED TO @#A    ; SYMBOL TABLE FLAG BIT DEFINITIONS BYTFLG  =  1   ; BYTE ENABLE FLAG, BIT 0 REGFLG  =  1 S SECOND TRIAD? BFUP BNE GETA30 ; NO. BFUP CMPB 1(R0),BFTYPE(R5); YES. DOES TYPE? BFUP BNE GETA30 ; NO BFUP CMPB (R0),#STDELT ; YES - DELETED ELEMENT? BFUP BEQ GETA30 ; YES- SKIP IT THEN. BFUP CLZ ; FORCE STATUS BIT FOR RETURN BFUP  ; GET ADDRESS OF COM BLOCK BFUP JSR PC,FILECK ; IS IT A ROS/BFUP FILE? BFUP BNE BFER02 ; NOT A BFUP FILE - BAD! BFUP JSR PC,GETELT ; SEE IF WE CAN FIND THE ELEMENT BFUP BEQ BFER06 ; NOT FOUND BFUP TSTB (R0) ; IS ELEMENT FREE BFUP BNE BFER11 ; NO - CAN'T DELETE IT THEN   ; REGISTER FLAG, BIT 0 LABFLG  =  2   ; LABEL FLAG, BIT 1 REDEF =  2   ; PERMANENT SYMBOL REDEFINED. MDFLAG  =  377   ; MULTIPLE DEFINED FLAG, IN .CSECT BYTE. DEFFLG  =  10   ; DEFINED FLAG, BIT 3 ASMDIR  =  10   ; ASSEMBLY DIRECTIVE FLAG, BIT 3 RELFLG  =  40   ; RELOCATABLE FLAG GLBFLG  =  100   ; GLOBAL FLAG LOSTAT  =  -15   ; LISTED OUTPUT STATUS'S OFFSET LOMODE  =  0   ; LIST RTS PC ; YES - ALL DONE RETURN TO USER. BFUP GETA20: TST (R0)+ ; INCREMENT R0 BY 2 BFUP GETA30: ADD #BFLNTH-DSTAT+4,R0 ; BUMP R0 TO NEXT ENTRY BFUP CMP R0,R2 ; OR ARE WE OUT OF THE BUFFER? BFUP BLO GETA10 ; NOPE. PROCEED WITH SEARCH BFUP MOV #ABUF+BHEAD+DNAME1,R0 ; YUP. SET R0=ADD OF FIRST ENTRYBFUP ; IN ABU BFUP MOVB #STDELT,(R0) ; SET ELEMENTS STATUS AS DELETED. BFUP TSTB R3 ; EVERYTHING IN SECTOR ZERO? BFUP BEQ BFDL20 ; YES. BFUP MOVB #WFUN,AFUN ; WRITE DIRECTORY SECTOR OUT. DISCIO BFUP JSR PC,DISKBF ; LIST ALL SET UP FROM GETELT BFUP BNE BFERDK ; DISCIO ERROR BFUP MOV #ZBUF,DSKADD ; ED OUTPUT MODE EOF  =  100   ; END-OF-FILE MASK STKSIZ  =  200.   ; MAXIMUM SIZE OF STACK     ; DURING PASS 1. ALL OF     ; FREE CORE IS AVAILABLE     ; IN SUBSEQUENT PASSES. REL1  =  0 REL2  =  0 ABS1  =  127401 ABS2  =  7624 SIMODE  =  0   ; SOURCE INPUT MODE BOMODE  =  3   ; BINARY OUTPUT MODE STHFSZ  =  361 GSDCMD  =  1 ASCFLG  =  410 CSCFLG  =  450 TRNCMD  =  1400 GSDEND  =  2 SYMDF BFUP MOV #ABFEND,R2 ; SET R2 = ADDRESS OF ABUF LAST WORD BFUP INC R3 ; ADD 1 TO R3 (SECTOR COUNTER BFUP CMP R3,#DIRMAX ; HAVE WE CHECKED ALL SECTORS BFUP BLT GETA50 ; NOT YET BFUP CLR R0 ; YES. R0 = 0 SINCE NOTHING FOUND BFUP RTS PC ; RETURN BFUP GETA50: MOV SET ADD. OF ZBUF INTO I/O LIST. BFUP BFDL20: MOVB #WFUN,ZFUN ; HAVE TO DO THIS TWICE BFUP JSR PC,DISKBF ; NOW DO SECTOR ZERO. BFUP BNE BFERDK ; DISK I/O ERROR BFUP BR ENDBF ; ALL DONE - RETURN TO USER. BFUP .PAGE BFUP ;***********************************************************************BFUPIR  =  2000 OBJEND  =  6 RSTFLG  =  227 RDCMD  =  4   ; READ COMMAND WTCMD  =  1   ; WAIT COMMAND WRCMD  =  2   ; WRITE COMMAND INCMD  =  6   ; INITIALIZE COMMAND OPN = 16 ;OPEN COMMAND CLS = 17 ;CLOSE COMMAND DLT = 21 ;DELETE COMMAND RLS = 7 ;RELEASE COMMAND ;ERROR MESSAGE CODES ("S" ERRORS) ; ERR1 = 2200 ;TOO MANY .CSECT'S ERR2 = 2201 ;TOO MANY NESTED CONDITIONALS ERR3 = 2202 ;OUTPUT EOD ON .WRITE ERR4 = 2203 ;IL #ABUF,DSKADD ; SET BUFFER ADDRESS FOR TRANSFER BFUP MOVB #RFUN,AFUN ; SET STATUS FOR READ BFUP MOV R3,ASEC ; SET SECTOR # BFUP JSR PC,DISKBF ; GO READ SECTOR BFUP BEQ GETA10 ; NO ERRORS - GO PROCESS THIS BUFFER BFUP GETA99: TST (SP)+ ; FIX STACK - DISK I/O ERROR BFUP JMP BFERDK ; TO FAR FOR A BRANCH  ; *BFUP ; THIS CODE TAKES CARE OF SFTTING THE ERROR WORD. THE LOW BYTE WILL *BFUP ; CONTAIN THE BFUP STATUS AND THE HIGH BYTE THE DISCIO STATUS, IF *BFUP ; APPLICABLE. AFTER THE ERROR STATUS IS SET, CONTROL IS TRANSERED *BFUP ; TO ENDBF TO RETURN TO THE USER *BFUP ; *BFUP ;***************************************LEGAL SWITCH  ;TOO MANY SWITCHES  ;ILLEGAL SWITCH VALUE  ;TOO MANY SWITCH VALUES ERR5 = 2204 ;TOO MANY OUTPUT FILES ERR6 = 2205 ;TOO MANY INPUT FILES ERR7 = 2206 ;INPUT FILE MISSING ERR8 = 2207 ;EOD OR DEVICE ERROR ON  ;OUTPUT .TRAN OR DEVICE  ;ERROR ON INPUT .TRAN FF  =  014   ; ASCII FORMFEED CR  =  015   ; ASCII CARRIAGE-RETURN LF  =  012   ; ASCII LINEFEED TAB  =  11   ; ASCII HORIZONTAL TAB SCLAS0  =  0 SCLAS1  =  40 SCLAS2  =   BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; THIS SUBROUTINE, FILECK, IS USED BY ALL BFUP ENTRY POINTS TO: *BFUP ; 1) INSURE THAT BFUP IS AVAILABL FOR USE *BFUP ; 2) READ SECTOR 0 INTO ZBUF, THUS INSURING THAT THE SPECIFIED *BFUP ; ROS FIL********************************BFUP BFER12: INCB (R5) ; ONLY 127 OPEN (READ) ELEMENTS/FILE BFUP BFER11: INCB (R5) ; ELEMENT NOT FREE BFUP BFER10: INCB (R5) ; SPECIFIED ELEM CAN NOT BE CLOSED BFUP BFER09: INCB (R5) ; DISK I/O ERROR BFUP BFER08: INCB (R5) ; BFUP IS BUSY - ONLY ONE USER AT A TIMEBFUP BFER07: INCB (R5) ; ROS FILE FULL BFUP BFER 100 SCLAS3  =  140 SCLAS4  =  200 SCLAS5  =  240 SCLAS6  =  300 SCLAS7  =  340 LONGLINE =  1 DLTMSK = 100 TXTDIR  =  3 RLDCMD  =  4  ; THESE REFER TO RLD2.1 =  1  ; RLD COMMANDS RLD2.2 =  2  ; AS GIVEN IN LINK RLD2.3 =  3  ; LOADER SPEC RLD2.4 =  4 RLD2.5 =  5 RLD2.6 =  6 RLD3.1  =  7 RLD3.2  =  10 RLD3.3 = 11 RLD4.1 = 12  ; .CSECT RELOCATION RLD4.2 = 14  ; .CSECT DISPLACED RELOCATION RLD4.3 = E IS DEFINED IN ROS. *BFUP ; 3) SETING THE STATUS BITS & ROTO 1 IF THE FILE HAS NOT BEEN *BFUP ; INITIALIZED AS A BFUP FILE. IF THE FILE IS INITIALIZED, RO *BFUP ; IS SET TO 0 AND THE STATUS BITE ARE SET ACCORDINGLY. *BFUP ; ERROR EXITS ARE TAKEN IF ITEMS 1 OR 2 ARE NOT CORRECT. *BFUP ; ONLY REGISTER R0 IS USED AND NOT RESTORED. *BFUP ; 06: INCB (R5) ; REQUEST ELEMENT DOESN'T EXIST BFUP BFER05: INCB (R5) ; ELEMENT ASSIGNED FOR EXCLUSIVE USE. BFUP BFER04: INCB (R5) ; ELEMENT ALREADY IN EXCLUSIVE MODE BFUP BFER03: INCB (R5) ; FILE ALREADY HAS ELEMENT BEING CREATEDBFUP BFER02: INCB (R5) ; THIS ROS FILE NOT BFUP INITIALIZED BFUP BFER01: INCB (R5) ; ROS FILE AS SPECIFIED DOESN'T EXIST BFUP BR ENDBF ; GO BACK TO U15  ; .CSECT ADDITIVE RELOCATION RLD4.4 = 16  ; .CSECT ADDITIVE DISPLACED RELOCATION TTYCOD = 2 LSPCOD = 4  .EVEN   ; PAGE MESSAGE BUFFER PAGBUF: .WORD 52 ;MAX BYTE COUNT  .WORD  00   ; STATUS(HI) MODE(LO)  .WORD 52   ; ACTUAL BYTE COUNT  .BYTE  CR,LF,FF  ; CR-FF SEQUENCE .ASCII /   PAGE XXXXX / DATEXX: .ASCII /MM-DD-YY / TIMEXX: .ASCII /HH:MM:SS:XX /  .BYTE  CR,LF,LF  ; CR-LF-LF SEQUENCE *BFUP ;***********************************************************************BFUP FILECK =. ; ENTRY POINT BFUP CLR (R5) ; CLEAR BFUP COM BLOCKS ERROR WORD BFUP TSTB BFBUSY ; IS BFUP IN USE BFUP BNE FLCK98 ; YES - ERROR BFUP INCB BFBUSY ; SET BFUP BUSY FLAG BFUP CLR ZSEC SER BFUP BFERDK: ASL (R5) ; DISK ERR STATUS-SHIFT TO EVEN DIGIT(8)BFUP BR BFER09 ; THEN PUT BFUP ERROR CODE IN LOW BYTE BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; ENDBF IS USED AS A COMMON CLOSING FOR ALL BFUP ROUTINES. IT WILL: *BFUP ; 1) PRGSEC: .BYTE 0  ;USED IN EXPRESSION SUBROUTINE    ;TO MAINTAIN .CSECT ID OF    ;PREVIOUS RELOCATABLE SYMBOL  .EVEN SAVTERM: .WORD  0 BOCSUM: .WORD  0   ; USED FOR CONSTRUCTING THE     ; BINARY OUTPUT CHECKSUM SRCIN: .WORD 0 JMPADR: .WORD  0   ; RETAINS THE EFFECTIVE JUMP     ; ADDRESS FOR THE BINARY     ; OUTPUT'S TERMINAL BLOCK HINDEX: .WORD  0   ; ADDRESS OF SYMBOL'S ID/FLAG WORD. BYTCON  =  ; SET SETOR NUMBER ZERO IN DISK ADDRESS.BFUP MOV #ZBUF,R0 ; GET ADDRESS OF BUFFER FOR SECTOR ZERO BFUP MOVB #RFUN,ZFUN ; SET SECTOR 0 FOR READ BFUP MOV 2(R5),(R0) ; SET BOTH BUFFERS WITH FILE ID. BFUP MOV 2(R5),ABUF ; BFUP MOV R0,DSKADD ; SET BUFFER ADDRESS FOR TRANSFER BFUP JSR PC,DISKBF ; READ IN SECTOR 0  RESTORE REGISTER *BFUP ; 2) CLEAR THE BFUP BUSY FLAG *BFUP ; 3) RESTORE TO THE BATCH USER *BFUP ; *BFUP ; THE LINKAGE IS EITHER A 'JMP ENDBF' OR A 'BR ENDBF'. *BFUP ; *BFUP ; SUBROUTINES USED: POPR  .-10  ; TABLE OF MOD-40 'B' CHARACTER     ; CONSTANTS USED BY THE     ; SEARCH SUBROUTINE IN     ; RELATION TO THE BYTE     ; ENABLED SYMBOLS.  .WORD  6200  ; 'B', 4-TH CHAR. POSITION  .WORD  120   ; 'B', 5-TH CHAR. POSITION BYTCMD: .WORD  0   ; RETAINS THE EFFECTIVE     ; 'B' CHARACTER CONSTANT     ; DURING THE SYMBOL TABLE     ; SEARCH. CURLIST: .WORD  0    BFUP BEQ FLCK10 ; NO DISK I/O ERRORS. BFUP CMP #7,DSKERR ; WAS THIS A REAL ROS FILE? BFUP BEQ FLCK99 ; NO DISK I/O ERROR - ALL IS AOK. BFUP BR GETA99 ; YES. THEREFORE A REAL I/O ERROR. BFUP FLCK10: CMP FFLAG1(R0),(PC)+; LET'S SEE IF THIS IS A BFUP FILE? BFUP .RAD50 /.BF/ ; FIRST WORD OF FLAG BFUP BNE FLCK30  *BFUP ; *BFUP ;***********************************************************************BFUP ENDBF =. ; ENTRY POINT BFUP JSR R5,POPR ; RESTORE ALL REGISTERS BFUP MOV (SP)+,(SP) ; BUMP RETURN ADDRESS OVER ARG ADDRESS. BFUP CLRB BFBUSY ; CLEAR THE BUSY FLAG BFUP RTS ; THIS POINTER POINTS AT THE     ; CURRENT AVAILABLE BYTE IN     ; THE EFFECTIVE LISTED OUTPUT     ; BUFFER. COFLAG: .WORD  0   ; COMMAND OUTPUT FLAG     ; IF NOT ZERO, THIS WORD     ; CONTAINS THE ADDRESS OF     ; THE EFFECTIVE SOURCE INPUT     ; BUFFER'S HEADER ADDRESS ERRSUM: .WORD  0   ; THE SUM OF ALL THE LINES     ; ERRORED DURING A PASS HUSERPC: .WORD  0   ; ADDR. O ; NOT BFUP FILE BFUP CMP FFLAG2(R0),(PC)+; FIRST WORD OK - IS THE SECOND? BFUP .RAD50 /UP./ ; SECOND WORD OF FLAG. BFUP BNE FLCK30 ; NOT A BFUP FILE BFUP CLR R0 ; IT IS A BFUP FILE SET R0 & STATUS BITSBFUP RTS PC ; RETURN BFUP FLCK30: MOV #1,R0 ; SET R0 AND STATUS BITS - NOT BFUP PC ; RETURN TO THE CALLER BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; BFOPEN PROVIDES THE BATCH USER WITH MEANS OF OPENING AN EXISTING *BFUP ; BFUP ELEMENT FOR OUTPUT TO A USERS PROGRAM. IF THE SPECIFIED FILE *BFUP ; IS A ROS/BFUP FILE AND THE REQUESTED ELEMENT CAN BE FOUNF DOTS FLAG/ID WORD ; CURRENT .CSECT ENTRY POINTERS RELPC:  .WORD  0   ; POINTER TO PC WORD HIRPC:  .WORD  0   ; POINTER TO MAX. PC. WORD SYMBOL: .WORD  0   ; POINTER WHICH CONTAINS THE GLBSY1:  .WORD  0   ; GLOBAL SYMBOL GLBSY2:  .WORD  0   ; NAME DIRCMD:  .WORD  0   ; RLDIR:  .BYTE  0   ; RLD DIRECTIVE RELCNT:  .BYTE  0   ; STORAGE RLDFLG:  .WORD  0 COMAND: .WORD  0   ; DATA WORD UBFUP RTS PC ;FILE RETURN. BFUP FLCK98: TST (SP)+ ; FIX STACK BFUP JMP BFER08 ; TO FAR FOR A BRANCH BFUP FLCK99: TST (SP)+ ; FIX STACK BFUP JMP BFER01 ; TO FAR FOR A BRANCH BFUP .PAGE BFUP ;***********************************D, THE # OF *BFUP ; OPEN ELEMENTS IN THE FILE IS INCREMENTED, THE ELEMENT IS MARKED AS *BFUP ; OPEN FOR READ IF AVAILABLE, AND THE STARTING SECTOR AND LENGTH ARE *BFUP ; RETURNED TO THE USER VIA THE COMMUNICATIONS BLOCK. *BFUP ; *BFUP ; SUBROUTINES USED: GETELT, ENDBF, DISKBF, FILECK, PUSHR *BFUP ; *BFUP ; ALL REGISTERS ARE RESED IN THE     ; CONSTRUCTION OF THE GENERAL     ; ADDRESSING FIELDS (MDR) OF     ; AN INSTRUCTIONS COMMAND WORD CURBYTE: .WORD  0   ; THIS POINTER CONSTANTLY POINTS     ; DIRECTLY AT THE CURRENT BYTE     ; (CHARACTER) BEING PROCESSED     ; WITHIN THE PRESENT SOURCE     ; STATEMENT. PERBOT: .WORD SYMTBB  ;BOTTOM OF PST (HIGHEST ADDRESS) PERTOP: .WORD SYMTBT  ;TOP OF PST (LOWEST ADDRESS) WORD1: .WO************************************BFUP ; *BFUP ; DISKBF IS AN INTERNAL SUBROUTINE USED BY BFUP TO DO DISK I/O USING *BFUP ; THE EMT DISCIO. IT PUSHS THE LIST ADDRESS ON THE STACK, USES THE EMT*BFUP ; AND, ON RETURN, CHECKS THE STATUS. NON-ZERO STATUS WILL CAUSE THE *BFUP ; THE ERROR STATUS TO BE SET IN THE COMMUNICATIONS BLOCK *BFUP ; *BFUP STORED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFOPEN ; BFUP BFOPEN =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SZVE ALL REGISTERS BFUP MOV 14.(SP),R5 ; SAVE COM BLOCK ADD. IN R5. RD 0  ;INPUT TO LINSRCH WORD2: .WORD 0 WORD3: .WORD 0 WORD4: .WORD 0  .EVEN BHADRS: .WORD  SIBUF1  ; ROTATING TABLE OF SOURCE  .WORD  SIBUF2  ; INPUT BUFFER HEADER ADDRESSES     ; BHADRS(0,1) UNCONDITIONALLY     ; POINTS TO THE EFFECTIVE     ; INPUT-OUTPUT BUFFER THRU     ; OUT THE ENTIRE PROCESSING     ; OF THE EFFECTIVE SOURCE IMAGE SIZE:  .BYTE  0   ; SIZE MUST BE EVEN ADDRESS BYTFMT: .BYT; THE LINKAGE IS 'JSR PC,DISKBF'. *BFUP ; *BFUP ;***********************************************************************BFUP DISKBF =. ; ENTRY POINT BFUP MOV #DSKLST,-(SP) ; PUSH DISK I/O LIST ADDRESS BFUP EMT $DSKIO ; USE EMT BFUP BISB DSKERR,1(R5) ; SET DISK BFUP JSR PC,FILECK ; IS THIS A VALID FILE, ETC. BFUP BNE BFER02 ; NOT A ROS FILE - BAD. BFUP JSR PC,GETELT ; SEE IF WE CAN FIND REQUESTED ELEMENT BFUP BEQ BFER06 ; NOT FOUND BFUP INCB ZBUF+FSTAT ; FOUND IT. SET STATUS AS OPEN IN FILE BFUP BPL OPEN10 ; CAN WE OPEN ANY MORE FOR (READ)? BFUP DECB ZBUF+FSTAT E  0   ; BYTFMT=SIZE+1 RADIX:  .BYTE  0 SECMOD:  .BYTE  1  ;THIS INDICATES IN WHAT SECTION ONE IS:    ;0= .ASECT    ;1= UNNAMED .CSECT    ;2-376(8) = NAMED .CSECT'S RSLMOD:  .BYTE  0  ;THIS INDICATES THE TYPE OF EXPRESSION    ;0= ABSOLUTE    ;1= RELOCATABLE (CURRENT SECTION)    ;-1= GLOBAL    ;-2= RELOCATABLE (EXTERNAL SECTION) RSL2MD:  .BYTE  0  ;RSLMOD BACKUP VARLTH:  .BYTE  0 CNSTLV: .BYTE T/O STATUS BITS INTO UPPER BYBFUP RTS PC ; RETURN TO CALLER. BFUP .END ; BFUP  ; NO. RESET COUNTER. BFUP BR BFER12 ; AND GO DO ERROR STUFF. BFUP OPEN10: MOVB #STOPEN,(R0) ; SET ELEM. STATUS BFUP ADD #DSTSEC-DSTAT,R0; BUMP R0 TO POINT TO START SECTOR BFUP MOV (R0)+,BFSEC(R5) ; SET START SECTOR INTO COM BLOCK BFUP MOV (R0),BFLNTH(R5) ; SET LENGTH INTO COM BLOCK. BFUP TSTB R3 ; ALL IN SECTOR 0?  0 ;CONDITIONALS NEST LEVEL DNTACT: .BYTE 0 ;DON'T ASSEMBLE COUNTER LCSECT: .BYTE 0 ;LIST .CSECT'S SWITCH .EVEN IDENT: .BYTE 377 ;NON 0 - PRINT "PAL11R" NOINIT: .BYTE 0 ;IF 0 DON'T   ;INIT OVERLAY   ;DEVICE. .EVEN VARTERM: .WORD  0    ; TEMPORARY SYMBOL TABLE  .EVEN    ; TMPSYM MUST BE ODD ADDRESS FLDCNT: .BYTE 0  ;ADDRESSING FIELD COUNTER TMPSYM: .BYTE  0  .WORD  0  .WORD  0  .WORD  0 TFLAGS: .BYTE  0    BFUP BEQ OPEN20 ; YES BFUP MOVB #WFUN,AFUN ; OUTPUT DIRECTORY SECTOR - ABUF BFUP JSR PC,DISKBF ; GO DO I/O. #ABIUF IN DSKADD. BFUP BNE BFERDK ; ERROR BFUP MOV #ZBUF,DSKADD ; SET ZBUF ADDRESS IFF USED ABUF. BFUP OPEN20: MOVB #WFUN,ZFUN ; HERE TO OUTPUT SECTOR 0. BFUP JSR PC,DISKBF ;  ; TEMPORARY SYMBOL TABLE'S FLAGS CSCTID:  .BYTE  0  ;CONTROL SECTION ID  .EVEN ITYPE:  .BYTE  0   ; ITEM'S TYPE INDICATOR SFLAG:  .BYTE  0   ; CHAR. ID'S OUTPUT FLAG ITEMIN: .BYTE  0   ; ITEM PENDING INDICATOR BINOUT: .BYTE  0   ; BINARY OUTPUT INDICATOR CNTCHAR: .BYTE  0   ; ITEM'S CHARACTER COUNTER ICOUNT: .BYTE  0   ; EXPRESSION'S ITEM COUNTER LISTSC: .BYTE  0   ; SYMBOL TABLE LISTED OUTPUT'S DO IT. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; BFCLOS PROVIDES THE USER WITH MEANS OF 'UNOPENING' AN ELEMENT. THIS *BFUP    ; SYMBOL COUNTER. STMASK: .BYTE  0   ; SYMBOL TABLE LISTING MASK ICLASS: .BYTE  0   ; INSTRUCTION'S CLASS BTFLAG: .BYTE  0   ; BLANK OR TAB INDICATOR .PAGE PAL  .EVEN PASSES:   ; ASSEMBLY PASS FUNCTIONS OPTIONS:   ; ASSEMBLY OPTIONS ERPASS: .BYTE  0   ; ERROR LISTING PASS OPTION USPASS: .BYTE  0   ; UNDEFINED SYMBOL'S PASS PASS:  .BYTE  0 ; WILL CHANGE BOTH THE ELEMENT'S AND TASK'S STATUS. IF THE ELEMENT *BFUP ; CAN NOT BE FOUND, AND ERROR CODE WILL BE RETURNED. WHEN CLOSING AN *BFUP ; ELEMENT OPENED BY BFENTR, THE USER MUST SUPPLY THE LENGTH OF THE *BFUP ; ELEMENT. *BFUP ; *BFUP ; SUBROUTINES USED: PUSHR, FILECK, GETELT, DISKBF *BFUP ;    ; EFFECTIVE PASS MAXPASS: .BYTE  0   ; MAXIMUM PASS  .EVEN   ; INPUT-OUTPUT BUFFERING ZONE    ; THE INPUT BUFFER IS COMPLETELY    ;  EMBEDDED WITHIN THE OUTPUT BUFFER    ; EACH INDIVIDUAL BUFFER IS IMMEDIATELY    ;  PRECEDED BY AN I/O HEADER BLOCK     ; BUFFER ONE SRCMAX = 82. ; MAX SOURCE BUFFER=82. (1 CARD+CR+LF) PAL SIMBC = SRCMAX TRLBUF:  .WORD  40  ;TRAIL PACK  .WORD  3  .WORD  *BFUP ; ALL REGISTERS ARE RESTORED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFCLOS ; BFUP BFCLOS =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE THE REGISTERS BFUP  12  .WORD  0  .WORD  0  .WORD  0  .WORD  0  .WORD  0    ; LISTED OUTPUT HEADER BLOCK ONE LOBUF1: .WORD  0   ; LO MAXIMUM BYTE COUNT  .WORD  0   ; LO STATUS-MODE BYTES  .WORD  0   ; LO CURRENT BYTE COUNT . = .+6 ; LINE NUMBER .  =  .+2   ; ERROR LISTING FIELD .  =  .+6   ; LOCATION LISTING FIELD .  =  .+1   ; BLANK LISTING FIELD .  =  .+6    MOV 14.(SP),R5 ; PUT ADDRESS OF COM BLOCK INTO R5 BFUP JSR PC,FILECK ; IS THE FILE OK BFUP BNE BFER02 ; NO.-NOT BFUP. BFUP JSR PC,GETELT ; SEE IF WE CAN FIND THE ELEMENT. BFUP BEQ BFER06 ; NOT FOUND BFUP CMPB #STOPEN,(R0) ; STATUS = OPEN-READ BFUP BEQ CLSA30 ; YES ; OBJECT LISTING FIELD .  =  .+1   ; BLANK LISTING FIELD    ; SOURCE INPUT HEADER BLOCK ONE SIBUF1 = .-6   ; SI MAXIMUM BYTE COUNT     ; SI STATUS-MODE BYTES     ; SI CURRENT BYTE COUNT .  =  .+SRCMAX  ; CHARACTER DATA BUFFER .  =  .+12  ; OBJECT LISTING EXTENSION .  =  .+14  ; BUFFERS .  =  .+14  ; LEAVE ROOM FOR LINE NO. LOMBC  =  .-LOBUF1-6  .EVEN    ; LISTED OUTPUT HEADER BLOC BFUP CMPB #STXUSE,(R0) ; NO - THEN IS IT OPEN-WRITE BFUP BNE BFER10 ; NO - ERROR BFUP MOV BFLNTH(R5),DLENTH-DSTAT(R0); PUT ELEM. LEN IN DIRECTORY BFUP ADD BFLNTH(R5),ZBUF+FNSEC ; AND ADD TO FILE SECTOR POINTERBFUP BICB #STFWRT,ZBUF+FSTAT ; REMOVE WRITE STATUS ON FILE BFUP INCB ZBUF+FNDNUM ; UPDATE DIRECTORY # COUNTER BFUP BNK TWO LOBUF2: .WORD  0   ; LO MAXIMUM BYTE COUNT  .WORD  0   ; LO STATUS-MODE BYTES  .WORD  0   ; LO CURRENT BYTE COUNT . = .+6 ; LINE NUMBER .  =  .+2   ; ERROR LISTING FIELD .  =  .+6   ; LOCATION LISTING FIELD .  =  .+1   ; BLANK LISTING FIELD .  =  .+6   ; OBJECT LISTING FIELD .  =  .+1   ; BLANK LISTING FIELD    ; SOURCE INPUT HEADER BLOCK TWO SIBUF2 =E CLSA20 ; SKIP IF DIR. NOT FULL BFUP MOV #-1,ZBUF+FDIRSC ; DIRECTORY FULL - SET DIR SEC=-1 BFUP BR CLSA40 ; BFUP CLSA20: BITB #7,ZBUF+FNDNUM ; DIRECTORY NOT FULL - IS SECTOR FULL? BFUP BNE CLSA40 ; NO. BFUP INC ZBUF+FDIRSC ; YES - INCREMENT DIRECTORY SECTOR COUNTBFUP BR CLSA40 ;  .-6 ; SI MAXIMUM BYTE COUNT CMDBUF = SIBUF2-16 ; FOR CSI     ; SI STATUS-MODE BYTES     ; SI CURRENT BYTE COUNT .  =  .+SRCMAX  ; CHARACTER DATA BUFFER .  =  .+12  ; OBJECT LISTING EXTENSION .  =  .+14  ; BUFFERS . = .+14   ; LEAVE ROOM FOR LINE NO. BBSIZE  =  46.   ; 46 BYTE BINARY OUTPUT BUFFER  .EVEN   ; BINARY OUTPUT HEADER BINBUF: .WORD  0    BFUP CLSA30: DECB ZBUF+FSTAT ; HERE FOR OPEN-READ BFUP CLSA40: CLRB (R0) ; CLEAR STATUS IN DIRECTORY BFUP MOVB #WFUN,ZFUN ; ALL ENTRIES DONE - SET TO DO WRITE. BFUP TST R3 ; TO DISK - FIRST, ALL IN SECTOR 0? BFUP BEQ CLSB20 ; YES BFUP MOVB #WFUN,AFUN ; SET ABUF FOR WRITE ALSO. BFUP JSR  ; BO MAXIMUM BYTE COUNT  .WORD  0   ; BO STATUS-MODE BYTES BINCNT=BINBUF+10  .WORD  0   ; BO CURRENT BYTE COUNT  .WORD  0   ; BINARY BLOCKS IDENTIFIER  .WORD  0   ; BINARY BLOCKS BYTE COUNT  .WORD  0   ; BINARY BLOCKS LOAD ADDRESS .  =  .+BBSIZE  ; RESERVE BBSIZE DATA BYTES MAXBBA:    ; MAX. BINARY BUFFER ADDRESS  .BYTE  0   ; RESERVE A CHECKSUM BYTE BOMBC  =  BBSIZE+1+6 RLDBC  =63  PC,DISKBF ; NO - I/O LIST SET UP FROM GETELT BFUP BNE BFERDK ; ERROR BFUP MOV #ZBUF,DSKADD ; SET ZBUF ADD. ONLY IF USED ABUF. BFUP CLSB20: JSR PC,DISKBF ; HERE TO DO SEDTOR 0. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE. BFUP .PAGE .EVEN RLDBUF:  .WORD  0 RLDCNT  =  .+2 RLSTRT  =  RLDBUF+6  . =  .+RLDBC+6  ;RLD BUFFER SPACE .EVEN PAL .PAGE PAL ;CONTROL COMES HERE AT LOAD TIME AND ^C BEGIN TIME.. STARTA: MOVB #377,NOINIT ;INITIALIZE STARTC: MOV PERTOP,R6 JMP RCSI SETPASS: MOV SIFB,-(R6) ;OPEN SOURCE MOV SILB,-(R6) ;INPUT FILE EMT OPN SETP5: C  BFUP ;***********************************************************************BFUP ; *BFUP ; THE SUBROUTINE GETELT IS USED BY BFUP TO SCAN A SPECIFIED BFUP *BFUP ; DIRECTORY FOR A GIVEN ELEMENT (NAME & TYPE). *BFUP ; *BFUP ; INPUT TO GETELT IS: *BFUP ; R5 = ADDRESS O MPB BOPASS,#1 ;NO BINARY DURING PASS 1.  BLE  SETP2  CMPB  BOPASS,PASS  BNE  SETP2 JSR PC,GSDTAB  ;BINARY OUTPUT PASS. SETP2: JMP RSETP2 ;.EOT ENTRY POINT TO CONTINUE SETP0: MOV SIFB,-(R6) ;OPEN SOURCE MOV SILB,-(R6) ;INPUT EMT OPN  ;FILE. SETP4: JMP RSETP4 .PAGE PAL SETSRC:  CLR  TBBUF  ; TBBUF(0) = 0  CLRB  RSL2MD  CLRB  RSLMOD  CLRB  AERROR  CLRB F COMMUNICATIONS BLOCK *BFUP ; SECTOR ZERO IN THE ZBUF *BFUP ; DISKIO LIST SETUP FOR ROS FILE *BFUP ; *BFUP ; OUTPUT FROM GETELT IS: *BFUP ; R3 = SECTOR # CONTAINING SPECIED ELEMENTS DIRECTORY ENTRY *BFUP ; R2 = ADDRESS OF LAST CELL IN LAST EXAMED BUFFER (ZBUF OR IERROR  CLRB  RADIX  CLRB  UERROR  CLRB  QERROR  CLRB  ERROR  ; ERROR = 0  MOVB  #1,BINOUT  ; INITIALIZE BINOUT FLAG  ; OPEN SUBROUTINE GET SOURCE LINE   ; VERIFY THAT THE OUTPUT OPERATION OVER THE   ; BUFFER CURRENTLY SPECIFIED BY BHADRS(0,1)   ; HAS BEEN COMPLETED   ; THEN ISSUE THE READ COMMAND   ; THEN ROTATE THE BHADRS TABLE SO THAT BHADRS(0,1)   ; POINTS TO THE NEXT SEQUENCIAL INPUT BUFFER.   ; INITIA ABUF) *BFUP ; R0 = ADDRESS IN BUFFER OF STATUS BYTE OF ENTRY IF FOUND *BFUP ; = 0 IF ELEMENT NOT FOUND *BFUP ; Z STATUS BIT SET IFF ELEMENT NOT FOUND *BFUP ; ABUF CONTAINS SECTOR WITH THE ELEMENT'S DIRECTORY ENTRY (UNLESS*BFUP ; ENTRY FOUND IN SECTOR 0. *BFUP ; *BFUP ; SUBROUTINES USED: DISKBF LIZE POINTERS FOR THE ASSEMBLING OF   ; THE INPUT BUFFER CURRENTLY SPECIFIED BY   ; BHADRS(0,1)  ; *** NOTE ***   ; THE I/O PROCESSOR MUST RETAIN EXECUTION   ; CONTROL IF A READ COMMAND IS PRESENTLY   ; IN PROGRESS. THE ASSEMBLER ASSUMES THAT   ; IF EXECUTION CONTINUES, THE PRECEDING   ; INPUT BUFFER IS FULL AND READY FOR   ; PROCESSING.   ; SCAN THE PRECEDING INPUT BUFFER AND INSURE   ; PROPER FORMAT   ;  ALL INPUT BUFFER *BFUP ; *BFUP ; ALL UNUSED REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP GETELT =. ; ENTRY POINT BFUP MOV #ZBUF+FID+FFLAG2+2-FID,R0 ; PUT ADDRESS OF ENTRY 1, S WILL TERMINATE,   ;  UNCONDITIONALLY, WITH A CR-LF SEQUENCE.   ;  FORM-FEED CHARACTERS, OPTIONALLY, ARE   ;  APPENDED TO THIS SEQUENCE GETLINE:  JSR PC, ROTATE ; CALL ROTATE I/O BUFFERS  MOV  @R2,R1 MOV R0,-(R6) ;STACK BUFFER ADDRESS     ; CALLING SEQUENCE     ; R0 = ADDRESS OF THE     ; RELEASED BUFFERS SOURCE     ; INPUT HEADER BLOCK  MOV  #SIMBC,(R0)+ ; SET THE HEADERS MAXIMUM     ; INP BFUP ; SECTOR 0 INTO R0 BFUP MOV #ZBFEND,R2 ; ADDRESS OF LAST WORD IN BUFFER BFUP CLR R3 ; SECTOR # OF SEARCH BFUP GETA10: CMP (R0)+,BFELN1(R5); DOES FIRST TRIAD MATCH? BFUP BNE GETA20 ; NO BFUP CMP (R0)+,BFELN2(R5); YES. DOES SECOND TRIAD? BFUP BNE GETA30 ; UT BYTE COUNT  MOV  #SIMODE,(R0)+ ; SET THE HEADERS INPUT     ; STATUS AND MODE BYTES  CLR  @R0   ; ZERO THE HEADERS CURRENT     ; INPUT BYTE COUNT   ; *** SOURCE INPUT I/O SERVICING REQUEST     ; CALLING SEQUENCE MOV SILB,-(R6) EMT RDCMD     ; THERE IS AN IMPLIED WAIT     ; HERE RELATIVE TO THE     ; PREVIOUS READ PROCESSING     ; USING THE PREVIOUS     ; SOURCE INPUT B NO. BFUP CMPB 1(R0),BFTYPE(R5); YES. DOES TYPE? BFUP BNE GETA30 ; NO BFUP CMPB (R0),#STDELT ; YES - DELETED ELEMENT? BFUP BEQ GETA30 ; YES- SKIP IT THEN. BFUP CLZ ; FORCE STATUS BIT FOR RETURN BFUP RTS PC ; YES - ALL DONE RETURN TO USER. BFUP!UFFER   ; CURRENT SOURCE INPUT BUFFER INITIAL PROCESSING    ; THE PRIMARY BUFFER POINTER, THE    ; EFFECTIVE SOURCE INPUT BUFFER    ; HEADER ADDRESS, HAS BEEN ROTATED    ; INTO THE BHADRS(0,1) POSITION BITB #EOF,3(R1)  ;EOF!EOM ON INPUT? BEQ GETL06   ;NOPE,CONTINUE JMP EOFFLG GETL06:  BITB  #LONGLINE,3(R1) ; LONG LINE TRUNCATION ? BR GETL12 ; NOPE  INCB  LERROR  ; YES, SET 'L' ERROR GETL12: MOV$ GETA20: TST (R0)+ ; INCREMENT R0 BY 2 BFUP GETA30: ADD #BFLNTH-DSTAT+4,R0 ; BUMP R0 TO NEXT ENTRY BFUP CMP R0,R2 ; OR ARE WE OUT OF THE BUFFER? BFUP BLO GETA10 ; NOPE. PROCEED WITH SEARCH BFUP MOV #ABUF+BHEAD+DNAME1,R0 ; YUP. SET R0=ADD OF FIRST ENTRYBFUP ; IN ABUF BFUP MOV #ABFEND,R2 ; SET R2%B  #CR,R4  ; R4 = ASCII CARRIAGE-RETURN  INC  LINENO  ; INCREMENT SOURCE LINE NUMBER  CMP  (R1)+,(R1)+  ; R1 = R1+4  MOV  (R1)+,R2  ; R1 = R1+2, R2 = BYTE COUNT  ADD  R1,R2  ; R2 = LINE TERMINATORS ADDRESS  MOV  R1,R0  DEC  R2  MOV  R1,@R3  ; INITIALIZE CURLIST POINTER  SUB #34,@R3  MOVB  #' ,-(R1)  ; INITIAL CHARACTER ALWAYS BLANK  MOV  R1,CURBYTE ; INITIALIZE CURBYTE POINTER  CMPB( = ADDRESS OF ABUF LAST WORD BFUP INC R3 ; ADD 1 TO R3 (SECTOR COUNTER BFUP CMP R3,#DIRMAX ; HAVE WE CHECKED ALL SECTORS BFUP BLT GETA50 ; NOT YET BFUP CLR R0 ; YES. R0 = 0 SINCE NOTHING FOUND BFUP RTS PC ; RETURN BFUP GETA50: MOV #ABUF,DSKADD ; SET BUFFER ADDRESS FOR TRANSFER BFUP )  #FF,@R2  ; TERMINATOR A FORM-FEED ?  BNE  GETL02  ; NOPE ;     ; A LINE-FEED CHARACTER  ADD  #60.,PAGING ; YES, OVERFLOW PAGE COUNTER    ; INSURE PROPER BUFFER TERMINATOR FORMAT GETL02: CMPB  R4,-1(R2)  ; CR PRECEDES TERMINATOR ?  BEQ  GETL03  ; YES, VALID SITUATION  MOVB  (R2)+,@R2  ; INSERT A CARRIAGE-RETURN  MOVB  R4,-1(R2)  ; PRECEDING THE TERMINATOR GETL03:  MOVB  R4,+1(R2)  ; UNC, MOVB #RFUN,AFUN ; SET STATUS FOR READ BFUP MOV R3,ASEC ; SET SECTOR # BFUP JSR PC,DISKBF ; GO READ SECTOR BFUP BEQ GETA10 ; NO ERRORS - GO PROCESS THIS BUFFER BFUP GETA99: JMP BFERDK ; DISK I/O ERROR BFUP .PAGE BFUP ;*********************************************-ONDITIONALLY TRAIL ALL     ; LINE TERMINATORS WITH A     ; CARRIAGE-RETURN  MOV  R2,SRCIN  ; SRCIN = THE ADDRESS OF     ; THE EFFECTIVE SOURCE     ; IMAGES LINE TERMINATOR  DEC  R2   ; R2 = ADDR. OF LAST CR. GETL04: CMPB  (R0)+,R4  ; IS THIS CHARACTER A CR.?  BNE  GETL04  ; NOPE, CONTINUE THE SCAN  DEC  R0   ; YES, BACKUP THE POINTER  CMP  R0,R2  ; IS THIS THE LAST CR.?  BEQ  GETL05  ; YES, VALI0**************************BFUP ; *BFUP ; THIS SUBROUTINE, FILECK, IS USED BY ALL BFUP ENTRY POINTS TO: *BFUP ; 1) INSURE THAT BFUP IS AVAILABL FOR USE *BFUP ; 2) READ SECTOR 0 INTO ZBUF, THUS INSURING THAT THE SPECIFIED *BFUP ; ROS FILE IS DEFINED IN ROS. *BFUP ; 3) SETING THE STATUS BITS & ROTO 1 IF THE FILE HAS NOT BEEN *BFUP ; 1D SITUATION  INCB  QERROR  ; ILLEGAL CHARACTER CAUGHT GETL05: ; INITIATE EVALUATION OF EACH INDIVIDUAL SOURCE STATEMENT  ; FLUSH THE LABEL FIELD'S CONTENTS AND, POTENTIALLY,  ; SEPARATE A DIRECT ASSIGNMENT STATEMENT. MAIN10: JSR PC, ITEM ; CALL ITEM MOVB SAVTERM,R0 ;C(R0) = ENCODED TERMINATOR ADD #2,R0 ;IS TERMINATOR "="? (-1) BLE MAIN04 ;NO - BRANCH TSTB DNTACT  ;ASSEMBLE THIS LINE? BLE MAIN11 ;YES - BRANCH BR MN20A ;NO - GO EXIT MAIN04: BEQ  UPBF ; ND.E UPBF . ERLLCAO TRNTURE; PC S RT UPBFBYR PEUPO NT ITSBIS TUTA S/O TSKDIT SE; 5)(R,1RRKEDS SBBI UPBF T EME US; IOSK$D T EM UPBF SSREDD ASTLIO I/K IS DSHPU; ) SP-(T,LSSK#D V MO UPBF 4 INITIALIZED AS A BFUP FILE. IF THE FILE IS INITIALIZED, RO *BFUP ; IS SET TO 0 AND THE STATUS BITE ARE SET ACCORDINGLY. *BFUP ; ERROR EXITS ARE TAKEN IF ITEMS 1 OR 2 ARE NOT CORRECT. *BFUP ; ONLY REGISTER R0 IS USED AND NOT RESTORED. *BFUP ; *BFUP ;***********************************************************************BFUP FILECK =. ; ENTRY POINT 5MAIN06 ;IS TERMINATOR ":"? (-2)   ;YES - BRANCH JMP MAIN20 ;NO - PROCESS OPERATOR FIELD MAIN06: TSTB DNTACT ;"ASSEMBLE" THIS LABEL? BGT MAIN10 ;NO - BRANCH  ; INITIAL PROCESSING FOR LABELS AND DIRECT ASSIGNMENTS   ; PROCESS THE SYMBOL PRECEDING THE TERMINATOR,   ; IDENTIFY THE ASSEMBLY LOCATION COUNTER AND   ; INITIALIZE THE REGISTERS FOR PROCESSING. MAIN11: TSTB  ITYPE  ; CHECK THE ITEM'S TYPE  BGT  MAIN13  ; ITEM WAS AN UN-ERRORED SYM T INPOY TREN; =. BFSKDI UPBF**********************************************************************;* UPBF * ; UPBF * . F'KBIS,DPCR JS 'ISE AGNKLIE TH; UPBF * ; UPBF * CKLO BNSIOATICUNMMCOE THN IET SBEO TUSATSTR ROERE TH; UPBF * HE TSEAU CLLWIS TUTA SROZEN-NO S.TUTA S8 BFUP CLR (R5) ; CLEAR BFUP COM BLOCKS ERROR WORD BFUP TSTB BFBUSY ; IS BFUP IN USE BFUP BNE FLCK98 ; YES - ERROR BFUP INCB BFBUSY ; SET BFUP BUSY FLAG BFUP CLR ZSEC ; SET SETOR NUMBER ZERO IN DISK ADDRESS.BFUP MOV #ZBUF,R0 ; GET ADDRESS OF BUFFER FOR SECTOR ZERO BFUP MOVB 9BOL  INCB  QERROR  ; ALL OTHER ITEMS CONSIDERED     ; AS QUESTIONABLE SYNTAX  TST  R0   ; WHAT WAS THE TERMINATOR?  BLE  MAIN10  ; TERMINATOR WAS A COLON  JMP  MAIN1E  ; ABORT THIS DIRECT ASSIGNMENT MAIN13: MOV  R0,-(R6)  ; STACK THIS SYMBOLS TERMINATOR MAIN14: JSR PC, SEARCH ; CALL SEARCH THE USER'S SYMBOL TABLE  BGT  MAIN40  ; IF ENCOUNTERED AS     ; A PERMANENT SYMBOL SET RE-DEFINED FLAG AND SEHE TKSECCH, RNTUREN OD,AN; UPBFT*EME THS SE UK,ACSTE THN OSSREDD ASTLIE THS SHPUT I. IOSCDIT EME TH; UPBF * NGSI U/O ISKDIO DTOP FU BBYD SE UNETIOUBRSUL NAERNT IANS IBFSKDI; UPBF * ; UPBF**********************************************************************;* UPBF E AG.P UPBF ; 01ERBF P JM: 99CKFL UPBF <#RFUN,ZFUN ; SET SECTOR 0 FOR READ BFUP MOV 2(R5),(R0) ; SET BOTH BUFFERS WITH FILE ID. BFUP MOV 2(R5),ABUF ; BFUP MOV R0,DSKADD ; SET BUFFER ADDRESS FOR TRANSFER BFUP JSR PC,DISKBF ; READ IN SECTOR 0 BFUP BEQ FLCK10 ; NO DISK I/O ERRORS. BFUP CMP #7,DSKERR ; WAS THIS A REAL ROS FILE=ARCH     ; FURTHER. BEQ MAIN15   ; FOUND IN UST. JSR PC,ENTER   ; ENTER INTO UST MAIN15:  MOV  #TFLAGS,R1  ; R1 = TFLAGS ADDRESS  MOV  #REGFLG,R2  ; R2 = REGISTER FLAG CONSTANT  MOV  #RESULT,R3  ; R3 = RESULT ADDRESS  TSTB  (R6)+  ; WAS SAVED TERMINATOR A COLON ?  BEQ  MAIN1F  ; YES, PROCESS AS A LABEL JMP ASSIGN MAIN40: BISB #REDEF,@HINDEX  ;SET REDEFIND FLAG IN PST BR MAIN14 ; LABEL PROCESSING H NCRA B AOR FAR FTO; 08ERBF P JM: 98CKFL UPBF . RNTUREE IL;F PC S RT UPBF P FU BOT N -TSBIS TUTA SND AR0T SE; 0 ,R#1 V MO: 30CKFL UPBF RNTURE; PC S RT UPBFTSBIS TUTA S &R0T SEE IL FUPBFA S IIT; R0 R CL UPBF E IL FUPBFA T NO; 30CKFL E BN UPBF G.LA FOFD OR WNDCOSE; ? BFUP BEQ FLCK99 ; NO DISK I/O ERROR - ALL IS AOK. BFUP BR GETA99 ; YES. THEREFORE A REAL I/O ERROR. BFUP FLCK10: CMP FFLAG1(R0),(PC)+; LET'S SEE IF THIS IS A BFUP FILE? BFUP .RAD50 /.BF/ ; FIRST WORD OF FLAG BFUP BNE FLCK30 ; NOT BFUP FILE BFUP CMP FFLAG2(R0),(PC)+; FIRST WORD OK - IS THE SECOND? BFUP .RAD50 /UP./  ; THIS SUBROUTINE, VERIFIES ALL LABEL ASSIGNMENTS   ; UPON ENTERING THIS SUBROUTINE THE EFFECTIVE SYMBOL   ; TABLE ADDRESS RESIDES IN HINDEX.   ; LABELS CANNOT EVER BE TYPED AS REGISTER   ; ASSEMBLY LOCATION COUNTER APPEARANCES HERE ARE   ; DETECTED AND ERRORED.     ; INPUT SPECIAL SITUATION     ; OUTPUT CONTINUE FLUSHING THE LABEL     ; FIELD MAIN1F: BITB  R2,@R1  ; IS SYMBOL TYPED REGISTER ?  BEQ  MAIN1G