*DECK LFGMOVW USETEXT LFGWKBS PROC LFGMOVW(AN,AA,BPOS,NWDS,IW60,CKSM,MEMIN); BEGIN #MOVWD# *IF DEF,IMS # ** LFGMOVW - MOVE WORDS. * * JJ MCAFEE 75/10/01 * M. E. VATCHER 81/02/23 * * LFGMOVW MOVES AND SHIFTS LOAD DATA FROM AN INPUT ARRAY TO * A SM ARRAY. * * PROC LFGMOVW(AN,AA,BPOS,NWDS,IW60,CKSM,MEMIN) * * ENTRY AN STARTING WORD OF SOURCE ARRAY * AA STARTING WORD OF DESTINATION ARRAY * BPOS STARTING BIT POSITION IN DESTINATION ARRAY * NWDS 16 BIT WORD COUNT * CKSM CHECKSUM * MEMIN INPUT BUFFER FWA * * EXIT IW60 60 BIT WORD COUNT * * METHOD * * LFGMOVW PACKS THE MEMORY IMAGE OR OVERLAY IMAGE RECORD INTO * THE WORKING STORAGE AREA *PDATA*. CHECKSUM IS STORED FIRST. * THE DATA IS TAKEN FROM SOURCE *INBUF* AND SENT TO DESTINATION * *PBUF*. THERE ARE TWO POSSIBLE CASES: 1)WHERE ALL THE DATA IS IN * ONE WORD, AND 2) WHERE DATA IS SPLIT BETWEEN THE WORDS. * LOOP FOR 105 16 BIT WORDS OR FEWER UNTIL PACKING COMPLETE. * # *ENDIF ITEM BPOS,NWDS,IW60,CKSM; ITEM AA; ITEM AN; ITEM I U; ITEM SINDX,DINDX,CKS,AWDS,SST,DST; ITEM SBC,DBC,SWD,SFCU,SWS; ARRAY MEMIN [0:0] S(1); BEGIN ITEM INBUF U; END FOR I = 0 STEP 1 UNTIL 35 DO BEGIN PBUF[I] = 0; END SINDX = AN; # SET START OF SOURCE ARRAY # DINDX = AA; # SET START OF DESTN ARRAY # IW60 = AA + 1; # NUMBER OF 60 BIT WORDS # AWDS = NWDS + 1; # NO. OF 16 BIT WORDS# SST = 0; # SOURCE BIT COUNT # DST = BPOS; # DESTINATION BIT COUNT# SBC = 16; DBC = 16; SWD = CKSM; GOTO LOOP2; #GO STORE CKSUM FIRST# LOOP1:IF SST LQ 44 THEN # SOURCE WORD ALL IN ONE # BEGIN SWD = BINBUF[SINDX]; SST = SST + 16; IF SST EQ 60 THEN BEGIN SST = 0; SINDX = SINDX + 1; END END ELSE # SOURCE WORD SPLIT OVER 2 # BEGIN SFCU = 60 - SST; # SET BFTS LEFT IN WORD 1 # SWS = 44; # HOLD WORD START POSITION# # HOLD WORD BFT COUNT # BSWD = BINBUF[SINDX]; SST = 0; # RESET START COUNT# SWS = SWS + SFCU; # ADJUST HOLD WORD START POS# SFCU = 16 - SFCU; # ADJUST NO. OF BITS LEFT # SINDX = SINDX + 1; # ADJUST SOURCE INDEX # BSWD = BINBUF[SINDX]; SST = SST + SFCU; # ADJUST START POSITION # END LOOP2:IF DST LQ 44 THEN # DEST. WORD ALL IN ONE WORD# BEGIN BPBUF[DINDX] = SWD; DST = DST + 16; # ADJUST DESIGN. START POS. # IF DST EQ 60 THEN BEGIN DST = 0; DINDX = DINDX + 1; IW60 = IW60 + 1; END END ELSE BEGIN SFCU = 60-DST; # SET BITS IN FIRST WORD# SWS = 44; # SET START OF HOLD WORD # BPBUF[DINDX] = BSWD; DINDX = DINDX + 1; # INC. DESTINATION INDEX # IW60 = IW60 + 1; # INC. 60 BIT WORD COUNT # SWS = SWS + SFCU; # ADJ. HOLD WORD START POS. # DST = 0; # ADJ. DEST. WORD START POS.# SFCU = 16 - SFCU; # ADJ. BIT COUNT # BPBUF[DINDX] = BSWD; DST = DST + SFCU; END AWDS = AWDS - 1; #DECREMENT 16 BIT WORD COUNT# IF AWDS GR 0 THEN GOTO LOOP1; RETURN; END TERM