home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol136 / datmodh.aqm / DATMODH.ASM
Encoding:
Assembly Source File  |  1985-02-10  |  41.5 KB  |  2,570 lines

  1. ;MODEMH is a version of MODEM7A, incorporating a facility to
  2. ;hand over control to a remote computer
  3.  
  4. ;For details of the added facility see the file HMODEM.DOC
  5.  
  6. ;This configuration is for a Datamax, using a Z80 SIO.    If
  7. ;reconfiguring, note that the added section at the end is
  8. ;written to be independent of the main program
  9.  
  10. ;No baud initialisation - boot with a CPM preconfigured with SETUP.
  11.  
  12. ;MODEM7A IS AN EXTENSIVE REVISION OF THE CP/M MODEM PROGRAM
  13. ;CREATED BY WARD CHRISTENSEN FOR THE CP/M USERS LIBRARY.
  14.  
  15. ;THE ADDITIONAL ROUTINES ARE COPYRIGHTED (1980) BY:
  16.  
  17. ;Mark M. Zeiger        and    James K. Mills
  18. ;198-01B 67th Ave.        824 Jordan Place
  19. ;Flushing, N.Y. 11365        Rockford, IL  61108
  20. ;(212) 454-6985            (815) 398-0579
  21.  
  22. ;Permission is granted to use, but not to sell, these routines.
  23.  
  24. ;LAST REVISION 31/Jan/82    Set up for Interfacer 
  25. ;LAST REVISION 12/18/80        Changed disconnect timing
  26.  
  27. ;This MODEMH augmentation is by Charles Hamblin, 6 Jan 1983
  28.  
  29.     MACLIB MODEM7    ;CONTAINS CMDLINE, INBUF, INLNCOMP,
  30.             ;DIR, AND MFACCESS ROUTINES
  31.             ;changed to MODEM.LIB by Jim Mills
  32.             ;to differentiate from other 'MACROS.LIB'
  33.  
  34. TRUE    EQU    0FFH
  35. FALSE    EQU    0
  36.  
  37. PORT    EQU    6    ;Datamax aux. MODEM PORT BASE
  38.  
  39. MODCTLP EQU    PORT+1        ;MODEM STATUS PORT
  40. MODSNDB EQU    1        ;MODEM SEND BIT (XMIT BUFF EMPTY)
  41. MODSNDR EQU    1        ;MODEM SEND READY
  42. MODRCVB EQU    2        ;MODEM RECEIVE BIT (DAV)
  43. MODRCVR EQU    2        ;MODEM RECEIVE READY
  44. MODDATP EQU    PORT        ;MODEM DATA PORT
  45. BAUDRP    EQU    0ah        ;BAUD RATE PORT        ---?
  46. MODCTL2 EQU    0bh        ;2ND MODEM CONTROL PORT ---?
  47. ORIGMOD EQU    1DH        ;ORIGINATE MODE
  48. ANSWMOD EQU    1EH        ;ANSWER MODE
  49.  
  50. ERRLIM    EQU    10        ;NUMBER OF TIMES TO RETRY
  51.                 ;SEND/RECEIVE ERRORS BEFORE QUIT
  52. EXITCHR EQU    'E'-40H        ; ^E = EXIT WITHOUT DISCONNECT
  53. DISCCHR EQU    'D'-40H        ; ^D = DISCONNECT
  54. TRANCHR EQU    'T'-40H        ; ^T = TRANSFER CHARACTER
  55. CAN    EQU    'X'-40H        ; ^X = CANCEL SEND/RECEIVE
  56. EOFCHAR EQU    'Z'-40H        ; ^Z = END OF FILE
  57. SAVECHR EQU    'Y'-40H        ; ^Y = SAVE CHARACTER
  58. XOFF    EQU    'S'-40H        ; ^S = XOFF CHARACTER
  59. XON    EQU    'Q'-40H        ; ^Q = XON CHARACTER
  60. SOH    EQU    1        ; START OF HEADER
  61. EOT    EQU    4        ; END OF TEXT
  62. ACK    EQU    6        ; ACKNOWLEDGE
  63. NAK    EQU    15H        ; NOT ACKNOWLEDGE
  64. BDNMCH    EQU    75H        ; BAD NAME MATCH
  65. OKNMCH    EQU    ACK        ; OKAY NAME MATCH
  66. LF    EQU    10        ; LINEFEED
  67. CR    EQU    13        ; CARRIAGE RETURN
  68. BELL    EQU    7        ; BELL CHARACTER
  69. FRONTPAN EQU    0FFH        ; IMSAI FRONT PANEL
  70.  
  71. ;Added equates for handover routines
  72. ;For defines, see end of listing
  73.  
  74. haven equ 0c400h ;adjust to suit
  75. eschar equ 1bh
  76. mdatp equ moddatp
  77. mstatp equ modctlp
  78. base equ 0
  79.  
  80.  
  81. ;THESE ROUTINES ARE AT THE BEGINNING OF THE PROGRAM SO
  82. ;THEY CAN BE PATCHED BY A MONITER WITHOUT RE-ASSEMBLING
  83. ;THE PROGRAM.
  84.  
  85. nulno: db 4 ;no of nulls for delay between sectors during file transfer
  86.  
  87.  ;If the remote computer needs nulls after a linefeed, also set
  88.  ;LFNULLS at the end of the listing
  89.  
  90. IMSAIBYTE    DB    FALSE        ;true=imsai front panel
  91. FASTCLK        DB    TRUE        ;4 MHz or greater
  92. BAKUPBYTE    DB    TRUE        ;true=make .BAK file
  93. XPRFLG        DB    FALSE        ;true=no menu, false=print menu
  94. OUT$MODDATP    OUT    MODDATP ! RET    ;out modem data port
  95. IN$MODDATP    IN    MODDATP ! RET    ;in modem data port
  96. JMP$INITMOD    JMP    INITMOD        ;to initialize port, if necessary
  97. IN$BAUDRP    IN    BAUDRP    ! RET    ;in baudrate port
  98. OUT$BAUDRP    OUT    BAUDRP    ! RET    ;out baudrate port
  99. OUT$MODCTL2    OUT    MODCTL2 ! RET    ;out modem control port #2
  100. ;
  101. recsta: call timwst
  102.  xra a ;sr get modem receive status
  103.  out modctlp
  104.  in modctlp
  105.  ani 1
  106.  cpi 1
  107.  ret
  108.  
  109. trasta: call timwst
  110.  mvi a,10h ;sr get modem transmit status
  111.  out modctlp
  112.  in modctlp
  113.  ani 0ch
  114.  cpi 0ch
  115.  ret
  116.  
  117. timwst: jmp timwst+3
  118.  ret
  119.  
  120. START:
  121.     LXI    H,0
  122.     DAD    SP        ;GET CP/M'S STACK
  123.     SHLD    STACK        ;SAVE IT
  124.     LXI    SP,STACK    ;START LOCAL STACK
  125.     CALL    START1
  126.     DB    CR,LF,'MODEMH as of 6 Jan 83',cr,lf
  127.  DB 'Adapted by Charles Hamblin from the MODEM7 of Ward',cr,lf
  128.  db 'Christensen, Mark M. Zeiger, Jim Mills, Bill Bolton',cr,lf,'$'
  129. ;
  130. bottram dw 0        ;will calculate
  131. ;
  132. START1:
  133.     POP    D        ;GET ADDRESS OF ABOVE MESSAGE
  134.     MVI    C,PRINT        ; 9
  135.     CALL    BDOS
  136.     lxi    h,last+100h
  137.     mvi    l,0
  138.     shld    bottram        ;calc rplaces orig def
  139.     CALL    INITADR        ;INITIALIZE ADDRESSES
  140.     MVI    A,TRUE        ; 0FFH
  141.     STA    NFILFLG
  142.     CMA            ; 0
  143.     STA    SAVEFLG
  144.     CALL    PROCOPT        ;PROCESS CONTROL OPTIONS
  145.     LDA    OPTION        ;GET MAIN OPTION
  146.     CPI    'X'        ;EXPERT FLAG?
  147.     JNZ    RESTART        ;NO
  148.     MVI    A,TRUE        ;YES
  149.     STA    XPRFLG        ;MAKE EXPERT
  150.     JMP    MENU
  151. ;
  152. RESTART:
  153.     LDA    OPTION        ;GET MAIN    OPTION
  154. S1:
  155.     CPI    ' '        ;NO OPTION SPEC'D?
  156.     JZ    MENU        ;TRUE, GO MENU
  157.     CPI    'M'        ;MENU ASKED FOR?
  158.     JZ    MENU        ;YES, GO MENU
  159.     CALL    JMP$INITMOD
  160.     CALL    MOVEFCB
  161.     MVI    A,FALSE
  162.     STA    NFILFLG
  163.     CALL    IN$MODDATP    ;GOBBLE UP GARBAGE..
  164.     CALL    IN$MODDATP    ;..CHARACTERS ON LINE
  165.     LDA    OPTION        ;PROCESS MAIN    OPTION
  166.     CPI    'E'        ;ECHO MODE?
  167.     JZ    hechek    ;YES    (will disallow when handover)
  168.     CPI    'T'        ;TERMINAL MODE?
  169.     JZ    DSKSAVE        ;YES
  170.     CPI    'S'        ;SEND A FILE?
  171.     JZ    SENDFIL        ;YES
  172.     CPI    'R'        ;RECEIVE A FILE?
  173.     JZ    RCVFIL        ;YES
  174.     CPI    'D'        ;DISCONNECT?
  175.     JZ    DISCON1        ;YES, DISCONNECT & GO MENU
  176.  cpi 'H'
  177.  jz rgiv        ;handover option
  178.     JMP    MENU        ;NO OPTION SPEC'D, GO MENU
  179. ;
  180. ;REVISED TERMINAL ROUTINE ALLOWING MEMORY SAVE
  181. ;
  182. DSKSAVE:
  183.     LDA    NFILFLG        ;NEW FILE FLAG
  184.     CPI    TRUE        ;OFFH? (TRUE=NORMAL TERMINAL MODE)
  185.     JZ    TERM        ;YES
  186.     LDA    FCB+1        ;FIRST CHAR OF FILENAME
  187.     CPI    ' '        ;FILE SPEC'D
  188.     JNZ    GOODNM        ;YES, GOOD NAME
  189.     MVI    A,TRUE        ;0FFH
  190.     STA    NFILFLG
  191.     CMA            ; 0
  192.     STA    SAVEFLG
  193.     JMP    TERM
  194.  
  195. GOODNM:
  196.     CALL    ERASFIL
  197.     CALL    MOVE2
  198.     LXI    D,FCB3
  199.     MVI    C,MAKE
  200.     CALL    BDOS
  201.     LXI    D,FCB3
  202.     MVI    C,OPEN
  203.     CALL    BDOS
  204.     lhld    BOTTRAM
  205.     SHLD    HLSAVE
  206.     MVI    A,FALSE
  207.     STA    NFILFLG
  208. TERM:
  209.     CALL    STAT        ;KEYPRESS?
  210.     JZ    TERM2        ;NO, CHECK LINE
  211.     CALL    KEYIN        ;GET CHAR FROM KBD
  212.     CPI    EXITCHR        ;^E?
  213.     JZ    MENU        ;YES, RETURN TO MENU
  214.     CPI    DISCCHR        ;^D?
  215.     JZ    DISCON1        ;YES, DISCONNECT & RETURN TO MENU
  216.     CPI    TRANCHR        ;TEST FOR TRANSFER REQUEST (^T)
  217.     CZ    TRANSFER    ;SEND-A-FILE (BLIND SEND)
  218.     JZ    TERM        ;LOOP
  219.     CPI    SAVECHR
  220.     JNZ    NOTOG
  221.     LDA    NFILFLG        ;DO NOT ALLOW SAVE IF..
  222.     CPI    TRUE        ;..THIS FLAG IS SET.
  223.     JZ    TERM2
  224.     LDA    SAVEFLG
  225.     CMA
  226.     STA    SAVEFLG
  227. term2: call qhando
  228.  jz term
  229.     JMP    TERML
  230. ;
  231. NOTOG:
  232.  call qhando ;gives z if handed over
  233.  jz terml2
  234.     CALL    OUT$MODDATP
  235. TERML:
  236.     CALL    recsta
  237.     JNZ    TERM
  238.     CALL    IN$MODDATP
  239.     CPI    0        ;CHECK FOR NULLS
  240.     JZ    TERM        ;DON'T PROCESS THEM
  241.     ANI    7FH        ;STRIP PARITY
  242. terml2: CALL    TYPE
  243.     PUSH    PSW
  244.     LDA    SAVEFLG
  245.     CPI    FALSE
  246.     JZ    NOSAVE
  247.     POP    PSW
  248.     MOV    M,A
  249.     INX    H
  250.     SHLD    HLSAVE        ;MENU COMMAND DESTROYS HL-REG..
  251.                 ;..GET HL WHEN ENTERING VIA 'RET' CMD.
  252.     MOV    B,A
  253.     LDA    IMSAIBYTE
  254.     ORA    A
  255.     MOV    A,B
  256.     JZ    COLON
  257.     CMA            ;FRONT PANEL SHOWS CHARS WHEN..(deleted)
  258.     JMP    NOCOLON
  259. ;
  260. COLON:
  261.     CPI    LF        ;IF NO FRONT PANEL, THEN..
  262.     JNZ    NOCOLON        ;..TYPE ":" AFTER EACH LINE FEED..
  263.     MVI    A,':'        ;..WHEN MEMORY SAVE ACTIVE.
  264.     CALL    TYPE
  265. NOCOLON:
  266.     LDA    7        ;CHECK TO SEE IF..
  267.     DCR    A        ;..PAGE BELOW BDOS HAS BEEN..
  268.     CMP    H        ;..REACHED AND DISKSAVE IS NEEDED.
  269.     CZ    INTDSKSV
  270.     JMP    TERM
  271. ;
  272. NOSAVE:
  273.     POP    PSW
  274.     JMP    TERM
  275.  
  276. SAVEFLG     DB    FALSE
  277. LASTBYT1 DB    0
  278. LASTBYT2 DB    0
  279.  
  280. INTDSKSV:
  281.     MVI    A,XOFF        ;SEND A CTRL-S TO STOP..
  282.     CALL    OUT$MODDATP    ;..REMOTE COMPUTER OUTPUT.
  283.     MVI    D,0        ;D IS THE BUFFER COUNT
  284.     CALL    INMODEM        ;GET LAST BYTES SENT..
  285.     STA    LASTBYT1    ;..AFTER CTRL-S.
  286.     CALL    INMODEM        ;ADD MORE CALLS TO INMODEM..
  287.     STA    LASTBYT2    ;..AND STA    LASTBYT# IF YOU ARE..
  288.                 ;..LOSING BYTES WHEN MEMORY IS FULL.
  289.     PUSH    D
  290.     CALL    NUMREC1
  291.     CALL    WRTDSK        ;WRITE THE RECORDS
  292.     POP    D
  293.     lhld    BOTTRAM
  294.     INR    D
  295.     DCR    D        ;TEST BUFFER COUNT FOR ZERO
  296.     JZ    CTRLQ
  297.     LDA    LASTBYT1    ;GET THE LAST BYTES THAT WERE..
  298.     MOV    M,A        ;..SAVED AND PUT THEM IN..
  299.     INX    H        ;..BOTTRAM.
  300.     CALL    TYPE
  301.     DCR    D
  302.     JZ    CTRLQ
  303.     LDA    LASTBYT2
  304.     MOV    M,A
  305.     INX    H
  306.     CALL    TYPE
  307. CTRLQ:
  308.     MVI    A,XON        ;SEND START CHARACTER..
  309.     CALL    OUT$MODDATP    ;..TO REMOTE COMPUTER.
  310.     RET
  311. ;
  312. ;THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER
  313. ;OR 100 MILLISECONDS. IF A CHARACTER IS RECEIVED, A FLAG IS SET
  314. ;TO STORE THE CHARACTER. A MAXIMUM OF TWO CHARACTERS ARE STORED,
  315. ;BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN    "INTDSKSV"
  316. ;ABOVE).
  317.  
  318. INMODEM:
  319.     LDA    FASTCLK
  320.     ORA    A
  321.     JZ    SLOW
  322.     LXI    B,2500
  323.     JMP    TIMERL
  324. SLOW:
  325.     LXI    B,1250
  326. TIMERL:
  327.     CALL    recsta
  328.     JZ    GETBYTE
  329.     DCX    B
  330.     MOV    A,B
  331.     ORA    C
  332.     JNZ    TIMERL
  333.     RET
  334. ;
  335. GETBYTE:
  336.     CALL    IN$MODDATP
  337.     INR    D
  338.     RET
  339. ;
  340. NUMRECS:
  341.     MVI    M,EOFCHAR
  342.     INX    H
  343.     LXI    D,127
  344.     DAD D
  345. NUMREC1:
  346.     xchg
  347.     lhld    bottram
  348.     mov    a,l
  349.     cma
  350.     mov    l,a
  351.     mov    a,h
  352.     cma
  353.     mov    h,a
  354.     inx    h
  355.     xchg
  356.     DAD D
  357.     MOV    A,L        ;DIVIDE HL BY 128..
  358.     ORA    A
  359.     RAL            ;..TO GET THE..
  360.     MOV    L,H        ;..NUMBER OF SECTORS
  361.     MVI    H,0
  362.     PUSH    PSW
  363.     DAD H
  364.     POP    PSW
  365.     MVI    A,0
  366.     ADC L
  367.     MOV    L,A        ;RETURNS WITH NUMBER OF..
  368.     RET            ;..128 BYTE RECORDS IN    HL.
  369. ;
  370. WRTDSK:
  371.     xchg
  372.     lhld    bottram
  373.     xchg
  374. NEXTWRT:
  375.     MVI    C,STDMA
  376.     CALL    BDOSRT
  377.     PUSH    D
  378.     LXI    D,FCB3
  379.     MVI    C,WRITE
  380.     CALL    BDOSRT
  381.     POP    D
  382.     XCHG
  383.     PUSH    D
  384.     LXI    D,128
  385.     DAD D
  386.     POP    D
  387.     XCHG
  388.     DCX    H
  389.     MOV    A,H
  390.     ORA    L
  391.     JNZ    NEXTWRT
  392.     RET
  393. ;
  394. CLOSE3:
  395.     LXI    D,FCB3
  396.     MVI    C,CLOSE
  397.     CALL    BDOS
  398.     RET
  399. ;
  400. BDOSRT    PUSH    B
  401.     PUSH    D
  402.     PUSH    H
  403.     PUSH    PSW
  404.     CALL    BDOS
  405.     POP    PSW
  406.     POP    H
  407.     POP    D
  408.     POP    B
  409.     RET
  410. ;
  411. MOVE2:
  412.     LXI    H,FCB3
  413.     CALL    INITFCBS
  414.     LXI    H,FCB
  415.     LXI    D,FCB3
  416.     MVI    B,12
  417.     CALL    MOVE
  418.     RET
  419. ;
  420. ;FILE TRANSFER ROUTINE - CALLED WITH 
  421. ;CONTROL-T FROM TERMINAL ROUTINE.
  422. ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X.
  423.  
  424. TRANSFER
  425.     PUSH    H
  426.     PUSH    D
  427.     PUSH    B
  428.     PUSH    PSW
  429.     LXI    H,FCB4
  430.     CALL    INITFCBS    ;INITIALIZES FCBS POINTED..
  431.     LXI    H,FCB+16    ;..TO BY HL REG.
  432.     CALL    INITFCBS
  433. GET:
  434.     CALL    GETNAME
  435.     LDA    CMDBUF+2    ;WAS FILE ENTERED
  436.     CPI    20H
  437.     JZ    TRANSL2
  438.     CALL    MOVE4
  439.     CALL    OPEN4
  440.     CPI    0FFH        ;RETURN WITH 0FFH MEANS
  441.     JNZ    CONTIN        ;FILE DOES NOT EXIST
  442. TRANSL1:
  443.     CALL    ILPRT
  444.     DB    CR,LF,'++FILE DOES NOT EXIST++',CR,LF,0
  445. ;
  446. TRANSL2:
  447.     CALL    ILPRT
  448.     DB    'TYPE "R" TO RETURN TO MODEM',CR,LF
  449.     DB    'TYPE "A" TO RE-ENTER NAME: ',BELL,0
  450. ;
  451.     CALL    KEYIN
  452.     CALL    UCASE
  453.     CALL    TYPE        ;ECHO RESPONSE
  454.     CALL    CRLF
  455.     CPI    'A'
  456.     JZ    GET
  457.     CPI    'R'
  458.     JZ    RETURN
  459.     JMP    TRANSL2
  460. ;
  461. CONTIN:
  462.     LXI    D,80H
  463.     MVI    C,STDMA
  464.     CALL    BDOS
  465. READMR:
  466.     CALL    READ80
  467.     CPI    1        ;END OF FILE
  468.     JZ    RETURNS
  469.     CPI    2        ;BAD READ
  470.     JZ    RETURNU
  471.     CALL    SEND80C
  472.     CPI    EOFCHAR        ;END OF FILE - OMIT IF OBJECT..
  473.     JZ    RETURNS        ;..CODE IS TO BE SENT.
  474.     CPI    CAN        ;CANCELLATION?
  475.     JZ    TRANCAN
  476.     JMP    READMR
  477. ;
  478. RETURNS:
  479.     CALL    ILPRT
  480.     DB    CR,LF,'++FILE TRANSFER COMPLETED++',CR,LF,BELL,0
  481. ;
  482.     JMP    RETURN
  483. ;
  484. RETURNU:
  485.     CALL    ILPRT
  486.     DB    CR,LF,'++FILE TRANSFER UNSUCCESSFUL++',CR,LF,BELL,0
  487. ;
  488.     JMP    RETURN
  489. ;
  490. TRANCAN:
  491.     CALL    ILPRT
  492.     DB    CR,LF,CR,LF,'++ TRANSFER CANCELLED ++',CR,LF,BELL,0
  493. ;
  494. RETURN;
  495.     POP    PSW
  496.     POP    B
  497.     POP    D
  498.     POP    H
  499.     RET
  500. ;
  501. INITFCBS:            ;ENTRY AT +2 WILL LEAVE..
  502.     MVI    M,0        ;..DRIVE NO. INTACT.
  503.     INX    H        ;WILL INITIALIZE AN FCB..
  504.     MVI    B,11        ;..POINTED TO BY HL-REG. FILLS 1ST POS
  505. LOOP10:
  506.     MVI    M,' '        ;..WITH 0, NEXT 11 WITH..
  507.     INX    H        ;..WITH BLANKS, AND LAST..
  508.     DCR    B        ;..21 WITH NULLS.
  509.     JNZ    LOOP10
  510.     MVI    B,21
  511. LOOP11:
  512.     MVI    M,0
  513.     INX    H
  514.     DCR    B
  515.     JNZ    LOOP11
  516.     RET
  517. ;
  518. GETNAME:
  519.     CALL    ILPRT
  520.     DB    CR,LF,'ENTER FILE NAME TO BE TRANSFERRED -  C/R TO QUIT: ',0
  521. ;
  522.     LXI    D,CMDBUF
  523.     CALL    INBUFF
  524.     CALL    CRLF
  525.     RET
  526. ;
  527. MOVE4:
  528.     LXI    D,CMDBUF
  529.     LXI    H,FCB4
  530.     CALL    CPMLINE
  531.     RET
  532. ;
  533. OPEN4:
  534.     LXI    D,FCB4
  535.     MVI    C,OPEN
  536.     CALL    BDOS
  537.     RET
  538. ;
  539. READ80:
  540.     LXI    D,FCB4
  541.     MVI    C,READ
  542.     CALL    BDOS
  543.     RET
  544. ;
  545. SEND80C:
  546.     MVI    B,80H
  547.     LXI    H,80H
  548. SENDCH1:
  549.     MOV    A,M
  550.     CALL    MODOUT
  551.     CPI    EOFCHAR
  552.     RZ
  553.     CALL    STAT        ;TEST TO SEE IF
  554.     ORA    A        ;CANCELLATION REQUESTED
  555.     JZ    SKIP12
  556.     CALL    KEYIN
  557.     CPI    CAN
  558.     RZ
  559. SKIP12:
  560.     INX    H
  561.     DCR    B
  562.     JNZ    SENDCH1
  563.     RET
  564. ;
  565. MODOUT:
  566.     PUSH    PSW
  567. MODOUTL:
  568.     CALL    trasta
  569.     JNZ    MODOUTL
  570.     POP    PSW
  571.     CALL    OUT$MODDATP
  572.     CALL    TYPE
  573.     RET
  574. ;
  575. FCB4:    DS     33
  576.  
  577. ;TERMINAL ECHO MODE
  578.  
  579. hechek: call qhando ;rets z if handed over
  580.  jz menu ;echo mode disallowed
  581.  
  582. TRMECHO:
  583.     CALL    recsta
  584.     JZ    LINECHR
  585.     CALL    STAT
  586.     JZ    TRMECHO
  587.     CALL    KEYIN
  588.     CPI    EXITCHR
  589.     JZ    MENU
  590.     CALL    OUT$MODDATP
  591.     CALL    TYPE
  592.     JMP    TRMECHO
  593. ;
  594. LINECHR:
  595.     CALL    IN$MODDATP
  596.     CALL    OUT$MODDATP
  597.     CALL    TYPE
  598.     JMP    TRMECHO
  599. ;
  600. ;UNCOMMENTED LINES ARE THOSE OF ORIGINAL MODEM PROGRAM.
  601. ;COMMENTS DENOTE ADDITIONS.
  602. ;
  603. ;        SEND A CP/M FILE
  604.  
  605. SENDFIL:
  606.     LDA    BATCHFLG    ;CHECK IF MULTIPLE FILE..
  607.     ORA    A        ;..MODE IS SET.
  608.     JNZ    SENDC1
  609.     MVI    A,TRUE        ;INDICATE BATCH SEND
  610.     STA    SENDFLG
  611.     LDA    FSTFLG        ;IF FIRST TIME THRU..
  612.     ORA    A        ;..SCAN THE COMMAND LINE..
  613.     CNZ    TNMBUF        ;..FOR MULTIPLE NAMES.
  614.     CALL    SENDFN        ;SENDS FILE NAME TO RECEIVER
  615.     JNC    SENDC2        ;CARRY SET MEANS NO MORE FILES.
  616.     MVI    A,'B'        ;STOP BATCH..
  617.     STA    BATCHFLG    ;..MODE OPTION.
  618.     MVI    A,EOT        ;FINAL XFER END
  619.     CALL    SEND
  620.     JMP    DONE
  621. ;
  622. SENDC1:
  623.     LDA    FCB+1
  624.     CPI    ' '
  625.     JZ    BLKFILE
  626. SENDC2:
  627.     CALL    OPENFIL
  628.     MVI    E,80
  629.     CALL    WAITNAK
  630.  xra a ;no echo in handover mode
  631.  sta echfl+haven-rcan
  632.  
  633. SENDLP:
  634.     CALL    RDSECT
  635.     JC    SENDEOF
  636.     CALL    INCRSNO
  637.     XRA A
  638.     STA    ERRCT
  639. SENDRPT:
  640.     CALL    SENDHDR
  641.     CALL    SENDSEC
  642.     CALL    SENDCKS
  643.     CALL    GETACK
  644.     JC    SENDRPT
  645.     JMP    SENDLP
  646. ;
  647. SENDEOF:
  648.  call nulsend
  649.     MVI    A,EOT
  650.     CALL    SEND
  651.     CALL    GETACK
  652.     JC    SENDEOF
  653.     JMP    DONE
  654. ;
  655. ;        RECEIVE A FILE
  656.  
  657. RCVFIL:
  658.     LDA    BATCHFLG    ;CHECK IF MULT..
  659.     ORA    A        ;..FILE MODE.
  660.     JNZ    RCVC1
  661.     MVI    A,FALSE        ;FLAG WHERE TO RETURN..
  662.     STA    SENDFLG        ;..FOR NEXT FILE TRANS.
  663.     CALL    GETFN        ;GET THE FILE NAME.
  664.     JNC    RCVC2        ;CARRY SET MEANS NO MORE FILES.
  665.     MVI    A,'B'        ;STOP BATCH..
  666.     STA    BATCHFLG    ;..MODE OPTION.
  667.     JMP    DONE
  668. ;
  669. RCVC1:
  670.     LDA    FCB+1        ;MAKE SURE FILE IS NAMED
  671.     CPI    ' '
  672.     JZ    BLKFILE
  673.     JMP    RCVC3
  674. ;
  675. RCVC2:
  676.     CALL    CKCPM2
  677.     CALL    CKBAKUP
  678. RCVC3;
  679.     CALL    ERASFIL
  680.     CALL    MAKEFIL
  681.     LDA    QFLG
  682.     ORA    A
  683.     JNZ    RCVLP
  684.     LDA    BATCHFLG
  685.     ORA    A        ;DON'T PRINT MSSG IF..
  686.     JZ    RCVLP        ;..IN    MULTI AND QUIET.
  687.     CALL    ILPRT
  688.     DB    'FILE OPEN, READY TO RECEIVE',CR,LF,0
  689. ;
  690. RCVLP:
  691.     CALL    RCVSECT
  692.     JC    RCVEOT
  693.     CALL    WRSECT
  694.     CALL    INCRSNO
  695.     CALL    SENDACK
  696.     JMP    RCVLP
  697. ;
  698. RCVEOT:
  699.     CALL    WRBLOCK
  700.     CALL    SENDACK
  701.     CALL    CLOSFIL
  702.     JMP    DONE
  703. ;    
  704. ;SUBROUTINES
  705.  
  706. SENDFN:
  707.     LDA    QFLG
  708.     ORA    A
  709.     JZ    SWNAK
  710.     CALL    ILPRT
  711.     DB    'AWAITING NAME NAK',CR,LF,0
  712. ;
  713. SWNAK:
  714.     MVI    E,80
  715.     CALL    WAITNLP
  716.     MVI    A,ACK        ;GOT NAK, SEND ACK
  717.     CALL    SEND
  718.     LXI    H,FILECT
  719.     DCR    M
  720.     JM    NOMRNM
  721.     LHLD    NBSAVE        ;GET FILE NAME..
  722.     LXI    D,FCB        ;..IN    FCB
  723.     MVI    B,12
  724.     CALL    MOVE
  725.     SHLD    NBSAVE
  726.     CALL    SENDNM        ;SEND IT
  727.     ORA    A        ;CLEAR CARRY
  728.     RET
  729. ;
  730. NOMRNM:
  731.     MVI    A,EOT
  732.     CALL    SEND
  733.     STC
  734.     RET
  735. ;
  736. SENDNM:
  737.     PUSH    H
  738. SENDNM1:
  739.     MVI    D,11        ;COUNT CHARS IN NAME
  740.     MVI    C,0        ;INIT CHECKSUM
  741.     LXI    H,FCB+1        ;ADDRESS NAME
  742. NAMLPS:
  743.     MOV    A,M        ;SEND NAME
  744.     ANI    7FH        ;STRIP HIGH ORDER BIT SO CP/M 2..
  745.     CALL    SEND        ;..WON'T SEND R/O FILE DESIGNATION.
  746.     LDA    QFLG        ;SHOW NAME IF..
  747.     ORA    A        ;..QFLG NOT SET.
  748.     MOV    A,M
  749.     CNZ    TYPE
  750. ACKLP:
  751.     PUSH    B        ;SAVE CKSUM
  752.     MVI    B,1        ;WAIT FOR RECEIVER..
  753.     CALL    RECV        ;..TO ACKNOWLEDGE..
  754.     POP    B        ;..GETTING LETTER.
  755.     JC    SCKSER
  756.     CPI    ACK
  757.     JNZ    ACKLP
  758.     INX    H        ;NEXT CHAR
  759.     DCR    D
  760.     JNZ    NAMLPS
  761.     MVI    A,EOFCHAR    ;TELL RECEIVER END OF NAME
  762.     CALL    SEND
  763.     LDA    QFLG
  764.     ORA    A
  765.     CNZ    CRLF
  766.     MOV    D,C        ;SAVE CHECKSUM
  767.     MVI    B,1
  768.     CALL    RECV        ;GET CHECKSUM..
  769.     CMP    D        ;..FROM RECEIVER.
  770.     JZ    NAMEOK
  771. SCKSER:
  772.     MVI    A,BDNMCH    ;BAD NAME-TELL RECEIVER
  773.     CALL    SEND
  774.     LDA    QFLG
  775.     ORA    A
  776.     JZ    SKCSER1
  777.     CALL    ILPRT
  778.     DB    'CHECKSUM ERROR',CR,LF,0
  779. ;
  780. SKCSER1:
  781.     MVI    E,80        ;DO HANDSHAKING OVER
  782.     CALL    WAITNLP        ;DON'T PRINT "AWAITING NAK" MSG
  783.     MVI    A,ACK
  784.     CALL    SEND
  785.     JMP    SENDNM1
  786. ;
  787. NAMEOK:
  788.     MVI    A,OKNMCH    ;GOOD NAME-TELL RECEIVER
  789.     CALL    SEND
  790.     POP    H
  791.     RET    
  792. ;
  793. GETFN:
  794.     LXI    H,FCB
  795.     CALL    INITFCBS+2    ;DOES NOT INITIALIZE DRIVE
  796.     LDA    QFLG
  797.     ORA    A
  798.     JZ    GNAMELP
  799.     CALL    ILPRT
  800.     DB    'AWAITING FILE NAME',CR,LF,0
  801. ;
  802. GNAMELP:
  803.     CALL    HSNAK
  804.     JC    GNAMELP
  805.     CALL    GETNM        ;GET THE NAME
  806.     CPI    EOT        ;IF EOT, THEN NO MORE FILES
  807.     JZ    NOMRNMG
  808.     ORA    A        ;CLEAR CARRY
  809.     RET
  810. ;
  811. NOMRNMG:
  812.     STC
  813.     RET
  814. ;
  815. GETNM:
  816.     PUSH    H
  817. GETNM1:
  818.     MVI    C,0        ;INIT CHECKSUM
  819.     LXI    H,FCB+1
  820. NAMELPG:
  821.     MVI    B,5
  822.     CALL    RECV        ;GET CHAR
  823.     JNC    GETNM3
  824.     LDA    QFLG
  825.     ORA    A
  826.     JZ    GETNM2
  827.     CALL    ILPRT
  828.     DB    'TIME OUT       RECEIVING FILENAME',CR,LF,0
  829. ;
  830. GETNM2:
  831.     JMP    GCKSER
  832. ;
  833. GETNM3:
  834.     CPI    EOT        ;IF EOT, THEN NO MORE FILES
  835.     JZ    GNRET
  836.     CPI    EOFCHAR        ;GOT END OF NAME
  837.     JZ    ENDNAME
  838.     MOV    M,A        ;PUT NAME IN    FCB
  839.     LDA    QFLG        ;TYPE IT IF NO QFLG
  840.     ORA    A
  841.     MOV    A,M
  842.     CNZ    TYPE
  843.     PUSH    B        ;SAVE CKSUM
  844.     MVI    A,ACK        ;ACK GETTING LETTER
  845.     CALL    SEND
  846.     POP    B
  847.     INX    H        ;GET NEXT CHAR
  848.     MOV    A,L        ;DON'T LET NOISE...
  849.     CPI    7FH        ;..CAUSE OVERFLOW..
  850.     JZ    GCKSER        ;..INTO PROGRAM AREA.
  851.     JMP    NAMELPG
  852. ;
  853. ENDNAME:
  854.     LDA    QFLG
  855.     ORA    A
  856.     CNZ    CRLF
  857.     MOV    A,C        ;SEND CHECKSUM
  858.     CALL    SEND
  859.     MVI    B,1
  860.     CALL    RECV        ;CHECKSUM GOOD?
  861.     CPI    OKNMCH        ;YES IF OKNMCH SENT..
  862.     JZ    GNRET        ;..ELSE DO OVER.
  863. GCKSER:
  864.     LXI    H,FCB        ;CLEAR FCB (EXCEPT DRIVE)..
  865.     CALL    INITFCBS+2    ;..SINCE IT MIGHT BE DAMAGED..
  866.     LDA    QFLG        ;..BY TOO MANY CHARS.
  867.     ORA    A
  868.     JZ    GCKSER1
  869.     CALL    ILPRT
  870.     DB    'CHECKSUM ERROR',CR,LF,0
  871. ;
  872. GCKSER1:
  873.     CALL    HSNAK        ;DO HANDSHAKING OVER
  874.     JC    GCKSER1
  875.     JMP    GETNM1
  876. ;
  877. GNRET:
  878.     POP    H
  879.     RET
  880. ;
  881. HSNAK:
  882.     MVI    A,NAK        ;SEND NAK UNTIL..
  883.     CALL    SEND        ;..RECEIVING ACK.
  884.     CALL    CKABORT        ;DON'T GET HUNG UP HERE
  885.     MVI    B,2        ;WAIT 2 SECONDS..
  886.     CALL    RECV        ;..IN    RECEIVE.
  887.     CPI    CAN        ;IF SENDER ABORTS..
  888.     JZ    ABORT        ;..DURING NAME TRANSFER.
  889.     CPI    ACK        ;IF NAK,RETURN WITH..
  890.     RZ            ;..CARRY CLEAR.
  891.     STC
  892.     RET
  893. ;
  894. TNMBUF:
  895.     MVI    A,FALSE        ;CALL FROM SENDFIL ONLY ONCE.
  896.     STA    FSTFLG
  897.     STA    FILECT
  898.     CALL    SCAN
  899.     LXI    H,NAMEBUF
  900.     SHLD    NBSAVE        ;SAVE ADDR OF 1ST NAME
  901. TNLP1:
  902.     CALL    TRTOBUF
  903.     LXI    H,FCB
  904.     LXI    D,FCBBUF
  905.     CALL    CPMLINE        ;PARSE NAME TO CP/M FORMAT
  906. TNLP2:
  907.     CALL    MFNAME        ;SEARCH FOR NAMES (* FORMAT)
  908.     JC    NEXTNM
  909.     LDA    FCB+10        ;IF CP/M 2 $SYS FILE..
  910.     ANI    80H        ;..DON'T SEND
  911.     JNZ    TNLP2
  912.     LHLD    NBSAVE        ;GET NAME
  913.     LXI    D,FCB        ;MOVE IT TO FCB
  914.     XCHG
  915.     MVI    B,12
  916.     CALL    MOVE
  917.     XCHG
  918.     SHLD    NBSAVE        ;ADDR OF NEXT NAME
  919.     LXI    H,FILECT    ;COUNT FILES FOUND
  920.     INR    M
  921.     JMP    TNLP2
  922. ;
  923. NEXTNM:
  924.     LXI    H,NAMECT    ;COUNT NAMES FOUND
  925.     DCR    M
  926.     JNZ    TNLP1
  927.     LXI    H,NAMEBUF    ;SAVE START OF BUFFER
  928.     SHLD    NBSAVE
  929.     LDA    FILECT
  930.     CPI    65        ;NO MORE THAN 64 TRANSFERS
  931.     RC
  932.     MVI    A,64        ;ONLY X'FER FIRST 64
  933.     STA    FILECT
  934.     RET
  935. ;
  936. ;SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE)
  937. ;AFTER LAST NAME
  938.  
  939. SCAN:
  940.     PUSH    H
  941.     LXI    H,NAMECT
  942.     MVI    M,0
  943.     LXI    H,CMDBUF+1    ;FIND END OF CMD LINE..
  944.     MOV    C,M        ;..AND PUT SPACE THERE.
  945.     MVI    B,0
  946.     LXI    H,CMDBUF+2
  947.     DAD B
  948.     MVI    M,20H
  949.     LXI    H,CMDBUF+1
  950.     MOV    B,M
  951.     INR    B
  952.     INR    B
  953. SCANLP1:
  954.     INX    H
  955.     DCR    B
  956.     JZ    DNSCAN
  957.     MOV    A,M
  958.     CPI    20H
  959.     JNZ    SCANLP1
  960. SCANLP2:
  961.     INX    H        ;EAT EXTRA SPACES
  962.     DCR    B
  963.     JZ    DNSCAN
  964.     MOV    A,M
  965.     CPI    20H
  966.     JZ    SCANLP2
  967.     SHLD    BGNMS        ;SAVE START OF NAMES IN CMDBUF
  968.     INR    B
  969.     DCX    H
  970. SCANLP3:
  971.     INX    H
  972.     DCR    B
  973.     JZ    DNSCAN
  974.     MOV    A,M
  975.     CPI    20H
  976.     JNZ    SCANLP3
  977.     LDA    NAMECT        ;COUNTS NAMES
  978.     INR    A
  979.     STA    NAMECT
  980. SCANLP4:
  981.     INX    H        ;EAT SPACES
  982.     DCR    B
  983.     JZ    DNSCAN
  984.     MOV    A,M
  985.     CPI    20H
  986.     JZ    SCANLP4
  987.     JMP    SCANLP3
  988. ;
  989. DNSCAN:
  990.     MVI    M,20H    ;SPACE AFTER LAST CHAR
  991.     POP    H
  992.     RET
  993. ;
  994. ;PLACES NEXT NAME IN    BUFFER SO CPMLINE MAY PARSE IT
  995.  
  996. TRTOBUF:
  997.     LHLD    BGNMS
  998.     MVI    B,0
  999.     LXI    D,FCBBUF+2
  1000. TBLP:
  1001.     MOV    A,M
  1002.     CPI    20H
  1003.     JZ    TRBFEND
  1004.     STAX D
  1005.     INX    H
  1006.     INX    D
  1007.     INR    B        ;COUNT CHARS IN NAME
  1008.     JMP    TBLP
  1009. ;
  1010. TRBFEND:
  1011.     INX    H
  1012.     MOV    A,M        ;EAT EXTRA SPACES
  1013.     CPI    20H
  1014.     JZ    TRBFEND
  1015.     SHLD    BGNMS
  1016.     LXI    H,FCBBUF+1    ;PUT # CHARS BEFORE NAME
  1017.     MOV    M,B
  1018.     RET
  1019. ;
  1020. ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'.
  1021.  
  1022. CKCPM2;
  1023.     MVI    C,12
  1024.     CALL    BDOS
  1025.     ORA    A        ;RETURN 0 MEANS CP/M 1
  1026.     RZ
  1027.     MVI    C,STDMA
  1028.     LXI    D,80H
  1029.     CALL    BDOS
  1030.     MVI    C,SRCHF        ;SEARCH FOR FILE
  1031.     LXI    D,FCB
  1032.     CALL    BDOS
  1033.     CPI    0FFH
  1034.     RZ
  1035.     ADD A
  1036.     ADD A            ;MULT A-REG BY..
  1037.     ADD A
  1038.     ADD A            ;..32 TO FIND..
  1039.     ADD A            ;..NAME IN    DMA.
  1040.     LXI    H,80H
  1041.     ADD L
  1042.     MOV    L,A        ;HL POINTS TO DIR NAME
  1043.     LXI    D,9
  1044.     DAD D            ;POINT TO R/O ATTRIB BYTE
  1045.     MOV    A,M
  1046.     ANI    80H        ;TEST MSB
  1047.     JNZ    MKCHG        ;IF SET, MAKE CHANGE
  1048.     INX    H        ;CHECK SYSTEM ATTRIB BYTE
  1049.     MOV    A,M
  1050.     ANI    80H
  1051.     RZ            ;NOT $SYS OR $R/O
  1052.     DCX    H
  1053. MKCHG:
  1054.     LXI    D,-8
  1055.     DAD    D        ;POINT HL TO FILENAME + 1
  1056.     LXI    D,FCB+1        ;MOVE DIR NAME TO FCB..
  1057.     MVI    B,11        ;..WITHOUT CHANGING DRIVE.
  1058.     CALL    MOVE
  1059.     LXI    H,FCB+9        ;R/O ATTRIB
  1060.     MOV    A,M
  1061.     ANI    7FH        ;STRIP R/O ATTRIB
  1062.     MOV    M,A
  1063.     INX    H        ;SYS ATTRIB
  1064.     MOV    A,M
  1065.     ANI    7FH
  1066.     MOV    M,A
  1067.     LXI    D,FCB
  1068.     MVI    C,30        ;SET NEW ATTRIBS IN DIR
  1069.     CALL    BDOS
  1070.  
  1071. ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE
  1072.  
  1073. PLANCHG:
  1074.     LXI    H,FCB        ;CHANGE NAME TO TYPE "BAK"
  1075.     LXI    D,6CH
  1076.     MVI    B,9        ;MOVE DRIVE AND NAME (NOT TYPE)
  1077.     CALL    MOVE
  1078.     LXI    H,75H        ;START OF TYPE IN FCB2
  1079.     MVI    M,'B'
  1080.     INX    H
  1081.     MVI    M,'A'
  1082.     INX    H
  1083.     MVI    M,'K'
  1084.     LXI    D,6CH
  1085.     MVI    C,ERASE        ;ERASE ANY PREV BACKUPS
  1086.     CALL    BDOS
  1087.     LXI    H,6CH        ;FCB2 DR FIELD SHOULD..
  1088.     MVI    M,0        ;..0 FOR RENAME.
  1089.     LXI    D,FCB
  1090.     MVI    C,23        ;RENAME
  1091.     CALL    BDOS
  1092.     RET
  1093. ;
  1094. CKBAKUP:
  1095.     LDA    BAKUPBYTE
  1096.     ORA    A
  1097.     RZ
  1098.     MVI    C,SRCHF
  1099.     LXI    D,FCB
  1100.     CALL    BDOS
  1101.     INR    A
  1102.     RZ            ;FILE NOT FOUND
  1103.     JMP    PLANCHG        ;IN "CKCPM2" - RET DONE THERE
  1104. ;
  1105. ;MULTI-FILE ACCESS SUBROUTINE FROM CP/M USER'S GROUP
  1106. ;FIXED BY MARK ZEIGER 8/17/80
  1107. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  1108.  
  1109. MFNAME:
  1110.     MFACCESS        ;A MACRO IN    MACROS.LIB
  1111. ;
  1112. RCVSECT:
  1113.     XRA A
  1114.     STA    ERRCT
  1115. RCVRPT:
  1116.     LDA    QFLG
  1117.     ORA    A
  1118.     JZ    RCVSQ
  1119.     CALL    ILPRT
  1120.     DB    'AWAITING #',0
  1121.     LDA    SECTNO
  1122.     INR    A
  1123.     CALL    HEXO
  1124.     CALL    CRLF
  1125.  xra a
  1126.  sta echfl+haven-rcan ;no echo after the first when handed over
  1127.  
  1128. RCVSQ:
  1129.     MVI    B,7        ;10 IN    ORIG PROG
  1130.     CALL    RECV
  1131.     JC    RCVSTOT
  1132.     CPI    CAN        ;CHECK FOR CANCEL..
  1133.     JZ    ABORT        ;..REQUEST FROM SENDER.
  1134.     CPI    SOH
  1135.     JZ    RCVSOH
  1136.     ORA    A
  1137.     JZ    RCVSQ
  1138.     CPI    EOT
  1139.     STC
  1140.     RZ
  1141.     MOV    B,A
  1142.     LDA    VSEEFLG
  1143.     ORA    A
  1144.     JZ    RCVSEH
  1145.     LDA    QFLG
  1146.     ORA    A
  1147.     JZ    RCVSERR
  1148. RCVSEH:
  1149.     MOV    A,B
  1150.     CALL    HEXO
  1151.     CALL    ILPRT
  1152.     DB    'H RCD, NOT SOH',CR,LF,0
  1153. ;
  1154. RCVSERR:
  1155.     MVI    B,1
  1156.     CALL    RECV
  1157.     JNC    RCVSERR
  1158.     MVI    A,NAK
  1159.     CALL    SEND
  1160.     LDA    ERRCT
  1161.     INR    A
  1162.     STA    ERRCT
  1163.     CPI    ERRLIM
  1164.     JC    RCVRPT
  1165.     LDA    VSEEFLG
  1166.     ORA    A
  1167.     JZ    RCVCKQ
  1168.     LDA    QFLG
  1169.     ORA    A
  1170.     JZ    RCVSABT
  1171. RCVCKQ:
  1172.     CALL    CKQUIT
  1173.     JZ    RCVSECT
  1174. RCVSABT:
  1175.     CALL    CLOSFIL
  1176.     CALL    ERXIT
  1177.     DB    '++     UNABLE TO RECEIVE BLOCK  --  ABORTING ++',CR,LF,'$'
  1178. ;
  1179. RCVSTOT:
  1180.     LDA    VSEEFLG
  1181.     ORA    A
  1182.     JZ    RCVSPT
  1183.     LDA    QFLG
  1184.     ORA    A
  1185.     JZ    RCVSERR
  1186. RCVSPT:
  1187.     CALL    ILPRT
  1188.     DB    '++  TIMEOUT    ++ ',0
  1189. ;
  1190. RCVPRN:
  1191.     LDA    ERRCT
  1192.     CALL    HEXO
  1193.     CALL    CRLF
  1194.     JMP    RCVSERR
  1195. ;
  1196. RCVSOH:
  1197.     MVI    B,1
  1198.     CALL    RECV
  1199.     JC    RCVSTOT
  1200.     MOV    D,A
  1201.     MVI    B,1
  1202.     CALL    RECV
  1203.     JC    RCVSTOT
  1204.     CMA
  1205.     CMP    D
  1206.     JZ    RCVDATA
  1207.     LDA    VSEEFLG
  1208.     ORA    A
  1209.     JZ    RCVBSE
  1210.     LDA    QFLG
  1211.     ORA    A
  1212.     JZ    RCVSERR
  1213. RCVBSE:
  1214.     CALL    ILPRT
  1215.     DB    '++  BAD SECTOR # IN    HDR',CR,LF,0
  1216. ;
  1217.     JMP    RCVSERR
  1218. ;
  1219. RCVDATA:
  1220.     MOV    A,D
  1221.     STA    RCVSNO
  1222.     MVI    A,1
  1223.     STA    DATAFLG
  1224.     MVI    C,0
  1225.     LXI    H,80H
  1226. RCVCHR:
  1227.     MVI    B,1
  1228.     CALL    RECV
  1229.     JC    RCVSTOT
  1230.     MOV    M,A
  1231.     INR    L
  1232.     JNZ    RCVCHR
  1233.     MOV    D,C
  1234.     XRA A
  1235.     STA    DATAFLG
  1236.     MVI    B,1
  1237.     CALL    RECV
  1238.     JC    RCVSTOT
  1239.     CMP    D
  1240.     JNZ    RCVCERR
  1241.     LDA    RCVSNO
  1242.     MOV    B,A
  1243.     LDA    SECTNO
  1244.     CMP    B
  1245.     JZ    RECVACK
  1246.     INR    A
  1247.     CMP    B
  1248.     JNZ    ABORT
  1249.     RET
  1250. ;
  1251. RCVCERR:
  1252.     LDA    VSEEFLG
  1253.     ORA    A
  1254.     JZ    RCVCPR
  1255.     LDA    QFLG
  1256.     ORA    A
  1257.     JZ    RCVSERR
  1258. RCVCPR:
  1259.     CALL    ILPRT
  1260.     DB    '++  CKSUM ++ ',0
  1261. ;
  1262.     JMP    RCVPRN
  1263. ;
  1264. RECVACK:
  1265.     CALL    SENDACK
  1266.     JMP    RCVSECT
  1267. ;
  1268. SENDACK:
  1269.     MVI    A,ACK
  1270.     CALL    SEND
  1271.     RET
  1272. ;
  1273. SENDHDR:
  1274.     LDA    QFLG
  1275.     ORA    A
  1276.     JZ    SENDHNM
  1277.     CALL    ILPRT
  1278.     DB    'SEND # ',0
  1279. ;
  1280.     LDA    SECTNO
  1281.     CALL    HEXO
  1282.     CALL    CRLF
  1283. SENDHNM:
  1284.  call nulsend ;send (nulno) nulls
  1285.     MVI    A,SOH
  1286.     CALL    SEND
  1287.     LDA    SECTNO
  1288.     CALL    SEND
  1289.     LDA    SECTNO
  1290.     CMA
  1291.     CALL    SEND
  1292.     RET
  1293.  
  1294.  ;sr delay the no of ms (roughly) in nulno
  1295. nulsend: lda nulno
  1296. nuls2: dcr a
  1297.  rm
  1298.  push psw
  1299.  push b
  1300.  lda fastclk
  1301.  ani 80h
  1302.  mov b,a
  1303. nuls3: dcr b
  1304.  jnz nuls3
  1305.  pop b
  1306.  pop psw
  1307.  jmp nuls2
  1308. ;
  1309. SENDSEC:
  1310.     MVI    A,1
  1311.     STA    DATAFLG
  1312.     MVI    C,0
  1313.     LXI    H,80H
  1314. SENDC:
  1315.     MOV    A,M
  1316.     CALL    SEND
  1317.     INR    L
  1318.     JNZ    SENDC
  1319.     XRA A
  1320.     STA    DATAFLG
  1321.     RET
  1322. ;
  1323. SENDCKS:
  1324.     MOV    A,C
  1325.     CALL    SEND
  1326.     RET
  1327. ;
  1328. GETACK:
  1329.     MVI    B,7        ;10 IN    ORIG PROG
  1330.     CALL    RECVDG
  1331.     JC    GETATOT
  1332.     CPI    ACK
  1333.     RZ
  1334.     CPI    CAN
  1335.     JZ    ABORT
  1336.     MOV    B,A
  1337.     LDA    QFLG
  1338.     ORA    A
  1339.     JZ    ACKERR
  1340.     MOV    A,B
  1341.     CALL    HEXO
  1342.     CALL    ILPRT
  1343.     DB    'H RCD, NOT ACK',CR,LF,0
  1344. ;
  1345. ACKERR:
  1346.     LDA    ERRCT
  1347.     INR    A
  1348.     STA    ERRCT
  1349.     CPI    ERRLIM
  1350.     RC
  1351.     LDA    VSEEFLG
  1352.     ORA    A
  1353.     JZ    GACKV
  1354.     LDA    QFLG
  1355.     ORA    A
  1356.     JZ    CSABORT
  1357. GACKV:
  1358.     CALL    CKQUIT
  1359.     STC
  1360.     RZ
  1361. CSABORT:
  1362.     CALL    ERXIT
  1363.     DB    'CAN''T SEND SECTOR -- ABORTING',CR,LF,'$'
  1364. ;
  1365. GETATOT:
  1366.     LDA    QFLG
  1367.     ORA    A
  1368.     JZ    ACKERR
  1369.     CALL    ILPRT
  1370.     DB    'TIMEOUT        ON ACK',CR,LF,0
  1371. ;
  1372.     JMP    ACKERR
  1373. ;
  1374. CKABORT:
  1375.     LDA    VSEEFLG
  1376.     ORA    A
  1377.     JZ    CKABGO
  1378.     LDA    QFLG
  1379.     ORA    A
  1380.     RZ
  1381. CKABGO:
  1382.     CALL    STAT
  1383.     RZ
  1384.     CALL    KEYIN
  1385.     CPI    CAN
  1386.     RNZ
  1387. ABORT:
  1388.     LXI    SP,STACK
  1389. ABORTL:
  1390.     MVI    B,1
  1391.     CALL    RECV
  1392.     JNC    ABORTL
  1393.     MVI    A,CAN
  1394.     CALL    SEND
  1395. ABORTW:
  1396.     MVI    B,1
  1397.     CALL    RECV
  1398.     JNC    ABORTW
  1399.     MVI    A,' '
  1400.     CALL    SEND
  1401.     CALL    ILPRT
  1402.     DB    'ROUTINE CANCELLED',CR,LF,BELL,0
  1403.  
  1404.     MVI    A,'B'        ;TURN MULTI-FILE MODE..
  1405.     STA    BATCHFLG    ;..OFF SO ROUTINE ENDS.
  1406.     JMP    DONETCE
  1407. ;
  1408. INCRSNO:
  1409.     LDA    SECTNO
  1410.     INR    A
  1411.     STA    SECTNO
  1412.     RET
  1413. ;
  1414. ERASFIL:
  1415.     LDA    BATCHFLG    ;DON'T ASK FOR ERASE..
  1416.     ORA    A        ;..IN    MULTI-FILE MODE,..
  1417.     JZ    NOASK        ;..JUST DO IT.
  1418.     LXI    D,FCB
  1419.     MVI    C,SRCHF
  1420.     CALL    BDOS
  1421.     INR    A
  1422.     RZ
  1423.     CALL    ILPRT
  1424.     DB    'FILES EXISTS -- TYPE ''Y'' TO ERASE: ',BELL,0
  1425. ;
  1426.     CALL    KEYIN
  1427.     PUSH    PSW
  1428.     CALL    TYPE
  1429.     POP    PSW
  1430.     CALL    UCASE
  1431.     CPI    'Y'
  1432.     JNZ    MENU
  1433.     CALL    CRLF
  1434. NOASK:
  1435.     LXI    D,FCB
  1436.     MVI    C,ERASE
  1437.     CALL    BDOS
  1438.     RET
  1439. ;
  1440. BLKFILE:
  1441.     CALL    ILPRT    ;ROUTINE IF NO FILE IS NAMED FOR "SEND" OR "RECEIVE"
  1442.     DB    CR,LF,'No file specified',CR,LF,BELL,0
  1443. ;
  1444.     JMP    MENU
  1445. ;
  1446. MAKEFIL:
  1447.     LXI    D,FCB
  1448.     MVI    C,MAKE
  1449.     CALL    BDOS
  1450.     INR    A
  1451.     RNZ
  1452.     CALL    ERXIT
  1453.     DB    'ERROR - CAN''T MAKE FILE',CR,LF
  1454.     DB    'DIRECTORY MUST BE FULL',CR,LF,'$'
  1455. ;
  1456. OPENFIL:
  1457.     LXI    D,FCB
  1458.     MVI    C,OPEN
  1459.     CALL    BDOS
  1460.     INR    A
  1461.     JNZ    OPENOK
  1462.     CALL    ERXIT
  1463.     DB    'CAN''T OPEN FILE$'
  1464. ;
  1465. OPENOK:
  1466.     LDA    BATCHFLG
  1467.     ORA    A
  1468.     JNZ    OPENOK1
  1469.     LDA    QFLG
  1470.     ORA    A
  1471.     RZ
  1472. OPENOK1:
  1473.     CALL    ILPRT
  1474.     DB    'FILE OPEN - EXTENT LENGTH: ',0
  1475. ;
  1476.     LDA    FCB+15
  1477.     CALL    HEXO
  1478.     MVI    A,'H'
  1479.     CALL    TYPE
  1480.     CALL    CRLF
  1481.     RET
  1482. ;
  1483. CLOSFIL:
  1484.     LXI    D,FCB
  1485.     MVI    C,CLOSE
  1486.     CALL    BDOS
  1487.     INR    A
  1488.     RNZ
  1489.     CALL    ERXIT
  1490.     DB    'CAN''T CLOSE FILE$'
  1491. ;
  1492. RDSECT:
  1493.     LDA    SECINBF
  1494.     DCR    A
  1495.     STA    SECINBF
  1496.     JM    RDBLOCK
  1497.     LHLD    SECPTR
  1498.     LXI    D,80H
  1499.     CALL    MOVE128
  1500.     SHLD    SECPTR
  1501.     RET
  1502. ;
  1503. RDBLOCK:
  1504.     LDA    EOFLG
  1505.     CPI    1
  1506.     STC
  1507.     RZ
  1508.     MVI    C,0
  1509.     LXI    D,DBUF
  1510. RDSECLP:
  1511.     PUSH    B
  1512.     PUSH    D
  1513.     MVI    C,STDMA
  1514.     CALL    BDOS
  1515.     LXI    D,FCB
  1516.     MVI    C,READ
  1517.     CALL    BDOS
  1518.     POP    D
  1519.     POP    B
  1520.     ORA    A
  1521.     JZ    RDSECOK
  1522.     DCR    A
  1523.     JZ    REOF
  1524.     CALL    ERXIT
  1525.     DB    '++     FILE READ ERROR ++$'
  1526. ;
  1527. RDSECOK:
  1528.     LXI    H,80H
  1529.     DAD    D
  1530.     XCHG
  1531.     INR    C
  1532.     MOV    A,C
  1533.     CPI    16
  1534.     JZ    RDBFULL
  1535.     JMP    RDSECLP
  1536. ;
  1537. REOF:
  1538.     MVI    A,1
  1539.     STA    EOFLG
  1540.     MOV    A,C
  1541. RDBFULL:
  1542.     STA    SECINBF
  1543.     LXI    H,DBUF
  1544.     SHLD    SECPTR
  1545.     LXI    D,80H
  1546.     MVI    C,STDMA
  1547.     CALL    BDOS
  1548.     JMP    RDSECT
  1549. ;
  1550. WRSECT:
  1551.     LHLD    SECPTR
  1552.     XCHG
  1553.     LXI    H,80H
  1554.     CALL    MOVE128
  1555.     XCHG
  1556.     SHLD    SECPTR
  1557.     LDA    SECINBF
  1558.     INR    A
  1559.     STA    SECINBF
  1560.     CPI    16
  1561.     RNZ
  1562. WRBLOCK:
  1563.     LDA    SECINBF
  1564.     ORA    A
  1565.     RZ
  1566.     MOV    C,A
  1567.     LXI    D,DBUF
  1568. DKWRLP:
  1569.     PUSH    H
  1570.     PUSH    D
  1571.     PUSH    B
  1572.     MVI    C,STDMA
  1573.     CALL    BDOS
  1574.     LXI    D,FCB
  1575.     MVI    C,WRITE
  1576.     CALL    BDOS
  1577.     POP    B
  1578.     POP    D
  1579.     POP    H
  1580.     ORA    A
  1581.     JNZ    WRERR
  1582.     LXI    H,80H
  1583.     DAD    D
  1584.     XCHG
  1585.     DCR    C
  1586.     JNZ    DKWRLP
  1587.     XRA    A
  1588.     STA    SECINBF
  1589.     LXI    H,DBUF
  1590.     SHLD    SECPTR
  1591.     RET
  1592. ;
  1593. WRERR:
  1594.     MVI    C,CAN
  1595.     CALL    SEND
  1596.     CALL    ERXIT
  1597.     DB    'ERROR WRITING FILE',CR,LF,'$'
  1598. ;
  1599. RECVDG:
  1600.     CALL    IN$MODDATP
  1601.     CALL    IN$MODDATP
  1602. RECV:
  1603.     PUSH    D
  1604.     LDA    FASTCLK
  1605.     ORA    A
  1606.     JZ    MSEC
  1607.     MOV    A,B
  1608.     ADD    A
  1609.     MOV    B,A
  1610. MSEC:
  1611.     LXI    D,15000        ;60% OF ORIG 50000
  1612.     CALL    CKABORT
  1613. MWTI:
  1614.     CALL    recsta
  1615.     JZ    MCHAR
  1616.     DCR    E
  1617.     JNZ    MWTI
  1618.     DCR    D
  1619.     JNZ    MWTI
  1620.     DCR    B
  1621.     JNZ    MSEC
  1622.     POP    D
  1623.     STC
  1624.     RET
  1625. ;
  1626. MCHAR:
  1627.     CALL    IN$MODDATP
  1628.     POP    D
  1629.     PUSH    PSW
  1630.     ADD    C
  1631.     MOV    C,A
  1632.     LDA    RSEEFLG
  1633.     ORA    A
  1634.     JZ    MONIN
  1635.     LDA    VSEEFLG
  1636.     ORA    A
  1637.     JNZ    NOMONIN
  1638.     LDA    DATAFLG
  1639.     ORA    A
  1640.     JZ    NOMONIN
  1641. MONIN:
  1642.     POP    PSW
  1643.     PUSH    PSW
  1644.     CALL    SHOW
  1645. NOMONIN:
  1646.     POP    PSW
  1647.     ORA    A
  1648.     RET
  1649. ;
  1650. SEND:
  1651.     PUSH    PSW
  1652.     LDA    SSEEFLG
  1653.     ORA    A
  1654.     JZ    MONOUT
  1655.     LDA    VSEEFLG
  1656.     ORA    A
  1657.     JNZ    NOMONOT
  1658.     LDA    DATAFLG
  1659.     ORA    A
  1660.     JZ    NOMONOT
  1661. MONOUT:
  1662.     POP    PSW
  1663.     PUSH    PSW
  1664.     CALL    SHOW
  1665. NOMONOT:
  1666.     POP    PSW
  1667.     PUSH    PSW
  1668.     ADD C
  1669.     MOV    C,A
  1670. SENDW:
  1671.     CALL    trasta
  1672.     JNZ    SENDW
  1673.     POP    PSW
  1674.     CALL    OUT$MODDATP
  1675.     RET
  1676. ;
  1677. WAITNAK:
  1678.     LDA    VSEEFLG
  1679.     ORA    A
  1680.     JZ    WAITNPR
  1681.     LDA    QFLG
  1682.     ORA    A
  1683.     JZ    WAITNLP
  1684. WAITNPR:
  1685.     CALL    ILPRT
  1686.     DB    'AWAITING INITIAL NAK',CR,LF,0
  1687. ;
  1688. WAITNLP:
  1689.     CALL    CKABORT
  1690.     MVI    B,1
  1691.     CALL    RECV
  1692.     CPI    NAK
  1693.     RZ
  1694.     CPI    CAN
  1695.     JZ    ABORT
  1696.     DCR    E
  1697.     JZ    ABORT
  1698.     JMP    WAITNLP
  1699. ;
  1700. INITADR:
  1701.     LHLD    1
  1702.     LXI    D,3
  1703.     DAD    D
  1704.     SHLD    VSTAT+1
  1705.     DAD    D
  1706.     SHLD    VKEYIN+1
  1707.     DAD    D
  1708.     SHLD    VTYPE+1
  1709.     JMP    JMP$INITMOD    ;RETURN DONE FROM THIS ROUTINE..
  1710. ;
  1711. PROCOPT:
  1712.     LXI    D,FCB+1
  1713.     LDAX    D
  1714.     STA    OPTION
  1715. OPTLP:
  1716.     INX    D
  1717.     LDAX    D
  1718.     CPI    ' '
  1719.     JZ    ENDOPT
  1720.     LXI    H,OPTBL
  1721.     MVI    B,OPTBE-OPTBL
  1722. OPTCK:
  1723.     CMP    M
  1724.     JNZ    OPTNO
  1725.     MVI    M,0
  1726.     JMP    OPTLP
  1727. OPTNO:
  1728.     INX    H
  1729.     DCR    B
  1730.     JNZ    OPTCK
  1731.     JMP    BADOPT
  1732. ;
  1733. ENDOPT:
  1734.     LDA    VSEEFLG
  1735.     ORA    A
  1736.     RNZ
  1737.     STA    QFLG
  1738.     RET
  1739. ;
  1740. DONE:
  1741.     LDA    BATCHFLG
  1742.     ORA    A
  1743.     JNZ    DONETCC
  1744.     LDA    QFLG
  1745.     ORA    A
  1746.     JZ    NMSTRNS
  1747.     LXI    H,FCB+1        ;PUT FILE NAME IN..
  1748.     LXI    D,FTRNMSG    ;..SPACES IN    MESSAGE..
  1749.     MVI    B,8        ;..BELOW.
  1750.     CALL    MOVE
  1751.     INX    D        ;PUT FILE TYPE AFTER..
  1752.     MVI    B,3        ;..SKIPPING ONE SPACE..
  1753.     CALL    MOVE        ;..BELOW.    
  1754.     CALL    ILPRT
  1755. FTRNMSG:
  1756.     DB    '              TRANSFERRED',CR,LF,CR,LF,0    ;13 SPACES
  1757. ;
  1758. NMSTRNS:
  1759.     LDA    FCB        ;SAVE DRIVE NO.
  1760.     STA    DISKNO
  1761.     LXI    H,FCB        ;BLANK OUT FILE CONTROL BLOCKS
  1762.     CALL    INITFCBS
  1763.     LDA    DISKNO        ;PUT DRIVE NUMBER BACK
  1764.     STA    FCB
  1765.     LXI    H,RESTSN    ;RESTORE SECTORE NUMBERS..
  1766.     LXI    D,SECTNOB    ;..FOR NEW FILE TRANSFER.
  1767.     MVI    B,SECTNOE-SECTNOB ;ROUTINE ALSO DONE IN MENU.
  1768.     CALL    MOVE
  1769.     LDA    SENDFLG        ;GOES TO EITHER SEND OR..
  1770.     ORA    A        ;..RECEIVE FILE, DEPENDING..
  1771.     JNZ    SENDFIL        ;..UPON WHICH ROUTINE SET..
  1772.     JMP    RCVFIL        ;..THE FLAG IN    MULTI-FILE MODE.
  1773. ;
  1774. DONETCC:
  1775.     MVI    A,TRUE        ;INDICATE NO FILES BEING..
  1776.     STA    FSTFLG        ;RESET MULTIFILE TRANS
  1777.     STA    NFILFLG        ;..USED IN TERMINAL ROUTINE.
  1778.     CMA
  1779.     STA    SAVEFLG        ;STOP MEMORY SAVE IN TERM ROUTINE.
  1780.     LDA    VSEEFLG
  1781.     ORA    A
  1782.     JZ    DONETC
  1783.     LDA    QFLG
  1784.     ORA    A
  1785.     JZ    donetca
  1786. DONETC:
  1787.     CALL    ILPRT
  1788.     DB     CR,LF,'ALL TRANSFERS COMPLETED'
  1789.     DB    CR,LF,BELL,0
  1790. ;
  1791. donetca:
  1792.     lda    discflg        ;see if disconnect when thru
  1793.     ora    a
  1794.     jnz    donetce        ;no, don't disconnect
  1795. donetcb:
  1796.     call    ilprt
  1797.     db    cr,lf,'++PRESS RETURN TO DISCONNECT++',bell,cr,lf,0
  1798. ;
  1799.     mvi    c,rdcon
  1800.     call    bdos        ;wait for response
  1801.     cpi    0dh        ;carriage return
  1802.     jnz    donetcb        ;nope
  1803.     call    ilprt
  1804.     db    cr,lf,'++DISCONNECTED++',cr,lf,0
  1805. ;
  1806.     call    disconnt    ;hang-up the modem
  1807.     jmp    exit        ;go to CP/M
  1808. ;
  1809. DONETCE:
  1810.     LDA    TERMFLG        ;SEE IF RETURN TO..
  1811.     ORA    A        ;..TERMINAL MODE..
  1812.     JNZ    MENU        ;..AFTER X'FER.
  1813.     CALL    CRLF
  1814.     JMP    TERM
  1815. ;
  1816. INITMOD:            ;Put your USART set up routine here
  1817.                 ; if you need one.
  1818.     RET
  1819.  
  1820. ;
  1821. MOVEFCB:
  1822.     LXI    H,FCB+16
  1823.     LXI    D,FCB
  1824.     MVI    B,16
  1825.     CALL    MOVE
  1826.     XRA A
  1827.     STA    FCBSNO
  1828.     STA    FCBEXT
  1829.     RET
  1830. ;
  1831. SHOW:
  1832.     CPI    LF
  1833.     JZ    CTYPE
  1834.     CPI    CR
  1835.     JZ    CTYPE
  1836.     CPI    9
  1837.     JZ    CTYPE
  1838.     CPI    ' '
  1839.     JC    SHOWHEX
  1840.     CPI    7FH
  1841.     JC    CTYPE
  1842. SHOWHEX:
  1843.     PUSH    PSW
  1844.     MVI    A,'('
  1845.     CALL    CTYPE
  1846.     POP    PSW
  1847.     CALL    HEXO
  1848.     MVI    A,')'
  1849.     JMP    CTYPE
  1850. ;
  1851. CTYPE:
  1852.     PUSH    B
  1853.     PUSH    D
  1854.     PUSH    H
  1855.     MOV    E,A
  1856.     MVI    C,WRCON
  1857.     CALL    BDOS
  1858.     POP    H
  1859.     POP    D
  1860.     POP    B
  1861.     RET
  1862. ;
  1863. CRLF:
  1864.     PUSH    PSW
  1865.     MVI    A,CR
  1866.     CALL    TYPE
  1867.     MVI    A,LF
  1868.     CALL    TYPE
  1869.     POP    PSW
  1870.     RET
  1871. ;
  1872. TYPE:
  1873.     PUSH    PSW
  1874.     PUSH    B
  1875.     PUSH    D
  1876.     PUSH    H
  1877.     MOV    C,A
  1878. VTYPE:
  1879.     CALL    $-$
  1880.     POP    H
  1881.     POP    D
  1882.     POP    B
  1883.     POP    PSW
  1884.     RET
  1885. ;
  1886. STAT:
  1887.     PUSH    B
  1888.     PUSH    D
  1889.     PUSH    H
  1890. VSTAT:
  1891.     CALL    $-$
  1892.     POP    H
  1893.     POP    D
  1894.     POP    B
  1895.     ORA    A
  1896.     RET
  1897. ;
  1898. KEYIN:
  1899.     PUSH    B
  1900.     PUSH    D
  1901.     PUSH    H
  1902. VKEYIN:
  1903.     CALL    $-$
  1904.     POP    H
  1905.     POP    D
  1906.     POP    B
  1907.     RET
  1908. ;
  1909. UCASE:
  1910.     CPI    61H        ;CHANGES LOWER CASE CHARACTER..
  1911.     RC            ;..IN    A-REG TO UPPER CASE.
  1912.     CPI    7BH
  1913.     RNC
  1914.     ANI    5FH
  1915.     RET
  1916. ;
  1917. HEXO:
  1918.     PUSH    PSW
  1919.     RAR
  1920.     RAR
  1921.     RAR
  1922.     RAR
  1923.     CALL    NIBBL
  1924.     POP    PSW
  1925. NIBBL:
  1926.     ANI    0FH
  1927.     CPI    10
  1928.     JC    ISNUM
  1929.     ADI 7
  1930. ISNUM:
  1931.     ADI '0'
  1932.     JMP    TYPE
  1933. ;
  1934. ;RETURNS W/ ZERO SET IF RETRY ASKED. IF MULTI-FILE MODE, THEN
  1935. ;NO QUESTIONS ASKED, JUST QUIT
  1936.  
  1937. CKQUIT:
  1938.     LDA    BATCHFLG
  1939.     ORA    A
  1940.     JNZ    CKQTASK        ;ASK FOR RETRY
  1941.     INR    A        ;RESET ZERO FLG
  1942.     RET
  1943. CKQTASK:
  1944.     XRA A
  1945.     STA    ERRCT
  1946.     CALL    ILPRT
  1947.     DB    'MULTIPLE ERRORS ENCOUNTERED.',CR,LF
  1948.     DB    'TYPE Q TO QUIT, R TO RETRY:  ',BELL,0
  1949. ;
  1950.     CALL    KEYIN
  1951.     PUSH    PSW
  1952.     CALL    CRLF
  1953.     POP    PSW
  1954.     CALL    UCASE        ;INSTEAD OF "ANI        5FH"
  1955.     CPI    'R'
  1956.     RZ
  1957.     CPI    'Q'
  1958.     JNZ    CKQUIT
  1959.     ORA    A
  1960.     RET
  1961. ;
  1962. ILPRT:
  1963.     XTHL
  1964. ILPLP:
  1965.     MOV    A,M
  1966.     ORA    A
  1967.     JZ    ILPRET
  1968.     CALL    CTYPE
  1969.     INX    H
  1970.     JMP    ILPLP
  1971. ILPRET:
  1972.     XTHL
  1973.     RET
  1974. ;
  1975. PRTMSG:
  1976.     MVI    C,PRINT
  1977.     JMP    BDOS
  1978. ;
  1979. ERXIT:
  1980.     POP    D
  1981.     CALL    PRTMSG
  1982.     CALL    ILPRT
  1983.     DB    BELL,0
  1984. ;
  1985.     LDA    BATCHFLG
  1986.     ORA    A
  1987.     JNZ    DONETCE
  1988.     MVI    A,'Q'        ;RESET QFLG
  1989.     STA    QFLG
  1990.     JMP    ABORT        ;ABORT OTHER COMPUTER
  1991. ;
  1992. EXIT:
  1993.     LXI    D,80H
  1994.     MVI    C,STDMA
  1995.     CALL    BDOS
  1996.     JMP    0
  1997. ;
  1998. MOVE128:
  1999.     MVI    B,128
  2000. MOVE:
  2001.     MOV    A,M
  2002.     STAX D
  2003.     INX    H
  2004.     INX    D
  2005.     DCR    B
  2006.     JNZ    MOVE
  2007.     RET
  2008. ;
  2009. DISCONNT:        ;Insert your code here to hangup up a direct
  2010.             ; connect modem if you needed
  2011.     RET
  2012. ;
  2013. ;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH
  2014.  
  2015. SETFCB:
  2016.     LXI    D,CMDBUF
  2017.     LXI    H,FCB
  2018.     CALL    CPMLINE
  2019.     CALL    PROCOPT
  2020. ;
  2021. CHECKNM:
  2022.     LDA    FCB+1        ;CHECK ON THE PRIMARY OPTION
  2023.     CPI    'E'        ;RETURN IF ECHO OPTION
  2024.     RZ
  2025.     CPI    'M'        ;RETURN TO MENU
  2026.     RZ
  2027.  cpi 'H'        ;new h command inserted
  2028.  rz
  2029.     CPI    'C'
  2030.     RZ
  2031.     CPI    'T'
  2032.     JZ    TERMSEL
  2033.     CPI    'S'
  2034.     JZ    CKFILE
  2035.     CPI    'R'
  2036.     JNZ    BDOPT
  2037.     LDA    BATCHFLG    ;IF MULT FILE MODE, THEN..
  2038.     ORA    A        ;..RECV OPT DOES NOT NEED..
  2039.     RZ            ;..NAME.
  2040.     JMP    CKFILE
  2041. ;
  2042. BDOPT:
  2043.     CALL    ILPRT
  2044.     DB    CR,LF,'++Bad Option++',CR,LF,0
  2045. ;
  2046.     JMP    REENT
  2047. ;
  2048. CKFILE:
  2049.     LDA    FCB+17        ;IF OPTION THAT NEEDS FILE NAME,..
  2050.     CPI    ' '        ;..THEN CHECK TO SEE IF NAME..
  2051.     RNZ            ;..EXISTS. IF NOT..
  2052. REENT:
  2053.     CALL    ILPRT        ;..DO EVERYTHING OVER.
  2054.     DB    CR,LF,'Re-enter PRIMARY option and file name only: ',BELL,0
  2055. ;
  2056.     LXI    D,CMDBUF
  2057.     CALL    INBUFF
  2058.     JMP    SETFCB
  2059. ;
  2060. TERMSEL:
  2061.     LDA    FCB+17
  2062.     CPI    ' '
  2063.     JNZ    SAVAGN
  2064.     MVI    A,FALSE
  2065.     STA    SAVEFLG
  2066.     MVI    A,TRUE
  2067.     STA    NFILFLG
  2068.     CMA
  2069.     RET
  2070. ;
  2071. SAVAGN:
  2072.     MVI    A,FALSE
  2073.     STA    NFILFLG
  2074.     RET
  2075. ;
  2076. MENU:
  2077.     LXI    H,RESTSN    ;RESTORE SECTORE NUMBERS..
  2078.     LXI    D,SECTNOB    ;..FOR NEW FILE TRANSFER.
  2079.     MVI    B,SECTNOE-SECTNOB
  2080.     CALL    MOVE
  2081.     LXI    H,RESTROPT    ;RESTORE OPTION TABLE
  2082.     LXI    D,OPTBL
  2083.     MVI    B,OPTBE-OPTBL
  2084.     CALL    MOVE
  2085.     MVI    A,0
  2086.     STA    MFFLG1        ;RESET MFACCESS ROUTINE..
  2087.     CMA            ;..AND MULTI TRANS IN    CASE..
  2088.     STA    FSTFLG        ;..OF ABORT.
  2089. MENU1:
  2090.  mvi a,0ffh
  2091.  sta echfl+haven-rcan ;handover echo flag restored if nec
  2092.     LDA    XPRFLG        ;TEST IF MENU SHOULD BE SHOWN
  2093.     ORA    A
  2094.     JNZ    XPRT
  2095.     CALL    ILPRT
  2096.     DB    CR,LF,CR,LF
  2097.     DB    'WRT   - Write file to disk (from terminal mode)',CR,LF
  2098.     DB    'DEL   - Erase present file (from terminal mode)',CR,LF
  2099.     DB    'RET   - Return to terminal mode with no loss of data',CR,LF
  2100.     DB    'DSC   - Disconnect',CR,LF
  2101.     DB    'XPR   - Toggle expert mode (Menu on/off)',CR,LF
  2102.     DB    'DIR   - List directory (may specify drive)',CR,LF
  2103.     DB    'CPM   - Exit to CP/M',CR,LF
  2104.     DB    'S     - Send CP/M file',CR,LF
  2105.     DB    'R     - Receive CP/M file',CR,LF
  2106.     DB    'T     - Terminal mode (optional file name)',CR,LF
  2107.     DB    'E     - Terminal mode with echo',CR,LF
  2108.     db    'H     - Hand over to remote computer',cr,lf,0
  2109. ;
  2110. XPRT:
  2111.     CALL    ILPRT
  2112.     DB    CR,LF,CR,LF,'DEFAULT DRIVE: ',0
  2113. ;
  2114.     MVI    C,25        ;CURRENT DISK FUNCTION
  2115.     CALL    BDOS
  2116.     ADI    41H        ;MAKE ASCII
  2117.     CALL    TYPE
  2118.     CALL    ILPRT
  2119.     DB    CR,LF,CR,LF,'Command: '
  2120.     DB    0
  2121. ;
  2122. GETCMD:
  2123.     LXI    D,CMDBUF    ;ENTER COMMAND
  2124.     CALL    INBUFF
  2125.     CALL    CRLF
  2126.     LXI    D,CMDBUF+2    ;POINT TO COMMAND
  2127.     CALL    ILCOMP
  2128.     DB    'CPM',0
  2129. ;
  2130.     JNC    EXIT
  2131.     CALL    ILCOMP
  2132.     DB    'DIR',0
  2133. ;
  2134.     JNC    DIR
  2135.     CALL    ILCOMP
  2136.     DB    'RET',0
  2137. ;
  2138.     JC    NXTOPT1        ;CARRY SET = NO MATCH
  2139.     LHLD    HLSAVE        ;RETURN TO TERMINAL..
  2140.     JMP    TERM        ;..MODE WITH SAVE OPTION..
  2141.                 ;..IF PREVIOUSLY ENABLED.
  2142. ;
  2143. NXTOPT1:
  2144.     CALL    ILCOMP        ;DE SET FROM 1ST ILCOMP CALL
  2145.     DB    'DSC',0
  2146. ;
  2147.     JNC    DISCON1
  2148.     CALL    ILCOMP
  2149.     DB    'WRT',0
  2150. ;
  2151.     JNC    WRTFIL
  2152.     CALL    ILCOMP
  2153.     DB    'XPR',0
  2154. ;
  2155.     JNC    XPRMODE
  2156.     CALL    ILCOMP
  2157.     DB    'DEL',0
  2158. ;
  2159.     JNC    NEWFILE
  2160. NXTOPT2:
  2161.     PUSH    H
  2162.     LDA    CMDBUF+2
  2163.     LXI    H,COMPLIST
  2164.     CALL    COMPARE        ;COMPARES LIST POINTED TO BY HL..
  2165.     POP    H        ;..TO CHAR IN    A-REG.
  2166.     JC    MENU1        ;CARRY SET = NO MATCH
  2167. DOOPT:
  2168.     PUSH    H        ;LOAD ORIGINAL FCB WITH TRANSFER..
  2169.     CALL    SETFCB        ;..CMDS AND GO TO BEGINNING OF..
  2170.     POP    H        ;..PROGRAM. WILL FOLLOW SAME LOGIC..
  2171.     JMP    RESTART        ;..AS IF PROGRAM WERE CALLED WITH..
  2172.                 ;..CP/M COMMAND LINE.
  2173. ;
  2174. DISCON1:
  2175.     CALL    DISCONNT
  2176.     CALL    ILPRT
  2177.     DB    CR,LF,'++DISCONNECTED++',CR,LF,BELL,0
  2178. ;
  2179.     JMP    MENU1
  2180. ;
  2181. DIR:
  2182.     CALL    DIRLST
  2183.     JMP    XPRT
  2184. ;
  2185. NEWFILE:
  2186.     LDA    FCB3+1
  2187.     CPI    ' '
  2188.     JZ    MENU1        ;IF NO FILE, DON'T ERASE
  2189.     LXI    D,FCB3
  2190.     MVI    C,ERASE
  2191.     CALL    BDOSRT
  2192.     MVI    A,TRUE        ;DO NOT ALLOW TERMINAL..
  2193.     STA    NFILFLG        ;..SAVE SINCE NO FILE..
  2194.     CMA            ;..SPECIFIED.
  2195.     STA    SAVEFLG
  2196.     LXI    H,FCB3
  2197.     CALL    INITFCBS
  2198.     JMP    MENU1
  2199. ;
  2200. WRTFIL:
  2201.     LDA    NFILFLG
  2202.     CPI    TRUE
  2203.     JZ    MENU1
  2204.     LDA    FCB3+1        ;CHECK THAT FILE WAS REQUESTED
  2205.     CPI    ' '
  2206.     JZ    MENU1
  2207.     LHLD    HLSAVE
  2208.     CALL    NUMRECS        ;DISK WRITE ROUTINE AS USED IN..
  2209.     CALL    WRTDSK        ;..IN THE INTDSKSV ROUTINE.
  2210.     CALL    CLOSE3
  2211.     MVI    A,TRUE
  2212.     STA    NFILFLG
  2213.     CMA
  2214.     STA    SAVEFLG
  2215.     LXI    H,FCB3
  2216.     CALL    INITFCBS    ;BLANK OUT FCB SO WRITTEN FILE..
  2217.     JMP    MENU1        ;..CAN'T BE ERASED.
  2218. ;
  2219. XPRMODE:
  2220.     LDA    XPRFLG
  2221.     CMA
  2222.     STA    XPRFLG
  2223.     JMP    MENU1
  2224. ;
  2225. COMPARE:
  2226.     MOV    B,M        ;COMPARES A-REG WITH LIST..
  2227. COMPLP:
  2228.     INX    H        ;..ADDRESSED BY HL. FIRST ELEMENT..
  2229.     CMP    M        ;..OF LIST MUST BE NUMBER OF ELEMENTS..
  2230.     JZ    VALID        ;..BEING COMPARED. RETURNS WITH..
  2231.     DCR    B        ;..CARRY SET IF A-REG DOES NOT..
  2232.     JNZ    COMPLP        ;.. CONTAIN    AN ELEMENT IN    LIST.
  2233.     STC
  2234. VALID:
  2235.     RET
  2236.  
  2237. COMPLIST:
  2238.     DB    5, 'S', 'R', 'T', 'E', 'H'    ;handover instn added
  2239.  
  2240. ILCOMP:
  2241.     INLNCOMP    ;A MACRO IN MACROS.LIB
  2242. ;
  2243. INBUFF:
  2244.     INBUF        ;A MACRO IN    "MACROS.LIB"
  2245. ;
  2246. ;IF ABOVE ROUTINE DOES NOT LET YOU EDIT IN A PROPER MANNER,
  2247. ;THEN THE MACRO MAY BE SUBSTITUTED FOR THE FOLLOWING ROUTINE:
  2248.  
  2249. ;INBUFF MVI    C,RDBUF
  2250. ;    CALL    BDOSRT
  2251. ;    RET        ;BUT BE CAREFUL OF CONTROL-C
  2252.  
  2253.  
  2254. CPMLINE:
  2255.     CMDLINE        ;A MACRO IN    "MACROS.LIB"
  2256. ;
  2257. DIRLST:
  2258.     DIRLIST        ;A MACRO IN    "MACROS.LIB"
  2259. ;
  2260. NFILFLG:
  2261.     DB    FALSE    ;NORMALLY SET TO FALSE. ALLOWS WRITE TO..
  2262.             ;..MEMORY IN    TERMINAL MODE.
  2263. ;
  2264. OPTION:
  2265.     DB    0
  2266. ;
  2267. OPTBL:
  2268. ANSWFLG DB    'A'
  2269. DISCFLG DB    'D'
  2270. ORIGFLG DB    'O'
  2271. QFLG    DB    'Q'
  2272. RSEEFLG DB    'R'
  2273. SSEEFLG DB    'S'
  2274. VSEEFLG DB    'V'
  2275. TERMFLG DB    'T'
  2276. BATCHFLG DS     1        ;SET TO 'B' BY MENU. DOES NOT ALLOW MULTI-..
  2277. OPTBE    EQU    $        ;..FILE XFER WHEN PROGRAM INITIALLY CALLED.
  2278. ;
  2279. RESTROPT:            ;MUST BE IN SAME ORDER AS TABLE ABOVE
  2280.     DB    'A','D','O','Q','R','S','V','T','B'
  2281. ;
  2282. RESTSN    DB    0,0,0,0
  2283.     DW    DBUF
  2284.     DB    0
  2285.     DB    0
  2286. ;
  2287. SECTNOB:
  2288. RCVSNO    DB    0
  2289. SECTNO    DB    0
  2290. ERRCT    DB    0
  2291. EOFLG    DB    0
  2292. SECPTR    DW    DBUF
  2293. SECINBF DB    0
  2294. DATAFLG DB    0
  2295. SECTNOE EQU    $
  2296.  
  2297. BADOPT:
  2298.     CALL    ILPRT
  2299.     DB    'INVALID OPTION',CR,LF,BELL,0
  2300. ;
  2301.     JMP    MENU
  2302. ;
  2303. FSTFLG    DB    TRUE
  2304.  
  2305. CMDBUF    DB    80H,0
  2306.     DS    80H
  2307. BADLIB    DB    CR,LF,'++BAD LIBRARY NUMBER CALLED++',CR,LF,'$'
  2308. HLSAVE    DS    2
  2309. DISKNO    DS    1
  2310. SENDFLG DS    1
  2311. NBSAVE    DS    2
  2312. BGNMS    DS    2
  2313. FILECT    DS    1
  2314. NAMECT    DS    1
  2315.  
  2316.     DS    40
  2317. STACK    DS    2
  2318. FCB3    DS    33
  2319. FCBBUF    DS    15
  2320.  
  2321. ;    BDOS EQUATES
  2322.  
  2323. RDCON    EQU    1
  2324. WRCON    EQU    2
  2325. PRINT    EQU    9
  2326. RDBUF    EQU    10
  2327. CONST    EQU    11
  2328. OPEN    EQU    15
  2329. CLOSE    EQU    16
  2330. SRCHF    EQU    17
  2331. SRCHN    EQU    18
  2332. ERASE    EQU    19
  2333. READ    EQU    20
  2334. WRITE    EQU    21
  2335. MAKE    EQU    22
  2336. REN    EQU    23
  2337. STDMA    EQU    26
  2338. BDOS    EQU    5
  2339. REIPL    EQU    0
  2340. FCB    EQU    5CH
  2341. FCBEXT    EQU    FCB+12
  2342. FCBSNO    EQU    FCB+32
  2343. FCBRNO    EQU    FCB+32
  2344. FCB2    EQU    6CH
  2345.  
  2346. ;Handover routines follow
  2347.  
  2348.  ;sr sets up handover on h instn
  2349. rgiv: call qhando ;rets z if handed over already
  2350.  jz menu ;if so
  2351.  lxi h,rcan ;will relocate prog from rcan onwards
  2352.  lxi d,haven ;put it here
  2353.  mvi b,0 ;to move 100h
  2354.  call move
  2355.  lda 101h ;byte to check valid on exit
  2356.  mov l,a
  2357.  lda rgiv ;and another
  2358.  mov h,a
  2359.  shld chbyts+haven-rcan ;keep them here
  2360.  lhld base+1 ;bios+3
  2361.  lxi d,4 ;will switch jp table addresses
  2362.  dad d ;const jp adr location
  2363.  lxi b,cstrt+haven-rcan ;to switch with const jp adr
  2364.  mov e,m
  2365.  mov m,c
  2366.  inx h
  2367.  mov d,m
  2368.  mov m,b
  2369.  xchg
  2370.  shld constx+haven-rcan ;conin jp adr kept
  2371.  xchg            ;so we can replace
  2372.  inx h
  2373.  inx h ;conin jp adr location
  2374.  lxi b,cinrt+haven-rcan ;to switch
  2375.  mov e,m
  2376.  mov m,c
  2377.  inx h
  2378.  mov d,m
  2379.  mov m,b
  2380.  xchg
  2381.  shld coninx+haven-rcan ;conin jp adr kept
  2382.  xchg
  2383.  inx h
  2384.  inx h ;conout jp adr location
  2385.  lxi b,coutrt+haven-rcan ;to switch
  2386.  mov e,m
  2387.  mov m,c
  2388.  inx h
  2389.  mov d,m
  2390.  mov m,b
  2391.  xchg
  2392.  shld conotx+haven-rcan ;conout jp adr kept
  2393.  call ilprt
  2394.  db 0dh,0ah,'Handing over',0
  2395.     ;msg will now be sent to modem too
  2396.  jmp xprt ;set up finished, back to command level
  2397.  
  2398.  ;sr ret z if handed over
  2399. qhando: push b
  2400.  push h
  2401.  mov b,a
  2402.  lxi h,cstrt+haven-rcan
  2403.  mov a,h ;hibyte of cstrt adr
  2404.  lhld 1
  2405.  mvi l,8 ;adr of const jp hibyte
  2406.  cmp m ;has cstrt adr been loaded?
  2407.  mov a,b
  2408.  pop h
  2409.  pop b
  2410.  ret
  2411.  
  2412. ;The remainder is relocated at HAVEN so that
  2413. ;the main program can be overwritten without a crash
  2414.  
  2415. ;All adr refs to it have the offset HAVEN-RCAN added to them
  2416.  
  2417.  ;sr cancel handover
  2418. rcan: lhld base+1 ;bios+3
  2419.  lxi d,4
  2420.  dad d ;const jp adr location
  2421.  xchg
  2422.  lhld constx+haven-rcan ;orig value stored here
  2423.  xchg
  2424.  mov m,e ;put it back
  2425.  inx h
  2426.  mov m,d
  2427.  inx h
  2428.  inx h ;conin jp adr location
  2429.  xchg
  2430.  lhld coninx+haven-rcan
  2431.  xchg
  2432.  mov m,e
  2433.  inx h
  2434.  mov m,d
  2435.  inx h
  2436.  inx h ;conout jp adr location
  2437.  xchg
  2438.  lhld conotx+haven-rcan
  2439.  xchg
  2440.  mov m,e
  2441.  inx h
  2442.  mov m,d
  2443.  lhld chbyts+haven-rcan ;now see if modem7 prog overwritten
  2444.  lda 101h
  2445.  cmp l
  2446.  jnz base ;if so go to cpm warm boot
  2447.  lda rgiv ;the other checkbyte
  2448.  cmp h
  2449.  jnz base
  2450.  lxi sp,stack
  2451.  jmp menu ;otherwise back to modem7
  2452.  
  2453.  ;replaces const
  2454. cstrt: lxi h,cst2+haven-rcan
  2455.  push h ;retadr
  2456.  lhld constx+haven-rcan
  2457.  pchl ;=call const
  2458. cst2: ora a
  2459.  jz cst3a+haven-rcan ;jp if no key
  2460.  lxi h,cst3+haven-rcan
  2461.  push h ;retadr
  2462.  lhld coninx+haven-rcan
  2463.  pchl ;=call conin
  2464. cst3: cpi eschar ;escape from handover?
  2465.  jz rcan+haven-rcan
  2466.  sta xbuf+haven-rcan ;or keep char
  2467.  jmp cst4+haven-rcan
  2468. cst3a: lda xbuf+haven-rcan
  2469.  ora a
  2470.  jz cst5+haven-rcan
  2471. cst4: mvi a,0ffh ;indicate ready
  2472.  ret
  2473. cst5: call minst+haven-rcan ;ready to receive?
  2474.  jz cst4+haven-rcan ;jp if yes
  2475.  xra a ;no char
  2476.  ret
  2477.  
  2478.  ;replaces conin
  2479. cinrt: call cstrt+haven-rcan ;also handles esc
  2480.  ora a
  2481.  jz cinrt+haven-rcan ;loop till ready
  2482.  lxi h,xbuf+haven-rcan ;see if key char
  2483.  mov a,m
  2484.  mvi m,0 ;null the buf anyway
  2485.  ora a
  2486.  rnz ;finished if it wasn't null
  2487.  call min+haven-rcan ;else must be modem inp
  2488.  cpi ' '
  2489.  rc ;finished if null or actual control
  2490.  cpi '^' ;will it be ctrl seq?
  2491.  mvi b,1fh ;ctrl mask
  2492.  jz cin2+haven-rcan
  2493.  mvi b,7fh ;or null mask
  2494. cin2: lxi h,ctrlfl+haven-rcan ;adr of ctrl mask
  2495.  ana m ;use it
  2496.  mov m,b ;and update it
  2497.  ret ;masked char in a
  2498.  
  2499.  ;replaces conout
  2500. coutrt: push b
  2501.  call cstrt+haven-rcan ;handles esc
  2502.  pop b
  2503.  push b
  2504.  lxi h,cout2+haven-rcan
  2505.  push h ;retadr
  2506.  lhld conotx+haven-rcan
  2507.  pchl ;=call conout
  2508. cout2: pop b
  2509.  lda echfl+haven-rcan ;echo flag
  2510.  ora a
  2511.  rz ;no echo unless set
  2512.  push b
  2513.  call coutm+haven-rcan ;send echo
  2514.  pop b
  2515.  mov a,c
  2516.  sui 0ah
  2517.  rnz
  2518.  mov c,a ;null to send
  2519.  lda lfnulls ;send this no of nulls after a linefeed
  2520.  mov b,a
  2521.  dcr b
  2522. cout3: call coutm+haven-rcan
  2523.  dcr b
  2524.  jp cout3+haven-rcan
  2525.  mvi c,'/' ;send for start of remote user's line
  2526.  
  2527. coutm: call moust+haven-rcan ;ready to send?
  2528.  jnz coutm+haven-rcan ;if not, loop
  2529.  mov a,c
  2530.  jmp mout+haven-rcan ;send
  2531.  
  2532.  ;sr ret z if modem inp ready
  2533. minst: xra a
  2534.  out mstatp
  2535.  in mstatp
  2536.  cma
  2537.  ani 1
  2538.  ret
  2539.  
  2540.  ;sr ret z if modem outp ready
  2541. moust: mvi a,10h
  2542.  out mstatp
  2543.  in mstatp
  2544.  cma
  2545.  ani 0ch
  2546.  ret
  2547.  
  2548.  ;sr inp from modem
  2549. min: in mdatp
  2550.  ret
  2551.  
  2552.  ;sr outp to modem
  2553. mout: out mdatp
  2554.  ret
  2555.  
  2556. constx: dw 0 ;to keep const jp adr
  2557. coninx: dw 0 ;ditto conin
  2558. conotx: dw 0 ;ditto conout
  2559. xbuf: db 0 ;key char buffer
  2560. chbyts: dw 0 ;bytes stashed to check for overwriting
  2561. ctrlfl: db 7fh ;ctrl mask, changed to 1f following '^'
  2562. echfl: db 0ffh ;echo flag, zeroed during file transfer
  2563. lfnulls: db 3 ;nulls to remote computer after linefeed
  2564.  
  2565. DBUF    DS    16*128        ;16 SECTOR DISK BUFFER
  2566. NAMEBUF DS    1        ;BUFFER FOR NAMES IN    BATCH MODE. OVERFLOWS..
  2567.                 ;..ABOVE PROGRAM CODE.
  2568. LAST:
  2569.     END    start
  2570.