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 / MODEM76.LIB < prev    next >
Text File  |  1984-04-29  |  14KB  |  673 lines

  1. ;MACROS LIBRARY FOR CP/M ROUTINE SIMULATION   10/15/80
  2.  
  3. ;2/27/81 Added test for delete character and conditional branch
  4. ;to BKSPC in the DELETE routine so that editing on the MODEM7
  5. ;command line will backspace and delete with rubout key as well
  6. ;as the backspace key.   Marked by ; @ 7.5            RLP
  7.  
  8. ;CONTAINS:
  9. ;    1)   INBUF    - DUPLICATES READ BUFFER ROUTINE
  10. ;            SAME AS CP/M FUNCTION 10, BUT DOES
  11. ;            NOT USE CTRL-C (REASON FOR ROUTINE).
  12. ;            DOES ALLOW CONTROLS U, R, E, AND H (BACKSPACE).
  13. ;            OUTPUTS BELL IF INPUT GREATER THAN BUFFER
  14. ;    2)   CMDLINE  - PARSES A CP/M BUFFER INTO FORMAT SAME AS
  15. ;            CP/M COMMAND LINE.
  16. ;    3)   INLNCOMP - COMPARES STRINGS FOLLOWING CALL TO 'ILCOMP'
  17. ;                TO STRING ADDRESSED BY DE REGS.
  18. ;    4)   MULTNAME - MULTI-FILE FILE ACCESS ROUTINE FROM
  19. ;            CP/M USERS GROUP.
  20. ;    5)   DIRLIST  -    LISTS DIRECTORY
  21.  
  22. INBUF    MACRO        ;NO PARAMETERS USED.
  23.  
  24.     LOCAL START,INBUFO,INBUFA,DELETE,NODEL,ALERT
  25.     LOCAL INBUFLT,CLEAR,CLEARL,INBUFR,RETYPE,BKSPC,PCRLF
  26.     LOCAL CONIN,CONOUT,CONIN1,CONOUT1,NOUCASE,CTLRLP
  27.     LOCAL CONSTAT,CONST1,CONINLP
  28.  
  29.     PUSH PSW
  30.     PUSH H
  31.     PUSH B
  32.     PUSH D        ;DE REGISTERS MUST BE PUSHED LAST
  33. START    CALL CLEAR    ;CLEAR THE BUFFER AREA
  34.     POP D        ;GET ADDRESS OF BUFFER ON RETRIES
  35.     PUSH D        ;RESTORE STACK
  36.     XRA A
  37.     INX D        ;ADDRESS COUNT FIELD
  38.     STAX D        ;INITIALIZE WITH A ZERO IN COUNT BYTE
  39.     INX D
  40.     XCHG        ;ADDRESS FIRST BUFFER BYTE WITH HL
  41. INBUFA    CALL CONIN
  42.     CPI 0DH        ;IS IT A RETURN?
  43.     JZ INBUFR    ;IF SO, THEN RETURN
  44.     CPI 7FH        ;IS IT A DELETE?
  45.     JZ DELETE
  46.     CPI 8        ;CTRL-H WILL BACKSPACE..
  47.     JZ DELETE    ;..OVER DELETED CHAR.
  48.     CPI 'U'-40H    ;IS IT A CTRL-U
  49.     JZ INBUFO    ;OUTPUT # CR LF AND START OVER
  50.     CPI 'R'-40H    ;CTRL-R RETYPES LINE
  51.     JZ RETYPE
  52.     CPI 'E'-40H
  53.     JZ PCRLF
  54.     CPI 20H        ;NO CONTROL CHARACTERS OTHER..
  55.     JC INBUFA    ;..THAN ABOVE ALLOWED.
  56.     MOV B,A        ;SAVE INPUTTED CHARACTER
  57.     XCHG        ;SAVE HL IN DE
  58.     POP H        ;GET ADDRESS OF BUFFER IN HL
  59.     PUSH H        ;RESTORE STACK
  60.     INX H        ;ADDRESS COUNT BYTE
  61.     INR M        ;INCREASE COUNT BYTE
  62.     DCX H        ;ADDRESS MAXIMUM
  63.     MOV A,M        ;PUT MAXIMUM IN A
  64.     INX H        ;ADDRESS COUNT
  65.     CMP M        ;COMPARE COUNT TO MAXIMUM
  66.     JC ALERT    ;IF MAXIMUM, RING BELL AND WAIT FOR CR
  67.     XCHG        ;RESTORE BUFFER POINTER TO HL
  68.     MOV M,B        ;PUT INPUTTED CHARACTER IN BUFFER
  69.     MOV A,B        ;OUTPUT IT
  70.     CALL CONOUT
  71.     INX H        ;BUMP POINTER
  72.     JMP INBUFA    ;GET NEXT CHARACTER
  73.  
  74. DELETE    XCHG        ;SAVE BUFFER POINTER IN DE
  75.     POP H        ;ADDRESS BEGINNING OF BUFFER
  76.     PUSH H        ;RESTORE STACK
  77.     INX H        ;ADDRESS COUNT FIELD
  78.     MOV B,A        ;SAVE DELETE CHAR - 7FH OR 08H
  79.     MOV A,M
  80.     SUI 1        ;DECREASE COUNT
  81.     MOV M,A
  82.     JC NODEL    ;DON'T DELETE PAST BEGINING OF BUFFER.
  83.     XCHG        ;RESTORE BUFFER POINTER TO HL
  84.     DCX H        ;POINT TO LAST BYTE INPUTTED
  85.     MOV A,B        ;GET BACK EITHER 7FH OR 08H
  86.     MOV B,M        ;GET CHARACTER BEING DELETED
  87.     MVI M,20H    ;RESTORE BLANK
  88.     CPI 8
  89.     JZ BKSPC
  90.     CPI 7FH        ; @ 7.5
  91.     JZ BKSPC0    ; @ 7.5
  92.     JMP INBUFA    ;GET NEXT CHARACTER
  93. NODEL    INR M        ;DON'T LEAVE COUNT NEGATIVE
  94.     XCHG        ;RESTORE POINTER TO HL
  95.     JMP INBUFA
  96. BKSPC0  MVI A,08H
  97. BKSPC    CALL CONOUT    ;TRUE ERASE IF 08H
  98.     MVI A,20H
  99.     CALL CONOUT
  100.     MVI A,8
  101.     CALL CONOUT
  102.     JMP INBUFA
  103.  
  104. INBUFO    MVI A,'#'
  105.     CALL CONOUT
  106.     MVI A,0DH
  107.     CALL CONOUT
  108.     MVI A,0AH
  109.     CALL CONOUT
  110.     JMP START
  111.  
  112. RETYPE    POP D
  113.     PUSH D
  114.     INX D        ;POINT TO CURRENT NUMBER..
  115.     LDAX D        ;..OF CHARACTERS.
  116.     MOV B,A
  117.     MVI A,'#'
  118.     CALL CONOUT
  119.     MVI A,0DH
  120.     CALL CONOUT
  121.     MVI A,0AH
  122.     CALL CONOUT
  123.     MOV A,B        ;TEST IF ZERO INPUT
  124.     ORA A
  125.     JZ INBUFA
  126. CTLRLP    INX D
  127.     LDAX D
  128.     CALL CONOUT
  129.     DCR B
  130.     JNZ CTLRLP
  131.     JMP INBUFA
  132.     
  133. ALERT    MVI A,7
  134.     CALL CONOUT
  135.     DCR M
  136.     XCHG
  137.     JMP INBUFA
  138.  
  139. PCRLF    MVI A,0DH
  140.     CALL CONOUT
  141.     MVI A,0AH
  142.     CALL CONOUT
  143.     JMP INBUFA
  144.  
  145. INBUFR    MVI A,0DH
  146.     CALL CONOUT
  147.     MVI A,0AH
  148.     CALL CONOUT
  149.     POP D
  150.     POP B
  151.     POP H
  152.     POP PSW
  153.     RET
  154.  
  155. CLEAR    POP D        ;ACCOUNTS FOR CALL
  156.     POP H        ;ADDRESS BUFFER IN HL
  157.     PUSH H        ;RESTORE..
  158.     PUSH D        ;..STACK
  159.     MOV B,M        ;SAVE MAXIMUM IN B
  160.     INX H        ;POINT TO FIRST..
  161.     INX H        ;..BUFFER BYTE.
  162.     MVI A,20H
  163. CLEARL    MOV M,A
  164.     INX H
  165.     DCR B
  166.     JNZ CLEARL
  167.     RET
  168.  
  169. CONIN    PUSH H ! PUSH D ! PUSH B
  170. CONINLP    CALL CONSTAT
  171.     ORA A
  172.     JZ CONINLP
  173.     CALL CONIN1
  174.     CPI 61H        ;CHANGE TO UPPER..
  175.     JC NOUCASE    ;..CASE SINCE CP/M..
  176.     CPI 7BH        ;..DOES THE SAME.
  177.     JNC NOUCASE
  178.     ANI 5FH
  179. NOUCASE    POP B ! POP D ! POP H
  180.     RET
  181. CONIN1    LHLD 1
  182.     LXI D,6
  183.     DAD D
  184.     PCHL
  185.  
  186. CONSTAT    PUSH H ! PUSH D ! PUSH B
  187.     CALL CONST1
  188.     POP B ! POP D ! POP H
  189.     RET
  190. CONST1    LHLD 1
  191.     LXI D,3
  192.     DAD D
  193.     PCHL
  194.  
  195. CONOUT    PUSH H ! PUSH D ! PUSH B ! PUSH PSW
  196.     CALL CONOUT1
  197.     POP PSW ! POP B ! POP D ! POP H
  198.     RET
  199. CONOUT1    LHLD 1
  200.     LXI D,9
  201.     DAD D
  202.     MOV C,A
  203.     PCHL
  204.  
  205.     ENDM
  206.  
  207. CMDLINE    MACRO        ;NO PARAMETERS USED
  208.  
  209. ;LOADS A COMMAND LINE ADDRESSED BY DE REGISTERS (MAX # CHARACTERS IN LINE
  210. ;IN DE, NUMBER OF CHARS IN LINE IN DE+1, LINE STARTS IN DE+2) INTO FCB
  211. ;ADDRESSED BY HL REGISTERS. THE FCB SHOULD BE AT LEAST 33 BYTES IN LENGTH.
  212. ;THE COMMAND LINE BUFFER MUST HAVE A MAXIMUM LENGTH OF AT LEAST ONE MORE
  213. ;THAN THE GREATEST NUMBER OF CHARACTERS THAT WILL BE NEEDED.
  214.  
  215.     LOCAL CMDLINE, DEFDR, DONE, DRIVE, FILL1, FILL, FILL2, INIT, INITL1
  216.     LOCAL INITL2, INITL3, INITL4, NAME1, NAME2, SCAN, TRANS, TSTNAM
  217.     LOCAL TSTTYP, TSTTYPL, TYPE1, TYPE2, NAME2C
  218.  
  219.  
  220.     PUSH PSW
  221.     PUSH B
  222.     PUSH D
  223.     PUSH H
  224.  
  225.     CALL INIT    ;FILLS FCBS WITH BLANKS AND NULLS
  226.  
  227.     XCHG        ;GET START OF COMMAND LINE IN HL.
  228.     INX H        ;ADDRESS # BYTES IN CMD LINE.
  229.     MOV E,M        ;LOAD DE PAIR WITH # BYTES.
  230.     MVI D,0
  231.     INX H
  232.     DAD D        ;POINT TO BYTE AFTER LAST CHAR..
  233.     MVI M,0DH    ;..IN CMD LINE AND STORE DELIMITER.
  234.     POP H        ;RESTORE HL AND DE.
  235.     POP D
  236.     PUSH D
  237.     PUSH H
  238.     INX D        ;ADDRESS START OF COMMAND.
  239.     INX D
  240.  
  241.     CALL DRIVE
  242.  
  243. NAME1    MVI C,8        ;TRANSFER FIRST FILENAME TO FCB.
  244.     CALL TRANS
  245.     CPI 0DH
  246.     JZ DONE
  247.     CPI 20H        ;IF SPACE, THEN START OF..
  248.     JZ NAME2    ;..SECOND FILENAME.
  249.  
  250. TYPE1    POP H        ;FILETYPE MUST BE AFTER..
  251.     PUSH H        ;..EIGHTH BYTE OF NAME.
  252.     LXI B,9
  253.     DAD B
  254.     MVI C,3        ;TRANSFER TYPE OF FIRST FILE
  255.     CALL TRANS
  256.     CPI 0DH
  257.     JZ DONE
  258.  
  259. NAME2    LDAX D        ;EAT MULTIPLE SPACES..
  260.     CPI 20H        ;..BETWEEN NAMES.
  261.     JNZ NAME2C
  262.     INX D
  263.     JMP NAME2
  264.     LDAX D
  265.     CPI 0DH        ;TEST IF FIRST NAME..
  266.     JZ DONE        ;..ONLY AND THEN SPACE.
  267. NAME2C    POP H        ;SECOND NAME STARTS IN 16TH BYTE.
  268.     PUSH H        ;POINT HL TO THIS BYTE.
  269.     LXI B,16
  270.     DAD B
  271.     CALL DRIVE
  272.     MVI C,8
  273.     CALL TRANS
  274.     CPI 0DH
  275.     JZ DONE
  276.  
  277. TYPE2    POP H        ;SECOND TYPE STARTS IN 25TH BYTE.
  278.     PUSH H
  279.     LXI B,25
  280.     DAD B
  281.     MVI C,3
  282.     CALL TRANS
  283.  
  284. DONE    POP H
  285.     PUSH H
  286.     INX H        ;POINT TO FIRST CHAR OF FIRST NAME IN FCB.
  287.     CALL SCAN    ;CHECK FOR * (AMBIGUOUS NAMES).
  288.     POP H
  289.     PUSH H
  290.     LXI B,17    ;POINT TO FIRST CHAR OF SECOND NAME IN FCB.
  291.     DAD B
  292.     CALL SCAN
  293.     POP H
  294.     POP D
  295.     POP B
  296.     POP PSW
  297.     RET
  298.  
  299. ; =============>>>  SUBROUTINES  <<===============
  300.  
  301. INIT    PUSH H        ;INITIALIZES FCB WITH 1 NULL (FOR FIRST DRIVE),..
  302.     PUSH B        ;..11 BLANKS, 4 NULLS, 1 NULL (FOR 2ND DRIVE),..
  303.     MVI M,0        ;..11 BLANKS, AND 4 NULLS.
  304.     INX H
  305.     MVI B,11
  306.     MVI A,20H
  307.     CALL INITFILL
  308.     MVI B,5
  309.     MVI A,0
  310.     CALL INITFILL
  311.     MVI B,11
  312.     MVI A,20H
  313.     CALL INITFILL
  314.     MVI B,4
  315.     MVI A,0
  316.     CALL INITFILL
  317.     POP B
  318.     POP H
  319.     RET
  320.  
  321. INITFILL
  322.     MOV M,A
  323.     INX H
  324.     DCR B
  325.     JNZ INITFILL
  326.     RET
  327.  
  328. DRIVE    INX D        ;CHECK 2ND BYTE OF FILENAME. IF IT..
  329.     LDAX D        ;..IS A ":", THEN DRIVE WAS SPECIFIED.
  330.     DCX D
  331.     CPI ':'
  332.     JNZ DEFDR    ;ELSE ZERO FOR DEFAULT DRIVE ('INIT' PUT ZERO)
  333.     LDAX D
  334.     ANI 5FH
  335.     SUI 40H        ;CALCULATE DRIVE (A=1, B=2,...)..
  336.     MOV M,A        ;..AND PLACE IT IN FCB.
  337.     INX D        ;ADDRESS FIRST BYTE OF..
  338.     INX D        ;..IN CMD LINE,..
  339. DEFDR    INX H        ;..AND NAME FIELD IN FCB.
  340.     RET
  341.  
  342. TRANS    LDAX D        ;TRANSFER FROM CMD LINE TO FCB..
  343.     INX D        ;..UP TO NUMBER OF CHARS SPECIFIED..
  344.     CPI 0DH        ;..BY C-REG. KEEP SCANNING FIELD..
  345.     RZ        ;..WITHOUT TRANSFER UNTIL A DELIMITING..
  346.     CPI '.'        ;..FIELD CHAR SUCH AS '.', BLANK, OR..
  347.     RZ        ;..C/R (FOR END OF CMD LINE).
  348.     CPI 20H
  349.     RZ
  350.     DCR C
  351.     JM TRANS    ;ONCE C-REG IS LESS THAN ZERO, KEEP READING..
  352.     MOV M,A        ;..CMD LINE BUT DO NOT TRANSFER TO FCB.
  353.     INX H
  354.     JMP TRANS
  355.  
  356. SCAN    MVI B,8        ;SCAN FILE NAME ADDRESSED BY HL.
  357. TSTNAM    MOV A,M
  358.     CPI '*'        ;IF '*' FOUND, FILL IN REST OF FIELD..
  359.     JZ FILL1    ;..WITH '?' FOR AMBIGUOUS NAME.
  360.     INX H
  361.     DCR B
  362.     JNZ TSTNAM
  363.     JMP TSTTYP
  364. FILL1    CALL FILL
  365.  
  366. TSTTYP    MVI B,3        ;SCAN AND FILL TYPE FIELD FOR NAME..
  367. TSTTYPL    MOV A,M        ;..SPECIFIED ABOVE.
  368.     CPI '*'
  369.     JZ FILL2
  370.     INX H
  371.     DCR B
  372.     RZ
  373.     JMP TSTTYPL
  374. FILL2    CALL FILL
  375.     RET
  376.  
  377. FILL    MVI M,'?'    ;ROUTINE TRANSFERS '?'.
  378.     INX H
  379.     DCR B
  380.     JNZ FILL
  381.     RET
  382.  
  383.     ENDM
  384.  
  385. INLNCOMP    MACRO        ;NO PARAMETERS USED
  386.  
  387. ;IN-LINE COMPARE. COMPARES STRING ADDRESSED BY DE-REG TO STRING
  388. ;AFTER CALL (ENDS WITH ZERO). RETURN WITH CARRY SET MEANS STRINGS
  389. ;NOT THE SAME. ALL REGISTERS EXCEPT A-REG ARE UNAFFECTED.
  390.  
  391.     LOCAL ILCOMPL, SAME, NOTSAME, NSLP
  392.  
  393.     XTHL        ;POINT HL TO 1ST CHAR.
  394.     PUSH D
  395. ILCOMPL    MOV A,M        ;HL POINTS TO IN-LINE STRING.
  396.     ORA A        ;END OF STRING IF ZERO.
  397.     JZ SAME
  398.     LDAX D
  399.     CMP M
  400.     JNZ NOTSAME
  401.     INX H
  402.     INX D
  403.     JMP ILCOMPL
  404. NOTSAME    MVI A,0        ;IF NOT SAME, FINISH THRU..
  405. NSLP    INX H        ;..STRING SO RETURN WILL..
  406.     CMP M        ;..GO TO INSTRUCTION AFTER..
  407.     JNZ NSLP    ;..STRING AND NOT REMAINDER OF STRING.
  408.     STC
  409. SAME    POP D
  410.     INX H        ;AVOIDS A NOP INSTRUCTION..
  411.     XTHL        ;..WHEN RETURNING.
  412.     RET
  413.  
  414.     ENDM
  415.  
  416. MFACCESS    MACRO    ;NO PARAMETERS USED
  417.  
  418.     LOCAL MOVE, CPM, MFNAME, MFN01, MFN02, MFFIX1, MFREQ
  419.     LOCAL MFCUR, MOVER, SRCHF, SRCHN, STDMA, BDOS, FCB, FCBEXT
  420.     LOCAL FCBRNO
  421.  
  422.     ;MFFLG1 IS NOT SET LOCAL BECAUSE IT MUST BE RESET
  423.     ;IN MAIN MODEM PROGRAM ON AN ABORT
  424.  
  425. ;
  426. ;    MUST BE ASSEMBLED BY "MAC"
  427. ;
  428. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  429. ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  430. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  431. ;TIME IT IS CALLED.  THIS COMMAND WOULD BE USED
  432. ;IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE,
  433. ;ETC IN WHICH YOU WANT TO PROCESS SINGLE OR
  434. ;MULTIPLE FILES.
  435. ;
  436. ;THE FCB WILL BE SET UP WITH THE NEXT NAME, READY TO
  437. ;DO NORMAL PROCESSING (OPEN, READ, ETC.) WHEN ROUTINE IS CALLED.
  438. ;
  439. ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND
  440. ;
  441. ;DEFINE DATA MOVE MACRO
  442. ;
  443. MOVE    MACRO    ?F,?T,?L,?I
  444.     IF    NOT NUL ?F
  445.     LXI    H,?F
  446.     ENDIF
  447.     IF    NOT NUL ?T
  448.     LXI    D,?T
  449.     ENDIF
  450.     IF    NOT NUL ?L
  451.     LXI    B,?L
  452.     ENDIF
  453.     IF    NOT NUL ?I
  454.     LOCAL    ?B,?Z
  455.     CALL    ?Z
  456. ?B    DB    ?I
  457. ?Z    POP    H    ;GET TO
  458.     LXI    B,?Z-?B
  459.     ENDIF
  460.     CALL    MOVER
  461. MF    SET    -1    ;;SHOW EXPANSION
  462.     ENDM
  463. ;
  464. ;DEFINE CP/M MACRO - CPM FNC,PARM
  465. ;
  466. CPM    MACRO    ?F,?P
  467.     PUSH    B
  468.     PUSH    D
  469.     PUSH    H
  470.     IF    NOT NUL ?F
  471.     MVI    C,?F
  472.     ENDIF
  473.     IF    NOT NUL ?P
  474.     LXI    D,?P
  475.     ENDIF
  476.     CALL    BDOS
  477.     POP    H
  478.     POP    D
  479.     POP    B
  480.     ENDM
  481. ;
  482. ;------------------------------------------------
  483. ;
  484. ;    MULTI-FILE ACCESS SUBROUTINE
  485. ;
  486. ;THE ROUTINE IS COMMENTED IN PSEUDO CODE,
  487. ;EACH PSEUDO CODE STATEMENT IS IN <<...>>
  488. ;
  489. MFNAME:
  490. ;<<INIT DMA ADDR, FCB>>
  491.  CPM STDMA,80H
  492.  XRA A ! STA FCBEXT
  493. ;<<IF FIRST TIME>>
  494.  LDA MFFLG1 ! ORA A ! JNZ MFN01
  495. ;  <<TURN OFF 1ST TIME SW>>
  496.  MVI A,1 ! STA MFFLG1
  497. ;  <<SAVE THE REQUESTED NAME>>
  498.  MOVE FCB,MFREQ,12 ;SAVE ORIG REQ
  499.  LDA FCB ! STA MFCUR ;SAVE DISK IN CURR FCB
  500. ;  <<SRCHF REQ NAME>>
  501.  MOVE MFREQ,FCB,12
  502.  CPM SRCHF,FCB
  503. ;<<ELSE>>
  504.  JMP MFN02
  505. MFN01:
  506. ;  <<SRCHF CURR NAME>>
  507.  MOVE MFCUR,FCB,12
  508.  CPM SRCHF,FCB
  509. ;  <<SRCHN REQ NAME>>
  510.  MOVE MFREQ,FCB,12
  511.  CPM SRCHN,FCB
  512. ;<<ENDIF>>
  513. MFN02:
  514. ;<<RETURN CARRY IF NOT FOUND>>
  515.  INR A ! STC ! JNZ MFFIX1 ! STA MFFLG1 ! RET        ;FIX BY M.Z.
  516. MFFIX1:
  517. ;<<MOVE NAME FOUND TO CURR>>
  518.  DCR A ! ANI 3 ! ADD A
  519.  ADD A ! ADD A ! ADD A ! ADD A
  520.  ADI 81H ! MOV L,A ! MVI H,0
  521.  PUSH H ;SAVE NAME POINTER
  522.  MOVE ,MFCUR+1,11
  523. ;<<MOVE NAME FOUND TO FCB>>
  524.  POP H ! MOVE ,FCB+1,11
  525. ;<<SETUP FCB>>
  526.  XRA A ! STA FCBEXT ! STA FCBRNO            ;FIX BY M.Z.
  527. ;<<RETURN>>
  528.  RET
  529. ;
  530. ;MULTI-FILE ACCESS WORK AREA
  531. ;
  532. MFFLG1    DB    0    ;1ST TIME SW
  533. MFREQ    DS    12    ;REQ NAME
  534. MFCUR    DS    12    ;CURR NAME
  535. ;------------------------------------------------
  536. ;
  537. ;MOVE SUBROUTINE
  538. ;
  539. MOVER    MOV    A,M
  540.     STAX    D
  541.     INX    H
  542.     INX    D
  543.     DCX    B
  544.     MOV    A,B
  545.     ORA    C
  546.     JNZ    MOVER
  547.     RET
  548. ;
  549. ;EQUATES USED BY MULTI-ACCESS SUBROUTINE
  550. ;
  551. SRCHF    EQU    17
  552. SRCHN    EQU    18
  553. STDMA    EQU    26                ;FIX BY M.Z.
  554. BDOS    EQU    5
  555. FCB    EQU    5CH 
  556. FCBEXT    EQU    FCB+12
  557. FCBRNO    EQU    FCB+32
  558.     ENDM
  559.  
  560. DIRLIST    MACRO        ;NO PARAMETERS USED
  561.  
  562.     LOCAL DIRLP,PRTNAME,NOFILE,DIRDONE,QSTMARK,QSTLP,PRNTNAME,NEXTSR
  563.     LOCAL MOVENAME,GETADD,DRIVE,CALCDR,SRCHFCB,NAMECT,PRNTHD,DRNAME
  564.  
  565.     LXI D,CMDBUF    ;PUT COMMAND LINE IN FCB
  566.     LXI H,5CH
  567.     CALL CPMLINE
  568.     LXI H,SRCHFCB
  569.     CALL INITFCBS
  570.     LDA 6CH        ;GET DRIVE #
  571.     STA SRCHFCB
  572.     LDA 6DH
  573.     CPI 20H        ;IF BLANK GET ALL NAMES
  574.     PUSH PSW
  575.     CZ QSTMARK
  576.     POP PSW
  577.     CNZ MOVENAME    ;ELSE MOVE NAME INTO FCB
  578.     CALL DRIVE
  579.     LXI D,80H
  580.     MVI C,STDMA
  581.     CALL BDOS
  582.     XRA A
  583.     STA NAMECT    ;CR AFTER 4 NAMES
  584.     LXI D,SRCHFCB
  585.     MVI C,SRCHF    ;DO FIRST SEARCH
  586.     CALL BDOS
  587.     CPI 0FFH
  588.     JZ NOFILE
  589.  
  590. DIRLP    CALL GETADD
  591.     LXI D,15    ;OFFSET FOR RECORD COUNT
  592.     DAD D
  593.     MOV A,M
  594.     ORA A
  595.     JZ NEXTSR    ;NO LIST IF FILE IS ZERO LENGTH
  596.     LXI D,-5
  597.     DAD D        ;POINT TO $SYS ATTRIB BYTE
  598.     MOV A,M
  599.     ANI 80H
  600.     JNZ NEXTSR    ;NO LIST IF $SYS FILE
  601.     LXI D,-10
  602.     DAD D        ;POINT TO BEGINNING OF NAME
  603.     INX H        ;POINT TO FIRST LETTER
  604.     LXI D,PRNTNAME
  605.     MVI B,8
  606.     CALL MOVE
  607.     INX D
  608.     MVI B,3
  609.     CALL MOVE
  610.     CALL ILPRT
  611. PRNTNAME
  612.     DB '        ',' ','   ',  ' | ', 0   ;8,1,3 SPACES
  613.     LDA NAMECT
  614.     INR A
  615.     STA NAMECT
  616.     ANI 03H
  617.     ORA A
  618.     CZ CRLF
  619. NEXTSR    LXI D,SRCHFCB
  620.     MVI C,SRCHN    ;DO NEXT SEARCH
  621.     CALL BDOS
  622.     CPI 0FFH
  623.     JZ DIRDONE
  624.     JMP DIRLP
  625. NOFILE    CALL ILPRT
  626.     DB 'NOT FOUND',0
  627. DIRDONE    CALL CRLF
  628.     RET
  629.  
  630. QSTMARK    MVI A,'?'    ;IF BLANK IN FCB, PUT IN 11 ?'s
  631.     MVI B,11
  632.     LXI H,SRCHFCB+1
  633. QSTLP    MOV M,A
  634.     INX H
  635.     DCR B
  636.     JNZ QSTLP
  637.     RET
  638.  
  639. MOVENAME
  640.     LXI H,6DH
  641.     LXI D,SRCHFCB+1
  642.     MVI B,11
  643.     CALL MOVE        ;MOVE IN CP/M PROGRAM
  644.     RET
  645.  
  646. GETADD    ANI 03H            ;GET MOD4 FOR CP/M 1.4
  647.     ADD A ! ADD A ! ADD A    ;ADD 32
  648.     ADD A ! ADD A
  649.     MOV E,A
  650.     MVI D,0
  651.     LXI H,80H        ;ADD DMA OFFSET
  652.     DAD D
  653.     RET
  654.  
  655. DRIVE    LDA SRCHFCB        ;IF NO DRIVE, CAL
  656.     ORA A            ;LOGGED IN DRIVE
  657.     JZ CALCDR
  658.     ADI 40H
  659.     JMP PRNTHD
  660. CALCDR    MVI C,25
  661.     CALL BDOS
  662.     ADI 41H
  663. PRNTHD    STA DRNAME
  664.     CALL ILPRT
  665.     DB CR,LF,'DRIVE '
  666. DRNAME    DB ' ',CR,LF,0
  667.     RET
  668.  
  669. SRCHFCB    DS 33
  670. NAMECT    DS 1
  671.  
  672.     ENDM
  673.