.TITLE TBLKUP ... perform table lookup .IDENT /080383/ ; ; ; ; ; WRITTEN BY RAY DI MARCO ; 28-AUG-80. ; ; ; ; VERSION 280880/03. ; ; ; ;--------------------------------------------------------------------------- ; ; ; ; THE ROUTINE IN THIS MODULE IS DESIGNED TO ALLOW ASCII STRING KEYWORDS ; TO BE TRANSLATED INTO THREE BINARY WORDS VIA A COMMAND DECODING TABLE. ; THE FEATURES OF THE ROUTINE ARE- ; ; THE ROUTINE WILL SUPPORT MINIMAL ABRIVIATIONS. A MATCH IS SIGNALED ; IF THE MINIMAL ABBRIVIATION IS ENTERED. IF EXTRA LETTERS ARE ; ENTERED THESE ARE CHECKED. FOR EXAMPLE, IF THE KEYWORD 'CLEAR' ; IS DEFINED TO HAVE A MINIMAL ABBRIVIATION OF 'CLE', THEN ; ; C CL ARE NOT MATCHES ; CLE CLEA CLEAR ARE MATCHES ; CLER IS NOT A MATCH ; ; IF A SUCCESSFUL MATCH IS FOUND, THEN THE COMMAND STRING POINTER ; WILL BE RETURNED POINTING TO THE START OF THE NEXT FIELD. ; ; LEADING BLANKS IN A KEYWORD FIELD ARE IGNORED. ; ; ; .SBTTL Modifications ; ; 3-Feb-83 change @2000$ routine to compenstate for lower/upper case ; difference ; 8-Mar-83 correct logic fault @2000$; clear out HOB of data stored ; on stack before checking for lower case. ; .SBTTL DOCUMENTATION - REGISTER USAGE AND ARGUMENT PASSING ; ; ; THE REGISTER ALLOCATION AT ENTRY IS- ; ; R0 HOLDS ADDRESS OF COMMAND STRING - IT POINTS TO THE START ; OF THE KEYWORD FIELD WHICH IS TO BE MATCHED. ; ; R1 HOLDS ADDRESS OF DECODING TABLE. ; ; ; THE REGISTER ALLOCATION AT EXIT IS- ; ; PSW 'C' IS CLEAR IFF A MATCH WAS FOUND. ; ; R0 IF NO MATCH WAS FOUND THEN IT STILL POINTS TO THE START ; OF THE KEYWORD FIELD WHICH WAS TO BE MATCHED. IF A MATCH ; WAS FOUND THEN IT POINTS TO THE START OF THE NEXT FIELD. ; ; R1 IF A MATCH WAS FOUND IT POINTS TO THE MATCHING ENTRY, OTHERWISE ; IT IS UNMODIFIED. ; ; ; ; .SBTTL DOCUMENATION - STRINGS ; ; ; ; IN THIS MODULE IT IS ASSUMED THAT A STRING IS A SERIES OF CHARACTERS ; TERMINATED BY A NULL. ; ; ; .SBTTL DOCUMENATION - DECODING TABLE ; ; ; ; THE DECODING TABLE CONSISTS OF A NUMBER OF 8 BYTE ENTRIES. THE TABLE ; END IS INDICATED BY AN ENTRY FOR WHICH THE FIRST WORD CONTAINS A VALUE ; OF ZERO. THE ENTRY STRUCTURE IS - ; ; ; ENTRY- .WORD STRADD ; .WORD VAL1 ; .WORD VAL2 ; .WORD VAL3 ; ; ; WHERE 'STRADD' IS THE ADDRESS OF THE KEYWORD STRING ; 'VAL? ?=1 2 3' ARE THE VALUES ASSOCIATED WITH THE KEY. ; ; THE ROUTINE DOES NOT USE/ACCESS THE VALUE WORDS IN THE ENTRY. IF A MATCH ; IS FOUND THEN 'HL' WILL POINT TO THE FIRST VALUE WORD AT EXIT. ; ; THIS ROUTINE WILL COMPARE THE 'KEYWORD STRING' IN THE ENTRY WITH ; THE FIRST WORD OF THE STRING (DE). THE FORMAT OF THE KEYWORD STRING IS ; ; .ASCIZ /???-%%%/ ; ; WHERE ??? REPRESENTS A SERIES OF LETTERS ; - IS USED TO INDICATE THE MINIMAL ABRIVIATION ; %%% REPRESENTS A SERIES OF LETTERS ; ; FOR EXAMPLE, 'INIT-IALIZE' REPRESENTS THE KEY WORD ; 'INITIALIZE', WHOSE MINIMAL ABRIVIATION IN 'INIT'. ; ; ; ; .SBTTL DECLARATIONS ; ; .MCALL .PUSH,.POP ; STACKING ; .GLOBL TBLKUP ; ENTRY ; ; ; ENTSIZ = 8. ; BYTES/ENTRY ; ; .PSECT CODE ; OPEN CODE SECTION ; ------ ---- ; ; .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 ROUTINE - 'TBLKUP' ... LOOKUP TIME ; ; ; SKIP LEADING BLANKS ; TBLKUP: .PUSH ; SAVE 10$: CMPB (R0)+,#40 ; SPACE? BEQ 10$ ; LOOP IF WAS A SPACE ; ; ; ; TRY FOR A MATCHING ENTRY ; 100$: DEC R0 ; BUMP POINTER DOWN 110$: MOV (R1),R2 ; COMMAND STRING ADDRESS -> R2 BEQ 300$ ; EOT --> FAIL --> 300$ CALL 1000$ ; MATCH? BCC 200$ ; YES -> 200$ ADD #ENTSIZ,R1 ; TRY NEXT ENTRY BR 110$ ; LOOP ; ; ; FOUND A MATCH ; 200$: .POP ; RESTORE TST (SP)+ ; DISCARD OLD TABLE ADDRESS CLC ; CLEAR FAIL FLAG RETURN ; HOME ; ; FAILED TO FIND A MATCH ; 300$: .POP ; RESTORE SEC ; SET FAIL RETURN ; HOME ; ; ; ; ; ; THIS ROUTINE IS USED TO SEE IF A TABLE ENTRY COMMAND NAME ; MATCHES THE INPUT STRING. THE STRINGS MUST BE IDENTICAL UPTO ; THE MINIMAL ABRIVIATION DELIMTER. AFTER THAT WE COMPARE TILL ; FIND A DIFFERENCE AND SEE IF DIFFERENCE IS LEGAL. ; ; ENTRY R0=STRING1 R2=STRING2 ; EXIT SUCCEDDED 'C' CLEAR R0=END KEYWORD ; FAILED 'C' SET R0=UNCHANGED ; ; ; SCAN UNTILL WE FIND A MISMATCH! ; 1000$: .PUSH R0 ; RESTORE CALL 2000$ ; SEE IF MATCH CMPB (R2)+,#'- ; MISMATCH AT DELIMITER? BNE 1700$ ; NO -> ERROR -> FAIL ; ; ; MISMATCH A DELIMETER - SCAN SOME MORE. ; CALL 2000$ ; SCAN REST OF STRINGS CMPB (R0),#40 ; DIFFER AT SPACE? BEQ 1600$ ; YES -> OK TSTB (R0) ; DIFFER AT NULL BEQ 1600$ ; ACCEPT BR 1700$ ; ERROR ; ; ; SUCEEDED - GO HOME WITH 'C' CLEAR ; 1600$: TST (SP)+ ; FORGET OLD VALUE CLC ; CLEAR FAIL RETURN ; HOME ; ; ; FAILED - SET 'C' AND EXIT ; 1700$: .POP R0 ; RESTORE SEC ; SET FAIL RETURN ; HOME ; ; ; ; ; THIS ROUTINE COMPARES CHARACTERS IN STRINGS (R0) AND (R2) ; UNTILL A MISMATCH IS FOUND. AT EXIT THE REGISTERS POINT ; TO THE MISMATCH CHARACTERS. ; ; ; ; 2000$: SUB #4,SP ; reserve room on stack MOVB (R0),2(SP) ; get first byte BIC #^C377,2(SP) ; discard unwanted bits CMP 2(SP),#140 ; lower case? BLT 2010$ ; no --> skip BIC #^C137,2(SP) ; yes -> force upper case 2010$: MOVB (R2),(SP) ; get second byte BIC #^C377,(SP) ; discard unwanted bits CMP (SP),#140 ; lower case? BLT 2020$ ; no --> skip BIC #^C137,(SP) ; yes -> force upper case 2020$: CMP (SP)+,(SP)+ ; match? BNE 2200$ ; no --> 2200$ TSTB (R2) ; eos? BEQ 2200$ ; yes -> 2200$ CMPB (R0)+,(R2)+ ; bump up pointers BR 2000$ ; loop 2200$: RETURN ; done ; ; .END