PAGE 80,132 ;=================================================================== ; PROGRAM LISTING 13.4 ; ; PROCEDURE TO BUILD A VIDEO BUFFER DESCRIPTOR IN THE ARRAY POINTED ; TO BY THE DS:SI REGISTER PAIR. THE PROCEDURE BUILDS THE DESCRIPTOR ; FOR ANY MDA, CGA, EGA, MCGA, OR VGA TEXT MODE. PROCEDURE IN_TMODE ; IS USED TO VERIFY THAT THE VIDEO SUBSYSTEM IS CURRENTLY IN A TEXT ; MODE. IF NOT IN A TEXT MODE, PROCEDURE IN_TMODE SETS THE VIDEO ; SUBSYSTEM TO THE MODE SPECIFIED BY THE INITIAL VIDEO MODE RETURNED ; BY SOFTWARE INTERRUPT TYPE 11 HEX. ; ; INPUTS: BH-REGISTER CONTAINS PAGE NUMBER (CGA, EGA, MCGA AND VGA) ; DS:SI REGISTER PAIR CONTAINS ADDRESS OF ARRAY, IN WHICH ; DESCRIPTOR IS TO BE BUILT. ; OUTPUT: VIDEO DESCRIPTOR IN ARRAY ADDRESSED BY DS:SI REGISTER PAIR ;=================================================================== .MODEL SMALL,BASIC ;=================================================================== ;FUNCTION TO EXTRN IN_TMODE:FAR ;VERIFY THAT VIDEO SUBSYSTEM ;IS IN A TEXT MODE ;=================================================================== .CODE EX_13_4 BLD_DSCR PROC FAR PUBLIC USES AX BX DX ;PROCEDURE BLD_DSCR (PAGE_#,PTR) ;SAVE REGISTERS SPECIFIED ; IN USES CLAUSE PUSHF ;SAVE FLAGS CALL IN_TMODE ; = IN_TMODE() MOV BYTE PTR 4[SI],2 ;[PTR+4]->BYTE = 2 MOV BYTE PTR 5[SI],25 ;[PTR+5]->BYTE = 25 MOV BYTE PTR 6[SI],AH ;[PTR+6]->BYTE = WIDTH .IF AL == 7 ;IF MODE = 7 ; ;THEN MOV WORD PTR [SI],0B000H; PTR->WORD = B000 HEX ; .ELSE ;ELSE MOV WORD PTR [SI],0B800H; PTR->WORD = B800 HEX .ENDIF ;ENDIF AND AX,1800H ;CONVERT WIDTH TO PAGE_SIZE MOV BL,BH ;[PTR+2]->BYTE = PAGE_SIZE MOV BH,0 ; * PAGE_# MUL BX MOV WORD PTR 2[SI],AX POPF ;RESTORE FLAGS ;RESTORE REGISTERS SPECIFIED ; IN USES CLAUSE RET ;RETURN TO CALLER BLD_DSCR ENDP ;END BLD_DSCR ;=================================================================== END