home *** CD-ROM | disk | FTP | other *** search
- ; ==========================================
- ; : M Y M A C - RCM MACRO LIBRARY :
- ; : VERSION 2.0 7/10/78 :
- ; : R. C. Minnick :
- ; : Box 306 :
- ; : Ouray, Colorado 81427 :
- ; ==========================================
- ;
- ; *********************
- ; * F I N D P A R * - FIND NEXT PARAMETER
- ; *********************
- ; FIND NEXT PARM IN TBUFF. IF BEYOND THE PARM
- ; FIELD, RETURN CY=1. IF WITHIN, RETURN HL POINTING
- ; TO FIRST CHAR OF PARM, & BC=PARM LENGTH (B=0 ALWAYS).
- ; (NOTE THAT SCAN CAN BE MADE ONLY ONCE)
- ;
- FINDPAR MACRO
- LOCAL OVER,LOCL,LOCH,PTR,LENG
- JMP OVER
- ;; LOCATE FIRST CHAR LSS 30H. CALL WITH HL
- ;; POINTING 1 BELOW FIELD & WITH B=REMAINING LENGTH
- ;; FOR ENTIRE PARM FIELD.
- LOCL: XRA A ;; CLEAR CY
- INX H ;;PTR
- DCR B ;;LENGTH
- JNZ $+5 ;;STILL IN FIELD
- STC
- RET ;;BEYOND FIELD
- MOV A,M ;;DATUM
- CPI 30H
- JNC LOCL
- XRA A ;;CLEAR CY
- RET ;;HL POINTS TO FIRST CHAR LSS 30H
- ;; LOCATE FIRST CHAR GEQ 30H. CALL WITH HL
- ;; POINTING 1 BELOW FIELD & WITH B=REMAINING LENGTH
- ;; FOR ENTIRE PARM FIELD.
- LOCH: XRA A ;;CLEAR CY
- INX H ;;PTR
- DCR B ;;LENGTH
- JNZ $+5 ;;STILL IN FIELD
- STC
- RET ;;BEYOND FIELD
- MOV A,M ;;DATUM
- CPI 30H
- JC LOCH
- RET ;;HL POINTS TO FIRST DATUM GEQ 30H
- ;; LOAD 1+REMAINING STRING LENGTH TO B & CURRENT PTR TO HL
- ;;
- PTR: DW 80H ;;CURRENT PTR
- LENG: DS 1 ;;CURRENT STRING LENGTH
- ;;
- @FINDP: LDA LENG ;;LOAD REGISTERS
- MOV B,A
- LHLD PTR
- CALL LOCL ;;NEXT LSS 30H
- RC ;;BEYOND PARM FIELD
- CALL LOCH ;;NEXT GEQ 30H
- RC ;;BEYOND PARM FIELD
- SHLD PTR ;;SAVE PTR
- MOV A,B
- STA LENG ;;SAVE PRESENT STR LENGTH
- PUSH H ;;SAVE
- CALL LOCL ;;NOW HL PTS TO END+1, CURRENT PARM
- MOV A,L
- POP H
- SUB L ;;A=LENGTH, CURRENT PARM
- MOV C,A
- MVI B,0
- XRA A ;;CLEAR CY
- RET
- ;;
- OVER: LDA 80H
- INR A
- STA LENG ;;SET UP ORIG LENGTH+1
- ;;
- FINDPAR MACRO
- CALL @FINDP
- ENDM
- FINDPAR
- ENDM
- ;
- ;======================================================
- ;
- ; *****************
- ; * M F I L E * - MATCH FILE
- ; *****************
- ;
- ; COMPARE STRING AGAINST SEQUENTIAL INPUT FILE STARTING AT FILE'S
- ; PRESENT POSITION. NOTE: MUST USE FILE MACRO PRIOR TO
- ; USING MFILE MACRO.
- ;
- ; MFILE FILEID,'LITERAL STRING'
- ; MFILE FILEID,STRINGPOINTER,STRINGLENGTH
- ; MFILE FILEID
- ;
- ; (IN LAST, ASSUME HL=STRINGPOINTER & C=STRINGLENGTH LOADED)
- ;
- ; RETURNS ZF=1 FOR MATCH, WITH SEQUENTIAL FILE POSITIONED
- ; SO NEXT GET FINDS THE NEXT CHARACTER AFTER STRING.
- ; RETURNS ZF=0 IF EOF REACHED WITH NO MATCH.
- ;
- MFILE MACRO FILEID,STRING,LENGTH
- LOCAL MLOOP,FAIL,GOOD,EOFI,OVERSUB
- JMP OVERSUB
- ;; FILE MATCH SUBROUTINE. HL=RUNNING PTR, C=RUNNING LENGTH
- @MFILE: PUSH B
- PUSH H ;;SAVES
- MLOOP: INR C ;;IN CASE C=0
- DCR C
- JZ GOOD ;;COMPLETE MATCH FOUND
- PUSH B
- PUSH H
- @MFSRX: CALL GET&FILEID ;;SET UP BY FILE MACRO
- POP H
- POP B
- CPI 1AH
- JZ EOFI ;;EOF DETECTED
- SUB M
- JNZ FAIL ;;CURRENT MATCH FAILED
- INX H ;;THIS CHAR MATCHES
- DCR C ;;REMAINING COUNT
- JMP MLOOP ;;CONTINUE MATCHING THIS STRING
- FAIL: POP H
- POP B
- JMP @MFILE ;;START MATCHING ALL OVER
- GOOD: XRA A
- POP H
- POP B
- RET
- EOFI: MVI A,0FFH
- ORA A
- POP H
- POP B
- RET
- ;;
- OVERSUB:
- MFILE MACRO ?INF,?STR,?LEN
- LOCAL LITSTR,ENDLIT
- LXI H,GET&?INF
- SHLD @MFSRX+1 ;;SET UP PROPER CALL
- IF NUL ?STR&?LEN
- CALL @MFILE
- ELSE
- IF NUL ?LEN ;;TEST FOR LITERAL
- MVI C,ENDLIT-LITSTR ;;LIT STR LENGTH
- LXI H,LITSTR ;;BASE OF LIT STR
- CALL @MFILE
- JMP ENDLIT
- LITSTR: DB ?STR
- ENDLIT:
- ELSE
- IF NOT NUL ?STR
- LXI H,?STR
- ENDIF
- MVI C,?LEN
- CALL @MFILE
- ENDIF
- ENDIF
- ENDM
- MFILE FILEID,STRING,LENGTH
- ENDM
- ;
- ;================================================================
- ;
- ; ***********************
- ; * A D D N A M * ADD TO NAME MACRO
- ; ***********************
- ;
- ; ADD TO NAME. INTO NAME POSITION 3-8 INSERTS FIELD REFERENCED
- ; BY POINTER FIELDAD, AND OF LENGTH LEN.
- ;
- ; REQUIRES MACRO.LIB
- ;
- ADDNAM MACRO FILEID,FIELDAD,LEN
- ;; CREATE COPY OF OLD FCB, 16 BYTES HIGHER
- MOVE FCB&FILEID,FCB&FILEID+16,16
- ;; INSERT FIELD INTO NEW FCB
- MOVE FIELDAD,FCB&FILEID+19,LEN
- ;; ERASE POSSIBLE OLD FILE
- LXI D,FCB&FILEID+16
- MVI C,19
- CALL 5
- ;; DO RENAME
- LXI D,FCB&FILEID
- MVI C,23
- CALL 5
- ENDM
- ;
- ;===============================================================
- ;
- ; ***********************
- ; * G E T S T R * GET STRING FROM SEQUENTIAL FILE
- ; ***********************
- ;
- ; GET STRING FROM SEQUENTIAL FILE NAMED FILEID, AND PUT IT
- ; IN RAM STARTING AT PTR. STRING IS OF LENGTH LENG
- ;
- ; SYNTAX: GETSTR FILEID,PTR,LENG
- ;
- GETSTR MACRO FILEID,PTR,LENG
- LOCAL OVER
- JMP OVER
- @GETSR: INR C
- DCR C ;;IN CASE C=0
- RZ ;;DONE
- PUSH H
- PUSH B
- @GTSRX: CALL GET&FILEID
- POP B
- POP H
- MOV M,A ;;STORE
- INX H
- DCR C
- JMP @GETSR
- OVER:
- GETSTR MACRO ?FID,?STR,?LEN
- LXI H,PUT&?FID
- SHLD @GTSRX+1 ;;SET UP PROPER CALL
- LXI H,?STR
- MVI C,?LEN
- CALL @GETSR
- ENDM
- GETSTR FILEID,PTR,LENG
- ENDM
- ;
- ;================================================================
- ;
- ; **********************
- ; * P U T S T R * PUT STRING TO SEQUENTIAL FILE
- ; **********************
- ;
- ; HL=POINTER TO STRING, C=STRING LENGTH
- ; SYNTAX:
- ;
- ; PUTSTR FILEID,'LITERAL STRING'
- ; PUTSTR FILEID,POINTER,LENGTH
- ; PUTSTR FILEID
- ;
- PUTSTR MACRO FILEID,PTR,LENG
- LOCAL OVER
- JMP OVER
- @PUTSR: INR C
- DCR C ;;IN CASE C=0
- RZ ;;DONE
- MOV A,M ;;DATUM
- PUSH H
- PUSH B
- @PTSRX: CALL PUT&FILEID
- POP B
- POP H
- INX H
- DCR C
- JMP @PUTSR
- OVER:
- PUTSTR MACRO ?FID,?STR,?LEN
- LOCAL LITSTR,ENDLIT
- LXI H,PUT&?FID
- SHLD @PTSRX+1 ;;SETUP PROPER CALL
- IF NUL ?STR&?LEN ;;EVERYTHING LOADED
- CALL @PUTSR
- ELSE
- IF NUL ?LEN ;;LITERAL
- MVI C,ENDLIT-LITSTR
- LXI H,LITSTR
- CALL @PUTSR
- JMP ENDLIT
- LITSTR: DB ?STR
- ENDLIT:
- ELSE
- IF NOT NUL ?STR
- LXI H,?STR
- ENDIF
- MVI C,?LEN
- CALL @PUTSR
- ENDIF
- ENDIF
- ENDM
- PUTSTR FILEID,PTR,LENG
- ENDM
- ;
- ;===============================================================
-