117 lines
3.2 KiB
NASM
117 lines
3.2 KiB
NASM
;
|
|
;
|
|
DGROUP GROUP DATASEG
|
|
DATASEG SEGMENT PARA PUBLIC 'DATA'
|
|
FUNCT DW 0 ;function 1=6,0=7
|
|
FG_COLR DW 0 ;forground color
|
|
BG_COLR DW 0 ;backround color
|
|
LINES DW 0 ;number of lines to scroll or 0 for clear
|
|
ULROW DW 0 ;upper left row
|
|
ULCOL DW 0 ;upper left column
|
|
LRROW DW 0 ;lower right row
|
|
LRCOL DW 0 ;lower left column
|
|
ATTRIB DB 0 ;temp hold for attribute byte
|
|
CALNU DB 0 ;temp hold for call function 6 or 7
|
|
DATASEG ENDS
|
|
;
|
|
CSEG SEGMENT 'CODE'
|
|
ASSUME CS:CSEG
|
|
PUBLIC CLR
|
|
CLR 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 backround
|
|
N_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 around
|
|
F6: MOV AH,6H ;set function 6
|
|
OUT1: 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 basic
|
|
CLR ENDP
|
|
CSEG ENDS
|
|
END |