[Next] [Up] [Previous]

Short Page Mode, Register Short Page Mode and Related Modes

This page deals with short page mode, and the substantially identical register short page mode, which allow vector and scratchpad operations to be combined with normal memory-reference instructions while retaining full seven-bit instruction opcodes, by shortening the displacement field in the instruction to twelve bits from sixteen, and also with four modes that allow additional features of the architecture to be accessed by going to six-bit opcodes as well.

Short Page Mode

Short page mode follows the IBM 360 by changing the size of the areas to which base registers point from 65,536 bytes to 4,096 bytes, thereby increasing the available opcode space so as to allow more of the computer's features to be available at one time. In this mode, memory-reference instructions have the following formats:

and the additional instructions have almost the same format as in normal mode, except that their address fields are also modified in the same fashion, which also creates room for a few additional instructions, the character, packed decimal, and related instructions:

and the other special instructions:

and the resulting opcodes are now:

140xxx x02xxx   LBSV   Load Byte Short Vector
140xxx x03xxx   STBSV  Store Byte Short Vector
140xxx x04xxx   ABSV   Add Byte Short Vector
140xxx x05xxx   SBSV   Subtract Byte Short Vector

140xxx x10xxx   NBSV   AND Byte Short Vector
140xxx x11xxx   OBSV   OR Byte Short Vector
140xxx x12xxx   XBSV   XOR Byte Short Vector
140xxx x13xxx   SWBSV  Swap Byte Short Vector

140xxx 0342xx   LSVM   Load Short Vector Multiple
140xxx 0343xx   STSVM  Store Short Vector Multiple

140xxx x15xxx   SMBPB  Set Mask Bit if Positive Byte
140xxx x16xxx   SMBZB  Set Mask Bit if Zero Byte
140xxx x17xxx   SMBNB  Set Mask Bit if Negative Byte

141xxx x02xxx   LHSV   Load Halfword Short Vector
141xxx x03xxx   STHSV  Store Halfword Short Vector
141xxx x04xxx   AHSV   Add Halfword Short Vector
141xxx x05xxx   SHSV   Subtract Halfword Short Vector
141xxx x06xxx   MHSV   Multiply Halfword Short Vector
141xxx x07xxx   DHSV   Divide Halfword Short Vector

141xxx x10xxx   NHSV   AND Halfword Short Vector
141xxx x11xxx   OHSV   OR Halfword Short Vector
141xxx x12xxx   XHSV   XOR Halfword Short Vector
141xxx x13xxx   SWHSV  Swap Halfword Short Vector

141xxx x15xxx   SMBPH  Set Mask Bit if Positive Halfword
141xxx x16xxx   SMBZH  Set Mask Bit if Zero Halfword
141xxx x17xxx   SMBNH  Set Mask Bit if Negative Halfword

142xxx x02xxx   LSV    Load Short Vector
142xxx x03xxx   STSV   Store Short Vector
142xxx x04xxx   ASV    Add Short Vector
142xxx x05xxx   SSV    Subtract Short Vector
142xxx x06xxx   MSV    Multiply Short Vector
142xxx x07xxx   DSV    Divide Short Vector

142xxx x10xxx   NSV    AND Short Vector
142xxx x11xxx   OSV    OR Short Vector
142xxx x12xxx   XSV    XOR Short Vector
142xxx x13xxx   SWSV   Swap Short Vector

142xxx x15xxx   SMBPB  Set Mask Bit if Positive
142xxx x16xxx   SMBZB  Set Mask Bit if Zero
142xxx x17xxx   SMBNB  Set Mask Bit if Negative

143xxx x02xxx   LLSV   Load Long Short Vector
143xxx x03xxx   STLSV  Store Long Short Vector
143xxx x04xxx   ALSV   Add Long Short Vector
143xxx x05xxx   SLSV   Subtract Long Short Vector
143xxx x06xxx   MLSV   Multiply Long Short Vector
143xxx x07xxx   DLSV   Divide Long Short Vector

143xxx x10xxx   NLSV   AND Long Short Vector
143xxx x11xxx   OLSV   OR Long Short Vector
143xxx x12xxx   XLSV   XOR Long Short Vector
143xxx x13xxx   SWLSV  Swap Long Short Vector

143xxx x15xxx   SMBPL  Set Mask Bit if Positive Long
143xxx x16xxx   SMBZL  Set Mask Bit if Zero Long
143xxx x17xxx   SMBNL  Set Mask Bit if Negative Long

145xxx x02xxx   LFSV   Load Floating Short Vector
145xxx x03xxx   STFSV  Store Floating Short Vector
145xxx x04xxx   AFSV   Add Floating Short Vector
145xxx x05xxx   SFSV   Subtract Floating Short Vector
145xxx x06xxx   MFSV   Multiply Floating Short Vector
145xxx x07xxx   DFSV   Divide Floating Short Vector

145xxx x15xxx   SMBPF  Set Mask Bit if Positive Floating
145xxx x16xxx   SMBZF  Set Mask Bit if Zero Floating
145xxx x17xxx   SMBNF  Set Mask Bit if Negative Floating

146xxx x02xxx   LDSV   Load Double Short Vector
146xxx x03xxx   STDSV  Store Double Short Vector
146xxx x04xxx   ADSV   Add Double Short Vector
146xxx x05xxx   SDSV   Subtract Double Short Vector
146xxx x06xxx   MDSV   Multiply Double Short Vector
146xxx x07xxx   DDSV   Divide Double Short Vector

146xxx x15xxx   SMBPD  Set Mask Bit if Positive Double
146xxx x16xxx   SMBZD  Set Mask Bit if Zero Double
146xxx x17xxx   SMBND  Set Mask Bit if Negative Double

147xxx x02xxx   LQSV   Load Quad Short Vector
147xxx x03xxx   STQSV  Store Quad Short Vector
147xxx x04xxx   AQSV   Add Quad Short Vector
147xxx x05xxx   SQSV   Subtract Quad Short Vector
147xxx x06xxx   MQSV   Multiply Quad Short Vector
147xxx x07xxx   DQSV   Divide Quad Short Vector

147xxx x15xxx   SMBPQ  Set Mask Bit if Positive Quad
147xxx x16xxx   SMBZQ  Set Mask Bit if Zero Quad
147xxx x17xxx   SMBNQ  Set Mask Bit if Negative Quad

140x4x 0000x0   MESTP  Multiply Extensibly and Store Packed
141x4x 0000x0   CP     Compare Packed
142x4x 0000x0   MVP    Move Packed
143x4x 0000x0   DSTRP  Divide and Store Remainder
144x4x 0000x0   AP     Add Packed
145x4x 0000x0   SP     Subtract Packed
146x4x 0000x0   MP     Multiply Packed
147x4x 0000x0   DP     Divide Packed

142x4x 0001x0   P      Pack
143x4x 0001x0   U      Unpack

141x4x 0400x0   CC     Compare Character
142x4x 0400x0   MVC    Move Character

14040x 04x1xx   CVPB   Convert Packed to Byte  
14042x 04x1xx   CVBP   Convert Byte to Packed
14044x 04x1xx   CVPH   Convert Packed to Halfword
14046x 04x1xx   CVHP   Convert Halfword to Packed
14050x 04x1xx   CVPW   Convert Packed to Word
14052x 04x1xx   CVWP   Convert Word to Packed
14054x 04x1xx   CVPL   Convert Packed to Long
14056x 04x1xx   CVLP   Convert Long to Packed
14060x 04x1xx   CVPM   Convert Packed to Medium
14062x 04x1xx   CVMP   Convert Medium to Packed
14064x 04x1xx   CVPF   Convert Packed to Floating
14066x 04x1xx   CVFP   Convert Floating to Packed
14070x 04x1xx   CVPD   Convert Packed to Double
14072x 04x1xx   CVDP   Convert Double to Packed
14074x 04x1xx   CVPQ   Convert Packed to Quad
14076x 04x1xx   CVQP   Convert Quad to Packed

1404xx 04x2x0   CV     Convert
1414xx 04x2x0   CVR    Convert Reversed

1434xx 04x2x0   CVRI   Convert Reversed Incomplete
1444xx 04x2x0   CVBF   Convert Bit Field

1404xx 04x3x0   DCV    Displaced Convert
1414xx 04x3x0   DCVR   Displaced Convert Reversed

1434xx 04x3x0   DCVRI  Displaced Convert Reversed Incomplete
1444xx 04x3x0   DCVBF  Displaced Convert Bit Field

140x4x 10x0x0   TBH    Translate Byte to Halfword
141x4x 10x0x0   TTHB   Table Translate Halfword to Byte
142x4x 10x0x0   T      Translate
143x4x 10x0x0   TH     Translate Halfword
144x4x 10x0x0   FMT    Format
145x4x 10x0x0   SC     Scan
146x4x 10x0x0   DET    Define Extended Translate
147x4x 10x0x0   EET    Execute Extended Translate

152xx0          LM     Load Multiple
153xx0          STM    Store Multiple
152xx1          LMQ    Load Multiple Quad
153xx1          STMQ   Store Multiple Quad

152xx4          LMBR   Load Multiple Base Registers
153xx4          STMBR  Store Multiple Base Registers
152xx5          LMSB   Load Multiple Scratchpad Base
153xx5          STMSB  Store Multiple Scratchpad Base
152xx6          LMPSB  Load Multiple Pointer Scratchpad Base
153xx6          STMPSB Store Multiple Pointer Scratchpad Base
152xx7          LMASB  Load Multiple Array Scratchpad Base
153xx7          STMASB Store Multiple Array Scratchpad Base

161xx0          JMS    Jump to Subroutine

1620xx          SLBR   Supplementary Load Base Register
1630xx          SSTBR  Supplementary Store Base Register
1625xx          SLSB   Supplementary Load Scratchpad Base
1635xx          SSSB   Supplementary Store Scratchpad Base
1626xx          SLPSB  Supplementary Load Pointer Scratchpad Base
1636xx          SSPSB  Supplementary Store Pointer Scratchpad Base
1627xx          SLASB  Supplementary Load Array Scratchpad Base
1637xx          SSASB  Supplementary Store Array Scratchpad Base

1661x6          JL     Jump if Low
1662x6          JE     Jump if Equal
1663x6          JLE    Jump if Low or Equal
1664x6          JH     Jump if High
1665x6          JNE    Jump if Not Equal
1666x6          JHE    Jump if High or Equal
1667x6          JNV    Jump if No Overflow

1670x6          JV     Jump if Overflow

1672x6          JC     Jump if Carry
1673x6          JNC    Jump if No Carry

1677x6          JMP    Jump

166xx7          JXH    Jump if Index High
167xx7          JXLE   Jump if Index Low or Equal

17000x          SHLB    Shift Left Byte
17001x          SHRB    Shift Right Byte

17003x          ASRB    Arithmetic Shift Right Byte
17004x          ROLB    Rotate Left Byte
17005x          RORB    Rotate Right Byte
17006x          RLCB    Rotate Left through Carry Byte
17007x          RRCB    Rotate Right through Carry Byte

17100x          SHLH    Shift Left Halfword
17101x          SHRH    Shift Right Halfword

17103x          ASRH    Arithmetic Shift Right Halfword
17104x          ROLH    Rotate Left Halfword
17105x          RORH    Rotate Right Halfword
17106x          RLCH    Rotate Left through Carry Halfword
17107x          RRCH    Rotate Right through Carry Halfword

17200x          SHL     Shift Left
17201x          SHR     Shift Right

17203x          ASR     Arithmetic Shift Right
17204x          ROL     Rotate Left
17205x          ROR     Rotate Right
17206x          RLC     Rotate Left through Carry
17207x          RRC     Rotate Right through Carry

17300x          SHLL    Shift Left Long
17301x          SHRL    Shift Right Long

17303x          ASRL    Arithmetic Shift Right Long
17304x          ROLL    Rotate Left Long
17305x          RORL    Rotate Right Long
17306x          RLCL    Rotate Left through Carry Long
17307x          RRCL    Rotate Right through Carry Long

The additional opcode space made available by moving the specification of the base register into the address portion of the instruction allows all the data types of normal mode to be used, in combination with vector instructions and stateless scratchpad instructions, although here the plain scratchpad instructions must also only have register 0 as their destination register. Also, an additional bit in each address is used to indicate indirect addressing; an indirect address points to a 32-bit address, not a 16-bit address constant in the same form as the address field of an instruction, so multiple-level indirection is not available.

Also, note that when indexing is present along with indirection, the result is pre-indexed indirect addressing, so a pointer is selected from a list rather than being treated as a pointer to an array. This doesn't apply to the scratchpad instructions, which still provide the more useful indirect post-indexed addressing mode.

Also, the supplementary memory-reference instructions, while they do not permit all the addressing modes provided with normal memory-reference instructions, now do permit indexed addressing in this mode.

Because the base register is now moved out of the opcode portion of the instruction, and is instead in the address portion, a register to register short vector instruction has to be indicated explicitly, rather than by indicating register zero as the base register.

Register Short Page Mode

As with register scratchpad mode versus stateless scratchpad mode, register short page mode has the same instruction formats as short page mode, but instead of using one of sixty-four operands in memory in an area indicated by one of the scratchpad registers, the scratchpad instructions instead reference one of the supplementary registers.

Short Page Short Shift Mode

This mode combines the use of short displacements, to make vector and scratchpad instructions available, with the use of opcode translation to make a short form of the shift instructions available. The memory-reference instructions in this mode, therefore, have the form:

and the short format shift instructions are as depicted previously:

Register Short Page Short Shift Mode

This mode uses the supplementary registers instead of memory areas pointed to by the scratchpad registers for the scratchpad instructions, and therefore requires the use of the scratchpad format of the operate instructions as well, to provide the opcode space these operations require, but is otherwise identical to Short Page Short Shift mode.

Stateful Short Page Condensed Mode

Instructions in this mode have the form:

Here, instead of the short form of the shift instructions, what is made available by moving to six-bit opcodes is the ability to place two instructions in a single 16-bit halfword as provided with conensed mode. Also, the scratchpad instructions available in this mode, instead of being like those of the stateless scratchpad mode, are similar to those of stateful scratchpad mode, except that even the instructions without indirection or indexing may have only register 0 as their destination, as is true for the scratchpad instructions similar to those of the stateless scratchpad mode included in the other modes on this page.

Note that this means that in this mode, both a 16-bit substitute for a memory-reference instruction, and a two-per-word substitute for a register-to-register operation, are available.

Mutable Short Page Condensed Mode, Plain Stateful Short Page Condensed Mode, and Plain Mutable Short Page Condensed Mode

As with stateful scratchpad mode, this mode also has mutable, plain stateful, and plain mutable versions. In the mutable versions, the types in use are changed by memory-reference instructions that specify a type; in the plain versions, instead of it being possible for a floating-point type and a fixed-point type to be active at once, the floating-point types have sixteen basic operations, the unnormalized floating-point operations being included.

Short Page Extended Operate Mode

This mode provides the extended operate instructions instead of the short form of the shift instructions, but is otherwise identical to Short Page Short Shift mode.

In this mode, the extended operate instructions have the form:

Register Short Page Extended Operate Mode

This mode uses the supplementary registers instead of memory areas pointed to by the scratchpad registers for the scratchpad instructions, and is otherwise identical to Short Page Extended Operate mode.

Short Page Full Opcode Mode

The format of memory reference instructions in this mode is:

Here, scratchpad instructions are not provided, and instead the additional opcode space provided through the use of short pages is used to allow an eight-bit opcode field.

This allows the additional types to be referenced even by indexed instructions, unlike the case for Full Opcode Mode, previously described, and the possible opcodes are the same as for that mode.

Short Page Short Shift Full Opcode Mode

This mode is identical to Short Page Full Opcode Mode, except that the vector operations are omitted, and their opcode space, that of the instructions beginning with the bits 10, is used instead for the short form of the shift instructions.

Short Page Compact Mode

In this mode, the memory-reference instructions have this format:

Here, the eight scratchpad registers are used to point to areas in memory 512 bytes in length, and 16-bit operations are available with the following opcodes:

10xxxx LPSP    Load Primary Scratchpad 
11xxxx STPSP   Store Primary Scratchpad
12xxxx LSSP    Load Secondary Scratchpad
13xxxx STSSP   Store Secondary Scratchpad

These instructions load to register 0, or store from register 0, of the appropriate type, operands whose length is determined by the current primary or secondary scratchpad type, as set by the SETPT and SETST instructions. As there is no overlap between opcodes for the primary and secondary type, the two types are fully independent in this mode.

This mode allows memory-reference instructions that match the register-to-register operations in length by limiting them to one destination register, two possible types, and by limiting them to loads and stores without indexing; this last limitation follows the model adopted for RISC computing, but the mode also includes conventional memory-reference instructions which are longer than 16 bits in length.

As well, since scratchpad register 0 is not used as a base register in this mode, additional opcode space is available for alternate memory-reference instructions. Indexed versions of these instructions are not offered; the register-to-register versions operate on all eight of the scratchpad, pointer scratchpad, or array scratchpad registers as their destination registers, and can have arithmetic/index registers 1, 2, or 3 as their source registers. The opcodes of these instructions are as follows, and they are shorter forms of some of the instructions which are prefixed by 173701:

0x000x  SWBR   Swap Base Register
0x001x  CBR    Compare Base Register
0x002x  LBR    Load Base Register
0x003x  STBR   Store Base Register
0x004x  ABR    Add Base Register
0x005x  SBR    Subtract Base Register

0x012x  LBRA   Load Base Register with Address
0x013x  XBR    XOR Base Register
0x014x  NBR    AND Base Register
0x015x  OBR    OR Base Register

0x020x  SWSB   Swap Scratchpad Base
0x021x  CSB    Compare Scratchpad Base
0x022x  LSB    Load Scratchpad Base
0x023x  STSB   Store Scratchpad Base
0x024x  ASB    Add Scratchpad Base
0x025x  SSB    Subtract Scratchpad Base

0x032x  LSBA   Load Scratchpad Base with Address
0x033x  XSB    XOR Scratchpad Base
0x034x  NSB    AND Scratchpad Base
0x035x  OSB    OR Scratchpad Base

0x040x  SWPSB  Swap Pointer Scratchpad Base
0x041x  CPSB   Compare Pointer Scratchpad Base
0x042x  LPSB   Load Pointer Scratchpad Base
0x043x  STPSB  Store Pointer Scratchpad Base
0x044x  APSB   Add Pointer Scratchpad Base
0x045x  SPSB   Subtract Pointer Scratchpad Base

0x052x  LPSBA  Load Pointer Scratchpad Base with Address
0x053x  XPSB   XOR Pointer Scratchpad Base
0x054x  NPSB   AND Pointer Scratchpad Base
0x055x  OPSB   OR Pointer Scratchpad Base

0x060x  SWASB  Swap Array Scratchpad Base
0x061x  CASB   Compare Array Scratchpad Base
0x062x  LASB   Load Array Scratchpad Base
0x063x  STASB  Store Array Scratchpad Base
0x064x  AASB   Add Array Scratchpad Base
0x065x  SASB   Subtract Array Scratchpad Base

0x072x  LASBA  Load Array Scratchpad Base with Address
0x073x  XASB   XOR Array Scratchpad Base
0x074x  NASB   AND Array Scratchpad Base
0x075x  OASB   OR Array Scratchpad Base

Also note that while, in this mode, types such as register packed decimal, decimal exponent floating-point, and simple floating cannot be selected as either the primary or secondary type for the load-store instructions, since full opcode memory reference instructions are available in addition to the full opcode register-to-register instructions, these types are still fully usable.

Short Page Compact Condensed Mode

In this mode, the memory reference instructions have this form:

Here, six-bit opcode translation is used with the full memory-reference instructions, and they are restricted to using arithmetic/index registers 1, 2, and 3 as index registers. Only one type is used with the condensed instructions and the load/store instructions, selected in the same manner as for the plain scratchpad modes. Also, the load/store instructions can only use base registers 1, 2, and 3.

This allows normal register-to-register and memory reference instructions, in addition to both instructions that place a pair of register-to-register operations on the selected type, and with register zero as their destination operand (note that the register to register store operation is meaningful in this case), in a single 16-bit halfword, and load/store instructions that use the same 4,096-byte areas in memory, and three of the same base registers, as the regular short page memory-reference instructions, which also take up only a single 16-bit halfword.

As with the load/store instructions in short page compact mode, the destination register of these instructions is always register zero of the appropriate type, and their opcodes are:

00xxxx  LSP  Load Scratchpad
01xxxx  STSP Store Scratchpad

Also allowed is a modified form of short shift instruction; unlike the regular shift instruction, which is still available as an operate instruction, and the short shift instruction in the short shift modes, these instructions can act only on register 0, and they have the operands:

010xx4   RZSHLB    Register Zero Shift Left Byte
011xx4   RZSHRB    Register Zero Shift Right Byte

013xx4   RZASRB    Register Zero Arithmetic Shift Right Byte
014xx4   RZROLB    Register Zero Rotate Left Byte
015xx4   RZRORB    Register Zero Rotate Right Byte
016xx4   RZRLCB    Register Zero Rotate Left through Carry Byte
017xx4   RZRRCB    Register Zero Rotate Right through Carry Byte

010xx5   RZSHLH    Register Zero Shift Left Halfword
011xx5   RZSHRH    Register Zero Shift Right Halfword

013xx5   RZASRH    Register Zero Arithmetic Shift Right Halfword
014xx5   RZROLH    Register Zero Rotate Left Halfword
015xx5   RZRORH    Register Zero Rotate Right Halfword
016xx5   RZRLCH    Register Zero Rotate Left through Carry Halfword
017xx5   RZRRCH    Register Zero Rotate Right through Carry Halfword

010xx6   RZSHL     Register Zero Shift Left
011xx6   RZSHR     Register Zero Shift Right

013xx6   RZASR     Register Zero Arithmetic Shift Right
014xx6   RZROL     Register Zero Rotate Left
015xx6   RZROR     Register Zero Rotate Right
016xx6   RZRLC     Register Zero Rotate Left through Carry
017xx6   RZRRC     Register Zero Rotate Right through Carry

010xx7   RZSHLL    Register Zero Shift Left Long
011xxx   RZSHRL    Register Zero Shift Right Long

013xx7   RZASRL    Register Zero Arithmetic Shift Right Long
014xx7   RZROLL    Register Zero Rotate Left Long
015xx7   RZRORL    Register Zero Rotate Right Long
016xx7   RZRLCL    Register Zero Rotate Left through Carry Long
017xx7   RZRRCL    Register Zero Rotate Right through Carry Long

Finally, there is also a 16-bit address calculation instruction,

012xx4   CA        Calculate Address
which takes the value in one of the eight base registers, adds to it the value in one of the eight arithmetic/index registers, and stores the result in one of the first four base registers. Although this duplicates the function of indexed addressing to some extent, it allows multiple references to the same array element to be made without adding the index again.

The Selective Short Page Modes

In these modes, the form of a 16-bit address field is modified. Instead of consisting of an indirect bit, followed by a three-bit base register specification, and then a 12-bit displacement, the first bit functions in a manner similar to that of the selector bit used in the Philco 2000 computers, at least according to one account. If the first bit is a zero, a 15-bit displacement follows it, to which is added the contents of base/address register zero; if the first bit is a one, then the next three bits indicate a base/address register, and are followed by a 12-bit displacement. Thus, while base/address registers 1 through 7 still point to 4,096-byte pages, base/address register 0 points to a 32,768-byte page.

In the case of Philco 2000 computer, the field that could be present or not indicated an index register; since indexing shortened the displacement field, however, an index register had to take on the duty of a base register as well, even though this was only needed when indexing was desired.

The Extended Short Page Modes

Many of the short page modes make use of all the scratchpad registers. But those that do not, or compact mode, which only uses the first set of scratchpad registers, can be modified in another way to permit the use of larger pages.

In these modes, if the first bit of an address halfword is set, the three-bit base register field refers to one of the array scrachpad registers, and the length of the address field is increased by 16 bits, to permit a 28-bit displacement to be used. The effect of this is similar to that of the 28/32-bit displacement bit in the Program Status Block, but here two different sizes of page are available in the same program, with a different set of registers pointing to pages of the appropriate size.


[Next] [Up] [Previous]