home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / mex / mxo-mg10.aqm / MXO-MG10.ASM
Assembly Source File  |  1985-08-05  |  15KB  |  508 lines

  1.     title    'MEX overlay for MEGA SuperComputer SBC'
  2. ;
  3. ; MXO-MG10.ASM -- MEX Overlay file for the MEGA SuperComputer SBC
  4. ;
  5. ; Version 1.0: Written 09/04/84 by Ron Fowler
  6. ;
  7. ; This overlay adapts the MEX modem program to the Mega Computer Co. Single
  8. ; Board Computer, using the Zilog SIO or DART.
  9. ;
  10. ; This overlay is adaptable to any computer using an SIO or DART for
  11. ; serial communications, and is especially useful if such adaptations
  12. ; are for computer with multiple SIO chips.  It's also helpful if
  13. ; the target computer uses a CTC for generating the serial clock.
  14. ;
  15. ; This overlay is capable of setting baud rate and setting port number
  16. ; (via the SET command), and setting baud rate from the phone library.
  17. ;
  18. ; Note: to take advantage of software baud-rate selection, you must strap
  19. ; the MEGA baud-rate block (J10) as follows:
  20. ;
  21. ;        CTCI0 - 19200\  For non-MEGA computers, this is a 307KB
  22. ;        CTCI1 - 19200 > input clock rate (307KB/16=19200)
  23. ;        CTCI2 - 19200/                          
  24. ;        CTC00 - first SIO clock (RAn, RTAn/RTBn)--\  
  25. ;        CTC01 - second SIO clock                --| 
  26. ;        CTC02 - third SIO clock            --|  
  27. ;                            |------/            
  28. ;                           |   
  29. ;                These may be to any of the 6 SIO
  30. ;                clock lines, but MAX of three unless
  31. ;                you hack in another CTC.  You must
  32. ;                change the values in CTCTBL if you
  33. ;                don't use CTC port 4 -- SIO on P5
  34. ;                      CTC port 5 -- SIO on P6
  35. ;                      CTC port 6 -- SIO on P3
  36. ;
  37. ; The SIO channels are numbered as follows:
  38. ;
  39. ;    PORT    Connector   SIO Chip
  40. ;    ----    ---------   --------
  41. ;    0       P5           U61
  42. ;    1       P6           U61
  43. ;    2       P3           U58
  44. ;    3       P4           U58    (usually, the console)
  45. ;    4       P7           U64
  46. ;    5       P8           U64
  47. ;
  48. ; The reason for this strange numbering scheme is for compatibility with
  49. ; MEGA TurboDOS, where ports 4,5 don't exist (U64 is the network control-
  50. ; ler port for TurboDOS, and is not used for RS232 serial communications).
  51. ;
  52. ; Be aware that, if you're running MEGA TurboDOS, this overlay will dis-
  53. ; able the interrupts of any port it's SET to ... you can use the TurboDOS
  54. ; version of MEX if this is a problem.  You might prefer to use this overlay
  55. ; to communicate in terminal mode at the higher baudrates, which is a losing
  56. ; situation with the TurboDOS MEX.
  57. ; Set the following NPORT value to the relative port # (table above) you
  58. ; want MEX to use on start up.
  59. ;
  60. NPORT    EQU    1
  61. ;
  62. REV    EQU    10    ;V 1.0
  63. ;
  64. RDA    EQU    1        ;mask for recv-data available
  65. TBE    EQU    4        ;mask for transmit-bufr empty
  66. ;
  67. ; MEX service processor stuff
  68. ;
  69. MEX    EQU    0D00H        ;address of the service processor
  70. INMDM    EQU    255        ;get char from port to A, CY=no more in 100 ms
  71. TIMER    EQU    254        ;delay 100ms * reg B
  72. TMDINP    EQU    253        ;B=# secs to wait for char, cy=no char
  73. CHEKCC    EQU    252        ;check for ^C from KBD, Z=present
  74. SNDRDY    EQU    251        ;test for modem-send ready
  75. RCVRDY    EQU    250        ;test for modem-receive ready
  76. SNDCHR    EQU    249        ;send a character to the modem (after sndrdy)
  77. RCVCHR    EQU    248        ;recv a char from modem (after rcvrdy)
  78. LOOKUP    EQU    247        ;table search: see CMDTBL comments for info
  79. PARSFN    EQU    246        ;parse filename from input stream
  80. BDPARS    EQU    245        ;parse baud-rate from input stream
  81. SBLANK    EQU    244        ;scan input stream to next non-blank
  82. EVALA    EQU    243        ;evaluate numeric from input stream
  83. LKAHED    EQU    242        ;get nxt char w/o removing from input
  84. GNC    EQU    241        ;get char from input, cy=1 if none
  85. ILP    EQU    240        ;inline print
  86. DECOUT    EQU    239        ;decimal output
  87. PRBAUD    EQU    238        ;print baud rate
  88. ;
  89. PRINT    EQU    9        ;BDOS/MEX print-string function call
  90. ;
  91. BELL    EQU    7        ;bell
  92. TAB    EQU    9
  93. CR    EQU    13        ;carriage return
  94. LF    EQU    10        ;linefeed
  95. ESC    EQU    1BH        ;escape
  96. YES    EQU    0FFH
  97. NO    EQU    0
  98. ;
  99. ;
  100.     ORG    100H
  101. ;
  102. ; Change the clock speed to suit your system
  103. ;
  104.     DS    3        ;(for  "JMP   START" instruction)
  105.  
  106.     DB    NO        ;yes=PMMI S-100 Modem            103H
  107.     DB    NO        ;yes=HAYES Smartmodem, no=non-PMMI    104H
  108.     DB    'T'        ;T=touch, P=pulse (Smartmodem-only)    105H
  109. CLOCK:    DB    50        ;clock speed in MHz x10, 25.5 MHz max.    106H
  110.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  111. MSPEED:    DB    5        ;0=110 1=300 2=450 3=600 4=710 5=1200    107H
  112.                 ;6=2400 7=4800 8=9600 9=19200 default
  113. BYTDLY:    DB    5        ;0=0 delay  1=10ms  5=50 ms - 9=90 ms    108H
  114.                 ;default time to send character in ter-
  115.                 ;minal mode file transfer for slow BBS.
  116. CRDLY:    DB    5        ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  117.                 ;default time for extra wait after CRLF
  118.                 ;in terminal mode file transfer
  119. COLUMS:    DB    5        ;number of DIR columns shown        10AH
  120. SETFLG:    DB    YES        ;yes=user-added Setup routine        10BH
  121. SCRTST:    DB    YES        ;Cursor control routine         10CH
  122.     DB    YES        ;yes=resend a record after any non-ACK    10DH
  123.                 ;no=resend a record after a valid-NAK
  124. BAKFLG:    DB    YES        ;yes=change any file same name to .BAK    10EH
  125. CRCDFL:    DB    NO        ;yes=default to CRC checking        10FH
  126. TOGCRC:    DB    YES        ;yes=allow toggling of CRC to Checksum    110H
  127. CVTBS:    DB    NO        ;yes=convert backspace to rub        111H
  128. TOGLBK:    DB    YES        ;yes=allow toggling of bksp to rub    112H
  129. ADDLF:    DB    NO        ;no=no LF after CR to send file in    113H
  130.                 ;terminal mode (added by remote echo)
  131. TOGLF:    DB    YES        ;yes=allow toggling of LF after CR    114H
  132.     DB    YES        ;yes=allow transmission of logon    115H
  133.                 ;write logon sequence at location LOGON
  134. SAVCCP:    DB    YES        ;yes=do not overwrite CCP        116H
  135.     DB    NO        ;yes=local command if EXTCHR precedes    117H
  136.                 ;no=external command if EXTCHR precedes
  137.     DB    YES        ;yes=allow toggling of LOCONEXTCHR    118H
  138. LSTTST:    DB    YES        ;yes=printer available on printer port    119H
  139. XOFTST:    DB    NO        ;yes=checks for XOFF from remote while    11AH
  140.                 ;sending a file in terminal mode
  141. XONWT:    DB    NO        ;yes=wait for XON after CR while    11BH
  142.                 ;sending a file in terminal mode
  143. TOGXOF:    DB    YES        ;yes=allow toggling of XOFF checking    11CH
  144. IGNCTL:    DB    NO        ;yes=CTL-chars above ^M not displayed    11DH
  145. EXTRA1:    DB    0        ;for future expansion            11EH
  146. EXITCHR    DB    'E'-40H        ;^E = Exit to main menu            11FH
  147. BRKCHR:    DB    '@'-40H        ;^@ = Send 300 ms. break tone        120H
  148. NOCONN:    DB    'N'-40H        ;^N = Disconnect from the phone line    121H
  149. LOGCHR:    DB    'L'-40H        ;^L = Send logon            122H
  150. LSTCHR:    DB    'P'-40H        ;^P = Toggle printer            123H
  151. UNSAVE:    DB    'R'-40H        ;^R = Close input text buffer        124H
  152. TRNCHR:    DB    'T'-40H        ;^T = Transmit file to remote        125H
  153. SAVCHR:    DB    'Y'-40H        ;^Y = Open input text buffer        126H
  154. EXTCHR:    DB    '^'-40H        ;^^ = Send next character        127H
  155.     DS    2        ;unused by MEX                128H
  156. ;
  157. INCTL1:    JMP    INSP        ;go input status port            12AH
  158.     DS    7
  159. ;
  160. OTDATA:    JMP    OUTDP        ;go output data port            134H
  161.     DS    7
  162. ;
  163. INPORT:    JMP    INDP        ;go input data port            13EH
  164.     DS    7
  165. ;
  166. MASKR:    ANI    RDA    ! RET    ;bit to test for receive ready        148H
  167. TESTR:    CPI    RDA    ! RET    ;value of rcv. bit when ready        14BH
  168. MASKS:    ANI    TBE    ! RET    ;bit to test for send ready        14EH
  169. TESTS:    CPI    TBE    ! RET    ;value of send bit when ready        151H
  170.     DS    14        ;                    156H
  171. ;
  172. ;
  173.     DS    3        ;DIALV: not done here (maybe MXO-SM)    162H
  174. DISCV:    JMP    DISCON        ;disconnect
  175. GOODBV:    JMP    GOODBY        ;                    168H
  176. INMODV:    JMP    NITMOD        ;go to user written routine        16BH
  177.     RET ! NOP ! NOP        ;NEWBDV                    16EH
  178.     RET ! NOP ! NOP        ;NOPARV                    171H
  179.     RET ! NOP ! NOP        ;PARITV                    174H
  180. SETUPV:    JMP    SETCMD        ;                    177H
  181.     DS    3        ;not used by MEX            17AH
  182. VERSNV:    JMP    SYSVER        ;                    17DH
  183. BREAKV:    JMP    SBREAK        ;                    180H
  184. ;
  185. ; Do not change the following six lines (they provide access to routines
  186. ; in MEX that are present to support MDM7 overlays -- they will likely
  187. ; be gone by MEX v2.0).
  188. ;
  189. ILPRTV:    DS    3        ;                    183H
  190. INBUFV    DS    3        ;                    186H
  191. ILCMPV:    DS    3        ;                    189H
  192. INMDMV:    DS    3        ;                    18CH
  193.     DS    3        ;                    18FH
  194. TIMERV    DS    3        ;                    192H
  195. ;
  196. ; Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
  197. ; SCRTEST to YES at 010AH (above).
  198. ;
  199. CLREOS:    LXI    D,EOSMSG    ;                    195H
  200.     MVI    C,PRINT
  201.     CALL    MEX
  202.     RET
  203. ;
  204. CLS:    LXI    D,CLSMSG    ;                    19EH
  205.     MVI    C,PRINT
  206.     CALL    MEX
  207.     RET
  208. ;                                    1A7H
  209. ;
  210. ; end of fixed area
  211. ;
  212. SYSVER:    MVI    C,ILP        ;in-line print
  213.     CALL    MEX
  214.     DB    'MEGA SuperComputer rev '
  215.     DB    REV/10+'0'
  216.     DB    '.'
  217.     DB    REV MOD 10+'0'
  218.     DB    CR,LF,0
  219.     RET
  220. ;
  221. ; Routine to exit just prior to exit-to-cpm
  222. ;
  223. GOODBY:    RET            ;not done here
  224. ;
  225. ; Send break to remote
  226. ;
  227. SBREAK:    RET            ;not yet implemented
  228. ;
  229. ; Disconnect the modem (not done here, relies on SM overlay)
  230. ;
  231. DISCON:    RET
  232. ;
  233. ; SET command: select baud rate, port name. Port name may be any of
  234. ; ABC, DELTA, USR (names may be changed by altering PNMTBL entries),
  235. ; baud rate any of xxxxxxxxxxxxxxxxxxxxx
  236. ; Special set-port syntax allows baud rate after port name.  Examples:
  237. ;
  238. ;    SET PORT DELTA3
  239. ;    SET PORT ABC 1200
  240. ;    SET PORT USR 300
  241. ;    SET BAUD 9600
  242. ;
  243. SETCMD:    MVI    C,SBLANK    ;any arguments?
  244.     CALL    MEX
  245.     JC    TELL        ;if not, go display port/baud
  246.     LXI    D,CMDTBL
  247.     MVI    C,LOOKUP
  248.     CALL    MEX        ;parse argument
  249.     PUSH    H        ;save any parsed argument adrs on stack
  250.     RNC            ;if we have one, return to it
  251.     POP    H        ;oops, input not found in table
  252. SETERR:    MVI    C,ILP        ;inline print
  253.     CALL    MEX
  254.     DB    CR,LF,'SET command error',CR,LF,0
  255.     RET
  256. ;
  257. ; Argument table
  258. ;
  259. CMDTBL:    DB    '?'+80H        ;help
  260.     DW    STHELP
  261.     DB    'BAU','D'+80H    ;"set baud"
  262.     DW    STBAUD
  263.     DB    'POR','T'+80H    ;"set port"
  264.     DW    SETPOR
  265.     DB    0        ;<<=== table terminator
  266. ;
  267. ; "SET ?" processor
  268. ;
  269. STHELP:    MVI    C,ILP        ;inline print
  270.     CALL    MEX
  271.     DB    CR,LF,'SET BAUD <rate>'
  272.     DB    CR,LF,'SET PORT <port-number>'
  273.     DB    CR,LF
  274.     DB    CR,LF,'Baud rate is one of:'
  275.     DB    CR,LF,'   300 600 1200 4800 9600 19200'
  276.     DB    CR,LF,'Port number is one of:'
  277.     DB    CR,LF,'   0-7 : interfacer 3 or 4 port number'
  278.     DB    CR,LF,'   S   : System Support I serial port'
  279.     DB    CR,LF,0
  280.     RET
  281. ;
  282. ; "SET BAUD" processor
  283. ;
  284. STBAUD:    MVI    C,BDPARS    ;function code: parse a baudrate
  285.     CALL    MEX        ;let MEX look up code
  286.     JC    SETERR        ;jump if invalid code
  287.     CALL    PBAUD        ;no, try to set it
  288.     JC    SETERR        ;if not one of ours, bomb out
  289. BDSHOW:    MVI    C,ILP        ;inline print
  290.     CALL    MEX        ;display baud
  291.     DB    'Baud: ',0
  292.     LDA    MSPEED        ;get current baud rate
  293.     MVI    C,PRBAUD    ;let MEX print it
  294.     CALL    MEX
  295.     RET
  296. ;
  297. ; SET PORT processor
  298. ;
  299. SETPOR:    MVI    C,SBLANK    ;scan to argument
  300.     CALL    MEX
  301.     JC    SETERR        ;if no arg, bomb out
  302.     MVI    C,GNC        ;else consume it
  303.     CALL    MEX
  304.     SUI    '0'        ;convert
  305.     JC    SETERR
  306.     CPI    5+1
  307.     JNC    SETERR
  308.     CALL    SPA        ;set port addresses
  309.     MVI    C,SBLANK    ;any thing more?
  310.     CALL    MEX
  311.     JNC    STBAUD        ;if so, go parse as baud rate
  312. TELL:    MVI    C,ILP
  313.     CALL    MEX
  314.     DB    CR,LF,'Port: ',0
  315.     LDA    PORT
  316.     ADI    '0'        ;get port # in ASCII
  317.     STA    PORTAS
  318.     MVI    C,ILP
  319.     CALL    MEX
  320. PORTAS:    DB    '    ',0
  321.     JMP    BDSHOW
  322. ;
  323. ; Initialize channel ... as distributed, this code simply
  324. ; sets the default port, default port addresses, and default
  325. ; MSPEED (based on MSPTBL table).  You might want to modify
  326. ; this do do a full channel initialization, including SIO
  327. ; setup and baud rate.  If so, delete the commented-out code
  328. ; in between NITMOD and SPA, and enter your initial baudrate
  329. ; just prior to the call on PBAUD.  If you do this, you should
  330. ; be aware that whenever you enter MEX, the baudrate will be
  331. ; set to this default rate (even if a connection is in prog-
  332. ; ress at a different rate).
  333. ;
  334. NITMOD:    MVI    A,NPORT        ;get initial port number
  335. ;
  336. ;; De-comment the following for full initialization
  337. ;;
  338. ;;    CALL    SPA        ;calculate harware port addresses
  339. ;;    MVI    A,??        ;substitute MSPEED baud value for ??
  340. ;;    CALL    PBAUD        ;set rate, init channel
  341. ;;    RET            ;end of init block
  342. ;
  343. ; Calculate hardware status and data port addresses for
  344. ; relative port number passed in A.
  345. ;
  346. SPA:    STA    PORT        ;save port number
  347.     MOV    E,A        ;port # to DE
  348.     MVI    D,0        ;index into table
  349.     LXI    H,PORTBL    ;get table of port hardware addresses
  350.     DAD    D
  351.     DAD    D
  352.     MOV    A,M        ;fetch status port #
  353.     STA    SPORT        ;set it
  354.     INX    H
  355.     MOV    A,M        ;fetch data port #
  356.     STA    DPORT
  357.     LXI    H,MSPTBL    ;get port's MSPEED value
  358.     DAD    D
  359.     MOV    A,M        ;set MSPEED
  360.     STA    MSPEED
  361.     RET
  362. ;
  363. ; Port assignment table for each SIO.  Each entry
  364. ; consists of status-port adrs followed by data-
  365. ; port address.
  366. ;
  367. PORTBL:    DB    0EH,0CH        ;port 0     (SIO #1, A)
  368.     DB    0FH,0DH        ;port 1  (SIO #1, B)
  369.     DB    16H,14H        ;port 2  (SIO #2, A)
  370.     DB    17H,15H        ;port 3  (SIO #2, B)
  371.     DB    1AH,18H        ;port 4  (SIO #3, A)
  372.     DB    1BH,19H        ;port 5  (SIO #3, B)
  373. ;
  374. ; This routine sets baud rate passed as MSPEED code in A.
  375. ; Returns CY=1 if baud rate not supported (if supported,
  376. ; this routine must set the new MSPEED code).
  377. ;
  378. PBAUD:    PUSH    H        ;don't alter anybody
  379.     PUSH    D
  380.     PUSH    B
  381.     MOV    E,A        ;MSPEED code to DE
  382.     MVI    D,0
  383.     LDA    PORT        ;get port #
  384.     MOV    C,A        ;to BC
  385.     MVI    B,0
  386.     LXI    H,BAUDFL    ;offset to flags for this port
  387.     DAD    B
  388.     MOV    A,M        ;software baudrate supported
  389.     ORA    A        ;  for this port?
  390.     STC            ;prep carry in case not
  391.     JZ    PBEXIT        ;jump if not supported
  392.     LXI    H,MSPTBL    ;yes. offset MSPEED for this port
  393.     DAD    B
  394.     MOV    M,E        ;store current rate
  395.     LXI    H,MSPEED    ;set MSPEED value also
  396.     MOV    M,E
  397.     LXI    H,BAUDTB    ;offset into divisor table
  398.     DAD    D        ;indexed by SPEED value
  399.     MOV    A,M        ;fetch divisor
  400.     PUSH    PSW        ;save divisor
  401.     PUSH    B        ;save relative port #
  402.     LDA    SPORT        ;get status port adrs
  403.     MOV    C,A        ;status port adrs to C
  404.     MVI    B,SIOLEN    ;b=length of SIO code
  405.     LXI    H,SIONIT    ;point to init code
  406.     DB    0EDH,0B3H    ;Z80 OUTIR
  407.     POP    B        ;recall relative port #
  408.     LXI    H,CTCTBL    ;offset to CTC register, this port
  409.     DAD    B
  410.     MOV    C,M        ;PORT # IN C
  411.     MVI    A,45H        ;SEND COMMAND CODE
  412.     DB    0EDH,079H    ;Z80 OUTP A instruction
  413.     POP    PSW        ;recall divisor
  414.     DB    0EDH,079H    ;Z80 OUTP A instruction
  415.     ORA    A        ;return no-errors
  416. PBEXIT:    POP    B
  417.     POP    D
  418.     POP    H
  419.     RET
  420. ;
  421. ; table of CTC divisors for each rate
  422. ;
  423. BAUDTB:    DB    175        ;110 (not exact, but close enuf)
  424.     DB    64        ;300
  425.     DB    48        ;450
  426.     DB    32        ;600
  427.     DB    27        ;710 (not exact)
  428.     DB    16        ;1200
  429.     DB    8        ;2400
  430.     DB    4        ;4800
  431.     DB    2        ;9600
  432.     DB    1        ;19200
  433. ;
  434. ; baud rate flags for each SIO port.  Set to 0
  435. ; for a port that doesn't support software baudrate
  436. ; change, 1 for ports that can.
  437. ;
  438. BAUDFL:    DB    1,1,1,0,0,0    ;6 ports (I have only first 3 connected to CTC)
  439. ;
  440. ;
  441. ; the following table associates each port with a CTC
  442. ; hardware address.  Valid port addresses must correspond
  443. ; with the BAUDFL table above
  444. ;
  445. CTCTBL:    DB    4,5,6,0,0,0    ;only 3 channels available on 1 ctc
  446. ;
  447. ; The following table holds MSPEED for each port.
  448. ; Since it's not possible to tell divisors exist in
  449. ; the CTC prior to bringing up MEX, this table is
  450. ; set with defaults, and is filled in with actual
  451. ; values as each port gets a SET BAUD command.
  452. ;
  453. MSPTBL:    DB    5,5,5,5,5,5    ;speed for each port: 1200
  454. ;
  455. ; Init code for an SIO channel
  456. ;
  457. SIONIT:    DB    18H        ;reset channel
  458.     DB    4        ;select write reg 4
  459.     DB    44H        ;16*clock, 1 stop bit,  no parity
  460.     DB    5        ;select write reg 5
  461.     DB    0EAH        ;DTR, 8 bits xmit, TX enabl, RTS
  462.     DB    3        ;select write reg 3
  463.     DB    0C1H        ;8 bits recv, recv enable
  464. SIOLEN    EQU    $-SIONIT    ;length of SIO init code
  465. ;
  466. ;    Port access routines
  467. ;
  468. ; Input
  469. ;
  470. INSP:    LDA    SPORT        ;get status-port adrs
  471.     JMP    INP1
  472. INDP:    LDA    DPORT        ;get data-port adrs
  473. INP1:    STA    INP2+1        ;modify the code
  474. INP2:    IN    0        ;do the input
  475.     RET
  476. ;
  477. ;
  478. ; output status port
  479. ;
  480. OUTSP:    PUSH    PSW        ;save the value
  481.     LDA    SPORT        ;get port adrs
  482.     JMP    OUTT        ;on to common code
  483. ;
  484. ; output data port
  485. ;
  486. OUTDP:    PUSH    PSW        ;save the char
  487.     LDA    DPORT        ;get data-port adrs
  488. OUTT:    STA    OUT1+1        ;modify the code
  489.     POP    PSW        ;recall data byte
  490. OUT1:    OUT    0
  491.     RET
  492. ;
  493. ;
  494. PORT:    DS    1        ;put your initial port # here
  495. ;
  496. DPORT:    DS    1        ;data port address
  497. SPORT:    DS    1        ;status port address
  498. ;
  499. ; Clear-to-end-of-screen and clear-screen sequences
  500. ;
  501. EOSMSG:    DB    ESC,'T','$'
  502. CLSMSG:    DB    26,'$'
  503. ;
  504. ;
  505.     END
  506. ;
  507.