home *** CD-ROM | disk | FTP | other *** search
/ Between Heaven & Hell 2 / BetweenHeavenHell.cdr / 300 / 257 / msxz100.asm < prev    next >
Assembly Source File  |  1984-12-18  |  15KB  |  612 lines

  1.  
  2. ; Kermit system dependent module for Heath/Zenith Z100
  3.  
  4. ; (2.27) Save DI in getbaud.
  5.  
  6.     public    serini, serrst, clrbuf, outchr, coms, vts, dodel,
  7.     public    ctlu, cmblnk, locate, prtchr, dobaud, clearl,
  8.     public    dodisk, getbaud, beep,
  9.     public    count, xofsnt, puthlp, putmod, clrmod, poscur
  10.     public    sendbr, machnam, setktab, setkhlp, lclini, showkey
  11.     include msdefs.h
  12.  
  13. false    equ    0
  14. true    equ    1
  15. mntrgh    equ    bufsiz*3/4    ; High point = 3/4 of buffer full.
  16.  
  17. ; constants used by serial port handler
  18.  
  19. BRKBIT    EQU    048H        ; Send-break bit. 
  20.  
  21. MDMCOM1    EQU    00EFH        ; Address of modem port command. [19b]
  22.  
  23. ; external variables used:
  24. ; drives - # of disk drives on system
  25. ; flags - global flags as per flginfo structure defined in pcdefs
  26. ; trans - global transmission parameters, trinfo struct defined in pcdefs
  27. ; portval - pointer to current portinfo structure (currently either port1
  28. ;    or port2)
  29. ; port1, port2 - portinfo structures for the corresponding ports
  30.  
  31. ; global variables defined in this module:
  32. ; xofsnt, xofrcv - tell whether we saw or sent an xoff.
  33. ; setktab - keyword table for redefining keys (should contain a 0 if
  34. ;    not implemented)
  35. ; setkhlp - help for setktab.
  36.  
  37. BIOS_SEG SEGMENT AT 40H        ; Define segment where BIOS really is
  38.     ORG    6*3
  39. BIOS_AUXOUT LABEL FAR        ; AUX output routine
  40.     ORG    26*3
  41. BIOS_AUXFUNC LABEL FAR        ; AUX: function
  42.     ORG    27*3
  43. BIOS_CONFUNC LABEL FAR        ; CON: function
  44. BIOS_SEG ENDS
  45.  
  46. ; Function codes for BIOS_xxxFUNC
  47. CHR_WRITE    EQU    0    ; Write character
  48. CHR_READ    EQU    1    ; Read character
  49. CHR_STATUS    EQU    2    ; Get status
  50.   CHR_SFGS    EQU    0    ; Get status subfunction
  51.   CHR_SFGC    EQU    1    ; Get config subfunction
  52. CHR_CONTROL    EQU    3    ; Control function
  53.   CHR_CFSU    EQU    0    ; Set new configuration parameters
  54.   CHR_CFCI    EQU    1    ; Clear input buffer
  55.  
  56.  
  57. datas     segment    public 'datas'
  58.     extrn    drives:byte, flags:byte, trans:byte
  59.     extrn    portval:word, port1:byte, port2:byte
  60.  
  61. setktab    db    13
  62.     mkeyw    'F0',96h
  63.     mkeyw    'F1',97h
  64.     mkeyw    'F2',98h
  65.     mkeyw    'F3',99h
  66.     mkeyw    'F4',9ah
  67.     mkeyw    'F5',9bh
  68.     mkeyw    'F6',9ch
  69.     mkeyw    'F7',9dh
  70.     mkeyw    'F8',9eh
  71.     mkeyw    'F9',9fh
  72.     mkeyw    'F10',0a0h
  73.     mkeyw    'F11',0a1h
  74.     mkeyw    'SCAN',-1
  75.  
  76. setkhlp    db    cr,lf,'Keyname: f0, ... f11, "HELP" or "SCAN" follwed by '
  77.     db    'decimal scan code$'
  78. brkval    db    0        ; What to send for a break.
  79. brkadr    dw    0        ; Where to send it.
  80. badbd    db    cr,lf,'Unimplemented baud rate$'
  81. noimp    db    cr,lf,'Not implemented$'
  82. machnam    db    'Heath-Zenith Z-100$'
  83. crlf    db    cr,lf,'$'
  84. delstr  db    BS,' ',BS,'$'     ; Delete string. [21d]
  85. home    db    ESC,'H$'
  86. eeolstr db    ESC,'K$'    ; Erase to end of line
  87. clrstr    db    ESC,'E$'    ; Erase entire display
  88. enamod    db    ESC,'x1$'    ; Enable 25th line
  89. dismod    db    ESC,'y1$'    ; Disable 25th line
  90. enascan    db    ESC,'y?$'    ; Enable scan codes
  91. disscan    db    ESC,'x?$'    ; Disable scan codes
  92. begrev    db    ESC,'p$'    ; Enter reverse video
  93. endrev    db    ESC,'q$'    ; Exit reverse video
  94. lin25    db    ESC,'Y8 $'    ; Column 1 row 25
  95. savcur    db    ESC,'j$'    ; Save current cursor position
  96. precur    db    ESC,'k$'    ; Restore cursor to previous position
  97. clrlin  db    cr,'$'        ; Clear line (just the cr part).
  98. xofsnt    db    0        ; Say if we sent an XOFF.
  99. xofrcv    db    0        ; Say if we received an XOFF.
  100. tmp    db    ?,'$'
  101. temp1    dw    ?        ; Temporary storage.
  102.  
  103. ontab    db    02H        ; Two entries.
  104.     db    03H,'OFF$'    ; Should be alphabetized. [19a]
  105.     dw    00H
  106.     db    02H,'ON$'
  107.     dw    01H
  108.  
  109. ; this table is indexed by the baud rate definitions given in
  110. ; pcdefs.  Unsupported baud rates should contain FF.
  111. bddat    label    word
  112.     dw    0        ; 45.5 baud
  113.     dw    1        ; 50 baud
  114.     dw    2           ; 75 baud
  115.     dw    3           ; 110 baud
  116.     dw    4           ; 134.5 baud
  117.     dw    5           ; 150 baud
  118.     dw    6           ; 300 baud
  119.     dw    7           ; 600 baud
  120.     dw    8          ; 1200 baud
  121.     dw    9          ; 1800 baud
  122.     dw    10         ; 2000 baud
  123.     dw    11         ; 2400 baud
  124.     dw    12         ; 4800 baud
  125.     dw    13         ; 9600 baud
  126.     dw    14          ; 19200 baud
  127.     dw    15          ; 38400 baud
  128.  
  129. ; storage for port configuration
  130. cfginfo    struc
  131. cfclass    db    0
  132. cfattr    db    0
  133. cfport    dw    0
  134. cfbaud    db    0
  135. cfhshk    db    0
  136. cfbctl    db    0
  137. cfecnt    db    0
  138. cfncnt    db    0
  139. cfnchr    db    0
  140. cfres    db    6 dup(?)
  141. cfsize    db    0
  142. cfginfo    ends
  143.  
  144. auxconf    cfginfo    <>
  145.  
  146. ; variables for serial interrupt handler
  147.  
  148. count    dw    0        ; Number of chars in int buffer.
  149.  
  150. ourarg    termarg    <>
  151.  
  152. shkbuf    db    300 dup (?)    ; room for definition
  153. shkmsg    db    '  Scan code: '
  154. shkmln    equ    $-shkmsg
  155. shkms1    db    cr,lf,'  Definition: '
  156. shkm1ln    equ    $-shkms1
  157. datas    ends
  158.  
  159. code    segment    public
  160.     extrn    comnd:near, dopar:near, defkey:near
  161.     assume    cs:code,ds:datas
  162.  
  163. ; local initialization
  164.  
  165. lclini    proc    near
  166.     mov    brkval,BRKBIT    ; What to send for a break.
  167.     mov    brkadr,MDMCOM1
  168.      mov    flags.vtflg,0    ; Turn off true Heath mode (allows key macros)     
  169.     ret
  170. lclini    endp
  171.  
  172. ; this is called by Kermit initialization.  It checks the
  173. ; number of disks on the system, sets the drives variable
  174. ; appropriately.  Returns normally.  
  175.  
  176. DODISK    PROC    NEAR
  177.     mov    ah,gcurdsk    ; Current disk value to AL.
  178.     int    dos
  179.     mov    dl,al        ; Put current disk in DL.
  180.     mov    ah,seldsk    ; Select current disk.
  181.     int    dos
  182.     mov    drives,al
  183.     ret
  184. DODISK    ENDP
  185.  
  186. ; show the definition of a key.  The terminal argument block (which contains
  187. ; the address and length of the definition tables) is passed in ax.
  188. ; Returns a string to print in AX, length of same in CX.
  189. ; Returns normally.
  190. showkey    proc    near
  191.     push    es
  192.     push    ax        ; save the ptr
  193.     mov    bx,ds
  194.     mov    es,bx        ; address data segment
  195.     cld
  196. showk1:    mov    ah,prstr
  197.     mov    dx,offset enascan ; enable scan codes
  198.     int    dos
  199.     mov    ah,0ch        ; char input with buffer flush
  200.     mov    al,7
  201.     int    dos
  202. ;    mov    ah,chr_control
  203. ;    mov    al,chr_cfci    ; clear input
  204. ;    call    bios_confunc
  205. ;    mov    ah,chr_read
  206. ;    call    bios_confunc    ; read a char
  207.     push    ax
  208.     mov    ah,prstr
  209.     mov    dx,offset disscan ; disable scan codes
  210.     int    dos
  211.     pop    ax
  212. ;    push    ax        ; save the character
  213. ;    call    gss        ; get shift state
  214. ;    pop    bx
  215.     mov    ah,0        ; shift state to ah
  216. ;    mov    al,bh        ; scan code to al
  217.     push    ax        ; remember scan code
  218.     mov    di,offset shkbuf
  219.     mov    si,offset shkmsg
  220.     mov    cx,shkmln
  221.     rep    movsb        ; copy in initial message
  222.     call    nout        ; write out scan code
  223.     mov    si,offset shkms1
  224.     mov    cx,shkm1ln    ; second message
  225.     rep    movsb
  226.     pop    ax        ; get scan code back
  227.     pop    bx        ; and terminal arg block
  228.     mov    cx,[bx].klen    ; and length
  229.     jcxz    showk2        ; no table, not defined
  230.     push    di        ; remember output ptr
  231.     mov    di,[bx].ktab    ; get key table
  232.     repne    scasw        ; search for a definition for this
  233.     mov    si,di        ; remember result ptr
  234.     pop    di        ; get output ptr back
  235.     jne    showk2        ; not defined, forget it
  236.     sub    si,[bx].ktab    ; compute offset from beginning
  237.     sub    si,2        ; minus 2 for pre-increment
  238.     add    si,[bx].krpl    ; get index into replacement table
  239.     mov    si,[si]        ; pick up replacement
  240.     mov    cl,[si]        ; get length
  241.     mov    ch,0
  242.     inc    si
  243.     rep    movsb        ; copy into buffer
  244. showk2:    mov    ax,offset shkbuf ; this is buffer
  245.     mov    cx,di
  246.     sub    cx,ax        ; length
  247.     pop    es
  248.     ret            ; and return
  249. showkey    endp
  250.  
  251. ; Clear the input buffer. This throws away all the characters in the
  252. ; serial interrupt buffer.  This is particularly important when
  253. ; talking to servers, since NAKs can accumulate in the buffer.
  254. ; Returns normally.
  255.  
  256. CLRBUF    PROC    NEAR
  257.     cli
  258.     mov     ah,chr_control
  259.     mov    al,chr_cfci
  260.     call    bios_auxfunc
  261.     mov     count,0
  262.     sti
  263.     ret
  264. CLRBUF    ENDP
  265.  
  266. ; Clear to the end of the current line.  Returns normally.
  267.  
  268. CLEARL    PROC    NEAR
  269.     mov    ah,prstr
  270.     mov    dx,offset eeolstr    ; Erase to end of line
  271.     int    dos
  272.     ret
  273. CLEARL    ENDP
  274.  
  275. ; Put the char in AH to the serial port.  This assumes the
  276. ; port has been initialized.  Should honor xon/xoff.  Skip returns on
  277. ; success, returns normally if the character cannot be written.
  278.  
  279. outchr:    mov    bp,portval
  280.     cmp    ds:[bp].floflg,0 ; Are we doing flow control.
  281.     je    outch2        ; No, just continue.
  282.     xor    cx,cx        ; clear counter
  283. outch1:    cmp    xofrcv,true    ; Are we being held?
  284.     jne    outch2        ; No - it's OK to go on.
  285.     loop    outch1        ; held, try for a while
  286.     mov    xofrcv,false    ; timed out, force it off and fall thru.
  287. outch2:    push    dx        ; Save register.
  288.     mov    al,ah        ; Parity routine works on AL.
  289.     call    dopar        ; Set parity appropriately.
  290.     call    bios_auxout
  291.     pop    dx
  292.     jmp    rskp
  293.  
  294. ; This routine blanks the screen.  Returns normally.
  295.  
  296. CMBLNK    PROC    NEAR
  297.     mov    ah,prstr
  298.     mov    dx,offset clrstr
  299.     int    dos
  300.     ret
  301. CMBLNK  ENDP
  302.  
  303. ; Locate: homes the cursor.  Returns normally.
  304.  
  305. LOCATE  PROC    NEAR
  306.     mov    ah,prstr
  307.     mov    dx,offset home    ; Go to top left corner of screen.
  308.     int    dos
  309. LOCATE  ENDP
  310.  
  311. ; write a line in inverse video at the bottom of the screen...
  312. ; the line is passed in dx, terminated by a $.  Returns normally.
  313. putmod    proc    near
  314.     push    dx        ; preserve message
  315.     mov    ah,prstr
  316.     mov    dx,offset savcur
  317.     int    dos
  318.     mov    dx,offset enamod
  319.     int    dos
  320.     mov    dx,offset lin25
  321.     int    dos
  322.     mov    dx,offset begrev
  323.     int    dos
  324.     pop    dx        ; get message back
  325.     int    dos        ; write it out
  326.     mov    dx,offset endrev
  327.     int    dos
  328.     mov    dx,offset precur
  329.     int    dos
  330.     ret            ; and return
  331. putmod    endp
  332.  
  333. ; clear the mode line written by putmod.  Returns normally.
  334. clrmod    proc    near
  335.     mov    ah,prstr
  336.     mov    dx,offset dismod
  337.     int    dos
  338.     ret
  339. clrmod    endp
  340.  
  341. BEEP    PROC    NEAR
  342.     mov    dl,07        ; ASCII BEL
  343.     mov    ah,dconio    
  344.     int    dos             ; Ring it
  345.     ret
  346. BEEP    ENDP    
  347.  
  348.  
  349. ; put a help message on the screen.  This one uses reverse video...
  350. ; pass the message in ax, terminated by a null.  Returns normally.
  351. puthlp    proc    near
  352.     push    ax        ; preserve this
  353.     mov    ah,prstr
  354.     mov    dx,offset crlf
  355.     int    dos
  356.     pop    si        ; point to string again
  357. puthl3:    lodsb            ; get a byte
  358.     cmp    al,0        ; end of string?
  359.     je    puthl4        ; yes, stop
  360.     mov    dl,al
  361.     mov    ah,dconio
  362.     int    dos
  363.     jmp    puthl3        ; and keep going
  364. puthl4:    mov    ah,prstr
  365.     mov    dx,offset crlf
  366.     int    dos
  367.     ret
  368. puthlp    endp
  369.  
  370. ; Set the baud rate for the current port, based on the value
  371. ; in the portinfo structure.  Returns normally.
  372.  
  373. DOBAUD    PROC    NEAR
  374.     mov    bp,portval
  375.     mov    temp1,ax    ; Don't overwrite previous rate. [25]
  376.     mov    ax,ds:[bp].baud    ; Check if new rate is valid. [25]
  377.     mov    tmp,2
  378.     mul    tmp        ; Get index into baud table.
  379.     mov    bx,offset bddat    ; Start of table.
  380.     add    bx,ax
  381.     mov    ax,[bx]        ; The data to output to port.
  382.     cmp    ax,0FFH        ; Unimplemented baud rate.
  383.     jne    dobd0
  384.     mov    ax,temp1    ; Get back orginal value.
  385.     mov    ds:[bp].baud,ax    ; Leave baud rate as is.
  386.     mov    ah,prstr
  387.     mov    dx,offset badbd    ; Give an error message.
  388.     int    dos
  389.     ret
  390. dobd0:    push    ax        ; Save it
  391.     mov    bx,ds        ; Set up pointer to config info
  392.     mov    es,bx        ;  .  .  .
  393.     mov    bx,offset auxconf ;  .  .  .
  394.     mov    ah,chr_status
  395.     mov    al,chr_sfgc    ; get current config info
  396.     call    bios_auxfunc
  397.     pop    ax        ; get baud back
  398.     mov    auxconf.cfbaud,al
  399.     mov    ah,chr_control    ; Function is control
  400.     mov    al,chr_cfsu    ; Subfunction is set new config
  401.     call    bios_auxfunc    ; Set the configuration
  402.     ret
  403. DOBAUD    ENDP
  404.  
  405. ; Get the current baud rate from the serial card and set it
  406. ; in the portinfo structure for the current port.  Returns normally.
  407. ; This is used during initialization.
  408.  
  409. GETBAUD    PROC    NEAR
  410.     mov    bx,ds
  411.     mov    es,bx
  412.     mov    bx,offset auxconf
  413.     mov    ah,chr_status
  414.     mov    al,chr_sfgc    ; Status function get config info
  415.     call    bios_auxfunc
  416.     mov    ch,0
  417.     mov    cl,auxconf.cfbaud
  418.     mov    bp,portval
  419.     mov    ds:[bp].baud,cx
  420.     ret
  421. GETBAUD    ENDP
  422.  
  423. ; skip returns if no character available at port,
  424. ; otherwise returns with char in al, # of chars in buffer in dx.
  425. PRTCHR  PROC    NEAR
  426.     call    chkxon        ; see if we need to xon
  427.     push    bx
  428.     mov     ah,chr_status
  429.     mov     al,chr_sfgs    ; Status function get status
  430.     call    bios_auxfunc
  431.     cmp     bl,0
  432.     jnz     prtch2
  433.     pop     bx
  434.     jmp     rskp         ; No data - check console.
  435. prtch2:    mov    dh,0
  436.     mov    dl,bl        ; Place # of chars in dx
  437.     mov    ah,chr_read
  438.     call     bios_auxfunc
  439.     dec    dl        ; Decrement number of chars
  440.     mov    count,dx    ; Save count for posterity
  441.     pop    bx
  442.     ret
  443. PRTCHR  ENDP
  444.  
  445. ; local routine to see if we have to transmit an xon
  446. chkxon    proc    near
  447.     push    bx
  448.     mov    bx,portval
  449.     cmp    [bx].floflg,0    ; doing flow control?
  450.     je    chkxo1        ; no, skip all this
  451.     cmp    xofsnt,false    ; have we sent an xoff?
  452.     je    chkxo1        ; no, forget it
  453.     cmp    count,mntrgh    ; below trigger?
  454.     jae    chkxo1        ; no, forget it
  455.     mov    ax,[bx].flowc    ; ah gets xon
  456.     call    outchr        ; send it
  457.     nop
  458.     nop
  459.     nop            ; in case it skips
  460.     mov    xofsnt,false    ; remember we've sent the xon.
  461. chkxo1:    pop    bx        ; restore register
  462.     ret            ; and return
  463. chkxon    endp
  464.  
  465. ; Send a break out the current serial port.  Returns normally.
  466. SENDBR    PROC    NEAR
  467.     push    cx
  468.     push    dx
  469.     push    ax
  470.     xor    cx,cx        ; Clear loop counter.
  471.     mov    dx,brkadr    ; Port address.  [19b]
  472.     in    al,dx        ; Get current setting.
  473.     or    al,brkval    ; Set send-break bit(s).
  474.     out    dx,al        ; Start the break.
  475. pause:    loop    pause        ; Wait a while.
  476.     xor    al,brkval    ; Clear send-break bit(s).
  477.     out    dx,al        ; Stop the break.
  478.     pop    ax
  479.     pop    dx
  480.     pop    cx
  481.     ret            ; And return.
  482. SENDBR    ENDP
  483.  
  484. ; Position the cursor according to contents of DX:
  485. ; DH contains row, DL contains column.  Returns normally.
  486.  
  487. POSCUR    PROC    NEAR
  488.     push    dx
  489.     mov    ah,CONOUT
  490.     mov    dl,ESC
  491.     int    dos
  492.     mov    dl,'Y'
  493.     int    dos
  494.     pop    dx
  495.     push    dx
  496.     mov    dl,dh
  497.     add    dl,' '
  498.     int    dos
  499.     pop    dx
  500.     add    dl,' '
  501.     int    dos
  502.     ret
  503. POSCUR    ENDP
  504.  
  505. ; Delete a character from the terminal.  This works by printing
  506. ; backspaces and spaces.  Returns normally.
  507.  
  508. DODEL    PROC    NEAR
  509.     mov    ah,prstr
  510.     mov    dx,offset delstr ; Erase weird character.
  511.     int    dos            
  512.     ret
  513. DODEL    ENDP
  514.  
  515. ; Move the cursor to the left margin, then clear to end of line.
  516. ; Returns normally.
  517.  
  518. CTLU    PROC    NEAR
  519.     mov    ah,prstr
  520.     mov    dx,offset clrlin
  521.     int    dos
  522.     call    clearl
  523.     ret
  524. CTLU    ENDP
  525.  
  526. ; set the current port.  
  527.  
  528. COMS    PROC    NEAR
  529.     jmp    notimp
  530. COMS    ENDP
  531.  
  532. ; Set heath emulation on/off.
  533.  
  534. VTS    PROC    NEAR
  535.     mov    dx,offset ontab
  536.     mov    bx,0
  537.     mov    ah,cmkey
  538.     call    comnd
  539.      jmp    r
  540.     push    bx
  541.     mov    ah,cmcfm
  542.     call    comnd            ; Get a confirm.
  543.      jmp    vt0            ; didn't get a confirm.
  544.      nop
  545.     pop    bx
  546.     mov    flags.vtflg,bl        ; Set the Heath emulation flag
  547.     ret
  548. vt0:    pop    bx
  549.     ret
  550. VTS    ENDP
  551.  
  552. notimp:    mov    ah,prstr
  553.     mov    dx,offset noimp
  554.     int    dos
  555.     jmp    rskp
  556.  
  557. ; initialization for using serial port.  This routine performs
  558. ; any initialization necessary for using the serial port, including
  559. ; setting up interrupt routines, setting buffer pointers, etc.
  560. ; Doing this twice in a row should be harmless (this version checks
  561. ; a flag and returns if initialization has already been done).
  562. ; SERRST below should restore any interrupt vectors that this changes.
  563. ; Returns normally.
  564.  
  565. SERINI    PROC    NEAR
  566.     ret            ; We're done.
  567. SERINI    ENDP
  568.  
  569. ; Reset the serial port.  This is the opposite of serini.  Calling
  570. ; this twice without intervening calls to serini should be harmless.
  571. ; Returns normally.
  572.  
  573. SERRST    PROC    NEAR
  574.     ret            ; All done.
  575. SERRST    ENDP
  576.  
  577.  
  578. ; put the number in ax into the buffer pointed to by di.  Di is updated
  579. nout    proc    near
  580.     mov    dx,0        ; high order is always 0.
  581.     mov    bx,10
  582.     div    bx        ; divide to get digit
  583.     push    dx        ; save remainder digit
  584.     or    ax,ax        ; test quotient
  585.     jz    nout1        ; zero, no more of number
  586.     call    nout        ; else call for rest of number
  587. nout1:    pop    ax        ; get digit back
  588.     add    al,'0'        ; make printable
  589.     stosb            ; drop it off
  590.     ret            ; and return
  591. nout    endp
  592.  
  593.  
  594. ; Jumping to this location is like retskp.  It assumes the instruction
  595. ;   after the call is a jmp addr.
  596.  
  597. RSKP    PROC    NEAR
  598.     pop    bp
  599.     add    bp,3
  600.     push    bp
  601.     ret
  602. RSKP    ENDP
  603.  
  604. ; Jumping here is the same as a ret.
  605.  
  606. R    PROC    NEAR
  607.     ret
  608. R    ENDP
  609.  
  610. code    ends 
  611.     end
  612.