PAGE 60,132; CLR.ASM 05/29/84; Subroutine called by a basic program to scroll a window.;;DGROUP GROUP DATASEGDATASEG SEGMENT PARA PUBLIC 'DATA'FUNCT DW 0 ;function 1=6,0=7FG_COLR DW 0 ;forground colorBG_COLR DW 0 ;backround colorLINES DW 0 ;number of lines to scroll or 0 for clearULROW DW 0 ;upper left rowULCOL DW 0 ;upper left columnLRROW DW 0 ;lower right rowLRCOL DW 0 ;lower left columnATTRIB DB 0 ;temp hold for attribute byteCALNU DB 0 ;temp hold for call function 6 or 7DATASEG ENDS;CSEG SEGMENT 'CODE' ASSUME CS:CSEG PUBLIC CLRCLR PROC FAR PUSH BP ;BP unknown (don't care) MOV BP,SP ;set base for parm list PUSH DS ;DS -> basic work area PUSH ES ;ES -> basic work area MOV AX,DATASEG ;establish data addressability MOV DS,AX ;now DS -> my data ASSUME DS:DATASEG;; MOV SI,SS:[BP+6] ;get addr of parameter MOV AX,ES:[SI] ;get value of parm MOV FUNCT,AX MOV SI,SS:[BP+8] ;get addr of parameter MOV AX,ES:[SI] ;get value of parm MOV BG_COLR,AX MOV SI,SS:[BP+10] ;get addr of parameter MOV AX,ES:[SI] ;get value of parm MOV FG_COLR,AX MOV SI,SS:[BP+12] ;get addr of parameter MOV AX,ES:[SI] ;get value of parm MOV LINES,AX MOV SI,SS:[BP+14] ;get addr of parameter MOV AX,ES:[SI] ;get value of parm MOV ULROW,AX MOV SI,SS:[BP+16] ;get addr of parameter MOV AX,ES:[SI] ;get value of parm MOV ULCOL,AX MOV SI,SS:[BP+18] ;get addr of parameter MOV AX,ES:[SI] ;get value of parm MOV LRROW,AX MOV SI,SS:[BP+20] ;get addr of parameter MOV AX,ES:[SI] ;get value of parm MOV LRCOL,AX; MOV AX,1 SUB LRROW,AX ;convert 1-80 cols SUB LRCOL,AX ; and 1-25 rows into SUB ULROW,AX ; 0-79 cols and SUB ULCOL,AX ; 0-24 rows;; change forground & backround colors into single attribute byte; MOV BX,FG_COLR ;move foreground color to bx MOV AL,BL ;move lower byte to al MOV BX,BG_COLR ;move backround color to bx MOV AH,BL ;move lower byte to ah CMP AL,15 ;check for color > 15 ie blinking JG BLNK ;if > 15 then set blink bit AND AL,15 ;set normal fg color JMP N_BLNK ;BLNK: OR AL,128 ;set blink bit 7 AND AL,143 ;zero out bit 6,5,4 used for backroundN_BLNK: AND AH,7 ;zero out bit 7,6,5,4,3 used for forground MOV CL,4 ;4 bit shift count SHL AH,CL ;shift right 3 bits to pos 6,5,4 OR AL,AH ;combine for & back to form attribute byte MOV ATTRIB,AL ;move it to STORAGE;; convert 1 and 0 to 6 and 7 for routine call; MOV BX,FUNCT ;move function into bx CMP BL,0 ;compare to one JG F6 ;if 1 then function is 6 MOV AH,7H ;set function 7 JMP OUT1 ;jump aroundF6: MOV AH,6H ;set function 6OUT1: MOV CALNU,AH ;move it to storage;;; set up for bios rom call 10 function 6 (scroll up ); PUSH BX MOV BX,LINES ;set # of lines to scroll or 0 to clear MOV AL,BL ;put in pass register MOV BX,ULROW ;set upper left row of block 0-24 MOV CH,BL ;put in pass register MOV BX,ULCOL ;set upper left column of block 0-79 MOV CL,BL ;put in pass register MOV BX,LRROW ;set lower right row of block 0-24 MOV DH,BL ;put in pass register MOV BX,LRCOL ;set lower right column of block 0-79 MOV DL,BL ;put in pass register MOV BL,CALNU ;set call number 6 to scroll up 7 down MOV AH,BL ;put in pass register MOV BL,ATTRIB ;set color attribute byte MOV BH,BL ;put in pass register INT 10H ; make bios call POP BX;FINISH: POP ES POP DS POP BP RET 16 ;return to basicCLR ENDPCSEG ENDS END  
|