home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / osborne / console.asm < prev    next >
Assembly Source File  |  1994-07-13  |  14KB  |  601 lines

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