home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / 22RSX / BYERSX.ARK / BRKP-1.BYE < prev    next >
Text File  |  1986-02-17  |  17KB  |  700 lines

  1. ; BRKP-1.INC    -  Kaypro Z80-SIO insert for BYERSX  -  85/12/06
  2. ;
  3. ; name this file RSXIO.INC for automatic inclusion in RSXMAST. If
  4. ; your assembler cannot handle inclusion you will have to manually
  5. ; concatenate the various files, starting with RSXMAST.MAC.
  6. ;
  7. ; CAUTION -    version for 1983 version Kaypros only.  See the 
  8. ;        "dskstp" and "dskrun" procedures and the kp83 & kp84
  9. ;        equates. Various versions use different ports/bits.
  10. ;
  11. ; Has an anomalous connection to "DODELAY" in the main system,
  12. ; which must delay (de) millisecs, preserving bc and hl.  The RSX
  13. ; call cannot be used, because these routines may be called via
  14. ; the RSX mechanism, and would then over-write the switched stack.
  15. ;
  16. ; This version adapts any Kaypro computer to BYERSX.  It may be used
  17. ; with any auto-answer modem such as the Hayes Smartmodem 300 or
  18. ; 1200, the Cermetek Infomate 212A, etc.
  19. ;
  20. ; With the USR Password (1200 baud), set all switches to OFF.
  21. ;
  22. ;    Note:  This is an insert, not an overlay.
  23. ;
  24. ; ------------------------------------------------------------------
  25. ;
  26. ; 85/11/06  Created for BYERSX.  The similarity to BYE inserts
  27. ;        is not accidental.            - C.B. Falconer
  28. ;
  29. ; ------------------------------------------------------------------
  30. ;
  31. ; Set both the following to NO for a universal version.
  32. kp83    equ    yes
  33. kp84    equ    no;        No more than one set YES
  34. ;
  35. havetim    equ    yes;        No for no timer, yes for custom code
  36. ;                If yes, check code for your system
  37. ;
  38.     if    kp83
  39. bitport     equ    01ch
  40. video     equ    03000h;        Bank 1, location of screen memory
  41.     endif
  42.     if    kp84
  43. bitport     equ    014h
  44.     endif
  45. mtrbit    equ    040h;        disk motor on/off. Inverted for 84
  46. ;
  47. ; Set base port for ZSIO & 8116 chips
  48. basep    equ    04H;        Port for SIO
  49. basec    equ    00H;        Port for 8116 baudrate generator
  50. ;
  51. ; The following define the port addresses to use.
  52. datport    equ    basep;        Data port
  53. stport    equ    basep+2;    Status/Control port
  54. bport    equ    basec;        Baud rate port
  55. ;
  56. ; The following are baud rates for BPORT.
  57. bd110    equ    02h;        110 baud
  58. bd300    equ    05h;        300 baud
  59. bd450    equ    0ffh;        not available
  60. bd600    equ    06h;        600 baud
  61. bd710    equ    0ffh;        not available
  62. bd1200    equ    07h;        1200 baud
  63. bd2400    equ    0ah;        2400 baud
  64. bd4800    equ    0ch;        4800 baud
  65. bd9600    equ    0eh;        9600 baud
  66. bd19200    equ    0fh;        19200 baud
  67. ;
  68. ;
  69. ; ----------- (partial) ZILOG SIO chip definition -------------
  70. ;
  71. ; write-register bits
  72. ;
  73. ;  For WR0:        (lo 3 bits are next register address)
  74. noop    equ    0;
  75. ;    mask 038h
  76. rsints    equ    10h;    reset external/status interrupts
  77. chreset    equ    18h;    channel reset
  78. erreset    equ    30h;    error reset
  79. ;
  80. ;  For WR1:
  81. ;    mask 018h
  82. rxintdis equ    0;    rx int disable
  83. ;
  84. ;  For WR2: value is interrupt vector. Channel B only
  85. ;
  86. ;  FOR WR3:
  87. ;    mask 0c0h.  Receive bits per char
  88. rx5bit    equ    0
  89. rx6bit    equ    80h
  90. rx7bit    equ    40h
  91. rx8bit    equ    0c0h
  92. rxmask    equ    0c0h
  93. ;    individual bits
  94. rxenbl    equ    1;    rx enable
  95. ;
  96. ;  For WR4
  97. ;    mask 0c0h.  Internal clock divider
  98. clkx1    equ    0
  99. clkx16    equ    40h
  100. clkx32    equ    80h
  101. clkx64    equ    0c0h
  102. ;    mask 0ch
  103. syncenbl equ    0;    sync modes enable, else async
  104. stops1    equ    4;    1 stop bit
  105. stops15    equ    8;    1.5 stop bits
  106. stops2    equ    0ch;    2 stop bits
  107. stopmsk    equ    0ch
  108. ;    mask 3. Parity. Values 0, 1, 3 useful only
  109. pareven    equ    2
  110. parodd    equ    0
  111. parenbl    equ    1
  112. paroff    equ    0
  113. parmask    equ    3
  114. ;
  115. ;  For WR5:
  116. dtr    equ    80h;    data terminal ready output
  117. ;    mask 060h.  Transmit bits/char
  118. tx5bit    equ    0;    5 bits (or less)
  119. tx6bit    equ    40h
  120. tx7bit    equ    20h
  121. tx8bit    equ    60h
  122. txmask    equ    060h
  123. ;    Individual bits
  124. sndbrk    equ    10h;    send break
  125. txenbl    equ    8;    tx enable
  126. rts    equ    2;    request to send output
  127. ;
  128. ; -------------------------------------
  129. ; Read register bits
  130. ;
  131. ; For RR0
  132. drdy    equ    1;    receive data ready
  133. ordy    equ    4;    output buffer empty
  134. dcd    equ    8;    state of dcd/ input pin
  135. cts    equ    20h;    state of cts/ input pin
  136. brkrcvd    equ    80h;    break detected, async.  abort for sync
  137. ;
  138. ; For RR1
  139. allsent    equ    1;    All xmit buffers empty.
  140. parityx    equ    10h;    Receive parity error. Latched till erreset
  141. rcvovrn    equ    20h;    Rcv overrun.  Latched till erreset
  142. framerr    equ    40h;    Framing (asyn) CRC (sync) error. not latched
  143. ;
  144. ; For RR2
  145. ; holds interrupt vector (from WR2), possibly modified if
  146. ; "status affects vector" set. (WR1 statvec bit)
  147. ;
  148. ; ------------------------------------------------------------------
  149. ;
  150. ; Do a complete reset of the ZSIO.
  151. ; Hang up in case carrier present. Then assert DTR.
  152. ; return 0ffh for success, 0 for failure (with flags)
  153. ; a,f
  154. mdinit:    call    mdgo;        reinit port, synchronize
  155.     call    mdstop;        drop dtr, line, hangup
  156.     push    d
  157.     lxi    d,2000
  158.     call    dodelay;    Can't use RSX call, stack re-entrancy
  159.     pop    d
  160. ;    "    "
  161. ; enable the modem. Set stop bits, parity, word length
  162. ; Zsio/Kaypro II/4/20/2x initialization
  163. ; a,f
  164. mdgo:    push    h
  165.     push    b
  166.     lxi    h,tbl1;        init the SIO chip
  167.     mov    b,m;        count of items
  168.     inx    h
  169.     mov    c,m;        port id
  170.     inx    h
  171.  db    0edh,0b3h;    outir/otir        ** Z80 code ** <<
  172.     pop    b
  173.     pop    h
  174.     ori    0ffh;        signal success
  175.     ret
  176. ;
  177. ; This table sets the default configuration.
  178. ; It is modified by the SETBAUD command (wd lgh, stops, parity)
  179. tbl1:    db    tbl1lgh,stport
  180.     db    noop;            force ctl reg access
  181.     db    chreset;        throw out of mode
  182.     db    1,rxintdis;        disable all interrupts
  183. wr3:    db    3,rx8bit + rxenbl;    reg 3, enable receive
  184. wr4:    db    4,clkx16+stops1;    reg 4, set ascii params
  185. wr5:    db    5,dtr+tx8bit+txenbl+rts; reg 5, enable send,dtr,rts
  186. tbl1lgh    equ    $-tbl1-2
  187. ;
  188. ; Deinitialize the Modem and hang up the phone by dropping DTR and
  189. ; leaving it inactive.  This disables any interrupt systems.
  190. ; a,f (allowed)
  191. mdquit:
  192. ;    "    "
  193. ; Drop DTR to the modem to force hangup.
  194. ; a,f (allowed)
  195. mdstop:    mvi    a,5
  196.     out    stport
  197.     lda    wr5+1;        get present configuration
  198.     ani    (NOT dtr) AND (NOT rts)
  199.     out    stport
  200.     ret
  201. ;
  202. ; The following routine checks to make sure we still have carrier.
  203. ; If there is no carrier, it will return with the Zero flag set.
  204. ; a,f
  205. mdcarck:
  206.     mvi    a,rsints;    Reset status
  207.     out    stport
  208.     in    stport;        Get status
  209.     ani    dcd;        Check for data carrier
  210.     rz
  211.     ori    0ffh
  212.     ret
  213. ;
  214. ; The following is a routine that will input one character from the
  215. ; modem port.  If there is nothing there, it will return garbage...
  216. ; so use the MDINST routine first.  Do not strip parity for BYERSX
  217. ; a,f
  218. mdinp:    in    datport;    Get character
  219.     ret
  220. ;
  221. ; The following routine determines if there is a character waiting
  222. ; to be received.  If no character is waiting the Zero flag will be
  223. ; set, else 0FFH will be returned in register 'A'.
  224. ; a,f
  225. mdinst:    in    stport;        Get status
  226.     ani    drdy;        Got a character?
  227.     rz;            Return if none
  228.     ori    0ffh;        Otherwise, set the proper flag
  229.     ret
  230. ;
  231. ; The following is a routine that will output one character
  232. ; in register 'A' to the modem.
  233. ; ** Use MDOUTST first to see if buffer is empty **
  234. ; f (allowed)
  235. mdoutp:    out    datport;    Send it
  236.     ret
  237. ;
  238. ; The following is a routine to determine if the transmit buffer is
  239. ; empty.  If empty, it will return with the Zero flag clear.  If the
  240. ; transmitter is busy, it will return with the Zero flag set.
  241. ; a,f
  242. mdoutst:
  243.     in    stport
  244.     ani    ordy;        Mask it
  245.     rz
  246.     ori    0ffh;        Set all bits
  247.     ret
  248. ;
  249. ; Send a break (a) millisec long.  Return nz and 0ffh.
  250. ; Don't drop DTR.  We want to keep the connection up.
  251. ; If not capable, return 0 and z flag
  252. ; a,f
  253. sendbk:    push    d
  254.     push    psw
  255.     mvi    a,5
  256.     out    stport
  257.     lda    wr5+1;        get present configuration
  258.     ori    sndbrk
  259.     out    stport
  260.     pop    d;        orig (a) to d
  261.     mov    e,d
  262.     mvi    d,0
  263.     call    dodelay
  264.     pop    d;        restore entry
  265.     jmp    mdgo;        end break and signal success
  266. ;
  267. ; Generalized baud setting per (a).
  268. ; Input 0 for no action
  269. ; 0 and zero flag if good, else 0ffh and nz flag.
  270. ; a,f
  271. setbaud:
  272.     push    psw
  273.     call    setparity;    uses hi order bits
  274.     pop    psw
  275.     ani    0fh;        baud field
  276.     rz;            0, ignore
  277.     cpi    11
  278.     jnc    badbd;        invalid request
  279.     push    h
  280.     lxi    h,bdtbl-1;    for 1 based value
  281.     add    l
  282.     mov    l,a
  283.     adc    h
  284.     sub    l
  285.     mov    h,a
  286.     mov    a,m
  287.     pop    h
  288.     inr    a
  289.     jz    badbd;        baud rate not available
  290.     dcr    a
  291.     out    bport;        Send the byte
  292.     xra    a;        Say rate is OK
  293.     ret
  294. badbd:    ori    0ffh;        with error signal
  295.     ret
  296. ;
  297. ; Table of bit patterns for baud rates. Not visible externally
  298. bdtbl:    db    bd110,  bd300,  bd450,  bd600,  bd710
  299.     db    bd1200, bd2400, bd4800, bd9600, bd19200
  300. ;
  301. ; set parity on bit weights 20,10h of (a).
  302. ; values: 10h = no parity, 20h=odd, 30h = even parity
  303. ; set stop bits on bit weights 80h,40h
  304. ; values: 40h = 1 stop, 80h = 1.5 stops, 0c0h = 2 stops
  305. ; zero fields for no change.
  306. ; a,f
  307. setparity:
  308.     push    b
  309.     push    d
  310.     push    h
  311.     mov    e,a;        save configuration
  312.     ani    030h
  313.     jz    sp2;        no parity changes
  314.     mvi    d,paroff
  315.     lxi    b,256*tx8bit + rx8bit;    8 bits for no parity
  316.     cpi    20h
  317.     jc    sp1;        parity is turned off
  318.     mvi    d,pareven + parenbl
  319.     lxi    b,256*tx7bit + rx7bit;    7 bits for parity
  320.     cpi    30h
  321.     jz    sp1;        even parity
  322.     mvi    d,parodd + parenbl
  323. sp1:    lxi    h,wr3+1;    b holds new txbits, c new rxbits,
  324.     mov    a,m;          d new parity bits
  325.     ani    NOT rxmask
  326.     ora    c
  327.     mov    m,a;        set receive wd length
  328.     lxi    h,wr5+1
  329.     mov    a,m
  330.     ani    NOT txmask
  331.     ora    b
  332.     mov    m,a;        set transmit wd length
  333.     lxi    h,wr4+1
  334.     mov    a,m
  335.     ani    NOT parmask
  336.     ora    d
  337.     mov    m,a;        set parity
  338. sp2:    mov    a,e
  339.     ani    0c0h
  340.     jz    sp4;        no stop bit changes
  341.     mvi    b,stops1
  342.     cpi    010h
  343.     jz    sp3;        1 stop bit
  344.     mvi    b,stops15
  345.     cpi    020h
  346.     jz    sp3;        1.5 stop bits
  347.     mvi    b,stops2;    else 2 stop bits
  348. sp3:    lxi    h,wr4+1;    b holds new stop configuration
  349.     mov    a,m
  350.     ani    NOT stopmsk
  351.     ora    b
  352.     mov    m,a;        set stop bits
  353. sp4:    pop    h
  354.     pop    d
  355.     pop    b
  356.     jmp    mdgo;        make the physical changes
  357. ;
  358. ; For non-intelligent modems.  Go off hook and connect.
  359. ; a,f
  360. mdansw:    xra    a;        This insert can't do this
  361.     ret
  362. ;
  363. ; For non intelligent modems.  Is the phone ringing
  364. ; 0 and z flag if not, 0ffh and nz flag if ringing
  365. ; a,f
  366. mdring:    xra    a;        not ringing to this insert
  367.     ret
  368. ;
  369. ; For disk control, the following indicates that the application
  370. ; will not require disk access in the immediate future.  If possible
  371. ; drive motors should be stopped.  No harm if unable to perform
  372. ; **** CHANGE THIS FOR non 1983 version Kaypros ****
  373. ; a,f
  374. dskstp:    if    kp83 OR kp84
  375.      in    bitport
  376.      if    kp83
  377.       ori    mtrbit;        Kills 'em dead
  378.      else;        1984 version
  379.       ani    NOT mtrbit
  380.      endif
  381.      out    bitport
  382.     endif;        kp83 or kp84
  383.     ret
  384. ; For disk control, the following indicates that the application
  385. ; will require disk access in the immediate future.  If possible
  386. ; drive motors should be started.  No harm if unable to perform.
  387. ; **** CHANGE THIS FOR non 1983 version Kaypros ****
  388. ; a,f
  389. dskrun:    if    kp83 OR kp84
  390.      in    bitport
  391.      ani    mtrbit
  392.      if    kp83
  393.       rz;            already running
  394.      else;        1984 version
  395.       rnz;            already running
  396.      endif;        1984 ver.
  397.      in    bitport;    startem
  398.      if    kp83
  399.       ani    NOT mtrbit
  400.      else;        1984 ver
  401.       ori    mtrbit
  402.      endif;        1984 ver
  403.      out    bitport
  404.      push    d
  405.      lxi    d,400;        millisecs = 0.4 sec.
  406.      call    dodelay;    allow to come up to speed
  407.      pop    d;        Standard Kaypro is 500ms, but this
  408.     endif;        kp83 or kp84
  409.     ret;            is used as an anticipator.
  410. ;
  411. ; ----------------------- Timer interface --------------------------
  412. ;
  413. ;        ---- CUSTOMIZE TO YOUR INSTALLATION ---
  414. ;
  415.     if    havetim;        System peculiar
  416. year     equ    03bh
  417. month     equ    year+1
  418. day     equ    month+1
  419. hour     equ    day+1
  420. minute     equ    hour+1
  421.     endif;        where I keep them
  422. ;
  423. ; This is used only where the host system has no real-time clock.
  424. ; This allows simulation of that clock, with lousy accuracy.
  425. ; Adds 1 minute to the internally stored time value
  426. ; a,f,h,l (allowed)
  427. add1min:
  428.     if    havetim;    the faked Kaypro system
  429.      lxi    h,minute
  430. add1m1:     mov    a,m
  431.      inr    a
  432.      mov    m,a
  433.      sui    60;        this rolls hours at 60 !!!
  434.      rnz
  435.      mov    m,a
  436.      dcx    h
  437.      jmp    add1m1
  438.     else;        the simplest system, none
  439.      ret
  440.     endif
  441. ;
  442. ; These two routines are called with either
  443. ;   de = 0ffffh for a query (return current value in hl) )
  444. ;   de = other  to set the appropriate value, and return in (hl)
  445. ; The returned value should be 0ffffh if no timer system installed.
  446. ; A zero value for date should also indicate no timer system (this
  447. ; is the default value when the RSX is not running).
  448. ;
  449. ; The date is kept in the following format (note 0ffffh is invalid)
  450. ;    MSbit    yyyyyyy mmmm ddddd   LSbit
  451. ; with y field (0..127) the offset from 1980 (dates to 2107)
  452. ;      m field (1..12)  the numerical month  (Jan to Dec)
  453. ;      d field (1..31)  the day of month
  454. ; (Identical to MSDOS format)
  455. ; a,f,h,l
  456. sgdate:    lxi    h,0ffffh;    default not implemented
  457.     if    havetim
  458.      mov    a,d
  459.      ana    e
  460.      inr    a
  461.      jz    gmdate;        enquiry
  462. ;     "    "
  463. ; Set MSDOS format date (from de), return in hl
  464. ; yyyyyyy m  mmm ddddd
  465. ; a,f,h,l
  466. smdate:     mov    a,d
  467.      rar
  468.      ani    07fh
  469.      adi    80
  470.      sta    year
  471.      mov    a,e
  472.      ani    01fh
  473.      sta    day
  474.      mov    a,d
  475.      rar;            bit to cy
  476.      mov    a,e
  477.      ral
  478.      ral
  479.      ral
  480.      ral
  481.      ani    0fh
  482.      sta    month
  483. ;     "    "
  484. ; convert to MSDOS date format in hl.
  485. ; a,f,h,l
  486. gmdate:     lda    year;        My hardware leaves 0 or 0ffh
  487.      inr    a;        on power on, until set.
  488.      rz;            not set
  489.      dcr    a
  490.      rz;            not set
  491.      sui    80;        MSDOS year 0 is 1980
  492.      ani    07fh;        max 127
  493.      mov    l,a
  494.      lda    month
  495.      ani    0fh
  496.      call    put4b
  497.      lda    day
  498.      ani    31;        max value
  499.      jmp    put5b
  500.     else
  501.      ret
  502.     endif
  503. ;
  504. ; The time is kept in the following format (note 0ffffh is invalid)
  505. ;   MSbit     hhhhh mmmmmm sssss  LS bit
  506. ; with h field (0..23)  hour of day (0 is midnight)
  507. ;      m field (0..59)  minute of hour
  508. ;      s field (0..29)  seconds DIV 2 (resolution 2 seconds)
  509. ; (Identical to MSDOS format)
  510. ; a,f,h,l
  511. sgtime:    lxi    h,0ffffh;    Not implemented
  512.     if    havetim
  513.      mov    a,d
  514.      ana    e
  515.      inr    a
  516.      jz    gmtime;        -1, get timer
  517. ;     "    "
  518. ; Store MSDOS format time from de, return in hl
  519. ; hhhhh mmm  mmm sssss
  520. ; a,f
  521. smtime:     mov    a,d
  522.      rrc
  523.      rrc
  524.      rrc
  525.      ani    01fh
  526.      sta    hour
  527.      mov    a,d
  528.      ral
  529.      ral
  530.      ral
  531.      ani    038h
  532.      mov    h,a
  533.      mov    a,e
  534.      rlc
  535.      rlc
  536.      rlc
  537.      ani    07h
  538.      ora    h
  539.      sta    minute
  540. ;     "    "
  541. ; convert to MSDOS format time in hl.
  542. ; a,f,h,l
  543. gmtime:     lda    minute;        Any ff indicates not set
  544.      inr    a;            in my hardware
  545.      rz;            not set
  546.      lda    hour
  547.      inr    a
  548.      rz;            not set
  549.      dcr    a
  550.      ani    01fh
  551.      mov    l,a
  552.      lda    minute
  553.      ani    03fh
  554.      dad    h;        make put5 into put6
  555.      call    put5b
  556.      xra    a;        seconds value 0
  557. ;     "    "
  558. ; inject (a) premasked as rh 5 bits of hl, shifting hl left
  559. ; a,f,h,l
  560. put5b:     dad    h
  561. ;     "    "
  562. ; inject (a) premasked as rh 4 bits of hl, shifting hl left
  563. ; a,f,h,l
  564. put4b:     dad    h
  565.      dad    h
  566.      dad    h
  567.      dad    h
  568.      ora    l
  569.      mov    l,a
  570.     endif
  571.     ret
  572. ;
  573. ; ------------ I/O Dependant Function Key actions -------------
  574. ;
  575. ; Function key 0, used to print screen
  576. ; a,f,h,l
  577. f0k:    if    kp83
  578. ;
  579. ; IF NOT lstbusy THEN
  580. ;   FOR line := 0 TO 23 DO BEGIN
  581. ;     i := 79;
  582. ;     WHILE i > 0 AND line[i] = ' ' DO i := i - 1;
  583. ;     FOR j := 0 TO i DO write(lst, line[i]);
  584. ;     writeln(lst); END;
  585. ;
  586. ; Print screen to lister
  587. ; a,f,h,l
  588.      push    d
  589.      push    b
  590.      call    @lstat;        Kaypro only flag is trustworthy
  591.      jz    f0k7;        ignore if off line/busy
  592.      lxi    h,video-128
  593.      mvi    b,24;        lines to scan
  594. ;     "    "
  595. ; b is lines still to scan, hl is start of prev. line
  596. f0k1:     lxi    d,128;        memory per line
  597.      dad    d
  598.      push    h;        save line start
  599.      lxi    d,79;        e := 79, rh column
  600.      dad    d;        point to line end
  601. ;     "    "
  602. ; Scan off trailing blanks
  603. f0k2:     call    getch
  604.      dcx    h
  605.      mov    a,c
  606.      ani    07fh;        remove any flash attribute
  607.      cpi    ' '
  608.      jnz    f0k3;        non blank found, e is char count
  609.      dcr    e
  610.      jp    f0k2
  611.      inr    e;        put a single blank for empty line
  612. ;     "    "
  613. ; e is chars for this line, TOS is line start
  614. f0k3:     pop    h
  615.      push    h;        restore line start
  616. ;     "    "
  617. ; output next character
  618. f0k4:     call    getch;        output next character
  619.      mov    a,c
  620.      ani    07fh;        remove any flash attribute
  621.      mov    c,a
  622.      cpi    07fh
  623.      jz    f0k5;        rub to space
  624.      cpi    ' '
  625.      jnc    f0k6;        printing char
  626. f0k5:     mvi    c,' ';        convert funnys to blanks
  627. f0k6:     call    lputch;        absorb funny graphics
  628.      inx    h
  629.      dcr    e
  630.      jp    f0k4
  631.      mvi    c,cr
  632.      call    lputch
  633.      mvi    c,lf
  634.      call    lputch
  635.      pop    h
  636.      dcr    b
  637.      jnz    f0k1
  638. f0k7:     pop    b
  639.      pop    d
  640.      xra    a
  641.      ret
  642. ;
  643. lputch:     push    h;        char to lister, save regs
  644.      push    d
  645.      push    b
  646.      call    @lout;        get rid of the rub here
  647.      pop    b
  648.      pop    d
  649.      pop    h
  650.      ret
  651. ;
  652. ; Access video location (hl)^
  653. ; This must execute above the bank1 storage area
  654. ; a,f,c
  655. getch:     in    bitport
  656.      ori    080h
  657.      di
  658.      out    bitport
  659.      mov    c,m
  660.      ani    07fh
  661.      out    bitport
  662.      ei
  663.      ret
  664.     endif;        otherwise f0k falls thru to "ret" below
  665. ;
  666. ; The following are called when the ATTN char is followed by one
  667. ; of the digits '0' thru '9'.  It is suggested that the digit '0'
  668. ; be reserved for performing screen dumps.  A simple "ret" 
  669. ; eliminates any key from the function repetoire.
  670. ; a,f,h,l (allowed)
  671. f1k:
  672. f2k:
  673. f3k:
  674. f4k:
  675. f5k:
  676. f6k:
  677. f7k:
  678. f8k:
  679. f9k:    ret;        eliminate all these
  680. ;
  681. .savelc:
  682. ;
  683. ; Following special mechanism for SLRMAC assembler.  For others omit
  684. ; and patch the initialization area
  685.     org    imsg;        defined in rsxinit module.
  686.  db    ' installing on Kaypro 2/4'
  687.  if    kp83
  688.   db    ' (83'
  689.  endif
  690.  if    kp84
  691.   db    '/10 (84'
  692.  endif
  693.  db    ' version)$'
  694.     org    .savelc;    restore lcn ctr.
  695. ;
  696. ;               end of insert
  697. ; ------------------------------------------------------------------
  698. ;
  699. ≡╔