home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol093 / modem797.lib < prev    next >
Text File  |  1984-04-29  |  18KB  |  1,037 lines

  1. ; MACROS LIBRARY FOR CP/M ROUTINE SIMULATION   12/27/82
  2. ;
  3. ;
  4. ; CONTAINS:
  5. ;
  6. ;    1)  INBUF    -    Duplicates 'read buffer' routine same as CP/M
  7. ;            function 10, but does not use CTL-C (reason for
  8. ;            for the routine).  Does allow controls U, R, E
  9. ;            and H (backspace).  Outputs bell if the input is
  10. ;            greater than the buffer.
  11. ;    2)  CMDLINE  -    Parses a CPM/M buffer into format same as CP/M
  12. ;            command line.
  13. ;    3)  INLNCOMP -    Compares a string following 'CALL ILCOMP' to a
  14. ;            string addressed by the 'DE' registers.
  15. ;    4)  MFACCESS -    Multi-file access routine from the CP/M user's
  16. ;            group.
  17. ;    5)  SENDTIME -    Shows the time needed to send a file for current
  18. ;            baud rate.  (For 110-9600 baud).
  19. ;    6)  PRTBAUD  -    Shows baud rates set for 'time to send' file
  20. ;            transfer.
  21. ;    7)  DIRLIST  -  Lists directory and gives free space remaining
  22. ;            on the requested drive.
  23. ;
  24. ;
  25. INBUF    MACRO            ;NO PARAMETERS USED.
  26. ;
  27.     LOCAL    START,INBUFO,INBUFA,DELETE,NODEL,ALERT,INBUFLT,CLEAR
  28.     LOCAL    CLEARL,INBUFR,RETYPE,BKSPC,PCRLF,CONIN,COUNOUT,CONIN1
  29.     LOCAL    CONOUT1,NOUCASE,CTLRLP,CONSTAT,CONST1,CONINLP
  30. ;
  31.     PUSH    PSW
  32.     PUSH    H
  33.     PUSH    B
  34.     PUSH    D        ;'DE' REGISTERS MUST BE PUSHED LAST
  35. START
  36.     CALL    CLEAR        ;CLEAR THE BUFFER AREA
  37.     POP    D        ;GET ADDRESS OF BUFFER ON RETRIES
  38.     PUSH    D        ;RESTORE STACK
  39.     XRA    A
  40.     INX    D        ;ADDRESS COUNT FIELD
  41.     STAX    D        ;INITIALIZE WITH A ZERO IN COUNT BYTE
  42.     INX    D
  43.     XCHG            ;ADDRESS FIRST BUFFER BYTE WITH 'HL'
  44. INBUFA
  45.     CALL    CONIN
  46.     CPI    0DH        ;IS IT A RETURN?
  47.     JZ    INBUFR        ;IF SO, THEN RETURN
  48.     CPI    7FH        ;IS IT A DELETE?
  49.     JZ    DELETE
  50.     CPI    8        ;CTL-H WILL BACKSPACE..
  51.     JZ    DELETE        ;..OVER DELETED CHAR.
  52.     CPI    'U'-40H        ;IS IT A CTL-U
  53.     JZ    INBUFO        ;OUTPUT # CR-LF AND START OVER
  54.     CPI    'R'-40H        ;CTL-R RETYPES LINE
  55.     JZ    RETYPE
  56.     CPI    'E'-40H
  57.     JZ    PCRLF
  58.     CPI    20H        ;NO CONTROL CHARACTERS OTHER..
  59.     JC    INBUFA        ;..THAN ABOVE ALLOWED.
  60.     MOV    B,A        ;SAVE INPUTTED CHARACTER
  61.     XCHG            ;SAVE 'HL' IN 'DE'
  62.     POP    H        ;GET ADDRESS OF BUFFER IN 'HL'
  63.     PUSH    H        ;RESTORE STACK
  64.     INX    H        ;ADDRESS COUNT BYTE
  65.     INR    M        ;INCREASE COUNT BYTE
  66.     DCX    H        ;ADDRESS MAXIMUM
  67.     MOV    A,M        ;PUT MAXIMUM IN 'A'
  68.     INX    H        ;ADDRESS COUNT
  69.     CMP    M        ;COMPARE COUNT TO MAXIMUM
  70.     JC    ALERT        ;IF MAXIMUM, RING BELL AND WAIT FOR CR
  71.     XCHG            ;RESTORE BUFFER POINTER TO 'HL'
  72.     MOV    M,B        ;PUT INPUTTED CHARACTER IN BUFFER
  73.     MOV    A,B        ;OUTPUT IT
  74.     CALL    CONOUT
  75.     INX    H        ;BUMP POINTER
  76.     JMP    INBUFA        ;GET NEXT CHARACTER
  77. ;
  78. DELETE
  79.     XCHG            ;SAVE BUFFER POINTER IN 'DE'
  80.     POP    H        ;ADDRESS BEGINNING OF BUFFER
  81.     PUSH    H        ;RESTORE STACK
  82.     INX    H        ;ADDRESS COUNT FIELD
  83.     MOV    B,A        ;SAVE DELETE CHAR - 7FH OR 08H
  84.     MOV    A,M
  85.     SUI    1        ;DECREASE COUNT
  86.     MOV    M,A
  87.     JC    NODEL        ;DON'T DELETE PAST BEGINING OF BUFFER.
  88.     XCHG            ;RESTORE BUFFER POINTER TO 'HL'
  89.     DCX    H        ;POINT TO LAST BYTE INPUTTED
  90.     MOV    A,B        ;GET BACK EITHER 7FH OR 08H
  91.     MOV    B,M        ;GET CHARACTER BEING DELETED
  92.     MVI    M,20H        ;RESTORE BLANK
  93.     CPI    8
  94.     JZ    BKSPC
  95.     CPI    7FH
  96.     JZ    BKSPC0
  97.     JMP    INBUFA        ;GET NEXT CHARACTER
  98. ;
  99. NODEL
  100.     INR    M        ;DON'T LEAVE COUNT NEGATIVE
  101.     XCHG            ;RESTORE POINTER TO 'HL'
  102.     JMP    INBUFA
  103. ;
  104. BKSPC0
  105.     MVI    A,08H
  106. BKSPC
  107.     CALL    CONOUT        ;TRUE ERASE IF 08H
  108.     MVI    A,20H
  109.     CALL    CONOUT
  110.     MVI    A,8
  111.     CALL    CONOUT
  112.     JMP    INBUFA
  113. ;
  114. INBUFO
  115.     MVI    A,'#'
  116.     CALL    CONOUT
  117.     MVI    A,0DH
  118.     CALL    CONOUT
  119.     MVI    A,0AH
  120.     CALL    CONOUT
  121.     JMP    START
  122. ;
  123. RETYPE
  124.     POP    D
  125.     PUSH    D
  126.     INX    D        ;POINT TO CURRENT NUMBER..
  127.     LDAX    D        ;..OF CHARACTERS.
  128.     MOV    B,A
  129.     MVI    A,'#'
  130.     CALL    CONOUT
  131.     MVI    A,0DH
  132.     CALL    CONOUT
  133.     MVI    A,0AH
  134.     CALL    CONOUT
  135.     MOV    A,B        ;TEST IF ZERO INPUT
  136.     ORA    A
  137.     JZ    INBUFA
  138. CTLRLP
  139.     INX    D
  140.     LDAX    D
  141.     CALL    CONOUT
  142.     DCR    B
  143.     JNZ    CTLRLP
  144.     JMP    INBUFA
  145. ;    
  146. ALERT
  147.     MVI    A,7
  148.     CALL    CONOUT
  149.     DCR    M
  150.     XCHG
  151.     JMP    INBUFA
  152. ;
  153. PCRLF
  154.     MVI    A,0DH
  155.     CALL    CONOUT
  156.     MVI    A,0AH
  157.     CALL    CONOUT
  158.     JMP    INBUFA
  159. ;
  160. INBUFR
  161.     MVI    A,0DH
  162.     CALL    CONOUT
  163.     MVI    A,0AH
  164.     CALL    CONOUT
  165.     POP    D
  166.     POP    B
  167.     POP    H
  168.     POP    PSW
  169.     RET
  170. ;
  171. CLEAR
  172.     POP    D        ;ACCOUNTS FOR CALL
  173.     POP    H        ;ADDRESS BUFFER IN 'HL'
  174.     PUSH    H        ;RESTORE..
  175.     PUSH    D        ;..STACK
  176.     MOV    B,M        ;SAVE MAXIMUM IN 'B'
  177.     INX    H        ;POINT TO FIRST..
  178.     INX    H        ;..BUFFER BYTE.
  179.     MVI    A,20H
  180. CLEARL
  181.     MOV    M,A
  182.     INX    H
  183.     DCR    B
  184.     JNZ    CLEARL
  185.     RET
  186. ;
  187. CONIN
  188.     PUSH    H
  189.     PUSH    D
  190.     PUSH    B
  191. CONINLP
  192.     CALL    CONSTAT
  193.     ORA    A
  194.     JZ    CONINLP
  195.     CALL    CONIN1
  196.     CPI    61H        ;CHANGE TO UPPER..
  197.     JC    NOUCASE        ;..CASE SINCE CP/M..
  198.     CPI    7BH        ;..DOES THE SAME.
  199.     JNC    NOUCASE
  200.     ANI    5FH
  201. NOUCASE
  202.     POP    B
  203.     POP    D
  204.     POP    H
  205.     RET
  206. ;
  207. CONIN1
  208.     LHLD    1
  209.     LXI    D,6
  210.     DAD    D
  211.     PCHL
  212. ;
  213. CONSTAT    PUSH    H
  214.     PUSH    D
  215.     PUSH    B
  216.     CALL    CONST1
  217.     POP    B
  218.     POP    D
  219.     POP    H
  220.     RET
  221. ;
  222. CONST1
  223.     LHLD    1
  224.     LXI    D,3
  225.     DAD    D
  226.     PCHL
  227. ;
  228. CONOUT    PUSH    H
  229.     PUSH    D
  230.     PUSH    B
  231.     PUSH    PSW
  232.     CALL    CONOUT1
  233.     POP    PSW
  234.     POP    B
  235.     POP    D
  236.     POP    H
  237.     RET
  238. ;
  239. CONOUT1
  240.     LHLD    1
  241.     LXI    D,9
  242.     DAD    D
  243.     MOV    C,A
  244.     PCHL
  245. ;
  246.     ENDM
  247. ;.....
  248. ;
  249. ;
  250. CMDLINE    MACRO            ;NO PARAMETERS USED
  251.  
  252. ; Loads a command line addressed by 'DE' registers (max # characters in
  253. ; line in 'DE', number of characters in the line in 'DE'+1, line starts
  254. ; in 'DE'+2) into FCB addressed by 'HL' registers.  The FCB should be at
  255. ; least 33 bytes in length.  The command line buffer must have a maximum
  256. ; length of at least one more than the greatest number of characters
  257. ; that will be needed.
  258. ;
  259.     LOCAL    CMDLINE,DEFDR,DONE,DRIVE,FILL1,FILL,FILL2,INIT,INITL1
  260.     LOCAL    INITL2,INITL3,INITL4,NAME1,NAME2,SCAN,TRANS,TSTNAM
  261.     LOCAL    TSTTYP,TSTTYPL,TYPE1,TYPE2,NAME2C
  262. ;
  263.     PUSH    PSW
  264.     PUSH    B
  265.     PUSH    D
  266.     PUSH    H
  267. ;
  268.     CALL    INIT        ;FILLS FCBS WITH BLANKS AND NULLS
  269. ;
  270.     XCHG            ;GET START OF COMMAND LINE IN 'HL'
  271.     INX    H        ;ADDRESS # BYTES IN CMD LINE
  272.     MOV    E,M        ;LOAD 'DE' PAIR WITH # BYTES
  273.     MVI    D,0
  274.     INX    H
  275.     DAD    D        ;POINT TO BYTE AFTER LAST CHAR..
  276.     MVI    M,0DH        ;..IN CMD LINE AND STORE DELIMITER
  277.     POP    H        ;RESTORE 'HL' AND 'DE'
  278.     POP    D
  279.     PUSH    D
  280.     PUSH    H
  281.     INX    D        ;ADDRESS START OF COMMAND
  282.     INX    D
  283. ;
  284.     CALL    DRIVE
  285. NAME1
  286.     MVI    C,8        ;TRANSFER FIRST FILENAME TO FCB
  287.     CALL    TRANS
  288.     CPI    0DH
  289.     JZ    DONE
  290.     CPI    20H        ;IF SPACE, THEN START OF..
  291.     JZ    NAME2        ;..SECOND FILENAME.
  292. TYPE1
  293.     POP    H        ;FILETYPE MUST BE AFTER..
  294.     PUSH    H        ;..EIGHTH BYTE OF NAME
  295.     LXI    B,9
  296.     DAD    B
  297.     MVI    C,3        ;TRANSFER TYPE OF FIRST FILE
  298.     CALL    TRANS
  299.     CPI    0DH
  300.     JZ    DONE
  301. NAME2
  302.     LDAX    D        ;EAT MULTIPLE SPACES..
  303.     CPI    20H        ;..BETWEEN NAMES
  304.     JNZ    NAME2C
  305.     INX    D
  306.     JMP    NAME2
  307.     LDAX    D
  308.     CPI    0DH        ;TEST IF FIRST NAME..
  309.     JZ    DONE        ;..ONLY AND THEN SPACE
  310. NAME2C
  311.     POP    H        ;SECOND NAME STARTS IN 16TH BYTE
  312.     PUSH    H        ;POINT 'HL' TO THIS BYTE
  313.     LXI    B,16
  314.     DAD    B
  315.     CALL    DRIVE
  316.     MVI    C,8
  317.     CALL    TRANS
  318.     CPI    0DH
  319.     JZ    DONE
  320. TYPE2
  321.     POP    H        ;SECOND TYPE STARTS IN 25TH BYTE.
  322.     PUSH    H
  323.     LXI    B,25
  324.     DAD    B
  325.     MVI    C,3
  326.     CALL    TRANS
  327. DONE
  328.     POP    H
  329.     PUSH    H
  330.     INX    H        ;POINT TO 1ST CHAR OF 1ST NAME IN FCB
  331.     CALL    SCAN        ;CHECK FOR * (AMBIGUOUS NAMES).
  332.     POP    H
  333.     PUSH    H
  334.     LXI    B,17        ;POINT TO 1ST CHAR OF 2ND NAME IN FCB.
  335.     DAD    B
  336.     CALL    SCAN
  337.     POP    H
  338.     POP    D
  339.     POP    B
  340.     POP    PSW
  341.     RET
  342. ;
  343. ;
  344. INIT    PUSH    H        ;INITIALIZES FCB WITH 1 NULL (FOR 1ST DRIVE),..
  345.     PUSH    B        ;..11 BLANKS, 4 NULLS, 1 NULL (FOR 2ND DRIVE),..
  346.     MVI    M,0        ;..11 BLANKS, AND 4 NULLS
  347.     INX    H
  348.     MVI    B,11
  349.     MVI    A,20H
  350.     CALL    INITFILL
  351.     MVI    B,5
  352.     MVI    A,0
  353.     CALL    INITFILL
  354.     MVI    B,11
  355.     MVI    A,20H
  356.     CALL    INITFILL
  357.     MVI    B,4
  358.     MVI    A,0
  359.     CALL    INITFILL
  360.     POP    B
  361.     POP    H
  362.     RET
  363. ;
  364. INITFILL
  365.     MOV    M,A
  366.     INX    H
  367.     DCR    B
  368.     JNZ    INITFILL
  369.     RET
  370. ;
  371. DRIVE    INX    D        ;CHECK 2ND BYTE OF FILENAME. IF IT..
  372.     LDAX    D        ;..IS A ":", THEN DRIVE WAS SPECIFIED
  373.     DCX    D
  374.     CPI    ':'
  375.     JNZ    DEFDR        ;ELSE ZERO FOR DEFAULT DRIVE ('INIT' PUT ZERO)
  376.     LDAX    D
  377.     ANI    5FH
  378.     SUI    40H        ;CALCULATE DRIVE (A=1, B=2,...)..
  379.     MOV    M,A        ;..AND PLACE IT IN FCB
  380.     INX    D        ;ADDRESS FIRST BYTE OF..
  381.     INX    D        ;..IN CMD LINE..
  382. DEFDR
  383.     INX    H        ;..AND NAME FIELD IN FCB
  384.     RET
  385. ;
  386. TRANS
  387.     LDAX    D        ;TRANSFER FROM CMD LINE TO FCB..
  388.     INX    D        ;..UP TO NUMBER OF CHARS SPECIFIED..
  389.     CPI    0DH        ;..BY 'C' REG. KEEP SCANNING FIELD..
  390.     RZ            ;..WITHOUT TRANSFER UNTIL A DELIMITING..
  391.     CPI    '.'        ;..FIELD CHAR SUCH AS '.', BLANK, OR..
  392.     RZ            ;..C/R (FOR END OF CMD LINE)
  393.     CPI    20H
  394.     RZ
  395.     DCR    C
  396.     JM    TRANS        ;ONCE 'C' REG IS LESS THAN '0' KEEP READING
  397.     MOV    M,A        ;..CMD LINE BUT DO NOT TRANSFER TO FCB
  398.     INX    H
  399.     JMP    TRANS
  400. ;
  401. SCAN
  402.     MVI    B,8        ;SCAN FILE NAME ADDRESSED BY 'HL'
  403. TSTNAM
  404.     MOV    A,M
  405.     CPI    '*'        ;IF '*' FOUND, FILL IN REST OF FIELD..
  406.     JZ    FILL1        ;..WITH '?' FOR AMBIGUOUS NAME
  407.     INX    H
  408.     DCR    B
  409.     JNZ    TSTNAM
  410.     JMP    TSTTYP
  411. FILL1
  412.     CALL    FILL
  413. TSTTYP
  414.     MVI    B,3        ;SCAN AND FILL TYPE FIELD FOR NAME..
  415. TSTTYPL
  416.     MOV    A,M        ;..SPECIFIED ABOVE
  417.     CPI    '*'
  418.     JZ    FILL2
  419.     INX    H
  420.     DCR    B
  421.     RZ
  422.     JMP    TSTTYPL
  423. ;
  424. FILL2
  425. ;
  426. FILL
  427.     MVI    M,'?'    ;ROUTINE TRANSFERS '?'
  428.     INX    H
  429.     DCR    B
  430.     JNZ    FILL
  431.     RET
  432. ;
  433.     ENDM
  434. ;.....
  435. ;
  436. ;
  437. INLNCOMP    MACRO        ;NO PARAMETERS USED
  438. ;
  439. ; In-line compare.  Compares string addressed by 'DE' pair to string af-
  440. ; the call (ends with '0').  Return with carry set means strings not the
  441. ; same.  All registers (except 'A') are unaffected.
  442. ; SAME.  ALL REGISTERS EXCEPT A-REG ARE UNAFFECTED.
  443. ;
  444.     LOCAL    ILCOMPL,SAME,NOTSAME,NSLP
  445. ;
  446.     XTHL            ;POINT 'HL' TO 1ST CHARACTER
  447.     PUSH    D
  448. ILCOMPL
  449.     MOV    A,M        ;'HL' POINTS TO IN-LINE STRING
  450.     ORA    A        ;END OF STRING IF ZERO
  451.     JZ    SAME
  452.     LDAX    D
  453.     CMP    M
  454.     JNZ    NOTSAME
  455.     INX    H
  456.     INX    D
  457.     JMP    ILCOMPL
  458. ;
  459. NOTSAME
  460.     MVI    A,0        ;IF NOT SAME, FINISH THRU..
  461. NSLP
  462.     INX    H        ;..STRING SO RETURN WILL..
  463.     CMP    M        ;..GO TO INSTRUCTION AFTER..
  464.     JNZ    NSLP        ;..STRING AND NOT REMAINDER OF STRING
  465.     STC
  466. SAME
  467.     POP    D
  468.     INX    H        ;AVOIDS A NOP INSTRUCTION..
  469.     XTHL            ;..WHEN RETURNING
  470.     RET
  471. ;
  472.     ENDM
  473. ;.....
  474. ;
  475. ;
  476. MFACCESS    MACRO        ;NO PARAMETERS USED
  477. ;
  478. ; Multi-file access subroutine.  Allows processing of multiple files
  479. ; (i.e., *.ASM) from disk.  This routine builds the proper name in the
  480. ; FCB each time it is called.  This command would be used in such pro-
  481. ; grams such as modem transfer, tape save, etc. in which you want to
  482. ; process single or multiple files.
  483. ;
  484. ; The FCB will be set up with the next name, ready to do normal proces-
  485. ; sing (OPEN, READ, etc.) when routine is called.
  486. ;
  487. ; Carry is set if no more names can be found
  488. ;
  489. ; Define data move MACRO
  490. ;
  491.     LOCAL     MOVE,CPM,MFNAME,MFN01,MFN02,MFFIX1,MFREQ,MFCUR,MOVER
  492.     LOCAL    SRCHF,SRCHN,STDMA,BDOS,FCB,FCBEXT,FCBRNO
  493. ;
  494. ;                ;MFFLG1 IS NOT SET LOCAL BECAUSE IT MUST
  495. ;                ;BE RESET IN MAIN MODEM PROGRAM ON AN
  496. ;                ;ABORT
  497. ;
  498. MOVE    MACRO    ?F,?T,?L,?I
  499.     IF    NOT NUL ?F
  500.     LXI    H,?F
  501.     ENDIF
  502.     IF    NOT NUL ?T
  503.     LXI    D,?T
  504.     ENDIF
  505.     IF    NOT NUL ?L
  506.     LXI    B,?L
  507.     ENDIF
  508.     IF    NOT NUL ?I
  509.     LOCAL    ?B,?Z
  510.     CALL    ?Z
  511. ?B    DB    ?I
  512. ?Z    POP    H        ;GET TO
  513.     LXI    B,?Z-?B
  514.     ENDIF
  515.     CALL    MOVER
  516. MF    SET    -1        ;SHOW EXPANSION
  517.     ENDM
  518. ;...
  519. ;
  520. ;
  521. ;DEFINE CP/M MACRO - CPM FNC,PARM
  522. ;
  523. CPM    MACRO    ?F,?P
  524.     PUSH    B
  525.     PUSH    D
  526.     PUSH    H
  527.     IF    NOT NUL ?F
  528.     MVI    C,?F
  529.     ENDIF
  530.     IF    NOT NUL ?P
  531.     LXI    D,?P
  532.     ENDIF
  533.     CALL    BDOS
  534.     POP    H
  535.     POP    D
  536.     POP    B
  537.     ENDM
  538. ;...
  539. ;
  540. ;
  541. ;    MULTI-FILE ACCESS SUBROUTINE
  542. ;
  543. ; The routine is commented in pseudo code, each pseudo code statement is
  544. ; in <<...>>
  545. ;
  546. MFNAME
  547. ;
  548. ;<<INIT DMA ADDR, FCB>>
  549. ;
  550.     CPM    STDMA,80H
  551.     XRA    A
  552.     STA    FCBEXT
  553. ;
  554. ;<<IF FIRST TIME>>
  555. ;
  556.     LDA    MFFLG1
  557.     ORA    A
  558.     JNZ    MFN01
  559. ;
  560. ;  <<TURN OFF 1ST TIME SW>>
  561. ;
  562.     MVI    A,1
  563.     STA    MFFLG1
  564. ;
  565. ;  <<SAVE THE REQUESTED NAME>>
  566. ;
  567.     MOVE    FCB,MFREQ,12    ;SAVE ORIG REQ
  568.     LDA    FCB
  569.     STA    MFCUR        ;SAVE DISK IN CURRENT FCB
  570. ;
  571. ;  <<SRCHF REQ NAME>>
  572. ;
  573.     MOVE    MFREQ,FCB,12
  574.     CPM    SRCHF,FCB
  575. ;
  576. ;<<ELSE>>
  577. ;
  578.     JMP    MFN02
  579. MFN01
  580. ;
  581. ;  <<SRCHF CURR NAME>>
  582. ;
  583.     MOVE    MFCUR,FCB,12
  584.     CPM    SRCHF,FCB
  585. ;
  586. ;  <<SRCHN REQ NAME>>
  587. ;
  588.     MOVE    MFREQ,FCB,12
  589.     CPM    SRCHN,FCB
  590. ;
  591. ;<<ENDIF>>
  592. ;
  593. MFN02
  594. ;
  595. ;<<RETURN CARRY IF NOT FOUND>>
  596. ;
  597.     INR    A
  598.     STC
  599.     JNZ    MFFIX1
  600.     STA    MFFLG1
  601.     RET
  602. ;
  603. ;
  604. MFFIX1
  605. ;
  606. ;<<MOVE NAME FOUND TO CURR>>
  607.  
  608.     DCR    A
  609.     ANI    3
  610.     ADD    A
  611.     ADD    A
  612.     ADD    A
  613.     ADD    A
  614.     ADD    A
  615.     ADI    81H
  616.     MOV    L,A
  617.     MVI    H,0
  618.     PUSH    H        ;SAVE NAME POINTER
  619.     MOVE     ,MFCUR+1,11
  620. ;
  621. ;<<MOVE NAME FOUND TO FCB>>
  622. ;
  623.     POP    H
  624.     MOVE    ,FCB+1,11
  625. ;
  626. ;<<SETUP FCB>>
  627. ;
  628.     XRA    A
  629.     STA    FCBEXT
  630.     STA    FCBRNO
  631. ;
  632. ;<<RETURN>>
  633. ;
  634.     RET
  635. ;
  636. ;
  637. ; Multi-file access work area
  638.  
  639. MFFLG1    DB    0    ;1ST TIME SW
  640. MFREQ    DS    12    ;REQ NAME
  641. MFCUR    DS    12    ;CURR NAME
  642. ;
  643. ; Move subroutine
  644. ;
  645. MOVER    MOV    A,M
  646.     STAX    D
  647.     INX    H
  648.     INX    D
  649.     DCX    B
  650.     MOV    A,B
  651.     ORA    C
  652.     JNZ    MOVER
  653.     RET
  654. ;
  655. ;
  656. ; Equates used by multi-access subroutine
  657.  
  658. SRCHF    EQU    17
  659. SRCHN    EQU    18
  660. STDMA    EQU    26
  661. BDOS    EQU    5
  662. FCB    EQU    5CH 
  663. FCBEXT    EQU    FCB+12
  664. FCBRNO    EQU    FCB+32
  665.     ENDM
  666. ;.....
  667. ;
  668. ;
  669. SENDTIME MACRO            ;NO PARAMETERS USED
  670. ;
  671. ; Shows the time to transfer a file at various baud rates
  672. ;
  673.     LOCAL    BTABLE,SECTBL,DVHLDE,DIVL1,MULHLA,MULLP,SHFTHL
  674.  
  675.     CALL    ILPRT            ;PRINT:
  676.     DB    'File open:  ',0
  677.     LHLD    RCNT        ;GET RECORD COUNT.
  678.     CALL    DECOUT        ;PRINT DECIMAL NUMBER OF RECORDS
  679.     CALL    ILPRT
  680.     DB    ' (',0
  681.     CALL    DHXOUT        ;NOW PRINT SIZE IN HEX.
  682.     CALL    ILPRT
  683.     DB    ' Hex) Records',CR,LF
  684.     DB    'Send time:  ',0
  685.     LDA    MSPEED        ;GET THE SPEED INDICATOR
  686.     MVI    D,0
  687.     MOV    E,A        ;SET UP FOR TABLE ACCESS
  688.     LXI    H,BTABLE    ;POINT TO BAUD FACTOR TABLE
  689.     DAD    D        ;INDEX TO PROPER FACTOR
  690.     DAD    D        ;FACTOR IN DE
  691.     MOV    E,M
  692.     INX    H
  693.     MOV    D,M
  694.     LHLD    RCNT        ;GET # OF RECORDS
  695.     CALL    DVHLDE        ;DIVIDE 'HL' BY VALUE IN DE (RECORDS/MIN)
  696.     PUSH    H
  697.     MOV    L,C
  698.     MOV    H,B
  699.     CALL    DECOUT        ;PRINT THE MINUTES PORTION
  700.     CALL    ILPRT
  701.     DB    ' mins, ',0
  702.     LXI    H,SECTBL    ;POINT TO DIVISORS FOR SECONDS
  703.     LXI    D,0        ;   CALCULATION
  704.     LDA    MSPEED        ;GET INDEX FOR BAUD RATE
  705.     MOV    E,A
  706.     DAD    D        ;INDEX INTO TABLE
  707.     MOV    A,M        ;GET MULTIPLIER
  708.     POP    H        ;GET REMAINDER
  709.     CALL    MULHLA        ;MULTIPLY THE 'HL' x 'A'
  710.     CALL    SHFTHL
  711.     CALL    SHFTHL
  712.     CALL    SHFTHL
  713.     CALL    SHFTHL    
  714.     MVI    H,0
  715.     CALL    DECOUT        ;PRINT THE SECONDS PORTION
  716.     CALL    ILPRT
  717.     DB    ' secs at ',0
  718.     CALL    BAUDPRT
  719.     CALL    ILPRT
  720.         DB    'To cancel:  ctrl-X',CR,LF,0
  721.     RET
  722. ;
  723. ;
  724. BTABLE    DW    5,13,19,25,29,49,96,192,384,0    ;RECORDS/MIN FOR 110-9600 BAUD
  725. SECTBL    DB    192,74,51,38,33,20,11,5,3,0
  726. ;
  727. ;    
  728. ;---->  DVHLDE: DIVIDES 'HL' BY VALUE IN 'DE',
  729. ;    UPON EXIT: 'BC'=QUOTIENT,'L'=REMAINDER
  730. ;
  731. DVHLDE
  732.     PUSH    D        ; SAVE DIVISOR
  733.     MOV    A,E
  734.     CMA            ; NEGATE DIVISOR
  735.     MOV    E,A
  736.     MOV    A,D
  737.     CMA
  738.     MOV    D,A
  739.     INX    D        ; DE IS NOW TWOS COMPLEMENTED
  740.     LXI    B,0        ; INIT QUOTIENT
  741. DIVL1:
  742.     DAD    D        ; SUBTRACT DIVISOR FROM DIVIDEND
  743.     INX    B        ; BUMP QUOTIENT
  744.     JC    DIVL1        ; LOOP TILL SIGN CHANGES
  745.     DCX    B        ; ADJUST QUOTIENT
  746.     POP    D        ; RETRIEVE DIVISOR
  747.     DAD    D        ; ADJUST REMAINDER
  748.     RET
  749. ;
  750. ;
  751. ;---->  MULHLA:  MULTIPLY THE VALUE IN 'HL' BY THE VALUE IN 'A'
  752. ;         RETURN WITH ANSWER IN 'HL'
  753. MULHLA
  754.     XCHG        ; MULTIPLICAND TO DE
  755.     LXI    H,0    ; INIT PRODUCT
  756.     INR    A    ; ADJUST MULTIPLIER FOR ZERO TEST
  757. MULLP
  758.     DCR    A
  759.     RZ
  760.     DAD    D
  761.     JMP    MULLP
  762. ;
  763. ;
  764. ;  SHIFT 'HL' REGISTER PAIR ONE BIT TO THE RIGHT
  765. ;
  766. SHFTHL
  767.     MOV    A,L
  768.     RAR
  769.     MOV    L,A
  770.     ORA    A        ;CLEAR THE CARRY
  771.     MOV    A,H
  772.     RAR
  773.     MOV    H,A
  774.     RNC
  775.     MVI    A,80H
  776.     ORA    L
  777.     MOV    L,A
  778.     RET
  779. ;
  780.     ENDM
  781. ;.....
  782. ;
  783. ;
  784. PRTBAUD    MACRO            ;NO PARAMETERS USED
  785. ;
  786.     LOCAL    BAUDSPD
  787. ;
  788.     LXI    H,BAUDSPD
  789.     MVI    D,0
  790.     LDA    MSPEED        ;GET BAUD RATE CODE
  791.     MOV    E,A        ;X1
  792.     ADD    A        ;X2
  793.     ADD    A        ;X4
  794.     ADD    E        ;X5
  795.     MOV    E,A
  796.     DAD    D        ;POINT TO CORRECT RATE
  797.     XCHG
  798.     MVI    C,PRINT
  799.     CALL    BDOS
  800.     CALL    ILPRT
  801.     DB    ' baud',CR,LF,0
  802.     RET
  803. ;
  804. BAUDSPD    DB    '110$',0,'300$',0,'450$',0,'600$',0,'710$',0
  805.     DB    '1200$','2400$','4800$','9600$'
  806. ;
  807.     ENDM
  808. ;.....
  809. ;
  810. ;
  811. DIRLIST    MACRO            ;NO PARAMETERS USED
  812. ;
  813.     LOCAL    DIRLP,PRTNAME,NOFILE,DIRDONE,QSTMARK,QSTLP,PRNTNAME
  814.     LOCAL    NEXTSR,MOVENAME,GETADD,SRCHFCB,NAMECT,PRNTHD,DRNAME
  815.     LOCAL    FENCE,GSPBYT,GSPLUP,NOTFRE,ENDALC,FREKLP,PRTFREE
  816.     LOCAL    PRTHD,DRNAME
  817. ;
  818.     LXI    D,CMDBUF    ;PUT COMMAND LINE IN FCB
  819.     LXI    H,5CH
  820.     CALL    CPMLINE
  821.     LXI    H,SRCHFCB
  822.     CALL    INITFCBS
  823.     LDA    6CH        ;GET DRIVE #
  824.     STA    SRCHFCB
  825.     LDA    6DH
  826.     CPI    20H        ;IF BLANK GET ALL NAMES
  827.     PUSH    PSW
  828.     CZ    QSTMARK
  829.     POP    PSW
  830.     CNZ    MOVENAME    ;ELSE MOVE NAME INTO FCB
  831.     LXI    D,80H
  832.     MVI    C,STDMA
  833.     CALL    BDOS
  834.     XRA    A
  835.     STA    NAMEGD
  836.     STA    NAMECT        ;CR AFTER 4 NAMES
  837.     LXI    D,SRCHFCB
  838.     MVI    C,SRCHF        ;DO FIRST SEARCH
  839.     CALL    BDOS
  840.     CPI    0FFH
  841.     JZ    NOFILE
  842.     PUSH    PSW
  843. DIRLP
  844.     POP    PSW
  845.     CALL    GETADD
  846.     LXI    D,15        ;OFFSET FOR RECORD COUNT
  847.     DAD    D
  848.     MOV    A,M
  849.     ORA    A
  850.     JZ    NEXTSR        ;NO LIST IF FILE IS ZERO LENGTH
  851.     LXI    D,-5
  852.     DAD    D        ;POINT TO $SYS ATTRIB BYTE
  853.     MOV    A,M
  854.     ANI    80H
  855.     JNZ    NEXTSR        ;NO LIST IF $SYS FILE
  856.     LXI    D,-10
  857.     DAD    D        ;POINT TO BEGINNING OF NAME
  858.     INX    H        ;POINT TO FIRST LETTER
  859.     LXI    D,PRNTNAME
  860.     MVI    B,8
  861.     CALL    MOVE
  862.     INX    D
  863.     MVI    B,3
  864.     CALL    MOVE
  865.     CALL    ILPRT
  866. PRNTNAME
  867.     DB '        ','.','   ',' ', 0   ;8 SPACES, PERIOD, 3 SPACES, 1 SPACE
  868.     MVI    A,0FFH
  869.     STA    NAMEGD
  870. NEXTSR
  871.     LXI    D,SRCHFCB
  872.     MVI    C,SRCHN        ;DO NEXT SEARCH
  873.     CALL    BDOS
  874.     CPI    0FFH
  875.     JZ    DIRDONE
  876.     PUSH    PSW
  877.     LDA    NAMEGD
  878.     ORA    A
  879.     JZ    DIRLP
  880.     LDA    NAMECT
  881.     INR    A
  882.     STA    NAMECT
  883.     ANI    03H
  884.     ORA    A
  885.     CZ    CRLF
  886.     CNZ    FENCE
  887.     MVI    A,0
  888.     STA    NAMEGD
  889.     JMP    DIRLP
  890. ;
  891. NOFILE
  892.     CALL    ILPRT
  893.     DB    'NO FILE',0
  894. ;
  895. ;
  896. ; Determines free space remaining
  897. ;
  898. DIRDONE
  899.     LDA    SRCHFCB
  900.     ORA    A
  901.     JZ    DEFLT
  902.     DCR    A
  903.     MOV    E,A
  904.     MVI    C,SELDSK
  905.     CALL    BDOS
  906. DEFLT
  907.     MVI    C,GETPARM     ;CURRENT DISK PARAMETER BLOACK
  908.     CALL    BDOS
  909.     INX    H
  910.     INX    H
  911.     MOV    A,M        ;GET BLOCK SHIFT FACTOR
  912.     STA    BSHIFTF
  913.     INX    H        ;BUMP TO BLOCK MASK
  914.     MOV    A,M        ;GET IT
  915.     STA    BMASK
  916.     INX    H
  917.     INX    H
  918.     MOV    E,M        ;GET MAX BLOCK NUMBER
  919.     INX    H
  920.     MOV    D,M
  921.     XCHG
  922.     SHLD    BMAX        ;PUT IT AWAY
  923.     MVI    C,GETALC     ;ADDRESS OF CP/M ALLOCATION VECTOR
  924.     CALL    BDOS
  925.     XCHG            ;GET ITS LENGTH
  926.     LHLD    BMAX
  927.     INX    H
  928.     LXI    B,0        ;INITIALIZE BLOCK COUNT TO ZERO
  929. GSPBYT
  930.     PUSH    D        ;SAVE ALLOCATION ADDRESS
  931.     LDAX    D
  932.     MVI    E,8        ;SET TO PROCESS 8 BLOCKS
  933. GSPLUP
  934.     RAL            ;TEST BIT
  935.     JC    NOTFRE
  936.     INX    B
  937. NOTFRE
  938.     MOV    D,A        ;SAVE BITS
  939.     DCX    H
  940.     MOV    A,L
  941.     ORA    H
  942.     JZ    ENDALC        ;QUIT IF OUT OF BLOCKS
  943.     MOV    A,D        ;RESTORE BITS
  944.     DCR    E        ;COUNT DOWN 8 BITS
  945.     JNZ    GSPLUP        ;DO ANOTHER BIT
  946.     POP    D        ;BUMP TO NEXT COUNT OF ALLOCATION VECTOR
  947.     INX    D
  948.     JMP    GSPBYT        ;PROCESS IT
  949. ;
  950. ENDALC
  951.     POP    D        ;CLEAR ALLOCATION VECTOR FROM STACK
  952.     MOV    L,C        ;COPY BLOCK TO 'HL'
  953.     MOV    H,B
  954.     LDA    BSHIFTF        ;GET BLOCK SHIFT FACTOR
  955.     SUI    3        ;CONVERT FROM RECORDS TO THOUSANDS
  956.     JZ    PRTFREE        ;SKIP SHIFTS IF 1K BLOCKS
  957. FREKLP
  958.     DAD    H        ;MULTIPLY BLOCKS BY 'K PER BLOCK'
  959.     DCR    A
  960.     JNZ    FREKLP
  961. PRTFREE
  962.     PUSH    H
  963.     CALL    ILPRT
  964.     DB    CR,LF,'Drive ',0
  965.     LDA    SRCHFCB        ;IF NO DRIVE, GET
  966.     ORA    A        ;LOGGED IN DRIVE
  967.     JNZ    PRNTHD
  968.     MVI    C,CURDSK
  969.     CALL    BDOS
  970.     INR    A
  971. PRNTHD
  972.     ADI    'A'-1
  973.     STA    DRNAME
  974.     CALL    ILPRT
  975. DRNAME
  976.     DB    '  has ',0
  977.     POP    H        ;GET NUMBER OF BYTES AVAILABLE
  978.     CALL    DECOUT
  979.     CALL    ILPRT
  980.     DB    'K bytes free',CR,LF,0
  981.     RET
  982. ;
  983. ; Subroutines
  984. ;
  985. FENCE
  986.     CALL    ILPRT
  987.     DB    '| ',0
  988.     RET
  989. ;
  990. QSTMARK
  991.     MVI    A,'?'        ;IF BLANK IN FCB, PUT IN 11 ?'s
  992.     MVI    B,11
  993.     LXI    H,SRCHFCB+1
  994. QSTLP
  995.     MOV    M,A
  996.     INX    H
  997.     DCR    B
  998.     JNZ    QSTLP
  999.     RET
  1000. ;
  1001. MOVENAME
  1002.     LXI    H,6DH
  1003.     LXI    D,SRCHFCB+1
  1004.     MVI    B,11
  1005.     JMP    MOVE        ;MOVE IN MAIN PROGRAM
  1006. ;
  1007. GETADD
  1008.     ANI    03H        ;GET MOD4 FOR CP/M 1.4
  1009.     ADD    A        ;ADD 32
  1010.     ADD    A
  1011.     ADD    A
  1012.     ADD    A
  1013.     ADD    A
  1014.     MOV    E,A
  1015.     MVI    D,0
  1016.     LXI    H,80H        ;ADD DMA OFFSET
  1017.     DAD    D
  1018.     RET
  1019. ;
  1020. ;
  1021. ; Parameters used
  1022. ;
  1023. GETALC    EQU    27        ;CP/M ALLOCATION VECTOR ADDRESS
  1024. GETPARM    EQU    31        ;CURRENT DISK PARAMETERS ADDRESS
  1025. ;
  1026. ;
  1027. ; Unitialized storage
  1028. ;
  1029. SRCHFCB    DS    33
  1030. NAMEGD    DS    1
  1031. NAMECT    DS    1
  1032. BMAX    DS    2        ;HIGHEST BLOCK NUMBER ON DRIVE
  1033. BMASK    DS    1        ;(RECORDS/BLOCK)-1
  1034. BSHIFTF    DS    1        ;NUMBER OF SHIFTS TO MULTIPLY BY REC/BLOCK
  1035. ;
  1036.     ENDM
  1037.