home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol039 / macs3740.lib < prev    next >
Encoding:
Text File  |  1984-04-29  |  16.0 KB  |  844 lines

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