Listing of file='BUFPRO.MAC;07' on disk='vmedia/asm_utility_4-sideA-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; BUFFER PROCESSING ROUTINES ; ; IN ALL CASES, THE FOLLOWING APPLY: ; ; VALUES ON ENTRY: ; A = ARGUMENT IF NEEDED ; DE => DESTINATION (WHERE REQD) ; HL => CURRENT POSITION IN BUFFER ; ; RETURNS: ; HL => MOVED AS REQUIRED ; ; DESTROYS: ; A REG. ; ; ;*** NOTE: THE BUFFER MUST BE TERMINATED BY A ZERO (NULL). ; ; ; SEE ALSO: INDEX, JMPTAB, UTIL ; ; EQUATES TAB EQU 9 SPACE EQU 32 ; ; COPY A BUFFER (OR PART OF ONE) ; CAN ALSO COMPRESS A BUFFER BY MOVING PART OF ; IT OVER ITSELF I.E. MOVE DOWN IN MEMORY. ; (OPPOSITE OF EXPAND) ; ; ON ENTRY, HL -> SOURCE AND DE -> DESTINATION ; ENTRY COPY,COMPRS COPY: COMPRS: MOV A,M ;GET CHR ORA A ;END OF STRING? JZ COPY10 ;YES STAX D ;NO, MOVE CHR INX H INX D JMP COPY COPY10: STAX D ;MARK EOS RET ; ; EXPANDS A BUFFER ; ALSO USED TO INSERT CHARACTERS IN A BUFFER. ; PADS WITH SPACES. ; (OPPOSITE OF COMPRS) ; ; ON ENTRY, B = NO. OF CHRS TO EXPAND (MUST BE >0) ; DESTROYS B ; EXTRN MOVEUP ENTRY EXPAND,INSERT EXPAND: INSERT: PUSH D ;SAVE DE PUSH B PUSH H MOV D,H MOV E,L CALL LENGTH ;FIND LENGTH OF STRING INR A ;ADD ONE FOR EOS MOV H,D MOV L,E MOV C,B ;ADD EXPANSION LENGTH MVI B,0 DAD B ;NEW POSITION XCHG MOV B,C ;BYTE COUNT CALL MOVEUP ;MOVE THE BLOCK POP H ;INSERT POINT POP B ;CHR COUNT MVI A,SPACE CALL FILL ;FILL IN WITH SPACES POP D ;RESTORE DE RET ; ; FILL MEMORY WITH A CHARACTER ; ; ON ENTRY, B = BYTE COUNT AND A = CHR ; DESTROYS B ; ENTRY FILL FILL: MOV M,A ;STORE CHR INX H DCR B ;CHECK BYTE COUNT JNZ FILL RET ; ; GET A WORD ; ; ON ENTRY, HL -> BUFFER AND DE -> DESTINATION ; RETURNS THE NEXT WORD IN DESTINATION BUFFER, ; A = LENGTH OF WORD AND <Z> SET ACCORDINGLY. ; NOTE: THE WORD MAY BE NULL. ; EXTRN WHTSPC ENTRY GETWRD GETWRD: PUSH B ;SAVE BC MVI B,0 ;SETUP CHR COUNT MOV A,M ;NEXT CHR ORA A ;END OF BUFFER? JZ GETW10 ;YES CALL WHTSPC ;WHITE SPACE? JC GETW10 ;YES STAX D ;MOVE CHR INX H ;BUMP POINTERS INX D INR B ; AND CHR COUNT JMP GETWRD ;REPEAT GETW10: XRA A ;MARK END OF STRING STAX D MOV A,B ;GET CHR COUNT ORA A POP B ;RESTORE BC RET ; ; COUNT THE NUMBER OF CHARACTERS LEFT IN THE BUFFER ; ; RETURNS A = LENGTH AND HL -> END OF BUFFER (NULL) ; EXTRN INDEX ENTRY LENGTH LENGTH: XRA A ;CHECKING FOR A NULL (ZERO) CALL INDEX ;GET LENGTH IN ACCUM RET ; ; SKIP OVER WHITE SPACE (SPACES AND TABS) ; EXTRN WHTSPC ENTRY SKPSPC SKPSPC: CALL WHTSPC ;WHITE SPACE? INX H JC SKPSPC ;NO DCX H ;YES, BUT GONE TOO FAR RET ; ; TRIM THE HEAD OF A STRING OF WHITE SPACE ; EXTRN CMPHD ENTRY TMHEAD TMHEAD: PUSH D ;SAVE DE MOV D,H ;MOVE HL TO DE MOV E,L CALL SKPSPC ;SKIP SPACES CALL CMPHD ;DID WE SKIP ANY? JZ TMH10 CALL COMPRS TMH10: POP D ;RESTORE DE RET ; ; TRIM THE TAIL OF A STRING OF WHITE SPACE ; ENTRY TMTAIL TMTAIL: PUSH B ;SAVE BC CALL LENGTH ;GET END OF STRING AND LENGTH DCX H ;POINT TO LAST CHR MOV B,A TMT10: CALL WHTSPC ;WHITE SPACE? DCX H JNC TMT20 ;NO DCR B ;YES, MORE STRING LEFT? JNZ TMT10 ;YES DCX H ;NO, FIX HL TMT20: INX H ;PUT NULL WHERE IT BELONGS INX H XRA A MOV M,A POP B ;RESTORE BC ; ; DETERMINE CHARACTER TYPE OF A STRING ; ; RETURNS TYPE IN A REG AS THE LOGICAL OR OF: ; 1 = ALPHA ; 2 = NUMERIC ; 4 = OTHER ; EXTRN TYPE ENTRY WRDTYP WRDTYP: PUSH B MVI B,0 WTYP10: CALL TYPE INX H JZ WTYP20 ORA B MOV B,A JMP WTYP10 WTYP20: MOV A,B POP B RET END