My Library

A.N Edition
This is my own library. I found out in MASM it is very inconvenient as we don't have a standard built-in 
library like c, c++. So I decide to write my own version. Although it may not be as efficient as others do, 
at least they are my own version. This is an accumulative version that I continually add new codes.
B.Idea of program
1。 Basic idea: 
Try to write as many as possible c,c++ similar simple functions in MASM.
2。 Major function
A. INPUTNUMBER
;INPUT: NONE
;OUTPUT: BY AX, AND DX A VALID INTEGER, DX WILL BE INITIALIZE TO 0, BEFORE KEYIN BY USER
It is very easy to use "cin" in c, but behind scene, there is a lot job is going to be done for a single number input.
This version is incomplete, as I have not solved big number input, say number bigger than 65535. I originally thought to use 
DX to represent the big part. But it seems there is some problem.
B. GCD, LCM
These two functions are just for fun! I want to practice Euclide Algorithm. Do people ever want to find out "Greatest Common
Divisor" or "Least Common Multiplication"? LCM use GCD to calculate.
C. DISPLAYINTEGER
This is my favorite. As I spent so much time to try to find out dividing mechanism. DX must be 0, otherwise there will be overflow.
 
 
TITLE  MYLIB
COMMENT #	THIS IS MY LIBRARY ALTHOUGH MANY FUNCTIONS ARE JUST QUITE SAME AS
		# EXAMPLE GIVEN IN GRAPHIC, BUT I PREFER TO WRITE IT AGAIN BY MYSELF

DIM	        EQU 15
CELLSIZE	EQU 8;
VERTICAL_BAR    EQU	0BAH
HORIZONTAL_BAR	EQU	0CDH
UPPER_LEFT	EQU	0C9H
UPPER_RIGHT	EQU	0BBH

.DOSSEG
.MODEL SMALL

.DATA

MSGOVERFLOW DB "OVERFLOW!", "$"
MSGINVALIDNUMBER  DB "INVALID NUMBER!","$"

.CODE

PUBLIC ENTERGRAPHIC
PUBLIC ENTERTEXT
PUBLIC WAITRETURN
PUBLIC DRAWBOX
PUBLIC DRAWVERLINE
PUBLIC DRAWHORLINE
PUBLIC DRAWGRID
PUBLIC FILLGRID
PUBLIC DRAWBOARD
PUBLIC DISPLAYINTEGER
PUBLIC GCD
PUBLIC LCM
PUBLIC RETURN
PUBLIC SPACE
PUBLIC INPUTNUMBER
PUBLIC DRAWHORIZONTAL
PUBLIC DRAWVERTICAL
PUBLIC SHOWCHAR
;PUBLIC CLEARSCREEN
PUBLIC STRCPY
PUBLIC STRCMP
PUBLIC DISPLAYINTEGERB
PUBLIC DISPLAYINTEGERH
PUBLIC WAITRIGHTBTN
PUBLIC WAITLEFTBTN
PUBLIC MOUSERELEASE
PUBLIC MOUSESHOW
PUBLIC MOUSEHIDE
PUBLIC MOUSEINIT
PUBLIC MOUSEPOS
PUBLIC GETCELLINDEX
PUBLIC MOUSECLICK


;FUNCTION: INTERNAL METHOD CALC ARRAY INDEX, BY GIVING OFFSET OF X, Y
;INPUT: OFFSET OF X,OFFSET OF Y, DIM OF GRID, CELLSIZE
;OUTPUT: ROW, COL BY STACK, ROW =-1 INDICATE OUTSIDE, OR ON GRIDLINE!!!
CALCINDEX    PROC NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		PUSH SI
		;FIRST CALC BOUNDS TO SEE IF IT IS OUTSIDE WHICH IS EASIEST 
		MOV AX, [BP+6]; THE DIM
		MOV CX, [BP+4]; THE CELL SIZE
		INC CX; AS THERE ARE ONE LINE TO BE ADDED
		MUL CX; 
		INC AX; AS THERE IS ONE LINE AT BOUND, AX IS BOUNDSIZE
		MOV BX, [BP+10]; BX IS X OFFSET
		CMP BX, 00H
		JL OUTBOUNDS; IF OFFSET IS MINUS, OUTSIDE

		CMP AX, BX
		JL OUTBOUNDS
		MOV BX, [BP+8]; BX IS Y OFFSET
		CMP BX, 00H
		JL OUTBOUNDS; IF OFFSET IS MINUS, OUTSIDE
		CMP AX, BX
		JL OUTBOUNDS
		;NOW FIRST CALC Y, OR ROW INDEX
		MOV AX, BX; Y OFFSET
		
		XOR DX, DX; MAKE SURE DX IS 0 BEFORE DIVIDING!!!
		DIV CX;
		CMP DX, 00H; TO SEE IF IT IS ON GRID LINE!
		JE OUTBOUNDS; ON GRIDLINE IS SAME EFFECT AS OUTSIDE
		MOV SI, AX; THE QUOTIENT IS INDEX OF ROW; BUT UNLESS COL IS NOT ON GRIDLINE
		MOV AX, [BP+10]; THE OFFSET X
		XOR	DX, DX; CLEAR DX BEFORE DIV
		DIV CX
		CMP DX, 00H
		JE OUTBOUNDS
		MOV [BP+10], SI; THE ROW INDEX
		MOV [BP+8], AX; THE COL INDEX
		JMP CALCINDEX_
OUTBOUNDS:
		MOV AX, -1;
		MOV [BP+10], AX
		
CALCINDEX_:
		POP SI
		POP DX
		POP CX
		POP BX
		POP AX
		POP BP
		RET 4
CALCINDEX	ENDP



;FUNCTION: GET ROW,COL OF A GRID BY GIVING LEFTTOP COOR, X POS,Y POS, CELLSIZE, 
;          DIMENSION OF GRID
;INPUT: ORIGIN X,ORIGIN Y, MOUSEPOS X, MOUSEPOS Y, DIM OF GRID, CELLSIZE
;OUTPUT: BX=ROW, SI=COL; IF OUTSIDE, BX=-1
GETCELLINDEX	PROC NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH CX
		PUSH DX		
		MOV AX, [BP+14]; X ORIGIN
		MOV CX, [BP+10]; MOUSE POS X
		SUB CX, AX; XPOS - X ORIGIN
		PUSH CX; PASS OFFSET X
		MOV AX, [BP+12]; THE Y ORIGIN
		MOV DX, [BP+8]; MOUSE POS Y
		SUB DX, AX; YPOS - Y ORIGIN
		PUSH DX; PASS OFFSET Y
		MOV AX, [BP+6]; DIM
		PUSH AX
		MOV AX, [BP+4]; CELLSIZE
		PUSH AX
		CALL CALCINDEX
		POP SI; COL IS FIRST
		POP BX; ROW IS SECOND??

		POP DX
		POP CX
		POP AX
		POP BP
		RET 12
GETCELLINDEX	ENDP

		


;FUNCTION: TO GET COORDINATE OF MOUSE
;OUTPUT: CX=X, DX=Y
;INPUT: NONE
MOUSEPOS	   	PROC NEAR
		PUSH AX
		PUSH BX
		MOV AX, 03H
		INT 33H
		POP BX
		POP AX
		RET
MOUSEPOS	ENDP


;FUNCTION: RETURN UNTIL RIGHT MOUSE BUTTON IS CLICKED
;INPUT: NONE
;OUTPUT: NONE
WAITRIGHTBTN	PROC	NEAR
		PUSH BX
		PUSH CX
		PUSH DX
WAITCLICK3:
		CALL MOUSECLICK
		CMP BX, 02H
		JNE WAITCLICK3
		POP DX
		POP CX
		POP BX
		RET
WAITRIGHTBTN	ENDP		

;FUNCTION: RETURN UNTIL LEFT MOUSE BUTTON IS CLICKED
;INPUT: NONE
;OUTPUT: NONE
WAITLEFTBTN	PROC	NEAR
		PUSH BX
		PUSH CX
		PUSH DX
WAITCLICK4:
		CALL MOUSECLICK
		CMP BX, 01H
		JNE WAITCLICK4
		POP DX
		POP CX
		POP BX
		RET
WAITLEFTBTN	ENDP			
		

;FUNCTION: RETURN UNTIL MOUSE BUTTON IS CLICKED
;INPUT: NONE
;OUTPUT: BX IS STATE OF BUTTON, CX=X, DX=Y
MOUSECLICK	PROC	NEAR
		PUSH AX
		MOV AX, 03H
WAITCLICK1:
		INT 33H
		CMP BX, 00H
		JE WAITCLICK1
		POP AX
		RET
MOUSECLICK	ENDP


;FUNCTION: RETURN UNTIL MOUSE BUTTON IS RELEASED
;INPUT: NONE
;OUTPUT: BX IS STATE OF BUTTON, CX=X, DX=Y
MOUSERELEASE	PROC	NEAR
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		MOV AX, 03H
WAITCLICK2:
		INT 33H
		CMP BX, 00H
		JNE	WAITCLICK2
		POP DX
		POP CX
		POP BX
		POP AX
		RET
MOUSERELEASE	ENDP


;FUNCTION: SHOW MOUSE
;INPUT: NONE
;OUTPUT: NONE
MOUSESHOW	PROC NEAR
		PUSH AX
		MOV AX, 01H
		INT 33H
		POP AX
		RET
MOUSESHOW	ENDP

;FUNCTION: HIDE MOUSE
;INPUT: NONE
;OUTPUT: NONE
MOUSEHIDE	PROC NEAR
		PUSH AX
		MOV AX, 02H
		INT 33H
		POP AX
		RET
MOUSEHIDE	ENDP
		


;FUNCTION: INITIALIZE MOUSE DRIVER
;INPUT: NONE
;OUTPUT: NONE
MOUSEINIT	PROC NEAR
		PUSH AX
		MOV AX, 00H
		INT 33H
		CMP AX, 0; 0 MEANS OK
		JNE MOUSEINIT_
		PUSH DS
		PUSH DX
		MOV AX, CS
		MOV DS, AX
		MOV AH, 09H
		MOV DX, OFFSET MOUSEERRORMSG
		INT 21H
		POP DX
		POP DS
		MOV AX, 04C01H
		INT 21H

MOUSEINIT_:
		POP AX
		RET
MOUSEERRORMSG DB "!!!!!!!MOUSE DRIVER NOT INITIALIZED!"
			  DB "TERMINATING PROGRAM!!! 0DH, 0AH", "$"
MOUSEINIT	ENDP

		


;FUNCTION: DISPLAY A INTEGER IN BINARY FORM
;INPUT: BY STACK A INTEGER
;OUTPUT: NONE
DISPLAYINTEGERB	PROC NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		XOR BX, BX
		MOV BX, [BP+4]; THE NUMBER IN BX
		MOV CX, 4
		MOV AH, 02H
L20:
		PUSH CX
		MOV CX, 4; SPLIT INTO 4X4 TO INSERT SPACE IN BETWEEN
L4BITS:
		MOV DL, 00H
        	RCL BX, 1
		ADC DL, 30H
		INT 21H
		LOOP L4BITS
		POP CX
		CALL SPACE
		
		LOOP L20
		POP DX
		POP CX
		POP BX
		POP AX
		POP BP
		RET 2
DISPLAYINTEGERB ENDP

;FUNCTION: DISPLAY A INTEGER IN HEXIDECMAL
;INPUT: BY STACK A INTEGER
;OUTPUT: NONE
DISPLAYINTEGERH	PROC	NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
        MOV BX, [BP+4];
        MOV CX, 4;

L129:
		PUSH CX; CANNOT ROL BX, 4???!!!
		MOV CX, 4
L128:
        ROL BX, 1;
		LOOP L128
		POP CX; RESTORE CX
		
		MOV AX, BX
		MOV DX, 0FH; DX AS MASK
		AND AX, DX; AX GET THE HEX
		MOV DL, 00H
		CMP AX, 9
        	JS  ADD30H
		MOV DL, 17
ADD30H:
		ADD DL, 30H
		ADD DL, AL; ADD THE HEX TO 
		MOV AH, 02H
		INT 21H
                LOOP L129
		MOV DL, 'H'
		INT 21H
		POP DX
		POP CX
		POP BX
		POP AX
		POP BP
		RET 2
DISPLAYINTEGERH	ENDP


		


;FUNCTION: CMP STRING BYTE BY BYTE
;INPUT: BY STACK THE TWO STRING ADD
;OUTPUT: AX, 0=EQUAL, 1=FIRST BIGGER, -1=SECOND BIGGER
STRCMP	PROC	NEAR
		PUSH BP
		MOV BP, SP
		PUSH SI
		PUSH DI
		PUSH ES
		MOV DI, [BP+6]; THE FIRST
		MOV SI, [BP+4]; THE SECOND
		MOV AX, DS
		MOV ES, AX
BEGINCMP:
		;CMP BYTE [DI], [SI]

		
		JG	FIRSTBIG
		;JL	SECONDBIG
		;JMP ENDCMP
FIRSTBIG:
		MOV AX, 1
		JMP ENDCMP
SECONDBIG:
		MOV AX, -1
		JMP ENDCMP
ENDCMP:
		MOV AX, 0
		POP ES
		POP DI
		POP SI
		POP BP
		RET
STRCMP	ENDP
		


;FUNCTION: COPY STRING TERMINATED WITH "$"
;OUTPUT: NONE
;INPUT:BY STACK, DEST ADD, SOURCE ADD
STRCPY	PROC	NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH SI
		PUSH DI
		PUSH ES
		MOV SI, [BP+4]; SOURCE
		MOV DI, [BP+6]; DEST
		MOV AX, DS
		MOV ES, AX

		REP MOVSB; MOV BYTE BY BYTE UNTIL "$"
		
		POP ES
		POP DI
		POP SI
		POP AX
		POP BP
		RET 4
STRCPY	ENDP




CLEARSCREEN	PROC NEAR
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		XOR AL, AL
		XOR CX, CX
		MOV DH, 24
		MOV DL, 79
		MOV BH, 07H
		MOV BH, 06H
		INT 10H
		POP DX
		POP CX
		POP BX
		POP AX
		RET
CLEARSCREEN	ENDP


;DRAW VERTICAL BAR
;INPUT:NONE
;OUTPUT: NONE
DRAWVERTICAL	PROC	NEAR
		PUSH DX
		MOV DL, VERTICAL_BAR
		CALL SHOWCHAR
		POP DX
		RET
DRAWVERTICAL	ENDP

;DRAW HORIZONTAL BAR
;INPUT:NONE
;OUTPUT: NONE
DRAWHORIZONTAL	PROC	NEAR
		PUSH DX
		MOV DL, HORIZONTAL_BAR
		CALL SHOWCHAR
		POP DX
		RET
DRAWHORIZONTAL	ENDP	

;FUNCTION: SHOW A CHAR
;INPUT: ONE CHAR IN DL
;OUTPUT: NONE
SHOWCHAR	PROC	NEAR
		PUSH AX
		MOV AH, 02H
		INT 21H
		POP AX
		RET
SHOWCHAR	ENDP


;FUNCTION: GET A KEYED IN VALID INTEGER FROM USER
;INPUT: NONE
;OUTPUT: BY AX, AND DX A VALID INTEGER, DX WILL BE INITIALIZE TO 0, 
;BEFORE KEYIN BY USER
INPUTNUMBER	PROC NEAR
		PUSH BX
		PUSH CX
		MOV AH, 00H
		MOV BX, 00H
		MOV DX, 00H
		MOV CX, 00H; CX STORE THE OLD NUMBER
NOMORE:
		MOV AH, 01H
		INT 21H
		MOV BL, AL; STORE NEW NUMBER
		MOV AX, CX
		CMP BL, 0DH
		JE	ENDINPUTLOOP
		CMP BL, 30H
		JL	NOTINTEGER
		CMP BL, 39H
		JG	NOTINTEGER
		SUB BL, 30H
		
		MOV CX, 10
		MUL CX; MUL OLD NUMBER BY 10
		CMP DX, 00H
		JNE	L19
		ADD AX, BX; ADD NEW NUMBER
		JO	L19
		MOV CX, AX; AND DX REMAINS UNCHANGED IF THERE IS ANY NUMBER
		JMP NOMORE
L19:
		MOV DX, OFFSET MSGOVERFLOW
		CALL SHOWMSG
		JMP ENDALL		
NOTINTEGER:
		MOV AH, 09H
		MOV DX, OFFSET MSGINVALIDNUMBER
		INT 21H
		JMP ENDALL
ENDINPUTLOOP:
		MOV AX, CX
ENDALL:		
		POP BX
		POP CX
		RET
INPUTNUMBER ENDP


;FUNCTION: SHOW A STRING MESSAGE
;OUTPUT: NONE
;INPUT: DX CONTAIN THE OFFSET OF MSG		
SHOWMSG	PROC	NEAR
		PUSH AX
		MOV AH, 09H
		INT 21H
		CALL RETURN;
		POP AX
		RET
SHOWMSG	ENDP
			


SPACE	PROC	NEAR
		PUSH AX
		PUSH DX
		MOV AH, 02
		MOV DL, ' '
		INT 21H
		POP DX
		POP AX
		RET
SPACE	ENDP


;FUNCTION: RETURN TO NEW LINE;(VERY FUNNY?)
;INPUT: NONE
;OUTPUT: NONE
RETURN	PROC	NEAR
		PUSH AX
		PUSH DX
		MOV AH, 02H
		MOV DL, 0DH
		INT 21H
		MOV DL, 0AH
		INT 21H
		POP DX
		POP AX
		RET
RETURN ENDP

;FUNCTION: FIND THE LEAST COMMON MULTIPLICATION
;INPUT: BY STACK, TWO NUMBERS
;OUTPUT; BY STACK, THE LEAST COMMON MULTIPLICATION
LCM	 PROC NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH DX
		MOV AX, [BP+6]; THE FIRST NUMBER
		MOV DX, [BP+4]; THE SECONDE NUMBER
		PUSH AX
		PUSH DX
		CALL GCD; TO FIND THEIR GCD
		MUL DX; FIND THE MULTIPLICATION OF TWO NUMBER
		POP BX; BX IS THE GCD
		DIV BX; THIS GET THE LCM
		MOV [BP+6], AX
		POP DX
		POP BX
		POP AX
		POP BP
		RET 2
LCM ENDP



;FUNCTION: DISPLAY A INTEGER IN ASCII
;INPUT: BY STACK A INTEGER
;OUTPUT: NONE
DISPLAYINTEGER	PROC
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		MOV AX, [BP+4]; THE INTEGER
		MOV BX, 10; THE DIVISOR
		MOV CX, 00H
DIVIDINGLOOP:
		MOV DX, 00H
		DIV BX
		PUSH DX
		INC CX;
		CMP AX, 00H
		JNE	DIVIDINGLOOP

		MOV AH, 02H
DISPLAYLOOP:
		POP DX;
		ADD DX, 30H
		INT 21H
		LOOP DISPLAYLOOP;
		POP DX
		POP CX
		POP BX
		POP AX
		POP BP
		RET	2;
DISPLAYINTEGER	ENDP

		
;GREATEST COMMON DIVISOR
;INPUT: BY STACK, TWO INTEGER
;OUTPUT: BY STACK GCD
GCD	PROC NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX		
		MOV AX, [BP+6]; THE DIVIDANT
		MOV BX, [BP+4]; THE DIVISOR
		
GCDLOOP:
		MOV DX, 00H; IMPORTANT
		DIV BX
		CMP DX, 00H
		JE	OUTGCDLOOP
		MOV AX, BX; DIVISOR BECOME DIVIDANT
		MOV BX, DX; THE REMAINDER BECOME DIVISOR
		JMP GCDLOOP
OUTGCDLOOP:
		MOV [BP+6], BX
		POP DX
		POP CX
		POP BX
		POP AX
		POP	BP
		RET 2;
GCD ENDP


; INPUT: NONE
; OUTPUT: NONE
; FUNCTION: CHANGE TO GRAPHIC MODE
ENTERGRAPHIC PROC
		PUSH AX
		MOV AX, 0A000H
		MOV ES, AX
		MOV AH, 00H
		MOV AL, 13H
		INT 10H
		;CALL REFRESH
		POP AX
		RET
ENTERGRAPHIC ENDP

;INPUT: NONE
DRAWBOARD	PROC
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		MOV AX, 20
		PUSH AX; X
		PUSH AX; Y
		MOV AX, 8
		PUSH AX; 8 ROW
		PUSH AX; 8 COL
		MOV AX, 20; WIDTH
		PUSH AX
		MOV AX, 11
		PUSH AX; COLOR
		CALL INTERNALDRAWGRID

		MOV CX, 0
LOCAL10:
		CMP CX, 8
		JE OUTLOCAL10
		MOV BX, CX
		PUSH CX; SAVE ROW NUMBER
		MOV CX, 0; START THE NEW COL
LOCAL11:
		CMP CX, 8
		JE ENDOUTER
		; THE PARAM ARE SAME
		MOV AX, 20
		PUSH AX; X
		PUSH AX; Y
		PUSH BX; ROW
		PUSH CX; COL
		MOV AX, 20; WIDTH
		PUSH AX

		;THE FOLLOWING IS COLOR BY  ROW AND COL
		MOV AX, CX;
		
		AND AX, 1
		CMP AX, 0
		JE COLEVEN
		;COL IS ODD
		MOV AX, BX
		
		AND AX, 1
		CMP AX, 0
		JE BLACKDRAW; ODD+EVEN=BLACK
		JMP WHITEDRAW; ODD +ODD = WHITE

COLEVEN:
		MOV AX, BX
	
		AND AX, 1
		CMP AX, 0
		JE WHITEDRAW ; EVEN+EVEN = WHITE
		JMP BLACKDRAW ; EVEN +ODD = BLACK
		
WHITEDRAW:
		
		MOV AX, 15; WHITE		
		JMP NEXTDRAW
BLACKDRAW:
		MOV AX, 8; BLACK
		
NEXTDRAW:
		PUSH AX
		CALL FILLGRID
ENDINNER:
		INC CX
		JMP LOCAL11		
		
ENDOUTER:
		POP CX
		INC CX
		JMP LOCAL10	
OUTLOCAL10:			


		POP DX
		POP CX
		POP BX
		POP AX
		RET
DRAWBOARD ENDP



;INPUT X, Y, ROW, COL, WIDTH, COLOR
INTERNALDRAWGRID	PROC
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		PUSH SI
		PUSH DI

		MOV AX, [BP+12]; Y
		MOV BX, 320
		MUL BX
		ADD AX, [BP+14]; +X
		MOV BX, AX; BX HOLDS THE OFFSET
		MOV SI, [BP+10]; THE ROW
		MOV DI, [BP+8]; THE COL

		MOV AX, [BP+6]; THE GRIDLENGTH
		MUL SI; CAL ROW LENGTH
		ADD SI, AX; PLUS THE ROW LINE WIDTH
		INC SI; ONE MORE LINE FOR ROW, AS 15 ROW HAS 16 LINE, SI IS THE HEIGHT

		MOV AX, [BP+6]; GRIDLENGTH TO PREPARE TO CAL COL LENGTH
		MUL DI; CAL COL LEN
		ADD DI, AX; DI IS LENGTH OF COL
		INC DI; ONE MORE LINE, DI IS THE WIDTH OF GRID IN TOTAL

		MOV DX, [BP+4]; COLOR
		MOV CX, [BP+10]; THE ROW NUMBER
		INC CX; ONE MORE LINE
		PUSH BX

ROWLOOP:
		PUSH CX; SAVE CX FOR INNER LOOP
		PUSH BX; SAVE OFFSET
		MOV CX, DI; THE WIDTH OF EACH ROW LINE
HORLINELOOP:
		MOV ES:[BX], DL
		INC BX
		LOOP HORLINELOOP
		POP BX; RESTORE OFFSET

		; CAL THE OFFSET OF NEXT ROW
		MOV AX, [BP+6]; THE LENGTH OF EACH GRID
		INC AX; THE DIFFERENCE OF LINE OF NEXT ROW
		PUSH DX
		MOV DX, 320
		MUL DX
		POP DX

		ADD BX, AX; CHANGE LINE
		POP CX; RESTORE THE ROW COUNTER
		LOOP ROWLOOP

		POP BX; THIS IS THE ORIGINAL OFFSET FOR COL USE
		MOV CX, [BP+8]; THE COL NUMBER
		INC CX; ONE MORE LINE
COLLOOP:
		PUSH CX
		PUSH BX
		MOV CX, SI; THE HEIGHT OF TOTAL GRID
VERLINELOOP:
		MOV ES:[BX], DL
		ADD BX, 320
		LOOP VERLINELOOP
		POP BX
		POP CX
		; NEXT COL IS THE LENGTH OF GRID
		MOV AX, [BP+6]; THE LENGTH OF GRID
		INC AX; ONE MORE LINE
		ADD BX, AX
		LOOP COLLOOP;

		POP DI
		POP SI
		POP DX
		POP CX
		POP BX
		POP AX
		POP BP
		RET 12
INTERNALDRAWGRID	ENDP

;INPUT ROW, COL, SIZE OF EACH CELL
;OUT PUT X, Y OFFSET BY STACK
CALCOFFSET  PROC
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		MOV  CX, [BP+4]; THE SIZE OF CELL
		INC CX; THE DIFFERENCE BTW TWO CELL

		MOV AX, [BP+8]; THE ROW
		MUL CX; EACH ROW OFFSET
		MOV BX, AX; SAVE IN BX THE Y OFFSET

		MOV AX, [BP+6]; THE COL
		MUL CX; THE X DIFFERENCE
		MOV [BP+8], AX; SAVE THE X
		MOV [BP+6], BX; SAVE THE Y
		POP CX
		POP BX
		POP AX
		POP BP
		RET 2
CALCOFFSET  ENDP

REFRESH	PROC
		PUSH AX
		PUSH BX
		PUSH CX
		MOV AX, 00H
		MOV CX, 64000
		MOV BX, 0
LOCAL1:
		MOV ES:[BX], AL		
		INC BX
		LOOP LOCAL1
		POP CX
		POP BX
		POP AX
		RET
REFRESH   ENDP

;INPUT: ORIGIN OF X,Y,ROW,COL,SIZE OF CELL,COLOR
FILLGRID	PROC  NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		MOV CX, [BP+6]; THE SIZE OF CELL

		MOV AX, [BP+10]; ROW INDEX
		PUSH AX; PREPARE PARAM FOR "CALCOFFSET" CALL
		MOV AX, [BP+8]; THE COL INDEX
		PUSH AX
		PUSH CX; PASS THE SIZE
		CALL CALCOFFSET
		POP BX; IT IS Y OFFSET
		ADD BX, [BP+12]; PLUS ORIGINAL Y
		POP AX; THE NEW X
		ADD AX, [BP+14]; PLUS ORIGINAL X
		MOV DX, [BP+4]; THE COLOR
		INC AX
		INC BX
		PUSH AX; X
		PUSH BX; Y
		PUSH CX; THE SIZE OF BOX
		PUSH DX; THE COLOR OF BOX
		CALL DRAWBOX
		POP DX
		POP CX
		POP BX
		POP AX
		POP BP
		RET 12
FILLGRID	ENDP


; INPUT X,Y
DRAWGRID	PROC NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		MOV AX, [BP+6]; THE X
		PUSH AX
		MOV AX, [BP+4]; THE Y
		PUSH AX
		MOV AX, DIM
		PUSH AX
		PUSH AX
		MOV AX, CELLSIZE
		PUSH AX
		MOV AX, 0EH; THE COLOR OF YELLOW
		PUSH AX
		CALL INTERNALDRAWGRID
		POP AX
		POP BP
		RET 4;
DRAWGRID ENDP

;INPUT: X,Y,LENGTH,COLOR BY STACK
;OUTPUT: NONE
;FUNCTION: DRAW HORIZONTAL LINE WITH STARTING COORDINATE, LENGTH, COLOR,
DRAWHORLINE	PROC
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH ES
		MOV AX, 0A000H
		MOV ES, AX
		MOV AX, [BP+8]; THE Y
		MOV BX, 320
		MUL BX
		ADD AX, [BP+10]; X
		MOV BX, AX; BX HOLDS THE OFFSET ORIGIN
		MOV CX, [BP+6]; THE LENGTH
		MOV AX, [BP+4]
HLINE:
		MOV ES:[BX], AL; DRAW THE LINE
		INC BX
		LOOP HLINE
		POP ES
		POP CX
		POP BX
		POP AX
		POP BP
		RET 8
DRAWHORLINE	ENDP

DRAWVERLINE	PROC
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH ES
		MOV AX, [BP+8]; THE Y
		MOV BX, 320
		MUL BX
		ADD AX, [BP+10]; ADD THE X
		MOV BX, AX; BX HOLDS THE OFFSET
		MOV CX, [BP+6]; THE LENGTH
		MOV AX, [BP+4]; THE COLOR
VLINE:
		MOV ES:[BX], AL
		ADD BX, 320
		LOOP VLINE
		POP ES
		POP CX
		POP BX
		POP AX
		POP BP
		RET 8
DRAWVERLINE	ENDP


ENTERTEXT PROC
		PUSH AX
		MOV AH, 00H
		MOV AL, 03H
		INT 10H
		MOV AX, 0B800H
		MOV ES, AX
		POP AX
		RET
ENTERTEXT ENDP

;INPUT: NONE
;OUTPUT: NONE
;FUNCTION SIMPLY WAIT FOR ANY KEY TO BE PRESSED
WAITRETURN  PROC
		PUSH AX
		XOR AX, AX
		MOV AH, 01H
CHECK:
		INT 21H
		CMP AL, 0DH
		JNE CHECK
		POP AX
		RET
WAITRETURN  ENDP

;INPUT: X, Y, LENGTH, COLOR BY STACK
;OUTPUT: NONE
;FUNCTION: DRAW A BOX OF WHICH THE LEFTTOP HAS COORDINATE OF (X,Y),LENGTH, COLOR
;SAVE ES INTERNALLY,
DRAWBOX     PROC  NEAR
		PUSH BP
		MOV BP, SP
		PUSH AX
		PUSH BX
		PUSH CX
		PUSH DX
		PUSH ES
		MOV AX, 0A000H
		MOV ES, AX
		MOV BX, [BP+10]; X
		MOV AX, [BP+8]; Y

		MOV CX, 320
		MUL CX
		ADD BX, AX; BX IS OFFSET=320* Y + X
		MOV AX, [BP+4]; COLOR
		MOV CX, [BP+6]; R
		MOV DX, CX ;DX SAVE LENGTH

BOXLOOP:
		PUSH CX; SAVE OUTTER COUNTER
		PUSH BX; SAVE OFFSET
		MOV CX, DX; NEW START
SINGLELOOP:
		MOV ES:[BX], AL
		INC BX
		LOOP SINGLELOOP
		POP BX
		ADD BX, 320;NEXT LINE
		POP CX
		LOOP BOXLOOP
		POP ES
		POP DX
		POP CX
		POP BX
		POP AX
		POP BP
		RET 8
DRAWBOX     ENDP

END


 

 

 

 

                                                        back.gif (341 bytes)       up.gif (335 bytes)         next.gif (337 bytes)

Hosted by www.Geocities.ws

1