/* CP/M UTILITY TO PRINT STRINGS OF PRINTABLE CHARACTERS IN FILES THIS PROGRAM WAS WRITTEN FOR THE INTEL PL/M-80 CROSS COMPILER 1.0 04/08/2007 UDO MUNK INITIAL VERSION */ 0100H: /* ORIGIN OF THIS PROGRAM FOR CP/M */ DECLARE /* CONSTANTS */ FALSE LITERALLY '0', TRUE LITERALLY '1', LEN LITERALLY '4', /* MIN LENGTH OF A STRING */ CR LITERALLY '13', /* CARRIAGE RETURN */ LF LITERALLY '10'; /* LINEFEED */ DECLARE /* BDOS FUNCTIONS */ BDOS$EXIT LITERALLY '0', /* EXIT PROGRAM */ BDOS$PRINT LITERALLY '2', /* PRINT CONSOLE CHARACTER */ BDOS$PRINTS LITERALLY '9', /* PRINT CONSOLE STRING */ BDOS$FOPEN LITERALLY '15', /* OPEN FILE */ BDOS$FREAD LITERALLY '20'; /* READ FILE */ /* JUST FOR THE FUN OF IT: A DIGITAL RESEARCH LIKE COPYRIGHT */ DECLARE COPYRIGHT DATA (' V1.0, COPYRIGHT (C) 2007, UDO MUNK '); DECLARE /* DEFAULT FILE CONTROL BLOCK */ FCB$A ADDRESS INITIAL(5CH), FCB BASED FCB$A (33) BYTE; DECLARE /* DEFAULT BUFFER */ BUFF$A ADDRESS INITIAL(80H), BUFF BASED BUFF$A (128) BYTE; DECLARE /* SOME MORE GLOBAL VARIABLES */ EOF$FLAG BYTE INITIAL(FALSE), J BYTE INITIAL(0), /* INDEX STRING BUFFER */ K BYTE, C BYTE, /* NEXT CHARACTER FROM FILE */ S (256) BYTE; /* STRING BUFFER */ /* CALL BDOS FUNCTIONS WITHOUT RETURN CODE */ BDOS1: PROCEDURE(FUNC,PARM); DECLARE FUNC BYTE; DECLARE PARM ADDRESS; DECLARE BDOS$JUMP LITERALLY '05H'; GO TO BDOS$JUMP; END BDOS1; /* CALL BDOS FUNCTIONS WITH BYTE RETURN CODE */ BDOS2: PROCEDURE(FUNC,PARM) BYTE; DECLARE FUNC BYTE; DECLARE PARM ADDRESS; DECLARE BDOS$JUMP LITERALLY '05H'; GO TO BDOS$JUMP; END BDOS2; /* PRINT A STRING TERMINATED WITH $ CHARACTER */ PRINTS: PROCEDURE(S); DECLARE S ADDRESS; CALL BDOS1(BDOS$PRINTS,S); END PRINTS; /* READ NEXT BYTE FROM FILE */ READ: PROCEDURE BYTE; DECLARE I BYTE INITIAL(128); DECLARE C BYTE; IF I > 127 THEN DO; I = 0; IF (BDOS2(BDOS$FREAD,FCB$A) <> 0) THEN DO; EOF$FLAG = TRUE; RETURN 0; END; END; C = BUFF(I); I = I + 1; RETURN C; END READ; /* OPEN FILE AND SCAN FOR STRINGS */ IF (BDOS2(BDOS$FOPEN,FCB$A) = 255) THEN CALL PRINTS(.('FILE NOT FOUND$')); ELSE DO; DO WHILE EOF$FLAG = FALSE; C = READ; IF C > 1FH AND C < 7FH THEN DO; S(J) = C; J = J + 1; END; ELSE DO; IF J >= LEN THEN DO; DO K = 0 TO J - 1; CALL BDOS1(BDOS$PRINT,S(K)); END; CALL BDOS1(BDOS$PRINT,CR); CALL BDOS1(BDOS$PRINT,LF); END; J = 0; END; END; END; CALL BDOS1(BDOS$EXIT,0); /* DONE, TERMINATE PROGRAM */ EOF