576 lines
13 KiB
Plaintext
576 lines
13 KiB
Plaintext
|
; PCIO.A -- Screen and keyboard interface routines for the PC
|
||
|
|
||
|
|
||
|
dseg
|
||
|
; In this implementation, all special and function keys are translated
|
||
|
; to the following values.
|
||
|
|
||
|
;/* control key translations */
|
||
|
up_char equ 30
|
||
|
down_char equ 31
|
||
|
left_char equ 29
|
||
|
right_char equ 28
|
||
|
bol_char equ 200
|
||
|
eol_char equ 201
|
||
|
pageup_char equ 202
|
||
|
pagedown_char equ 203
|
||
|
bof_char equ 204
|
||
|
eof_char equ 205
|
||
|
Ins_char equ 206
|
||
|
Del_char equ 207
|
||
|
NextWord_char equ 208
|
||
|
PrevWord_char equ 209
|
||
|
|
||
|
M1 equ 210
|
||
|
M2 equ 211
|
||
|
M3 equ 212
|
||
|
M4 equ 213
|
||
|
M5 equ 214
|
||
|
M6 equ 215
|
||
|
M7 equ 216
|
||
|
M8 equ 217
|
||
|
M9 equ 218
|
||
|
M10 equ 219
|
||
|
; the table that is used to make the translation
|
||
|
|
||
|
convert:
|
||
|
db 72, up_char
|
||
|
db 80, down_char
|
||
|
db 75, left_char
|
||
|
db 77, right_char
|
||
|
db 71, bol_char
|
||
|
db 79, eol_char
|
||
|
db 73, pageup_char
|
||
|
db 81, pagedown_char
|
||
|
db 77H, bof_char
|
||
|
db 75H, eof_char
|
||
|
db 82, Ins_char
|
||
|
db 83, Del_char
|
||
|
db 115, PrevWord_char
|
||
|
db 116, NextWord_char
|
||
|
db 59, M1
|
||
|
db 60, M2
|
||
|
db 61, M3
|
||
|
db 62, M4
|
||
|
db 63, M5
|
||
|
db 64, M6
|
||
|
db 65, M7
|
||
|
db 66, M8
|
||
|
db 67, M9
|
||
|
db 68, M10
|
||
|
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_, scr_scrollup_, scr_scrolldown_
|
||
|
public scr_mode_,scr_page_,scr_attr_,scr_window_top_
|
||
|
|
||
|
scr_cols_: dw crt_cols ;current number of columns
|
||
|
|
||
|
; note- make 25 for ms-dos and 24 for cp/m as cp/m steals the bottom
|
||
|
; line.
|
||
|
scr_rows_: dw 25 ;current number of rows
|
||
|
scr_mode_ db 0 ;current screen mode
|
||
|
scr_page_ db 0 ;current page
|
||
|
scr_attr_ db 7 ;current attributes for screen
|
||
|
;7 is white letters on black
|
||
|
scr_window_top_ db 2 ;first line to scroll
|
||
|
|
||
|
; variables needed by SEE. Not used here.
|
||
|
scr_scrollup_: db 0 ;zero if scrollup leaves top line alone
|
||
|
scr_scrolldown_:db 0 ;zero if scroll down supported
|
||
|
|
||
|
|
||
|
|
||
|
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). Must be called for monocrome
|
||
|
; (mode 7) for scr_curson to set a proper cursor.
|
||
|
|
||
|
; 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_,7 ;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_TERM_ do any required termination.
|
||
|
|
||
|
; Usage: scr_term();
|
||
|
|
||
|
public scr_term_
|
||
|
scr_term_:
|
||
|
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,byte scr_rows_;last line
|
||
|
dec dh
|
||
|
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 bh,scr_page_
|
||
|
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 bh,scr_page_ ;page number
|
||
|
mov ah,writeach ;write the blanks
|
||
|
int video
|
||
|
pop bp
|
||
|
ret
|
||
|
|
||
|
|
||
|
; SCR_CLS_ clear rest of screen.
|
||
|
|
||
|
; Usage: scr_cls();
|
||
|
|
||
|
public scr_cls_
|
||
|
scr_cls_: ; clear rest of screen
|
||
|
push bp
|
||
|
call scr_clrl_ ;clear rest of line
|
||
|
mov ah,readcur ;see where we are
|
||
|
mov bh,scr_page_
|
||
|
int video
|
||
|
mov al,0 ;ask for a clear window
|
||
|
mov ch,dh ;current row
|
||
|
inc ch ;+1
|
||
|
cmp ch,byte scr_rows_;see if in last line
|
||
|
jz cleared ;all done
|
||
|
mov cl,0 ;first column
|
||
|
mov dh,byte scr_rows_;24 is the last line
|
||
|
dec dh
|
||
|
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
|
||
|
cleared: pop bp
|
||
|
|
||
|
ret
|
||
|
|
||
|
|
||
|
|
||
|
; SCR_SCUP_ scroll text up leaving top lines alone.
|
||
|
|
||
|
; Usage: scr_scup();
|
||
|
|
||
|
public scr_scup_
|
||
|
scr_scup_: ; scroll last line, screen from line
|
||
|
; scr_windor_top to end
|
||
|
mov ax,scr_cols_ ;need last column of screen
|
||
|
dec ax
|
||
|
push ax
|
||
|
mov ax,scr_rows_ ;scroll through last line
|
||
|
dec ax
|
||
|
push ax
|
||
|
xor ax,ax ;from column 0
|
||
|
push ax
|
||
|
mov al,scr_window_top_;leave top line alone
|
||
|
push ax
|
||
|
mov al,1
|
||
|
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_SCDN_ scroll all but the top lines 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,scr_rows_ ;scroll through last line
|
||
|
dec ax
|
||
|
push ax
|
||
|
xor ax,ax ;from column 0
|
||
|
push ax
|
||
|
mov al,scr_window_top_;leave top lines alone
|
||
|
push ax
|
||
|
mov al,1
|
||
|
push ax ;scroll by 1
|
||
|
call scr_scrdn_ ;do the scroll
|
||
|
add sp,10 ;clear arge
|
||
|
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
|
||
|
mov bh,scr_page_
|
||
|
mov ah,wtty ;use tty write routine
|
||
|
int video
|
||
|
pop bp
|
||
|
ret
|
||
|
|
||
|
|
||
|
; 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 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
|
||
|
|
||
|
|
||
|
; 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
|
||
|
|
||
|
|
||
|
; SCR_SET_CURSOR_ does nothing. needed by SEE.
|
||
|
|
||
|
|
||
|
public scr_set_cursor_
|
||
|
scr_set_cursor_: ; set the visible cursor to the
|
||
|
; current position
|
||
|
ret
|
||
|
|
||
|
|
||
|
|
||
|
; SCR_SINP_ screen input (read character from the screen).
|
||
|
|
||
|
; Usage: character = scr_sinp();
|
||
|
|
||
|
public scr_sinp_
|
||
|
scr_sinp_:
|
||
|
push bp ;save the registers
|
||
|
mov bh,scr_page_
|
||
|
mov ah,readch ;code to read a character
|
||
|
int video ;al is letter, ah=attributes
|
||
|
or al,al ;zero returned instead of blank in
|
||
|
;graphics mode
|
||
|
jnz ret_ch
|
||
|
mov al,' '
|
||
|
ret_ch: mov ah,0 ;kill the attributes
|
||
|
pop bp
|
||
|
ret
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
; SCR_CURSOFF_ turn cursor off.
|
||
|
|
||
|
; Usage: scr_cursoff();
|
||
|
|
||
|
public scr_cursoff_
|
||
|
scr_cursoff_:
|
||
|
push bp ;save registers
|
||
|
cmp scr_mode_,4 ;see if graphics
|
||
|
jc text_coff
|
||
|
cmp scr_mode_,7
|
||
|
jnz no_cur
|
||
|
text_coff:
|
||
|
mov cx,0f00h ;should turn cursor off
|
||
|
new_cur: mov ah,curtype ;set a new cursor type
|
||
|
int video
|
||
|
no_cur: pop bp
|
||
|
ret
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
; SCR_CURSON_ turn cursor back on.
|
||
|
|
||
|
; Usage: scr_curson();
|
||
|
|
||
|
public scr_curson_
|
||
|
scr_curson_:
|
||
|
push bp
|
||
|
mov cx,0c0dh ;assume monocrome
|
||
|
cmp scr_mode_,7 ;true is mono
|
||
|
jz new_cur ;set it
|
||
|
mov cx,0607h ;assume color card in text mode
|
||
|
cmp scr_mode_,4 ;color text is 0 to 3
|
||
|
jc new_cur
|
||
|
pop bp ;do nothing if in graphics mode
|
||
|
ret
|
||
|
|
||
|
|
||
|
|
||
|
; SCR_MARK -- mark the current character on the screen.
|
||
|
; Used to delimit block areas in SEE. Just write
|
||
|
; an X or something if reverse video is not available.
|
||
|
; Usage: scr_mark(current character);
|
||
|
|
||
|
public scr_mark_
|
||
|
scr_mark_: ; mark the passed char,
|
||
|
; cursor does not advance
|
||
|
push bp
|
||
|
mov al,219 ;just write a block character
|
||
|
mov bl,scr_attr_ ;normal attributes
|
||
|
mov cx,1 ; one character
|
||
|
mov bh,scr_page_ ;page number
|
||
|
mov ah,writeach ;write char and attr
|
||
|
int video ;write character and attributes
|
||
|
pop bp
|
||
|
ret
|
||
|
|
||
|
|
||
|
; the following routine is not used by either SEE or D88.
|
||
|
|
||
|
|
||
|
; SCR_APUTS_ write a string and attributes to the screen.
|
||
|
; the cursor is moved normally
|
||
|
|
||
|
; Usage: acr_aputs("Print This",attribute);
|
||
|
; attribute is BRGBIRGB
|
||
|
; | | | |
|
||
|
; | | | color for letter. 7 is white
|
||
|
; | | intensity for letter
|
||
|
; | color for background. 0 is black
|
||
|
; blinking
|
||
|
|
||
|
public scr_aputs_
|
||
|
scr_aputs_:
|
||
|
push bp
|
||
|
mov bp,sp
|
||
|
mov ah,readcur ;see where we are
|
||
|
int video ;dx is cursor location, bh is page
|
||
|
mov si,[bp+4] ;string pointer
|
||
|
mov cx,1 ;number of characters to write
|
||
|
mov bl,[bp+6] ;attribute
|
||
|
naputs: cld
|
||
|
lodsb ;next character to write
|
||
|
or al,al ;zero at end
|
||
|
jz eaputs
|
||
|
cmp al,10 ;look for LF
|
||
|
jnz normal_ap
|
||
|
ap_scroll: mov bp,sp ;reset pointer to next char
|
||
|
mov [bp+4],si
|
||
|
mov al,13 ;use tty output to scroll screen
|
||
|
mov ah,wtty
|
||
|
int video ;write cr,lf
|
||
|
mov ah,wtty
|
||
|
mov al,10
|
||
|
int video
|
||
|
pop bp
|
||
|
jmp scr_aputs_ ;start over
|
||
|
normal_ap:
|
||
|
mov bh,scr_page_ ;page number
|
||
|
mov ah,writeach ;write char and attr
|
||
|
int video ;write character and attributes
|
||
|
inc dl ;next column
|
||
|
cmp dl,crt_cols ;see if wrapping around
|
||
|
jc set_loc
|
||
|
mov dl,0 ;at start of column
|
||
|
inc dh ;at next row
|
||
|
cmp dh,byte scr_rows_;see if need a scroll
|
||
|
jc set_loc
|
||
|
jmp ap_scroll ;do a scroll up
|
||
|
set_loc: mov ah,setcur ;move the cursor
|
||
|
int video
|
||
|
jmp naputs
|
||
|
eaputs: pop bp
|
||
|
ret
|
||
|
|