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 / CPM / MACLIB / MACROZ.MQC / MACROZ.MAC
Text File  |  2000-06-30  |  18KB  |  964 lines

  1. ;
  2. ;***************************************************************
  3. ;                                                              *
  4. ; F I L E   N A M E :    M A C R O Z . M 8 0                   *
  5. ;                                                              *
  6. ;***************************************************************
  7. ;
  8. ;***************************************************************
  9. ;                                                              *
  10. ; THIS IS THE "OLD" MACRO.LIB SUPPLIED WITH "MAC" BY DIGITAL   *
  11. ; RESEARCH.  I HAVE MODIFIED IT TO RUN WITH "M80" BY MICROSOFT *
  12. ; BY CHANGING SOME OF THE PSUEDO OP'S AND CONVERTED THE 8080   *
  13. ; MNEMONICS TO Z-80 MNEMONICS.                                 *
  14. ;                                                              *
  15. ;           DAVID NIENHISER     NOVEMBER 3, 1980               *
  16. ;                                                              *
  17. ;***************************************************************
  18.  
  19. ;NOTE: Z80 MODE ENABLED HERE!
  20. .Z80
  21. ;
  22. ;    SAVE MACRO    SAVE SPECIFIED REGISTERS
  23. ;
  24. ;    SAVE    R1,R2,R3,R4
  25. ;
  26. ;        R1-R4 MAY BE BC,DE,HL OR AF  SAVED IN ORDER SPECIFIED
  27. ;        IF REGS ARE OMITTED SAVE BC,DE AND HL
  28. ;
  29. SAVE    MACRO    R1,R2,R3,R4
  30.     IFNB    <R1&R2&R3&R4>
  31.     IRP    R,<<R1>,<R2>,<R3>,<R4>>
  32.     IFB    <R>
  33.     EXITM
  34.     ENDIF
  35.     PUSH    R
  36.     ENDM
  37.     ELSE
  38.     IRP    REG,<BC,DE,HL>
  39.     PUSH    REG
  40.     ENDM
  41.     ENDIF
  42.     ENDM
  43. ;
  44. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  45. ;
  46. ;    RESTORE MACRO    RESTORE REGISTERS  (INVERSE OF SAVE)
  47. ;
  48. ;    RESTORE    R1,R2,R3,R4
  49. ;
  50. ;        R1-R4 MAY BE BC,DE,HL OR AF  RESTORED IN ORDER SPECIFIED
  51. ;        IF REGS OMITTED RESTORE HL,DE AND BC
  52. ;
  53. RESTORE    MACRO    R1,R2,R3,R4
  54.     IFNB    <R1&R2&R3&R4>
  55.     IRP    R,<<R1>,<R2>,<R3>,<R4>>
  56.     IFB    <R>
  57.     EXITM
  58.     ENDIF
  59.     POP    R
  60.     ENDM
  61.     ELSE
  62.     IRP    REG,<HL,DE,BC>
  63.     POP    REG
  64.     ENDM
  65.     ENDIF
  66.     ENDM
  67. ;
  68. ;
  69. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  70. ;
  71. ;    CHARIN MACRO    CONSOLE INPUT TO A
  72. ;
  73. ;    CHARIN    ADDR
  74. ;
  75. CHARIN    MACRO    ADDR
  76.     LD    C,1D
  77.     CALL    5        ;;CALL BDOS
  78.     IFNB    <ADDR>
  79.     LD    (ADDR),A
  80.     ENDIF
  81.     ENDM
  82. ;
  83. ;
  84. ;    . . . . . . . . . . . . . . ... ... . .. . . . . . . . .
  85. ;
  86. ;    CHAROUT MACRO    CONSOLE OUTPUT FROM A
  87. ;
  88. ;    CHAROUT    ADDR
  89. ;
  90. CHAROUT    MACRO    ADDR
  91.     IFNB    <ADDR>
  92.     LD    A,(ADDR)
  93.     ENDIF
  94.     LD    C,2D
  95.     LD    E,A
  96.     CALL    5        ;;CALL BDOS
  97.     ENDM
  98. ;
  99. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  100. ;
  101. ;    CHARSTAT MACRO    CHECK CONSOLE STATUS
  102. ;
  103. ;            RETURN TRUE (FF) IF CHAR READY FALSE (0) IF NOT
  104. ;
  105. CHARSTAT MACRO
  106.     LOCAL    ENDSTA
  107.     LD    C,11D
  108.     CALL    5
  109.     OR    A
  110.     JP    Z,ENDSTA
  111.     LD    A,X'FF'
  112. ENDSTA:
  113.     ENDM
  114. ;
  115. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  116. ;
  117. ;    INPUT MACRO    INPUT CHARACTER STRING FROM CONSOLE
  118. ;
  119. ;    INPUT    ADDR,BUFLEN
  120. ;
  121. ;        ADDR    START OF TEXT BUFFER
  122. ;        BUFLEN    LENGTH OF BUFFER  (DEFAULT IS 127)
  123. ;
  124. INPUT    MACRO    ADDR,BUFLEN
  125.     LD    C,10D
  126.     IFNB    <ADDR>
  127.     LD    DE,ADDR
  128.     ENDIF
  129.     IFNB    <BUFLEN>
  130.     LD    A,BUFLEN
  131.     LD    (DE),A
  132.     ELSE
  133.     LD    A,127D
  134.     LD    (DE),A
  135.     ENDIF
  136.     CALL    5        ;;BDOS ENTRY
  137.     ENDM
  138. ;
  139. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  140. ;
  141. ;    PRINT MACRO    PRINT A STRING ON CONSOLE
  142. ;
  143. ;    PRINT                (CARRIAGE RETURN, LINE FEED)
  144. ;    PRINT    'LITERAL'
  145. ;    PRINT    <'LITERAL',CR,LF,'SECOND LITERAL'>
  146. ;
  147. ;    PRINT    ADDR,$            (ASCII OUTPUT UNTIL $)
  148. ;    PRINT    ADDR,L,H        (HEX OUTPUT L CHARACTERS)
  149. ;    PRINT    ADDR,L,A        (ASCII OUTPUT L CHARACTERS)
  150. ;
  151. ;        LITERALS MUST BE IN SINGLE QUOTES  'LIT'
  152. ;        IF LITERAL CONTAINS CONTROL CODES ENTIRE STRING IN <> BRACKETS
  153. ;        MACRO ALSO ASSEMBLES
  154. ;            CR = CARRIAGE RETURN
  155. ;            LF = LINE FEED
  156. ;            BEL = BELL CODE
  157. ;
  158. ;        MACRO ASSUMES ADDR ALREADY LOADED TO HL IF ARGUMENT OMITTED
  159. ;
  160. PRINT    MACRO    ?STRING,LEN,TC
  161.     LOCAL    @OVER,@MESS,PLOOP,PASTCR,@CRLF
  162.     LOCAL    HLAB
  163. .8080
  164. CR    SET    0DH
  165. LF    SET    0AH
  166. BEL    SET    07H
  167. HLAB    EQU    'H'
  168. .Z80
  169.     IFB    <?STRING&LEN&TC>
  170.     JP    PASTCR
  171.     DSEG
  172. @CRLF:
  173.     DB    CR
  174.     DB    LF
  175.     DB    '$'
  176.     CSEG
  177. PASTCR:    LD    DE,@CRLF
  178.     LD    C,9D
  179.     CALL    5
  180.     ELSE
  181.     IFB    <LEN&TC>
  182.     JP    @OVER
  183.     DSEG
  184. @MESS:
  185.     DB    ?STRING
  186.     DB    '$'
  187.     CSEG
  188. @OVER:    LD    DE,@MESS
  189.     LD    C,9D
  190.     CALL    5        ;;BDOS ENTRY
  191.     ELSE
  192.     IFB    <TC>
  193.     IFNB    <?STRING>
  194.     LD    DE,?STRING
  195.     ENDIF
  196.     LD    C,9D
  197.     CALL    5        ;;BDOS ENTRY
  198.     ELSE
  199.     IFNB    <?STRING>
  200.     LD    HL,?STRING
  201.     ENDIF
  202.     LD    C,LEN
  203. PLOOP:    PUSH    BC
  204.     PUSH    HL
  205.     IF  '&TC' EQ HLAB
  206.     LD    A,(HL)
  207.     HEXOUT            ;;CONV TO HEX & OUTPUT
  208.     ELSE
  209.     LD    E,(HL)
  210.     LD    C,2D
  211.     CALL    5
  212.     ENDIF
  213.     POP    HL
  214.     POP    BC
  215.     INC    HL
  216.     DEC    C
  217.     JP    NZ,PLOOP
  218.     ENDIF
  219.     ENDIF
  220.     ENDIF
  221.     ENDM
  222. ;
  223. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  224. ;
  225. ;    HEXOUT MACRO    CONVERT BINARY NO AND OUTPUT TO CONSOLE
  226. ;
  227. ;    HEXOUT    ADDR
  228. ;
  229. ;        NUMBER ASSUMED IN A IF NO ARGUMENT
  230. ;
  231. HEXOUT    MACRO    ADDR
  232.     LOCAL    OUTCHR,HEXEND
  233.     JR    HEXEND
  234. HEXPRN:    SAVE    AF
  235.     RRCA
  236.     RRCA
  237.     RRCA
  238.     RRCA            ;;SHIFT RIGHT 4
  239.     CALL    OUTCHR
  240.     RESTORE    AF
  241. OUTCHR:    AND    X'0F'
  242.     ADD    A,X'90'
  243.     DAA            ;;DEC ADJUST
  244.     ADC    A,X'40'
  245.     DAA            ;;DEC ADJUST
  246.     LD    E,A
  247.     LD    C,2
  248.     JP    5        ;;CALL BDOS
  249. HEXEND:
  250. HEXOUT    MACRO    ?ADDR
  251.     IFNB    <?ADDR>
  252.     LD    A,(?ADDR)
  253.     ENDIF
  254.     CALL    HEXPRN
  255.     ENDM
  256.     HEXOUT    ADDR
  257.     ENDM
  258. ;
  259. ;
  260. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  261. ;
  262. ;    HEXIN MACRO    CONVERT A NUMBER IN MEMORY FROM HEX TO BINARY
  263. ;
  264. ;            IF NO ARGUMENT MACRO ASSUMES ADDR OF HEX STRING IN HL
  265. ;            ANSWER LEFT IN HL WITH LEAST SIGNIFICANT 8 BITS IN A
  266. ;            CARRY SET ON ERROR. CONVERSION STOPS WHEN ZERO IS
  267. ;            FOUND IN HEX STRING.
  268. ;
  269. HEXIN    MACRO    ADDR
  270.     LOCAL    IN1,IN2,OVRHEX
  271.     JR    OVRHEX
  272. @HEXIN:    LD    HL,0D
  273. IN1:    LD    A,(DE)
  274.     OR    A        ;;CHECK FOR END OF BUFFER
  275.     RET    Z
  276.     SUB    '0'        ;;CHECK < 0 AND CONVERT TO HEX
  277.     RET    C
  278.     ADD    A,'0'-'G'        ;;CHECK > F
  279.     RET    C
  280.     ADD    A,6
  281.     JP    P,IN2
  282.     ADD    A,7
  283.     RET    C
  284. IN2:    ADD    A,10
  285.     OR    A        ;;CLEAR CARRY
  286.     LD    C,A
  287.     LD    B,0        ;;ZERO TO B
  288.     ADD    HL,HL
  289.     ADD    HL,HL
  290.     ADD    HL,HL
  291.     ADD    HL,HL        ;;SHIFT LEFT 4
  292.     ADD    HL,BC
  293.     INC    DE        ;;INCR BUFFER POINTER
  294.     JR    IN1        ;;RETURN FOR MORE INPUT
  295. OVRHEX:
  296. HEXIN    MACRO    ?ADDR
  297.     IFNB    <?ADDR>
  298.     LD    DE,?ADDR        ;;LOAD BUFFER ADDR
  299.     ELSE
  300.     EX    DE,HL
  301.     ENDIF
  302.     CALL    @HEXIN
  303.     LD    A,L        ;;LEAST SIGNIFICANT 8 BITS TO A
  304.     ENDM
  305.     HEXIN    ADDR
  306.     ENDM
  307. ;
  308. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  309. ;
  310. ;    DECOUT MACRO    CONVERT A POSITIVE INTEGER TO DECIMAL AND OUTPUT 
  311. ;            TO THE CONSOLE.
  312. ;
  313. ;    DECOUT    ADDR
  314. ;
  315. ;        IF ADDR OMITTED, NUMBER ASSUMED TO BE IN HL, ELSE LOADED TO HL
  316. ;        LEADING ZEROS SUPRESSED. MAXIMUM NUMBER 65,767
  317. ;
  318. DECOUT    MACRO    ADDR
  319.     LOCAL    ENDDEC,DX
  320.     JR    ENDDEC
  321. @DECOUT:SAVE            ;;PUSH STACK
  322.     LD    BC,-10        ;;RADIX FOR CONVERSION
  323.     LD    DE,-1        ;;THIS BECOMES NO DIVIDED BY RADIX
  324. DX:    ADD    HL,BC        ;;SUBTRACT 10
  325.     INC    DE
  326.     JP    C,DX
  327.     LD    BC,10
  328.     ADD    HL,BC        ;;ADD RADIX BACK IN ONCE
  329.     EX    DE,HL
  330.     LD    A,H
  331.     OR    L        ;;TEST FOR ZERO
  332.     CALL    NZ,@DECOUT    ;;RECURSIVE CALL
  333.     LD    A,E
  334.     ADD    A,'0'        ;;CONVERT FROM BCD TO HEX
  335.     LD    E,A        ;;TO E FOR OUTPUT
  336.     CHAROUT            ;;CONSOLE OUTPUT
  337.     RESTORE            ;;POP STACK
  338.     RET
  339. ENDDEC:
  340. DECOUT    MACRO    ?ADDR
  341.     IFNB    <?ADDR>
  342.     LD    HL,(?ADDR)
  343.     ENDIF
  344.     CALL    @DECOUT        ;;CALL THE SUBROUTINE
  345.     ENDM
  346.     DECOUT    ADDR
  347.     ENDM
  348. ;
  349. ;
  350. ;
  351. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  352. ;
  353. ;    DECIN MACRO    CONVERT A NUMBER IN MEMORY FROM ASCII TO BINARY
  354. ;
  355. ;    DECIN    ADDR
  356. ;
  357. ;        ADDR POINTS TO MEMORY LOCATION OF START OF NO, IF
  358. ;        ARG OMITTED POINTER ASSUMED LOADED TO HL
  359. ;        MACRO RETURNS WITH CARRY SET IF ALPHABETIC CHAR FOUND
  360. ;        CONVERSION STOPS WHEN CHAR LESS THAN ZERO IS FOUND.
  361. ;        BINARY NUMBER IS LEFT IN HL, MAXIMUM 65,767
  362. ;        LEAST SIGNIFICANT 8 BITS OF NUMBER IN A.
  363. ;
  364. DECIN    MACRO    ADDR
  365.     LOCAL    DLOOP,@OVER1
  366.     JR    @OVER1
  367. @DECIN:    LD    DE,0        ;;ZERO DE
  368.     EX    DE,HL
  369. DLOOP:    LD    A,(DE)
  370.     SUB    'O'
  371.     AND    A
  372.     RET    M
  373.     CP    10D
  374.     CCF
  375.     RET    C
  376.     INC    DE        ;;INCR ADDR POINTER
  377.     ADD    HL,HL        ;;SHIFT LEFT 1
  378.     PUSH    HL        ;;SAVE RESULT
  379.     ADD    HL,HL
  380.     ADD    HL,HL
  381.     POP    BC        ;;NO * 2 TO B
  382.     ADD    HL,BC
  383.     LD    C,A        ;;ADD PRODUCT TO DIGIT
  384.     LD    B,0
  385.     ADD    HL,BC
  386.     JP    DLOOP        ;;BACK FOR ANOTHER DIGIT
  387. @OVER1:
  388. DECIN    MACRO    ?ADDR
  389.     IFNB    <?ADDR>
  390.     LD    HL,?ADDR
  391.     ENDIF
  392.     CALL    @DECIN        ;;CALL THE SUBROUTINE
  393.     LD    A,L        ;;LEAST SIGNIFICANT HALF OF NO TO A
  394.     ENDM
  395.     DECIN    ADDR
  396.     ENDM
  397. ;
  398. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  399. ;
  400. ;    MOVE MACRO    MOVE A BLOCK FROM SOURCE TO DEST
  401. ;
  402. ;    MOVE    SOURCE,DEST,COUNT
  403. ;
  404. ;        SOURCE TO HL    MACRO ASSUMES REGISTERS ALREADY
  405. ;        DEST TO DE    LOADED IF ARG OMITTED
  406. ;        COUNT TO BC
  407. ;
  408. MOVE    MACRO    SOURCE,DEST,COUNT
  409.     LOCAL    OVRMOV
  410.     JR    OVRMOV
  411. @MOVE:    LD    A,B
  412.     OR    C
  413.     RET    Z
  414.     LD    A,(HL)
  415.     LD    (DE),A
  416.     INC    HL
  417.     INC    DE
  418.     DEC    BC
  419.     JR    @MOVE        ;;BACK TO MOVE LOOP
  420. OVRMOV:
  421. MOVE    MACRO    SRC,?D,?C
  422.     IFNB    <SRC>
  423.     LD    HL,SRC
  424.     ENDIF
  425.     IFNB    <?D>
  426.     LD    DE,?D
  427.     ENDIF
  428.     IFNB    <?C>
  429.     LD    BC,?C
  430.     ENDIF
  431.     CALL    @MOVE        ;;CALL THE MOVE SUBROUTINE
  432.     ENDM
  433.     MOVE    SOURCE,DEST,COUNT
  434.     ENDM
  435. ;
  436. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  437. ;
  438. ;    FILL MACRO - FILL A BLOCK OF MEMORY WITH A CONSTANT
  439. ;
  440. ;    FILL    START,STOP,CONSTANT
  441. ;
  442. ;        CONSTANT OMITTED, FILL WITH 0
  443. ;        END OMITTED, FILL ONE BYTE
  444. ;
  445. FILL    MACRO    START,STOP,CONST
  446.     LOCAL    @FILL,BLKLEN
  447. .8080
  448. BLKLEN    SET    STOP-START+1
  449. .Z80
  450.     LD    HL,START        ;;LOAD START ADDR
  451.     IFNB    <STOP>
  452.     IF    BLKLEN GT 255
  453.     LD    BC,BLKLEN    ;;LOAD BLOCK LENGTH
  454.     ELSE
  455.     LD    C,BLKLEN AND X'FF'
  456.     ENDIF
  457.     IFNB    <CONST>
  458.     LD    E,CONST        ;;LOAD CONST IF NOT NULL
  459.     ELSE
  460.     LD    E,0
  461.     ENDIF
  462. @FILL:    LD    (HL),E        ;;STORE A BYTE
  463.     INC    HL        ;;INCR MEMORY POINTER
  464.     IF    BLKLEN GT 255
  465.     DEC    BC        ;;DECR COUNT
  466.     LD    A,C        ;;TEST LIMIT
  467.     OR    B
  468.     JR    NZ,@FILL        ;;CONTINUE
  469.     ELSE
  470.     DEC    C
  471.     JR    NZ,@FILL
  472.     ENDIF
  473.     ELSE
  474.     IFB    <CONST>
  475.     LD    (HL),0
  476.     ELSE
  477.     LD    (HL),CONST
  478.     ENDIF
  479.     ENDIF
  480.     ENDM
  481. ;
  482. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  483. ;
  484. ;
  485. ;    MATCH MACRO    COMPARE 2 STRINGS OF SAME LENGTH SET CARRY IF EQUAL
  486. ;
  487. ;    MATCH    STR1,'LITERAL STRING'
  488. ;    MATCH    STR1,STR2,LENGTH
  489. ;    MATCH
  490. ;
  491. ;        DE POINTS TO STR1    MACRO WILL LOAD REG IF ARG
  492. ;        HL POINTS TO STR2    PRESENT
  493. ;        C CONTAINS LENGTH
  494. ;
  495. ;        SUBTRACT STR2 FROM STR1 AND SET FLAGS, ZERO INDICATES MATCH.
  496. ;        NORMALLY THE SECOND ARG IS A LITERAL STRING AND THE LENGTH
  497. ;        IS OMITTED. IF THE LEN ARG IS PRESENT THE SECOND STRING
  498. ;        ARG IS ASSUMED TO BE A MEMORY ADDR. IF ALL ARGUMENTS OMITTED
  499. ;        REGISTERS ASSUMED ALREADY LOADED.
  500. ;
  501. ;    NOTE:  I HAD BETTER LUCK WITH THIS ONE TESTING THE ZERO
  502. ;           FLAG INSTEAD OF THE CARRY FLAG.  D. NIENHISER
  503. ;
  504. MATCH    MACRO    STR1,STR2,LEN
  505.     LOCAL    OVRMAT,M1
  506.     JR    OVRMAT
  507. @MATCH:    INC    C        ;;PRE INCREMENT COUNT (IT MIGHT BE ZERO)
  508. M1:    DEC    C        ;;DECR LENGTH COUNT
  509.     RET    Z
  510.     LD    A,(DE)
  511.     SUB    (HL)        ;;COMPARE WITH OTHER
  512.     RET    NZ
  513.     INC    HL
  514.     INC    DE        ;;INCR STRING POINTERS
  515.     JR    M1        ;;TRY SOME MORE
  516. OVRMAT:
  517. MATCH    MACRO    ?STR1,?STR2,?LEN
  518.     LOCAL    LITSTR,ENDLIT
  519.     IFB    <?STR1&?STR2&LEN>
  520.     CALL    @MATCH
  521.     ELSE
  522.     IFNB    <?STR1>
  523.     LD    DE,?STR1        ;;LOAD STRING1 POINTER
  524.     ENDIF
  525.     IFB    <?LEN>
  526.     LD    C,ENDLIT-LITSTR    ;;LENGTH OF LITERAL STRING
  527.     LD    HL,LITSTR    ;;POINTER TO LITERAL
  528.     CALL    @MATCH
  529.     JR    ENDLIT
  530. LITSTR:    DB    ?STR2        ;;LITERAL STRING
  531. ENDLIT:                ;;END OF STRING
  532.     ELSE
  533.     IFNB    <?STR2>
  534.     LD    HL,?STR2        ;;LOAD POINTER TO STRING2
  535.     ENDIF
  536.     LD    C,?LEN        ;;LOAD STRING LENGTH
  537.     CALL    @MATCH        ;;CALL MATCH SUBROUTINE
  538.     ENDIF
  539.     ENDIF
  540.     ENDM
  541.     MATCH    STR1,STR2,LEN
  542.     ENDM
  543. ;
  544. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  545. ;
  546. ;    INSTR MACRO    SEARCH STRING FOR SUBSTRING AND SET CARRY IF FOUND
  547. ;
  548. ;    INSTR    STRING,LENGTH,SUBSTR
  549. ;
  550. ;        HL    POINTS TO STRING
  551. ;        DE    POINTS TO SUBSTRING
  552. ;        B    CONTAINS STRING LENGTH
  553. ;        C    CONTAINS SUBSTRING LENGTH
  554. ;
  555. ;        MACRO RETURNS POINTER TO END OF SUBSTRING IN HL
  556. ;
  557. ;             N O T E:  THE MATCH MACRO MUST BE INVOKED BEFORE
  558. ;                       THIS MACRO CAN BE USED.
  559. ;
  560. INSTR    MACRO    STRING,LENGTH,SUBST
  561.     LOCAL    OVRINS,S1,SSX
  562.     JR    OVRINS
  563. @INSTR:    LD    A,B        ;;STRING LENGTH
  564.     SUB    C        ;;SUBTRACT SUBSTR LENGTH
  565.     CCF            ;;COMP CARRY
  566.     RET    NC
  567.     LD    B,A        ;;NEW STRING LIMIT TO B
  568. S1:    SAVE
  569.     MATCH
  570.     RESTORE
  571.     JR    Z,SSX        ;;MATCH IF ZERO ON RET
  572.     AND    A        ;;RESET CARRY
  573.     DEC    B        ;;BYTES LEFT
  574.     RET    M
  575.     INC    HL        ;;INCR STRING POINTER
  576.     JR    S1        ;;TRY AGAIN
  577. SSX:    LD    B,0        ;;SET D TO 0
  578.     ADD    HL,BC
  579.     SCF            ;;SET CARRY
  580.     RET
  581. OVRINS:
  582. INSTR    MACRO    ?STR,?LEN,?SUBST
  583.     LOCAL    LITSTR,ENDLIT
  584.     IFNB    <?STR>
  585.     LD    HL,?STR
  586.     ENDIF
  587.     LD    B,?LEN
  588.     LD    C,ENDLIT-LITSTR
  589.     LD    DE,LITSTR
  590.     CALL    @INSTR
  591.     JR    ENDLIT
  592. LITSTR:    DB    ?SUBST
  593. ENDLIT:
  594.     ENDM
  595.     INSTR    STRING,LENGTH,SUBST
  596.     ENDM
  597. ;
  598. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  599. ;
  600. ;    SCAN MACRO    SCAN A STRING UNTIL A CHAR IS FOUND, SKIP BLANKS
  601. ;            AND CONTROL CHARACTERS
  602. ;
  603. ;            CARRY SET IF NUMERIC, CARRY OFF IF ALPHABETIC
  604. ;
  605. ;
  606. SCAN    MACRO    ADDR
  607.     LOCAL    OVRSCA
  608.     JR    OVRSCA
  609. @SCAN:    LD    A,(HL)
  610.     CP    21H        ;;SPACE OR LESS?
  611.     RET    P
  612.     INC    HL        ;;INCR POINTER
  613.     JR    @SCAN        ;;KEEP SEARCHING
  614. OVRSCA:
  615. SCAN    MACRO    ?ADDR
  616.     IFNB    <?ADDR>
  617.     LD    HL,?ADDR
  618.     ENDIF
  619.     CALL    @SCAN        ;;CALL SUBROUTINE
  620.     CP    3AH        ;;NUMBER OR ALPHA
  621.     ENDM
  622.     SCAN    ADDR
  623.     ENDM
  624. ;
  625. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  626. ;
  627. ;    DISKIO MACRO    EXECUTE BDOS DISK ACCESS PRIMITIVES
  628. ;
  629. ;    NOTE: CP/M 2.2 FUNCTIONS ADDED!  D.NIENHISER 11/80
  630. ;
  631. ;    DISKIO    FUNCTION,PARAMETER
  632. ;
  633. ;        NO    FUNCTION    ENTRY PARAM
  634. ;
  635. ;        12    LIFTHEAD
  636. ;        13    INITIAL
  637. ;        14    LOGIN        DISK NO 0 - 1
  638. ;        15    OPEN        FCB
  639. ;        16    CLOSE        FCB
  640. ;        17    SEARCH        FCB
  641. ;        18    SERNXT        FCB
  642. ;        19    DELETE        FCB
  643. ;        20    READ        FCB
  644. ;        21    WRITE        FCB
  645. ;        22    MAKE        FCB
  646. ;        23    RENAME        FCB
  647. ;        24    ?LOGIN
  648. ;        25    ?DRIVE
  649. ;        26    SETDMA        BUFFER
  650. ;        27    ?ALLOC
  651. ;        28    WRPDSK
  652. ;        29    GETROV
  653. ;        30    SETFAT        FCB
  654. ;        31    GETDAT
  655. ;        32    GTSTUC
  656. ;        33    READRA        FCB
  657. ;        34    WRITRA        FCB
  658. ;        35    COMFSZ        FCB
  659. ;        36    SETRRC        FCB
  660. ;        37    RSTDRV
  661. ;        40    RANWR        FCB
  662. ;        SEE CP/M INTERFACE GUIDE FOR DETAILED INFORMATION ON THE
  663. ;        DISK ACCESS PRIMITIVES
  664. ;
  665. ;    DISKIO    READ,FCB    (TYPICAL MACRO CALL)
  666. ;
  667. DISKIO    MACRO    FUNCTI,PARAME
  668. .8080
  669. LIFTHEAD    SET    12
  670. INITIAL        SET    13
  671. LOGIN        SET    14
  672. OPEN        SET    15
  673. CLOSE        SET    16
  674. SEARCH        SET    17
  675. SERNXT        SET    18
  676. DELETE        SET    19
  677. READ        SET    20
  678. WRITE        SET    21
  679. MAKE        SET    22
  680. RENAME        SET    23
  681. ?LOGIN        SET    24
  682. ?DRIVE        SET    25
  683. SETDMA        SET    26
  684. ?ALLOC        SET    27
  685. WRPDSK        SET    28
  686. GETROV        SET    29
  687. SETFAT        SET    30
  688. GETDAT        SET    31
  689. GTSTUC        SET    32
  690. READRA        SET    33
  691. WRITRA        SET    34
  692. COMFSZ        SET    35
  693. SETRRC        SET    36
  694. RSTDRV        SET    37
  695. RANWR        SET    40
  696. ;
  697. ?C    SET    FUNCTI
  698. .Z80
  699.     IFNB    <PARAME>
  700.     LD    DE,PARAME
  701.     ENDIF
  702.     LD    BC,?C
  703.     CALL    5        ;;BDOS ENTRY
  704.     ENDM
  705. ;
  706. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  707. ;
  708. ;    CALLBIOS MACRO    CALL BIOS ROUTINES DIRECTLY
  709. ;
  710. ;    NOTE:    CP/M 2.2 VECTORS HAVE BEEN ADDED
  711. ;        D. NIENHISER    11/80
  712. ;
  713. ;    CALLBIOS    FUNCTION,PARAM
  714. ;
  715. CALLBIOS    MACRO    FUNCT,PARAM
  716.     LOCAL    @CALL
  717. ;
  718. .8080
  719. DCOLD    SET    00H
  720. DWBOOT    SET    03H
  721. DSTAT    SET    06H
  722. DCONIN    SET    09H
  723. DCONOUT    SET    0CH        ;;CHAR IN C
  724. DLIST    SET    0FH        ;;CHAR IN C
  725. DPUNCH    SET    12H
  726. DREADER    SET    15H
  727. DHOME    SET    18H
  728. DSELDSK    SET    1BH
  729. DSETTRK    SET    1EH
  730. DSETSEC    SET    21H        ;;SECTOR NO IN C
  731. DSETDMA    SET    24H        ;;DMA ADDR IN BC
  732. DREAD    SET    27H
  733. DWRITE    SET    2AH
  734. LISTST    SET    2DH
  735. SECTRN    SET    30H
  736. ;
  737. ?F    SET    FUNCT
  738. .Z80
  739.     IFNB    <PARAM>
  740.     LD    BC,PARAM
  741.     ENDIF
  742.     LD    HL,(1)
  743.     LD    L,?F AND X'FF'
  744.     LD    (@CALL+1),HL
  745. @CALL:    CALL    0
  746.     ENDM
  747. ;
  748. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  749. ;
  750. ;    DLOAD MACRO    DOUBLE PRECISION INDEXED LOAD HL
  751. ;
  752. ;        LOAD (ADDR + INDX) TO HL
  753. ;
  754. DLOAD    MACRO    ADDR,INDX
  755.     IFB    <INDX>
  756.     LD    HL,(ADDR)
  757.     ELSE
  758.     LD    HL,(INDX)
  759.     LD    DE,ADDR
  760.     ADD    HL,DE
  761.     LD    E,(HL)
  762.     INC    HL
  763.     LD    D,(HL)
  764.     EX    DE,HL
  765.     ENDIF
  766.     ENDM
  767. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  768. ;
  769. ;    CPHL MACRO    SUBTRACT DE FROM HL AND SET FLAGS
  770. ;
  771. CPHL    MACRO
  772.     LOCAL    @END
  773.     LD    A,H
  774.     CP    D        ;;COMPARE HIGH BYTES
  775.     JR    NZ,@END
  776.     LD    A,L
  777.     CP    E        ;;COMPARE LOW BYTES
  778. @END:
  779.     ENDM
  780. ;
  781. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  782. ;
  783. ;    DJZ MACRO    DOUBLE PRECISION TEST HL AND JUMP ON ZERO
  784. ;
  785. DJZ    MACRO    ADDR
  786.     LD    A,H
  787.     OR    L
  788.     JP    Z,ADDR
  789.     ENDM
  790. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  791. ;
  792. ;    DSTORE MACRO    DOUBLE PRECISION INDEXED STORE HL
  793. ;
  794. ;        STORE (HL) IN (ADDR + INDX)
  795. ;
  796. DSTORE    MACRO    ADDR,INDX
  797.     IFB    <INDX>
  798.     LD    (ADDR),HL
  799.     ELSE
  800.     SAVE    HL
  801.     LD    HL,(INDX)
  802.     EX    DE,HL
  803.     LD    HL,ADDR
  804.     ADD    HL,DE
  805.     RESTORE    DE
  806.     LD    (HL),E
  807.     INC    HL
  808.     LD    (HL),D
  809.     ENDIF
  810.     ENDM
  811. ;
  812. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  813. ;
  814. ;    INDEX MACRO    INDEX AN ADDRESS POINTER BY A CONSTANT
  815. ;
  816. ;    INDEX    POINTER,INCR
  817. ;
  818. INDEX    MACRO    POINTER,INCR
  819.     LD    HL,(POINTER)
  820.     LD    DE,INCR
  821.     ADD    HL,DE
  822.     LD    (POINTER),HL
  823.     ENDM
  824. ;
  825. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . .
  826. ;
  827. ;    FILFCB    MACRO    FILL IN THE ID FIELDS OF FCB
  828. ;
  829. ;    FILFCB    FCB,IDSTRING
  830. ;
  831. ;        IDSTRING CONTAINS FILE NAME AND TYPE  (FILNAM.TYP)
  832. ;        CARRY SET IF ERROR  (NAME TOO LONG)
  833. ;
  834. FILFCB    MACRO    FCB,IDSTRI
  835.     LOCAL    OVRFIL,F1,F2,F3,F4,F5,F6
  836.     JR    OVRFIL
  837. @FLFCB:    LD    (HL),0
  838.     INC    HL
  839.     PUSH    HL
  840.     LD    C,11        ;;SIZE OF ID FIELD
  841.     LD    A,' '        ;;SPACE TO A
  842. F1:    LD    (HL),A
  843.     INC    HL
  844.     DEC    C
  845.     JR    NZ,F1
  846.     POP    HL        ;;RESTORE NAME POINTER
  847.     LD    C,8        ;;MAXIMUM SIZE OF NAME
  848. F2:    LD    A,(DE)
  849.     CP    ' '        ;;LEADING SPACES?
  850.     JR    NZ,F3
  851.     INC    DE
  852.     JR    F2
  853. F3:    LD    A,(DE)
  854.     CP    0        ;;ZERO END OF FIELD
  855.     RET    Z
  856.     CP    ' '        ;;SPACE END OF FIELD
  857.     RET    Z
  858.     CP    '.'        ;;PERIOD TYPE SEPARATOR
  859.     JR    Z,F4
  860.     LD    (HL),A
  861.     INC    HL
  862.     INC    DE
  863.     DEC    C
  864.     JP    P,F3
  865.     SCF            ;;SET CARRY NAME TOO LARGE
  866.     RET
  867. F4:    INC    DE        ;;SKIP THE PERIOD
  868.     LD    A,C
  869.     OR    A
  870.     JR    Z,F6        ;;TEST C FOR ZERO
  871. F5:    INC    HL
  872.     DEC    C
  873.     JR    NZ,F5
  874. F6:    LD    C,3        ;;SIZE OF TYPE FIELD
  875. F7:    LD    A,(DE)
  876.     CP    0        ;;ZERO?
  877.     RET    Z
  878.     CP    ' '        ;;SPACE?
  879.     RET    Z
  880.     LD    (HL),A
  881.     INC    HL
  882.     INC    DE
  883.     DEC    C
  884.     JR    NZ,F7
  885.     RET
  886. OVRFIL:
  887. FILFCB    MACRO    ?FCB,?ID
  888.     IFNB    <?ID>
  889.     LD    DE,?ID
  890.     ENDIF
  891.     IFNB    <?FCB>
  892.     LD    HL,?FCB
  893.     ENDIF
  894.     CALL    @FLFCB
  895.     EX    DE,HL
  896.     ENDM
  897.     FILFCB    FCB,IDSTRI
  898.     ENDM
  899. ;
  900. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  901. ;
  902. ;    SETTRK MACRO    SET AND TEST TRACK NUMBER
  903. ;
  904. ;            CARRY SET IF > 76
  905. ;
  906. SETTRK    MACRO    TRKNO
  907.     LOCAL    ENDTRK
  908.     IFNB    <TRKNO>
  909.     LD    A,TRKNO
  910.     ENDIF
  911.     CP    77
  912.     CCF
  913.     JR    C,ENDTRK
  914.     LD    C,A        ;;TRACK NO TO C
  915.     CALLBIOS DSETTRK
  916. ENDTRK:
  917.     ENDM
  918. ;
  919. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  920. ;
  921. ;    SETSEC MACRO    SET AND TEST SECTOR NUMBER
  922. ;
  923. ;        RETURN WITH CARRY SET < 1 OR > 26
  924. ;
  925. SETSEC    MACRO    SECNO
  926.     LOCAL    ENDSEC
  927.     IFNB    <SECNO>
  928.     LD    A,SECNO
  929.     ENDIF
  930.     OR    A        ;CHECK ZERO
  931.     SCF
  932.     JR    Z,ENDSEC
  933.     CP    27        ;CHECK > 26
  934.     CCF
  935.     JP    C,ENDSEC
  936.     LD    C,A        ;MOVE TO C
  937.     CALLBIOS DSETSEC
  938. ENDSEC:
  939.     ENDM
  940. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  941. ;
  942. ;    HALF MACRO    DIVIDES A 16 BIT NUMBER BY 2
  943. ;
  944. HALF    MACRO    I
  945.     LOCAL    OVER
  946.     JR    OVER
  947. @HALF:    XOR    A        ;;CLEAR CARRY
  948.     LD    A,H
  949.     RRA            ;;SHIFT UPPER HALF
  950.     LD    H,A
  951.     LD    A,L
  952.     RRA            ;;SHIFT LOWER HALF
  953.     LD    L,A
  954.     RET
  955. OVER:
  956. HALF    MACRO    ?I
  957.     IFNB    <?I>
  958.     LD    HL,(?I)
  959.     ENDIF
  960.     CALL    @HALF
  961.     ENDM
  962.     HALF    I
  963.     ENDM
  964.