Trailing-Edge
-
PDP-10 Archives
-
decuslib20-06
-
decus/20-153/move.mac
There are 10 other files named move.mac in the archive. Click here to see a list.
TITLE MOVE FOR LIBOL V10 AND RPGLIB V1
SUBTTL MOVE A STRING OF CHARACTERS 15-DEC-74 /ACK
;LIBOL VERSION
;COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
;RPGII VERSION COPYRIGHT BOB CURRIER, 1976
;REVISION HISTORY:
;V10 *****
; 15-DEC-74 /ACK CREATION.
; 26-JAN-75 /ACK REWRITTEN - BAD REGISTER ALLOCATION.
; (T1 AND CH WERE THE SAME REGISTER, WHICH
; SCREWED UP BLT'S.)
; 5/10/75 /DBT BIS CODE
;*****
SEARCH RPGPRM ;DEFINE PARAMETERS.
%%LBLP==:%%LBLP
DEBUG==:DEBUG
BIS==:BIS
EXTERN EASTB. ;FORCE EASTBL TO BE LOADED.
HISEG
COMMENT \
THIS ROUTINE MOVES A STRING OF CHARACTERS FROM ONE PLACE TO ANOTHER.
CALL:
MOVEI 16,PARAMETER ADDRESS
PUSHJ 17,MOVE.
PARAMETERS:
WORD 1:
BYTE POINTER TO THE INPUT STRING.
WORD 2:
BITS 0-5 BYTE POINTER RESIDUE FOR THE OUTPUT STRING.
BIT 6 IGNORED (1 IF THE FIELD IS EXPLICTLY SIGNED.)
BITS 7-17 SIZE OF THE FIELDS.
BITS 18-35 ADDRESS OF THE FIRST BYTE OF THE OUTPUT FIELD.
RETURNS:
CALL+1 ALWAYS.
REGISTERS USED:
JAC, CNT, CH, TAC2, TAC3, TAC4, IPTR, OPTR
\
ENTRY MOVE.
EXTERN SET2. ;ROUTINE TO PICK UP THE PARAMETERS.
EXTERN RET.1 ;RETURNS TO CALL+1.
EXTERN PTIBS. ;POINTER TO THE INPUT BYTE SIZE.
EXTERN PTOBS. ;POINTER OT THE OUTPUT BYTE SIZE.
T1==TAC2
T2==TAC2+1 ;ALSO KNOWN AS TAC3.
T3==TAC4
CNT==4 ; [172] ********** NOTE WELL **********
IFN BIS,<
;MAKE SURE THAT THE REGISTERS DON'T GET SCREWED UP.
CHKREG==0
IFN CNT-SRCCNT,<CHKREG==1>
IFE SRCPT-CNT,<CHKREG==1>
IFE SRCPT-OPTR,<CHKREG==1>
IFE DSTCNT-OPTR,<CHKREG==1>
IFN CHKREG,<
PRINTX ?MOVE IS BROKEN - BAD REGISTER ALLOCATION - CHECK LISTING.
CNT==4 ; [172] ********** NOTE WELL **********
SRCCNT==SRCCNT
SRCPT==SRCPT
DSTCNT==DSTCNT
OPTR==OPTR
>
>
MOVE.: JSP JAC, SET2. ;GO PICK UP THE PARAMETERS.
EXP RET.1 ;RETURN THROUGH HERE ON A NULL STRING.
MOVE CNT, 12 ; [172] GET CNT BACK FROM SET2.
LDB T3, PTIBS. ;GET THE INPUT BYTE SIZE.
DPB T3, PTOBS. ;MAKE IT THE OUTPUT BYTE SIZE.
CAIG CNT, ^D15 ;WORTH TRYING TO BLT?
JRST MOVE4 ;NO, GO MOVE CHAR'S.
HLRZ T1, IPTR
HLRZ T2, OPTR
CAIE T1, (T2) ;IS A BLT POSSIBLE?
JRST MOVE4 ;NO, GO MOVE CHAR'S.
;THE FOLLOWING LOOP SHOULD BE EXECUTED AT MOST FIVE TIMES.
TRZ T1, 770077 ;BYTE SIZE IN BITS 24-29.
MOVE1: LDB T2, [POINT 12,IPTR,11] ;NUMBER OF BITS LEFT.
CAIG T2, (T1) ;LESS THAN ONE BYTE LEFT?
JRST MOVE2 ;YES, GO MOVE UP TO NEXT WORD AND BLT.
CAIL T2, 4400 ;ARE WE AT A WORD BOUNDARY?
JRST MOVE3 ;YES, GO BLT.
ILDB CH, IPTR ;MOVE UP ONE BYTE.
IDPB CH, OPTR
SOJG CNT, MOVE1 ;LOOP.
IFE DEBUG,<
POPJ PP, ;THIS CAN'T HAPPEN! (BUT JUST IN
; CASE - NO HARM DONE.)
>
IFN DEBUG,<
OUTSTR [ASCIZ /
%MOVE FELL THROUGH WHILE LOOKING FOR A WORD BOUNDARY.
%AT MOVE1+6 IN MOVE.
/]
HALT RET.1
>
;MOVE UP TO THE NEXT WORD BECAUSE THERE IS LESS THAN 1 BYTE LEFT IN
; THIS ONE, THIS SHOULD ONLY HAPPEN FOR ASCII.
MOVE2: AOS IPTR
AOS OPTR
MOVEI CH, 44
DPB CH, [POINT 6,IPTR,5]
DPB CH, [POINT 6,OPTR,5]
;WE CAN BLT AT LEAST ONE WORD.
MOVE3: IDIV CNT, CHPRWD-6(T3) ;NUMBER OF WORDS TO TRANSFER (NOTE:
; NUMBER OF CHARACTERS LEFT IS IN
; CH).
HRRI T2, (OPTR) ;DESTINATION.
HRLI T2, (IPTR) ;SOURCE.
ADDI OPTR, (CNT) ;LAST WORD IN DESTINATION + 1.
BLT T2, -1(OPTR) ;FINALLY!!
JUMPE CH, RET.1 ;ANY MORE BYTES?
ADDI IPTR, (CNT) ;YES, UPDATE THE SOURCE POINTER.
MOVEI CNT, (CH) ;AND THE COUNT.
;COME HERE WHEN ALL ELSE FAILS.
MOVE4:
IFE BIS,<
ILDB CH, IPTR ;GET A CHAR.
IDPB CH, OPTR ;STASH IT.
SOJG CNT, MOVE4 ;LOOP IF THERE ARE MORE.
POPJ PP, ;OTHERWISE RETURN.
> ;END NON-BIS BYTE MOVE
IFN BIS,<
MOVE SRCPT,IPTR ;SET UP THE AC'S FOR THE
MOVE DSTCNT,CNT ; MOVSLJ.
MOVE DSTPT,OPTR
EXTEND CNT,[MOVSLJ,,0] ;DO THE MOVE.
JRST ERROR
POPJ PP, ;DONE
ERROR: OUTSTR [ASCIZ '?LIBOL MOVE ERROR
']
POPJ PP,
> ;END BIS
;TABLE OF CHARACTERS PER WORD:
CHPRWD: EXP 6
EXP 5
EXP 0
EXP 4
END