home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG084.ARK / MODEM765.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  64KB  |  3,333 lines

  1.     TITLE    'CP/M MODEM PROGRAM Version 7.65'
  2. ;
  3. ;THE FOLLOWING IS AN EXTENSIVE REVISION OF THE CP/M MODEM PROGRAM
  4. ;CREATED BY WARD CHRISTENSEN FOR THE CP/M USERS LIBRARY.
  5. ;IT ALSO INCORPORATES ROUTINES FOUND IN THE POTOMAC MICRO-MAGIC MODEM
  6. ;MANUAL WHICH MAY BE USED IF YOU HAVE A PMMI MODEM BOARD.
  7.  
  8. ;        ******* N O T I C E *********
  9. ;When using this modem program, you can avoid its shakey
  10. ;features (which show up primarily in batch mode) by always
  11. ;using the O or A option even if either modem is already in the
  12. ;originate or answer mode;  and, by always declaring the speed
  13. ;option such as .300, .600, etc.
  14.         *****************************
  15.  
  16. ;05/29/82  Moved fix log to history file.  MODEM7xx.HIS
  17.                                RLP
  18.  
  19.  
  20.     MACLIB MODEM76    ;CONTAINS CMDLINE, INBUF, INLNCOMP, @7.61
  21.         ;DIR, AND MFACCESS ROUTINES
  22.         ;changed to MODEM.LIB by Jim Mills
  23.         ;to differentiate from other 'MACROS.LIB'
  24.  
  25.  
  26. TRUE    EQU 0FFH
  27. FALSE    EQU 0
  28.  
  29. CPM2X        EQU TRUE ;true if CP/M 2.X
  30.              ;false if CP/M 1.4 OR CDOS
  31. DBUFSIZ        EQU 16     ;BUFFER SIZE IN KBYTES
  32.  
  33. ; PMMI EQUATES
  34.  
  35. PORT    EQU    0c0H    ;PMMI BASE ADDRESS
  36.  
  37. MODCTLP    EQU    PORT    ;MODEM CONTROL PORT
  38. MODSNDB    EQU    1    ;MODEM SEND BIT (XMIT BUFF EMPTY)
  39. MODSNDR    EQU    1    ;MODEM SEND READY
  40. MODRCVB    EQU    2    ;MODEM RECEIVE BIT (DAV)
  41. MODRCVR    EQU    2    ;MODEM RECEIVE READY
  42. MODDATP    EQU    PORT+1    ;MODEM DATA PORT
  43. BAUDRP    EQU    PORT+2    ;BAUD RATE PORT
  44. MODCTL2    EQU    PORT+3    ;2ND MODEM CONTROL PORT
  45. ORIGMOD    EQU    1DH    ;ORIGINATE MODE
  46. ANSWMOD    EQU    1EH    ;ANSWER MODE
  47. BRKMSK    EQU    0FBH    ;MASK TO SET BREAK
  48. FRMER    EQU    20H    ;FRAMING ERROR MASK
  49. ORUNER    EQU    10H    ;OVERRUN ERROR MASK
  50. PARER    EQU    08H    ;PARITY ERROR MASK
  51. ODPARMSK EQU    0CFH    ;MASK TO SET ODD PARITY
  52. EVPARMSK EQU    20H    ;MASK TO SET EVEN PARITY
  53. NOPARMSK EQU    10H    ;MASK TO RESET TO NO PARITY
  54. ERRCDMSK EQU    38H    ;MASK FOR ALL BITS EXCEPT ERROR CODES
  55.  
  56. WAITCTS    EQU    255    ;number of seconds X 10 to wait for computer
  57.             ;tone after pmmi auto-dial function, 255 MAX.
  58.  
  59. CHGBAUD    EQU 'P'-40H    ;USED IN TERMINAL MODE TO CHANGE
  60.             ;BAUD RATE 'ON THE FLY'
  61. ERRLIM    EQU 10        ;NUMBER OF TIMES TO RETRY
  62.             ;SEND/RECEIVE ERRORS BEFORE QUIT
  63. BRKCHR    EQU '@'-40H    ; ^@ = TRANSMIT "BREAK" WITH PMMI
  64. EXITCHR    EQU 'E'-40H    ; ^E = EXIT WITHOUT DISCONNECT
  65. DISCCHR    EQU 'D'-40H    ; ^D = DISCONNECT
  66. TRANCHR    EQU 'T'-40H    ; ^T = TRANSFER CHARACTER
  67. CAN    EQU 'X'-40H    ; ^X = CANCEL SEND/RECEIVE
  68. EOFCHAR    EQU 'Z'-40H    ; ^Z = END OF FILE
  69. SAVECHR    EQU 'Y'-40H    ; ^Y = SAVE CHARACTER
  70. XOFF    EQU 'S'-40H    ; ^S = XOFF CHARACTER
  71. XON    EQU 'Q'-40H    ; ^Q = XON CHARACTER
  72. EXTCHR    EQU '^'-40H    ; ^^ = SEND NXT CHR
  73. SOH    EQU 1        ; START OF HEADER
  74. EOT    EQU 4        ; END OF TEXT
  75. ACK    EQU 6        ; ACKNOWLEDGE
  76. NAK    EQU 15H        ; NOT ACKNOWLEDGE
  77. CRC    EQU 'C'        ;USED TO RQST CRC INSTEAD OF CLSUM
  78. BDNMCH    EQU 75H        ; BAD NAME MATCH
  79. OKNMCH    EQU ACK        ; OKAY NAME MATCH
  80. LF    EQU 10        ; LINEFEED
  81. CR    EQU 13        ; CARRIAGE RETURN
  82. BELL    EQU 7        ; BELL CHARACTER
  83. FRONTPAN EQU 0FFH    ; IMSAI FRONT PANEL
  84.  
  85. BOTTRAM    SET LAST+100H AND 0FF00H
  86.  
  87.     ORG 100H
  88.  
  89.     JMP    START
  90.  
  91. ;THESE ROUTINES ARE AT THE BEGINNING OF THE PROGRAM SO
  92. ;THEY CAN BE PATCHED BY A MONITER WITHOUT RE-ASSEMBLING
  93. ;THE PROGRAM.
  94.  
  95. PMMIBYTE:    DB  TRUE    ;true=pmmi modem
  96. IMSAIBYTE:    DB  FALSE    ;true=imsai front panel
  97. FASTCLK:    DB  TRUE    ;4 MHz or greater
  98. BAKUPBYTE:    DB  FALSE    ;true=make .BAK file
  99. XPRFLG:        DB  TRUE    ;true=no menu, false=print menu
  100. PULSERATE:    DB  125        ;125 FOR 20PPS, 250 FOR 10PPS dialing
  101. SAVCCP:        DB  false    ;true=do not overwrite CCP
  102. CLDBOOT:    DW  0FC00H    ;put your coldboot entry here. ;@7.63
  103. IN$MODCTLP:    IN  MODCTLP ! RET ;in modem control port
  104. OUT$MODDATP:    OUT MODDATP ! RET ;out modem data port
  105. ANI$MODSNDB:    ANI MODSNDB ! RET ;bit to test for send ready
  106. CPI$MODSNDR:    CPI MODSNDR ! RET ;value of send bit when ready
  107. IN$MODDATP:    IN  MODDATP ! RET ;in modem data port
  108. ANI$MODRCVB:    ANI MODRCVB ! RET ;bit to test for receive ready
  109. CPI$MODRCVR:    CPI MODRCVR ! RET ;value of receive bit when ready
  110. JMP$INITMOD:    JMP INITMOD      ;to initialize port, if necessary
  111. IN$BAUDRP:    IN  BAUDRP  ! RET ;in baudrate port
  112. OUT$BAUDRP:    OUT BAUDRP  ! RET ;out baudrate port
  113. OUT$MODCTL2:    OUT MODCTL2 ! RET ;out modem control port #2
  114. OUT$MODCTLP:    OUT MODCTLP ! STA UARTCTLB ! RET ;out modem control port
  115.                          ;and store control byte
  116.  
  117. CRFLAG:    DB 0    ;CONTINUOUS REDIAL FLAG
  118.  
  119. ; PHONE NUMBER LIBRARY TABLE FOR DIALING FROM LIBRARY
  120. ; OF NUMBERS STORED IN THESE DB'S AT ASSEMBLY-TIME.
  121. ; EACH DB MUST BE 30 CHARACTERS LONG FOR PROPER OPERATION.
  122. ; A 'DB 0' INDICATES NO DIALING, PROGRAM WILL DISCONNECT
  123. ; AND RETURN TO COMMAND MODE.  LAST DB MUST BE DB 0. UP TO
  124. ; 26 NUMBERS ARE ALLOWED.
  125.  
  126. NUMBLIB:
  127. ;    '----5---10---15---20---25---30'
  128. DB    'A=Amrad           703-734-1387'    ;'A'
  129. DB    'B=Ben Bronson     312-955-4493'    ;'B'
  130. DB    'C=                            '    ;'C'
  131. DB    'D=C.Cliff C.C.    312-234-9257'    ;'D'
  132. DB    'E=Ron Fowler     313-729-1905R'    ;'E'
  133. DB    'F=                            '    ;'F'
  134. DB    'G=Gasnet NASA     301-344-9156'    ;'G'
  135. DB    'H=Dave Hardy      313-846-6127'    ;'H'
  136. DB    'I=Wayne Hammerly  301-953-3753'    ;'I'
  137. DB    'J=RBBS Pasadena   213-356-1034'    ;'J'
  138. DB    'K=David Kozinn    216-334-4604'    ;'K'
  139. DB    'L=Program Store   202-337-4694'    ;'L'
  140. DB    'M=Kelly Smith     805-527-9321'    ;'M'
  141. DB    'N=                            '    ;'N'
  142. DB    'O=SYSOP Sys       313-885-0506'    ;'O'
  143. DB    'P=CBBS Pasadena   213-799-1632'    ;'P'
  144. DB    'Q=R.Plouffe       703-524-2549'    ;'Q'
  145. DB    'R=Bruce Ratoff    201-272-1874'    ;'R'
  146. DB    'S=K.Peterson     313-759-6569R'    ;'S'
  147. DB    'T=Tech. CBBS      313-846-6127'    ;'T'
  148. DB    'U=PMMI            703-379-0303'    ;'U'
  149. DB    'V=                            '    ;'V'
  150. DB    'W=                            '    ;'W'
  151. DB    'X=                            '    ;'X'
  152. DB    'Y=                            '    ;'Y'
  153. DB    'Z=                            '    ;'Z'
  154. DB    0                    ; end
  155.  
  156. START:    LXI    H,0
  157.     DAD    SP    ;GET CP/M'S STACK
  158.     SHLD    STACK    ;SAVE IT
  159.     LXI    SP,STACK ;START LOCAL STACK
  160.  
  161.     CALL    START1
  162.  
  163.     DB CR,LF,'MODEM 7.65 as of 05/29/82',cr,lf
  164.     DB 'Originally Written by Ward Christensen',cr,lf,'$'
  165.  
  166.  
  167. START1:    POP    D    ;GET ADDRESS OF ABOVE MESSAGE
  168.     MVI    C,PRINT    ; 9
  169.     CALL    BDOS
  170.  
  171.     CALL    INITADR    ;INITIALIZE ADDRESSES
  172.     MVI    A,TRUE    ; 0FFH
  173.     STA    NFILFLG
  174.     CMA        ; 0
  175.     STA    SAVEFLG
  176.     OUT    FRONTPAN ; IMSAI
  177.  
  178.     CALL    PROCOPT    ;PROCESS CONTROL OPTIONS
  179.     LDA    UARTFLG    ; @7.61
  180.     ORA    A    ; @7.5 
  181.     MVI    A,ANSWMOD ; @7.5
  182.     STA    UARTCTLB  ; @7.5
  183.     JNZ    START2    ; @7.5
  184.     MVI    A,ORIGMOD ; @7.5
  185.     STA    UARTCTLB  ; @7.5
  186. START2:    LDA    OPTION    ;GET MAIN OPTION
  187.     CPI    'X'    ;EXPERT FLAG?
  188.     JNZ    RESTART    ;NO
  189.     MVI    A,TRUE    ;YES
  190.     STA    XPRFLG    ;MAKE EXPERT
  191.     JMP    MENU
  192.  
  193. RESTART:
  194.     LDA    OPTION    ;GET MAIN OPTION
  195.     MOV    B,A    ;SAVE IT
  196.     LDA    PMMIBYTE ;PMMI?
  197.     ORA    A    ;SET FLAGS
  198.     MOV    A,B    ;GET OPTION BACK
  199.     JZ    S1    ;NOT PMMI
  200.     CPI    'C'    ;CALL (DIAL) FUNCTION?
  201.     JZ    DIALPL    ;YES, GO TO IT
  202.  
  203. S1:    CPI    ' '    ;NO OPTION SPEC'D?
  204.     JZ    MENU    ;TRUE, GO MENU
  205.     CPI    'M'    ;MENU ASKED FOR?
  206.     JZ    MENU2    ;YES, GO MENU
  207.     CALL    JMP$INITMOD
  208.     CALL    MOVEFCB
  209.     MVI    A,FALSE
  210.     STA    NFILFLG
  211.  
  212.     CALL    IN$MODDATP ;GOBBLE UP GARBAGE..
  213.     CALL    IN$MODDATP ;..CHARACTERS ON LINE
  214.  
  215.     LDA    OPTION    ;PROCESS MAIN OPTION
  216.     CPI    'E'    ;ECHO MODE?
  217.     JZ    TRMECHO    ;YES
  218.     CPI    'T'    ;TERMINAL MODE?
  219.     JZ    DSKSAVE    ;YES
  220.     CPI    'S'    ;SEND A FILE?
  221.     JZ    SENDFIL    ;YES
  222.     CPI    'R'    ;RECEIVE A FILE?
  223.     JZ    RCVFIL    ;YES
  224.     CPI    'D'    ;DISCONNECT?
  225.     JZ    DISCON1    ;YES, DISCONNECT & GO MENU
  226.     JMP    MENU    ;NO OPTION SPEC'D, GO MENU
  227.  
  228. ;REVISED TERMINAL ROUTINE ALLOWING MEMORY SAVE
  229.  
  230. DSKSAVE:
  231.     LDA    NFILFLG    ;NEW FILE FLAG
  232.     CPI    TRUE    ;OFFH? (TRUE=NORMAL TERMINAL MODE)
  233.     JZ    TERM    ;YES
  234.     LDA    FCB+1    ;FIRST CHAR OF FILENAME
  235.     CPI    ' '    ;FILE SPEC'D
  236.     JNZ    GOODNM    ;YES, GOOD NAME
  237.     MVI    A,TRUE    ;0FFH
  238.     STA    NFILFLG    ;
  239.     OUT    FRONTPAN ;0FFH PORT FOR IMSAI FRONT PANEL
  240.     CMA        ; 0
  241.     STA    SAVEFLG    ;
  242.     JMP    TERM    ;
  243.  
  244. GOODNM:    CALL    ERASFIL
  245.     CALL    MOVE2
  246.     LXI    D,FCB3
  247.     MVI    C,MAKE
  248.     CALL    BDOS
  249.     LXI    D,FCB3
  250.     MVI    C,OPEN
  251.     CALL    BDOS
  252.     LXI    H,BOTTRAM
  253.     SHLD    HLSAVE
  254.     MVI    A,FALSE
  255.     STA    NFILFLG
  256.  
  257. TERM:
  258.     LDA    UARTFLG    ; @7.61
  259.     sta    origsav    ; @MODEM75.FIX
  260.     ORA    A    ; @7.5 
  261.     MVI    A,ANSWMOD ; @7.5
  262.     STA    UARTCTLB  ; @7.5
  263.     JNZ    TERM2    ; @7.5
  264.     MVI    A,ORIGMOD ; @7.5
  265.     STA    UARTCTLB  ; @7.5
  266. TERM2:    CALL    STAT    ;KEYPRESS?
  267.     JZ    TERML    ;NO, CHECK LINE
  268.     CALL    KEYIN    ;GET CHAR FROM KBD
  269.     MOV    B,A    ;SAVE
  270.     LDA    EXACFL
  271.     ORA    A    ;EXACT?
  272.     MVI    A,0
  273.     STA    EXACFL    ;CLR FOR NEXT TIME
  274.     MOV    A,B    ;RESTORE
  275.     JNZ    NOTOG
  276.     CPI    EXITCHR    ;^E?
  277.     JZ    MENU    ;YES, RETURN TO MENU
  278.     CPI    DISCCHR    ;^D?
  279.     JZ    DISCON1    ;YES, DISCONNECT & RETURN TO MENU
  280.     CPI    EXTCHR    ;^^?
  281.     JZ    EXTFLG    ;YES, SET FLAG FOR NXT CHAR
  282.  
  283.     CPI    TRANCHR    ;TEST FOR TRANSFER REQUEST (^T)
  284.     CZ    TRANSFER ;SEND-A-FILE (BLIND SEND)
  285.     JZ    TERM    ;LOOP
  286.  
  287.     MOV    B,A
  288.     LDA    PMMIBYTE
  289.     ORA    A
  290.     MOV    A,B
  291.     JZ    S2
  292.     CPI    BRKCHR    ;BREAK?
  293.     JZ    BREAK
  294.     CPI    CHGBAUD
  295.     PUSH    PSW
  296.     PUSH    H
  297.     CZ    NEWBAUD
  298.     POP    H
  299.     POP    PSW
  300.     JZ    TERML
  301.  
  302. S2:    CPI    SAVECHR
  303.     JNZ    NOTOG
  304.     LDA    NFILFLG    ;DO NOT ALLOW SAVE IF..
  305.     CPI    TRUE    ;..THIS FLAG IS SET.
  306.     JZ    TERML
  307.     LDA    SAVEFLG
  308.     CMA
  309.     STA    SAVEFLG
  310.     JMP    TERML
  311.  
  312. EXTFLG:    MVI    A,TRUE
  313.     STA    EXACFL
  314.     JMP    TERML
  315.  
  316. NOTOG:    CALL    OUT$MODDATP
  317.  
  318. TERML:    CALL    IN$MODCTLP
  319.     CALL    ANI$MODRCVB
  320.     CALL    CPI$MODRCVR
  321.     JNZ    TERM
  322.     CALL    IN$MODDATP
  323.     ANI    7FH    ;STRIP PARITY
  324.     JZ    TERM        
  325.     CALL    TYPE
  326.     PUSH    PSW
  327.     LDA    SAVEFLG
  328.     CPI    FALSE
  329.     JZ    NOSAVE
  330.     POP    PSW
  331.     MOV    M,A
  332.     INX    H
  333.     SHLD    HLSAVE    ;MENU COMMAND DESTROYS HL-REG..
  334.         ;..GET HL WHEN ENTERING VIA 'RET' CMD.
  335.     MOV    B,A
  336.     LDA    IMSAIBYTE
  337.     ORA    A
  338.     MOV    A,B
  339.     JZ    COLON
  340.     CMA        ;FRONT PANEL SHOWS CHARS WHEN..
  341.     OUT    FRONTPAN ;..MEMORY SAVE IS ACTIVE.
  342.     JMP    NOCOLON
  343. COLON:    CPI    LF    ;IF NO FRONT PANEL, THEN..
  344.     JNZ    NOCOLON    ;..TYPE ":" AFTER EACH LINE FEED..
  345.     MVI    A,':'    ;..WHEN MEMORY SAVE ACTIVE.
  346.     CALL    TYPE
  347. NOCOLON:
  348.     LDA    SAVCCP
  349.     ORA    A
  350.     JZ    SUB1
  351.     LDA    7
  352.     SBI    8    ;..PAGE BELOW CCP ..
  353.     JMP    SUB1A
  354. SUB1:    LDA    7
  355. SUB1A:    DCR    A    ;..OR BDOS HAS BEEN..
  356.     CMP    H    ;..REACHED AND DISKSAVE IS NEEDED.
  357.     CZ    INTDSKSV
  358.  
  359.     JMP    TERM
  360. NOSAVE:    POP    PSW
  361.     JMP    TERM
  362.  
  363. SAVEFLG:    DB FALSE
  364. LASTBYT1:    DB 0
  365. LASTBYT2:    DB 0
  366.  
  367. INTDSKSV:
  368.     MVI    A,XOFF    ;SEND A CTRL-S TO STOP..
  369.     CALL    OUT$MODDATP ;..REMOTE COMPUTER OUTPUT.
  370.  
  371.     MVI    D,0    ;D IS THE BUFFER COUNT
  372.     CALL    INMODEM    ;GET LAST BYTES SENT..
  373.     STA    LASTBYT1 ;..AFTER CTRL-S.
  374.     CALL    INMODEM    ;ADD MORE CALLS TO INMODEM..
  375.     STA    LASTBYT2 ;..AND STA LASTBYT# IF YOU ARE..
  376.             ;..LOSING BYTES WHEN MEMORY IS FULL.
  377.     PUSH    D
  378.     CALL    NUMREC1
  379.     CALL    WRTDSK    ;WRITE THE RECORDS
  380.     POP    D
  381.  
  382.     LXI    H,BOTTRAM
  383.     INR    D
  384.     DCR    D    ;TEST BUFFER COUNT FOR ZERO
  385.     JZ    CTRLQ
  386.     LDA    LASTBYT1 ;GET THE LAST BYTES THAT WERE..
  387.     MOV    M,A    ;..SAVED AND PUT THEM IN..
  388.     INX    H    ;..BOTTRAM.
  389.     CALL    TYPE
  390.     DCR    D
  391.     JZ    CTRLQ
  392.     LDA    LASTBYT2
  393.     MOV    M,A
  394.     INX    H
  395.     CALL    TYPE
  396.  
  397. CTRLQ:    MVI    A,XON    ;SEND START CHARACTER..
  398.     CALL    OUT$MODDATP ;..TO REMOTE COMPUTER.
  399.  
  400.     RET
  401.  
  402. BREAK:    PUSH    D    ;SAVE IT
  403.     LXI    D,0    ;ZERO IT
  404.     LDA    MODCTLB    ;GET THE LAST MODEM CONTROL BYTE
  405.     ANI    0FBH    ;SET THE TRANSMIT BREAK BIT LOW - ACTIVE LOW
  406.     CALL    OUT$MODCTL2 ;SEND IT TO THE MODEM
  407.     LDA    FASTCLK    ;GET FAST CLOCK FLAG
  408.     ORA    A    ;SET FLAGS
  409.     LXI    B,450    ;BREAK DELAY COUNTER FOR SLOW CLOCK
  410.     JZ    BRK1    ;JUMP IF NOT FAST CLOCK
  411.     LXI    B,900    ;BREAK DELAY COUNTER FOR FAST CLOCK
  412. BRK1:    CALL    TIMERL
  413.     JZ    BRK2    ;IF TIME IS UP RESET BREAK
  414.     CPI    0    ;CHECK FOR NULLS
  415.     JZ    BRK1    ;DON'T PROCESS THEM
  416.     ANI    7FH    ;STRIP PARITY
  417.     CALL    TYPE
  418.     PUSH    PSW
  419.     LDA    SAVEFLG
  420.     CPI    FALSE
  421.     JZ    NOSAVEB
  422.     POP    PSW
  423.     MOV    M,A
  424.     INX    H
  425.     SHLD    HLSAVE    ;MENU COMMAND DESTROYS HL-REG..
  426.         ;..GET    HL WHEN ENTERING VIA 'RET' CMD.
  427.     PUSH    D
  428.     MOV    D,A
  429.     LDA    IMSAIBYTE
  430.     ORA    A
  431.     MOV    A,D
  432.     POP    D
  433.     JZ    COLONB
  434.     CMA    ;FRONT    PANEL SHOWS CHARS WHEN..
  435.     OUT    FRONTPAN ;..MEMORY SAVE IS ACTIVE.
  436.     JMP    BRK1
  437. COLONB:    CPI    LF    ;IF NO FRONT PANEL, THEN..
  438.     JNZ    BRK1    ;..TYPE ":" AFTER EACH LINE FEED..
  439.     MVI    A,':'    ;..WHEN MEMORY SAVE ACTIVE.
  440.     CALL    TYPE
  441.     JMP    BRK1    ;@
  442. NOSAVEB: POP    PSW    ;RESTORE IT
  443.     JMP    BRK1
  444.  
  445. BRK2:    LDA    MODCTLB    ;GET MODEM CONTROL BYTE
  446.     CALL    OUT$MODCTL2
  447.     POP    D
  448.     LHLD    HLSAVE    ;LAST ADDRESS WRITTEN IF DATA BEING SAVED
  449.     LDA    SAVCCP
  450.     ORA    A
  451.     JZ    SUB2
  452.     LDA    7    ;CHECK TO SEE IF..
  453.     SBI    8    ;..PAGE BELOW CCP ..
  454.     JMP    SUB2A
  455. SUB2:    LDA    7
  456. SUB2A:    DCR    A    ;..OR BDOS HAS BEEN ..
  457.     CMP    H    ;..REACHED AND DISKSAVE IS NEEDED.
  458.     JNZ    TERM    ;NO PROBLEM - GO BACK TO NORMAL ROUTINE
  459.     CALL    ILPRT
  460. DB    CR,LF,'Memory save buffer full',CR,LF,BELL,0
  461.     JMP    TERM
  462.  
  463.  
  464. ;THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER
  465. ;OR 100 MILLISECONDS. IF A CHARACTER IS RECEIVED, A FLAG IS SET
  466. ;TO STORE THE CHARACTER. A MAXIMUM OF TWO CHARACTERS ARE STORED,
  467. ;BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN "INTDSKSV"
  468. ;ABOVE).
  469.  
  470. INMODEM:
  471.     LDA    FASTCLK
  472.     ORA    A
  473.     LXI    B,1250
  474.     JZ    TIMERL
  475.     LXI    B,2500
  476. TIMERL:    CALL    IN$MODCTLP
  477.     CALL    ANI$MODRCVB
  478.     CALL    CPI$MODRCVR
  479.     JZ    GETBYTE
  480.     DCX    B
  481.     MOV    A,B
  482.     ORA    C
  483.     JNZ    TIMERL
  484.     RET
  485. GETBYTE:
  486.     CALL    IN$MODDATP
  487.     INR    D
  488.     RET
  489.  
  490. NUMRECS:
  491.     MVI    M,EOFCHAR
  492.     INX    H
  493.     LXI    D,127
  494.     DAD    D
  495. NUMREC1:
  496.     LXI    D,-(BOTTRAM)
  497.     DAD    D
  498.  
  499.     MOV    A,L    ;DIVIDE HL BY 128..
  500.     ORA    A
  501.     RAL        ;..TO GET THE..
  502.     MOV    L,H    ;..NUMBER OF SECTORS
  503.     MVI    H,0
  504.     PUSH    PSW
  505.     DAD    H
  506.     POP    PSW
  507.     MVI    A,0
  508.     ADC    L
  509.     MOV    L,A    ;RETURNS WITH NUMBER OF..
  510.     RET        ;..128 BYTE RECORDS IN HL.
  511.  
  512. WRTDSK:    LXI    D,BOTTRAM
  513. NEXTWRT:
  514.     MVI    C,STDMA
  515.     CALL    BDOSRT
  516.     PUSH    D
  517.     LXI    D,FCB3
  518.     MVI    C,WRITE
  519.     CALL    BDOSRT
  520.     POP    D
  521.     XCHG
  522.     PUSH    D
  523.     LXI    D,128
  524.     DAD    D
  525.     POP    D
  526.     XCHG
  527.     DCX    H
  528.     MOV    A,H
  529.     ORA    L
  530.     JNZ    NEXTWRT
  531.     RET
  532.  
  533. CLOSE3:    LXI    D,FCB3
  534.     MVI    C,CLOSE
  535.     CALL    BDOS
  536.     RET
  537.  
  538. BDOSRT:    PUSH B ! PUSH D ! PUSH H ! PUSH PSW
  539.     CALL    BDOS
  540.     POP PSW ! POP H ! POP D ! POP B
  541.     RET
  542.  
  543. MOVE2:    LXI    H,FCB3
  544.     CALL    INITFCBS
  545.     LXI    H,FCB
  546.     LXI    D,FCB3
  547.     MVI    B,12
  548.     CALL    MOVE
  549.     RET
  550.  
  551. ;FILE TRANSFER ROUTINE - CALLED WITH 
  552. ;CONTROL-T FROM TERMINAL ROUTINE.
  553. ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X.
  554.  
  555. TRANSFER:
  556.     PUSH H ! PUSH D ! PUSH B ! PUSH PSW
  557.     LXI    H,FCB4
  558.     CALL    INITFCBS ;INITIALIZES FCBS POINTED..
  559.     LXI    H,FCB+16 ;..TO BY HL REG.
  560.     CALL    INITFCBS
  561. GET:    CALL    GETNAME
  562.     LDA    CMDBUF+2 ;WAS FILE ENTERED
  563.     CPI    20H
  564.     JZ    TRANSL2
  565.     CALL    MOVE4
  566.     CALL    OPEN4
  567.     CPI    0FFH    ;RETURN WITH 0FFH MEANS
  568.     JNZ    CONTIN    ;FILE DOES NOT EXIST
  569. TRANSL1: CALL    ILPRT
  570. DB    CR,LF,'++File does not exist++',CR,LF,0
  571. TRANSL2: CALL ILPRT
  572. DB    'Type "R" to return to modem',CR,LF
  573. DB    'Type "A" to re-enter name: ',BELL,0
  574.     CALL    KEYIN
  575.     CALL    UCASE
  576.     CALL    TYPE    ;ECHO RESPONSE
  577.     CALL    CRLF
  578.     CPI    'A'
  579.     JZ    GET
  580.     CPI    'R'
  581.     JZ    RETURN
  582.     JMP    TRANSL2
  583.  
  584. CONTIN:    LXI    D,80H
  585.     MVI    C,STDMA
  586.     CALL    BDOS
  587. READMR:    CALL    READ80
  588.     CPI    1    ;END OF FILE
  589.     JZ    RETURNS
  590.     CPI    2    ;BAD READ
  591.     JZ    RETURNU
  592.     CALL    SEND80C
  593.     CPI    EOFCHAR    ;END OF FILE - OMIT IF OBJECT..
  594.     JZ    RETURNS    ;..CODE IS TO BE SENT.
  595.     CPI    CAN    ;CANCELLATION?
  596.     JZ    TRANCAN
  597.     JMP    READMR
  598. RETURNS:
  599.     CALL    ILPRT
  600. DB    CR,LF,'++File transfer completed++',CR,LF,BELL,0
  601.     JMP    RETURN
  602. RETURNU:
  603.     CALL    ILPRT
  604. DB    CR,LF,'++File transfer unsuccessful++',CR,LF,BELL,0
  605.     JMP    RETURN
  606. TRANCAN:
  607.     CALL    ILPRT
  608. DB    CR,LF,CR,LF,'++ Transfer cancelled ++',CR,LF,BELL,0
  609. RETURN:    POP PSW ! POP B ! POP D ! POP H
  610.     RET
  611.  
  612. INITFCBS:        ;ENTRY AT +2 WILL LEAVE..
  613.     MVI    M,0    ;..DRIVE NO. INTACT.
  614.     INX    H    ;WILL INITIALIZE AN FCB..
  615.     MVI    B,11    ;..POINTED TO BY HL-REG. FILLS 1ST POS
  616. LOOP10:    MVI    M,' '    ;..WITH 0, NEXT 11 WITH..
  617.     INX    H    ;..WITH BLANKS, AND LAST..
  618.     DCR    B    ;..21 WITH NULLS.
  619.     JNZ    LOOP10
  620.     MVI    B,21
  621. LOOP11:    MVI    M,0
  622.     INX    H
  623.     DCR    B
  624.     JNZ    LOOP11
  625.     RET
  626.  
  627. GETNAME: CALL ILPRT
  628. DB    CR,LF,'Enter file name to be transferred -  C/R TO QUIT: ',0
  629.     LXI    D,CMDBUF
  630.     CALL    INBUFF
  631.     CALL    CRLF
  632.     RET
  633.  
  634. MOVE4:    LXI    D,CMDBUF
  635.     LXI    H,FCB4
  636.     CALL    CPMLINE
  637.     RET
  638.  
  639. OPEN4:    LXI    D,FCB4
  640.     MVI    C,OPEN
  641.     CALL    BDOS
  642.     RET
  643.  
  644. READ80:    LXI    D,FCB4
  645.     MVI    C,READ
  646.     CALL    BDOS
  647.     RET
  648.  
  649. SEND80C:
  650.     MVI    B,80H
  651.     LXI    H,80H
  652. SENDCH1:
  653.     MOV    A,M
  654.     CALL    MODOUT
  655.     CPI    EOFCHAR
  656.     RZ
  657.     CALL    STAT    ;TEST TO SEE IF
  658.     ORA    A    ;CANCELLATION REQUESTED
  659.     JZ    SKIP12
  660.     CALL    KEYIN
  661.     CPI    CAN
  662.     RZ
  663. SKIP12:    INX    H
  664.     DCR    B
  665.     JNZ    SENDCH1
  666.     RET
  667.  
  668. MODOUT:    PUSH    PSW
  669. MODOUTL:
  670.     CALL    IN$MODCTLP
  671.     CALL    ANI$MODSNDB
  672.     CALL    CPI$MODSNDR
  673.     JNZ    MODOUTL
  674.     POP    PSW
  675.     CALL    OUT$MODDATP
  676.     CALL    TYPE
  677.     RET
  678.  
  679. FCB4:    DS    33
  680.  
  681. ;TERMINAL ECHO MODE
  682.  
  683. TRMECHO:
  684.     CALL    IN$MODCTLP
  685.     CALL    ANI$MODRCVB
  686.     CALL    CPI$MODRCVR
  687.     JZ    LINECHR
  688.     CALL    STAT
  689.     JZ    TRMECHO
  690.     CALL    KEYIN
  691.     CPI    EXITCHR
  692.     JZ    MENU
  693.  
  694.     MOV    B,A
  695.     LDA    PMMIBYTE
  696.     ORA    A
  697.     MOV    A,B
  698.     JZ    S3
  699.     CPI    CHGBAUD    ;SAME ROUTINE AS IN TERMINAL MODE
  700.     PUSH    PSW
  701.     CZ    NEWBAUD
  702.     POP    PSW
  703.     CPI    CHGBAUD
  704.  
  705.     JZ    TRMECHO
  706. S3:    CALL    OUT$MODDATP
  707.     CALL    TYPE
  708.     JMP    TRMECHO
  709.  
  710. LINECHR:
  711.     CALL    IN$MODDATP
  712.     CALL    OUT$MODDATP
  713.     CALL    TYPE
  714.     JMP    TRMECHO
  715.  
  716.  
  717. ;        SEND A CP/M FILE
  718.  
  719. SENDFIL:
  720.     CALL    PARITY    ;SET PARITY IF REQUESTED
  721.     LDA    BATCHFLG ;CHECK IF MULTIPLE FILE..
  722.     ORA    A    ;..MODE IS SET.
  723.     JNZ    SENDC1
  724.     MVI    A,TRUE    ;INDICATE BATCH SEND
  725.     STA    SENDFLG
  726.     LDA    FSTFLG    ;IF FIRST TIME THRU..
  727.     ORA    A    ;..SCAN THE COMMAND LINE..
  728.     CNZ    TNMBUF    ;..FOR MULTIPLE NAMES.
  729.     CALL    SENDFN    ;SENDS FILE NAME TO RECEIVER
  730.     JNC    SENDC2    ;CARRY SET MEANS NO MORE FILES.
  731.     MVI    A,'B'    ;STOP BATCH..
  732.     STA    BATCHFLG ;..MODE OPTION.
  733.     MVI    A,EOT    ;FINAL XFER END
  734.     CALL    SEND
  735.     JMP    DONE
  736. SENDC1:    LDA    FCB+1
  737.     CPI    ' '
  738.     JZ    BLKFILE
  739. SENDC2:    CALL    CNREC    ;GET NUMBER OF RECORDS
  740.     CALL    OPENFIL
  741.     MVI    E,80
  742.     CALL    WAITNAK
  743. SENDLP:    CALL    RDSECT
  744.     JC    SENDEOF
  745.     CALL    INCRSNO
  746.     XRA    A
  747.     STA    ERRCT
  748. SENDRPT:
  749.     CALL    SENDHDR
  750.     CALL    SENDSEC
  751.     LDA    CRCFLG
  752.     ORA    A
  753.     CZ    SENDCRC
  754.     CNZ    SENDCKS
  755.     CALL    GETACK
  756.     JC    SENDRPT
  757.     JMP    SENDLP
  758.  
  759. SENDEOF:
  760.     MVI    A,EOT
  761.     CALL    SEND
  762.     CALL    GETACK
  763.     JC    SENDEOF
  764.     JMP    DONE
  765.  
  766. ;        RECEIVE A FILE
  767.  
  768. RCVFIL:    xra    a    ;@7.41 - default to CRC mode
  769.     sta    CRCFLG    ;@7.41
  770. RCVFIL1:        ;@FIX7.61
  771.     CALL    PARITY    ;SET PARITY IF REQUESTED
  772.     LDA    BATCHFLG ;CHECK IF MULT..
  773.     ORA    A    ;..FILE MODE.
  774.     JNZ    RCVC1
  775.     MVI    A,FALSE    ;FLAG WHERE TO RETURN..
  776.     STA    SENDFLG    ;..FOR NEXT FILE TRANS.
  777.     CALL    GETFN    ;GET THE FILE NAME.
  778.     JNC    RCVC2    ;CARRY SET MEANS NO MORE FILES.
  779.     MVI    A,'B'    ;STOP BATCH..
  780.     STA    BATCHFLG ;..MODE OPTION.
  781.     JMP    DONE
  782. RCVC1:    LDA    FCB+1    ;MAKE SURE FILE IS NAMED
  783.     CPI    ' '
  784.     JZ    BLKFILE
  785.     JMP    RCVC3
  786. RCVC2:    CALL    CKCPM2
  787.     CALL    CKBAKUP
  788. RCVC3:    CALL    ERASFIL
  789.     CALL    MAKEFIL
  790.     lda    batchflg;@75.FIX.................
  791.     ora    a    ;DON'T PRINT MSSG IF..
  792.     jnz    rcvc4    ;..IN MULTI AND QUIET.
  793.     lda    qflg
  794.     ora    a
  795.     jz    rcvfst
  796. rcvc4:    CALL    ILPRT    ;@75.FIX.................
  797. DB    'File open, ready to receive',CR,LF,0
  798. RCVFST:    LDA    CRCFLG
  799.     ORA    A
  800.     MVI    A,NAK
  801.     JNZ    RCVFIL2
  802.     MVI    A,CRC
  803. ;
  804. RCVFIL2:
  805.     CALL    SEND
  806.     lda    CRCFLG        ;@7.41...............................
  807.     ora    a
  808.     jnz    RCVNAKM        ;if in CRC mode
  809.     call    ILPRT        ;then say so
  810.     DB    'CRC in effect',cr,lf,0
  811.     jmp    RCVLP
  812. RCVNAKM:
  813.     call    ILPRT        ;else say checksum mode
  814.     DB    'Checksum in effect',cr,lf,0
  815.                 ;@7.41...............................
  816. RCVLP:    CALL    RCVSECT
  817.     JC    RCVEOT
  818.     CALL    WRSECT
  819.     CALL    INCRSNO
  820.     CALL    SENDACK
  821.     JMP    RCVLP
  822.  
  823. RCVEOT:    CALL    WRBLOCK
  824.     CALL    SENDACK
  825.     CALL    CLOSFIL
  826.     JMP    DONE
  827.     
  828. ;SUBROUTINES
  829.  
  830. SENDFN:    LDA    QFLG
  831.     ORA    A
  832.     JZ    SWNAK
  833.     CALL    ILPRT
  834. DB    'Awaiting name NAK',CR,LF,0
  835. SWNAK:    MVI    E,80
  836.     CALL    WAITNLP
  837.     MVI    A,ACK    ;GOT NAK, SEND ACK
  838.     CALL    SEND
  839.     LXI    H,FILECT
  840.     DCR    M
  841.     JM    NOMRNM
  842.     LHLD    NBSAVE    ;GET FILE NAME..
  843.     LXI    D,FCB    ;..IN FCB
  844.     MVI    B,12
  845.     CALL    MOVE
  846.     SHLD    NBSAVE
  847.     CALL    SENDNM    ;SEND IT
  848.     ORA    A    ;CLEAR CARRY
  849.     RET
  850. NOMRNM:    MVI A,EOT
  851.     CALL SEND
  852.     STC
  853.     RET
  854.  
  855. SENDNM:    PUSH    H
  856. SENDNM1:
  857.     MVI    D,11    ;COUNT CHARS IN NAME
  858.     MVI    C,0    ;INIT CHECKSUM
  859.     LXI    H,FCB+1    ;ADDRESS NAME
  860. NAMLPS:    MOV    A,M    ;SEND NAME
  861.     ANI    7FH    ;STRIP HIGH ORDER BIT SO CP/M 2..
  862.     CALL    SEND    ;..WON'T SEND R/O FILE DESIGNATION.
  863.     LDA    QFLG    ;SHOW NAME IF..
  864.     ORA    A    ;..QFLG NOT SET.
  865.     MOV    A,M
  866.     CNZ    TYPE
  867. ACKLP:    PUSH    B    ;SAVE CKSUM
  868.     MVI    B,1    ;WAIT FOR RECEIVER..
  869.     CALL    RECV    ;..TO ACKNOWLEDGE..
  870.     POP    B    ;..GETTING LETTER.
  871.     JC    SCKSER
  872.     CPI    ACK
  873.     JNZ    ACKLP
  874.     INX    H    ;NEXT CHAR
  875.     DCR    D
  876.     JNZ    NAMLPS
  877.     MVI    A,EOFCHAR ;TELL RECEIVER END OF NAME
  878.     CALL    SEND
  879.     LDA    QFLG
  880.     ORA    A
  881.     CNZ    CRLF
  882.     MOV    D,C    ;SAVE CHECKSUM
  883.     MVI    B,1
  884.     CALL    RECV    ;GET CHECKSUM..
  885.     CMP    D    ;..FROM RECEIVER.
  886.     JZ    NAMEOK
  887. SCKSER:    MVI    A,BDNMCH ;BAD NAME-TELL RECEIVER
  888.     CALL    SEND
  889.     LDA    QFLG
  890.     ORA    A
  891.     JZ    SKCSER1
  892.     CALL    ILPRT
  893. DB    'Checksum error',CR,LF,0
  894. SKCSER1:
  895.     MVI    E,80    ;DO HANDSHAKING OVER
  896.     CALL    WAITNLP    ;DON'T PRINT "AWAITING NAK" MSG
  897.     MVI    A,ACK
  898.     CALL    SEND
  899.     JMP    SENDNM1
  900. NAMEOK:    MVI    A,OKNMCH ;GOOD NAME-TELL RECEIVER
  901.     CALL    SEND
  902.     POP    H
  903.     RET    
  904.  
  905. GETFN:    LXI    H,FCB
  906.     CALL    INITFCBS+2 ;DOES NOT INITIALIZE DRIVE
  907.     LDA    QFLG
  908.     ORA    A
  909.     JZ    GNAMELP
  910.     CALL    ILPRT
  911. DB    'Awaiting file name',CR,LF,0
  912. GNAMELP:
  913.     CALL    HSNAK
  914.     JC    GNAMELP
  915.     CALL    GETNM    ;GET THE NAME
  916.     CPI    EOT    ;IF EOT, THEN NO MORE FILES
  917.     JZ    NOMRNMG
  918.     ORA    A    ;CLEAR CARRY
  919.     RET
  920. NOMRNMG:
  921.     STC
  922.     RET
  923.  
  924. GETNM:    PUSH    H
  925. GETNM1:    MVI    C,0    ;INIT CHECKSUM
  926.     LXI    H,FCB+1
  927. NAMELPG:
  928.     MVI    B,5
  929.     CALL    RECV    ;GET CHAR
  930.     JNC    GETNM3
  931.     LDA    QFLG
  932.     ORA    A
  933.     JZ    GETNM2
  934.     CALL    ILPRT
  935. DB    'Time out receiving filename',CR,LF,0
  936. GETNM2:    JMP    GCKSER
  937. GETNM3:    CPI    EOT    ;IF EOT, THEN NO MORE FILES
  938.     JZ    GNRET
  939.     CPI    EOFCHAR    ;GOT END OF NAME
  940.     JZ    ENDNAME
  941.     MOV    M,A    ;PUT NAME IN FCB
  942.     LDA    QFLG    ;TYPE IT IF NO QFLG
  943.     ORA    A
  944.     MOV    A,M
  945.     CNZ    TYPE
  946.     PUSH    B    ;SAVE CKSUM
  947.     MVI    A,ACK    ;ACK GETTING LETTER
  948.     CALL    SEND
  949.     POP    B
  950.     INX    H    ;GET NEXT CHAR
  951.     MOV    A,L    ;DON'T LET NOISE...
  952.     CPI    7FH    ;..CAUSE OVERFLOW..
  953.     JZ    GCKSER    ;..INTO PROGRAM AREA.
  954.     JMP    NAMELPG
  955. ENDNAME:
  956.     LDA    QFLG
  957.     ORA    A
  958.     CNZ    CRLF
  959.     MOV    A,C    ;SEND CHECKSUM
  960.     CALL    SEND
  961.     MVI    B,1
  962.     CALL    RECV    ;CHECKSUM GOOD?
  963.     CPI    OKNMCH    ;YES IF OKNMCH SENT..
  964.     JZ    GNRET    ;..ELSE DO OVER.
  965. GCKSER:    LXI    H,FCB    ;CLEAR FCB (EXCEPT DRIVE)..
  966.     CALL    INITFCBS+2 ;..SINCE IT MIGHT BE DAMAGED..
  967.     LDA    QFLG    ;..BY TOO MANY CHARS.
  968.     ORA    A
  969.     JZ    GCKSER1
  970.     CALL    ILPRT
  971. DB    'Checksum error',CR,LF,0
  972. GCKSER1:
  973.     CALL    HSNAK    ;DO HANDSHAKING OVER
  974.     JC    GCKSER1
  975.     JMP    GETNM1
  976. GNRET:    POP    H
  977.     RET
  978.  
  979. HSNAK:    MVI    A,NAK    ;SEND NAK UNTIL..
  980.     CALL    SEND    ;..RECEIVING ACK.
  981.     CALL    CKABORT    ;DON'T GET HUNG UP HERE
  982.     MVI    B,2    ;WAIT 2 SECONDS..
  983.     CALL    RECV    ;..IN RECEIVE.
  984.     CPI    ACK    ;IF ACK,RETURN WITH..
  985.     RZ        ;..CARRY CLEAR.
  986.     STC
  987.     RET
  988.  
  989. TNMBUF:    MVI    A,FALSE    ;CALL FROM SENDFIL ONLY ONCE.
  990.     STA    FSTFLG
  991.     STA    FILECT
  992.     CALL    SCAN
  993.     LXI    H,NAMEBUF
  994.     SHLD    NBSAVE    ;SAVE ADDR OF 1ST NAME
  995. TNLP1:    CALL    TRTOBUF
  996.     LXI    H,FCB
  997.     LXI    D,FCBBUF
  998.     CALL    CPMLINE    ;PARSE NAME TO CP/M FORMAT
  999. TNLP2:    CALL    MFNAME    ;SEARCH FOR NAMES (* FORMAT)
  1000.     JC    NEXTNM
  1001.     LDA    FCB+10    ;IF CP/M 2 $SYS FILE..
  1002.     ANI    80H    ;..DON'T SEND
  1003.     JNZ    TNLP2
  1004.     LHLD    NBSAVE    ;GET NAME
  1005.     LXI    D,FCB    ;MOVE IT TO FCB
  1006.     XCHG
  1007.     MVI    B,12
  1008.     CALL    MOVE
  1009.     XCHG
  1010.     SHLD    NBSAVE    ;ADDR OF NEXT NAME
  1011.     LXI    H,FILECT    ;COUNT FILES FOUND
  1012.     INR    M
  1013.     JMP    TNLP2
  1014. ;
  1015. NEXTNM:    LXI    H,NAMECT ;COUNT NAMES FOUND
  1016.     DCR    M
  1017.     JNZ    TNLP1
  1018.     LXI    H,NAMEBUF ;SAVE START OF BUFFER
  1019.     SHLD    NBSAVE
  1020.     LDA    FILECT
  1021.     CPI    65    ;NO MORE THAN 64 TRANSFERS
  1022.     RC
  1023.     MVI    A,64    ;ONLY X'FER FIRST 64
  1024.     STA    FILECT
  1025.     RET
  1026.  
  1027. ;SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE)
  1028. ;AFTER LAST NAME
  1029.  
  1030. SCAN:    PUSH    H
  1031.     LXI    H,NAMECT
  1032.     MVI    M,0
  1033.     LXI    H,CMDBUF+1 ;FIND END OF CMD LINE..
  1034.     MOV    C,M    ;..AND PUT SPACE THERE.
  1035.     MVI    B,0
  1036.     LXI    H,CMDBUF+2
  1037.     DAD    B
  1038.     MVI    M,20H
  1039.     LXI    H,CMDBUF+1
  1040.     MOV    B,M
  1041.     INR    B
  1042.     INR    B
  1043. SCANLP1:
  1044.     INX    H
  1045.     DCR    B
  1046.     JZ    DNSCAN
  1047.     MOV    A,M
  1048.     CPI    20H
  1049.     JNZ    SCANLP1
  1050. SCANLP2:
  1051.     INX    H    ;EAT EXTRA SPACES
  1052.     DCR    B
  1053.     JZ    DNSCAN
  1054.     MOV    A,M
  1055.     CPI    20H
  1056.     JZ    SCANLP2
  1057.     SHLD    BGNMS    ;SAVE START OF NAMES IN CMDBUF
  1058.     INR    B
  1059.     DCX    H
  1060. SCANLP3:
  1061.     INX    H
  1062.     DCR    B
  1063.     JZ    DNSCAN
  1064.     MOV    A,M
  1065.     CPI    20H
  1066.     JNZ    SCANLP3
  1067.     LDA    NAMECT    ;COUNTS NAMES
  1068.     INR    A
  1069.     STA    NAMECT
  1070. SCANLP4:
  1071.     INX    H    ;EAT SPACES
  1072.     DCR    B
  1073.     JZ    DNSCAN
  1074.     MOV    A,M
  1075.     CPI    20H
  1076.     JZ    SCANLP4
  1077.     JMP    SCANLP3
  1078. ;
  1079. DNSCAN:    MVI    M,20H    ;SPACE AFTER LAST CHAR
  1080.     POP    H
  1081.     RET
  1082.  
  1083. ;PLACES NEXT NAME IN BUFFER SO CPMLINE MAY PARSE IT
  1084. TRTOBUF:
  1085.     LHLD    BGNMS
  1086.     MVI    B,0
  1087.     LXI    D,FCBBUF+2
  1088. TBLP:    MOV    A,M
  1089.     CPI    20H
  1090.     JZ    TRBFEND
  1091.     STAX    D
  1092.     INX    H
  1093.     INX    D
  1094.     INR    B    ;COUNT CHARS IN NAME
  1095.     JMP    TBLP
  1096. ;
  1097. TRBFEND:
  1098.     INX    H
  1099.     MOV    A,M    ;EAT EXTRA SPACES
  1100.     CPI    20H
  1101.     JZ    TRBFEND
  1102.     SHLD    BGNMS
  1103.     LXI    H,FCBBUF+1 ;PUT # CHARS BEFORE NAME
  1104.     MOV    M,B
  1105.     RET
  1106.  
  1107. ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'.
  1108. CKCPM2:    MVI    C,12
  1109.     CALL    BDOS
  1110.     ORA    A    ;RETURN 0 MEANS CP/M 1
  1111.     RZ
  1112.     MVI    C,STDMA
  1113.     LXI    D,80H
  1114.     CALL    BDOS
  1115.     MVI    C,SRCHF    ;SEARCH FOR FILE
  1116.     LXI    D,FCB
  1117.     CALL    BDOS
  1118.     CPI    0FFH
  1119.     RZ
  1120.     ADD A ! ADD A    ;MULT A-REG BY..
  1121.     ADD A ! ADD A    ;..32 TO FIND..
  1122.     ADD    A    ;..NAME IN DMA.
  1123.     LXI    H,80H
  1124.     ADD    L
  1125.     MOV    L,A    ;HL POINTS TO DIR NAME
  1126.     LXI    D,9
  1127.     DAD    D    ;POINT TO R/O ATTRIB BYTE
  1128.     MOV    A,M
  1129.     ANI    80H    ;TEST MSB
  1130.     JNZ    MKCHG    ;IF SET, MAKE CHANGE
  1131.     INX    H    ;CHECK SYSTEM ATTRIB BYTE
  1132.     MOV    A,M
  1133.     ANI    80H
  1134.     RZ        ;NOT $SYS OR $R/O
  1135.     DCX    H
  1136. MKCHG:    LXI    D,-8
  1137.     DAD    D    ;POINT HL TO FILENAME + 1
  1138.     LXI    D,FCB+1    ;MOVE DIR NAME TO FCB..
  1139.     MVI    B,11    ;..WITHOUT CHANGING DRIVE.
  1140.     CALL    MOVE
  1141.     LXI    H,FCB+9    ;R/O ATTRIB
  1142.     MOV    A,M
  1143.     ANI    7FH    ;STRIP R/O ATTRIB
  1144.     MOV    M,A
  1145.     INX    H    ;SYS ATTRIB
  1146.     MOV    A,M
  1147.     ANI    7FH
  1148.     MOV    M,A
  1149.     LXI    D,FCB
  1150.     MVI    C,30    ;SET NEW ATTRIBS IN DIR
  1151.     CALL    BDOS
  1152.  
  1153. ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE
  1154. PLANCHG:
  1155.     LXI    H,FCB    ;CHANGE NAME TO TYPE "BAK"
  1156.     LXI    D,6CH
  1157.     MVI    B,9    ;MOVE DRIVE AND NAME (NOT TYPE)
  1158.     CALL    MOVE
  1159.     LXI    H,75H    ;START OF TYPE IN FCB2
  1160.     MVI    M,'B'
  1161.     INX    H
  1162.     MVI    M,'A'
  1163.     INX    H
  1164.     MVI    M,'K'
  1165.     LXI    D,6CH
  1166.     MVI    C,ERASE    ;ERASE ANY PREV BACKUPS
  1167.     CALL    BDOS
  1168.     LXI    H,6CH    ;FCB2 DR FIELD SHOULD..
  1169.     MVI    M,0    ;..0 FOR RENAME.
  1170.     LXI    D,FCB
  1171.     MVI    C,23    ;RENAME
  1172.     CALL    BDOS
  1173.     RET
  1174.  
  1175. CKBAKUP:
  1176.     LDA    BAKUPBYTE
  1177.     ORA    A
  1178.     RZ
  1179.     MVI    C,SRCHF
  1180.     LXI    D,FCB
  1181.     CALL    BDOS
  1182.     INR    A
  1183.     RZ    ;FILE NOT FOUND
  1184.     JMP    PLANCHG    ;IN "CKCPM2" - RET DONE THERE
  1185.  
  1186. ;MULTI-FILE ACCESS SUBROUTINE FROM CP/M USER'S GROUP
  1187. ;FIXED BY MARK ZEIGER 8/17/80
  1188. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  1189.  
  1190. MFNAME:    MFACCESS    ;A MACRO IN MACROS.LIB
  1191.  
  1192. RCVSECT:
  1193.     XRA    A
  1194.     STA    ERRCT
  1195. RCVRPT:    XRA    A    ;ZERO ACCUM
  1196.     STA    ERRCDE    ;CLEAR RECEIVE ERROR CODE
  1197.     LDA    QFLG
  1198.     ORA    A
  1199.     JZ    RCVSQ
  1200.     CALL    ILPRT
  1201. DB    CR,'Awaiting # ',0
  1202.     PUSH    H    ;SAVE IT
  1203.     LHLD    SECTNO    ;GET SECTOR NUMBER
  1204.     INX    H    ;BUMP IT
  1205.     CALL    DECOUT    ;PRINT SECTOR NUMBER IN DECIMAL
  1206.     CALL    ILPRT
  1207.     DB    ' (', 0
  1208.     CALL    DHXOUT    ;16 BIT HEX CONVERSION & OUTPUT
  1209.     CALL    ILPRT
  1210.     DB    'H)',0
  1211.     MOV    A,L    ;ONLY LOW BYTE USED BY PROGRAM
  1212.     POP    H    ;RESTORE IT
  1213. ;
  1214. ;---->    RCVSQ:
  1215. ;    If CRC is in effect, there is only a 3 second wait
  1216. ;    for the first SOH.  If the SOH is not received within
  1217. ;    3 seconds, then a NAK is sent which tells the sender
  1218. ;    to use checksum checking instead of CRC.  This allows
  1219. ;    automatic compatability with versions of XMODEM that
  1220. ;    do not implement Cyclic Redundancy Checking(CRC).
  1221. ;
  1222. RCVSQ:    LDA    FIRSTME    ;first SOH...
  1223.     ORA    A    ;...been received?
  1224.     JZ    RCVSQ2    ;yes, go get next SOH
  1225.     XRA    A    ;turn off...
  1226.     STA    FIRSTME    ;...first soh recvd switch
  1227.     LDA    CRCFLG    ;CRC in...
  1228.     ORA    A    ;...effect?
  1229.     JNZ    RCVSQ2    ;no, do long wait for first SOH
  1230.     MVI    B,7    ;wait for upto 7 seconds    <---- JKM MOD 7/16/82
  1231.     CALL    RECV    ;get a character from modem
  1232.     JNC    RCVSQ3    ;got a char, go see if SOH
  1233.     CALL    ILPRT
  1234. DB    CR,LF,'++Switching to CHECKSUM MODE++',CR,LF,0
  1235.     MVI    A,'C'    ;turn off...
  1236.     STA    CRCFLG    ;...CRC mode.
  1237.     MVI    A,NAK    ;send NAK to tell sender checksum
  1238.     CALL    SEND    ;...is in effect & to start sending.
  1239.     JMP    RCVSECT    ;go start receiving sector
  1240. ;
  1241. RCVSQ2:    MVI    B,7    ;10 IN ORIG PROG
  1242.     CALL    RECV
  1243.     JC    RCVSTOT
  1244. ;
  1245. RCVSQ3:    CALL    RCVERR    ;CHECK FOR ERRORS
  1246.     JC    RCVDERR    ;JUMP IF THERE WAS AN ERROR
  1247.     CPI    SOH
  1248.     JZ    RCVSOH
  1249.     ORA    A
  1250.     JZ    RCVSQ
  1251.     CPI    EOT
  1252.     STC
  1253.     RZ
  1254.     MOV    B,A
  1255.     LDA    VSEEFLG
  1256.     ORA    A
  1257.     JZ    RCVSEH
  1258.     LDA    QFLG
  1259.     ORA    A
  1260.     JZ    RCVSERR
  1261.  
  1262. RCVSEH:    MOV    A,B
  1263.     CALL    CRLF
  1264.     CALL    HEXO
  1265.     CALL    ILPRT
  1266. DB    'H recv''d, not SOH',CR,LF,0
  1267.  
  1268. RCVSERR: MVI    B,1
  1269.     CALL    RECV
  1270.     JNC    RCVSERR
  1271.     MVI    A,NAK
  1272.     CALL    SEND
  1273.     LDA    ERRCT
  1274.     INR    A
  1275.     STA    ERRCT
  1276.     CPI    ERRLIM
  1277.     JC    RCVRPT
  1278.     LDA    VSEEFLG
  1279.     ORA    A
  1280.     JZ    RCVCKQ
  1281.     LDA    QFLG
  1282.     ORA    A
  1283.     JZ    RCVSABT
  1284. RCVCKQ:    CALL    CKQUIT
  1285.     JZ    RCVSECT
  1286. RCVSABT:
  1287.     CALL    CLOSFIL
  1288.     CALL    ERXIT
  1289. DB    CR,LF,'++Unable to receive block - Aborting++',CR,LF,'$'
  1290.  
  1291. RCVSTOT:
  1292.     LDA    VSEEFLG
  1293.     ORA    A
  1294.     JZ    RCVSPT
  1295.     LDA    QFLG
  1296.     ORA    A
  1297.     JZ    RCVSERR
  1298. RCVSPT:    CALL    ILPRT
  1299. DB    CR,LF,'++  Timeout ++ ',0
  1300. RCVPRN:    LDA    ERRCT
  1301.     CALL    HEXO
  1302.     CALL    CRLF
  1303.     JMP    RCVSERR
  1304.  
  1305. ;---->    RCVERR:
  1306. ;    Checks for framing, overrun, and parity errors. Parity errors
  1307. ;    cannot be detected unless the parity option has been selected.
  1308. ;    1.Error code (ERRCDE) was set in RECV routine.
  1309. ;    2.ERRCDE=0 for no errors, ERRCDE<>0 for errors.
  1310. ;    3.If there is an error, routine returns with carry flag set.
  1311.  
  1312. RCVERR:    PUSH    PSW    ;SAVE CHAR TRANSMITTED
  1313.     LDA    ERRCDE    ;GET RECEIVE ERROR CODE
  1314.     ANA    A    ;IS IT ZERO?
  1315.     JZ    RCVERR2    ;YES, NO RECEIVE ERROR
  1316.     POP    PSW    ;RESTORE CHAR TRANSMITTED
  1317.     STC        ;SET CARRY ON TO INDICATE AN ERROR
  1318.     RET
  1319.  
  1320. RCVERR2:
  1321.     POP    PSW    ;RESTORE CHAR TRANSMITTED
  1322.     RET
  1323.  
  1324. ;---->    RCVDERR: Checks for a receive error and displays appropriate error
  1325. ;    message. Then goes to RCVSERR to purge the line and send a NAK.
  1326.  
  1327. RCVDERR:
  1328.     LDA    VSEEFLG    ;VIEWING
  1329.     ORA    A    ;...MODE?
  1330.     JZ    RCVDERRP ;YES,..PRT MSG
  1331.     LDA    QFLG    ;QUIET...
  1332.     ORA    A    ;...MODE?
  1333.     JZ    RCVSERR    ;YES, NO MSG
  1334.  
  1335. RCVDERRP: CALL ILPRT
  1336.     DB    CR,LF,0
  1337.     LDA    ERRCDE    ;GET RECEIVE ERR CODE
  1338.     ANI    FRMER    ;WAS THERE A FRAMING ERROR?
  1339.     JZ    RCVDERR2 ;NO, GO CHECK FOR OVERRUN
  1340.     CALL    ILPRT
  1341. DB    '++Framing error++ ',0
  1342.     CALL    RCVDERR5 ;PRINT # OF ERROR
  1343.  
  1344. RCVDERR2:
  1345.     LDA    ERRCDE    ;GET RECEIVE ERR CODE
  1346.     ANI    ORUNER    ;WAS THERE AN OVERRUN
  1347.     JZ    RCVDERR3 ;NO, GO CHECK FOR PARITY ERROR
  1348.     CALL    ILPRT
  1349. DB    '++Overrun error++ ',0
  1350.     CALL    RCVDERR5
  1351.  
  1352. RCVDERR3:
  1353.     LDA    ERRCDE    ;GET RECEIVE ERR CODE
  1354.     ANI    PARER    ;WAS THERE A PARITY ERROR?
  1355.     JZ    RCVDERR4 ;NO, GO PURGE LINE
  1356.     CALL    ILPRT
  1357. DB    '++Parity error++ ',0
  1358.     CALL    RCVDERR5
  1359.  
  1360. RCVDERR4: JMP    RCVSERR    ;GO PURGE LINE, SEND NAK
  1361.  
  1362. ;Display the number of the error, do a carriage return and line feed.
  1363. RCVDERR5:
  1364.     LDA    ERRCT    ;GET ERROR NUMBER
  1365.     CALL    HEXO    ;DISPLAY IT
  1366.     CALL    CRLF    ;DO CR, LF
  1367.     RET
  1368.  
  1369. RCVSOH:    MVI    B,1
  1370.     CALL    RECV
  1371.     JC    RCVSTOT
  1372.     CALL    RCVERR    ;CHECK FOR RECEIVE ERROR
  1373.     JC    RCVDERR
  1374.     MOV    D,A
  1375.     MVI    B,1
  1376.     CALL    RECV
  1377.     JC    RCVSTOT
  1378.     CALL    RCVERR    ;CHECK FOR RECEIVE ERROR
  1379.     JC    RCVDERR
  1380.     CMA
  1381.     CMP    D
  1382.     JZ    RCVDATA
  1383.     LDA    VSEEFLG
  1384.     ORA    A
  1385.     JZ    RCVBSE
  1386.     LDA    QFLG
  1387.     ORA    A
  1388.     JZ    RCVSERR
  1389. RCVBSE:    CALL    ILPRT
  1390. DB    CR,LF,'++  Bad sector # in Hdr',CR,LF,0
  1391.     JMP    RCVSERR
  1392.  
  1393. RCVDATA:
  1394.     MOV    A,D
  1395.     STA    RCVSNO
  1396.     MVI    A,1
  1397.     STA    DATAFLG
  1398.     MVI    C,0
  1399.     CALL    CLRCRC    ;clear crc counter
  1400.     LXI H,80H
  1401. RCVCHR:    MVI    B,1
  1402.     CALL    RECV
  1403.     JC    RCVSTOT
  1404.     CALL    RCVERR    ;CHECK FOR RECEIVE ERROR
  1405.     JC    RCVDERR
  1406.     MOV    M,A
  1407.     INR    L
  1408.     JNZ    RCVCHR
  1409.     LDA    CRCFLG
  1410.     ORA    A
  1411.     JZ    RCVCRC
  1412.     MOV    D,C
  1413.     XRA    A
  1414.     STA    DATAFLG
  1415.     MVI    B,1
  1416.     CALL    RECV
  1417.     JC    RCVSTOT
  1418.     CALL    RCVERR    ;CHECK FOR RECEIVE ERROR
  1419.     JC    RCVDERR
  1420.     CMP    D
  1421.     JNZ    RCVCERR
  1422. CHKSNUM:
  1423.     LDA    RCVSNO
  1424.     MOV    B,A
  1425.     LDA    SECTNO
  1426.     CMP    B
  1427.     JZ    RECVACK
  1428.     INR    A
  1429.     CMP    B
  1430.     JNZ    ABORT
  1431.     RET
  1432. ;
  1433. RCVCRC:    MVI    E,2    ;nr of crc bytes
  1434.     ;
  1435. RCVCRC2:
  1436.     MVI    B,1
  1437.     CALL    RECV
  1438.     JC    RCVSTOT
  1439.     CALL    RCVERR
  1440.     JC    RCVDERR
  1441.     DCR    E
  1442.     JNZ    RCVCRC2
  1443.     CALL    CHKCRC
  1444.     ORA    A
  1445.     JZ    CHKSNUM
  1446.     LDA    VSEEFLG
  1447.     ORA    A
  1448.     JZ    RCVCRER
  1449.     LDA    QFLG
  1450.     ORA    A
  1451.     JZ    RCVSERR
  1452.     ;
  1453. RCVCRER:
  1454.     CALL    ILPRT
  1455. DB    CR,LF,'++CRC error++',0
  1456.     JMP    RCVPRN
  1457.  
  1458. RCVCERR:
  1459.     LDA    VSEEFLG
  1460.     ORA    A
  1461.     JZ    RCVCPR
  1462.     LDA    QFLG
  1463.     ORA    A
  1464.     JZ    RCVSERR
  1465. RCVCPR:    CALL    ILPRT
  1466. DB    '++Cksum error++ ',0
  1467.     JMP    RCVPRN
  1468.  
  1469. RECVACK:
  1470.     CALL    SENDACK
  1471.     JMP    RCVSECT
  1472.  
  1473. SENDACK:
  1474.     MVI    A,ACK
  1475.     CALL    SEND
  1476.     RET
  1477.  
  1478. SENDHDR:
  1479.     LDA    QFLG
  1480.     ORA    A
  1481.     JZ    SENDHNM
  1482.     CALL    ILPRT
  1483. DB    CR,'Send # ',0
  1484.     PUSH    H
  1485.     LHLD    SECTNO    ;GET SECTOR NUMBER
  1486.     CALL    DECOUT    ;PRINT IT IN DECIMAL
  1487.     CALL    ILPRT
  1488.     DB    '  (',0
  1489.     CALL    DHXOUT    ;16 BIT HEX CONVERSION & OUTPUT
  1490.     CALL    ILPRT
  1491.     DB    'H)',0
  1492.     POP    H
  1493. SENDHNM:
  1494.     MVI    A,SOH
  1495.     CALL    SEND
  1496.     LDA    SECTNO
  1497.     CALL    SEND
  1498.     LDA    SECTNO
  1499.     CMA
  1500.     CALL    SEND
  1501.     RET
  1502.  
  1503. SENDSEC:
  1504.     MVI    A,1
  1505.     STA    DATAFLG
  1506.     MVI    C,0
  1507.     CALL    CLRCRC
  1508.     LXI    H,80H
  1509. SENDC:    MOV    A,M
  1510.     CALL    SEND
  1511.     INR    L
  1512.     JNZ    SENDC
  1513.     XRA    A
  1514.     STA    DATAFLG
  1515.     RET
  1516.  
  1517. SENDCKS:
  1518.     MOV    A,C
  1519.     CALL    SEND
  1520.     RET
  1521.  
  1522. SENDCRC:
  1523.     CALL    FINCRC
  1524.     MOV    A,D
  1525.     CALL    SEND
  1526.     MOV    A,E
  1527.     CALL    SEND
  1528.     XRA    A
  1529.     RET
  1530.  
  1531. GETACK:    MVI    B,7    ;10 IN ORIG PROG
  1532.     CALL    RECVDG
  1533.     JC    GETATOT
  1534.     CPI    ACK
  1535.     RZ
  1536.     MOV    B,A
  1537.     LDA    QFLG
  1538.     ORA    A
  1539.     JZ    ACKERR
  1540.     MOV    A,B
  1541.     CALL    CRLF
  1542.     CALL    HEXO
  1543.     CALL    ILPRT
  1544. DB    'H Recv''d, not ACK',CR,LF,0
  1545. ACKERR:    LDA    ERRCT
  1546.     INR    A
  1547.     STA    ERRCT
  1548.     CPI    ERRLIM
  1549.     RC
  1550.     LDA    VSEEFLG
  1551.     ORA    A
  1552.     JZ    GACKV
  1553.     LDA    QFLG
  1554.     ORA    A
  1555.     JZ    CSABORT
  1556. GACKV:    CALL    CKQUIT
  1557.     STC
  1558.     RZ
  1559. CSABORT:
  1560.     CALL    ERXIT
  1561. DB    CR,LF,'Can''t send sector -- Aborting',CR,LF,'$'
  1562.     ;
  1563. GETATOT:
  1564.     LDA    QFLG
  1565.     ORA    A
  1566.     JZ    ACKERR
  1567.     CALL    ILPRT
  1568. DB    CR,LF,'Timeout on ACK',CR,LF,0
  1569.     JMP ACKERR
  1570.  
  1571. CKABORT:
  1572.     LDA    VSEEFLG
  1573.     ORA    A
  1574.     JZ    CKABGO
  1575.     LDA    QFLG
  1576.     ORA    A
  1577.     RZ    
  1578. CKABGO:    CALL    STAT
  1579.     RZ
  1580.     CALL    KEYIN
  1581.     CPI    CAN
  1582.     RNZ
  1583. ABORT:    LXI    SP,STACK
  1584. ABORTL:    MVI    B,1
  1585.     CALL    RECV
  1586.     JNC    ABORTL
  1587.     MVI    A,CAN
  1588.     CALL    SEND
  1589. ABORTW:    MVI    B,1
  1590.     CALL    RECV
  1591.     JNC    ABORTW
  1592.     MVI    A,' '
  1593.     CALL    SEND
  1594.     CALL    ILPRT
  1595. DB    CR,LF,'Routine cancelled',CR,LF,BELL,0
  1596.     MVI    A,'B'    ;TURN MULTI-FILE MODE..
  1597.     STA    BATCHFLG ;..OFF SO ROUTINE ENDS.
  1598.     JMP    DONETCE
  1599.  
  1600. INCRSNO:
  1601.     PUSH    H
  1602.     LHLD    SECTNO    ;GET SECTOR NUMBER
  1603.     INX    H    ;BUMP IT
  1604.     SHLD    SECTNO    ;STORE IT
  1605.     MOV    A,L
  1606.     POP    H
  1607.     RET
  1608.  
  1609. ERASFIL:
  1610.     LDA    BATCHFLG ;DON'T ASK FOR ERASE..
  1611.     ORA    A    ;..IN MULTI-FILE MODE,..
  1612.     JZ    NOASK    ;..JUST DO IT.
  1613.     LXI    D,FCB
  1614.     MVI    C,SRCHF
  1615.     CALL    BDOS
  1616.     INR    A
  1617.     RZ
  1618.     CALL    ILPRT
  1619. DB    'File exists -- Type ''Y'' to erase: ',BELL,0
  1620.     CALL    KEYIN
  1621.     PUSH    PSW
  1622.     CALL    TYPE
  1623.     POP    PSW
  1624.     CALL    UCASE
  1625.     CPI    'Y'
  1626.     JNZ    MENU
  1627.     CALL    CRLF
  1628.     ;
  1629. NOASK:    LXI    D,FCB
  1630.     MVI    C,ERASE
  1631.     CALL    BDOS
  1632.     RET
  1633.  
  1634. BLKFILE:
  1635.     CALL    ILPRT    ;ROUTINE IF NO FILE IS NAMED FOR "SEND" OR "RECEIVE"
  1636. DB    CR,LF,'No file specified',CR,LF,BELL,0
  1637.     JMP    MENU
  1638.  
  1639. MAKEFIL:
  1640.     LXI    D,FCB
  1641.     MVI    C,MAKE
  1642.     CALL    BDOS
  1643.     INR    A
  1644.     RNZ
  1645.     CALL    ERXIT
  1646. DB    'Error - Can''t make file',CR,LF
  1647. DB    'Directory must be full',CR,LF,'$'
  1648.  
  1649.     IF    CPM2X
  1650. CNREC:    MVI    C,FILSIZ ;COMPUTE FILE SIZE FUNCTION IN CP/M 2.x
  1651.     LXI    D,FCB    ;POINT TO FILE CONTROL BLOCK
  1652.     CALL    BDOS
  1653.     LHLD    FCB+33    ;GET RECORD COUNT
  1654.     SHLD    RCNT    ;STORE IT
  1655.     LXI    H,0    ;ZERO HL
  1656.     SHLD    FCB+33    ;RESET RANDOM RECORD IN FCB
  1657.     RET
  1658.     ENDIF
  1659.  
  1660.     IF    NOT CPM2X
  1661. CNREC:    MVI    A,'?'    ;MATCH ALL EXTENTS
  1662.     STA    FCBEXT
  1663.     MVI    A,0FFH
  1664.     STA    MAXEXT    ;INIT MAX EXT NO.
  1665.     MVI    C,SRCHF    ;GET 'SEARCH FIRST' FNC
  1666.     LXI    D,FCB
  1667.     CALL    BDOS    ;READ FIRST
  1668.     INR    A    ;WERE THERE ANY?
  1669.     JNZ    SOME    ;GOT SOME
  1670.     CALL    ERXIT
  1671. DB    '++File not found++$'
  1672.  
  1673. ;READ MORE DIRECTORY ENTRIES
  1674. MOREDIR:
  1675.     MVI    C,SRCHN    ;SEARCH NEXT
  1676.     LXI    D,FCB
  1677.     CALL    BDOS    ;READ DIR ENTRY
  1678.     INR    A    ;CHECK FOR END (0FFH)
  1679.     JNZ    SOME    ;NOT END OF DIR...PROCESS EXTENT
  1680.     LDA    MAXEXT    ;HIT END...GET HIGHEST EXTENT NO. SEEN
  1681.     MOV    L,A    ;WHICH GIVES EXTENT COUNT -1
  1682.     MVI    H,0
  1683.     MOV    D,H
  1684.     LDA    RCNT    ;GET RECORD COUNT OF MAX EXTENT SEEN
  1685.     MOV    E,A    ;SAVE IT IN DE
  1686.     DAD    H
  1687.     DAD    H    ;MULTIPLY # OF EXTENTS -1
  1688.     DAD    H    ; TIMES 128
  1689.     DAD    H
  1690.     DAD    H
  1691.     DAD    H
  1692.     DAD    H
  1693.     DAD    D    ;ADD IN SIZE OF LAST EXTENT
  1694.     SHLD    RCNT    ;SAVE TOTAL RECORD COUNT
  1695.     RET    ;AND EXIT
  1696.  
  1697. ;POINT TO DIRECTORY ENTRY
  1698. SOME:    DCR    A    ;UNDO PREV 'INR A'
  1699.     ANI    3    ;MAKE MODULUS 4
  1700.     ADD    A    ;MULTIPLY...
  1701.     ADD    A    ;..BY 32 BECAUSE
  1702.     ADD    A    ;..EACH DIRECTORY
  1703.     ADD    A    ;..ENTRY IS 32
  1704.     ADD    A    ;..BYTES LONG
  1705.     LXI    H,80H ;POINT TO BUFFER
  1706.     ADD    L    ;POINT TO ENTRY
  1707.     ADI    15    ;OFFSET TO RECORD COUNT
  1708.     MOV    L,A    ;HL NOW POINTS TO REC COUNT
  1709.     MOV    B,M    ;GET RECORD COUNT
  1710.     DCX    H
  1711.     DCX    H    ;BACK DOWN TO EXTENT NUMBER
  1712.     DCX    H
  1713.     LDA    MAXEXT    ;COMPARE WITH CURRENT MAX.
  1714.     ORA    A    ;IF NO MAX YET
  1715.     JM    BIGGER    ;THEN SAVE RECORD COUNT ANYWAY
  1716.     CMP    M
  1717.     JNC    MOREDIR
  1718. BIGGER:    MOV    A,B    ;SAVE NEW RECORD COUNT
  1719.     STA    RCNT
  1720.     MOV    A,M    ;SAVE NEW MAX. EXTENT NO.
  1721.     STA    MAXEXT
  1722.     JMP    MOREDIR    ;GO FIND MORE EXTENTS
  1723.     ENDIF
  1724.  
  1725. OPENFIL:
  1726.     XRA    A
  1727.     STA    FCBEXT
  1728.     LXI    D,FCB
  1729.     MVI    C,OPEN
  1730.     CALL    BDOS
  1731.     INR    A
  1732.     JNZ    OPENOK
  1733.     CALL    ERXIT
  1734. DB    'Can''t open file$'
  1735.  
  1736. OPENOK:    LDA    BATCHFLG
  1737.     ORA    A
  1738.     JNZ    OPENOK1
  1739.     LDA    QFLG
  1740.     ORA    A
  1741.     RZ
  1742. OPENOK1:
  1743.     CALL    ILPRT
  1744. DB    'File open, size: ',0
  1745.     LHLD    RCNT    ;GET RECORD COUNT
  1746.     CALL    DECOUT    ;PRINT NUMBER OF SECTORS IN DECIMAL
  1747.     CALL    ILPRT    ;PRINT
  1748.     DB    ' (',0
  1749.     CALL    DHXOUT
  1750.     CALL    ILPRT
  1751.     DB    'H) sectors',CR,LF,0
  1752.     RET
  1753.  
  1754. CLOSFIL:
  1755.     LXI    D,FCB
  1756.     MVI    C,CLOSE
  1757.     CALL    BDOS
  1758.     INR    A
  1759.     RNZ
  1760.     CALL    ERXIT
  1761. DB    'Can''t close file$'
  1762.  
  1763. RDSECT:
  1764.     LDA    SECINBF
  1765.     DCR    A
  1766.     STA    SECINBF
  1767.     JM    RDBLOCK
  1768.     LHLD    SECPTR
  1769.     LXI    D,80H
  1770.     CALL    MOVE128
  1771.     SHLD    SECPTR
  1772.     RET
  1773.  
  1774. RDBLOCK:
  1775.     LDA    EOFLG
  1776.     CPI    1
  1777.     STC
  1778.     RZ
  1779.     MVI    C,0
  1780.     LXI    D,DBUF
  1781. RDSECLP:
  1782.     PUSH B
  1783.     PUSH D
  1784.     MVI    C,STDMA
  1785.     CALL    BDOS
  1786.     LXI    D,FCB
  1787.     MVI    C,READ
  1788.     CALL    BDOS
  1789.     POP    D
  1790.     POP    B
  1791.     ORA    A
  1792.     JZ    RDSECOK
  1793.     DCR    A
  1794.     JZ    REOF
  1795.     CALL    ERXIT
  1796. DB    '++    File read error    ++$'
  1797. RDSECOK:
  1798.     LXI    H,80H
  1799.     DAD    D
  1800.     XCHG
  1801.     INR    C
  1802.     MOV    A,C
  1803.     CPI    DBUFSIZ*8 ;BUFFER SIZE IN 128 BYTE SECTORS
  1804.     JZ    RDBFULL
  1805.     JMP    RDSECLP
  1806. REOF:    MVI    A,1
  1807.     STA    EOFLG
  1808.     MOV    A,C
  1809. RDBFULL:
  1810.     STA    SECINBF
  1811.     LXI    H,DBUF
  1812.     SHLD    SECPTR
  1813.     LXI    D,80H
  1814.     MVI    C,STDMA
  1815.     CALL    BDOS
  1816.     JMP    RDSECT
  1817. ;
  1818. WRSECT:    LHLD    SECPTR
  1819.     XCHG
  1820.     LXI    H,80H
  1821.     CALL    MOVE128
  1822.     XCHG
  1823.     SHLD    SECPTR
  1824.     LDA    SECINBF
  1825.     INR    A
  1826.     STA    SECINBF
  1827.     CPI    DBUFSIZ*8 ;BUFFER SIZE IN 128 BYTE SECTORS
  1828.     RNZ
  1829. ;
  1830. WRBLOCK:
  1831.     LDA    SECINBF
  1832.     ORA    A
  1833.     RZ
  1834.     MOV    C,A
  1835.     LXI    D,DBUF
  1836. DKWRLP:    PUSH    H
  1837.     PUSH    D
  1838.     PUSH    B
  1839.     MVI    C,STDMA
  1840.     CALL    BDOS
  1841.     LXI    D,FCB
  1842.     MVI    C,WRITE
  1843.     CALL    BDOS
  1844.     POP    B
  1845.     POP    D
  1846.     POP    H
  1847.     ORA    A
  1848.     JNZ    WRERR
  1849.     LXI    H,80H
  1850.     DAD    D
  1851.     XCHG
  1852.     DCR    C
  1853.     JNZ    DKWRLP
  1854.     XRA    A
  1855.     STA    SECINBF
  1856.     LXI    H,DBUF
  1857.     SHLD    SECPTR
  1858.     RET
  1859.  
  1860. WRERR:    MVI    C,CAN
  1861.     CALL    SEND
  1862.     CALL    ERXIT
  1863. DB    'Error writing file',CR,LF,'$'
  1864.  
  1865. ;---->    RECV: Receive a character
  1866.  
  1867. ;Timeout time is in B, in seconds. Entry via 'RECVDG' deletes garbage
  1868. ;characters on the line. For example, having just sent a sector, calling
  1869. ;RECVDG will delete any line noise induced characters LONG before the
  1870. ;ACK/NAK would be received.
  1871.  
  1872. RECVDG:    EQU $
  1873.     CALL    IN$MODDATP
  1874.     CALL    IN$MODDATP
  1875. RECV:    PUSH    D
  1876.     LDA    FASTCLK
  1877.     ORA    A
  1878.     JZ    MSEC
  1879.     MOV    A,B
  1880.     ADD    A
  1881.     MOV    B,A
  1882. MSEC:    LXI    D,15000    ;60% OF ORIG 50000
  1883.     CALL    CKABORT
  1884. MWTI:    CALL    IN$MODCTLP
  1885.     CALL    ANI$MODRCVB
  1886.     CALL    CPI$MODRCVR
  1887.     JZ    MCHAR
  1888.     DCR    E
  1889.     JNZ    MWTI
  1890.     DCR    D
  1891.     JNZ    MWTI
  1892.     DCR    B
  1893.     JNZ    MSEC
  1894.     POP    D
  1895.     STC
  1896.     RET
  1897.  
  1898. MCHAR:    LDA    PMMIBYTE ;IS THE MODEM A PMMI?
  1899.     ORA    A    ;SET FLAGS
  1900.     JZ    MCHAR1    ;YES, JUMP
  1901.     CALL    IN$MODCTLP ;GET ERROR-STATUS BYTE
  1902.     ANI    ERRCDMSK ;MASK OUT ALL EXCEPT ERROR BITS (3-5)
  1903.     STA    ERRCDE    ;SAVE THE ERROR CODE
  1904. MCHAR1:    CALL    IN$MODDATP
  1905.     POP    D
  1906.     PUSH    PSW
  1907.     CALL    UPDCRC    ;calc crc
  1908.     ADD    C    
  1909.     MOV    C,A
  1910.     LDA    RSEEFLG
  1911.     ORA    A
  1912.     JZ    MONIN
  1913.     LDA    VSEEFLG
  1914.     ORA    A
  1915.     JNZ    NOMONIN
  1916.     LDA    DATAFLG
  1917.     ORA    A
  1918.     JZ    NOMONIN
  1919. MONIN:    POP    PSW
  1920.     PUSH    PSW
  1921.     CALL    SHOW
  1922. NOMONIN:
  1923.     POP    PSW
  1924.     ORA    A
  1925.     RET
  1926.  
  1927. SEND:    PUSH    PSW
  1928.     LDA    SSEEFLG
  1929.     ORA    A
  1930.     JZ    MONOUT
  1931.     LDA    VSEEFLG
  1932.     ORA    A
  1933.     JNZ    NOMONOT
  1934.     LDA    DATAFLG
  1935.     ORA    A
  1936.     JZ    NOMONOT
  1937. MONOUT:    POP    PSW
  1938.     PUSH    PSW
  1939.     CALL    SHOW
  1940. NOMONOT:
  1941.     POP    PSW
  1942.     PUSH    PSW
  1943.     CALl    UPDCRC    ;calc crc
  1944.     ADD    C
  1945.     MOV    C,A
  1946. SENDW:    CALL    IN$MODCTLP
  1947.     CALL    ANI$MODSNDB
  1948.     CALL    CPI$MODSNDR
  1949.     JNZ    SENDW
  1950.     POP    PSW
  1951.     CALL    OUT$MODDATP
  1952.     RET
  1953.  
  1954. WAITNAK:
  1955.     LDA    VSEEFLG
  1956.     ORA    A
  1957.     JZ    WAITNPR
  1958.     LDA    QFLG
  1959.     ORA    A
  1960.     JZ    WAITNLP
  1961. WAITNPR:
  1962.     CALL    ILPRT
  1963. DB    'Awaiting initial NAK',CR,LF,0
  1964. WAITNLP:
  1965.     CALL    CKABORT
  1966.     MVI    B,1
  1967.     CALL    RECV
  1968.     CPI    NAK
  1969.     RZ
  1970.     CPI    CRC    ;crc request?
  1971.     JZ    WAITCRC    ;yes, go set crc flag
  1972.     DCR    E
  1973.     JZ    ABORT
  1974.     JMP    WAITNLP
  1975. ;
  1976. WAITCRC:
  1977.     CALL    ILPRT
  1978. DB    'CRC request received',CR,LF,0
  1979.     XRA    A
  1980.     STA    CRCFLG
  1981.     RET
  1982. ;
  1983. ;--->PARITY: Routine to setup PMMI for odd/even parity.
  1984.  
  1985. PARITY:    LDA    PMMIBYTE ;IS MODEM A PMMI?
  1986.     ORA    A    ;SET FLAGS
  1987.     RZ        ;NO, RETURN
  1988.     LDA    OPARITY    ;GET ODD PARITY REQUEST BYTE
  1989.     ORA    A    ;SET FLAGS
  1990.     JNZ    EVENPAR    ;IF NOT ODD SEE IF IT IS EVEN
  1991.     LDA    UARTCTLB ;GET UART/MODEM CONTROL BYTE
  1992.     ANI    ODPARMSK
  1993.     JMP    PARITY1
  1994.  
  1995. EVENPAR:
  1996.     LDA    EPARITY    ;GET EVEN PARITY REQUEST BYTE
  1997.     ORA    A    ;SET FLAGS
  1998.     RNZ        ;IF EVEN PARITY NOT SPECIFIED RETURN
  1999.     LDA    UARTCTLB ;GET UART/MODEM CONTROL BYTE
  2000.     ANI    ODPARMSK ;SET FOR PARITY
  2001.     ORI    EVPARMSK ;NOW SET FOR EVEN PARITY
  2002.  
  2003. PARITY1:
  2004.     JMP    OUT$MODCTLP ;SEND TO PMMI -
  2005.             ;WHEN OUT$MODCTLP DOES RET IT
  2006.             ;WILL GO BACK TO CALLING ROUTINE
  2007.  
  2008. NOPARIT:
  2009.     LDA    PMMIBYTE
  2010.     ORA    A
  2011.     RZ
  2012.     LDA    UARTCTLB    ;GET UART/MODEM CONTROL BYTE
  2013.     ORI    NOPARMSK    ;RESET PARITY BIT ON PMMI
  2014.     JMP    OUT$MODCTLP
  2015.  
  2016.  
  2017. INITADR:
  2018.     LHLD    1
  2019.     LXI    D,3
  2020.     DAD    D
  2021.     SHLD    VSTAT+1
  2022.     DAD    D
  2023.     SHLD    VKEYIN+1
  2024.     DAD    D
  2025.     SHLD    VTYPE+1
  2026.     LDA    PMMIBYTE
  2027.     ORA    A
  2028.     JZ    JMP$INITMOD    ;RETURN DONE FROM THIS ROUTINE..
  2029.     LDA    IN$MODCTLP+1    ;..IF NOT PMMI
  2030.     STA    OUT$MODCTLP+1
  2031.     INR    A
  2032.     STA    OUT$MODDATP+1
  2033.     STA    IN$MODDATP+1
  2034.     INR    A
  2035.     STA    IN$BAUDRP+1
  2036.     STA    OUT$BAUDRP+1
  2037.     INR    A
  2038.     STA    OUT$MODCTL2+1
  2039.     RET
  2040.  
  2041. PROCOPT:
  2042.     LXI    D,FCB+1
  2043.     LDAX    D
  2044.     STA    OPTION
  2045. OPTLP:    INX    D
  2046.     LDAX    D
  2047.     CPI    ' '
  2048.     JZ    ENDOPT
  2049.     LXI    H,OPTBL
  2050.     MVI    B,OPTBE-OPTBL
  2051. OPTCK:    CMP    M
  2052.     JNZ    OPTNO
  2053.     CPI    'O'    ; @7.61
  2054.     JNZ    OPTCK1    ; @7.61
  2055.     XRA    A    ; @7.61
  2056.     STA    UARTFLG    ; @7.61
  2057.     JMP    OPTCK2    ; @7.61
  2058. OPTCK1:    CPI    'A'    ; @7.61
  2059.     JNZ    OPTCK2    ; @7.61
  2060.     MVI    A,0FFH    ; @7.61
  2061.     STA    UARTFLG    ; @7.61
  2062. OPTCK2:    MVI    M,0    ; @7.61
  2063.     JMP    OPTLP
  2064. OPTNO:    INX    H
  2065.     DCR    B
  2066.     JNZ    OPTCK
  2067.     JMP    BADOPT
  2068.  
  2069. ENDOPT: LDA    CRCFLG
  2070.     ORA    A
  2071.     JNZ    ENDOPT2
  2072.     LDA    OPTION
  2073.     CPI    'R'
  2074.     JNZ    BADOPT    ;crc only allowed for recv
  2075. ;
  2076. ENDOPT2:
  2077.     LDA    VSEEFLG
  2078.     ORA    A
  2079.     RNZ
  2080.     STA    QFLG
  2081.     RET
  2082.  
  2083. DONE:    LDA    BATCHFLG
  2084.     ORA    A
  2085.     JNZ    DONETCC
  2086.     LDA    QFLG
  2087.     ORA    A
  2088.     JZ    NMSTRNS
  2089.     LXI    H,FCB+1    ;PUT FILE NAME IN..
  2090.     LXI    D,FTRNMSG ;..SPACES IN MESSAGE..
  2091.     MVI    B,8    ;..BELOW.
  2092.     CALL    MOVE
  2093.     INX    D    ;PUT FILE TYPE AFTER..
  2094.     MVI    B,3    ;..SKIPPING ONE SPACE..
  2095.     CALL    MOVE    ;..BELOW.    
  2096.     CALL    ILPRT
  2097. FTRNMSG:
  2098. DB    '              transferred',CR,LF,CR,LF,0    ;13 SPACES
  2099.  
  2100. NMSTRNS:
  2101.     LDA    FCB    ;SAVE DRIVE NO.
  2102.     STA    DISKNO
  2103.     LXI    H,FCB    ;BLANK OUT FILE CONTROL BLOCKS
  2104.     CALL    INITFCBS
  2105.     LDA    DISKNO    ;PUT DRIVE NUMBER BACK
  2106.     STA    FCB
  2107.     LXI    H,RESTSN ;RESTORE SECTORE NUMBERS..
  2108.     LXI    D,SECTNOB ;..FOR NEW FILE TRANSFER.
  2109.     MVI    B,SECTNOE-SECTNOB ;ROUTINE ALSO DONE IN MENU.
  2110.     CALL    MOVE
  2111.     LDA    SENDFLG    ;GOES TO EITHER SEND OR..
  2112.     ORA    A    ;..RECEIVE FILE, DEPENDING..
  2113.     JNZ    SENDFIL    ;..UPON WHICH ROUTINE SET..
  2114.     JMP    RCVFIL1    ;..THE FLAG IN MULTI-FILE MODE. @FIX7.61
  2115.  
  2116. DONETCC:
  2117.     MVI    A,TRUE    ;INDICATE NO FILES BEING..
  2118.     STA    FSTFLG    ;RESET MULTIFILE TRANS
  2119.     STA    NFILFLG    ;..USED IN TERMINAL ROUTINE.
  2120.     CMA
  2121.     OUT    FRONTPAN
  2122.     STA    SAVEFLG    ;STOP MEMORY SAVE IN TERM ROUTINE.
  2123.     LDA    VSEEFLG
  2124.     ORA    A
  2125.     JZ    DONETC
  2126.     LDA    QFLG
  2127.     ORA    A
  2128.     JZ    DONETCA
  2129. DONETC:    CALL    ILPRT
  2130. DB    CR,LF,'All transfers completed'
  2131. DB    CR,LF,BELL,0
  2132. DONETCA:
  2133.     LDA    DISCFLG    ;see if disconnect when thru
  2134.     ORA    A
  2135.     JNZ    DONETCE    ;no, don't disconnect
  2136. DONETCB:
  2137.     CALL    ILPRT
  2138. DB    CR,LF,'++Press RETURN to disconnect++',BELL,CR,LF,0
  2139.     MVI    C,RDCON
  2140.     CALL    BDOS    ;wait for response
  2141.     CPI    0DH    ;carriage return
  2142.     JNZ    DONETCB    ;nope
  2143.     CALL    ILPRT
  2144. DB    CR,LF,'++Disconnected++',CR,LF,0
  2145.     CALL    DISCONNT ;hang-up the pmmi
  2146.     JMP    EXIT    ;go to CP/M
  2147.  
  2148. DONETCE:
  2149.     CALL    NOPARIT    ;RESET TO NO PARITY
  2150.     mvi    a,crc    ;@7.41....................
  2151.     sta    CRCFLG    ;turn off CRC option
  2152.     mvi    a,0FFH
  2153.     sta    FIRSTME    ;set first-time flag
  2154.             ;@7.41....................
  2155.     LDA    TERMFLG    ;SEE IF RETURN TO..
  2156.     ORA    A    ;..TERMINAL MODE..
  2157.     JNZ    MENU    ;..AFTER X'FER.
  2158.     CALL    CRLF
  2159.     JMP    TERM
  2160.  
  2161. INITMOD:
  2162. SETBAUD:
  2163.     LDA    PMMIBYTE
  2164.     ORA    A
  2165.     RZ
  2166.     LDA    ANSWFLG    ;IF ANSWER OR ORIGINATE MODE..
  2167.     ORA    A    ;..IS NOT REQUESTED OR NO..
  2168.     JNZ    SKIPB1    ;..BAUDRATE SPECIFIED, THEN..
  2169.     CALL    GETBAUD    ;..ROUTINE RETURNS WITH CHANGE..
  2170.     JMP    FIXBAUD    ;..OF BAUD. IF OPT REQUESTED,..
  2171. SKIPB1:    LDA    ORIGFLG    ;..A BLANK FORCES 300 BAUD..
  2172.     ORA    A    ;..ELSE A 0 FROM NEWBAUD..
  2173.     RNZ        ;..FORCES 300 BAUD.
  2174.     CALL    GETBAUD
  2175. FIXBAUD:
  2176.     CALL    OUT$BAUDRP
  2177.     CPI    52
  2178.     MVI    A,5FH
  2179.     JC    GT300
  2180.     MVI    A,7FH
  2181. GT300:    CALL    OUT$MODCTL2
  2182.     STA    MODCTLB    ;SAVE MODEM CONTROL BYTE
  2183.     LDA    ORIGFLG
  2184.     ORA    A
  2185.     MVI    A,ORIGMOD
  2186.     JZ    OFFHOOK
  2187.     LDA    ANSWFLG
  2188.     ORA    A
  2189.     MVI    A,ANSWMOD
  2190.     RNZ
  2191.  
  2192. OFFHOOK:
  2193.     LXI    H,4000
  2194. OFFDLY:    DCR    L
  2195.     JNZ    OFFDLY
  2196.     DCR    H
  2197.     JNZ    OFFDLY
  2198.     CALL    OUT$MODCTLP
  2199.     RET
  2200.  
  2201. GETBAUD:
  2202.     LDA    FCB+9
  2203.     CPI    ' '
  2204.     MVI    A,52
  2205.     RZ
  2206.     LDA    FCB+9
  2207.     CPI    0
  2208.     MVI    A,52
  2209.     RZ
  2210.  
  2211.     LXI    D,FCB+9
  2212.     LXI    H,0
  2213. DECLP:    LDAX    D
  2214.     INX    D
  2215.     CPI    ' '
  2216.     JZ    DECLP
  2217.     CPI    '0'
  2218.     JC    BADRATE
  2219.     CPI    '9'+1
  2220.     JNC    BADRATE
  2221.     SUI    '0'
  2222.     MOV    B,H
  2223.     MOV    C,L
  2224.     DAD    H
  2225.     DAD    H
  2226.     DAD    B
  2227.     DAD    H
  2228.     ADD    L
  2229.     MOV    L,A
  2230.     JNZ    DIGNC
  2231.     INR    H
  2232. DIGNC:    MOV    A,E
  2233.     CPI    FCB+12
  2234.     JNZ    DECLP
  2235.     MOV    A,H
  2236.     CMA
  2237.     MOV    D,A
  2238.     MOV    A,L
  2239.     CMA
  2240.     MOV    E,A
  2241.     INX    D
  2242.     LXI    H,15625
  2243.     LXI    B,-1
  2244. DIVLP:    INX    B
  2245.     DAD    D
  2246.     JC    DIVLP
  2247.     MOV    A,B
  2248.     ORA    A
  2249.     MOV    A,C
  2250.     RZ
  2251.  
  2252. BADRATE:
  2253.     CALL    ERXIT
  2254. DB    '++    Invalid baud rate ++$'
  2255.  
  2256. MOVEFCB:
  2257.     LXI    H,FCB+16
  2258.     LXI    D,FCB
  2259.     MVI    B,16
  2260.     CALL    MOVE
  2261.     XRA    A
  2262.     STA    FCBSNO
  2263.     STA    FCBEXT
  2264.     RET
  2265.  
  2266. SHOW:    CPI    LF
  2267.     JZ    CTYPE
  2268.     CPI    CR
  2269.     JZ    CTYPE
  2270.     CPI    9
  2271.     JZ    CTYPE
  2272.     CPI    ' '
  2273.     JC    SHOWHEX
  2274.     CPI    7FH
  2275.     JC    CTYPE
  2276. SHOWHEX:
  2277.     PUSH    PSW
  2278.     MVI    A,'('
  2279.     CALL    CTYPE
  2280.     POP    PSW
  2281.     CALL    HEXO
  2282.     MVI    A,')'
  2283.     JMP    CTYPE
  2284.  
  2285. CTYPE:    PUSH    B
  2286.     PUSH    D
  2287.     PUSH    H
  2288.     MOV    E,A
  2289.     MVI    C,WRCON
  2290.     CALL    BDOS
  2291.     POP    H
  2292.     POP    D
  2293.     POP    B
  2294.     RET
  2295.  
  2296. CRLF:    PUSH    PSW
  2297.     MVI    A,CR
  2298.     CALL    TYPE
  2299.     MVI    A,LF
  2300.     CALL    TYPE
  2301.     POP    PSW
  2302.     RET
  2303.  
  2304. TYPE:    PUSH    PSW
  2305.     PUSH    B
  2306.     PUSH    D
  2307.     PUSH    H
  2308.     MOV    C,A
  2309. VTYPE:    CALL    $-$
  2310.     POP    H
  2311.     POP    D
  2312.     POP    B
  2313.     POP    PSW
  2314.     RET
  2315.  
  2316. STAT:    PUSH    B
  2317.     PUSH    D
  2318.     PUSH    H
  2319. VSTAT:    CALL    $-$
  2320.     POP    H
  2321.     POP    D
  2322.     POP    B
  2323.     ORA    A
  2324.     RET
  2325.  
  2326. KEYIN:    PUSH    B
  2327.     PUSH    D
  2328.     PUSH    H
  2329. VKEYIN:    CALL    $-$
  2330.     POP    H
  2331.     POP    D
  2332.     POP    B
  2333.     RET
  2334.  
  2335. UCASE:    CPI    61H    ;CHANGES LOWER CASE CHARACTER..
  2336.     RC        ;..IN A-REG TO UPPER CASE.
  2337.     CPI    7BH
  2338.     RNC
  2339.     ANI    5FH
  2340.     RET
  2341.  
  2342. DECOUT:    PUSH    PSW
  2343.     PUSH    B
  2344.     PUSH    D
  2345.     PUSH    H
  2346.     LXI    B,-10
  2347.     LXI    D,-1
  2348.  
  2349. DECOU2:    DAD    B
  2350.     INX    D
  2351.     JC    DECOU2
  2352.     LXI    B,10
  2353.     DAD    B
  2354.     XCHG
  2355.     MOV    A,H
  2356.     ORA    L
  2357.     CNZ    DECOUT
  2358.     MOV    A,E
  2359.     ADI    '0'
  2360.     CALL    CTYPE
  2361.     POP    H
  2362.     POP    D
  2363.     POP    B
  2364.     POP    PSW
  2365.     RET
  2366.  
  2367. ;---->    DHXOUT: - double precision hex output routine.
  2368.  
  2369. DHXOUT:    PUSH    H
  2370.     PUSH    PSW
  2371.     MOV    A,H    ;GET MS BYTE
  2372.     CALL    HEXO    ;OUTPUT HIGH ORDER BYTE
  2373.     MOV    A,L    ;GET LS BYTE
  2374.     CALL    HEXO    ;OUTPUT LOW ORDER BYTE
  2375.     POP    PSW
  2376.     POP    H
  2377.     RET
  2378.  
  2379. HEXO:    PUSH    PSW
  2380.     RAR
  2381.     RAR
  2382.     RAR
  2383.     RAR
  2384.     CALL    NIBBL
  2385.     POP    PSW
  2386. NIBBL:    ANI    0FH
  2387.     CPI    10
  2388.     JC    ISNUM
  2389.     ADI    7
  2390. ISNUM:    ADI    '0'
  2391.     JMP    TYPE
  2392.  
  2393. ;RETURNS W/ ZERO SET IF RETRY ASKED. IF MULTI-FILE MODE, THEN
  2394. ;NO QUESTIONS ASKED, JUST QUIT
  2395.  
  2396. CKQUIT:    LDA    BATCHFLG
  2397.     ORA    A
  2398.     JNZ    CKQTASK    ;ASK FOR RETRY
  2399.     INR    A    ;RESET ZERO FLG
  2400.     RET
  2401. CKQTASK:
  2402.     XRA    A
  2403.     STA    ERRCT
  2404.     CALL    ILPRT
  2405. DB    'Multiple errors encountered.',CR,LF
  2406. DB    'Type Q to quit, R to retry:  ',BELL,0
  2407.     CALL    KEYIN
  2408.     PUSH    PSW
  2409.     CALL    CRLF
  2410.     POP    PSW
  2411.     CALL    UCASE    ;INSTEAD OF "ANI 5FH"
  2412.     CPI    'R'
  2413.     RZ
  2414.     CPI    'Q'
  2415.     JNZ    CKQUIT
  2416.     ORA    A
  2417.     RET
  2418.  
  2419. ILPRT:    XTHL
  2420. ILPLP:    MOV    A,M
  2421.     ORA    A
  2422.     JZ    ILPRET
  2423.     CALL    CTYPE
  2424.     INX    H
  2425.     JMP    ILPLP
  2426. ILPRET:    XTHL
  2427.     RET
  2428.  
  2429. PRTMSG:    MVI    C,PRINT
  2430.     JMP    BDOS
  2431.  
  2432. ERXIT:    POP    D
  2433.     CALL    PRTMSG
  2434.     CALL    ILPRT
  2435. DB    BELL,0
  2436.     LDA    BATCHFLG
  2437.     ORA    A
  2438.     JNZ    DONETCE
  2439.     MVI    A,'Q'    ;RESET QFLG
  2440.     STA    QFLG
  2441.     JMP    ABORT    ;ABORT OTHER COMPUTER
  2442.  
  2443. EXIT:    LXI    D,80H
  2444.     MVI    C,STDMA
  2445.     CALL    BDOS
  2446.     LHLD    STACK
  2447.     SPHL
  2448.     LDA    SAVCCP
  2449.     ORA    A
  2450.     JZ    0    ;WARM BOOT
  2451.     RET
  2452.  
  2453. MOVE128:
  2454.     MVI    B,128
  2455. MOVE:    MOV    A,M
  2456.     STAX    D
  2457.     INX    H
  2458.     INX    D
  2459.     DCR    B
  2460.     JNZ    MOVE
  2461.     RET
  2462.  
  2463. ;DIALING ROUTINES TAKEN (AND GREATLY MODIFIED) FROM PMMI MANUAL.
  2464.  
  2465. ;MODEM CONTROL COMMAND WORDS
  2466.  
  2467. CLEAR    EQU 3FH    ;IDLE MODE
  2468. MAKEM    EQU 1    ;TELE LINE MAKE (OFF HOOK)
  2469. BRKM    EQU 0    ;TELE LINE ON HOOK (BREAK DURING DIALING)
  2470. DTMSK    EQU 1    ;DIAL TONE MASK
  2471. RBLMT    EQU 70    ;# OF SEC*10 TO WAIT BEFORE GIVING NO RING HEARG MSG
  2472. RBWAIT    EQU 50    ;# OF SEC*10 DELAY BEFORE REDIALING NUMBER
  2473. TMPUL    EQU 80H    ;TIMER PULSES MASK BIT
  2474. TRATE    EQU 250    ;VALUE FOR 0.1 SECOND
  2475.  
  2476.  
  2477. DIALPL:    LDA    PMMIBYTE ;FLAG FOR PMMI OPERATION
  2478.     ORA    A    ;SET FLAGS
  2479.     RZ        ;PMMI FALSE, RETURN
  2480.     XRA    A    ; 0
  2481.     STA    CRFLAG    ;CONTINUOUS REDIAL FLAG
  2482.     CALL    DIALPL0    ; DISCONNECT, RECONNECT, WAIT DIAL TONE
  2483.     JC    DILAGN    ;ASK IF TRY AGAIN
  2484.     LXI    H,CMDBUF+1 ;POINT # OF CHARS IN BUFF
  2485.     MOV    A,M    ;GET # OF CHARS
  2486.     CPI    4    ;4 OR MORE CHARS TYPED BEFORE <CR>?
  2487.     JC    ENTNUM    ;NO, ASK FOR NUMBER
  2488.     LXI    H,CMDBUF+6 ;POINT TO NUMBER TO DIAL
  2489.     JMP    DIAL10    ;CHECK IF LIB #, & DIAL
  2490.  
  2491. DIALPL0:
  2492.     CALL    DISCONNT
  2493.     CALL    ILPRT
  2494. DB    CR,LF,'Waiting for dial tone',CR,LF,0
  2495.  
  2496.     MVI    A,MAKEM    ;MAKE MAKE (OFF-HOOK)
  2497.     CALL    OUT$MODCTLP ;DO IT
  2498.     MVI    D,DTMSK    ;DIAL TONE MASK
  2499.     MVI    C,100    ;10 SECOND WAIT
  2500.     CALL    WAIT    ;WAIT FOR DIAL TONE
  2501.     NOP        ;DELAY
  2502.  
  2503. ; WAIT SUBROUTINE WILL RETURN WITH CARRY SET IF UNABLE TO
  2504. ; GET DIALTONE, ELSE CARRY NOT SET MEANS DIALTONE RECEIVED
  2505.  
  2506.     RNC        ;IF DIAL TONE WITHIN 10 SECONDS
  2507.     CALL    ILPRT    ;ELSE, MESSAGE AND RETURN WITH CARRY SET
  2508. DB    CR,LF
  2509. DB    '++No dial tone after 10 seconds++',CR,LF,0
  2510.     STC
  2511.     RET
  2512.  
  2513. ENTNUM:    ;this is all the set-up for the print at entnum2.
  2514.     MVI    C,13    ;number of lines to move
  2515.     LXI    H,NUMBLIB ;address of source memory
  2516.     LXI    D,DBUF    ;address of target memory
  2517.     CALL    NEWLINE    ;start with CRLF
  2518.     STAX    D    ;+LF
  2519.     INX    D    ;and bump it
  2520.  
  2521. ENTNUM1:
  2522.     MVI    B,30    ;number of bytes to move
  2523.     CALL    MOVE    ;move to buffer
  2524.     CALL    SPACES    ;2 entries + 3 spaces = 63 characters
  2525.     MVI    B,30
  2526.     CALL    MOVE
  2527.     CALL    NEWLINE
  2528.     DCR    C    ;number of lines to print
  2529.     JZ    ENTNUM2
  2530.     JMP    ENTNUM1
  2531.  
  2532. NEWLINE:        ;puts CR-LF at memory pointed by DE
  2533.     MVI    A,CR    ;CR
  2534.     STAX    D    ;store it
  2535.     MVI    A,LF    ;LF
  2536.     INX    D    ;bump pointer
  2537.     STAX    D    ;store LF
  2538.     INX    D    ;bump pointer
  2539.     RET
  2540.  
  2541. SPACES:
  2542.     MVI    A,20H    ;space
  2543.     STAX D ! INX D    ; 1
  2544.     STAX D ! INX D    ; 2
  2545.     STAX D ! INX D    ; 3
  2546.     RET
  2547.  
  2548. ENTNUM2:
  2549.     MVI    A,'$'
  2550.     STAX    D
  2551.     MVI    C,PRINT
  2552.     LXI    D,DBUF    ;point to table of numbers to print
  2553.     CALL    BDOS
  2554.     CALL    CRLF
  2555.  
  2556.     CALL    ILPRT
  2557. DB    'Enter number or library letter - Type C/R when finished,',CR,LF
  2558. DB    'CTRL-X cancels while dialing:        ',0
  2559.  
  2560.     LXI    D,CMDBUF
  2561.     CALL    INBUFF
  2562.  
  2563. DIALLP1:
  2564.     LDA    CMDBUF+1
  2565.     ORA    A    ;NULL MEANS <CR> WAS TYPED
  2566.     JZ    BORTIT    ;ABORT DIALING, RETURN TO MENU
  2567.  
  2568.     LXI    H,CMDBUF+2 ;FIRST TYPED CHAR OF NUMBER TO DIAL
  2569.  ;
  2570.  ; ENTER THIS ROUTINE WITH HL POINTING TO NUMBER TO DIAL
  2571.  ;
  2572. DIAL10:
  2573.     MVI    B,'A'    ;FIRST LETTER OF ALPHABET
  2574.     MVI    E,0    ;COUNTS NUMBER OF LETTERS TO MATCH
  2575.     MVI    C,26    ;NUMBER OF LETTERS IN ALPHABET
  2576.     MOV    A,M    ;GET CHAR BUFFER
  2577. DIAL11:
  2578.     CMP    B    ;NUMBER FROM TABLE?
  2579.     JZ    LIBSET
  2580.     INR    B    ;MAKE NEXT LETTER (A-Z)
  2581.     INR    E    ;COUNT UP
  2582.     DCR    C    ;COUNT DOWN
  2583.     JZ    DIALLPX    ;NOT A LETTER
  2584.     JMP    DIAL11    ;LOOP
  2585.  
  2586. LIBSET:
  2587.     LXI    H,NUMBLIB ;PHONE NUMBER LIBRARY
  2588.     LXI    B,30    ;LENGTH OF LIBRARY ENTRY
  2589.     MOV    A,E    ;NUMBER OF TIMES TO ADD 30 TO HL
  2590.     ORA    A    ;SET FLAGS
  2591.     JZ    DIAL13
  2592.  
  2593. DIAL12:
  2594.     MOV    A,M    ;GET FIRST CHAR OF SELECTED LIB ENTRY
  2595.     ORA    A    ;SET FLAGS
  2596.     JZ    DIALLP2    ;SEND BADLIB MSG
  2597.     DAD    B    ;INCREMENT HL BY 30
  2598.     DCR    E    ;COUNTDOWN
  2599.     JNZ    DIAL12    ;NOT THERE YET, LOOP
  2600.  
  2601. DIAL13:
  2602.     MVI    B,30    ;NUMBER OF CHARACTERS TO GET FROM TABLE
  2603.     LXI    D,CMDBUF+1 ;POINT TO BUFFER
  2604.     XCHG        ;HL POINTS TO CMDBUF+1
  2605.     MOV    M,B    ;STORE # OF BYTES IN A TABLE ENTRY
  2606.     XCHG        ;RESTORE REG.
  2607.     INX    D    ;POINT TO FIRST CHAR POSITION IN BUFFER
  2608.     CALL    MOVE    ;MOVE TABLE ENTRY TO BUFFER
  2609.  
  2610. DIALLPX:
  2611.     LDA    CMDBUF+1
  2612.     MOV    E,A    ;NUMBER OF CHARS IN BUFF
  2613.     LXI    H,CMDBUF+2 ;POINT FIRST CHAR
  2614.  
  2615. DIALLP2:
  2616.     MOV    A,M    ;GET FIRST # FROM BUFFER
  2617.  ;
  2618.  ; ROUTINE TO PRINT 'BADLIB' MESSAGE AND ABORT IF NULL ENCOUNTERED
  2619.  ;
  2620.     ORA    A    ;SET FLAGS
  2621.     PUSH    D    ;SAVE DE REGISTERS
  2622.     LXI    D,BADLIB ;BAD LIBRARY NUMBER IF NULL
  2623.     MVI    C,PRINT    ; 9
  2624.     PUSH    PSW    ;SAVE A AND FLAGS
  2625.     CZ    BDOS
  2626.     POP    PSW    ;RESTORE A AND FLAGS
  2627.     POP    D    ;RESTORE DE REGISTERS
  2628.     JZ    BORTIT    ;ABORT
  2629. ;
  2630. ; DIAL A DIGIT, CHECK KBD FOR ABORT
  2631. ;
  2632.     CALL    DIAL    ;DIAL IT
  2633.     CALL    STAT    ; KEYPRESS?
  2634.     ORA    A    ;SET FLAGS
  2635.     CNZ    KEYIN    ;YES, GO GET IT
  2636.     CPI    CAN    ; ^X?
  2637.     JZ    BORTIT    ;YES, ABORT
  2638.     INX    H    ;BUMP POINTER
  2639.     PUSH    D    ;SAVE DE
  2640.     PUSH    H    ;SAVE HL
  2641.     MVI    B,1    ;WAIT 1 TIME INTERVAL
  2642.     CALL    TIMER
  2643.     POP    H    ;RESTORE HL
  2644.     POP    D    ;RESTORE DE
  2645.     DCR    E    ;COUNT DOWN CHARS IN BUFF
  2646.     JNZ    DIALLP2    ;NOT DONE, LOOP
  2647.     JZ    DIALDN    ;DIALING DONE
  2648.  
  2649. DISCONNT:
  2650.     XRA    A    ;0
  2651.     CALL    OUT$MODCTL2 ;CLEAR DAV, ESD, ETC
  2652.     CALL    OUT$MODCTLP ;HANG-UP
  2653.     PUSH    B
  2654.     MVI    B,8    ;wait for PMMI to disconnect
  2655.     CALL    TIMER
  2656.     POP    B
  2657.     RET
  2658.  
  2659. TIMER:    MVI    A,TRATE    ;TRATE 250, VALUE FOR .1 SEC INTERVAL
  2660.     CALL    OUT$BAUDRP ;B-REG CONTAINS NUMBER OF .1 SEC INTERVALS
  2661. TIMES:    CALL    IN$BAUDRP  ;TO COUNT
  2662.     ANI    TMPUL
  2663.     JZ    TIMES    ;WAIT FOR TIMER TO GO HIGH
  2664. TIMEE:    CALL    IN$BAUDRP
  2665.     ANI    TMPUL
  2666.     JNZ    TIMEE    ;WAIT FOR TIMER TO GO LOW
  2667.     DCR    B
  2668.     JNZ    TIMES
  2669.     RET
  2670.  
  2671. BORTIT:    CALL DISCONNT
  2672.     JMP    MENU
  2673.  
  2674. ;AUTO DIALER
  2675.  
  2676. DIAL:    CALL    TYPE    ;PRINT WHATEVER CHARACTER, DASHES, ETC.
  2677.     CPI    30H
  2678.     RC        ;DIGIT MUST BE AT LEAST 0..
  2679.     CPI    'R'    ;COULD IT BE A RINGBACK CHARACTER
  2680.     JNZ    DIAL1    ;NO? - JUMP
  2681.     PUSH    PSW    ;SAVE ACCUMULATOR & FLAGS
  2682.     MOV    A,E    ;GET # OF CHAR LEFT INTO ACC.
  2683.     CPI    01H    ;IS THIS THE LAST CHARACTER?
  2684.     JZ    RINGBK    ;IF SO, IT MUST BE RINGBACK CHAR - DO RINGBACK
  2685.     POP    PSW    ;EVERYTHING BACK AS IT WAS
  2686. DIAL1:    CPI    3AH
  2687.     RNC        ;..AND NOT MORE THAN 9
  2688.     ANI    0FH    ;STRIP ASCII -- COULD ALSO DO SUI 30H ('0')
  2689.     JNZ    DIALS
  2690.     MVI    A,10    ;CONVERT ZERO TO 10 PULSES
  2691. DIALS:    MOV    C,A
  2692.     LDA    PULSERATE ;CONTAINS VALUE FOR DIAL SPEED
  2693.     CALL    OUT$BAUDRP
  2694. DIALC:    CALL    IN$BAUDRP
  2695.     ANI    TMPUL
  2696.     JNZ    DIALC
  2697. DIALB:    CALL    IN$BAUDRP
  2698.     ANI    TMPUL
  2699.     JZ    DIALB
  2700. MAKEP:    MVI    A,MAKEM
  2701.     CALL    OUT$MODCTLP
  2702. TIMEM:    CALL    IN$BAUDRP
  2703.     ANI    TMPUL
  2704.     JNZ    TIMEM
  2705.     MVI    A,BRKM
  2706.     CALL    OUT$MODCTLP
  2707. TIMEB:    CALL    IN$BAUDRP
  2708.     ANI    TMPUL
  2709.     JZ    TIMEB
  2710.     DCR    C
  2711.     JNZ    MAKEP
  2712.     MVI    A,MAKEM
  2713.     CALL    OUT$MODCTLP
  2714.     MVI    B,2
  2715.     CALL    TIMER
  2716.     RET
  2717.  
  2718. RINGBK:    POP    PSW    ;TO GET IT OFF THE STACK
  2719.     LDA    CMDBUF+1 ;GET # OF CHAR IN BUFFER
  2720.     SUI    01    ;SUBTRACT 1 TO AVOID THE RINGBACK CHAR
  2721.     STA    CMDBUF+1 ;STORE THE NEW VALUE
  2722.     MVI    D,DTMSK    ;LOAD TONE DETECT MASK
  2723.     MVI    C,RBLMT    ;SET TIMER FOR RBLMT NUMBER OF SECONDS
  2724.     CALL    WAIT
  2725.     JC    RBTIME    ;JUMP IF NO RING DETECTED
  2726.     MVI    B,25    ;WAIT 2.5 SEC
  2727.     CALL    TIMER
  2728.     CALL    IN$BAUDRP ;IS TONE STILL PRESENT?
  2729.     ANA    D
  2730.     JNZ    RNGBK1
  2731.     JMP    DILAGN    ;YES, MUST BE BUSY
  2732.  
  2733. RNGBK1:    CALL    HANGP    ;HANG UP THE PHONE
  2734.     MVI    B,RBWAIT ;WAIT X SEC
  2735.     CALL    TIMER
  2736.     CALL    DIALPL0    ;GO OFF HOOK & LISTEN FOR DIAL TONE
  2737.     JNC    DIALLPX    ;GO REDIAL NUMBER
  2738.     JMP    DILAGN    ;NO DIAL TONE HEARD
  2739.  
  2740. RBTIME:    CALL    CRLF
  2741.     JMP    RNGBK1    ;HANGUP, REDIAL, & LISTEN FOR CARRIER
  2742.  
  2743.  
  2744. ;TIME OUT ROUTINE. MUST BE CALLED WITH MASK IN D REG FOR INPUT
  2745. ;AT RELATIVE PORT 2 AND NUMBER OF SECONDS * 10 IN C REG.
  2746.  
  2747. WAIT:    MVI    B,1    
  2748.     CALL    TIMER    ;WAIT FOR TIMER TO GO HIGH THEN LOW
  2749.     CALL    IN$BAUDRP ;PMMIADDR+2 (MODEM STATUS PORT)
  2750.     ANA    D    ;(CTS or DIALTONE MASK)
  2751.     RZ        ;ACTIVE LOW, SO RETURN ON 0
  2752.     PUSH    B    ;SAVE..
  2753.     PUSH    D    ;..ACTIVE REG'S
  2754.     CALL    STAT    ;KEYPRESS?
  2755.     ORA    A    ;SET FLAGS
  2756.     CNZ    KEYIN    ;YES, GET CHAR
  2757.     CPI    CAN    ;^X?
  2758.     JZ    WAIT1    ;YES, DISCONNECT, JMP TO MENU
  2759.     POP D        ;RESTORE..
  2760.     POP B        ;..REGS
  2761.     DCR C        ;COUNT-DOWN
  2762.     JNZ    WAIT
  2763.     STC        ;SET CARRY TO INDICATE MASK NOT SET
  2764.     RET
  2765.  
  2766. WAIT1:
  2767.     POP    D    ;RESET..
  2768.     POP    B    ;..STACK
  2769.     JMP    DISCON1    ;DISCONNECT
  2770.  
  2771. HANGP:    MVI    A,CLEAR
  2772.     CALL    OUT$MODCTL2
  2773.     MVI    A,0
  2774.     CALL    OUT$MODCTLP
  2775.     RET
  2776.  
  2777. DIALDN:    CALL    CRLF
  2778.     MVI    A,07FH        ;TURN ON DTR
  2779.     CALL    OUT$MODCTL2 ;TIMER RATE?
  2780.  
  2781.     MVI    B,1
  2782.     CALL    TIMER    ;WAIT FOR MODEM TO TURN ON DTR
  2783.  
  2784.     MVI    A,5DH    ;2 STOP BITS, NO PARITY, 8 DATA BITS
  2785.             ;+ NO DISCONNECT AFTER 17 SECS
  2786.     CALL    OUT$MODCTLP
  2787.  
  2788.     MVI    D,4      ;CLEAR TO SEND MASK
  2789.     MVI    C,WAITCTS ;wait time for cts (25.5 SEC MAX)
  2790.     CALL    WAIT
  2791.  
  2792.     JNC    CONMADE    ;CONNECTION MADE
  2793.  
  2794.     CALL    DISCONNT
  2795. DILAGN:
  2796.     LDA    CRFLAG    ;CONTINUOUS REDIAL FLAG
  2797.     ORA    A
  2798.     JNZ    DILAGN0
  2799.     CALL    ILPRT
  2800. DB    CR,LF,'No answer after time-out.  Redial? (Y/N/C): ',BELL,0
  2801.     CALL    KEYIN    ;GET RESPONSE
  2802.     CALL    TYPE    ;ECHO IT
  2803.     CALL    UCASE    ;ANI 5FH
  2804.     CALL    CRLF    ;NEW LINE
  2805.     CPI    'N'    ;REDIAL?
  2806.     JZ    MENU    ;NO, GO MENU
  2807.     CPI    'Y'    ;REDIAL?
  2808.     JZ    DILAGN0    ;YES, REDIAL
  2809.     CPI    'C'    ;CONTINUOUS REDIAL?
  2810.     JNZ    DILAGN    ;INVALID RESPONSE, ASK AGAIN
  2811.     XRA A ! CMA    ;0FFH
  2812.     STA    CRFLAG    ;CONTINUOUS REDIAL FLAG
  2813.  DILAGN0:
  2814.     MVI    B,50    ;5 seconds wait for pmmi reset
  2815.     CALL    TIMER    ;else busy tone may be sensed as dialtone
  2816.     CALL    DIALPL0    ;WAIT FOR DIAL TONE
  2817.     JNC    DIALLP1    ;DIAL NUMBER
  2818.     JMP    DILAGN    ;NO DIAL TONE AFTER 10 SECS
  2819.  
  2820. CONMADE:
  2821.     CALL    ILPRT
  2822. DB    CR,LF,'Connection established - Select options: ',BELL,0
  2823. DILAGN1:
  2824.     CALL    STAT    ;KEYPRESS?
  2825.     ORA    A    ;SET FLAGS
  2826.     JNZ    GETCMD    ;KEY PRESSED, GO GET OPTIONS
  2827.     MVI    A,BELL
  2828.     CALL    TYPE    ;RING BELL
  2829.     LXI    B,2000H
  2830. DILAGN2:        ;@7.32.........
  2831.     DCR    C
  2832.     JNZ    DILAGN2    ;KILL SOME TIME FOR TERMINAL TO PROCESS BELL
  2833.     DCR    B
  2834.     JNZ    DILAGN2    ;@7.32.........
  2835.     JMP    DILAGN1    ;LOOP
  2836.  
  2837.  
  2838. ;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH
  2839. SETFCB:    LXI    D,CMDBUF
  2840.     LXI    H,FCB
  2841.     CALL    CPMLINE
  2842.     CALL    PROCOPT
  2843.  
  2844. CHECKNM:
  2845.     LDA    FCB+1    ;CHECK ON THE PRIMARY OPTION
  2846.     CPI    'E'    ;RETURN IF ECHO OPTION
  2847.     RZ
  2848.     CPI    'M'    ;RETURN TO MENU
  2849.     RZ
  2850.     MOV    B,A
  2851.     LDA    PMMIBYTE
  2852.     ORA    A
  2853.     MOV    A,B
  2854.     JZ    S4
  2855.     CPI    'C'
  2856.     RZ
  2857. S4:    CPI    'T'
  2858.     JZ    TERMSEL
  2859.     CPI    'S'
  2860.     JZ    CKFILE
  2861.     CPI    'R'
  2862.     JNZ    BDOPT
  2863.     LDA    BATCHFLG ;IF MULT FILE MODE, THEN..
  2864.     ORA    A     ;..RECV OPT DOES NOT NEED..
  2865.     RZ         ;..NAME.
  2866.     JMP    CKFILE
  2867. BDOPT:    CALL    ILPRT
  2868. DB    CR,LF,'++Bad Option++',CR,LF,0
  2869.     JMP    REENT
  2870. CKFILE:    LDA    FCB+17    ;IF OPTION THAT NEEDS FILE NAME,..
  2871.     CPI    ' '    ;..THEN CHECK TO SEE IF NAME..
  2872.     RNZ        ;..EXISTS. IF NOT..
  2873. REENT:    CALL    ILPRT    ;..DO EVERYTHING OVER.
  2874. DB    CR,LF,'Re-enter PRIMARY option and file name only: ',BELL,0
  2875.     LXI    D,CMDBUF
  2876.     CALL    INBUFF
  2877.     JMP    SETFCB
  2878.  
  2879. TERMSEL:
  2880.     LDA    FCB+17
  2881.     CPI    ' '
  2882.     JNZ    SAVAGN
  2883.     MVI    A,FALSE
  2884.     STA    SAVEFLG
  2885.     MVI    A,TRUE
  2886.     STA    NFILFLG
  2887.     CMA
  2888.     OUT    FRONTPAN
  2889.     RET
  2890. SAVAGN:
  2891.     MVI    A,FALSE
  2892.     STA    NFILFLG
  2893.     RET
  2894.  
  2895. NEWBAUD:
  2896.     LDA    PMMIBYTE
  2897.     ORA    A
  2898.     RZ
  2899.     CALL    ILPRT
  2900. DB    CR,LF,'Enter New Baudrate: ',0    ; @7.61
  2901.     LXI    H,FCB+9
  2902.     MVI    M,0    ;PUTS A ZERO IN FIRST POSITION SO AS TO
  2903. LOOP5:    CALL    KEYIN    ;FORCE THE DEFAULT OPTION OF 300 BAUD.
  2904.     CPI    CR    ;CARRIAGE RET ENTERS BAUD RATE
  2905.     JNZ    CONNEWB    ;GOES TO THE ESTABLISHED ROUTINE - RETURN TO MAIN
  2906.     CALL    CRLF    ;PROGRAM IS DONE THERE.
  2907.     JMP    SETBAUD
  2908. CONNEWB:
  2909.     CPI    30H    ;MAKE SURE IT'S..
  2910.     JC    LOOP5    ;..A DIGIT, ELSE..
  2911.     CPI    3AH    ;..DON'T ACCEPT IT.
  2912.     JNC    LOOP5
  2913.     MOV    M,A
  2914.     MOV    C,A
  2915.     CALL    TYPE    ;ECHO THE CHARACTER ENTERED
  2916.     INX    H
  2917.     JMP    LOOP5
  2918. ;
  2919. ;****************************************************************
  2920. ;* CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20    *
  2921. ;* 8080 Mnemonics                        *
  2922. ;*                                *
  2923. ;*   These subroutines will compute and check a true 16-bit    *
  2924. ;* Cyclic Redundancy Code for a message of arbitrary length.    *
  2925. ;*                                *
  2926. ;* The  use  of this scheme will guarantee detection of all    *
  2927. ;* single and double bit errors, all  errors  with  an  odd    *
  2928. ;* number  of  error bits, all burst errors of length 16 or    *
  2929. ;* less, 99.9969% of all 17-bit error bursts, and  99.9984%    *
  2930. ;* of  all  possible  longer  error bursts.  (Ref: Computer    *
  2931. ;* Networks, Andrew S.  Tanenbaum, Prentiss-Hall, 1981)        *
  2932. ;*                                *
  2933. ;* Designed & coded by Paul Hansknecht, June 13, 1981        *
  2934. ;*                                *
  2935. ;* Copyright (c) 1981, Carpenter Associates            *
  2936. ;*            Box 451                    *
  2937. ;*            Bloomfield Hills, MI 48013            *
  2938. ;*            313/855-3074                *
  2939. ;*                                *
  2940. ;* This program may be freely reproduced for non-profit use.    *
  2941. ;*                                *
  2942. ;****************************************************************
  2943. ;
  2944. ;    ENTRY    CLRCRC,UPDCRC,FINCRC,CHKCRC
  2945. ;
  2946. CLRCRC:    EQU    $    ;Reset CRC Accumulator for a new message.
  2947.     PUSH    H
  2948.     LXI    H,0
  2949.     SHLD    CRCVAL
  2950.     POP    H
  2951.     RET
  2952. ;
  2953. UPDCRC:    EQU    $    ;Update CRC Accumulator using byte in (A).
  2954.     PUSH    PSW
  2955.     PUSH    B
  2956.     PUSH    H
  2957.     MVI    B,8
  2958.     MOV    C,A
  2959.     LHLD    CRCVAL
  2960. ;
  2961. UPDLOOP: MOV    A,C
  2962.     RLC
  2963.     MOV    C,A
  2964.     MOV    A,L
  2965.     RAL
  2966.     MOV    L,A
  2967.     MOV    A,H
  2968.     RAL
  2969.     MOV    H,A
  2970.     JNC    SKIPIT
  2971.     MOV    A,H ;The generator is X^16 + X^12 + X^5 + 1
  2972.     XRI    10H ;as recommended by CCITT.
  2973.     MOV    H,A ;An alternate generator which is often
  2974.     MOV    A,L ;used in synchronous transmission protocols
  2975.     XRI    21H ;is X^16 + X^15 + X^2 + 1. This may be
  2976.     MOV    L,A ;used by substituting XOR 80H for XOR 10H
  2977. SKIPIT:    DCR    B   ;and XOR 05H for XOR 21H in the adjacent code.
  2978.     JNZ    UPDLOOP
  2979.     SHLD    CRCVAL
  2980.     POP    H
  2981.     POP    B
  2982.     POP    PSW
  2983.     RET
  2984. ;
  2985. FINCRC:    EQU    $    ; Finish CRC calc for outbound message.
  2986.     PUSH    PSW
  2987.     XRA    A
  2988.     CALL    UPDCRC
  2989.     CALL    UPDCRC
  2990.     PUSH    H
  2991.     LHLD    CRCVAL
  2992.     MOV    D,H
  2993.     MOV    E,L
  2994.     POP    H
  2995.     POP    PSW
  2996.     RET
  2997. ;
  2998. CHKCRC:    EQU    $    ; Check CRC bytes of received message.
  2999.     PUSH    H
  3000.     LHLD    CRCVAL
  3001.     MOV    A,H
  3002.     ORA    L
  3003.     POP    H
  3004.     RZ
  3005.     MVI    A,0FFH
  3006.     RET
  3007. ;
  3008. CRCVAL:    DW    0
  3009. ;
  3010. MENU:    LXI    H,RESTSN  ;RESTORE SECTORE NUMBERS..
  3011.     LXI    D,SECTNOB ;..FOR NEW FILE TRANSFER.
  3012.     MVI    B,SECTNOE-SECTNOB
  3013.     CALL    MOVE
  3014.     LXI    H,RESTROPT ;RESTORE OPTION TABLE
  3015.     LXI    D,OPTBL
  3016.     MVI    B,OPTBE-OPTBL
  3017.     CALL    MOVE
  3018.     MVI    A,0
  3019.     STA    MFFLG1    ;RESET MFACCESS ROUTINE..
  3020.     CMA        ;..AND MULTI TRANS IN CASE..
  3021.     STA    FSTFLG    ;..OF ABORT.
  3022.  
  3023. MENU1:    LDA    XPRFLG    ;TEST IF MENU SHOULD BE SHOWN
  3024.     ORA    A
  3025.     JNZ    XPRT
  3026. MENU2:    CALL    ILPRT
  3027. DB    CR,LF,CR,LF
  3028. DB    'WRT   - Write file to disk (from terminal mode)',CR,LF
  3029. DB    'DEL   - Erase present file (from terminal mode)',CR,LF
  3030. DB    'RET   - Return to terminal mode with no loss of data',CR,LF,0
  3031.     LDA    PMMIBYTE
  3032.     ORA    A
  3033.     JZ    S5
  3034.     CALL    ILPRT
  3035. DB    'DSC   - Disconnect',CR,LF
  3036. DB    'BYE   - Disconnect and reboot',CR,LF
  3037. DB    'CAL   - Dial number',CR,LF,0
  3038. S5:    CALL    ILPRT
  3039. DB    'XPR   - Toggle expert mode (Menu on/off)',CR,LF
  3040. DB    'DIR   - List directory (may specify drive)',CR,LF
  3041. DB    'CPM   - Exit to CP/M',CR,LF
  3042. DB    'S     - Send CP/M file',CR,LF
  3043. DB    'R     - Receive CP/M file',CR,LF
  3044. DB    'T     - Terminal mode (optional file name)',CR,LF
  3045. DB    'E     - Terminal mode with echo',CR,LF,0
  3046. XPRT:    CALL    ILPRT
  3047. DB    CR,LF,CR,LF,'DEFAULT DRIVE: ',0
  3048.     MVI    C,25    ;CURRENT DISK FUNCTION
  3049.     CALL    BDOS
  3050.     ADI    41H    ;MAKE ASCII
  3051.     CALL    TYPE
  3052.     CALL    ILPRT
  3053. DB    CR,LF,CR,LF,'Command: '
  3054. DB    0
  3055.  
  3056. GETCMD:    LXI    D,CMDBUF ;ENTER COMMAND
  3057.     CALL    INBUFF
  3058.     CALL    CRLF
  3059.     LXI    D,CMDBUF+2 ;POINT TO COMMAND
  3060.     CALL    ILCOMP
  3061. DB    'CPM',0
  3062.     JNC    EXIT
  3063.     CALL    ILCOMP
  3064. DB    'DIR',0
  3065.     JNC    DIR
  3066.     CALL    ILCOMP
  3067. DB    'RET',0
  3068.     JC    NXTOPT1    ;CARRY SET = NO MATCH
  3069.     lda    origsav    ;@MODEM75.FIX
  3070.     sta    origflg    ;@MODEM75.FIX
  3071.     LHLD    HLSAVE    ;RETURN TO TERMINAL..
  3072.     JMP    TERM    ;..MODE WITH SAVE OPTION..
  3073.             ;..IF PREVIOUSLY ENABLED.
  3074. NXTOPT1:
  3075.     LDA    PMMIBYTE
  3076.     ORA    A
  3077.     JZ    S6
  3078.     CALL    ILCOMP    ;DE SET FROM 1ST ILCOMP CALL
  3079. DB    'DSC',0
  3080.     JNC    DISCON1
  3081.     CALL    ILCOMP
  3082. DB    'BYE',0        ;@7.63
  3083.     JNC    BYEBYE
  3084. S6:    CALL    ILCOMP
  3085. DB    'WRT',0
  3086.     JNC    WRTFIL
  3087.     CALL    ILCOMP
  3088. DB    'XPR',0
  3089.     JNC    XPRMODE
  3090.     CALL    ILCOMP
  3091. DB    'DEL',0
  3092.     JNC    NEWFILE
  3093.     LDA    PMMIBYTE
  3094.     ORA    A
  3095.     JZ    NXTOPT2
  3096.     CALL    ILCOMP
  3097. DB    'CAL',0
  3098.     JC    NXTOPT2
  3099.     MVI    A,20H        ;FOOL THE SYSTEM'''
  3100.     STA    CMDBUF+4    ;..CMDBUF SO THAT IT..
  3101.     JMP    DOOPT        ;..LOOKS AT OPTION FOR DIAL
  3102.  
  3103. NXTOPT2:
  3104.     PUSH    H
  3105.     LDA    CMDBUF+2
  3106.     LXI    H,COMPLIST
  3107.     CALL    COMPARE    ;COMPARES LIST POINTED TO BY HL..
  3108.     POP    H    ;..TO CHAR IN A-REG.
  3109.     JC    MENU1    ;CARRY SET = NO MATCH
  3110.  
  3111. DOOPT:    PUSH    H    ;LOAD ORIGINAL FCB WITH TRANSFER..
  3112.     CALL    SETFCB    ;..CMDS AND GO TO BEGINNING OF..
  3113.     POP    H    ;..PROGRAM. WILL FOLLOW SAME LOGIC..
  3114.     JMP    RESTART    ;..AS IF PROGRAM WERE CALLED WITH..
  3115.             ;..CP/M COMMAND LINE.
  3116.  
  3117. DISCON1:
  3118.     LDA    PMMIBYTE
  3119.     ORA    A
  3120.     JZ    MENU
  3121.     CALL    DISCONNT
  3122.     CALL    ILPRT
  3123. DB    CR,LF,'++Disconnected++',CR,LF,BELL,0
  3124.     JMP    MENU
  3125.  
  3126. BYEBYE:    LDA    PMMIBYTE    ;@7.63
  3127.     ORA    A
  3128.     JZ    MENU
  3129.     CALL    ILPRT
  3130. DB    CR,LF,'Goodbye, happy up/down loading',CR,LF,0
  3131.     XRA    A
  3132.     OUT    MODCTLP
  3133.     OUT    MODCTL2
  3134.     LHLD    CLDBOOT    ;GET COLD BOOT PROM ADDRESS ;@7.63
  3135.     PCHL        ;JUMP TO IT
  3136.  
  3137. DIR:    CALL    DIRLST
  3138.     JMP    XPRT
  3139.  
  3140. NEWFILE:
  3141.     LDA    FCB3+1
  3142.     CPI    ' '
  3143.     JZ    MENU1    ;IF NO FILE, DON'T ERASE
  3144.     LXI    D,FCB3
  3145.     MVI    C,ERASE
  3146.     CALL    BDOSRT
  3147.     MVI    A,TRUE    ;DO NOT ALLOW TERMINAL..
  3148.     STA    NFILFLG    ;..SAVE SINCE NO FILE..
  3149.     CMA        ;..SPECIFIED.
  3150.     STA    SAVEFLG
  3151.     OUT    FRONTPAN
  3152.     LXI    H,FCB3
  3153.     CALL    INITFCBS
  3154.     JMP    MENU1
  3155.  
  3156. WRTFIL:
  3157.     LDA    NFILFLG
  3158.     CPI    TRUE
  3159.     JZ    MENU1
  3160.     LDA    FCB3+1    ;CHECK THAT FILE WAS REQUESTED
  3161.     CPI    ' '
  3162.     JZ    MENU1
  3163.     LHLD    HLSAVE
  3164.     CALL    NUMRECS    ;DISK WRITE ROUTINE AS USED IN..
  3165.     CALL    WRTDSK    ;..IN THE INTDSKSV ROUTINE.
  3166.     CALL    CLOSE3
  3167.     MVI    A,TRUE
  3168.     STA    NFILFLG
  3169.     CMA
  3170.     STA    SAVEFLG
  3171.     OUT    FRONTPAN
  3172.     LXI    H,FCB3
  3173.     CALL    INITFCBS ;BLANK OUT FCB SO WRITTEN FILE..
  3174.     JMP    MENU1     ;..CAN'T BE ERASED.
  3175.  
  3176. XPRMODE:
  3177.     LDA    XPRFLG
  3178.     CMA
  3179.     STA    XPRFLG
  3180.     JMP    MENU1
  3181.  
  3182.  
  3183. COMPARE:
  3184.     MOV    B,M    ;COMPARES A-REG WITH LIST..
  3185. COMPLP:    INX    H    ;..ADDRESSED BY HL. FIRST ELEMENT..
  3186.     CMP    M    ;..OF LIST MUST BE NUMBER OF ELEMENTS..
  3187.     JZ    VALID    ;..BEING COMPARED. RETURNS WITH..
  3188.     DCR    B    ;..CARRY SET IF A-REG DOES NOT..
  3189.     JNZ    COMPLP    ;.. CONTAIN AN ELEMENT IN LIST.
  3190.     STC
  3191. VALID:    RET
  3192.  
  3193. COMPLIST: DB 5, 'S', 'R', 'T', 'E', 'M'
  3194.  
  3195. ILCOMP:    INLNCOMP    ;A MACRO IN MACROS.LIB
  3196.  
  3197.  
  3198. INBUFF:    INBUF    ;A MACRO IN "MACROS.LIB"
  3199.  
  3200. ;IF ABOVE ROUTINE DOES NOT LET YOU EDIT IN A PROPER MANNER,
  3201. ;THEN THE MACRO MAY BE SUBSTITUTED FOR THE FOLLOWING ROUTINE:
  3202.  
  3203. ;INBUFF:
  3204. ;    MVI    C,RDBUF
  3205. ;    CALL    BDOSRT
  3206. ;    RET    ;BUT BE CAREFUL OF CONTROL-C
  3207.  
  3208.  
  3209. CPMLINE:
  3210.     CMDLINE    ;A MACRO IN "MACROS.LIB"
  3211.  
  3212. DIRLST:    DIRLIST    ;A MACRO IN "MACROS.LIB"
  3213.  
  3214. NFILFLG:
  3215.     DB FALSE    ;NORMALLY SET TO FALSE. ALLOWS WRITE TO..
  3216.         ;..MEMORY IN TERMINAL MODE.
  3217.  
  3218. OPTION:    DB 0
  3219.  
  3220. OPTBL:    EQU $
  3221. ANSWFLG:
  3222.     DB 'A'
  3223. DISCFLG:
  3224.     DB 'D'
  3225. ORIGFLG:
  3226.     DB 'O'
  3227. QFLG:    DB 'Q'
  3228. RSEEFLG:
  3229.     DB 'R'
  3230. SSEEFLG:
  3231.     DB 'S'
  3232. VSEEFLG:
  3233.     DB 'V'
  3234. TERMFLG:
  3235.     DB 'T'
  3236. EPARITY:
  3237.     DB '0'    ;EVEN PARITY SUB-OPTION - ONLY AVAILABLE IN 'S' AND 'R' MODES
  3238. OPARITY:
  3239.     DB '1'    ;ODD PARITY SUB-OPTION - ONLY AVAILABLE IN 'S' AND 'R' MODES
  3240. BATCHFLG:
  3241.     DS 1    ;SET TO 'B' BY MENU. DOES NOT ALLOW MULTI-..
  3242. OPTBE:    EQU $    ;..FILE XFER WHEN PROGRAM INITIALLY CALLED.
  3243.  
  3244. RESTROPT:    ;MUST BE IN SAME ORDER AS TABLE ABOVE
  3245.  
  3246.     DB 'A','D','O','Q','R','S','V','T'
  3247.     DB '0','1','B'
  3248.  
  3249. CRCFLG:
  3250.     DB 'C'    ;use CRC instead of cksum    ;@7.62 (moved)
  3251.  
  3252. RESTSN:    DB 0,0,0,0,0,0
  3253.     DW DBUF
  3254.     DB 0,0,0,0,0
  3255.  
  3256. SECTNOB:    EQU $
  3257. RCVSNO:        DB 0
  3258. SECTNO:        DW 0
  3259. ERRCT:        DB 0
  3260. ERRCDE:        DB 0
  3261. EOFLG:        DB 0
  3262. SECPTR:        DW DBUF
  3263. SECINBF:    DB 0
  3264. MAXEXT:        DB 0
  3265. RCNT:        DW 0
  3266. DATAFLG:    DB 0
  3267. EXACFL:        DB 0
  3268. SECTNOE:    EQU $
  3269.  
  3270. BADOPT:    CALL    ILPRT
  3271. DB    'Invalid option',CR,LF,BELL,0
  3272.     JMP    MENU
  3273.  
  3274. FSTFLG:    DB TRUE
  3275. FIRSTME:
  3276.     DB    0FFH
  3277.         ;first SOH received switch(it is zero after 1rst SOH)
  3278.  
  3279. CMDBUF:    DB    80H,0
  3280.     DS    80H
  3281. BADLIB:    DB    CR,LF,'++Bad library number called++',CR,LF,'$'
  3282. HLSAVE:    DS    2
  3283. DISKNO:    DS    1
  3284. SENDFLG:
  3285.     DS    1
  3286. NBSAVE:    DS    2
  3287. BGNMS:    DS    2
  3288. FILECT:    DS    1
  3289. NAMECT:    DS    1
  3290. origsav: ds    1    ;@MODEM75.FIX
  3291. MODCTLB:
  3292.     DB    07FH
  3293. UARTFLG:DB    0FFH    ; @7.61
  3294. UARTCTLB:
  3295.     DB    ANSWMOD    ; @7.5  (was previously ORIGMOD)
  3296.  
  3297.     DS    100
  3298. STACK:    DS    2
  3299. FCB3:    DS    33
  3300. FCBBUF:    DS    15
  3301. DBUF:        EQU    $    
  3302. NAMEBUF:    EQU    DBUF+(DBUFSIZ*1024)
  3303.         ;BUFFER FOR NAMES IN BATCH MODE. OVERFLOWS..
  3304.         ;..ABOVE PROGRAM CODE.
  3305.  
  3306. ;    BDOS EQUATES
  3307. RDCON        EQU    1
  3308. WRCON        EQU    2
  3309. PRINT        EQU    9
  3310. RDBUF        EQU    10
  3311. CONST        EQU    11
  3312. OPEN        EQU    15
  3313. CLOSE        EQU    16
  3314. SRCHF        EQU    17
  3315. SRCHN        EQU    18
  3316. ERASE        EQU    19
  3317. READ        EQU    20
  3318. WRITE        EQU    21
  3319. MAKE        EQU    22
  3320. REN        EQU    23
  3321. STDMA        EQU    26
  3322. FILSIZ        EQU    35
  3323. BDOS        EQU    5
  3324. REIPL        EQU    0
  3325. FCB        EQU    5CH
  3326. FCBEXT        EQU    FCB+12
  3327. FCBSNO        EQU    FCB+32
  3328. FCBRNO        EQU    FCB+32
  3329. FCB2        EQU    6CH
  3330.  
  3331. LAST        END    100H
  3332.  
  3333.