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 / MEX / MXO-OS22.AQM / MXO-OS22.ASM
Assembly Source File  |  2000-06-30  |  15KB  |  451 lines

  1. ; MXO-OS22.ASM - OSBORNE 1 OVERLAY                                  24 AUG 84
  2. ; for MEX11.COM - Changed START location to 0EB9H
  3. ; Mark S. Stein, Morton Grove RBBS RCP/M (312) 470-0017
  4. ;
  5. ; MXO-OS21.ASM - Osborne I Overlay                      10JULY84
  6. ; for MEX10.COM & MDM7xx.COM file - 10 JULY 84                 10JULY84
  7. ;
  8. ; This version is a synthesis of MXO-OS01, MXO-OS12.  The primary    10JULY84
  9. ; change from Bob Schultz's MXO-OS01 version is implementation of    10JULY84
  10. ; the  NEWBD  vector, allowing support of the optional baud  rate    10JULY84 
  11. ; entry for phone numbers.
  12. ;    -- Howard Gerber, WB5YWS                     10JULY84
  13. ;       contact me through the OZZ-HAM RCP/M (713) 893-0424         10JULY84
  14. ;       or The Weekender (713) 492-8700                 10JULY84
  15.  
  16. ; Bob Schultz's notes follow:                         10JULY84
  17.  
  18. ; This file is derived from MDM711OS.ASM by Irv Hoff and Paul Kelly.
  19. ; It was necessary to put in some kludges to make it work with MEX10.
  20. ; The problem was that MEX10 called the modem routines before it called
  21. ; the modem initialization routine.  Since the modem routines MUST be
  22. ; above 4000H, ozy wasn't very happy.  While I was at it, I cleaned up
  23. ; the baud rate routines so that the default baud rate can be set by
  24. ; setting MSPEED to the desired value.  I also added a send break routine
  25. ; and a disconnect routine.  Unfortunately, these routines will work only
  26. ; if you use the modem connector rather than the RS-232 connector.  It
  27. ; seems that ozy was designed to use the RS-232 connector to be able to
  28. ; drive a printer at the same time that the modem connector is being used.
  29. ; I don't know why anyone would want a serial printer when a parallel
  30. ; printer is cheaper, but that's the way OCC did it.  The problem with
  31. ; sending a break through the serial port is the MC6850 ACIA can only send
  32. ; a break when RTS is ON.  This is quite reasonable, but the hardware
  33. ; design of the Osborne I clamps the transmitted data from the RS-232
  34. ; connector to a MARK when RTS is on.  Since a break is a SPACE, this
  35. ; doesn't work very well.  The only solutions are: 1) Build an interface
  36. ; to convert the modem connector signals to proper RS-232 signals
  37. ; 2) Modify the main logic board.  This looks like it would be very
  38. ; easy to do, but I haven't tried it.  Just lift the ends of the resistors
  39. ; R20 (10K) and R35 (1.0K) that are connected together and connect the
  40. ; ends off the board with a wire.  I don't know if the resistors are
  41. ; labeled, or even if the mod will work.  It should, but there are as
  42. ; many gotcha's in hardware as there are in software.  Good luck.  If you
  43. ; do make the mod, set the RS232 EQU to NO.
  44.  
  45. ; This file should also work with MDM730 -- I mean MDM740 or perhaps it's
  46. ; now MDM750.  Just set MEX to off.  But if you can get MEX, why bother
  47. ; with MDM?
  48.  
  49. ; A few helpful hints for MEX10.  When MEX starts up, it tries to READ 
  50. ; INI.MEX.  You can create the INI file with an editor and put any MEX
  51. ; commands that you want into it.  Or else you can disable the feature
  52. ; with STAT INITFILE OFF and then clone it.  When you get sick of the
  53. ; prompt that you get when entering terminal mode type POKE $40A0 $C9
  54. ; and then clone it.  The clone number is two bytes at 5335H with the
  55. ; low order byte first.
  56.  
  57. ; I'm releasing this file as version 0.1 without as much testing as I'd
  58. ; like to do only because I can hear the anguished cries of Osborne owners
  59. ; who are faced with yet another version of MDM and can't get MEX running.
  60. ; When I have more time, I'll release an upgraded version 1.0.
  61.  
  62. ; You can contact me through just about any RCPM system in Toronto.
  63.  
  64. ;    Bob Schultz
  65.  
  66. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  67.  
  68. BELL:    EQU    07H        ;bell
  69. CR:    EQU    0DH        ;carriage return
  70. ESC:    EQU    1BH        ;escape
  71. LF:    EQU    0AH        ;linefeed
  72.  
  73. YES:    EQU    0FFH
  74. NO:    EQU    0
  75.  
  76. START:    EQU    0EB9H    ;location MEX10 jumps to -- for kludge
  77.  
  78. RS232:    EQU    YES    ;set this to YES if you're
  79.                 ;   using the RS232 connector
  80.                 ;and to NO if you're using the modem connector
  81. MEX:    EQU    YES    ;set this to YES for MEX10
  82.                 ;and to NO for MDM7
  83.  
  84. ; values to send to 6850 control register for
  85. ; 8 bits, no parity, 1 stop bit
  86. IF    RS232            ;RTS MUST be off
  87. BAUD3:        EQU    56H        ;300 baud 8-bit no parity
  88. BAUD12:        EQU    55H        ;1200 baud 8-bit no parity
  89. ENDIF
  90. IF NOT    RS232            ;RTS on seems reasonable
  91. BAUD3:        EQU    16H        ;300 baud 8-bit no parity
  92. BAUD12:        EQU    15H        ;1200 baud 8-bit no parity
  93. BRKBIT:        EQU    60H        ;bits to set to send break
  94. RTSBIT:        EQU    40H        ;bit to turn off RTS
  95. ENDIF
  96.  
  97. MODCTLP:    EQU    2A00H    ;status register for RS232
  98. MODDATP:    EQU    MODCTLP+1 ;data resister for RS232
  99. MODSNDB:    EQU    2    ;bit to test for ready to send
  100. MODSNDR:    EQU    2    ;modem send ready when high
  101. MODRCVB:    EQU    1    ;bit to test for received data
  102. MODRCVR:    EQU    1    ;modem receive ready when high
  103.  
  104.     ORG    100H
  105.  
  106. IF    MEX
  107.     JMP    INITMOD    ;I hate this kludge
  108. ENDIF
  109. IF NOT    MEX
  110.     DS    3
  111. ENDIF
  112.  
  113. PMMIMODEM:    DB    NO    ;yes=PMMI S-100 Modem            103H
  114. SMARTMODEM:    DB    YES    ;yes=HAYES Smartmodem, no=non-PMMI    104H
  115. TOUCHPULSE:    DB    'T'    ;T=touch, P=pulse (Smartmodem-only)    105H
  116. CLOCK:        DB    40    ;clock speed in MHz x10, 25.5 MHz max.    106H
  117.                 ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
  118. MSPEED:        DB    5    ;0=110 1=300 2=450 3=600 4=710 5=1200   107H
  119.                 ;6=2400 7=4800 8=9600 9=19200 default
  120. BYTDLY:        DB    9    ;0=0 delay  1=10ms  5=50 ms - 9=90 ms   108H
  121.                 ;default time to send character in ter-
  122.                 ;minal mode file transfer for slow BBS.
  123. CRDLY:        DB    9    ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
  124.                 ;default time for extra wait after CRLF
  125.                 ;in terminal mode file transfer
  126. NOOFCOL:    DB    4    ;number of DIR columns shown        10AH
  127. SETUPTST:    DB    YES    ;yes=user-added Setup routine        10BH
  128. SCRNTEST:    DB    YES    ;cursor control routine         10CH
  129. ACKNAK:        DB    YES    ;yes=resend a record after any non-ACK    10DH
  130.                 ;no=resend a record after a valid NAK
  131. BAKUPBYTE:    DB    NO    ;yes=change any file same name to .BAK    10EH
  132. CRCDFLT:    DB    YES    ;yes=default to CRC checking        10FH
  133. TOGGLECRC:    DB    YES    ;yes=allow toggling of CRC to Checksum    110H
  134. CONVBKSP:    DB    NO    ;yes=convert backspace to rub        111H
  135. TOGGLEBK:    DB    YES    ;yes=allow toggling of bksp to rub    112H
  136. ADDLF:        DB    NO    ;no=no LF after CR to send file in    113H
  137.                 ;terminal mode (added by remote echo)
  138. TOGGLELF:    DB    YES    ;yes=allow toggling of LF after CR    114H
  139. TRANLOGON:    DB    NO    ;yes=allow transmission of logon    115H
  140.                 ;write logon sequence at location LOGON
  141. SAVCCP:        DB    NO    ;no=do not save CCP, may be overwritten 116H
  142. LOCONEXTCHR:    DB    NO    ;yes=local command if EXTCHR precedes    117H
  143.                 ;no=external command if EXTCHR precedes
  144. TOGGLELOC:    DB    YES    ;yes=allow toggling of LOCONEXTCHR    118H
  145. LSTTST:        DB    YES    ;yes=printer available on printer port    119H
  146. XOFFTST:    DB    NO    ;yes=checks for XOFF from remote while    11AH
  147.                 ;sending a file in terminal mode
  148. XONWAIT:    DB    NO    ;yes=wait for XON after CR while    11BH
  149.                 ;sending a file in terminal mode
  150. TOGXOFF:    DB    YES    ;yes=allow toggling of XOFF checking    11CH
  151. IGNORCTL:    DB    NO     ;yes=CTL-chars above ^M not displayed    11DH
  152. EXTRA1:        DB    0    ;for future expansion            11EH
  153. EXTRA2:        DB    0    ;for future expansion            11FH
  154. BRKCHR:        DB    'B'-40H    ;^B = Send a 300 ma. break tone        120H
  155. NOCONNCT:    DB    'N'-40H    ;^N = Disconnect from the phone line    121H
  156. LOGCHR:        DB    'W'-40H    ;^W = Send logon            122H
  157. LSTCHR:        DB    'P'-40H    ;^P = Toggle printer            123H
  158. UNSAVE:        DB    'R'-40H    ;^R = Close input text buffer        124H
  159. TRANCHR:    DB    'T'-40H ;^T = Transmit file to remote        125H
  160. SAVECHR:    DB    'Y'-40H    ;^Y = Open input text buffer        126H
  161. EXTCHR:        DB    '\'-40H    ;^\ = Send next character        127H
  162.         DS    2        ;                128H
  163.  
  164. IN$MODCTLP:    CALL    $-$    ! RET    ;get the I/O status        12AH
  165.         DS    6        ;patched to OSTAT by INITMOD
  166.  
  167. OUT$MODDATP:    CALL    $-$    ! RET    ;send a character to the I/O    134H
  168.         DS    6        ;patched to OSOUT by INITMOD 
  169.  
  170. IN$MODDATP:    CALL    $-$    ! RET    ;get a character from the I/O    13EH
  171.         DS    6        ;patched to OSIN by INITMOD
  172.  
  173. ANI$MODRCVB:    ANI    MODRCVB ! RET    ;bit to test for receive ready    148H
  174. CPI$MODRCVR:    CPI    MODRCVR ! RET    ;value of rcv. bit when ready    14BH
  175. ANI$MODSNDB:    ANI    MODSNDB ! RET    ;bit to test for send ready    14EH
  176. CPI$MODSNDR:    CPI    MODSNDR ! RET    ;value of send bit when ready    151H
  177.         DS    12        ;                156H
  178. LOGONPTR:    DW    LOGON        ;for user message.        160H
  179.         DS    3        ;                162H
  180. JMP$DISCON    JMP    DISCON        ;                165h
  181. JMP$GOODBYE:    JMP    GOODBYE        ;                168H
  182. JMP$INITMOD:
  183. IF    MEX
  184.         RET  !  NOP  !  NOP    ;already initialized by kludge    16BH
  185. ENDIF
  186. IF NOT    MEX
  187.         JMP    INITMOD        ;initialize modem code and 6850
  188. ENDIF
  189.  
  190. IF    MEX
  191.         JMP  NEWBD    ; support optional NEWBD    10JULY84    16EH
  192. ENDIF
  193. IF NOT    MEX
  194.         RET  !  NOP  !  NOP    ;(by-passes PMMI routine)    16EH
  195. ENDIF
  196.  
  197.         RET  !  NOP  !  NOP    ;(by-passes PMMI routine)    171H
  198.         RET  !  NOP  !  NOP    ;(by-passes PMMI routine)    174H
  199. JMP$SETUPR:    JMP    SETUPR        ;                177H
  200. JMP$SPCLMENU:    JMP    SPCLMENU    ;                17AH
  201. JMP$SYSVER:    JMP    SYSVER        ;                17DH
  202. JMP$BREAK:    JMP    SENDBRK        ;                180H
  203.  
  204. ; Do not change the following six lines.
  205.  
  206. JMP$ILPRT:    DS    3        ;                183H
  207. JMP$INBUF    DS    3        ;                186H
  208. JMP$INLNCOMP:    DS    3        ;                189H
  209. JMP$INMODEM    DS    3        ;                18CH
  210. JMP$NXTSCRN:    DS    3        ;                18FH
  211. JMP$TIMER:    DS    3        ;                192H
  212.  
  213. CLREOS:        CALL    JMP$ILPRT    ;                195H
  214.         DB    0,0,0,0,0    ;O-1 has no clear EOS.        198H
  215.         RET            ;                19DH
  216.  
  217. CLRSCRN:    CALL JMP$ILPRT        ;                19EH
  218.         DB    1AH,0,0,0,0    ;O-1 clear screen, home cursor  1A1H
  219.         RET            ;                1A6H
  220.  
  221. SYSVER:    CALL    JMP$ILPRT    ;                1A7H
  222.             
  223.     DB    CR,LF
  224.     DB    01BH,')'    ;into half intensity
  225.     DB    'For the Osborne 1: '
  226.     DB    01BH,'('    ;out of half intensity
  227.     DB    'Revised by M. Stein - 08/24/84'
  228.     DB      CR,LF,LF,0
  229.     RET
  230.  
  231. ;-----------------------------------------------------------------------
  232. ;
  233. ; NOTE:  You can change the SYSVER message to be longer or shorter.  The
  234. ;     end of your last routine should terminate by 0400H (601 bytes
  235. ;     available after start of SYSVER) if using the Hayes Smartmodem
  236. ;     or by address 0C00H (2659 bytes) otherwise.
  237. ;
  238. ;-----------------------------------------------------------------------
  239.  
  240. ; You can put in a message at this location which can be called up with
  241. ; CTL-W if TRANLOGON has been set TRUE.  You can put in several lines if
  242. ; desired.  End with a 0.
  243.  
  244. LOGON:        DB    0
  245.  
  246.  
  247. ; Sends a 300 msec break.  Will work only with the modem connector. 
  248.  
  249. SENDBRK:
  250. IF NOT    RS232
  251.         PUSH    H
  252.         LDA    BAUD        ;turn on break
  253.         ORI    BRKBIT
  254.         CALL    OSET
  255.         MVI    B,3        ;wait for 300 ms
  256.         CALL    JMP$TIMER
  257.         LDA    BAUD        ;turn off break 
  258.         CALL    OSET
  259.         POP    H
  260. ENDIF
  261.         RET
  262.  
  263.  
  264. ;  Drops RTS for 3 sec.  RTS is not available on the RS232 connector. 
  265.  
  266. DISCON:
  267. IF NOT    RS232
  268.         PUSH    H
  269.         LDA    BAUD        ;drop RTS
  270.         ORI    RTSBIT
  271.         CALL    OSET
  272.         MVI    B,30        ;wait for 3 sec
  273.         CALL    JMP$TIMER
  274.         LDA    BAUD        ;restore RTS
  275.         CALL    OSET
  276.         POP    H
  277. ENDIF
  278.         RET
  279.  
  280.  
  281. ; if you put a routine in here, it should NOT do a disconnect when
  282. ; using MEX.  That's handled by the DISCON routine above
  283.  
  284. GOODBYE:    RET
  285.  
  286. ; You can put any items in this area you wish to display that are of in-
  287. ; terest to those using this equipment.  If using the Hayes Smartmodem
  288. ; this is unavailable without a special address change.  End the routine
  289. ; with a RET.
  290.  
  291. SPCLMENU:    RET
  292.  
  293.  
  294. ; This is the Osborne initialization routine.
  295.  
  296. INITMOD:
  297. IF NOT    MEX            ;MEX could not be cloned if this code was in
  298.     LDA    FINITFLG    ;flag set yet?
  299.     ORA    A
  300.     RNZ            ;return if have already been here
  301.     INR    A
  302.     STA    FINITFLG    ;set flag
  303. ENDIF
  304.     LHLD    0005H+1        ;FIND START OF BDOS
  305.     LXI    D,-0100H    ;GO TO FIRST PAGE AHEAD OF BDOS
  306.     DAD    D        ;HL NOW POSITIONED ONE PAGE BELOW BDOS
  307.     PUSH    H        ;SAVE THE ADDRESS
  308.     LXI    D,BDJ        ;POINT TO OUR ROUTINE TO PUT THERE
  309.     LXI    B,CDLEN+2    ;SET LENGTH OF CODE
  310.     XCHG
  311.     DB    0EDH,0B0H    ;Z80 LDIR
  312.  
  313.     LHLD    0005H+1        ;GET BDOS ADDRESS BACK ONCE MORE
  314.     POP    D        ;GET THE STARTING ADDRESS OFF STACK
  315.     PUSH    D        ;PUT IT BACK ON THE STACK
  316.     INX    D        ;POINT TO ADDRESS POSITION
  317.     XCHG            ;PUT INTO 'HL'
  318.     MOV    M,E        ;STORE 'LSP' ADDRESS
  319.     INX    H        ;GET 'LSP' LOCATION
  320.     MOV    M,D        ;STORE 'MSP' ADDRESS
  321.     POP    H        ;GET THE ADDRESS BACK ONCE MORE
  322.     SHLD    0005H+1        ;NEW ADDRESS TO PROTECT FOR OVERWRITE
  323.  
  324.     LXI    D,OSIN-BDJ    ;GET THE LENGTH OF ROUTINE TO MOVE
  325.     DAD    D        ;COMUTE ADDRESS OF THE 'OSIN' ROUTINE
  326.     SHLD    IN$MODDATP+1        ;PATCH CALL FOR "GET CHAR." ROUTINE
  327.     LXI    D,OSOUT-OSIN
  328.     DAD    D
  329.     SHLD    OUT$MODDATP+1    ;PATCH CALL FOR "SEND CHAR." ROUTINE
  330.     LXI    D,OSTAT-OSOUT
  331.     DAD    D
  332.     SHLD    IN$MODCTLP+1    ;PATCH CALL FOR "GET STATUS" ROUTINE
  333.     MVI    C,BAUD3        ;300 baud for 6850
  334.     LDA    MSPEED
  335.     CALL    NEWBD        ; set baud rate            10JULY84
  336. IF    MEX
  337.     JMP    START        ;more kludge
  338. ENDIF
  339. IF NOT    MEX
  340.     RET
  341. ENDIF
  342.  
  343.  
  344. NEWBD:    CPI    1        ;                10JULY84
  345.     JZ    OK300        ;                10JULY84
  346.     CPI    5        ;                10JULY84
  347.     JZ    OK1200        ;                10JULY84
  348.     RET            ;                10JULY84
  349.  
  350. OK300:    MVI    A,1        ; MSPEED 300 bps        10JULY84
  351.     MVI    C,BAUD3        ; 01 300 bps            10JULY84
  352.     STA    MSPEED        ;                10JULY84
  353.     JMP    STBAUD        ;                10JULY84
  354.  
  355. OK1200:    MVI    A,5        ; MSPEED 1200 bps        10JULY84
  356.     MVI    C,BAUD12    ; 01 1200 bps            10JULY84
  357.     STA    MSPEED        ;                10JULY84
  358. STBAUD:    PUSH    H        ;                10JULY84
  359.     CALL    OSET1        ; set baud rate            10JULY84
  360.     POP    H        ;                10JULY84
  361.     XRA    A        ; clear carry            10JULY84
  362.     RET            ;                10JULY84
  363.  
  364. ; stuff the control register on the 6850
  365.  
  366. OSET:    MOV    C,A
  367. OSET1:    LHLD    1        ;GET BIOS+3 ADDRESS
  368.     MVI    L,3CH        ;SPECIAL OSBORNE ROUTINE
  369.     PCHL            ;BRANCH TO IT
  370.  
  371.  
  372. ; Change the baud rate with the SET command
  373.  
  374. SETUPR:      PUSH    H
  375.  
  376. AGAIN:    LXI    D,BAUDBUF    ;POINT TO INPUT BUFFER
  377.     CALL    JMP$ILPRT
  378.     DB    'Input Baud Rate (300, 1200): ',0
  379.     CALL    JMP$INBUF
  380.     LXI    D,BAUDBUF+2
  381.  
  382.     CALL    JMP$INLNCOMP    ;COMPARE BAUDBUF+2 WITH CHARACTERS BELOW
  383.     DB    '300',0
  384.     MVI    A,1        ;MSPEED 300 BAUD
  385.     MVI    C,BAUD3        ;OSBORNE 300 BAUD
  386.     JNC    OK        ;GO IF GOT MATCH
  387.  
  388.     CALL    JMP$INLNCOMP
  389.     DB    '1200',0
  390.     MVI    A,5        ;MSPEED 1200 BAUD
  391.     MVI    C,BAUD12    ;OSBORNE 1200 BAUD
  392.     JNC    OK
  393.  
  394.     CALL    JMP$ILPRT    ;ALL MATCHES FAILED - TELL OPERATOR
  395.     DB    '++ Incorrect entry ++',CR,LF,BELL,0
  396.     JMP    AGAIN        ;TRY AGAIN
  397.  
  398. OK:    STA    MSPEED        ;SET MSPEED
  399.     MOV    A,C
  400.     STA    BAUD        ;save 6850 control register image
  401.     CALL    OSET
  402.     POP    H
  403.     XRA    A        ;CLEAR CARRY
  404.     RET
  405.  
  406. BAUDBUF:  DB    10,0
  407.       DS    10
  408. BAUD:      DS    1
  409. IF NOT    MEX
  410. FINITFLG: DB    0
  411. ENDIF
  412.  
  413.  
  414. ; --- ROUTINES THAT GET PLACED JUST UNDER 'BDOS' OVERLAYING 'CCP'
  415.  
  416. BDJ:    JMP    $-$        ;THIS GETS PATCHED TO JUMP TO BDOS ENTRY
  417.  
  418. OSIN:    DI            ;DISABLE INTERRUPTS
  419.     OUT    0        ;SWITCH TO ALTERNATE PAGE
  420.     LDA    MODDATP        ;GET DATA BYTE
  421.     OUT    1        ;SWITCH PAGES BACK
  422.     EI            ;RE-ENABLE INTERRUPTS
  423.     RET
  424.  
  425.  
  426. OSOUT:    DI            ;DISABLE INTERRUPTS
  427.     OUT    0        ;SWITDH TO ALTERNATE PAGE
  428.     STA    MODDATP        ;SEND DATA BYTE
  429.     OUT    1        ;SWITCH PAGES BACK
  430.     EI            ;RE-ENABLE INTERRUPTS
  431.     RET
  432.  
  433.  
  434. OSTAT:    DI            ;DISABLE INTERRUPTS
  435.     OUT    0        ;SWITCH TO ALTERNATE PAGE
  436.     LDA    MODCTLP        ;GET STATUS BYTE
  437.     OUT    1        ;SWITCH PAGES BACK
  438.     EI            ;RE-ENABLE INTERRUPTS
  439.     RET
  440.  
  441.  
  442. CDLEN:    EQU    $-BDJ        ;LENGTH OF CODE TO COPY
  443.  
  444. ;-----------------------------------------------------------------------
  445. ;
  446. ; NOTE:  MUST TERMINATE PRIOR TO 0400H (with Smartmodem)
  447. ;                 0C00H (without Smartmodem)
  448. ;
  449.     END
  450.