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 / BEEHIVE / COMMS / HAMMODEM.ARC / MODEM7.LIB < prev   
Text File  |  1988-08-07  |  14KB  |  667 lines

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