home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_100
/
151_01
/
ed11.a
< prev
next >
Wrap
Text File
|
1985-03-10
|
11KB
|
542 lines
; ED11.A -- Screen and keyboard interface routines for the PC
;
; This is a modified version of the PCIO.A routines included with the
; C ware (Desmet) C compiler and included with permission of
; C ware
;
dseg
;
; CHARACTER ATTRIBUTE EQUATES
;
NORMAL EQU 7
REVERSE EQU 112
BLINK EQU 128
INTENSE EQU 8
;
; ATTRIBUTE SET CODES
;
SETNORMAL EQU 0
SETREVERSE EQU 1
SETINTENSE EQU 2
SETFAINT EQU 3
SETBLINK EQU 4
NOBLINK EQU 5
;
;/* control key translations */
UP1 EQU 10
DOWN1 EQU 13
UP2 EQU 21
DOWN2 EQU 4
LEFT1 EQU 25
RIGHT1 EQU 18
INS1 EQU 14
EDIT1 EQU 5
ESC1 EQU 27
DEL1 EQU 127
ZAP1 EQU 26
ABT1 EQU 24
SPLT1 EQU 19
JOIN1 EQU 16
DTOCH EQU 1
GTOCH EQU 2
HOME EQU 6
DSCROL EQU 7
GOTO EQU 17
LSTRT EQU 11
LEND EQU 12
USCROL EQU 15
ERASE EQU 20
LFTDEL EQU 8
BEGINPL EQU 200
ENDPL EQU 201
PUTIT EQU 202
PICKIT EQU 203
RECORD EQU 204
REPLAY EQU 205
ABSLEFT EQU 206
ABSRGHT EQU 207
PAGEUP EQU 208
PAGEDN EQU 209
; the table that is used to make the translation
convert:
db 72, UP2 ;up_char
db 80, DOWN2 ;down_char
db 75, LEFT1 ;left_char
db 77, RIGHT1 ;right_char
db 71, HOME ;home
db 79, DEL1 ;end
db 73, USCROL ;pageup_char
db 81, DSCROL ;pagedown_char
db 82, UP1 ;Ins_char
db 83, ZAP1 ;Del_char
db 115, LSTRT ;ctl-left
db 116, LEND ;ctl-rgt
db 59, ESC1 ;F1
db 60, EDIT1 ;F2
db 61, GOTO ;F3
db 62, INS1 ;F4
db 63, ERASE ;F5
db 64, ABT1 ;F6
db 65, BEGINPL ;F7
db 66, ENDPL ;F8
db 67, PICKIT ;F9
db 68, PUTIT ;F10
db 120,SPLT1 ;alt-1
db 121,JOIN1 ;alt-2
db 122,DTOCH ;alt-3
db 123,GTOCH ;alt-4
db 130,ABSLEFT ;alt -
db 131,ABSRGHT ;alt +
db 132,PAGEUP ;ctl-Pg Up
db 118,PAGEDN ;ctl-Pg Dn
db 0, 255 ; illegal character
; equates for bios interface.
; the interrupt and codes for the screen interface interrupt.
video equ 10h ;interrupt for dealing with screen
mode equ 0 ;code for setting new screen mode
curtype equ 1 ;code for setting new cursor type
setcur equ 2 ;code for addressing cursor
readcur equ 3 ;code for reading cursor location
readlp equ 4 ;code for reading light pen position
setpage equ 5 ;code to select active page
scrollup equ 6 ;code to scroll screen up
scrolldn equ 7 ;code to scroll screen nown
readch equ 8 ;code to read a character from screen
writeach equ 9 ;code to write char and attributes
writech equ 10 ;code to write character only
setpal equ 11 ;code to set new setpal or border
wdot equ 12 ;code to write a dot
rdot equ 13 ;code to read a dot
wtty equ 14 ;code to write as if teletype
state equ 15 ;code to find current screen status
; the interrupt and codes for the keyboard interface.
keyboard equ 16h ;interrupt 16 to deal with keyboard
cicode equ 0 ;code for reading a character
cstscode equ 1 ;code for keyboard status
; caution: must change column number if 40 column mode
crt_cols equ 80
; variables available to a C88 program
public scr_cols_, scr_rows_
public scr_mode_,scr_page_,scr_attr_
scr_cols_: dw crt_cols ;current number of columns
scr_rows_: dw 25 ;current number of rows
scr_mode_ db 0 ;current screen mode
scr_page_ db 0 ;current page
scr_attr_ db NORMAL ;current attributes for screen
;NORMAL is white letters on black
cseg
; SCR_SETUP_ scr_setup must be called before any use of any
; other routine unless the starting mode is 80X25
; character mode (3,4 or 7).
; Usage: scr_setup();
public scr_setup_
scr_setup_: push bp
mov ah,state ;get current state
int video
mov scr_mode_,al ;current mode
mov cl,ah ;make cols a word
mov ch,0
mov scr_cols_,cx ;40 or 80 columns
mov scr_page_,bh
mov scr_attr_,NORMAL ;set to white chars on black
cmp al,4 ;see if a character mode
jc got_attr
cmp al,7 ;7 is for graphics mode
jz got_attr
mov scr_attr_,0 ;attribute is zero in graphics
got_attr: mov ah,0 ;return int containing mode
pop bp
ret
; SCR_SETMODE_ set a new screen mode
; Usage: scr_setmode(new mode);
public scr_setmode_
scr_setmode_: push bp
mov bp,sp
mov al,[bp+4] ; new mode value
mov ah,mode
int video ; set new mode
call scr_setup_ ;remember new values
pop bp
ret
; SCR_ROWCOL_ sets cursor at any location.
; Usage: scr_rowcol(new row, new column);
public scr_rowcol_
scr_rowcol_: ; move cursor to x,y
push bp ; save from bios
mov bp,sp
mov dx,[bp+6] ; column
mov ax,[bp+4] ; row
mov dh,al
mov bh,scr_page_ ; force page zero
mov ah,setcur ; set cursor location
int video ; call bios
pop bp
ret
; SCR_CLR_ clear entire screen
; Usage: scr_clr();
public scr_clr_
scr_clr_: ; clear screen
push bp ;save from video call
mov al,0 ;ask for a clear window
xor cx,cx ;start at 0,0
mov dh,24 ;24 is the last line
mov dl,byte scr_cols_ ;clear entire width
dec dl ;last column is width-1
mov bh,scr_attr_ ;attributes for new blanks
mov ah,scrollup ;ask for a scrollup to clear
int video ;do the clear
pop bp
ret
; SCR_CLRL_ clear rest of line.
; Usage: scr_clrl();
public scr_clrl_
scr_clrl_: ; clear rest of line
push bp
mov ah,readcur ;see where we are
int video
mov cl,byte scr_cols_ ;calc how many chars left in line
sub cl,dl ;number left
mov ch,0 ;number of blanks needed
mov al,' ' ;write blanks
mov bl,scr_attr_ ;normal attributes
mov ah,writeach ;write the blanks
int video
pop bp
ret
; SCR_SCUP_ scroll text up leaving top line alone.
; Usage: scr_scup();
public scr_scup_
scr_scup_: ; scroll last line, screen from line 2 to 24
mov ax,scr_cols_ ;need last column of screen
dec ax
push ax
mov ax,24 ;scroll through last line
push ax
xor ax,ax ;from column 0
push ax
inc ax ;leave top line alone
push ax
push ax ;scroll by 1
call scr_scrup_ ;do the scroll
add sp,10 ;clear arge
ret
; SCR_SCDN_ scroll all but the top line down one.
; Usage: scr_scdn();
public scr_scdn_
scr_scdn_:
mov ax,scr_cols_ ;need last column of screen
dec ax
push ax
mov ax,24 ;scroll through last line
push ax
xor ax,ax ;from column 0
push ax
inc ax ;leave top line alone
push ax
push ax ;scroll by 1
call scr_scrdn_ ;do the scroll
add sp,10 ;clear arge
ret
push ax
xor ax,ax ;from column 0
push ax
inc ax ;leave top line alone
push ax
push ax ;scroll by 1
call scr_scrup_ ;do the scroll
add sp,10 ;clear arge
ret
; SCR_SCRUP_ Scroll the screen up. The window is scrolled
; up nline lines. A zero nline will clear the
; window. Top left of the screen in 0,0.
; Usage: scr_scrup(nline,fromrow,fromcol,torow,tocol);
public scr_scrup_
scr_scrup_: push bp
mov bp,sp
mov al,[bp+4] ;number of lines
mov ch,[bp+6] ;starting row
mov cl,[bp+8] ;starting column
mov dh,[bp+10] ;ending row
mov dl,[bp+12] ;ending column
mov bh,scr_attr_ ;current attribute
mov ah,scrollup
int video ;do the scroll
pop bp
ret
; SCR_SCRDN_ scroll the screen down. the window is scrolled
; down nline lines. A zero nline will clear the
; window. Top left of the screen in 0,0.
; Usage: scr_scrdn(nline,fromrow,fromcol,torow,tocol);
public scr_scrdn_
scr_scrdn_: push bp
mov bp,sp
mov al,[bp+4] ;number of lines
mov ch,[bp+6] ;starting row
mov cl,[bp+8] ;starting column
mov dh,[bp+10] ;ending row
mov dl,[bp+12] ;ending column
mov bh,scr_attr_ ;current attribute
mov ah,scrolldn
int video ;do the scroll
pop bp
ret
; SCR_CO_ write a character to the screen. this
; routine increments the cursor position
; after writing. normal C88 puts and printf
; statements can also be used to write to the
; screen.
; Usage: scr_co_(character);
public scr_co_
scr_co_: ; standard console output
push bp
mov bp,sp
mov al,[bp+4] ;character to write
push ax
push ax
mov bh,scr_page_
mov ah,readcur
int video
cmp dl,crt_cols-1
jle u20
mov dl,crt_cols-1
u20: pop ax
cmp al,8
je u8
cmp al,0dh
je u9
cmp al,0ah
je u10
cmp al,07h
je u11
mov bh,scr_page_
mov bl,scr_attr_
mov ah,writeach ;use write char/attr routine
mov cx,1
int video
inc dl
cmp dl,crt_cols
jnz u7
dec dl
jmp u7
; mov dl,0
; cmp dh,24
; jnz u6
u1: mov ah,setcur
mov bh,0
int video
mov bh,scr_attr_
u3: mov ax,0601h
mov cx,0
mov dh,24
mov dl,crt_cols
dec dl
u4: int video
u5: pop ax
pop bp
ret
u6: inc dh
u7: mov ah,setcur
jmp u4
u8: cmp dl,0
je u7
dec dl
jmp u7
u9: mov dl,0
jmp u7
u10: cmp dh,24
jne u6
jmp u1
u11: jmp u5
;
; SCR_CHR_ATTR_ set screen attribute
;
; Usage: scr_chr_attr_(character);
;
public scr_chr_attr_
scr_chr_attr_:
push bp
mov bp,sp
mov al,[bp+4] ;attribute
cmp al,SETNORMAL
je norset
cmp al,SETREVERSE
je revset
cmp al,SETBLINK
je blnkset
cmp al,SETINTENSE
je intset
cmp al,SETFAINT
je fntset
cmp al,NOBLINK
je blnkres
attfin:
pop bp
ret
norset: mov al,scr_attr_
and al,136 ;save intensity and blink state
or al,NORMAL
mov scr_attr_,al
jmp attfin
revset: mov al,scr_attr_
and al,136
or al,REVERSE
mov scr_attr_,al
jmp attfin
blnkset:mov al,scr_attr_
and al,INTENSE
or al,NORMAL
or al,BLINK
mov scr_attr_,al
jmp attfin
blnkres:mov al,scr_attr_
and al,INTENSE
or al,NORMAL
mov scr_attr_,al
jmp attfin
intset: mov al,scr_attr_
or al,INTENSE
mov scr_attr_,al
jmp attfin
fntset: mov al,scr_attr_
and al,247
mov scr_attr_,al
jmp attfin
; SCR_CI_ keyboard input. function and soft keys are
; translated. see equates for values.
; Usage: character = scr_ci();
public scr_ci_
scr_ci_: ;return the next character
; translate if necessary
push bp
mov ah,cicode ;ask for a keyboard character
int keyboard
CMP AH,74
JE PLUS_KEY
CMP AH,78
JE MINUS_KEY
cmp al,0
jne not_special
mov bx, offset convert ; convert special key
ci_loop:
cmp byte[bx],0
jz got_it
cmp ah, byte[bx]
je got_it
add bx,2
jmp ci_loop
got_it: inc bx
mov al,[bx]
mov ah,0
pop bp
ret
not_special: mov ah,0
pop bp
ret
PLUS_KEY: MOV AL,RECORD
JMP not_special
MINUS_KEY: MOV AL,REPLAY
JMP not_special
; SCR_CSTS_ return character if any available. otherwise
; return zero.
; Usage: character = scr_csts();
public scr_csts_
scr_csts_: ;return coded character if any available
push bp
mov ah,cstscode
int keyboard
mov ax,0
jz csts_over
call scr_ci_ ;get the coded character
csts_over: pop bp
ret