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 / SIMTEL / CPMUG / CPMUG051.ARK / TERM.ALX < prev    next >
Text File  |  1984-04-29  |  8KB  |  380 lines

  1. REV EQU 25H ;    03/19/81  R. CURTISS    FOR NEW ALX STRUCTURES
  2. ;REV EQU 24H ;    06/17/79  R. CURTISS    RFOPEN:
  3. ;REV EQU 23H ;    06/17/79  R. CURTISS    FINISH RECEIVE FILE CODE
  4. ;REV EQU 22H ;    06/14/79  R. CURTISS    SABORT, ETAB
  5. ;REV EQU 21H ;    06/14/79  R. CURTISS    FINISH REWRITE
  6. ;REV EQU 20H ;    06/13/79  R. CURTISS    ALX REWRITE FROM NORDATA1P
  7. ;REV EQU 14H ;    10/24/78  R. CURTISS    CI & CISTAT DIRECT TO BIOS
  8. ;REV EQU 13H ;    10/23/78  R. CURTISS    T,U,W   BDOS AND BIOS CI
  9. ;REV EQU 12H ;    08/09/78  R. CURTISS    FIX ERRORS
  10. ;REV EQU 11H ;    08/09/78  R. CURTISS    MORE CODE
  11. ;REV EQU 10H ;    07/26/78  R. CURTISS    INITIAL CODING
  12. ;
  13. ;
  14. ; NORDATA TERMINAL PROGRAM WITH FILE TRANSFER (SEND AND RECEIVE)
  15. ;
  16. ;
  17.     ORG    100H
  18.  
  19.     JMP    START
  20.     DB    REV    ; REVISION NUMBER IN CODE
  21.  
  22. EXIT:    JMP    0000H    ; RETURN TO CP/M
  23.     DB    DREV    ; REVISION NUMBER OF DISKIO PACKAGE
  24.  
  25.     DB    0,0,0
  26.     DB    SREV    ; REVISION CODE FOR SUPPORT ROUTINES
  27. ;
  28. ; -----------------------
  29. ;
  30. QUIT:    DS    1    ; FLAG SET BY COMMAND TO STOP
  31. SABORT:    DS    1    ; FILE SENDING ABORT FLAG
  32. ULTOG:    DS    1    ; UPPER/LOWER CASE SWITCH FLAG
  33. RFOPEN:    DS    1    ; RECEIVE FILE OPEN FLAG
  34. RLOG:    DS    1    ; RECEIVE DATA SAVE FLAG
  35. MSTART    EQU    1000H    ; START OF RLOG AREA
  36. POINT:    DS    2    ; TEMPORARY POINTER FOR WRITE TO DISK
  37. MPOINT:    DS    2    ; POINTER FOR RLOG STORAGE
  38. MEMEND:    DS    2    ; POINTER TO END OF RLOG AREA
  39.  
  40. BUFSIZ    EQU    20    ; CONSOLE READ BUFFER SIZE
  41. CBUFF:    DB    BUFSIZ    ; BUFFER MAX SIZE
  42.     DB    0    ; CURRENT SIZE
  43.     DS    BUFSIZ    ; CONSOLE BUFFER
  44.  
  45. TAB:    DB    0    ; TAB COLUMN COUNTER
  46.  
  47. XDATA:    DS    1    ; TEMPORY STORAGE FOR READ/WRITE DATA
  48.  
  49. WACCE:    DB    3    ; WRITE ACCESS CODE  DELETE OLD FILE
  50.  
  51. ACCE:    DB    1    ; READ ACCESS CODE
  52. FTAB:    DB    0,0,0,'R'
  53.     DS    33    ; FILE CONTROL BLOCK
  54.     DS    128    ; DATA BUFFER
  55.  
  56.     DS    40    ; STACK SPACE
  57. STACK:
  58. PROCEDURE START
  59.     LXI    SP,STACK
  60.     LHLD    BDOS+1
  61.     DCR    H
  62.     SHLD    MEMEND    ; END OF RECEIVE FILE BUFFER
  63.  
  64.     LXI    H,MSTART  ; START OF RECEIVE FILE BUFFER
  65.     SHLD    MPOINT    ; RECEIVE FILE POINTER
  66.  
  67.     CALL    SMODE    ; INITIALIZE MODEM INTERFACE
  68.  
  69.     XRA    A
  70.     STA    QUIT    ; QUIT = FALSE
  71.     STA    RLOG    ; SAVE = FALSE
  72.     CMA
  73.     STA    ULTOG    ; UPPER/LOWER SWITCH = TRUE
  74.     REPEAT
  75.     CALL    RCVCHK    ; CHECK FOR RECEIVE DATA
  76.     CALL    CONCHK    ; CHECK FOR CONSOLE DATA
  77.     LDA    QUIT
  78.     ORA    A
  79.     UNTIL ( NOT ZERO )    ; QUIT = TRUE
  80.     JMP    EXIT    ; RETURN TO CP/M
  81. PROCEDURE RCVCHK
  82.     CALL    MISTAT    ; GET RECEIVE STATUS
  83.     IF ( NOT ZERO )    ; DATA READY
  84.     CALL    MI    ; GET DATA
  85.     MOV    E,A
  86.     PUSH    D
  87.     CALL    CO    ; OUTPUT TO CONSOLE
  88.     POP    D
  89.     LDA    RLOG
  90.     ORA    A
  91.     IF ( NOT ZERO )    ; RLOG = TRUE
  92.     LHLD    MPOINT
  93.     CALL    MEND    ; CHECK FOR POINTER AT END OF MEMORY
  94.     WHEN ( NO CARRY )    ; NOT AT END
  95.     MOV    M,E
  96.     INX    H
  97.     SHLD    MPOINT
  98.     FIN
  99.     ELSE
  100.     MVI    E,'@'
  101.     MOV    M,E
  102.     CALL    CO    ; WARNING FULL
  103.     FIN
  104.     FIN
  105.     FIN
  106.     RET
  107. PROCEDURE MEND
  108.     LDA    MEMEND+1
  109.     SUB    H
  110.     RC        ; RETURN IF FULL
  111.     RNZ        ; RETURN IF NOT FULL CY=0
  112.  
  113.     LDA    MEMEND
  114.     SUB    L    ; CY=1 IF FULL
  115.     RET
  116. PROCEDURE CONCHK
  117.     CALL    CISTAT    ; GET CONSOLE STATUS
  118.     IF ( NOT ZERO )    ; DATA READY
  119.     CALL    CI    ; GET DATA
  120.     CPI    'E'-40H    ; CONTROL E FOR COMMAND MODE
  121.     WHEN ( ZERO )  CALL    CCP
  122.     ELSE
  123.     MOV    E,A
  124.     CALL    MO    ; SEND CHARACTER
  125.     FIN
  126.     FIN
  127.     RET
  128. PROCEDURE CCP
  129.     CALL    CRLF    ; NEW LINE
  130.     MVI    E,':'
  131.     CALL    CO    ; PROMPT TO CONSOLE
  132.  
  133.     CALL    CIE    ; GET COMMAND CHARACTER FROM CONSOLE
  134.     PUSH    PSW
  135.     CALL    BLK    ; SPACE TO CONSOLE
  136.     POP    PSW
  137.     SELECT
  138.     ( 'B' )
  139.     CALL    BRK    ; SEND BREAK TONE
  140.     MVI    A,10
  141.     CALL    DELAY    ; DELAY FOR 1 SEC
  142.     CALL    SMODE    ; INITIALIZE MODEM INTERFACE
  143.     FIN
  144.     ( 'E' | 'E'-40H )
  145.     MVI    E,5
  146.     CALL    MO    ; SEND CONTROL E
  147.     FIN
  148.     ( 'H' )
  149.     LXI    H,HELP
  150.     CALL    MSG    ; DISPLAY COMMAND LIST
  151.     FIN
  152.     ( 'Q' )
  153.     MVI    A,0FFH
  154.     STA    QUIT    ; QUIT = TRUE
  155.     FIN
  156.     ( 'O' )  CALL ROPEN
  157.     ( 'L' )
  158.     LDA    RFOPEN
  159.     ORA    A
  160.     IF ( NOT ZERO )    ; RECEIVE FILE OPEN
  161.     MVI    A,0FFH
  162.     STA    RLOG    ; RLOG = TRUE
  163.     FIN
  164.     FIN
  165.     ( 'N' )
  166.     XRA    A
  167.     STA    RLOG    ; RLOG = FALSE
  168.     FIN
  169.     ( 'C' )  CALL RCLOSE
  170.     ( 'S' )  CALL SEND
  171.     ( 'U' )
  172.     LDA    ULTOG
  173.     CMA
  174.     STA    ULTOG
  175.     FIN
  176.     ( OTHERWISE )
  177.     MVI    E,'?'
  178.     CALL    CO
  179.     FIN
  180.     FIN
  181.     CALL    CRLF
  182.     RET
  183. ;
  184. ; -------------------------------------------- HELP
  185. ;
  186. HELP:    DB    0DH,0AH,9,'B',9,'SEND BREAK TONE'
  187.     DB    0DH,0AH,9,'E',9,'SEND CONTROL E'
  188.     DB    0DH,0AH,9,'H',9,'HELP - LIST COMMANDS'
  189.     DB    0DH,0AH,9,'Q',9,'QUIT - RETURN TO CP/M'
  190.     DB    0DH,0AH,9,'O',9,'OPEN RECEIVE FILE'
  191.     DB    0DH,0AH,9,'L',9,'LOG RECEIVE DATA'
  192.     DB    0DH,0AH,9,'N',9,'NO LOG RECEIVE DATA'
  193.     DB    0DH,0AH,9,'C',9,'CLOSE RECEIVE FILE'
  194.     DB    0DH,0AH,9,'S',9,'SEND FILE'
  195.     DB    0DH,0AH,9,'U',9,'UPPER/LOWER CASE SWITCH'
  196.     DB    0 ; END OF MESSAGE
  197. PROCEDURE SEND
  198.     LXI    B,ACCE
  199.     CALL    OPENF    ; OPEN FILE FOR READ
  200.     IF ( ZERO )    ; NO OPEN ERROR
  201.     XRA    A
  202.     STA    SABORT    ; SEND ABORT = FALSE
  203.     STA    TAB    ; INIT TAB COLUMN COUNTER
  204.  
  205.     CALL    SREAD    ; READ FIRST CHARACTER FROM FILE
  206.     WHILE ( ZERO )    ; NO ERROR OR EOF
  207.     LDA    XDATA    ; GET CHARACTER
  208.     ANI    7FH
  209.     MOV    E,A
  210.     SELECT
  211.     ( 9 )    CALL    ETAB    ; EXPAND TAB
  212.     ( 0DH )            ; CARRIAGE RETURN
  213.     CALL    MOUT    ; SEND CARRIAGE RETURN
  214.     XRA    A
  215.     STA    TAB    ; INITIAL TAB COLUMN COUNTER
  216.     FIN
  217.     ( 0 | 0AH | 7FH )  NOP    ; IGNORE NULL, LF, DELETE
  218.     ( OTHERWISE )
  219.     CPI    20H
  220.     IF ( CARRY )    ; CONTROL CHARACTER
  221.     PUSH    PSW
  222.     MVI    E,'^'
  223.     CALL    MOUT    ; SEND UP ARROW
  224.     POP    PSW
  225.     ADI    40H    ; CHANGE TO NON CONTROL
  226.     MOV    E,A
  227.     FIN
  228.     CALL    MOUT    ; SEND CHARACTER
  229.     CALL    CTAB    ; TAKE CARE OF COUNTER FOR TAB EXPANSION
  230.     FIN
  231.     FIN
  232.     CALL    SREAD    ; READ NEXT CHARACTER FROM FILE
  233.     FIN
  234.     MVI    A,10
  235.     CALL    DELAY    ; DELAY FOR 1 SECOND
  236.     LXI    H,FTAB
  237.     CALL    DCLOSE    ; CLOSE FILE
  238.  
  239.     MVI    E,1AH
  240.     CALL    MOUT    ; SEND CONTROL Z
  241.     FIN
  242.     RET
  243. PROCEDURE ETAB
  244.     LDA    TAB
  245.     DCR    A
  246.     ANI    7
  247.     INR    A
  248.     MOV    D,A
  249.     MVI    E,' '
  250.     REPEAT
  251.     PUSH    D
  252.     CALL    MOUT    ; SEND SPACE
  253.     POP    D
  254.     DCR    D
  255.     UNTIL ( ZERO )
  256.     XRA    A
  257.     STA    TAB
  258.     RET
  259. PROCEDURE CTAB
  260.     LDA    TAB
  261.     DCR    A
  262.     ANI    7
  263.     STA    TAB
  264.     RET
  265. PROCEDURE SREAD
  266.     LDA    SABORT
  267.     ORA    A
  268.     IF ( ZERO )    ; NOT ABORT
  269.     LXI    H,FTAB
  270.     LXI    D,XDATA
  271.     CALL    BREAD    ; READ NEXT BYTE
  272.     ORA    A
  273.     IF ( ZERO )    ; NO ERROR OR EOF
  274.     LDA    XDATA
  275.     SUI    'Z'-40H    ; CONTROL Z
  276.     SUI    1
  277.     SBB    A
  278.     FIN
  279.     FIN
  280.     RET
  281. PROCEDURE MOUT
  282.     PUSH    D
  283.     REPEAT
  284.     CALL    KCHECK    ; CHECK KEYBOARD FOR ABORT OR LOCAL PAUSE
  285.     CALL    HCHECK    ; CHECK HOST FOR DATA OR PAUSE (X-OFF)
  286.     CALL    MOSTAT    ; CHECK MODEM OUT STATUS
  287.     UNTIL ( NOT ZERO )  ; SEND READY
  288.     POP    D
  289.     CALL    MO    ; SEND THE CHARACTER
  290.     RET
  291. PROCEDURE KCHECK
  292.     CALL    CISTAT    ; CHECK CONSOLE STATUS
  293.     IF ( NOT ZERO )  ; DATA READY
  294.     CALL    CI    ; GET KEYBOARD CHARACTER
  295.     SELECT
  296.     ( 1AH )
  297.     MVI    A,0FFH
  298.     STA    SABORT    ; SEND ABORT = TRUE
  299.     FIN
  300.     ( 'S'-40H )
  301.     REPEAT
  302.     CALL    HCHECK    ; CHECK FOR INCOMING DATA
  303.     CALL    CISTAT    ; CHECK CONSOLE STATUS
  304.     UNTIL ( NOT ZERO )  ; ANY KEY TO CONTINUE
  305.     CALL    CI    ; GET CHARACTER AND IGNORE
  306.     FIN
  307.     FIN
  308.     FIN
  309.     RET
  310. PROCEDURE HCHECK
  311.     CALL    MISTAT    ; CHECK RECEIVE STATUS
  312.     IF ( NOT ZERO )    ; DATA READY
  313.     CALL    MI    ; GET CHARACTER
  314.     CPI    'S'-40H    ; X-OFF
  315.     WHEN ( ZERO )
  316.     CALL    MI    ; WAIT FOR ANOTHER RECEIVE CHARACTER
  317.     CPI    'Q'-40H    ; X-ON
  318.     WHILE ( NOT ZERO )  ; NOT X-ON
  319.     MOV    E,A
  320.     CALL    CO    ; DISPLAY CHARACTER
  321.     CALL    MI    ; WAIT FOR NEXT CHARACTER
  322.     CPI    'Q'-40H    ; X-ON
  323.     FIN
  324.     FIN
  325.     ELSE
  326.     MOV    E,A
  327.     CALL    CO    ; DISPLAY CHARACTER
  328.     FIN
  329.     FIN
  330.     RET
  331. PROCEDURE ROPEN
  332.     LXI    B,WACCE
  333.     CALL    OPENF    ; OPEN FILE FOR WRITE
  334.     RNZ        ; RETURN IF ERROR
  335.  
  336.     MVI    A,0FFH
  337.     STA    RFOPEN    ; RECEIVE FILE OPEN = TRUE
  338.     STA    RLOG    ; RLOG = TRUE
  339.  
  340.     LXI    H,MSTART  ; START OF RECEIVE FILE BUFFER
  341.     SHLD    MPOINT    ; RECEIVE FILE BUFFER POINTER
  342.     RET
  343. PROCEDURE RCLOSE
  344.     LXI    H,MSTART
  345.     SHLD    POINT
  346.  
  347.     LDA    RFOPEN
  348.     ORA    A
  349.     RZ        ; RETURN IF RECEIVE FILE NOT OPEN
  350.  
  351.     LOOP
  352.     LHLD    MPOINT
  353.     XCHG        ; DE = MPOINT   end of received data storage
  354.     LHLD    POINT    ; HL = POINT    temp pointer for writing to disk
  355.     MOV    A,L
  356.     SUB    E
  357.     MOV    A,H
  358.     SBB    D
  359.     BREAK IF ( NO CARRY )  ; POINT >= MPOINT      done
  360.     MOV    A,M
  361.     STA    XDATA
  362.     INX    H
  363.     SHLD    POINT
  364.     LXI    H,FTAB
  365.     LXI    D,XDATA
  366.     CALL    BWRITE    ; WRITE NEXT BYTE TO DISK
  367.     ORA    A
  368.     BREAK IF ( NOT ZERO )  ; WRITE ERROR
  369.     FIN
  370.     LXI    H,FTAB
  371.     CALL    DCLOSE
  372.  
  373.     XRA    A
  374.     STA    RFOPEN    ; RECEIVE FILE OPEN = FALSE
  375.     STA    RLOG    ; RLOG = FALSE
  376.     RET
  377. ;
  378. ;
  379. END-OF-FILE
  380.