home *** CD-ROM | disk | FTP | other *** search
- ; 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
- mov bh,scr_page_
- 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
-
-