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
/
SIMTEL
/
CPMUG
/
CPMUG025.ARK
/
MYMAC.LIB
< prev
next >
Wrap
Text File
|
1984-04-29
|
6KB
|
282 lines
; ==========================================
; : 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
;
;===============================================================