dougm@kuhub.cc.ukans.edu (Douglas Miller) (12/04/88)
Here is an improve version of the cursor program. It is set up as an assembly procedure to be linked (see DEMO) during compilation of your TURBO 4.0 program. I have tested it on both an IBM and a ZENITH and it works. You should run MASM on CURSOR.asm and then place CURSOR.obj in the subdirectory where you plan to compile. I suppose it will also work with TURBO C but I can't say for sure. Doug ****************************************************************************** ASSEMBLY PROCEDURE TO SET THE CURSOR ****************************************************************************** -------cut here-------- ; CURSOR.asm ; ; This program will turn on the cursor at the 6845 CRT controller. ; ; Constants ; ADDRPORT = 03D4H DATAPORT = 03D5H ; CODE SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:CODE PUBLIC CURSOR CURSOR PROC NEAR MOV BX,SP MOV AL,SS:[BX+2] ;Get byte passed by pascal CMP AL,0 JE OFF CMP AL,1 JE ON JMP SHORT TERM OFF: MOV DX,ADDRPORT MOV AL,10 ;10d sent to the address port OUT DX,AL ; sets up the cursor start reg. MOV DX,DATAPORT MOV AL,20H ;Cursor off code OUT DX,AL JMP SHORT TERM ON: MOV DX,ADDRPORT MOV AL,10 OUT DX,AL MOV DX,DATAPORT MOV AL,6H ;Standard DOS 2-line cursor OUT DX,AL ; starts at 6 and ends at 7 MOV DX,ADDRPORT ;Insert other values depending on MOV AL,11 ; your desires and the demands OUT DX,AL ; of your system. I haven't tried MOV DX,DATAPORT ; on anything other than CGA. MOV AL,7H ;11d sent to the addr port sets OUT DX,AL ; up the cursor end reg. TERM: RET 2 CURSOR ENDP CODE ENDS END CURSOR ---------cut here-------- ***************************************************************************** PASCAL DEMO PROGRAM (uses TURBO 4.0) ***************************************************************************** ---------cut here-------- program cursor1; uses Crt; var c : Char; {$L CURSOR.OBJ} procedure cursor(off_on : Byte); external; {[0=off, 1=on]} begin writeln('Turning cursor off'); cursor(0); c := ReadKey; writeln('Turning cursor on'); cursor(1); c := ReadKey; end.
schanck@dinghy.cis.ohio-state.edu (Christopher Schanck) (12/05/88)
In article <2021@kuhub.cc.ukans.edu> dougm@kuhub.cc.ukans.edu (Douglas Miller) writes: > >Here is an improve version of the cursor program. It is set up as an > OUT DX,AL ; of your system. I haven't tried > MOV DX,DATAPORT ; on anything other than CGA. ^^^^^^^^^^^^^^^^^^^^^^^^^^^ You would have been irked if you had; it won't work. The EGA and the BIOS don't work towell together when it comes to scan lines. Start/End lines which give no cursor on CGA give sort of a block on EGA. It is a colossal pain. The following routines are for TC, but could be converted easily. /* you will have to figure the includes */ Joel, Try these routines; they work beautifully for me. You can see what I did -- judicious use of the old variable argument list makes it go. writef() at the moment accepts x and y coordinates, and attribute, and a standard cprintf call, i.e.: writef(10,20,BLUE+(WHITE<<4),"The number is: %i\n",number); where number is an integer. After the cputs, it moves the cursor off the screen. Notice you really need the x and y coords, since it repositions the cursor each time. But itis super nice for the job it was designed, and it is quick if you use directvideo and some other TC tricks. The cursheight routine is simple; if the height requested is 0, it runs the cursor off. Any other number and it simply changes the size. For instance, in my editing routine, I use cursheight(1) for overwrite mode, and cursheight(3) for insert. Hope this helps. /* you made need more includes; I pulled these routines out of other rather large files.... */ void cursheight(int x){ struct REGPACK sregs; if(x!=0){ sregs.r_ax=256; sregs.r_cx=(8-x)*256+7; } else{ sregs.r_ax=512; sregs.r_dx=0x1a00; sregs.r_bx=0; } intr(0x10,&sregs); } void writef(int x, int y, int attrib, va_list arg_list, ...){ char output[129]; char *format; va_list arg_ptr; format=arg_list; va_start(arg_ptr, arg_list); vsprintf(output, format, arg_ptr); textattr(attrib); gotoxy(x,y); cputs(output); cursheight(0); } Apologies to Joel, who got these yesterday. Chris -=- "My brain is NOT a deadlock-free environment!!!!" --- Christopher Schanck, mammal at large. schanck@flounder.cis.ohio-state.edu