home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol175 / term.a86 < prev    next >
Encoding:
Text File  |  1984-07-15  |  14.3 KB  |  941 lines

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