home *** CD-ROM | disk | FTP | other *** search
- ; QTERM Version 4.x Patch Area
-
- ; This is for the Morrow MD34, created by putting it's port addresses and
- ; baud rate code into the "generic" SIO patch. Since the MD34 screen is
- ; ADM-3A compatible, all the standard Televideo Screen codes will work
- ; as is, so they have been incorporated from the original TVI803 source.
-
- ; Created by D. Goodenough, 7-29-89
-
- .var yes 0xff ; true value
- .var no 0 ; false value
-
- .var sio yes ; set yes to use the SIO, set no to use
- ; the other half of the DART
-
- .if sio
- .var siod 0x70 ; Use RS232 socket at other end from
- .var sioc 0x71 ; Terminal
- .var ctc 0x50
- .var mode 0x3e
- .else
- .var siod 0x62 ; Use RSs232 socket adjacent to Terminal
- .var sioc 0x63
- .var ctc 0x51
- .var mode 0x7e
- .endif
-
- .var rxrdy 1 ; receiver ready
- .var txrdy 4 ; transmitter ready
-
- .var ctcsel 0x53 ; ctc select / control port
-
- .org 0x0110
- modist: in a,(sioc) ;get modem input status
- and rxrdy ; (result to Z: no inp. character available
- ret ; is 0 at bit-0 (low order) ===> Z==1 )
-
- .org 0x0120
- modin: in a,(siod) ;read modem input character
- ret
-
- .org 0x0130
- modost: in a,(sioc) ;get modem output status
- and txrdy ; (result to Z: bit-2 ... see above)
- ret
-
- .org 0x0140
- modout: out (siod),a ;write modem output char.
- ret
-
- .org 0x0150
- sbreak: ld a,(setf) ;start "break"
- or a ;do we have valid data in r3,r4,r5
- ret z ;no - don't do it
- ld hl,r5
- set 4,(hl) ; set the bit
- jp sioout ; and go do it
-
- .org 0x0160
- 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 ; go clear the bit
-
- .org 0x0170
- 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 0x0180
- 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 0x0190
- setbd: ld e,a
- ld d,0
- ld hl,brtab
- add hl,de ; index into baud rate table
- ld a,mode ; 0x3e or 0x7e
- out (ctcsel),a ; select the correct timer and mode
- jp finbd ; go finish elsewhere
-
- .org 0x01a0
- baudtb:
- b38400: db 0,no ; 38400 baud
- b19200: db 0,no ; 19200
- b9600: db 0,yes ; 9600
- b4800: db 2,yes ; 4800
- b2400: db 4,yes ; 2400
- b1200: db 6,yes ; 1200
- b600: db 8,yes ; 600
- b300: db 10,yes ; 300 baud
-
- ;.org 0x01b0 ; don't need this - table above is 16 bytes
- setmod: ld (setf),a ; flag we've done a set
- jp domod ; have to do 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 0x1c0
- modetb:
- n17: db 0b10000000 ;0x80, 7n1
- n18: db 0b11000000 ;0xc0, 8n1
- n27: db 0b10001000 ;0x88, 7n2
- n28: db 0b11001000 ;0xc8, 8n2
- e17: db 0b10000011 ;0x83, 7e1
- e18: db 0b11000011 ;0xc3, 8e1
- e27: db 0b10001011 ;0x8b, 7e2
- e28: db 0b11001011 ;0xcb, 8e2
- o17: db 0b10000001 ;0x81, 7o1
- o18: db 0b11000001 ;0xc8, 8o1
- o27: db 0b10001001 ;0x89, 7o2
- o28: db 0b11001001 ;0xc9, 8o2
-
- ;.org 0x01cc ; don't need this - we're contiguous
- resrvd: db 0 ; reserved for future use
-
- ;.org 0x01cd
- xfersz: db 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 0x01ce
- speed: db 4 ;cpu speed (Mhz; use 3 for 2.5)
-
- ;.org 0x01cf
- escape: db '\\' & 0x1f ;escape character (1ch=^\ Control-Backslash)
-
- ;.org 0x01d0
- signon: ;signon message
- db 'Morrow MD34, '
- .if sio
- db 'SIO'
- .else
- db 'MODEM'
- .endif
- db ' port\0'
-
- .org 0x01f0
- clrs: db '\e*\0' ;clear screen string (Escape '*')
-
- .var scrout 0x0109 ;(a routine to print to CON: the
- ; character in C)
- .var decout 0x010c ;(a routine to print to CON: a decimal value
- ; in HL. Is available for VT100 and the like.)
-
- .org 0x0200
- moveto: push hl ;move cursor to position in HL (Row,Col)
- ld c,'\e' ; 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)
-
- ; these next strings are used to do various screen functions. There are
- ; eight of them, and immediately preceding them is a flag byte. Each string
- ; has a bit in the byte, and if a capability is present, its bit should
- ; be set. This byte is an absolute necessity, as various programs use it
- ; to tell if various things are present.
-
- .org 0x022f
- .extern tcbits
- tcbits: db 0b11111111 ; bits are:
- ; 0: bright b_brite 1
- ; 1: dim b_dim 2
- ; 2: delete line b_delln 4
- ; 3: insert line b_insln 8
- ; 4: delete character b_delch 16
- ; 5: insert character b_insch 32
- ; 6: clear end line b_cleol 64
- ; 7: clear end screen b_cleos 128
-
-
- ;.org 0x0230 ; don't need this: the byte above does it
- .extern brites
- brites: db '\e(\0'
-
- .org 0x0238
- .extern dims
- dims: db '\e)\0'
-
- .org 0x0240
- .extern dlstr
- dlstr: db '\eR\0'
-
- .org 0x0248
- .extern ilstr
- ilstr: db '\eE\0'
-
- .org 0x0250
- .extern dcstr
- dcstr: db '\eW\0'
-
- .org 0x0258
- .extern icstr
- icstr: db '\eQ\0'
-
- .org 0x0260
- .extern ceol
- ceol: db '\eT\0'
-
- .org 0x0268
- .extern ceos
- ceos: db '\eY\0'
-
- ; 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 0x0270
- entry: jp do_ent ; entry hook (270h .. 272h)
-
- ;.org 0x0273 ; exit hook (273h .. 275h)
- exit: ret
-
- ; Extra patch area if needed. 276h .. 2ffh
-
- .org 0x0276
- patcha:
-
- do_ent: ld a,(b1200) ; entry hook (from 270h)
- call setbd ; setup for 1200 baud
- ld a,(n18) ; and 8n1 communications mode.
- call setmod
- ret
-
- domod: 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 0x80 ; mask off the rest
- or (hl) ; or in the remainder
- ld (hl),a ; and save it back
- inc hl
- inc hl ; point hl at r4
- ld a,(hl)
- and 0xf4 ; mask out bits we don't want
- ld b,a ; save in b
- ld a,c ; get set byte back
- and 0x0b ; 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 0x40 ; 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
-
- sioout: ld hl,siodat
- ld bc,6 * 256 + sioc
- otir
- ret
-
- siodat: db 3
- r3: db 0b11000001 ; value for wr3 (0xc1)
- db 4
- r4: db 0b01000100 ; value for wr4 (0x44)
- db 5
- r5: db 0b11101010 ; value for wr5 (0xe5)
-
- setf: db 0 ; flag if we've done a set mode command
-
- finbd: ld a,(hl)
- out (ctc),a
- inc hl
- ld a,(hl)
- out (ctc),a
- ret
-
- brtab: dw 26 ; 9600 0
-
- dw 52 ; 4800 2
- dw 104 ; 2400 4
- dw 208 ; 1200 6
- dw 417 ; 600 8
- dw 833 ; 300 10