dos_compilers/DeSmet C88 v24/PCIO.A

576 lines
13 KiB
Plaintext
Raw Normal View History

2024-06-30 23:24:37 +02:00
; 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