.TITLE DBSEDT .IDENT /030283/ .ENABL LC ; ; ; ; WRITTEN BY RAY DI MARCO ; 14-JAN-81. ; ; ; ; VERSION 140181/09. ; ; ;----------------------------------------------------------------------- ; ; ; THIS IS THE MAIN MODULE FOR THE 'DBSEDT' PROGRAM. ITS FUNCTION IS TO ; SUPERVISE THE EXECUTION OF THE SUPPORT ROUTINES. UPON ACTIVATION, IT ; IDENTIFIES ITSELF AND REQUESTS THE USER TO ENTER A COMMAND. FACILITIES ; EXIST TO ALLOW ENTRIES TO BE- ; ; CREATED ; INSPECTED ; MARKED FOR DELETION ; EDITTED. ; ; AT EXIT TIME THE PROGRAM EXITS BY CHAINING TO 'RDM.SAV'. ; ; ; .SBTTL MODIFICATIONS ; ; ; 2-MAR-81 CHANGE START TO 'MOV #FORM$$,(PC)+' (FOR 'DBSFOR') ; INSERT 'CALL ZERBLK' AT START OF '.NEW' AND '.EDIT' ; INCLUDE 'ED' (EDIT DATE) AS A AUTO-SUPPORTED FIELD ; 5-MAR-81 CHANGE '.EDIT'/'.DELET' SO THAT REC NUM SAVED IN 1000$! ; 6-MAR-81 IF ALL SLOTS FULL IN '.NEW' RETURN INTSTEAD OF EXIT ; CHANGE SO THAT -> BACK-UP A STEP ; 28-APR-81 DISPLAY RECORD PRIOR TO DELETING IT ('.DELET') ; 11-SEP-81 CHANGE '.NEW' SO THAT SET UP I.EDIT=I.CREAT! ; 27-APR-82 Change so that CON.EX called to exit program. ; 30-APR-82 Change to support TEMPLATE loading! ; 3-Feb-83 allow Page N and New N commands ; ; .SBTTL DECLARATIONS ; ; .MCALL .EXIT ; TERMINATION .MCALL .PUSH,.POP ; STACKING .MCALL .DATE,.PRINT,.CLOSE ; RT-11 .MCALL FILSPT,CNAF ; "FILSPT" FILSPT ; INVOKE FILE SUPPORT ; ; .GLOBL FORM$$,$$FORM,DBSLDR ;; TEMPLATE .GLOBL CON.ST,CON.EX,CON.ES ;; CONIO .GLOBL FILINT,FIL.PW,FIL.DR,FIL.DW ;; 'FILEIO' .GLOBL KEY.NW,KEY.OT,KEY.FD ; 'KEYMNG' .GLOBL FRM.EF,FRM.BG,FRM.FG ; "FRMIO" .GLOBL TBLKUP ; "TBLKUP" .GLOBL ASCNUM ; "ASCNUM" .GLOBL FED.NW,FED.OD,FED.MD,PAGE$$ ; 'FEDMNG' .GLOBL FRM.ZP .GLOBL LOCFLD ; 'LOCFLD' .GLOBL WND.FL ; CONTROLS WND EDIT ; .PSECT CODE ; open code area ; ====== ==== ; .SBTTL Macro Definitions ; ; ; .MACRO LOAD OFF,REG MOV $$FORM,REG MOV OFF(REG),REG .ENDM LOAD ; .MACRO GTLIN BUF=R0,STR .IF NB,STR .GLOBL CON.LO MOV STR,R0 CALL CON.LO .ENDC MOV BUF,R0 .GLOBL CON.LI CALL CON.LI .ENDM GTLIN ; .SBTTL MACRO - 'CMDTAB' ... CREATE A COMMAND TABLE ; ; ; ; THIS MACRO IS USED TO CREATE A COMMAND TABLE WHICH CAN BE USED ; BY 'TBLKUP' FOR COMMAND DECODING. TO USE IT DO THE FOLLOWING- ; ; CMDTAB NAME ; CREATE AND LABLE TABLE ; CMDENT COMMAND,ROUTINE ; COMMAND --> ROUTINE ; ....... ; CMDEND ; TERMINATE TABLE ; ; 'TBLKUP' IS CALLED WITH THE COMMAND STRING IN 'R0' AND THE TABLE ; ADDRESS (NAME) IN 'R1'. IT RETURNS WITH THE ROUTINE ADDRESS IN ; 2(R1) IF IT FINDS THE COMMAND IN THE TABLE. ; ; ; ; .MACRO CMDTAB TABLE TABLE: .MACRO CMDENT NAME,VAL1,VAL2=0,VAL3=0 .SAVE .PSECT MESSAGE ZZZZZ1 = . .ASCIZ /NAME/ .RESTORE .WORD ZZZZZ1,VAL1,VAL2,VAL3 .ENDM CMDENT ; .MACRO CMDEND .WORD 0,0,0,0 .MACRO CMDTAB .ENDM CMDTAB .MACRO CMDENT .ENDM CMDENT .ENDM CMDEND ; .ENDM CMDTAB ; .SBTTL MACRO - 'INPUT' ... INPUT A COMMAND ; ; ; THIS MACRO IS USED TO INPUT A COMMAND LINE. THE ADDRESS OF THE ; INPUT BUFFER IS RETURNED IN R0, AND IT IS TERMINATED BY A NULL. ; OPTIONAL PROMPT, STATUS AND ERROR MESSAGES CAN BE SPECIFIED. ; ; .MACRO INPUT BUFFER=IOM.BF,PROMPT,STATUS,ERROR .IF NB,ERROR .PUSH R0 MOV ERROR,R0 .GLOBL IOM.ER CALL IOM.ER .POP R0 .ENDC ; .IF NB,STATUS .PUSH R0 MOV STATUS,R0 .GLOBL IOM.ST CALL IOM.ST .POP R0 .ENDC ; .IF NB,PROMPT .PUSH R0 MOV PROMPT,R0 .GLOBL IOM.PT CALL IOM.PT .POP R0 .ENDC ; MOV BUFFER,R0 .IIF IDN,BUFFER,IOM.BF,.GLOBL IOM.BF .GLOBL IOM.IN CALL IOM.IN ; .ENDM INPUT ; ; ; ; ; .SBTTL MACRO - 'DISPLAY' ... DISPLAY PROMPT, STATUS AND ERROR MESSAGES ; ; ; THIS MACRO IS USED TO DISPLAY THE PROMPT, STATUS AND ERROR MESSAGES. ; ; ; .MACRO DISPLAY PROMPT,STATUS,ERROR .IF NB,ERROR .PUSH R0 MOV ERROR,R0 .GLOBL IOM.ER CALL IOM.ER .POP R0 .ENDC ; .IF NB,STATUS .PUSH R0 MOV STATUS,R0 .GLOBL IOM.ST CALL IOM.ST .POP R0 .ENDC ; .IF NB,PROMPT .PUSH R0 MOV PROMPT,R0 .GLOBL IOM.PT CALL IOM.PT .POP R0 .ENDC ; .ENDM DISPLAY ; ; .SBTTL MACRO - 'STATUS' ... DISPLAY STATUS MESSAGE ; ; ; .MACRO STATUS MESSAGE .IF NB,MESSAGE .PUSH R0 MOV MESSAGE,R0 .ENDC .GLOBL IOM.ST CALL IOM.ST .IIF NB,MESSAGE, .POP R0 .ENDM STATUS ; ; .SBTTL MACRO - 'ERROR' ... DISPLAY ERROR MESSAGE ; ; ; .MACRO ERROR MESSAGE .IF NB,MESSAGE .PUSH R0 MOV MESSAGE,R0 .ENDC .GLOBL IOM.ER CALL IOM.ER .IIF NB,MESSAGE, .POP R0 .ENDM ERROR ; ; ; .SBTTL ININIALIZATION SECTION ; ; DBSEDT: CALL CON.ST ; initialize consol I/Oer TST $$FORM ; template linked in? BNE 100$ ; yes -> skip GTLIN #I.BLK,#M.PRMT ; request template name MOV #I.BLK,R0 ; R0 -> template name CALL DBSLDR ; load template MOV R0,$$FORM ; set up pointer 100$: CALL FILINT ; initialize FILE I/Oer CALL CON.ES ; erase screen JMP CMDMNG ; command mode ; ; .SBTTL ROUTINE - 'CMDMNG' ... COMMAND MANAGER ; ; ; WE ARE HERE TO SUPERVISE COMMANDS. INPUT A COMMAND AND THEN DISPATCH ; CONTROL VIA TABLE '1000$' TO EXECUTE IT.; ; CMDMNG: ERROR #0 ; CLEAR ERRORS MOV $$FORM,R0 ; R0 -> START ADD #40,R0 ; R0 -> NAME MOV #9011$,R1 ; R1 --> DESTINATION 5$: MOVB (R0)+,(R1)+ ; COPY BNE 5$ ; LOOP TILL ALL DONE MOVB #40,-1(R1) ; convert 0 to space ; 10$: CNAF SSSSD,NUMBER=PAGE$$,STRING=#9012$; setup page INPUT ,#900$,#901$ ; INPUT COMMAND ERROR #0 ; CLEAR ERRORS TSTB (R0) ;; NULL LINE-> EXIT? BEQ 700$ ;; YES -> EXIT MOV #1000$,R1 ; COMMAND TAB ADD -> R1 CALL TBLKUP ; LOOKUP BCC 100$ ; OK -> 100$ ERROR #902$ ; TELL NO GO BR 10$ ; LOOP ; 100$: CALL @2(R1) ; EXECUTE BR 10$ ; LOOP ; 700$: JMP CON.EX ; BYE/BYE ; ; .NLIST BIN .ENABL LC 900$: .ASCII /Commands: =BYE CReate Edit Inspect New DELETE Page/ .ASCII //<200> 901$: .ASCII /DBSEDT-RDM030283- Database=/ 9011$: .ASCII /XXXXXX, Page / 9012$: .ASCII /...../<200> 902$: .ASCII <7>/SORRY - Command not recognized?/<200> ;;.DSABL LC .LIST BIN .EVEN .SBTTL MAIN COMMAND DECODING TABLE ; ; ; CMDTAB 1000$ ; DECLARE TABLE CMDENT ,CON.EX ; BYE BYE! CMDENT ,.NEW ; NEW ENTRY CMDENT ,.NEW ; NEW ENTRY CMDENT ,.DELETE ; MARK AS DELETED ENTRY CMDENT ,.EDIT ; EDIT ENTRY CMDENT ,.INSP ; INSPECT CMDENT ,.PAGE ; PAGE SELECT CMDEND ; EOT ; ; ; ; ; select page ; .PAGE: MOV R0,R1 ; R1 -> input CALL ASCNUM ; R0 = page number MOV R0,PAGE$$ ; select page MOV R0,PAGE$$+2 ; select defualt page RETURN ; done ; ; ; ; create a new record ; ; zero out argument block ; .NEW: CALL ZERBLK ;; ZERO ARG BLOCK ; ; if optional record number specified as part of command must initialize ; buffer with data stored in that buffer ; MOV R0,R1 ; R1 -> rest input CALL ASCNUM ; R0 = optional arg number TST R0 ; rec number specified? BEQ 10$ ; no --> create new record CALL FIL.DR ; yes -> read in it BR 11$ ; rejoin code ; ; else must clear out buffer completely ; 10$: MOV $$FORM,R0 ; R0 -> RDT MOV (R0),R5 ; R5 -> buffer CALL FRM.ZP ; zero buffer ; ; ; locate an empty record ; 11$: CALL KEY.NW ; FIND A SPARE RECORD BCS 1000$ ; FAILED -> EXIT MOV R0,I.RECO ; SAVE RECORD NUMBER CALL DATE ; GET DATE MOV R0,I.CREAT ; SAVE CREATION DATE MOV R0,I.EDIT ;; SET UP EDIT DATE MOV #"NW,I.STAT ; SAVE STATUS LOAD 16,R0 ; R0 -> FDBPAR MOV @FDB.BF(R0),I.CUST ; GET CN ; MOV $$FORM,R0 ; R0 --> FDT MOV #I.INIT,R1 ; R1 --> INITIAL DATA MOV @$$FORM,R5 ; R5 --> RECORD CALL COPBLK ; COPY DATA ; MOV $$FORM,R5 ; R5 --> FDT CLRB WND.FL+1 ; SPECIAL MODE BIC #1,FED.MD ;; disable zeroing BIS #2,FED.MD ;; allow commands CALL FED.NW+4 ;; CREATE NEW RECORD BCS 100$ ; FAILED -> EXIT ; MOV #"AC,I.STAT ; 'ACTIVE' STATUS MOV $$FORM,R0 ; R0 --> FDT MOV #I.INIT,R1 ; R1 --> INITIAL DATA MOV @$$FORM,R5 ; R5 --> RECORD CALL COPBLK ; COPY DATA ; MOV I.RECO,R0 ; RECORD NUMBER -> R0 CALL FIL.DW ; OUTPUT RECORD CALL KEY.OT ; LOAD 16,R0 ; R0 -> FDBPAR MOV FDB.BF(R0),R0 ; R0 --> PARA BLK INC (R0) ; UP CN INC 2(R0) ; UP NUMBER CNS IN USE INC 4(R0) ; UP REC NUMBER MOV I.CREATED,20(R0) ; UPDATE CREATION DATE CALL FIL.PW ; OUTPUT PARAMETS 100$: RETURN ; EXIT ; ; 1000$: ERROR #9000$ ;; TELL FAILED RETURN ;; EXIT ; .NLIST BIN .ENABL LC 9000$: .ASCIZ /? ERROR ? no more SLOTS left!/ ;;.DSABL LC .EVEN .LIST BIN ; ; ; ; ; THIS ROUTINE IS USED TO INSPECT A RECORD. ; ; .INSP: CALL KEY.FD BCC 10$ ; OK -> 10$ ERROR #9000$ ; TELL FAILED RETURN ; HOME ; 10$: CALL FIL.DR ; ENTER DATA MOV $$FORM,R0 ; POINT TO RECORD MOV (R0),R5 ; BUFFER -> R5 CALL FRM.EF ; CLEAR FORM CALL FRM.BG ; DISPLAY BG CALL FRM.FG ; DISPLAY FG RETURN ; HOME ; ; .NLIST BIN .ENABL LC 9000$: .ASCII /? ERROR ? Specified record cannot be found!/<200> ;;.DSABL LC .EVEN .LIST BIN ; ; ; ; THIS ROUTINE IS USED TO EDIT A RECORD. ; ; .EDIT: CALL ZERBLK ; ZERO BLOCK CALL KEY.FD ; LOCATE RECORD BCC 10$ ; OK -> 10$ ERROR #9000$ ; TELL FAILED RETURN ; HOME ; 10$: MOV R0,1000$ ; SAVE RECORD NUMBER CALL FIL.DR ; READ IN RECORD MOV $$FORM,R0 ; RDT --> R0 MOV (R0),R5 ; BUF ADD -> R5 MOV #I.INIT,R1 ; TABLE ADDRESS -> R1 CALL INPBLK ; READ IN BLOCK CMP I.STATUS,#"AC ; CORRECT STATUS? BEQ 20$ ; YES -> PROCEED ERROR #9001$ ; ERROR TIME RETURN ; HOME ; 20$: MOV $$FORM,R5 ; ARGUMENT CALL FED.OD ; ENTER RECORD DATA BCS 100$ ; ABORT -> 100$ ; ; ; MOV $$FORM,R0 ; RDT --> R0 MOV (R0),R5 ; BUF ADD -> R5 MOV #I.INIT,R1 ; TABLE ADDRESS -> R1 CALL INPBLK ; READ IN BLOCK CALL DATE ; GET DATE MOV R0,I.EDIT ; SAVE EDITTED DATE MOV 1000$,I.RECO ; ENSURE RECORD NUM R MOV $$FORM,R0 ; RDT --> R0 MOV (R0),R5 ; BUF ADD -> R5 MOV #I.INIT,R1 ; TABLE ADDRESS -> R1 CALL COPBLK ; COPY BLOCK ; MOV 1000$,R0 ; RECORD NUMBER -> R0 CALL FIL.DW ; WRITE RECORD ; MOV $$FORM,R5 ; RDT --> R5 CALL KEY.OT ; OUTPUT KEYS ; CALL DATE ; GET DATE LOAD 16,R5 ; R5 -> FDBPAR MOV FDB.BF(R5),R5 ; R5 --> PARA BLK MOV R0,22(R5) ; SET UP EDIT DATE CALL FIL.PW ; SAVE PARAMETER BLOCK 100$: RETURN ; HOME 1000$: .WORD 0 ; HOLDS REC NUM ; ; .NLIST BIN .ENABL LC 9000$: .ASCII /? ERROR ? Specified record cannot be found!/<200> 9001$: .ASCII /? ERROR ? Specified record is nolonger active!/<200> ;;.DSABL LC .EVEN .LIST BIN ; ; ; ; THIS ROUTINE IS USED TO DELETE A RECORD. ; ; .DELET: CALL ZERBLK ; ZERO PARAMETER BLOCK CALL KEY.FD BCC 10$ ; OK -> 10$ ERROR #9000$ ; TELL FAILED RETURN ; HOME ; 10$: MOV R0,1000$ ; SAVE REC NUMBER CALL FIL.DR ; READ IN RECORD MOV $$FORM,R0 ; RDT --> R0 MOV (R0),R5 ; BUF ADD -> R5 CALL FRM.EF ;; CLEAR FORM CALL FRM.BG ;; DISPLAY BG CALL FRM.FG ;; DISPLAY FG MOV #I.INIT,R1 ; TABLE ADDRESS -> R1 CALL INPBLK ; READ IN BLOCK CMP I.STATUS,#"AC ; CORRECT STATUS? BEQ 20$ ; YES -> PROCEED ERROR #9001$ ; ERROR TIME RETURN ; HOME ; 20$: INPUT ,#9002$,#9003$,#0 ; MAKE SURE OF DELETE CMPB (R0),#'Y ; YES? BNE 100$ ; NOT YES -> SKIP ; MOV #"DE,I.STATUS ; DELETE IT CALL DATE ; GET DATE MOV R0,I.DELETE ; SAVE DELETE DATE MOV $$FORM,R0 ; RDT --> R0 MOV (R0),R5 ; BUF ADD -> R5 MOV #I.INIT,R1 ; TABLE ADDRESS -> R1 MOV 1000$,I.RECO ;; SET UP REC NUM CALL COPBLK ; COPY BLOCK ; MOV 1000$,R0 ;; RECORD NUMBER -> R0 CALL FIL.DW ; WRITE RECORD ; MOV $$FORM,R5 ; RDT --> R5 CALL KEY.OT ; OUTPUT KEYS ; LOAD 16,R5 ; R5 -> FDBPAR MOV FDB.BF(R5),R5 ; R5 --> PARA BLK DEC 2(R5) ; ONE LESS ACTIVE CN CALL DATE ; GET DATE MOV R0,24(R5) ; UP DELETION DATE CALL FIL.PW ; SAVE PARAMETER BLOCK 100$: RETURN ; HOME 1000$: .WORD 0 ; HOLDS REC NUM ; ; .NLIST BIN .ENABL LC 9000$: .ASCII /? ERROR ? Specified record cannot be found!/<200> 9001$: .ASCII /? ERROR ? Specified record is nolonger active!/<200> 9002$: .ASCII /Really DELETE RECORD - Yes or No?/<200> 9003$: .ASCII /"DBSEDT" - Record Deletion Mode!/<200> ;;.DSABL LC .EVEN .LIST BIN ; .SBTTL ROUTINE - 'DATA' ... USED TO RETURN DATE ; ; ; DATE: .DATE ; RT-11 DATE -> R0 BIC #^C37777,R0 ; DISCARD HOB .PUSH R1 ; SAVE R1 CLR R1 ; 0 -> R1 ASHC #-5,R0 ; YEAR -> R1 ADD R1,R0 ; TRANSFORNED DATA -> R0 .POP R1 ; RESTORE RETURN ; HOME ; ; ; .SBTTL ROUTINE - 'ZERBLK' ... ZERO DATA BLOCK ; ; ZERBLK: .PUSH ; SAVE MOV #I.BLK,R0 ; POINTER MOV #9.,R1 ; COUNT 10$: CLR (R0)+ ; CLEAR SOB R1,10$ ; LOOP .POP ; RESTORE RETURN ; HOME ; ; .SBTTL ROUTINE - 'COPBLK' ... COPY DATA BLOCK INTO RECORD ; ; COPBLK: .PUSH ; SAVE MOV R1,R2 ; TABLE ADDRESS -> R1 10$: MOV (R2),R1 ; STRING -> R1 BEQ 100$ ; EOT -> 100$ CALL LOCFLD ; LOCATE FIELD BCS 20$ ; FAILED -> 20$ MOV 4(R1),R3 ; OFFSET -> R3 ADD R5,R3 ; FIELD ADDRESS MOV 2(R2),R4 ;; R4 -> DATA MOVB (R4)+,(R3)+ ;; COPY MOVB (R4)+,(R3)+ ;; COPY BR 30$ 20$: ; FAILED - NOOP 30$: ADD #4,R2 ; POINT NEXT BR 10$ ; LOOP 100$: .POP ; RESTORE RETURN ; HOME ; ; ; .SBTTL ROUTINE - 'INPBLK' ... RECORD --> DATA BLOCK ; ; INPBLK: .PUSH ; SAVE MOV R1,R2 ; TABLE ADDRESS -> R1 10$: MOV (R2),R1 ; STRING -> R1 BEQ 100$ ; EOT -> 100$ CALL LOCFLD ; LOCATE FIELD BCS 20$ ; FAILED -> 20$ MOV 4(R1),R3 ; OFFSET -> R3 ADD R5,R3 ; FIELD ADDRESS MOV 2(R2),R4 ;; R4 --> DESTINATION MOVB (R3)+,(R4)+ ;; COPY MOVB (R3)+,(R4)+ ;; COPY BR 30$ 20$: ; FAILED - NOOP 30$: ADD #4,R2 ; POINT NEXT BR 10$ ; LOOP 100$: .POP ; RESTORE RETURN ; HOME ; ; ; .SBTTL TABLE - 'I.INIT' ... DATA BLOCK FORMAT ; ; ; .MACRO ENTRY NAME,WORD .SAVE .PSECT MESSAGE ZZZZZZ = . .ASCIZ /'NAME'/ .RESTORE .WORD ZZZZZZ,WORD .ENDM ENTRY ; ; .ENABL LC I.INIT: ENTRY cn,I.CUST ENTRY cd,I.CREAT ENTRY rn,I.RECO ENTRY dd,I.DELE ENTRY st,I.STAT ENTRY ed,I.EDIT .WORD 0,0 ;;.DSABL LC ; ; .SBTTL VARIABLES ; ; $$FORM: .WORD FORM$$ ; address of TEMPLATE I.BLK: ; PROT FIELD - INIT VAL I.CUST: .WORD 0 ; CUST NUMBER I.CREA: .WORD 0 ; CREATED I.RECO: .WORD 0 ; RECORD NUMBER I.DELE: .WORD 0 ; DATE DELETED I.STAT: .WORD 0 ; STATUS I.EDIT: .WORD 0 ; EDIT DATE .WORD 0,0,0,0 ; SPARE M.PRMT: .ASCII /DBSEDT RDM300482./<15><12> .ASCII / Template file: /<200> ; .END DBSEDT