.TITLE lib_item_list ; ; Doug Miller, April 1984 ; ; Turn the argument list into an item list for $GETDVI, $GETJPI, etc. ; $DSCDEF $SFDEF $SSDEF ; ITEM_W_BUFFER_LEN = 0 ITEM_W_CODE = 2 ITEM_A_BUFFER = 4 ITEM_A_RETLENGTH = 8 ITEM_B_BUFFER = 12 PARAM_W_ITEMCODE = 8 PARAM_A_BUFFER_DX = 12 PARAM_A_RETLENGTH = 16 ; .PSECT ITEM_LIST, CON, NOEXE, NOSHR, PIC, REL ITEMLIST: .BLKL 256 ITEM : .BLKL 3 ; .PSECT LIB_ITEM_LIST, CON, EXE, SHR, PIC, REL .ENTRY lib_item_list ^M ; ADDL3 #4, AP, R5 ; Create argument list pointer MOVAL @(R5)+, R6 ; Create current item address SUBL3 #1, (AP), R2 ; LOOP: MOVL (R5)+, R0 ; move current argument to R0 MOVL (R0)+, (R6)+ ; move buffer_length and item_code MOVQ (R0), (R6)+ ; move buffer_address and retlength_address SOBGTR R2, LOOP ; Count down the items ; CLRL (R6) ; Terminate item list RET ; .ENTRY lib_in_item ^M ; MOVAL @4(AP), R6 ; Create current item address CLRQ ITEM_A_BUFFER(R6) ; clear buffer and retlength addresses MOVAL @PARAM_A_BUFFER_DX(AP), R7 BEQL ITEMEND MOVAL ITEM_B_BUFFER(R6), ITEM_A_BUFFER(R6) CMPB DSC$B_CLASS(R7), #DSC$K_CLASS_VS BEQL IN_DVS IN_DX: MOVW DSC$W_LENGTH(R7), ITEM_W_BUFFER_LEN(R6) MOVC5 ITEM_W_BUFFER_LEN(R6), @DSC$A_POINTER(R7), #^A' ', #80, ITEM_B_BUFFER(R6) BRB ITEMEND IN_DVS: MOVW @DSC$A_POINTER(R7), ITEM_W_BUFFER_LEN(R6) ; use current length of varying string ADDL3 #2, DSC$A_POINTER(R7), R1 MOVC5 ITEM_W_BUFFER_LEN(R6), (R1), #^A' ', #80, ITEM_B_BUFFER(R6) BRB ITEMEND ; .ENTRY lib_out_item ^M MOVAL @4(AP), R6 ; Create current item address MOVAL @PARAM_A_BUFFER_DX(AP), R7 CMPB DSC$B_CLASS(R7), #DSC$K_CLASS_VS BEQL OUT_DVS OUT_DX: MOVL DSC$A_POINTER(R7), ITEM_A_BUFFER(R6) MOVW DSC$W_LENGTH(R7), ITEM_W_BUFFER_LEN(R6) MOVAL @PARAM_A_RETLENGTH(AP), ITEM_A_RETLENGTH(R6) BRB ITEMEND OUT_DVS:ADDL3 #2, DSC$A_POINTER(R7), ITEM_A_BUFFER(R6) MOVW DSC$W_LENGTH(R7), ITEM_W_BUFFER_LEN(R6) MOVAW @DSC$A_POINTER(R7), ITEM_A_RETLENGTH(R6) ; ITEMEND: MOVW PARAM_W_ITEMCODE(AP), ITEM_W_CODE(R6) RET ; .END