home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol004 / macros.lib < prev    next >
Text File  |  1984-04-29  |  15KB  |  797 lines

  1. ;FILE        MACROS.LIB
  2. ;
  3. ;    . . . . . . . . . . . . . . . . . . . . . . . . .
  4. ;
  5. ;    ADDHA MACRO    ADD A TO HL
  6. ;
  7. ADDHA    MACRO
  8.     ADD    L        ;;ADD LOW ORDER BYTE.
  9.     MOV    L,A
  10.     MOV    A,H        ;;OVERFLOW TO HIGH ORDER BYTE.
  11.     ACI    0
  12.     MOV    H,A
  13.     ENDM
  14. ;
  15. ;
  16. ;    . . . . . . . . . . . . . . . . . . . . . . . . .
  17. ;
  18. ;    DCMP MACRO    COMPARE DE TO HL
  19. ;
  20. DCMP    MACRO
  21.     MOV    A,H    ;;HIGH ORDER BYTE
  22.     CMP    D
  23.     JNZ    $+5
  24.     MOV    A,L    ;;LOW ORDER BYTE
  25.     CMP    E
  26.     ENDM
  27. ;
  28. ;
  29. ;    . . . . . . . . . . . . . . . . . . . . . . . . .
  30. ;
  31. ;    DSUB MACRO    SUBTRACT DE FROM HL
  32. ;
  33. DSUB    MACRO
  34.     MOV    A,L    ;;LOW ORDER BYTE
  35.     SUB    E
  36.     MOV    L,A
  37.     MOV    A,H    ;;HIGH ORDER BYTE
  38.     SUB    D
  39.     MOV    H,A
  40.     ENDM
  41. ;
  42. ;
  43. ;    . . . . . . . . . . . . . . . . . . . . . . . . .
  44. ;
  45. ;    INDEX MACRO    INDEX AN ADDRESS BY AMT
  46. ;
  47. INDEX    MACRO    ADDR,AMT
  48.     IF    NUL AMT
  49.     LHLD    ADDR
  50.     INX    HL
  51.     SHLD    ADDR
  52.     ELSE
  53.     LHLD    ADDR
  54.     PUSH    DE
  55.     LXI    DE,AMT
  56.     DAD    DE
  57.     POP    DE
  58.     SHLD    ADDR
  59.     ENDIF
  60.     ENDM
  61. ;
  62. ;
  63. ;    . . . . . . . . . . . . . . . . . . . . . . . . .
  64. ;
  65. ;    BUMP MACRO    BUMP A BYTE COUNTER
  66. ;
  67. BUMP    MACRO    BYTE,AMT
  68.     IF    NUL AMT
  69.     LDA    BYTE        ;;BUMP BY ONE.
  70.     INR    A
  71.     STA    BYTE
  72.     ELSE
  73.     LDA    BYTE        ;;BUMP BY AMT.
  74.     ADI    AMT
  75.     STA    BYTE
  76.     ENDIF
  77.     ENDM
  78. ;
  79. ;    . . . . . . . . . . . . . . . . . . . . . . . . .
  80. ;
  81. ;    CPM MACRO    CP/M REQUEST CALLS
  82. ;
  83. ;    CPM    FUNC,ADDR,TYPE
  84. ;
  85. ;    CPM    FUNC,ADDR        (CALL BDOS WITH DE>=ADDR)
  86. ;    CPM    FUNC,,??        (CALL BDOS WITH E=A)
  87. ;    CPM    FUNC            (CALL BDOS FUNC)
  88. ;
  89. CPM    MACRO    FUNC,ADDR,TYPE
  90.     PUSH    HL        ;;SAVE REGS.
  91.     IF    NOT NUL ADDR
  92.     LXI    D,ADDR        ;;POINT TO FCB, ETC.
  93.     ENDIF
  94.     IF    NOT NUL TYPE
  95.     IRPC    ?Y,TYPE
  96. TDIG?    SET    '&?Y'-'?'
  97.     EXITM
  98.     ENDM
  99.     IF    TDIG? = 0    ;;IF ?? THEN,
  100.     MOV    E,A        ;;   MOV E,A.       
  101.     ELSE
  102.     LSR    E,TYPE        ;;PUT VALUE IN E.
  103.     ENDIF
  104.     MVI    D,0
  105.     ENDIF
  106.     MVI    C,FUNC        ;;INDICATE FUNCTION.
  107.     CALL    BDOS        ;;REQUEST THE FUNCTION FROM CP/M.
  108.     POP    HL        ;;RESTORE REGS.
  109.     ENDM
  110. ;
  111. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  112. ;
  113. ;    LSR MACRO    LOAD SINGLE REGISTER
  114. ;
  115. ;
  116. ;        REG IS A,B,C,D,E,H,L WHICH IS THE REGISTER TO
  117. ;        BE LOADED.
  118. ;        VAL IS A NUMERIC VALUE OR A LABEL.  IF IT IS
  119. ;        A NUMERIC VALUE, IT MUST BE 0-255.  IF IT IS 
  120. ;        A LABEL, IT WILL BE LOADED FROM UNLESS THE
  121. ;        FIRST CHARACTER IS @.  THE @ SIGN CAUSES THE
  122. ;        VALUE TO BE LOADED AS AN IMMEDIATE (IE - FOR
  123. ;        LENGTHS OF FIELDS).
  124. ;
  125. ;    LSR    A,10        (MVI A,10)
  126. ;    LSR    A,BBD        (LDA BBD)
  127. ;    LSR    C,BBD        (LDA BBD : MOV C,A)
  128. ;    LSR    C,@LEN        (MVI    A,@LEN : MOV C,A)
  129. ;
  130. LSR    MACRO    REG,VAL
  131.     IF    NUL REG
  132.     ERROR    REG OPERAND MUST BE GIVEN!
  133.     EXITM
  134.     ENDIF
  135.     IF    NOT NUL VAL
  136.     IRPC    ?Y,VAL
  137. TDIG?    SET    '&?Y'-'0'
  138.     EXITM
  139.     ENDM
  140.     IF    TDIG? <= 16    ;;0-9 AND ? @
  141.     MVI    A,VAL        ;;PUT CONSTANT IN A.
  142.     ELSE
  143.     LDA    VAL        ;;PUT VALUE IN A.
  144.     ENDIF
  145. TDIG?    SET    '®'-'A'
  146.     IF    TDIG? = 0
  147.     EXITM
  148.     ELSE
  149.     MOV    REG,A        ;;PUT VALUE IN REG.
  150.     ENDIF
  151.     ENDM
  152. ;
  153. ;
  154. ;    . . . . . . . . . . . . . . . . . . .. . . . . . . . . . .
  155. ;
  156. ;    SAVE MACRO    SAVE SPECIFIED REGISTERS
  157. ;
  158. ;    SAVE    R1,R2,R3,R4
  159. ;
  160. ;        R1-R4 MAY BE B,D,H OR PSW  SAVED IN ORDER SPECIFIED
  161. ;        IF REGS ARE OMITTED SAVE B,D AND H
  162. ;
  163. SAVE    MACRO    R1,R2,R3,R4
  164.     IF NOT NUL R1&R2&R3&R4
  165.     IRP    R,<<R1>,<R2>,<R3>,<R4>>
  166.     IF    NUL R
  167.     EXITM
  168.     ENDIF
  169.     PUSH    R
  170.     ENDM
  171.     ELSE
  172.     IRPC    REG,BDH
  173.     PUSH    REG
  174.     ENDM
  175.     ENDIF
  176.     ENDM
  177. ;
  178. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  179. ;
  180. ;    RESTORE MACRO    RESTORE REGISTERS  (INVERSE OF SAVE)
  181. ;
  182. ;    RESTORE    R1,R2,R3,R4
  183. ;
  184. ;        R1-R4 MAY BE B,D,H OR PSW  RESTORED IN ORDER SPECIFIED
  185. ;        IF REGS OMITTED RESTORE H,D AND B
  186. ;
  187. RESTORE    MACRO    R1,R2,R3,R4
  188.     IF    NOT NUL R1&R2&R3&R4
  189.     IRP    R,<<R1>,<R2>,<R3>,<R4>>
  190.     IF    NUL R
  191.     EXITM
  192.     ENDIF
  193.     POP    R
  194.     ENDM
  195.     ELSE
  196.     IRPC    REG,HDB
  197.     POP    REG
  198.     ENDM
  199.     ENDIF
  200.     ENDM
  201. ;
  202. ;
  203. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  204. ;
  205. ;    INPUT MACRO    INPUT CHARACTER STRING FROM CONSOLE
  206. ;
  207. ;    INPUT    ADDR,BUFLEN
  208. ;
  209. ;        ADDR    START OF TEXT BUFFER
  210. ;        BUFLEN    LENGTH OF BUFFER  (DEFAULT IS 127)
  211. ;
  212. INPUT    MACRO    ?STRING,ADDR,BUFLEN
  213. ;;
  214.     IF    NOT NUL ?STRING
  215.     PRINT    ?STRING        ;;PRINT STRING.
  216.     ENDIF
  217.     IF    NOT NUL ADDR
  218.     LXI    D,ADDR        ;;SET BUFFER ADDRESS
  219.     ENDIF
  220.     IF    NOT NUL BUFLEN
  221.     MVI    A,BUFLEN    ;;SET BUFFER LENGTH
  222.     STAX    D
  223.     ELSE
  224.     MVI    A,127
  225.     STAX    D        ;;SET BUFFER DEFAULT MAXIMUM
  226.     ENDIF
  227.     CPM    CRB        ;;ISSUE READ BUFFER.
  228.     ENDM
  229. ;
  230. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  231. ;
  232. ;    PRINT MACRO    PRINT A STRING ON CONSOLE
  233. ;
  234. ;    PRINT                (CARRIAGE RETURN, LINE FEED)
  235. ;    PRINT    'LITERAL'
  236. ;    PRINT    <'LITERAL',CR,LF,'SECOND LITERAL'>
  237. ;
  238. ;    PRINT    ADDR,$            (ASCII OUTPUT UNTIL $)
  239. ;    PRINT    ADDR,L,H        (HEX OUTPUT L CHARACTERS)
  240. ;    PRINT    ADDR,L,A        (ASCII OUTPUT L CHARACTERS)
  241. ;
  242. ;        LITERALS MUST BE IN SINGLE QUOTES  'LIT'
  243. ;        IF LITERAL CONTAINS CONTROL CODES ENTIRE STRING IN <> BRACKETS
  244. ;        MACRO ALSO ASSEMBLES
  245. ;            CR = CARRIAGE RETURN
  246. ;            LF = LINE FEED
  247. ;            BEL = BELL CODE
  248. ;
  249. ;        MACRO ASSUMES ADDR ALREADY LOADED TO HL IF ARGUMENT OMITTED
  250. ;
  251. PRINT    MACRO    ?STRING,LEN,TC
  252.     LOCAL    @OVER,@MESS,PLOOP,PASTCR,@CRLF
  253. CR    SET    0DH
  254. LF    SET    0AH
  255. BEL    SET    07H
  256.     IF    NUL ?STRING&LEN&TC
  257.     JMP    PASTCR
  258. @CRLF:    DB    CR
  259.     DB    LF
  260.     DB    '$'
  261. PASTCR:    
  262.     CPM    CPB,@CRLF    ;;ISSUE CR,LF.
  263.     ELSE
  264.     IF    NUL LEN&TC
  265.     JMP    @OVER
  266. @MESS:    DB    ?STRING
  267.     DB    '$'
  268. @OVER:    
  269.     CPM    CPB,@MESS    ;;ISSUE MSG.
  270.     ELSE
  271.     IF    NUL TC
  272.     CPM    CPB,?STRING    ;;ISSUE MSG.
  273.     ELSE
  274.     IF    NOT NUL ?STRING
  275.     LXI    H,?STRING    ;;POINTER TO STRING
  276.     ENDIF
  277.     MVI    C,LEN        ;;LENGTH OF STRING
  278. PLOOP:    PUSH    B
  279.     PUSH    H
  280.     IF    TC=H
  281.     MOV    A,M        ;;GET A BYTE
  282.     HEXOUT            ;;CONV TO HEX & OUTPUT
  283.     ELSE
  284.     MOV    E,M        ;;OUTPUT A BYTE.
  285.     CPM    CWRITE
  286.     ENDIF
  287.     POP    H
  288.     POP    B
  289.     INX    H
  290.     DCR    C        ;;DECR LENGTH
  291.     JNZ    PLOOP        ;;CONTINUE TILL LEN 0
  292.     ENDIF
  293.     ENDIF
  294.     ENDIF
  295.     ENDM
  296. ;
  297. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  298. ;
  299. ;    HEXOUT MACRO    CONVERT BINARY NO AND OUTPUT TO CONSOLE
  300. ;
  301. ;    HEXOUT    ADDR
  302. ;
  303. ;        NUMBER ASSUMED IN A IF NO ARGUMENT
  304. ;
  305. HEXOUT    MACRO    ADDR
  306.     LOCAL    OUTCHR,HEXEND
  307.     JMP    HEXEND
  308. HEXPRN:    SAVE    PSW
  309.     RRC
  310.     RRC
  311.     RRC
  312.     RRC            ;;SHIFT RIGHT 4
  313.     CALL    OUTCHR
  314.     RESTORE    PSW
  315. OUTCHR: ANI    0FH        ;;MASK 4 BITS
  316.     ADI    90H        ;;ADD OFFSET
  317.     DAA            ;;DEC ADJUST
  318.     ACI    40H        ;;ADD OFFSET
  319.     DAA            ;;DEC ADJUST
  320.     CPM    CWRITE,,A    ;;OUTPUT (A) TO CONSOLE.
  321.     RET
  322. HEXEND:
  323. HEXOUT    MACRO    ?ADDR
  324.     IF    NOT NUL ?ADDR
  325.     LDA    ?ADDR
  326.     ENDIF
  327.     CALL    HEXPRN
  328.     ENDM
  329.     HEXOUT    ADDR
  330.     ENDM
  331. ;
  332. ;
  333. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  334. ;
  335. ;    DECIN MACRO    CONVERT A NUMBER IN MEMORY FROM ASCII TO BINARY
  336. ;
  337. ;    DECIN    ADDR
  338. ;
  339. ;        INPUT:                                       
  340. ;            ADDR (HL) <= INPUT TEXT
  341. ;            LEN (C) = LENGTH OF TEXT
  342. ;        OUTPUT:
  343. ;            HL <= INPUT TEXT + LEN + 1
  344. ;            C = 0
  345. ;            CY:ON = ERROR
  346. ;
  347. ;
  348. DECIN    MACRO    ADDR,LEN
  349.     LOCAL    DLOOP,OVERSUB
  350.     JMP    OVERSUB
  351. @DECIN:    LXI    D,0        ;;ZERO DE
  352.     XCHG            ;;ADDR POINTER TO DE, ZERO TO HL
  353. DLOOP:    LDAX    D        ;;GET A ASCII DIGIT
  354.     SUI    '0'        ;;CONVERT TO BCD AND TEST
  355.     RC            ;;CONVERSION ERROR
  356.     CPI    10        ;;CHECK LEGITIMATE DIGIT (0-9)
  357.     CMC            ;;COMPLEMENT CARRY
  358.     RC            ;;RET WITH CARRY SET IF ERROR
  359.     INX    D        ;;INCR ADDR POINTER
  360.     PUSH    DE        ;;SAVE DE.
  361.     DAD    HL        ;;2*HL
  362.     MOV    D,H        ;;DE = HL
  363.     MOV    E,L
  364.     DAD    HL        ;;4*HL
  365.     DAD    HL        ;;8*HL
  366.     DAD    DE        ;;10*HL
  367.     POP    DE        ;;RESTORE DE.
  368.     ADD    L        ;;ADD A TO HL.
  369.     MOV    L,A
  370.     MOV    A,H
  371.     ACI    0
  372.     MOV    H,A
  373.     DCR    C        ;;DECR CNT.
  374.     JNZ    DLOOP        ;;BACK FOR ANOTHER DIGIT
  375.     XCHG            ;;DE=NUMBER, HL<=TEXT
  376.     RET
  377. OVERSUB:
  378. DECIN    MACRO    ?ADDR,?LEN
  379.     IF    NOT NUL    ?ADDR
  380.     LXI    H,?ADDR
  381.     ENDIF
  382.     IF    NOT NUL    ?LEN
  383.     LSR    C,?LEN        ;;PUT LENGTH IN C.
  384.     ENDIF
  385.     CALL    @DECIN        ;;CALL THE SUBROUTINE
  386.     MOV    A,E        ;;LEAST SIGNIFICANT HALF OF NO TO A
  387.     ENDM
  388.     DECIN    ADDR,LEN
  389.     ENDM
  390. ;
  391. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  392. ;
  393. ;    BAU8 MACRO    CONVERT A NUMBER FROM BINARY TO ASCII (8 BIT)
  394. ;
  395. ;    BAU8    ADDR
  396. ;    BAU8    ,NUMBER
  397. ;    BAU8    ADDR,NUMBER
  398. ;
  399. ;        INPUT:                                       
  400. ;            ADDR (HL) <= 3-BYTE OUTPUT AREA
  401. ;            NUMBER (A) = BINARY NUMBER
  402. ;        OUTPUT:
  403. ;            HL <= 3-BYTE OUTPUT AREA  
  404. ;            A = BINARY NUMBER
  405. ;
  406. ;
  407. BAU8    MACRO    ADDR,NUMBER
  408.     LOCAL    DVU8,OVERSUB
  409.     JMP    OVERSUB
  410. @BAU8: DS    0
  411.     SAVE
  412.     MVI    C,100        ;;GET HUNDREDS.
  413.     CALL    DVU8
  414.     MVI    C,10        ;;GET TENS.
  415.     CALL    DVU8
  416.     MVI    C,1        ;;GET ONES.
  417.     CALL    DVU8
  418.     RESTORE
  419.     RET
  420. ;
  421. DVU8:    MVI    B,0
  422.     SUB    C
  423.     INR    B
  424.     JNC    DVU8+2          ;;LOOP UNTIL WE GO NEGATIVE.
  425.     ADD    C
  426.     DCR    B
  427.     MOV    C,A        ;;SAVE REMAINDER.
  428.     MOV    A,B        ;;OUTPUT DIVIDEND.
  429.     ADI    '0'
  430.     MOV    M,A
  431.     INX    HL
  432.     MOV    A,C        ;;RESTORE REMAINDER.
  433.     RET
  434. OVERSUB:
  435. BAU8    MACRO    ?ADDR,?NUM
  436.     IF    NOT NUL ?NUM
  437.     LDA    ?NUM
  438.     ENDIF
  439.     IF    NOT NUL    ?ADDR
  440.     LXI    H,?ADDR
  441.     ENDIF
  442.     CALL    @BAU8        ;;CALL THE SUBROUTINE
  443.     ENDM
  444.     BAU8    ADDR,NUMBER
  445.     ENDM
  446. ;
  447. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  448. ;
  449. ;    FILL MACRO - FILL A BLOCK OF MEMORY WITH A CONSTANT
  450. ;
  451. ;    FILL    START,BLKLEN,CONSTANT
  452. ;
  453. ;        CONSTANT OMITTED, FILL WITH 0
  454. ;        BLKLEN OMITTED, FILL ONE BYTE
  455. ;
  456. FILL    MACRO    START,BLKLEN,CONST
  457.     LOCAL    @FILL
  458.     IF    NOT NUL START
  459.     LXI    H,START        ;;LOAD START ADDR
  460.     ENDIF
  461.     IF    NOT NUL BLKLEN
  462.     IF    BLKLEN > 255
  463.     LXI    B,BLKLEN    ;;LOAD BLOCK LENGTH
  464.     ELSE
  465.     MVI    C,BLKLEN
  466.     ENDIF
  467.     IF    NOT NUL CONST
  468.     MVI    E,CONST        ;;LOAD CONST IF NOT NULL
  469.     ELSE
  470.     MVI    E,0
  471.     ENDIF
  472. @FILL:    MOV    M,E        ;;STORE A BYTE
  473.     INX    H        ;;INCR MEMORY POINTER
  474.     IF    BLKLEN > 255
  475.     DCX    B        ;;DECR COUNT
  476.     MOV    A,C        ;;TEST LIMIT
  477.     ORA    B
  478.     JNZ    @FILL        ;;CONTINUE
  479.     ELSE
  480.     DCR    C
  481.     JNZ    @FILL
  482.     ENDIF
  483.     ELSE
  484.     IF    NUL CONST
  485.     MVI    M,0        ;;STORE A ZERO
  486.     ELSE
  487.     MVI    M,CONST        ;;STORE SINGLE BYTE
  488.     ENDIF
  489.     ENDIF
  490.     ENDM
  491. ;
  492. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  493. ;
  494. ;    CALLBIOS MACRO    CALL BIOS ROUTINES DIRECTLY
  495. ;
  496. ;    CALLBIOS    FUNCTION,PARAM
  497. ;
  498. CALLBIOS    MACRO    FUNCT,PARAM
  499.     LOCAL    @CALL
  500. ;
  501. DCOLD    SET    00H
  502. DWBOOT    SET    03H
  503. DSTAT    SET    06H
  504. DCONIN    SET    09H
  505. DCONOUT    SET    0CH        ;;CHAR IN C
  506. DLIST    SET    0FH        ;;CHAR IN C
  507. DPUNCH    SET    12H
  508. DREADER    SET    15H
  509. DHOME    SET    18H
  510. DSELDSK    SET    1BH
  511. DSETTRK    SET    1EH
  512. DSETSEC    SET    21H        ;;SECTOR NO IN C
  513. DSETDMA    SET    24H        ;;DMA ADDR IN BC
  514. DREAD    SET    27H
  515. DWRITE    SET    2AH
  516. ;
  517. ?F    SET    FUNCT
  518.     PUSH    HL        ;;SAVE REGS.
  519.     IF    NOT NUL PARAM
  520.     MVI    C,PARAM
  521.     ENDIF
  522.     LXI    HL,@CALL        ;;GET RETURN POINTER.
  523.     PUSH    HL
  524.     LHLD    1        ;;ADDR OF BIOS
  525.     PUSH    B
  526.     LXI    B,-3
  527.     DAD    B
  528.     MVI    B,0
  529.     MVI    C,?F
  530.     DAD    B
  531.     POP    B
  532.     PUSH    HL        ;;SAVE ADR.
  533.     RET            ;;GOTO IT.
  534. @CALL:    DS    0
  535.     POP    HL
  536.     ENDM
  537. ;
  538. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  539. ;
  540. ;    SETTRK MACRO    SET AND TEST TRACK NUMBER
  541. ;
  542. ;            CARRY SET IF > 76
  543. ;
  544. SETTRK    MACRO    TRKNO
  545.     LOCAL    ENDTRK
  546.     IF    NOT NUL TRKNO
  547.     LDA    TRKNO
  548.     ENDIF
  549.     CPI    77
  550.     CMC
  551.     JC    ENDTRK
  552.     PUSH    BC
  553.     MOV    C,A        ;;TRACK NO TO C
  554.     CALLBIOS DSETTRK
  555.     POP    BC
  556. ENDTRK:    ENDM
  557. ;
  558. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  559. ;
  560. ;    SETSEC MACRO    SET AND TEST SECTOR NUMBER
  561. ;
  562. ;        RETURN WITH CARRY SET < 1 OR > 26
  563. ;
  564. SETSEC    MACRO    SECNO
  565.     LOCAL    ENDSEC
  566.     IF    NOT NUL SECNO
  567.     LDA    SECNO
  568.     ENDIF
  569.     ORA    A        ;CHECK ZERO
  570.     STC
  571.     JZ    ENDSEC
  572.     CPI    27        ;CHECK > 26
  573.     CMC
  574.     JC    ENDSEC
  575.     PUSH    BC
  576.     MOV    C,A        ;MOVE TO C
  577.     CALLBIOS DSETSEC
  578.     POP    BC
  579. ENDSEC:    ENDM
  580. ;
  581. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  582. ;
  583. ;    SELDSK MACRO    SET AND TEST DISK NUMBER
  584. ;
  585. ;        RETURN WITH CARRY SET > 3
  586. ;
  587. SELDSK    MACRO    SELNO
  588.     LOCAL    ENDSEL
  589.     IF    NOT NUL SELNO
  590.     LDA    SELNO
  591.     ENDIF
  592.     CPI    3+1        ;CHECK > 3
  593.     CMC
  594.     JC    ENDSEL
  595.     PUSH    BC
  596.     MOV    C,A        ;MOVE TO C
  597.     CALLBIOS DSELDSK
  598.     POP    BC
  599. ENDSEL:    ENDM
  600. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  601. ;
  602. ;
  603. ;    CLC MACRO    COMPARE 2 STRINGS OF SAME LENGTH SET CARRY IF EQUAL
  604. ;
  605. ;    CLC    STR1,'LITERAL STRING'
  606. ;    CLC    STR1,STR2,LENGTH
  607. ;    CLC
  608. ;
  609. ;        DE POINTS TO STR1    MACRO WILL LOAD REG IF ARG
  610. ;        HL POINTS TO STR2    PRESENT
  611. ;        C CONTAINS LENGTH
  612. ;
  613. ;        SUBTRACT STR2 FROM STR1 AND SET FLAGS, ZERO INDICATES EQUAL.
  614. ;        NORMALLY THE SECOND ARG IS A LITERAL STRING AND THE LENGTH
  615. ;        IS OMITTED. IF THE LEN ARG IS PRESENT THE SECOND STRING
  616. ;        ARG IS ASSUMED TO BE A MEMORY ADDR. IF ALL ARGUMENTS OMITTED
  617. ;        REGISTERS ASSUMED ALREADY LOADED.
  618. ;
  619. CLC    MACRO    STR1,STR2,LEN
  620.     LOCAL    OVERSUB,M1
  621.     JMP    OVERSUB
  622. @CLC:    INR    C        ;;PRE INCREMENT COUNT (IT MIGHT BE ZERO)
  623. M1:    DCR    C        ;;DECR LENGTH COUNT
  624.     RZ            ;;RETURN IF CLC FOUND
  625.     LDAX    D        ;;GET A BYTE FROM ONE STRING
  626.     SUB    M        ;;COMPARE WITH OTHER
  627.     RNZ            ;;RETURN
  628.     INX    H
  629.     INX    D        ;;INCR STRING POINTERS
  630.     JMP    M1        ;;TRY SOME MORE
  631. OVERSUB:
  632. CLC    MACRO    ?STR1,?STR2,?LEN
  633.     LOCAL    LITSTR,ENDLIT
  634.     IF    NUL ?STR1&?STR2&?LEN
  635.     CALL    @CLC
  636.     ELSE
  637.     IF    NOT NUL ?STR1
  638.     LXI    D,?STR1        ;;LOAD STRING1 POINTER
  639.     ENDIF
  640.     IF    NUL ?LEN    ;;TEST FOR LITERAL
  641.     MVI    C,ENDLIT-LITSTR    ;;LENGTH OF LITERAL STRING
  642.     LXI    H,LITSTR    ;;POINTER TO LITERAL
  643.     CALL    @CLC
  644.     JMP    ENDLIT
  645. LITSTR:    DB    ?STR2        ;;LITERAL STRING
  646. ENDLIT:                ;;END OF STRING
  647.     ELSE
  648.     IF    NOT NUL ?STR2
  649.     LXI    H,?STR2        ;;LOAD POINTER TO STRING2
  650.     ENDIF
  651.     LSR    C,?LEN        ;;PUT LENGTH IN C.
  652.     CALL    @CLC        ;;CALL CLC SUBROUTINE
  653.     ENDIF
  654.     ENDIF
  655.     ENDM
  656.     CLC    STR1,STR2,LEN
  657.     ENDM
  658. ;
  659. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  660. ;
  661. ;    INSTR MACRO    SEARCH STRING FOR SUBSTRING AND SET CARRY IF FOUND
  662. ;
  663. ;    INSTR    STRING,LENGTH,SUBSTR
  664. ;
  665. ;        HL    POINTS TO STRING
  666. ;        DE    POINTS TO SUBSTRING
  667. ;        B    CONTAINS STRING LENGTH
  668. ;        C    CONTAINS SUBSTRING LENGTH
  669. ;
  670. ;        MACRO RETURNS POINTER TO END OF SUBSTRING IN HL
  671. ;
  672. INSTR    MACRO    STRING,LENGTH,SUBSTR
  673.     LOCAL    OVERSUB,S1,SSX
  674.     JMP    OVERSUB
  675. @INSTR:    MOV    A,B        ;;STRING LENGTH
  676.     SUB    C        ;;SUBTRACT SUBSTR LENGTH
  677.     CMC            ;;COMP CARRY
  678.     RNC            ;;ERROR RETURN SUBSTR > STRING
  679.     MOV    B,A        ;;NEW STRING LIMIT TO B
  680. S1:    SAVE
  681.     CLC
  682.     RESTORE
  683.     JZ    SSX        ;;CLC IF ZERO ON RET
  684.     ANA    A        ;;RESET CARRY
  685.     DCR    B        ;;BYTES LEFT
  686.     RM            ;;FINISHED IF MINUS, NO MATCH
  687.     INX    H        ;;INCR STRING POINTER
  688.     JMP    S1        ;;TRY AGAIN
  689. SSX:    MVI    B,0        ;;SET D TO 0
  690.     DAD    B
  691.     STC            ;;SET CARRY
  692.     RET
  693. OVERSUB:
  694. INSTR    MACRO    ?STR,?LEN,?SUBSTR
  695.     LOCAL    LITSTR,ENDLIT
  696.     IF    NOT NUL ?STR
  697.     LXI    H,?STR
  698.     ENDIF
  699.     MVI    B,?LEN
  700.     MVI    C,ENDLIT-LITSTR
  701.     LXI    D,LITSTR
  702.     CALL    @INSTR
  703.     JMP    ENDLIT
  704. LITSTR:    DB    ?SUBSTR
  705. ENDLIT:
  706.     ENDM
  707.     INSTR    STRING,LENGTH,SUBSTR
  708.     ENDM
  709. ;
  710. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  711. ;
  712. ;    SCAN MACRO    SCAN A STRING UNTIL A CHAR IS FOUND, SKIP BLANKS
  713. ;            AND CONTROL CHARACTERS
  714. ;
  715. ;            CARRY SET IF NUMERIC, CARRY OFF IF ALPHABETIC
  716. ;
  717. ;
  718. SCAN    MACRO    ADDR
  719.     LOCAL    OVERSUB
  720.     JMP    OVERSUB
  721. @SCAN:    MOV    A,M        ;;GET A BYTE
  722.     CPI    21H        ;;SPACE OR LESS?
  723.     RP
  724.     INX    H        ;;INCR POINTER
  725.     JMP    @SCAN        ;;KEEP SEARCHING
  726. OVERSUB:
  727. SCAN    MACRO    ?ADDR
  728.     IF    NOT NUL ?ADDR
  729.     LXI    H,?ADDR
  730.     ENDIF
  731.     CALL    @SCAN        ;;CALL SUBROUTINE
  732.     CPI    3AH        ;;NUMBER OR ALPHA
  733.     ENDM
  734.     SCAN    ADDR
  735.     ENDM
  736. ;
  737. ;
  738. ;    . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  739. ;
  740. ;
  741. ;    MVC MACRO    MOVE FLD2 TO FLD1
  742. ;
  743. ;    MVC    STR1,'LITERAL STRING'
  744. ;    MVC    STR1,STR2,LENGTH
  745. ;    MVC
  746. ;
  747. ;        DE POINTS TO STR1    MACRO WILL LOAD REG IF ARG
  748. ;        HL POINTS TO STR2    PRESENT
  749. ;        C CONTAINS LENGTH
  750. ;
  751. ;        NORMALLY THE SECOND ARG IS A LITERAL STRING AND THE LENGTH
  752. ;        IS OMITTED. IF THE LEN ARG IS PRESENT THE SECOND STRING
  753. ;        ARG IS ASSUMED TO BE A MEMORY ADDR. IF ALL ARGUMENTS OMITTED
  754. ;        REGISTERS ASSUMED ALREADY LOADED.
  755. ;
  756. MVC    MACRO    STR1,STR2,LEN
  757.     LOCAL    OVERSUB,M1
  758.     JMP    OVERSUB
  759. @MVC:    INR    C        ;;PRE INCREMENT COUNT (IT MIGHT BE ZERO)
  760. M1:    DCR    C        ;;DECR LENGTH COUNT
  761.     RZ            ;;RETURN WHEN ALL MOVED
  762.     MOV    A,M        ;;GET BYTE OF STR2.
  763.     STAX    D        ;;PUT IT IN STR1.
  764.     INX    H
  765.     INX    D        ;;INCR STRING POINTERS
  766.     JMP    M1        ;;TRY SOME MORE
  767. OVERSUB:
  768. MVC    MACRO    ?STR1,?STR2,?LEN
  769.     LOCAL    LITSTR,ENDLIT
  770.     IF    NUL ?STR1&?STR2&?LEN
  771.     CALL    @MVC
  772.     ELSE
  773.     IF    NOT NUL ?STR1
  774.     LXI    D,?STR1        ;;LOAD STRING1 POINTER
  775.     ENDIF
  776.     IF    NUL ?LEN    ;;TEST FOR LITERAL
  777.     MVI    C,ENDLIT-LITSTR    ;;LENGTH OF LITERAL STRING
  778.     LXI    H,LITSTR    ;;POINTER TO LITERAL
  779.     CALL    @MVC
  780.     JMP    ENDLIT
  781. LITSTR:    DB    ?STR2        ;;LITERAL STRING
  782. ENDLIT:                ;;END OF STRING
  783.     ELSE
  784.     IF    NOT NUL ?STR2
  785.     LXI    H,?STR2        ;;LOAD POINTER TO STRING2
  786.     ENDIF
  787.     LSR    C,?LEN        ;;PUT LENGTH IN C.
  788.     CALL    @MVC        ;;CALL MVC SUBROUTINE
  789.     ENDIF
  790.     ENDIF
  791.     ENDM
  792.     MVC    STR1,STR2,LEN
  793.     ENDM
  794. ;
  795. ;
  796. ;END        MACROS.LIB
  797.