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 / BEEHIVE / COMMS / MODEM9.ARC / TERM.ASM < prev   
Assembly Source File  |  1991-02-02  |  14KB  |  814 lines

  1. ;
  2. ;        TERM.ASM
  3. ;
  4. ;Terminal routines with text file I/O for MODEM9.xx.
  5. ;
  6. DSKSAVE:
  7.     CALL    CKMODM
  8.     LDA    FCB+1    ;FIRST CHAR OF FILENAME
  9.     CPI    ' '    ;FILE SPEC'D
  10.     JNZ    GOODNM    ;YES, GOOD NAME
  11.     MVI    A,TRUE    ;0FFH
  12.     STA    NFILFLG
  13.     CMA        ;0
  14.     STA    SAVEFLG
  15.     JMP    TERM
  16. ;
  17. GOODNM:    CALL    ERASFIL
  18.     CALL    MOVE2
  19.     LXI    D,FCB3
  20.     MVI    C,MAKE
  21.     CALL    BDOS
  22.     LXI    D,FCB3
  23.     MVI    C,OPEN
  24.     CALL    BDOS
  25.     LXI    H,BOTTRAM
  26.     SHLD    HLSAVE
  27.     XRA    A
  28.     STA    NFILFLG
  29.     STA    LISTMOR        ;STOP ANY BUFFERED PRINTER OUTPUT
  30. TERM:    LDA    LISTMOR        ;ANY BUFFERED PRINTER OUTPUT?
  31.     ORA    A
  32.     CNZ    GOLIST        ;GO IF SO
  33.     CALL    STAT    ;KEYPRESS?
  34.     JZ    TERML    ;NO, CHECK LINE
  35.     CALL    KEYIN    ;GET CHAR FROM KBD
  36.     CPI    ' '
  37.     JNC    NOTOG    ;GO IF NOT CONTROL CHARACTER
  38.     MOV    B,A    ;SAVE
  39.     CPI    BKSP    ;TEST FOR BACKSPACE
  40.     JNZ    NOBKSP
  41.     LDA    CONVBKSP  ;CONVERT BACKSPACE TO RUB?
  42.     ORA    A
  43.     JZ    NOBKSP    ;GO IF NO CONVERSION
  44.     MVI    A,RUB
  45.     JMP    NOTOG
  46. NOBKSP:    LDA    EXACFLG
  47.     ORA    A    ;EXACT?
  48.     MVI    A,0
  49.     STA    EXACFLG        ;CLR FOR NEXT TIME
  50.     JZ    NOTEXAFLG    ;GO OF EXAFLG FALSE
  51.     LDA    LOCONEXTCHR
  52.     ORA    A    ;SHOULD WE SEND ON EXAFLG?
  53.     MOV    A,B
  54.     JZ    NOTOG    ;YES, IF LOCONEXTCHR FALSE
  55.     LDA    EXTCHR    ;WE WANT TO SEND EXTCHR IN ANY CASE
  56.     CMP    B
  57.     MOV    A,B
  58.     JZ    NOTOG    ;SEND IF EXTCHR
  59.     JMP    LOCCHK    ;OTHERWISE DO LOCAL STUFF
  60. NOTEXAFLG:
  61.     LDA    EXTCHR    ;TREAT NEXT CHARACTER IN SPECIAL WAY?
  62.     CMP    B
  63.     JZ    EXTFLG    ;YES, SET EXAFLG FOR NEXT CHAR
  64.     LDA    LOCONEXTCHR
  65.     ORA    A    ;SHOULD WE SEND IF NOT EXAFLG
  66.     MOV    A,B
  67.     JNZ    NOTOG    ;YES, IF LOCONEXTCHR TRUE
  68. LOCCHK:    LDA    EXITCHR    ;RETURN TO MENU?
  69.     CMP    B
  70.     JZ    EXITMEN    ;YES, RETURN TO MENU
  71.     LDA    TRANCHR    ;OUTPUT TEXT FILE TO REMOTE?
  72.     CMP    B
  73.     CZ    TRANSFER  ;SEND-A-FILE (BLIND SEND)
  74.     JZ    TERM      ;LOOP
  75.     LDA    TRANLOGON
  76.     ORA    A
  77.     JZ    SKPLOGON
  78.     LDA    LOGCHR    ;SEND LOGON?
  79.     CMP    B
  80.     JZ    SENDLOG
  81. SKPLOGON:
  82.     LDA    LSTTST
  83.     ORA    A
  84.     JZ    NOLST
  85.     LDA    LSTCHR
  86.     CMP    B
  87.     JNZ    NOLST
  88.     LDA    LISTFLG
  89.     CMA
  90.     STA    LISTFLG
  91.     CALL    CRLF
  92.     CALL    CRLF
  93.     CALL    LSTMSG
  94.     CALL    CRLF
  95.     JMP    TERML
  96. NOLST:    LDA    UNSAVECHR    ;CLOSE INPUT BUFFER?
  97.     CMP    B
  98.     JZ    S2A    ;IF YES, DISABLE COPY
  99.     LDA    SAVECHR    ;OPEN INPUT BUFFER?
  100.     CMP    B
  101.     MOV    A,B    ;RESTORE CHARACTER TYPED
  102.     JNZ    NOTOG
  103.     LDA    NFILFLG    ;DO NOT ALLOW SAVE IF..
  104.     CPI    TRUE    ;..THIS FLAG IS SET.
  105.     JZ    TERML
  106.     MVI    A,TRUE    ;0FFH -- ALLOW COPY INTO FILE
  107.     JMP    S2B
  108. S2A:    MVI    A,FALSE    ;0 -- STOP COPY INTO FILE
  109. S2B:    STA    SAVEFLG
  110.     CALL    BUFMSG
  111.     JMP    TERML
  112. ;
  113. BUFMSG:    CALL    ILPRT
  114.     DB    CR,LF,LF,'** Memory buffer ',0
  115.     LDA    SAVEFLG
  116.     ORA    A
  117.     JZ    BUFMSG2
  118.     CALL    ILPRT
  119.     DB    'open **',CR,LF,LF,':',BELL,0
  120.     RET
  121. ;
  122. BUFMSG2:
  123.     CALL    ILPRT
  124.     DB    'closed **',CR,LF,LF,BELL,0
  125.     RET
  126. ;
  127. EXITMEN:
  128.     CALL    CRLF
  129.     CALL    CLREOS    ;CLEAR TO END OF SCREEN TO CLEAN UP ANY MESS
  130.     JMP    MENU0
  131. ;
  132. SENDREADY:
  133.     CALL    IN$MODCTLP
  134.     CALL    ANI$MODSNDB
  135.     CALL    CPI$MODSNDR
  136.     RET
  137. ;
  138. SENDLF:    CALL    SENDREADY
  139.     JNZ    NOLFYET        ;GO IF NOT READY FOR OUTPUT YET
  140.     MVI    A,LF
  141.     JMP    NOTOG        ;SEND LF
  142. NOLFYET:
  143.     CALL    EXITTEST
  144.     JNC    EXITMEN        ;GO IF SO, SO DON'T GET HUNG UP
  145.     JMP    SENDLF        ;ELSE KEEP TRYING TO SEND LF
  146. ;
  147. SENDLOG:
  148.     PUSH    H
  149. SNDLG2:    CALL    STAT
  150.     JZ    SNDLG2
  151.     CALL    KEYIN
  152.     CALL    UCASE
  153.     CPI    'L'        ;TEST IF LIST OF STRINGS REQUESTED
  154.     JZ    GIVESTRS
  155.     SUI    '0'
  156.     CPI    10
  157.     JNC    ENDLOG
  158.     ADD    A        ;X2
  159.     ADD    A        ;X4
  160.     ADD    A        ;X8
  161.     ADD    A        ;X16
  162.     MOV    E,A
  163.     MVI    D,0
  164.     PUSH    D
  165.     POP    H
  166.     DAD    D        ;X32 IN HL
  167.     LXI    D,STRINGS    ;DE POINTS TO START OF STRINGS
  168.     DAD    D
  169. LOGLP:    CALL    SENDREADY
  170.     JNZ    NOSENDLOG    ;GO IF NOT READY
  171.     MOV    A,M        ;GET LOGON BYTE
  172.     INX    H
  173.     CPI    0        ;IS IT THE END?
  174.     JZ    ENDLOG        ;GO IF SO
  175.     CALL    OUT$MODDATP
  176.     JMP    LOGLP
  177. NOSENDLOG:
  178.     CALL    EXITTEST    ;TEST SO DON'T GET HUNG UP
  179.     JNC    EXITLOG        ;GO IF OPERATOR WANTS EXIT
  180.     JMP    LOGLP
  181. ;
  182. ENDLOG:    POP    H
  183.     JMP    TERML
  184. ;
  185. EXITLOG:
  186.     POP    H
  187.     JMP    EXITMEN
  188. ;
  189. EXITTEST:
  190.     CALL    STAT    ;KEYPRESS?
  191.     JZ    NOKEY
  192.     CALL    KEYIN    
  193.     MOV    B,A
  194.     LDA    EXITCHR    ;SEE IF OPERATOR WANTS EXIT
  195.     CMP    B
  196.     JNZ    NOKEY    ;GO IF WRONG KEY        
  197.     STC
  198.     CMC        ;RESET FOR EXIT
  199.     RET
  200. NOKEY:    STC        ;SET FOR NO KEY OR WRONG KEY
  201.     RET
  202. ;
  203. GIVESTRS:
  204.     CALL    ILPRT
  205.     DB    CR,LF,'    List of Strings',CR,LF,LF,LF,0
  206.     LXI    H,STRINGS
  207.     SHLD    STRSAVE
  208.     MVI    B,'0'
  209. GVSTRS1:
  210.     MOV    A,B
  211.     CALL    TYPE
  212.     CALL    ILPRT
  213.     DB    '  =  ',0
  214.     LHLD    STRSAVE
  215.     MOV    A,M
  216.     CPI    0
  217.     JNZ    NONULL
  218.     CALL    ILPRT
  219.     DB    '* null string *',0
  220.     JMP    GVSTRS2
  221. NONULL:    LHLD    STRSAVE
  222. NONUL2:    MOV    A,M
  223.     CPI    0
  224.     JZ    GVSTRS2
  225.     CPI    CR
  226.     CNZ    TYPE
  227.     JNZ    NOTACR
  228.     PUSH    H
  229.     CALL    ILPRT
  230.     DB    '<CR>',0
  231.     POP    H
  232. NOTACR:    INX    H
  233.     JMP    NONUL2
  234. ;
  235. GVSTRS2:
  236.     MVI    A,'9'
  237.     CMP    B
  238.     JZ    GVSTRS3
  239.     INR    B
  240.     LHLD    STRSAVE
  241.     LXI    D,32
  242.     DAD    D
  243.     SHLD    STRSAVE
  244.     CALL    CRLF
  245.     JMP    GVSTRS1
  246. ;
  247. GVSTRS3:
  248.     CALL    ILPRT
  249.     DB    CR,LF,LF,'Enter number to transmit string',CR,LF,0
  250.     POP    H
  251.     JMP    SENDLOG
  252. ;
  253. EXTFLG:    MVI    A,TRUE
  254.     STA    EXACFLG
  255.     JMP    TERML
  256. ;
  257. RCVREADY:
  258.     CALL    IN$MODCTLP
  259.     CALL    ANI$MODRCVB
  260.     CALL    CPI$MODRCVR
  261.     RET
  262. ;
  263. LSTMSG:    LDA    LISTFLG
  264.     ORA    A
  265.     JZ    LSTMSG2
  266.     CALL    ILPRT
  267.     DB    'Printer is on',CR,LF,0
  268.     RET
  269. LSTMSG2:
  270.     CALL    ILPRT
  271.     DB    'Printer is off',CR,LF,0
  272.     RET
  273. ;
  274. NOTOG:    CALL    OUT$MODDATP
  275.     MOV    B,A
  276.     LDA    LOCFLG
  277.     ORA    A
  278.     JNZ    LTYPE
  279.     LDA    ECHOFLG
  280.     ORA    A
  281.     JZ    CHKCR
  282. LTYPE:    MOV    A,B
  283.     CALL    TYPE
  284.     CALL    CHKSAVE        ;TO STORE LOCAL IF BUFFER OPEN
  285.     CALL    CHKPRNT
  286. CHKCR:    MVI    A,CR
  287.     CMP    B
  288.     JNZ    TERML
  289.     LDA    ADDLF
  290.     ORA    A
  291.     JZ    TERML
  292.     JMP    SENDLF
  293. ;
  294. TERML:    CALL    RCVREADY    ;TEST FOR RECEIVED CHARACTER
  295.     JNZ    TERM
  296.     CALL    IN$MODDATP
  297.     ANI    7FH    ;STRIP PARITY
  298.     JZ    TERM        
  299. GIVLF:    CALL    TYPE
  300.     MOV    B,A
  301.     CALL    CHKSAVE
  302.     CALL    CHKPRNT
  303.     LDA    ECHOFLG
  304.     ORA    A
  305.     JZ    NOECHO
  306.     MOV    A,B
  307.     CALL    OUT$MODDATP
  308. NOECHO:    MVI    A,CR
  309.     CMP    B
  310.     JNZ    TERM
  311.     LDA    ADDLF
  312.     JZ    TERM
  313.     LDA    ECHOFLG
  314.     ORA    A
  315.     JNZ    SENDLF
  316.     MVI    A,LF
  317.     JMP    GIVLF
  318. ;
  319. CHKSAVE:
  320.     LDA    SAVEFLG
  321.     ORA    A
  322.     RZ
  323.     MOV    M,B
  324.     INX    H
  325.     SHLD    HLSAVE    ;MENU COMMAND DESTROYS HL-REG..
  326.     MVI    A,LF
  327.     CMP    B
  328.     JNZ    NOCOLON    ;..TYPE ":" AFTER EACH LINE FEED..
  329.     MVI    A,':'    ;..WHEN MEMORY SAVE ACTIVE.
  330.     CALL    TYPE
  331. NOCOLON:
  332.     CALL    GETMAX
  333.     CMP    H
  334.     PUSH    B
  335.     CZ    INTDSKSV
  336.     POP    B
  337.     RET
  338. ;
  339. GETMAX:    LDA    SAVCCP
  340.     ORA    A
  341.     LDA    7
  342.     JZ    SUB1
  343.     SBI    8    ;..PAGE BELOW CCP ..
  344. SUB1:    DCR    A    ;..OR BDOS HAS BEEN..
  345.     RET        ;..REACHED AND DISKSAVE IS NEEDED.
  346. ;
  347. CHKPRNT:
  348.     LDA    LISTFLG    ;OUT TO PRINTER?
  349.     ORA    A
  350.     RZ        ;RETURN IF NOT
  351.     LDA    NFILFLG    ;IS BUFFER USED FOR FILE?
  352.     ORA    A
  353.     JZ    NOBUFF    ;DON'T BUFFER PRINTER IF SO, HOWEVER CHARACTERS
  354.             ;WILL BE LOST IF PRINTER IS SLOWER THAN MODEM
  355.     CALL    GETMAX    ;GET MAXIMUM FOR BUFFER
  356.     LHLD    HLSAVE1    
  357.     CMP    H    ;ARE WE THERE?
  358.     JNZ    NOTMAX    ;GO IF NOT
  359.     LXI    H,BOTTRAM    ;FLUSH BUFFER
  360.     SHLD    HLSAVE1
  361.     SHLD    HLSAVE2
  362. NOTMAX:    
  363.     MOV    M,B    ;SAVE CHARACTER IN BUFFER
  364.     INX    H    ;INCREMENT END OF BUFFER
  365.     SHLD    HLSAVE1
  366.     MVI    A,TRUE    ;SET FLAG FOR PRINTER OUTPUT
  367.     STA    LISTMOR
  368.     RET
  369. ;
  370. NOBUFF:
  371.     CALL    LSTSTAT    
  372.     RZ        ;RETURN IF PRINTER BUSY
  373.     MOV    C,B    ;ELSE PRINT CHARACTER
  374.     CALL    LISTER
  375.     RET
  376. ;
  377. GOLIST:
  378.     CALL    LSTSTAT
  379.     RZ        ;RETURN IF PRINTER BUSY
  380.     LHLD    HLSAVE2    ;GET LOCATION OF NEXT CHARACTER TO PRINT
  381.     MOV    C,M    ;GET CHARACTER
  382.     INX    H    ;INCREMENT POINTER
  383.     SHLD    HLSAVE2
  384.     CALL    CMPBUFF    ;CHECK FOR END OF BUFFER
  385.     CALL    LISTER    ;PRINT
  386.     RET
  387. ;
  388. ;ROUTINE CHECKS FOR END OF BUFFER, RESETS BUFFER IF SO AND STOPS
  389. ;PRINTER OUTPUT
  390. ;
  391. CMPBUFF:
  392.     LHLD    HLSAVE2
  393.     XCHG
  394.     LHLD    HLSAVE1
  395.     MOV    A,L
  396.     SUB    E
  397.     MOV    L,A
  398.     MOV    A,H
  399.     SBB    D
  400.     ORA    L
  401.     RNZ
  402.     LXI    H,BOTTRAM
  403.     SHLD    HLSAVE1
  404.     SHLD    HLSAVE2
  405.     XRA    A
  406.     STA    LISTMOR
  407.     RET
  408. ;
  409. INTDSKSV:
  410.     MVI    A,XOFF       ;SEND A CTRL-S TO STOP..
  411.     CALL    OUT$MODDATP  ;..REMOTE COMPUTER OUTPUT.
  412.     MVI    D,0          ;D IS THE BUFFER COUNT
  413.     CALL    INMODEM      ;GET LAST BYTES SENT..
  414.     STA    LASTBYT1     ;..AFTER CTRL-S.
  415.     CALL    INMODEM      ;ADD MORE CALLS TO INMODEM..
  416.     STA    LASTBYT2     ;..AND STA LASTBYT# IF YOU ARE..
  417.     PUSH    D
  418.     CALL    NUMREC1
  419.     CALL    WRTDSK       ;WRITE THE RECORDS
  420.     POP    D
  421.     LXI    H,BOTTRAM
  422.     INR    D
  423.     DCR    D            ;TEST BUFFER COUNT FOR ZERO
  424.     JZ    CTRLQ
  425.     LDA    LASTBYT1     ;GET THE LAST BYTES THAT WERE..
  426.     MOV    M,A          ;..SAVED AND PUT THEM IN..
  427.     INX    H            ;..BOTTRAM.
  428.     CALL    TYPE
  429.     DCR    D
  430.     JZ    CTRLQ
  431.     LDA    LASTBYT2
  432.     MOV    M,A
  433.     INX    H
  434.     CALL    TYPE
  435. CTRLQ:
  436.     MVI    A,XON        ;SEND START CHARACTER..
  437.     CALL    OUT$MODDATP  ;..TO REMOTE COMPUTER.
  438.     RET
  439. ;
  440. ;THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER
  441. ;OR 100 MILLISECONDS. IF A CHARACTER IS RECEIVED, A FLAG IS SET
  442. ;TO STORE THE CHARACTER. A MAXIMUM OF TWO CHARACTERS ARE STORED,
  443. ;BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN "INTDSKSV"
  444. ;ABOVE).
  445. ;
  446. INMODEM:
  447.     PUSH    H
  448.     LXI    H,625
  449.     CALL    FIXCNT
  450.     PUSH    H
  451.     POP    B
  452.     POP    H
  453. TIMERL:
  454.     CALL    RCVREADY
  455.     JZ    GETBYTE
  456.     DCX    B
  457.     MOV    A,B
  458.     ORA    C
  459.     JNZ    TIMERL
  460.     RET
  461. ;
  462. GETBYTE:
  463.     CALL    IN$MODDATP
  464.     INR    D
  465.     RET
  466. ;
  467. NUMRECS:
  468.     MVI    M,EOFCHAR
  469.     INX    H
  470.     LXI    D,127
  471.     DAD    D
  472. NUMREC1:
  473.     LXI    D,-(BOTTRAM)
  474.     DAD    D
  475.     MOV    A,L    ;DIVIDE HL BY 128..
  476.     ORA    A
  477.     RAL        ;..TO GET THE..
  478.     MOV    L,H    ;..NUMBER OF SECTORS
  479.     MVI    H,0
  480.     PUSH    PSW
  481.     DAD    H
  482.     POP    PSW
  483.     MVI    A,0
  484.     ADC    L
  485.     MOV    L,A    ;RETURNS WITH NUMBER OF..
  486.     RET        ;..128 BYTE RECORDS IN HL.
  487. ;
  488. WRTDSK:    LXI    D,BOTTRAM
  489. NEXTWRT:
  490.     MVI    C,STDMA
  491.     CALL    BDOSRT
  492.     PUSH    D
  493.     LXI    D,FCB3
  494.     MVI    C,WRITE
  495.     CALL    BDOSRT
  496.     POP    D
  497.     XCHG
  498.     PUSH    D
  499.     LXI    D,128
  500.     DAD    D
  501.     POP    D
  502.     XCHG
  503.     DCX    H
  504.     MOV    A,H
  505.     ORA    L
  506.     JNZ    NEXTWRT
  507.     RET
  508. ;
  509. CLOSE3:    LXI    D,FCB3
  510.     MVI    C,CLOSE
  511.     CALL    BDOS
  512.     RET
  513. ;
  514. BDOSRT:
  515.     PUSH    B
  516.     PUSH    D
  517.     PUSH    H
  518.     PUSH    PSW
  519.     CALL    BDOS
  520.     POP    PSW
  521.     POP    H
  522.     POP    D
  523.     POP    B
  524.     RET
  525. ;
  526. MOVE2:
  527.     LXI    H,FCB3
  528.     CALL    INITFCBS
  529.     LXI    H,FCB
  530.     LXI    D,FCB3
  531.     MVI    B,12
  532.     CALL    MOVE
  533.     RET
  534. ;
  535. ;FILE TRANSFER ROUTINE - CALLED WITH 
  536. ;CONTROL-T FROM TERMINAL ROUTINE.
  537. ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X.
  538. ;
  539. TRANSFER:
  540.     PUSH    H
  541.     PUSH    D
  542.     PUSH    B
  543.     PUSH    PSW
  544.     LXI    H,FCB4
  545.     CALL    INITFCBS ;INITIALIZES FCBS POINTED..
  546.     LXI    H,FCB+16 ;..TO BY HL REG.
  547.     CALL    INITFCBS
  548. GET:
  549.     CALL    GETNAME
  550.     LDA    CMDBUF+2 ;WAS FILE ENTERED
  551.     CPI    20H
  552.     JZ    TRANSL2
  553.     CALL    MOVE4
  554.     CALL    OPEN4
  555.     CPI    0FFH    ;RETURN WITH 0FFH MEANS
  556.     JNZ    CONTIN    ;FILE DOES NOT EXIST
  557. TRANSL1:
  558.     CALL    ILPRT
  559.     DB    CR,LF,'++ File does not exist ++',CR,LF,0
  560. TRANSL2:
  561.     CALL    ILPRT
  562.     DB    'Type "R" to return to modem',CR,LF
  563.     DB    'Type "A" to re-enter name: ',BELL,0
  564.     CALL    KEYIN
  565.     CALL    UCASE
  566.     CALL    TYPE    ;ECHO RESPONSE
  567.     CALL    CRLF
  568.     CPI    'A'
  569.     JZ    GET
  570.     CPI    'R'
  571.     JZ    RETURN
  572.     JMP    TRANSL2
  573. ;
  574. CONTIN:
  575.     LXI    D,80H
  576.     MVI    C,STDMA
  577.     CALL    BDOS
  578. READMR:
  579.     CALL    READ80
  580.     CPI    1    ;END OF FILE
  581.     JZ    RETURNS
  582.     CPI    2    ;BAD READ
  583.     JZ    RETURNU
  584.     CALL    SEND80C
  585.     CPI    EOFCHAR    ;END OF FILE - OMIT IF OBJECT..
  586.     JZ    RETURNS    ;..CODE IS TO BE SENT.
  587.     CPI    CAN    ;CANCELLATION?
  588.     JZ    TRANCAN
  589.     JMP    READMR
  590. ;
  591. RETURNS:
  592.     CALL    ILPRT
  593.     DB    CR,LF,'File transfer completed',CR,LF,BELL,0
  594.     JMP    RETURN
  595. ;
  596. RETURNU:
  597.     CALL    ILPRT
  598.     DB    CR,LF,'++ File transfer unsuccessful ++',CR,LF,BELL,0
  599.     JMP    RETURN
  600. ;
  601. TRANCAN:
  602.     CALL    ILPRT
  603.     DB    CR,LF,LF,'++ Transfer cancelled ++',CR,LF,BELL,0
  604. RETURN:
  605.     POP    PSW
  606.     POP    B
  607.     POP    D
  608.     POP    H
  609.     RET
  610. ;
  611. INITFCBS:        ;ENTRY AT +2 WILL LEAVE..
  612.     MVI    M,0    ;..DRIVE NO. INTACT.
  613.     INX    H    ;WILL INITIALIZE AN FCB..
  614.     MVI    B,11    ;..POINTED TO BY HL-REG. FILLS 1ST POS
  615. LOOP10:
  616.     MVI    M,' '    ;..WITH 0, NEXT 11 WITH..
  617.     INX    H    ;..WITH BLANKS, AND LAST..
  618.     DCR    B    ;..21 WITH NULLS.
  619.     JNZ    LOOP10
  620.     MVI    B,21
  621. LOOP11:
  622.     MVI    M,0
  623.     INX    H
  624.     DCR    B
  625.     JNZ    LOOP11
  626.     RET
  627. ;
  628. GETNAME:
  629.     CALL    ILPRT
  630.     DB    CR,LF,'Enter file name to be transferred -  <CR> TO QUIT: ',0
  631.     LXI    D,CMDBUF
  632.     CALL    INBUFF
  633.     CALL    CRLF
  634.     RET
  635. ;
  636. MOVE4:
  637.     LXI    D,CMDBUF
  638.     LXI    H,FCB4
  639.     CALL    CPMLINE
  640.     RET
  641. ;
  642. OPEN4:
  643.     LXI    D,FCB4
  644.     MVI    C,OPEN
  645.     CALL    BDOS
  646.     RET
  647. ;
  648. READ80:
  649.     LXI    D,FCB4
  650.     MVI    C,READ
  651.     CALL    BDOS
  652.     RET
  653. ;
  654. SEND80C:
  655.     MVI    B,80H
  656.     LXI    H,80H
  657. SENDCH1:
  658.     PUSH    D
  659.     CALL    SPEED
  660.     POP    D
  661.     MOV    A,M
  662.     CPI    EOFCHAR
  663.     JNZ    SENDCH2
  664.     LDA    EOFSEND
  665.     ORA    A
  666.     RZ
  667.     MOV    A,M
  668. SENDCH2:
  669.     CALL    MODOUT
  670.     CPI    EOFCHAR
  671.     RZ
  672.     CALL    STAT    ;TEST TO SEE IF
  673.     ORA    A    ;CANCELLATION REQUESTED
  674.     JZ    SKIP12
  675.     CALL    KEYIN
  676.     CPI    CAN
  677.     RZ
  678. SKIP12:    INX    H
  679.     DCR    B
  680.     JNZ    SENDCH1
  681.     RET
  682. ;
  683. MODOUT:    PUSH    PSW
  684. MODOUTL:
  685.     LDA    XOFFTST
  686.     ORA    A
  687.     CNZ    TXOFF
  688.     CALL    SENDREADY
  689.     JNZ    MODOUTL
  690.     LDA    STRLF
  691.     ORA    A
  692.     JZ    NOLFTST
  693.     POP    PSW
  694.     PUSH    PSW
  695.     CPI    LF
  696.     JZ    NOTMOUT
  697. NOLFTST:
  698.     POP    PSW
  699.     PUSH    PSW
  700.     STA    SAVEOUT        ;SAVE OUTPUT FOR POSSIBLE ECHO TEST
  701.     CALL    OUT$MODDATP
  702.     LDA    ECHWAIT        ;DO WE WANT TO TEST FOR ECHOED CHARACTER?
  703.     ORA    A
  704.     CNZ    WAITECHO    ;GO IF SO
  705. NOTMOUT:
  706.     POP    PSW
  707.     CALL    TYPE
  708.     CPI    CR
  709.     JZ    DLYCR
  710.     RET
  711. ;
  712. DLYCR:    LDA    XONWAIT    ;WAIT FOR XON AFTER CR?
  713.     ORA    A
  714.     JNZ    WAITXON
  715.     LDA    CRDLY    ;EXTRA DELAY AFTER CR
  716.     JMP    DLYCR2
  717. ;
  718. SPEED:    LDA    BYTDLY    ;GET SPEED VALUE (0-9)
  719.             ;DELAY IS FROM 0.02 SEC FOR SPDVAL = 1
  720.             ;TO 0.18 SEC FOR SPDVAL    = 9
  721. DLYCR2:    ORA    A
  722.     RZ        ;RETURN IF 0
  723.     MOV    C,A
  724. SPDLP:    CALL    SPD1    ;OUTER LOOP
  725.     DCR    C
  726.     RZ
  727.     JMP    SPDLP
  728. ;
  729. SPD1:    PUSH    H
  730.     LXI    H,357    ;ABOUT 0.02 SEC
  731.     LDA    XOFFTST
  732.     ORA    A
  733.     JZ    SPD2
  734.     LXI    H,102    ;ADJUST FOR XOFF TESTING
  735.     LDA    ECHOFLG
  736.     ORA    A
  737.     JZ    SPD2
  738.     LDA    LOCFLG
  739.     ORA    A
  740.     JZ    SPD2
  741.     LXI    H,76    ;ADJUST AGAIN FOR REMOTE ECHO
  742. SPD2:    CALL    FIXCNT
  743.     PUSH    H
  744.     POP    D
  745.     POP    H
  746. SPDLP1:    DCX    D    ;INNER LOOP
  747.     LDA    XOFFTST
  748.     ORA    A
  749.     CNZ    TXOFF
  750.     MOV    A,E
  751.     ORA    D
  752.     RZ
  753.     JMP    SPDLP1
  754. ;
  755. TXOFF:    CALL    RCVREADY
  756.     RNZ
  757.     CALL    IN$MODDATP
  758.     ANI    7FH
  759.     CPI    XOFF
  760.     CZ    WAITXON
  761.     RET
  762. ;
  763. WAITXON:
  764.     CALL    RCVREADY
  765.     JNZ    WTXON2
  766.     CALL    IN$MODDATP
  767.     ANI    7FH
  768.     CPI    XON
  769.     RZ
  770. WTXON2:    CALL    STAT    ;TEST TO SEE IF
  771.     ORA    A    ;CANCELLATION REQUESTED
  772.     JZ    WAITXON ;SO DON'T GET HUNG UP
  773.     CALL    KEYIN
  774.     CPI    CAN
  775.     RZ
  776.     JMP    WAITXON
  777. ;
  778. WAITECHO:
  779.     MVI    A,50        ;1 SECOND MAXIMUM DELAY WAITING FOR ECHO
  780.     STA    MECHDLY
  781. WTECH1:    CALL    RCVREADY    ;IS THERE INPUT?
  782.     JNZ    WTECH2        ;GO IF NOT
  783.     CALL    IN$MODDATP    ;GET INPUT
  784.     ANI    7FH
  785.     MOV    C,A        ;SAVE INPUT
  786.     LDA    SAVEOUT        ;GET OUTPUT
  787.     CMP    C        ;ARE THEY THE SAME?
  788.     RZ            ;RETURN IF SO
  789.     LDA    SAVEOUT        ;GET OUTPUT
  790.     CPI    TAB        ;CHECK IF TAB
  791.     JNZ    WTECH2        ;GO IF NOT
  792.     MVI    A,SPACE        ;MAYBE REMOTE CONVERTS TABS TO SPACES
  793.     CMP    C        
  794.     RZ            ;RETURN IF SPACE ECHOED ON TAB OUTPUT
  795. WTECH2:    LDA    MECHDLY        ;LOOP FOR 1 SECOND
  796.     DCR    A
  797.     STA    MECHDLY
  798.     RZ
  799.     MVI    A,1        ;0.02 SECOND
  800.     CALL    DLYCR2
  801.     JMP    WTECH1
  802. ;    
  803. ; Check for any garbage characters on line.
  804. ;
  805. CKMODM:    CALL    RCVREADY    ;ANY CHARACTERS READY TO RECEIVE?
  806.     RNZ            ;IF NOT, RETURN
  807.     CALL    IN$MODDATP    ;OTHERWISE GET THE CHARACTER AND IGNORE
  808.     JMP    CKMODM        ;CHECK FOR ANY ADDITIONAL CHARACTERS
  809. ;
  810. ;
  811.     LINK    SENDRECV
  812. ;
  813. NI    7FH
  814.     CPI    XON