home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / f / oremote.lbr / OREMOTE.AZM / OREMOTE.ASM
Encoding:
Assembly Source File  |  1993-10-26  |  13.4 KB  |  597 lines

  1. ;
  2. ; ---- MODEM REMOTE CONSOLE PROGRAM ----
  3. ;         VERSION 1.1
  4. ;  --- VERSION FOR OSBORNE O-1 ---
  5. ;           BY BRK
  6. ;
  7. ; revised by Jim Woolley, FOG Disk Librarian, 11/82
  8. ;
  9. ; THIS PROGRAM ATTACHES A REMOTE CONSOLE, TYPICALLY
  10. ; THRU A MODEM CHANNEL, IN PARALLEL WITH THE USUAL
  11. ; CP/M CONSOLE DEVICE.    IN THIS MODE, CHARACTERS TYPED
  12. ; ON EITHER CONSOLE ARE ECHOED TO BOTH.  THIS ALLOWS
  13. ; A REMOTE USER TO CONTROL THE COMPUTER ... TO RUN
  14. ; DIAGNOSTICS... OR TO GIVE INSTRUCTION ON HOW TO
  15. ; PERFORM CERTAIN OPERATIONS.
  16. ;
  17. ; THE PROGRAM IS INITIATED BY THE COMMAND:
  18. ;
  19. ;    A>REMOTE
  20. ; OR
  21. ;    A>REMOTE  XXXX
  22. ;            WHERE XXXX IS A HEX MEMORY ADDRESS
  23. ;
  24. ; IN THE FIRST CASE, THE MODEM DRIVERS WILL BE RELOCATED AND
  25. ; COPIED JUST UNDER THE  CCP ( OR JUST UNDER WHATEVER PROGRAM
  26. ; IS ALREADY PROTECTED UNDER THE CCP ). IN THIS MODE, WARM BOOTS
  27. ; ARE DISABLED.  IN THE SECOND CASE, WHEN A HEX MEMORY ADDRESS
  28. ; IS SPECIFIED, THE MODEM DRIVERS ARE RELOCATED AND COPIED TO THIS
  29. ; ADDRESS (ASSUMED TO BE "ABOVE" THE BIOS).
  30. ;
  31. ; THE DRIVERS MAY BE DETACHED BY RUNNING THE PROGRAM AGAIN.  IT WILL
  32. ; LOAD AND IF IT FINDS MODEM DRIVERS ALREADY ATTACHED, IT WILL ASK
  33. ; IF YOU WANT THEM DISCONNECTED.
  34. ;
  35. ; ---- CP/M EQUATES ----
  36. ;
  37. BDOS    EQU    5    ; FUNCTION CALL ENTRY POINT
  38. FCB    EQU    5CH    ; DEFAULT FCB LOCATION
  39. CDISC    EQU    4    ; BUFFER FOR LOGGED ON DRIVE #
  40. CHOUT    EQU    2    ; BDOS COMMAND FOR CONSOLE OUTPUT
  41. LST    EQU    9    ; BDOS COMMAND TO PRINT A STRING
  42. DIO    EQU    6    ; BDOS COMMAND FOR DIRECT I/O ( CP/M 2.X )
  43. ;
  44. CR    EQU    0DH    ; CARRIAGE RETURN
  45. LF    EQU    0AH    ; LINE FEED
  46. ;
  47. ;
  48.     ORG    100H
  49. ;
  50.     JMP    START    ; JUMP OVER MSG
  51.     DB    'REMOTE CONSOLE PGM V1.1, (C) 1982 BY BRK',1AH
  52. ;
  53. START:    POP    H    ; GET RETURN ADDRESS FROM STACK
  54.     LXI    SP,STACK ; SET NEW STACK
  55.     PUSH    H    ; PUT RETURN ADDRESS ON NEW STACK
  56. ;
  57.     LXI    D,STMSG    ; POINT TO STARTUP MESSAGE
  58.     CALL    PTMSG    ; ANNOUNCE PRESENCE
  59. ;
  60.     XRA    A
  61.     STA    ABOVE    ; INIT ABOVE FLAG TO "BELOW" STATUS
  62. ;
  63.     LHLD    1    ; GET POINTER TO  BIOS+3
  64.     SHLD    BIOS3    ; SET INTO PROGRAM MODULE
  65.     LXI    D,-1600H
  66.     DAD    D    ; COMPUTE ADDRESS OF CCP+3 (CP/M 2.X)
  67.     SHLD    CCP3    ; SAVE IN PROGRAM MODULE
  68.     LXI    D,1621H    ; OFFSET TO BIOS SETDMA LOCATION
  69.     DAD    D
  70.     SHLD    STDMA    ; SET IN PROGRAM MODULE
  71. ;
  72.     LHLD    6
  73.     SHLD    BDJ+1    ; SAVE BDOS ENTRY ADDRESS
  74. ;
  75.     LHLD    1
  76.     LXI    D,4
  77.     DAD    D    ; POINT TO BIOS+7
  78.     MOV    E,M    ; GET  ADDRESS OF CONSOLE STATUS ROUTINE
  79.     INX    H
  80.     MOV    D,M
  81.     XCHG
  82.     LXI    D,-10    ; LENGTH OF POSSIBLE TEST STRING+POINTER
  83.     DAD    D    ; POINT TO POSSIBLE START OF STRING
  84.     LXI    D,TMSG    ; POINT TO TEST STRING
  85.     MVI    C,8    ; SET COMPARISON LENGTH
  86.     CALL    COMPARE    ; COMPARE THEM
  87.     SHLD    CDPTR    ; SAVE POSSIBLE POINTER
  88.     JNZ    INSTALL    ; IF NOT EQUAL, ASSUME NO MODEM DRIVER IS
  89. ;            ;    ATTACHED ALREADY
  90.     LXI    D,ALMSG    ; IF DRIVER IS ATTACHED, ASK TO DETACH
  91.     CALL    PTMSG
  92.     CALL    YES
  93.     RNZ        ; IF "NO", JUST RETURN
  94. ;
  95.     LXI    D,DTMSG
  96.     CALL    PTMSG    ; NOTIFY OF DETACHMENT
  97. ;
  98.     LHLD    CDPTR
  99.     CALL    GTDE    ; GET POINTER TO OLD JUMP TABLE IN MODULE
  100.     LHLD    1    ; GET POINTER TO STD JUMP TABLE
  101.     XCHG
  102.     LXI    B,12    ; LENGTH OF TABLE
  103.     CALL    MOVE    ; DETACH MODULE
  104.     JMP    EXIT    ; DO WARM BOOT TO RE-INIT BASE PAGE JUMPS
  105. ;
  106. INSTALL: LXI    H,FCB+1    ; POINT TO STD CP/M FCB LOCATION
  107.     SHLD    CHPTR    ; SAVE FOR HEX ROUTINE
  108.     MOV    A,M    ; GET FIRST CHAR.
  109.     CALL    THEX    ; CHECK IF VALID HEX #
  110.     JC    BELOW    ; IF NOT, PUT MODULE "BELOW"
  111.     CALL    GTHEX    ; IF VALID, TRY TO EXTRACT HEX NUMBER
  112.     SHLD    LDADDR    ; SAVE IT
  113.     MVI    A,1
  114.     STA    ABOVE    ; SET ABOVE MODE
  115.     JC    INST1    ; IF GOOD HEX VALUE
  116.     LXI    D,EMSG1
  117.     JMP    EXMG    ; EXIT WITH ERROR MESSAGE
  118. ;
  119. INST1:    PUSH    H
  120.     LHLD    1    ; GET BIOS+3
  121.     LXI    D,40H    ; ASSUME JUMP TABLE AT LEAST
  122.     DAD    D
  123.     POP    D
  124.     CALL    COMPDE    ; IS # REALLY ABOVE THE BIOS
  125.     JC    INSTA    ; IF IT LOOKS OK
  126. ;
  127.     LXI    D,EMSG2
  128.     JMP    EXMG    ; " ABOVE ADDRESS IS TOO SMALL"
  129.             ;  AND EXIT BACK TO CP/M
  130. ;
  131. BELOW:    LHLD    CCP3    ; GET ADDRESS OF CCP+3
  132.     XCHG
  133.     LHLD    BDOS+1    ; GET BDOS ENTRY JUMP ADDRESS
  134.     CALL    COMPDE    ; COMPARE THEM
  135.     JC    INST2    ; IF CCP+3>BDOS ENTRY
  136.     XCHG
  137. INST2:    LXI    D,-LENC-10
  138.     DAD    D    ; ALLOW ROOM BELOW FOR CODE
  139.     MVI    L,6    ; MAKE START ADDRESS LIKE BDOS ENTRY
  140.     SHLD    LDADDR    ; SAVE ADDRESS TO COPY MODULE TO
  141. ;
  142. INSTA:    LHLD    1    ; POINT TO PART OF BIOS JUMP TABLE
  143.     LXI    D,OWBOOT ; POINT TO DESTINATION IN MODULE
  144.     LXI    B,12    ; LENGTH OF TABLE
  145.     CALL    MOVE    ; COPY INTO MODULE
  146. ;
  147.     LXI    D,BDJ    ; POINT TO START OF MODULE
  148.     LHLD    LDADDR    ; POINT TO CODE DESTINATION
  149.     CALL    SUBDE
  150.     SHLD    OFFSET    ; SAVE RELOCATION OFFSET
  151.     CALL    RELOC    ; RELOCATE CODE IN MODULE
  152. ;
  153.     LHLD    LDADDR    ; SET DESTINATION ADDRESS
  154.     XCHG
  155.     LXI    H,BDJ    ; SET SOURCE ADDRESS
  156.     LXI    B,LENC+1; SET LENGTH OF CODE IN MODULE
  157.     CALL    MOVE    ; COPY MODULE TO DESTINATION
  158. ;
  159.     LHLD    1
  160.     XCHG        ; GET BIOS+3 IN (D,E)
  161. ;
  162.     LXI    H,NWBOOT ; POINT TO NEW JUMP TABLE
  163.     LXI    B,12    ; LENGTH OF TABLE
  164.     LDA    ABOVE
  165.     ORA    A    ; TEST IF "ABOVE" MODE
  166.     JZ    INST3    ; NO, SO DO MOVE
  167.     INX    D    ; YES, SO DO NOT COPY OVER WARM BOOT JUMP
  168.     INX    D
  169.     INX    D
  170.     LXI    H,NWBOOT+3
  171.     LXI    B,9
  172. INST3:    CALL    MOVE    ; LINK IN MODULE BY SWITCHING IN JUMP TABLE
  173. ;    CALL    MXINIT    ; INIT REMOTE DRIVERS  deleted, jw
  174.     LXI    D,ATMSG
  175.     CALL    PTMSG
  176.     LHLD    LDADDR    ; GET LOAD ADDRESS
  177.     CALL    HEXW    ; PRINT IT OUT
  178.     LXI    D,ATMSG1
  179.     JMP    EXMG    ; LET WARM BOOT CORRECT BASE PAGE JUMPS
  180. ;
  181. ; ------ SUBROUTINES ------
  182. ;
  183. ; --- COMPARE STRINGS AT (H,L) AND (D,E) FOR (C) BYTES ---
  184. ;
  185. COMPARE: LDAX    D
  186.     CMP    M
  187.     RNZ        ; IF NO MATCH
  188.     INX    H
  189.     INX    D
  190.     DCR    C    ; COUNT DOWN
  191.     JNZ    COMPARE    ; LOOP UNTIL ERROR OR DONE
  192.     RET
  193. ;
  194. ; --- COMPARE (H,L) & (D,E) BY SUBTRACTION (H,L)-(D,E) ---
  195. ;
  196. COMPDE:    MOV    A,L
  197.     SUB    E
  198.     MOV    A,H
  199.     SBB    D
  200.     RET
  201. ;
  202. ; --- SUBTRACT: (H,L)=(H,L)-(D,E) ---
  203. ;
  204. SUBDE:    MOV    A,L
  205.     SUB    E
  206.     MOV    L,A
  207.     MOV    A,H
  208.     SBB    D
  209.     MOV    H,A
  210.     RET
  211. ;
  212. ; --- COPY CODE FROM (H,L) TO (D,E) FOR (B,C) BYTES ---
  213. ;
  214. MOVE:    MOV    A,M
  215.     STAX    D
  216.     INX    H
  217.     INX    D
  218.     DCX    B
  219.     MOV    A,B
  220.     ORA    C
  221.     JNZ    MOVE
  222.     RET
  223. ;
  224. ; --- TEST & CONVERT CHAR. IF VALID HEX # ---
  225. ;
  226. THEX:    SUI    '0'    ; REMOVE ASCII BIAS
  227.     RC        ; IF ERROR
  228.     CPI    'G'-'0'
  229.     CMC
  230.     RC        ; IF ERROR
  231.     CPI    10    ; IS IT 0-9?
  232.     CMC
  233.     RNC        ; YES, SO RETURN
  234.     SUI    7
  235.     CPI    10    ; IF NOT A-F, SET CARRY
  236.     RET
  237. ;
  238. ; --- GET 16 BIT WORD POINTED TO BY (H,L) INTO (D,E) ---
  239. ;
  240. GTDE:    MOV    E,M
  241.     INX    H
  242.     MOV    D,M
  243.     INX    H
  244.     RET
  245. ;
  246. ; --- PUT 16 BIT WORD FROM (D,E) INTO MEMORY AT (H,L) ---
  247. ;
  248. PTDE:    MOV    M,E
  249.     INX    H
  250.     MOV    M,D
  251.     INX    H
  252.     RET
  253. ;
  254. ;
  255. ;  --- HEX INPUT ROUTINE ----
  256. ;
  257. GTHEX:    LXI    H,0    ; CLEAR CONVERSION REGISTER
  258. H1:    CALL    GTCHR    ; GET CHAR.
  259.     CPI    CR    ; IS IT A CR
  260.     RZ        ; YES, SO RETURN
  261. HEX2:    CALL    THEX    ; TEST CHAR. AND REMOVE ASCII BIAS
  262.     RC        ; IF ERROR
  263. HEX1:    DAD    H    ; SHIFT 16 BIT REGISTER OVER 4 PLACES
  264.     DAD    H
  265.     DAD    H
  266.     DAD    H
  267.     ADD    L    ; ADD IN NEW NIBBLE
  268.     MOV    L,A
  269.     JMP    H1
  270. ;
  271. GTCHR:    PUSH    H
  272.     LHLD    CHPTR    ; POINT TO CHAR.
  273.     MOV    A,M    ; GET IT
  274.     INX    H
  275.     SHLD    CHPTR    ; POINT TO NEXT ONE
  276.     POP    H
  277.     RET
  278. ;
  279. ; --- OUTPUT BYTE IN ACC IN HEX ---
  280. ;
  281. HEXOT:    PUSH    PSW    ; SAVE BYTE
  282.     RRC        ; SHIFT UPPER NIBBLE DOWN
  283.     RRC
  284.     RRC
  285.     RRC
  286.     CALL    HEXB    ; OUTPUT UPPER NIBBLE IN HEX
  287.     POP    PSW    ; GET BYTE BACK
  288. HEXB:    ANI    0FH    ; MASK OFF UPPER NIBBLE
  289.     ADI    '0'    ; ADD ASCII BIAS
  290.     CPI    '9'+1    ; TEST IF NUMERIC
  291.     JC    PRT    ; YES, SO DO IT
  292.     ADI    7    ; NO, SO ADD BIAS FOR A-F
  293. PRT:    MOV    C,A    ; SETUP FOR OUTPUT
  294. COUT:    PUSH    PSW
  295.     PUSH    H    ; BUFFERED CONSOLE OUTPUT
  296.     PUSH    D
  297.     PUSH    B
  298.     MOV    E,C
  299.     MVI    C,CHOUT    ; BDOS CHAR. OUTPUT COMMAND
  300.     CALL    BDOS
  301.     POP    B
  302.     POP    D
  303.     POP    H
  304.     POP    PSW
  305.     RET
  306. ;
  307. ; --- OUTPUT (H,L) IN HEX ---
  308. ;
  309. HEXW:    PUSH    H
  310.     MOV    A,H
  311.     CALL    HEXOT    ; PRINT OUT UPPER BYTE
  312.     POP    H
  313.     MOV    A,L
  314.     JMP    HEXOT    ; PRINT OUT LOWER BYTE
  315. ;
  316. ; --- PRINT STRING POINTED TO BY (D,E) ---
  317. ;
  318. PTMSG:    MVI    C,LST
  319.     JMP    BDOS
  320. ;
  321. ;
  322. ; -- YES FUNCTION --
  323. ;
  324. YES:    CALL    CONNC    ; GET CONSOLE CHAR.
  325.     CPI    'Y'    ; IS IT A  Y?
  326.     JZ    YES1
  327.     CPI    'N'    ; IS IT A  N?
  328.     JNZ    YES    ; IF NEITHER, KEEP TRYING
  329.     INR    A    ; SET  N  STATUS
  330. YES1:    PUSH    PSW    ; SAVE FLAGS
  331.     CALL    COUT    ; OUTPUT TO CONSOLE
  332.     POP    PSW    ; RESTORE FLAGS
  333.     RET
  334. CONNC:    CALL    CONIN    ; GET CHAR. FROM CONSOLE
  335.     MOV    C,A    ; SAVE FOR ECHO
  336.     CPI    60H    ; IS IT LOWER CASE?
  337.     JC    CON1    ; NO, SO CONTINUE
  338.     ANI    5FH    ; YES, SO MASK TO UPPER CASE
  339. CON1:    CPI    'C'-40H    ; IS IT A CONTROL-C?
  340.     RNZ        ; NO, SO RETURN
  341. CTC:    LXI    D,CMSG    ; POINT TO CONTROL-C MESSAGE
  342. EXMG:    CALL    PTMSG        ; ISSUE MESSAGE 
  343. EXIT:    LXI    D,CRLF
  344.     CALL    PTMSG        ; ISSUE A CRLF
  345.     JMP    0
  346. ;
  347. CONIN:    MVI    E,0FFH
  348.     MVI    C,DIO
  349.     CALL    BDOS
  350.     ORA    A
  351.     JZ    CONIN
  352.     RET
  353. ;
  354. ; --- RELOCATE ADDRESSES POINTED TO BY ADDRESS TABLE ---
  355. ;
  356. RELOC:    LXI    H,RELTAB    ; POINT TO ADDRESS TABLE
  357. REL1:    CALL    GTDE        ; GET POINTER INTO (D,E)
  358.     MOV    A,D
  359.     ORA    E        ; TEST IF ADDRESS IS ZERO
  360.     RZ            ; RETURN (DONE) IF IT IS
  361.     PUSH    H        ; SAVE TABLE POINTER
  362.     XCHG            ; GET ADDRESS INTO (H,L)
  363.     PUSH    H        ; SAVE POINTER
  364.     CALL    GTDE        ; GET REFERENCED ADDRESS WORD
  365.     LHLD    OFFSET        ; GET OFFSET
  366.     DAD    D        ; COMPUTE RELOCATED ADDRESS
  367.     XCHG
  368.     POP    H
  369.     CALL    PTDE        ; UPDATE ADDRESS WORD IN CODE
  370.     POP    H        ; GET TABLE ADDRESS POINTER BACK
  371.     JMP    REL1        ; LOOP UNTIL DONE
  372. ;
  373. ; --- RELOCATION ADDRESS TABLE ---
  374. ;
  375. RELTAB    EQU    $
  376.     DW    NWBOOT+1
  377.     DW    NWBOOT+4
  378.     DW    NWBOOT+7
  379.     DW    NWBOOT+10
  380.     DW    PTX00
  381.     DW    PTX0+1
  382.     DW    MCNST+1
  383.     DW    MCNIN+1
  384.     DW    PTX1+1
  385.     DW    PTX2+1
  386.     DW    PTX3+1
  387.     DW    PTX4+1
  388.     DW    PTX41+1
  389.     DW    PTX5+1
  390.     DW    PTX6+1
  391.     DW    PTX7+1
  392.     DW    DVX1+1
  393.     DW    MXIN+1
  394.     DW    DVX2+1
  395.     DW    DVX3+1
  396.     DW    DVX4+1
  397.     DW    0        ; TABLE TERMINATOR
  398. ;
  399. ; --- MESSAGES -----
  400. ;
  401. STMSG:    DB CR,LF
  402.     DB CR,LF,' --- REMOTE CONSOLE ATTACHMENT PROGRAM ---'
  403.     DB CR,LF,'         VERS. 1.1'
  404.     DB CR,LF,'      FOR OSBORNE O-1 RS232 PORT'
  405.     DB CR,LF,CR,LF,'$'
  406. ;
  407. ALMSG:    DB    CR,LF,07,' REMOTE CONSOLE IS ALREADY ATTACHED'
  408.     DB       CR,LF,' ---------------->  DETACH IT (Y/N) ?$'
  409. ;
  410. DTMSG:    DB    CR,LF
  411.     DB    CR,LF,' --> REMOTE CONSOLE DRIVERS ARE DETACHED !!'
  412. CRLF:    DB    CR,LF,'$'
  413. ;
  414. EMSG1:    DB    CR,LF,07,' *** INVALID "ABOVE" ADDRESS SPECIFIED ***'
  415.     DB    CR,LF,'$'
  416. ;
  417. EMSG2:    DB    CR,LF,07,' *** "ABOVE" ADDRESS IS TOO SMALL ***'
  418.     DB    CR,LF,'$'
  419. ;
  420. ATMSG:    DB    CR,LF,' --- REMOTE CONSOLE DRIVERS ATTACHED AT $'
  421. ;
  422. ATMSG1:    DB    'H ---',CR,LF,'$'
  423. ;
  424. CMSG:    DB    ' ^C',CR,LF,'$'
  425. ;
  426. ; --- BUFFERS ---
  427. ;
  428. CHPTR:    DS    2    ; BUFFER POINTER FOR HEXIN ROUTINE
  429. LDADDR:    DS    2    ; BUFFER FOR SAVING DRIVER LOAD ADDRESS
  430. OFFSET:    DS    2    ; BUFFER FOR SAVING ADDRESS OFFSET
  431. CDPTR:    DS    2    ; BUFFER FOR POINTER TO JUMP TABLE IN DRIVER
  432. ABOVE:    DS    1    ; FLAG FOR "ABOVE" OR "BELOW" MODE
  433. ;
  434. ; ---------------------------------------------------------------
  435. ; ---- REMOTE CONSOLE DRIVERS ----
  436. ;
  437. ;  THIS SECTION GETS RELOCATED AND COPIED UP TO THE "TOP"
  438. ;  OF AVAILABLE MEMORY. ANY ADDRESSES IN THIS CODE THAT
  439. ;  NEED RELOCATION MUST BE REFERENCED IN THE RELOCATION TABLE.
  440. ;
  441. BDJ:    JMP    $-$    ; THIS GETS PATCHED
  442. ;
  443. ; --- COPY OF ORIGINAL CP/M JUMP TABLE
  444. ;
  445. OWBOOT:    JMP    $-$    ; COPY OF OLD WARM BOOT
  446. OCNST:    JMP    $-$
  447. OCNIN:    JMP    $-$
  448. OCNOUT:    JMP    $-$
  449. ;
  450. ; --- NEW JUMP TABLE TO BE COPIED INTO CP/M JUMP TABLE ---
  451. ;
  452. NWBOOT:    JMP    WBOOT
  453. NCNST:    JMP    MCNST
  454.     JMP    MCNIN
  455.     JMP    MCNOUT
  456. ;
  457. ; --- FAKE WARM BOOT ROUTINE USED IN "BELOW" MODE ---
  458. ;
  459. WBOOT:    LXI    SP,0FFH
  460.     MVI    A,(JMP)
  461.     STA    0    ; SET JUMP OPCODE AT 0000H
  462. BIOS3    EQU    $+1
  463.     LXI    H,$-$    
  464.     SHLD    1    ; SET BIOS+3 WARM BOOT ADDRESS
  465.     STA    5
  466. PTX0:    LXI    H,BDJ
  467.     SHLD    6
  468.     LXI    B,80H    ; SET DEFAULT DMA ADDRESS
  469. STDMA    EQU    $+1
  470.     CALL    $-$
  471.     LDA    CDISC    ; GET DEFAULT DRIVE #
  472.     MOV    C,A
  473. CCP3    EQU    $+1
  474.     JMP    $-$    ; RE-ENTER CCP AT CCP+3
  475. ;
  476. ; THE FOLLOWING 10 BYTES MUST NOT BE CHANGED OR MOVED
  477. ;
  478. TMSG:    DB    'REMOTE C' ; IDENTIFIER STRING
  479. PTX00:    DW    OWBOOT    ; POINT TO SAVED OLD JUMP TABLE
  480. ;
  481. ; --- NEW CONSOLE STATUS ROUTINE ---
  482. ;
  483. MCNST:    CALL    OCNST    ; SEE IF STD CONSOLE HAS A CHAR.
  484.     ORA    A
  485.     RNZ        ; RETURN IF IT DOES
  486. PTX1:    JMP    MXISTAT ; OTHERWISE, CHECK MODEM DRIVER
  487. ;
  488. ; --- NEW CONSOLE INPUT ROUTINE ---
  489. ;
  490. MCNIN:    CALL    OCNST    ; IS CHAR. AVAIL. FROM STD CONSOLE?
  491.     ORA    A
  492. PTX2:    JNZ    OCNIN    ; YES, SO GO GET IT
  493. PTX3:    CALL    MXISTAT    ; NO, SO TRY MODEM
  494.     ORA    A
  495. PTX4:    JZ    MCNIN    ; IF NO CHAR., KEEP LOOKING
  496. PTX41:    CALL    MXIN    ; GET CHAR.
  497.     ORA    A    ; IS IT A NULL?
  498. PTX5:    JZ    MCNIN    ; YES, IGNORE IT
  499.     ANI    7FH    ; MASK PARITY
  500.     RET
  501. ;
  502. ; --- NEW CONSOLE OUTPUT ROUTINE ---
  503. ;
  504. MCNOUT:    PUSH    B    ; SAVE OUTPUT CHAR.
  505. PTX6:    CALL    OCNOUT    ; SEND IT TO STD CONSOLE
  506.     POP    B
  507. PTX7:    JMP    MXOUT    ; SEND IT TO REMOTE CONSOLE ALSO
  508. ;
  509. ; ----- HARDWARE DEPENDENT I/O DRIVER ----
  510. ;    THIS VERSION FOR THE OSBORNE
  511. ;    IS COMPLICATED BY A DESIGN FLAW
  512. ;    IN THE RS232 PORT HARDWARE.  WHEN
  513. ;    NO CONNECTIONS ARE MADE, UART IS
  514. ;    BEING GIVEN NULLS.
  515. ;
  516. MODCTLP    EQU    2A00H    ;PUT YOUR MODEM CONTROL PORT HERE
  517. MODSNDB    EQU    02H    ;YOUR BIT TO TEST FOR SEND
  518. MODSNDR    EQU    02H    ;YOUR VALUE WHEN READY
  519. MODRCVB    EQU    01H    ;YOUR BIT TO TEST FOR RECEIVE
  520. MODRCVR    EQU    01H    ;YOUR VALUE WHEN READY
  521. MODDATP    EQU    2A01H    ;YOUR MODEM DATA PORT
  522. ;
  523. ; --- ALL OF THE MODEM ROUTINES MAY ONLY CHANGE ---
  524. ;    THE A-REGISTER AND THE FLAGS.  NO OTHER
  525. ;    REGISTERS MAY BE CHANGED.
  526. ;
  527. ; --- INPUT DATA FROM MODEM ---
  528. ;
  529. MXIN:    LXI    H,CHRSAV    ; POINT TO CHAR. BUFFER
  530.     MOV    A,M        ; GET CHAR.
  531.     MVI    M,0        ; INDICATE CHAR. RECEIVED
  532.     RET
  533. ;
  534. ; --- OUTPUT DATA TO MODEM ---
  535. ;
  536. MXOUT    DI
  537.     OUT    0
  538.     LDA    MODCTLP
  539.     OUT    1
  540.     EI
  541.     ANI    MODSNDB
  542.     CPI    MODSNDR
  543. DVX1:    JNZ    MXOUT
  544.     MOV    A,C
  545.     DI
  546.     OUT    0
  547.     STA    MODDATP
  548.     OUT    1
  549.     EI
  550.     RET
  551. ;
  552. ; --- TEST IF DATA IS AVAILABLE FROM MODEM ---
  553. ;
  554. ;
  555. MXISTAT: DI
  556.     OUT    0
  557.     LDA    MODCTLP
  558.     OUT    1
  559.     EI
  560.     ANI    MODRCVB
  561.     CPI    MODRCVR    
  562. ;
  563. DVX2:    LDA    CHRSAV    ; GET POSSIBLE SAVE CHAR.
  564. DVX3:    JNZ    MXI1    ; IF NO CHAR., TEST BUFFER FOR ONE
  565. ;
  566.     DI        ; IF CHAR., GET IT
  567.     OUT    0
  568.     LDA    MODDATP    ; GET DATA
  569.     OUT    1
  570.     EI
  571. ;
  572. DVX4:    STA    CHRSAV    ; SAVE IT
  573. MXI1:    ORA    A    ; WAS IT A NULL?
  574.     RZ        ; YES, SO RETURN NOT READY STATUS
  575.     MVI    A,0FFH    ; SET READY STATUS
  576.     RET
  577. ;
  578. CHRSAV:    DB    0    ; BUFFER FOR ONE CHAR.
  579. ;
  580. ; --- INIT MODEM ROUTINES (NOT HARDWARE) ---
  581. ;    THIS ROUTINE NEED NOT PRESERVE ANY
  582. ;    OF THE REGISTERS.
  583. ;
  584. ;MXINIT    EQU    $    ;deleted following code, jw
  585. ;
  586. ;    MVI    C,56H    ; USE 56H FOR 300 BAUD, 55H FOR 1200
  587. ;    LHLD    1
  588. ;    MVI    L,3CH    ; SETUP SPECIAL OSBORNE JUMP
  589. ;    PCHL
  590. ;
  591. LENC    EQU    $-BDJ    ; LENGTH OF CODE MODULE TO COPY UP
  592. ; ------------------------------------------------------
  593. ;
  594.     DS    80
  595. STACK    EQU    $
  596.     END
  597.