; QTERM Version 4.x Patch Area ; Code as adapted from QTERM.COM from QTERM33A.LBR posted by David Goodenough ; to BOSKUG RCP/M circa 12/27/88, and QTERM Vers. 4.x patch listing 8-Feb-89. ; D. Presberg dissasembled this with Z8E, 21-Jan-89. Code labels taken from ; D. Goodenough "qterm.z" example circa 8-Feb-89. ; This edit is for Kaypro-II and -4 ('83 version without graphics). Kaypro ; (and Xerox BB-I) use an SIO chip, port A, with a separate baud rate ; generator: status port at 04, data port at 06, baud rate port at 0. ; 15-Feb-89, D. Presberg, BCS/BOSKUG. ; D. Goodenough added break, dtr and mode stuff 2-23-89 ; Modified for Xerox 820-II, 16/8. Clears screen at start, at end, and re- ; sets alternate video at end; all terminal capabilities supported. ; By Tim Carney 17-Apr-89. sioc equ 6 ; sio control port siod equ 4 ; sio data port yes equ 0ffh ; true value no equ 0 ; false value org 110h modist: in a,(sioc) ;get modem input status (Kaypro status port) and 01h ; (result to Z: no inp. character available ret ; is 0 at bit-0 (low order) ===> Z==1 ) org 120h modin: in a,(siod) ;read modem input character (Kaypro data port) ret org 130h modost: in a,(sioc) ;get modem output status (Kaypro status port) and 04h ; (result to Z: bit-2 ... see above) ret org 140h modout: out (siod),a ;write modem output char. (Kaypro data port) ret org 150h sbreak: ld a,(setf) ;start "break" or a ;do we have valid data in r3,r4,r5 ret z ;no - don't do it jp exmlp ; start break takes a bit extra, see below org 160h ebreak: ld a,(setf) ;end "break" or a ret z ; don't do it unless r3, r4, r5 are valid ld hl,r5 res 4,(hl) jp sioout org 170h dtroff: ld a,(setf) ;drop DTR or a ret z ; don't do it unless r3, r4, r5 are valid ld hl,r5 res 7,(hl) jp sioout org 180h dtron: ld a,(setf) ;raise DTR or a ret z ; don't do it unless r3, r4, r5 are valid ld hl,r5 set 7,(hl) jp sioout org 190h setbd: out (00h),a ;set baud rate (value in A) (Kaypro baud ret ;rate port) ; The Baud Rate Table has entries from 38400 baud down to 300 baud. ; There are 2 bytes per entry. The second byte determines if the entry is ; enabled or disabled (ffh=enabled; 00=disabled). The first byte is passed ; as the A value to the setbd subroutine. ; Kaypro-II/4 has advertised values for rates up to 19200. Not all available ; low speeds are used by QTERM, however. org 1a0h baudtb: b38400: defb 0,no ; 38400 baud b19200: defb 0fh,yes ; 19200 b9600: defb 0eh,yes ; 9600 b4800: defb 0ch,yes ; 4800 b2400: defb 0ah,yes ; 2400 b1200: defb 07h,yes ; 1200 b600: defb 06h,yes ; 600 b300: defb 05h,yes ; 300 baud ; (Kaypro goes down to 150, 134.5, 110, 75, and 50 baud, but QTERM doesn't.) org 1b0h setmod: ld (setf),a ; flag we've done a set ld c,a ; save byte in c ld hl,r3 ; look at byte for wr3 res 7,(hl) ; turn off ms bit (Rx # bits / char) add a,a ; move bit from 6 to 7 in a and 80h ; mask off the rest or (hl) ; or in the remainder jp finmod ; have to finish this elsewhere ; Communication Mode Table. Single byte values for 12 combinations of ; number-of-bits(7/8), parity(none/even/odd), number-of-stop-bits(1/2). org 1c0h modetb: n17: defb 10000000b ;080h, 7n1 n18: defb 11000000b ;0c0h, 8n1 n27: defb 10001000b ;088h, 7n2 n28: defb 11001000b ;0c8h, 8n2 e17: defb 10000011b ;083h, 7e1 e18: defb 11000011b ;0c3h, 8e1 e27: defb 10001011b ;08bh, 7e2 e28: defb 11001011b ;0cbh, 8e2 o17: defb 10000001b ;081h, 7o1 o18: defb 11000001b ;0c8h, 8o1 o27: defb 10001001b ;089h, 7o2 o28: defb 11001001b ;0c9h, 8o2 org 1cch smlbuf: defb no ; set this 'yes' if you run out of ram - this feature ; is not yet implemented, but in time (i.e. V4.1) ; it will be. QTERM is a real memory hog - it needs ; well in excess of 48K TPA. If you have a full blown ; Z-system with oodles of RSX additions, you may ; run out of space. By setting this true, you can get ; QTERM to shrink some buffers and fit itself into ; about 42K, the price paid is somewhat more ; frequent disk access when reading and writing files. org 1cdh xfersz: defb 8 ;number of K to read/write during file xfers ;Must be 1 / 2 / 4 / 8. Best left as 8 unless ; disk is verrrrry slow. Drop to smaller value ; if too many timeouts occur during "protocol" ; file transfers (xmodem or kermit). org 1ceh speed: defb 4 ;cpu speed (Mhz; use 3 for 2.5, 4 for Xerox). ; (5Mhz Assumes Advent speedup kit in Kaypro.) org 1cfh escape: defb 1bh ;escape character (1ch=^\ Control-Backslash) ;use 1bh (^[=ESC) for Xerox. org 1d0h signon: ;signon message defb '(Xerox 16/8 1984) ' defb 0 org 1f0h clrs: defb 1ah ;clear screen string (Control-Z) defb 0 scrout equ 109h ;(a routine to print to CON: the ; character in C) decout equ 10ch ;(a routine to print to CON: a decimal value ; in HL. Is available for VT100 and the like.) org 200h moveto: push hl ;move cursor to position in HL (Row,Col) ld c,1bh ; lead-in with Esc (the ASCII one; not QTERM's) call scrout ld c,'=' ; 2nd lead-in is '=' call scrout pop hl push hl ld a,h ; row value (top row is 0.) call poff ; add offset and send it to screen pop hl ld a,l ; col value (leftmost col is 0.) poff: add a,' ' ; (adds 20h) ld c,a jp scrout ; (scrout returns from 'moveto's call) ; Terminal Capability Bits. The eight bits stand for each of the following ; strings. They count from 01h=bright to 80h=clear-to-end-of-screen. b_brit equ 00000001b ; 0: bright (1.) -- NOT mandatory b_dim equ 00000010b ; 1: dim (2.) -- NOT mandatory b_dlln equ 00000100b ; 2: delete line (4.) -- important b_inln equ 00001000b ; 3: insert line (8.) -- important b_dlch equ 00010000b ; 4: delete character (16.)-- unused by QTERM b_inch equ 00100000b ; 5: insert character (32.)-- NOT mandatory b_clel equ 01000000b ; 6: clear to end-of-line(64.) -- important b_cles equ 10000000b ; 7: clear to end-of-screen(128.)-- important org 22fh tcbits: defb 0ffh ; capability bits- all functions supported ; by Xerox. ; (Kaypro-II/4, non-graphics version, cannot do in-place insertion or deletion ; of single characters: it can only overwrite characters at the current ; cursor position and move the cursor non-destructively, etc.. It can ; do in-place insertion and deletion of lines, and its clear-to-end-of- ; -screen and -line leaves the cursor as-is. It also has clear-screen-and- ; -home-the-cursor: see clrs, above. It, of course, has no graphical screen ; attributes, such as bright and dim.) org 230h brites: defb 27 ;bright string (none for '83 Kaypro) defb 40 ;Xerox ESC-(, alternate video disable defb 0 ;code. org 238h dims: defb 27 ;dim string (none for '83 Kaypro) defb 41 ;Xerox ESC-) ESC-8 (enable alternate defb 27 ;video,set to dim characters). defb 56 defb 0 org 240h dlstr: defb 1bh ;delete line defb 'R' defb 0 org 248h ilstr: defb 1bh ;insert line defb 'E' defb 0 org 250h dcstr: defb 27 ;delete character (none for '83 Kaypro) defb 'W' ;Xerox ESC-W del character string. defb 0 org 258h icstr: defb 27 ;insert character (none for '83 Kaypro) defb 'Q' ;Xerox ESC-Q ins character string. defb 0 org 260h ceol: defb 18h ;clear to end of line (Control-X) defb 0 org 268h ceos: defb 17 ;clear to end-of-screen (Control-W) defb 0 ;Xerox uses CTRL-Q ; Entry and Exit hooks. These are provided to perform custom initialisation ; on startup and on exit from QTERM. They are invoked before any use is made ; of the screen or the port hardware. org 270h entry: jp do_ent ; entry hook (270h .. 272h) org 273h ; exit hook (273h .. 275h) exit: jp do_exit ; Exit routine-Xerox 820-II, 16/8. ; Extra patch area if needed. 276h .. 2ffh org 276h patcha: do_ent: ld c,26 ;Send clear screen and home cursor call scrout ;to console... jp start start: ld a,(b1200) ; entry hook (from 270h) call setbd ; Kaypro-II/4 setup for 1200 baud ld a,(n18) ; and 8n1 communications mode. call setmod ret exmlp: ld a,1 ; wait till transmitter is really finished out (siod),a in a,(siod) rra jr nc,exmlp ; loop till buffer empty ld hl,r5 set 4,(hl) ; now go set the break bit. sioout: ld hl,siodat ld bc,6 * 256 + sioc otir ret finmod: ld (hl),a ; and save it back inc hl inc hl ; point hl at r4 ld a,(hl) and 0f4h ; mask out bits we don't want ld b,a ; save in b ld a,c ; get set byte back and 0bh ; get bits out of set byte that we want or b ; or in the other bits ld (hl),a ; and save it back inc hl inc hl ; point hl at r5 ld a,c and 40h ; get the bit we want from c res 6,(hl) ; clear the bit in r5 or (hl) ld (hl),a ; put new composite value back jp sioout ; go send the values siodat: defb 3 r3: defb 11000001b ; value for wr3 (0c1h) defb 4 r4: defb 01000100b ; value for wr4 (044h) defb 5 r5: defb 11101010b ; value for wr5 (0e5h) setf: defb 0 ; flag if we've done a set mode command org 02c5h do_exit: ld c,26 ; Xerox specific.Clear screen, home cursor call scrout ld c,27 ; Change alternate video mode to inverse. call scrout ; (52 or 54=blink, 53=graphics, 55=inverse ld c,55 ; 56=dim). call scrout ret end