home *** CD-ROM | disk | FTP | other *** search
- ;--------------------------------------------------------------------------
- ; The following are offsets in the stack for the input parameters:
- ; The invoking statement is:
- ;
- ; Draw_Field(Row,Column,Size,Attrib : integer);
- ;--------------------------------------------------------------------------
- Attrib equ 4 ; Video Attribute to use
- FSize equ Attrib+2 ; Size of field to put out
- Column equ Attrib+4 ; Start column of field
- Row equ Attrib+6 ; Start row of field
- ;--------------------------------------------------------------------------
- ; Initialize registers for program to use
- ;--------------------------------------------------------------------------
- PUSH BP ; save base page register for Turbo
- MOV BP,SP ; set base pointer equal to stack pointer
- ;--------------------------------------------------------------------------
- ; Calculate Cursor Address in video memory
- ;--------------------------------------------------------------------------
- MOV AX,ROW[BP] ; Get Row value from parameter list
- DEC AX ; Decrement to fit format of 0..24 rows
- MOV DI,COLUMN[BP] ; Get Column value from parameter list
- DEC DI ; Decrement to fit format of 0.79 columns
- MOV BX,0040H ; Get segment address of video info
- MOV ES,BX ; Into Segment register (can't be done direct)
- MUL ES:WORD PTR[4AH]; Multiply row value by # of col's on screen
- ADD DI,AX ; Position = (row-1)*Screen_width+(col-1)
- SHL DI,1 ; times 2 for: attrib + value screen format
- INC DI ; Point at Attribute postion, not value!
-
- ;--------------------------------------------------------------------------
- ; Set up for checking video retrace
- ;--------------------------------------------------------------------------
- MOV DX,ES:WORD PTR[63H] ; get address of video hardware
- ADD DX,6 ; Offset of port which sees retrace interrupt
- MOV AX,0B800H ; Get segment address of video memory
- MOV ES,AX ; Into Segment register
- MOV CX,FSIZE[BP] ; Get # of bytes to fill from parameter list
- CMP CX,0 ; Check for zero length!
- JE EXIT ; Abort if true!!!!
- MOV AH,ATTRIB[BP] ; Get attribute value from parameter list
-
- ;--------------------------------------------------------------------------
- ; Wait for retrace to end (so we can get a full blanking period)
- ;--------------------------------------------------------------------------
- TEST_LOW:
- IN AL,DX ;
- TEST AL,1 ;
- JNZ TEST_LOW ;
- CLI ;
-
- ;--------------------------------------------------------------------------
- ; Ok, now wait for next retrace! (blanking period)
- ;--------------------------------------------------------------------------
- TEST_HI:
- IN AL,DX ;
- TEST AL,1 ;
- JZ TEST_HI ;
-
- ;--------------------------------------------------------------------------
- ; Now move attribute value to memory... (keep going until CX = 0!)
- ;--------------------------------------------------------------------------
- MOV ES:[DI],AH ; Store attribute into video memory
- INC DI ; Increment video pointer
- INC DI ; Twice (to get past next value byte)
- LOOP TEST_LOW ; Keep going until for "Size" # of bytes
-
- ;--------------------------------------------------------------------------
- ; Turn interrupts back on, and exit!
- ;--------------------------------------------------------------------------
- EXIT:
- POP BP ; restore base page register for Turbo
- STI ; Turn interrupts back on
-
- RET 8 ; Exit, and clear stack behind us!