OSM$TRANSLATE_BYTES ident
         list      1,2,0
.
.FUNCTION          Execute the C180 TRANB instruction, but
.                  without the 256 byte field limitation
.
.        COPYRIGHT, 1986, BY CONTROL DATA SYSTEMS INC. 1992
.
.        This is a duplicate of MLPTRAN, copied on FEB. 10, 1986.
.
.        CONTROL DATA SYSTEMS INC PROPRIETARY PRODUCT
         title     c'OSP$TRANSLATE_BYTES'
         use       binding
.
         defg      ENTRY
ENTRY    alias     OSP$TRANSLATE_BYTES
         page
.
.        DOES CYBIL CONFORM TO THE SIS?
.          0 = no
.          1 = yes
.
SIS      set       1
.
.
.
.        PARAMETER LIST OFFSETS (BYTE)
.
.
         DO        SIS
.
SOURCE   SET       2                   . ^CELL
SLENGTH  SET       8                   . OST$STRING_LENGTH
TARGET   SET       18                  . ^CELL
TLENGTH  SET       24                  . OST$STRING_LENGTH
TABLE    SET       34                  . ^CELL
STATUS   SET       40                  . VAR OST$ERROR
.
         ELSE
.
SOURCE   SET       0                   . ^CELL
SLENGTH  SET       6                   . OST$STRING_LENGTH
TARGET   SET       10                  . ^CELL
TLENGTH  SET       16                  . OST$STRING_LENGTH
TABLE    SET       20                  . ^CELL
STATUS   SET       26                  . VAR OST$ERROR
.
         DEND
.
.
.
.        ERROR STATUS VALUES
.
NOERROR  equ       0                   . OSE$NO_ERROR
INVALID  equ       1                   . OSE$INVALID_BDP_DATA
LOSS     equ       2                   . OSE$LOSS_OF_SIGNIFICANCE
OVERFLOW equ       3                   . OSE$OVERFLOW
UNDRFLOW equ       4                   . OSE$UNDERFLOW
INDEF    equ       5                   . OSE$INDEFINITE
INFINITE equ       6                   . OSE$INFINITE
BADPARM  equ       7                   . OSE$BAD_PARAMETERS
NODIGITS equ       8                   . OSE$NO_DIGITS
.
         page
         use       code
.
ENTRY    align     0,8
.
.        LOAD PARAMETERS
.          A5 = SOURCE                 A6 = TARGET
.          A7 = TRANSLATION TABLE      A8 = STATUS
.          X2 = SOURCE_LENGTH          X3 = TARGET_LENGTH
.
         la        a5,a4,SOURCE
         la        a6,a4,TARGET
         la        a7,a4,TABLE
         la        a8,a4,STATUS
.
.
         DO        SIS
.
         lx        x2,a4,SLENGTH
         lx        x3,a4,TLENGTH
.
         ELSE
.
         lbyts,4   x2,a4,x0,SLENGTH
         lbyts,4   x3,a4,x0,TLENGTH
.
         DEND
.
.
.
.        WE MUST ALLOW FOR FIELDS BIGGER THAN 256, SO WE SET UP
.        A LOOP STRUCTURE FOR HANDLING LARGE FIELD LENGTHS
.
.         1) SET INITIAL PARAMETERS
.
         ente      x4,256              . max allowed length
.
.         2) FIX SOURCE LENGTH FOR HARDWARE
.
LOOP     brxge     x4,x2,LOOP1
         subx      x2,x4               .  x2 := x2 - 256
         cpyxx     x0,x4               . for hardware, length = 256
         brxeq     x0,x0,LOOP2
.
LOOP1    cpyxx     x0,x2               . use actual source_length
         entp      x2,0                . reset length to zero
.
.
.         3) FIX TARGET LENGTH FOR HARDWARE
.
LOOP2    brxge     x4,x3,LOOP3
         subx      x3,x4               . x3 := x3 - 256
         cpyxx     x1,x4
         brxeq     x0,x0,DOIT
.
LOOP3    cpyxx     x1,x3               . use actual target_length
         entp      x3,0                . reset length to 0
.
.         4) EXECUTE THE C180 TRANB INSTRUCTION
.
DOIT     tranb,a5,x0 a6,x1,a7,0 1,9,0,0 1,9,0,0
         addax     a5,x4               . adjust source pointer
         addax     a6,x4               . adjust target pointer
.
.         5) IF THE TARGET FIELD IS FILLED, WE CAN QUIT
.
         brxne     x3,x0,LOOP
.
.
.        SET STATUS = OSE$NO_ERROR
.
         entp      x1,noerror
         sbyts,1   x1,a8,x0,0
         return
.
         end
