PAGE 80,132 ;=================================================================== ; PROGRAM LISTING 13.5 ; DISPLAY A TEXTUAL SHAPE AT A SPECIFIED POSITION ON VIDEO SCREEN ; INPUTS: DS:SI REGISTER PAIR ADDRESSES ARRAY CONTAINING SHAPE. ; FIRST 2 BYTES OF ARRAY CONTAIN SHAPE SIZE (NUMBER ; OF ROWS & COLUMNS). EACH SUBSEQUENT PAIR OF BYTES ; IS A PAIR TO BE STORED IN VIDEO BUFFER ; BH-REG CONTAINS VIDEO PAGE NUMBER ; DH:DL CONTAINS (ROW,COL) OF STARTING DISPLAY POSITION ; OUTPUT: SHAPE DISPLAYED AT SPECIFIED POSITION ON THE VIDEO SCREEN ;=================================================================== .MODEL SMALL,BASIC ;PROCEDURE TO EXTRN ADDR_RM:FAR ;COMPUTE ADDR OF 2D ARRAY REF EXTRN BLD_DSCR:FAR ;BUILD VIDEO BUFFER DESCRIPTOR ;======D A T A S E G M E N T D E F I N I T I O N================ .FARDATA DSCR_DATA DSCR DB 7 DUP(?) ;VIDEO BUFFER DESCRIPTOR ;======C O D E S E G M E N T D E F I N I T I O N================ .CODE EX_13_5 PUTSHAPE PROC FAR PUBLIC USES AX BX CX DX DI SI BP ES ;PROCEDURE PUTSHAPE(SPTR,PAGE_#,ROW,COL) ;SAVE REGISTERS - USES CLAUSE PUSHF ;SAVE FLAGS PUSH DS ;SAVE SPTR PUSH SI MOV AX,SEG DSCR_DATA ;SET DS-REGISTER TO ADDRESS MOV DS,AX ;SEGMENT DSCR_DATA LEA SI,DSCR ;DPTR = ADDRESS OF DSCR CALL BLD_DSCR ;CALL BLD_DSCR (PAGE_#,DPTR) CALL ADDR_RM ;CALL ADDR(DPTR,ROW,COL, ; RPTR,COFF,RINC) POP SI ;RESTORE SPTR POP DS CLD ;SET DF FOR INCREMENTING LODSB ;#_ROWS = SPTR->BYTE MOV AH,0 ;SPTR = SPTR + 1 MOV CX,AX LODSB ;#_COLS = SPTR->BYTE MOV BX,AX ;SPTR = SPTR + 1 .REPEAT ;REPEAT PUSH BX ; SAVE #_COLS PUSH BP ; SAVE COFF _REPEAT: ; REPEAT LODSW ; (RPTR+COFF)->WORD = MOV ES:[DI][BP],AX ; SPTR->WORD ; SPTR = SPTR + 2 ADD BP,2 ; COFF = COFF + 2 DEC BX ; #_COLS = #_COLS - 1 JNE _REPEAT ; UNTIL #_COLS = 0 POP BP ; RESTORE COFF POP BX ; RESTORE #_COLS ADD DI,DX ; RPTR = RPTR + RINC .UNTILCXZ ; #_ROWS = #_ROWS - 1 ;UNTIL #_ROWS = 0 POPF ;RESTORE FLAGS ;RESTORE REGISTERS SPECIFIED ; IN USES CLAUSE RET ;RETURN TO CALLER PUTSHAPE ENDP ;END PUTSHAPE ;=================================================================== END