home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64Telecom / QTERM42G.ARK / QT-C128X.Z < prev    next >
Text File  |  1989-09-27  |  7KB  |  372 lines

  1. ; QT-C128X.Z - patch code for QTERM on the Commodore 128, using the
  2. ; SwiftLink-232 serial cartridge from Dr. Evil Laboratories.
  3.  
  4. ; written 5/20/90 D. Goodenough
  5.  
  6. ; modified 6/24/90 D. Goodenough to enable and disable the ACIA on entry and
  7. ; exit, added code to manipulate DTR and Break for the ^O . and ^O , functions.
  8.  
  9. ; modified 6/27/90 D. Goodenough to only disable the ACIA on exit if DCD
  10. ; is inactive. That allows a temporary escape from QTERM when online to
  11. ; do a directory or whatever without hanging up.
  12.  
  13. .macro    readin    addr
  14.     ld    (0xff04),a
  15.     ld    bc,addr
  16.     in    a,(c)
  17.     ld    (0xff02),a
  18. .endm
  19.  
  20. .macro    wrtout    addr
  21.     ld    (0xff04),a
  22.     ld    bc,addr
  23.     out    (c),a
  24.     ld    (0xff02),a
  25. .endm
  26.  
  27. ; modist - return with z flag clear iff there is a char waiting at modem port
  28.  
  29. .org    0x0110
  30. modist:    ld    hl,(_base_)
  31.     ld    a,(hl)
  32.     inc    hl
  33.     xor    (hl)
  34.     ret
  35.  
  36. ; modin - read char from modem port: modist has been used to check it's there
  37.  
  38. .org    0x0120
  39. modin:    ld    hl,(_base_)
  40.     inc    (hl)
  41.     ld    e,(hl)
  42.     inc    hl
  43.     inc    hl
  44.     ld    d,0
  45.     add    hl,de
  46.     ld    a,(hl)
  47.     ret
  48.  
  49. ; modost - return with z flag clear iff the modem can accept another char
  50.  
  51. .org    0x0130
  52. modost:    readin    0xde01
  53.     and    0x10
  54.     ret
  55.  
  56. ; modout - send char to modem port
  57.  
  58. .org    0x0140
  59. modout:    wrtout    0xde00
  60.     ret
  61.  
  62. ; sbreak - start a break condition on line
  63.  
  64. .org    0x0150
  65. sbreak:    ld    a,(cmnd)
  66.     or    0x0c
  67.     jr    fincmd
  68.  
  69. ; ebreak - terminate break condition
  70.  
  71. .org    0x0160
  72. ebreak:    jr    dtron
  73.  
  74. ; dtroff - disable dtr to cause modem to hang up
  75.  
  76. .org    0x0170
  77. dtroff:    xor    a
  78.     jr    fincmd
  79.  
  80. ; dtron - re-enable dtr
  81.  
  82. .org    0x0180
  83. dtron:    ld    a,(cmnd)
  84. fincmd:    wrtout    0xde02
  85.     ret
  86.  
  87. ; setbd - take byte in a, from baud table, use it to set baud rate
  88.  
  89. .org    0x0190
  90. setbd:    ld    l,a        ; done elsewhere - see patch area
  91.     ld    a,(ctrl)
  92.     and    0xf0
  93.     or    l
  94.     ld    (ctrl),a
  95.     jp    finbd
  96.  
  97. ; these next eight are byte pairs - the first byte is used by setbd above.
  98. ; the second is a -1 for an active baud rate entry, and a 0 for inactive
  99.  
  100. .org    0x01a0
  101. b38400:    db    0,0
  102. b19200:    db    0,0
  103. b9600:    db    0xc,-1
  104. b4800:    db    0xa,-1
  105. b2400:    db    0x8,-1
  106. b1200:    db    0x7,-1
  107. b600:    db    0x6,-1
  108. b300:    db    0x5,-1
  109.  
  110. ; setmod - take a byte from the mode table, use it to set the uart mode
  111.  
  112. .org    0x01b0
  113. setmod:    ld    e,a
  114.     ld    hl,cmnd
  115.     and    0b11100000
  116.     ld    d,a
  117.     ld    a,(hl)
  118.     jp    finmod
  119.  
  120. ; now the twelve mode bytes for setting comm format
  121.  
  122. .org    0x01c0
  123. modtab:
  124. n17:    db    0b00000100
  125. n18:    db    0b00000000
  126. n27:    db    0b00010100
  127. n28:    db    0b00010000
  128. e17:    db    0b01100100
  129. e18:    db    0b01100000
  130. e27:    db    0b01110100
  131. e28:    db    0b01110000
  132. o17:    db    0b00100100
  133. o18:    db    0b00100000
  134. o27:    db    0b00110100
  135. o28:    db    0b00110000
  136.  
  137. .org    0x01cc
  138. resrvd:    db    0        ; reserved
  139.  
  140. ; xfersz - number of K to read / write to disk during protocol transfers:
  141. ; must be 1 / 2 / 4 / 8. Generally this is best left at 8 unless you have
  142. ; a REALLY slow disk, when writing / reading 8K at a time causes timeouts.
  143. ; Drop this to 4 or 2 to do disk access in smaller chunks to help avoid
  144. ; the timeout problem
  145.  
  146. .org    0x01cd
  147. xfersz:    db    2        ; send 2K at a time: CBM disks are slooowww.
  148.                 ; this can be bumped to 8 if you're using a
  149.                 ; 1750 REU as drive M:
  150.  
  151. ; speed - simply the cpu speed for a z80 in mhz.
  152.  
  153. .org    0x01ce
  154. speed:    db    2        ; A slow CPU (which is odd, because they
  155.                 ; put a Z80B in there)
  156.  
  157. ; escape - this is the character used as the escape char: since the addresses
  158. ; in the table tend to move, we just put the byte here, and then transfer
  159. ; to the table later
  160.  
  161. .org    0x01cf
  162. escape:    db    'o' & 0x1f    ; use ^O on the 128
  163.  
  164. ; the signon message - change this to be appropriate for your system
  165.  
  166. .org    0x01d0
  167. signon:    db    'Commodore 128 / SwiftLink-232\0'
  168.  
  169. ; now the string for clear screen
  170.  
  171. .org    0x01f0
  172. clrs:    db    'z' & 0x1f, 0
  173.  
  174. ; moveto - this routine is called with a word in hl - h = row 
  175.  
  176. ; l = column to move to, at 109 is a routine to print a char in c,
  177. ; at 10c is a routine to print a decimal number in hl (for ansi tubes)
  178.  
  179. .var    scrout    0x0109
  180. .var    decout    0x010c
  181.  
  182. .org    0x0200
  183. moveto:    push    hl        ; save coords
  184.     ld    c,'\e'
  185.     call    scrout        ; lead in escape
  186.     ld    c,'='
  187.     call    scrout        ; leadin '='
  188.     pop    hl
  189.     push    hl
  190.     ld    a,h        ; row to a
  191.     call    poff        ; out it goes w/ offset
  192.     pop    hl
  193.     ld    a,l        ; col to a
  194. poff:    add    a,' '        ; add offset
  195.     ld    c,a
  196.     jp    scrout        ; & print it
  197.  
  198. ; these next strings are used to do various screen functions. There are
  199. ; eight of them, and immediately preceding them is a flag byte. Each string
  200. ; has a bit in the byte, and if a capability is present, its bit should
  201. ; be set. This byte is an absolute necessity, as various programs use it
  202. ; to tell if various things are present.
  203.  
  204. .org    0x022f
  205. tcbits:    db    0b11111111    ; bits are:
  206.                 ; 0: bright        b_brite    1
  207.                 ; 1: dim        b_dim    2
  208.                 ; 2: delete line    b_delln    4
  209.                 ; 3: insert line    b_insln    8
  210.                 ; 4: delete character    b_delch    16
  211.                 ; 5: insert character    b_insch    32
  212.                 ; 6: clear end line    b_cleol    64
  213.                 ; 7: clear end screen    b_cleos    128
  214.  
  215. .org    0x0230
  216. brites:    db    '\e(\0'
  217.  
  218. .org    0x0238
  219. dims:    db    '\e)\0'
  220.  
  221. .org    0x0240
  222. dlstr:    db    '\eR\0'
  223.  
  224. .org    0x0248
  225. ilstr:    db    '\eE\0'
  226.  
  227. .org    0x0250
  228. dcstr:    db    '\eW\0'
  229.  
  230. .org    0x0258
  231. icstr:    db    '\eQ\0'
  232.  
  233. .org    0x0260
  234. ceol:    db    '\eT\0'
  235.  
  236. .org    0x0268
  237. ceos:    db    '\eY\0'
  238.  
  239. ; Entry and exit hooks. These are provided to perform custom initialisation
  240. ; on startup, and also to perform custom code on exit.
  241.  
  242. .org    0x0270
  243. entry:    jp    init
  244.  
  245. .org    0x0273
  246. exit:    jp    deinit
  247.  
  248. .org    0x0276
  249. user:    ret
  250.  
  251. .org    0x0279
  252. kbmap:    ret
  253.  
  254. .var    prompt    0x027c
  255.  
  256. ; finally a patch area that is provided for patching odd systems that need
  257. ; a lot of space.
  258.  
  259. .org    0x0280
  260.  
  261. init:
  262.     ld    a,(b2400)
  263.     call    setbd
  264.  
  265.     ld    a,(n18)
  266.     call    setmod
  267.  
  268.     pop    hl
  269.     ld    (retadr),hl
  270.     di
  271.     ld    sp,0x04fe
  272.     ld    de,(6)
  273.     ld    hl,{icode - endi} - [256 + 2 + 3]
  274.     add    hl,de
  275.     ld    (6),hl
  276.     ld    (hl),0xc3
  277.     inc    hl
  278.     ld    (hl),e
  279.     inc    hl
  280.     ld    (hl),d
  281.     inc    hl
  282.     xor    a
  283.     ld    (hl),a
  284.     ld    (_base_),hl
  285.     ld    (_here_ + 1),hl
  286.     inc    hl
  287.     ld    (hl),a
  288.     push    hl
  289.     ld    hl,(0xfdfe)
  290.     ld    (_jint_ + 1),hl
  291.     ld    (_ivec_),hl
  292.     pop    hl
  293.     ld    de,257
  294.     add    hl,de
  295.     push    hl
  296.     ex    de,hl
  297.     ld    hl,icode
  298.     ld    bc,{endi - icode}
  299.     ldir
  300.     pop    hl
  301.     ld    (0xfdfe),hl
  302.     ei
  303.     ld    hl,(retadr)
  304.     jp    (hl)
  305.  
  306. deinit:
  307.     readin    0xde01
  308.     and    0x40
  309.     call    nz,dtroff
  310.     di
  311.     ld    hl,(_ivec_)
  312.     ld    (0xfdfe),hl
  313.     ei
  314.     ret
  315.  
  316. icode:
  317.     di
  318.     push    hl
  319.     push    bc
  320.     push    af
  321.     ld    bc,0xde01
  322.     in    a,(c)
  323.     and    8
  324.     jr    z,icdone
  325. _here_:    ld    hl,0            ; filled in later
  326.     ld    a,(hl)            ; get output pointer
  327.     inc    hl
  328.     ld    c,(hl)            ; get input pointer
  329.     inc    c
  330.     cp    c            ; is the buffer full
  331.     jr    z,icdone        ; yes - ignore this
  332.     ld    (hl),c
  333.     inc    hl
  334.     ld    b,0
  335.     add    hl,bc
  336.     ld    bc,0xde00
  337.     in    a,(c)
  338.     ld    (hl),a
  339. icdone:    pop    af
  340.     pop    bc
  341.     pop    hl
  342. _jint_:    jp    0            ; also filled in later
  343. endi:
  344.  
  345. _base_:    dw    0
  346. _ivec_:    dw    0
  347. retadr:    dw    0
  348. cmnd:    db    0b00001011
  349. ctrl:    db    0b00010000
  350.  
  351. finmod:    and    0b00011111
  352.     or    d
  353.     ld    (hl),a
  354.     wrtout    0xde02
  355.     inc    hl
  356.     ld    a,e
  357.     add    a,a
  358.     add    a,a
  359.     add    a,a
  360.     and    0b11100000
  361.     ld    d,a
  362.     ld    a,(hl)
  363.     and    0b00011111
  364.     or    d
  365.     ld    (hl),a
  366.  
  367. finbd:
  368.     wrtout    0xde03
  369.     ret
  370.  
  371. ; MUST terminate by 0x04ff
  372.