PAGE 80,132 ;=================================================================== ; PROGRAM LISTING 13.2 ; PROCEDURE TO COMPUTE THE ADDRESS OF A TWO-DIMENSIONAL ARRAY ; ELEMENT GIVEN THE ROW AND COLUMN OF THE ELEMENT AND THE ; ARRAY DESCRIPTOR. THE ARRAY DESCRIPTOR IS A 7-BYTE DATA ; STRUCTURE THAT HAS THE FOLLOWING GENERAL FORM: ; ; BYTE(S) ³ CONTENTS ³ NAME ; ÚÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄ¿ ; ³ 0-1 ³ SEGMENT PORTION OF BASE ADDRESS OF ARRAY ³ SEG ³ ; ³ 2-3 ³ OFFSET PORTION OF BASE ADDRESS OF ARRAY ³ OFFSET ³ ; ³ 4 ³ TYPE OF ARRAY : 1 => BYTE; 2 => WORD ³ TYPE ³ ; ³ ³ 4 => DOUBLEWORD ³ ³ ; ³ 5 ³ NUMBER OF ROWS IN ARRAY ³ ROWS ³ ; ³ 6 ³ NUMBER OF COLUMNS IN ARRAY ³ COLS ³ ; ÀÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÙ ; INPUTS: DS:SI REGISTER PAIR CONTAINS BASE ADDRESS OF ARRAY DSCR ; DH-REG CONTAINS ROW NUMBER ; DL-REG CONTAINS COLUMN NUMBER ; OUTPUTS: ES:DI REG. PAIR ADDRESSES 1ST ELEMENT IN SPECIFIED ROW ; BP-REG CONTAINS OFFSET WITHIN ROW OF SPECIFIED COLUMN ; DX-REG CONTAINS DI-REGISTER OFFSET NEEDED TO MOVE 1 ROW ; OF-BIT OF FLAGS REGISTER (1 => OUT OF RANGE SUBSCRIPT) ;=================================================================== .MODEL SMALL,BASIC .CODE EX_13_2 ADDR_RM PROC FAR PUBLIC USES AX BX ;PROCEDURE ADDR_RM(DSCR,ROW,COL,RPTR,COFF,RINC) ;SAVE REGISTERS - USES CLAUSE PUSHF ;SAVE FLAGS POP BX ;TMP_FLGS = SAVED FLAGS .IF DH==0 || DH > 5[SI] || DL==0 || DL > 6[SI] ;IF ROW=0 OR ROW>DSCR.ROWS ; OR COL=0 OR COL>DSCR.COLS ;THEN OR BX,0800H ; SET OF BIT IN TMP_FLGS PUSH BX ; SAVED FLAGS = TMP_FLGS .ELSE ;ELSE AND BX,0F7FFH ; CLEAR OF BIT IN TMP_FLGS PUSH BX ; SAVED FLAGS = TMP_FLGS MOV ES,[SI] ; ES-REG = DSCR.SEG MOV AL,4[SI] ; COFF = DSCR.TYPE DEC DL ; * (COL - 1) MUL DL MOV BP,AX MOV DI,2[SI] ; RPTR = DSCR.OFFSET MOV AL,4[SI] ; + [DSCR.TYPE DEC DH ; * (ROW - 1) MUL DH MOV DL,6[SI] ; * DSCR.COLS] MOV DH,0 MUL DX ADD DI,AX MOV AL,6[SI] ; RINC = DSCR.COLS MUL BYTE PTR 4[SI] ; * DSCR.TYPE MOV DX,AX .ENDIF ;ENDIF POPF ;RESTORE FLAGS ;RESTORE REGISTERS-USES CLAUSE RET ;RETURN TO CALLER ADDR_RM ENDP ;END ADDR_RM END