To the 2901 bit slicers out there
Jon Elson
elson at pico-systems.com
Thu Dec 28 11:18:08 CST 2017
> On 28.12.2017 05:35, Randy Dawson via cctalk wrote:
>> What about the coding tools? ADASM? Looks long gone, how
>> do you do microcode today?
>>
>
>
Oh, I first started out with an assembler macro hack, but it
was insanely cumbersome, due to the limits of the macro
capability of the Z-80 assembler I was using.
I then wrote a micro-assembler in Pascal. It was better,
but still pretty cumbersome. There's a good chance that if
I actually had gotten to writing the full 360 microcode I
would have come up with improvements.
Here's a little test program for the old asm macro-based
assembler:
;DIM LIGHT PROG FOR MICRO ASSEMBLER
MACLIB UASM
INIT
; DEFINE 2 CONSTANTS IN SCRATCH PAD
SPONE DEFCON 1
SP4096 DEFCON 4096
; END OF CONSTANTS
DIM REGS GPR0,GPR0,GPR0 ;CLEAR GPR0
FUNC ZERO
CTRL CONT
GEN
REGS ACONST,GPR1,GPR1 ;COPY SPONE TO GPR1
DEST PASSWRT
FUNC APLUSCY
CONST SPONE
CTRL CONT
GEN
REGS ACONST,GPR3,GPR3 ;COPY SP4096 TO GPR3
DEST PASSWRT
FUNC APLUSCY
CONST SP4096
CTRL CONT
GEN
BIGLP REGS GPR0,GPR0,GPR0 ;INC GPR0, MOVE TO
COUNTER
DEST PASSWRT
FUNC APLUSCY
CY ONE
CTRL LDRCONT
NA 0,I ;CBUS => CTR
GEN
HILOOP REGS GPR2,GPR2,GPR2 ;ALL ONES TO CBUS
DEST PASSWRT
FUNC ALLONE
CTRL REPLNA
NA HILOOP
The GEN command generates one micro-instruction word from
all the keywords above it.
Here's what my 2nd gen Pascal micro-assembler code looked like :
CODE
; TITLE muldiv
;This program does multiply and divide on 2903/2904 32 bit CPU
; UNSIGNED MULTIPLY 32 X 32 => 64
; CLEAR R0 FOR MS PRODUCT
; MULTIPLICAND IN R1, MULTIPLIER IN R2
; PRODUCT IN R0 (MS) AND R1 (LS)
ORG 0
UMULT R=GPR0,GPR0,GPR0,F=ZERO,D=W ;CLEAR GPR0
R=GPR2,GPR2,GPR2,D=LDQ&W,F=A+CY,Q=LDRCONT,N=31 ;mOVE
MPLIER TO Q REG
;#MPLY CYCLES -1 => CTR
UMLP R=GPR1,GPR0,GPR0,D=MPYUSG,F=SPEC,Q=REPLNA,N=UMLP
;***** SHFT USGMPY
R=GPR1,GPR1,GPR1,F=Q+CY,D=W ;COPY LS PROD IN Q TO R1
UWAIT D=PASS,F=ZERO,Q=JUMP,N=UWAIT ;hang for user
to check result
; END OF UNSIGNED MULTIPLY
;
;
; SIGNED MULTIPLY 32 X 32 => 64
; CLEAR R0 FOR MS PRODUCT
; MULTIPLICAND IN R1, MULTIPLIER IN R2
; PRODUCT IN R0 (MS) AND R1 (LS)
SMULT r=GPR0,GPR0,GPR0,F=ZERO,D=W ;CLEAR GPR0
r=GPR2,GPR2,GPR2,D=LDQ&W,F=A+CY,Q=LDRCONT,N=30 ;mOVE
MPLIER TO Q REG
;#MPLY CYCLES -2 => CTR
SMLP r=GPR1,GPR0,GPR0,D=MPY2CM,F=SPEC,Q=REPLNA,N=SMLP ;2S
COMPL MPY
;***** SHFT MPY2CM
r=GPR1,GPR0,GPR0,D=MPY2LST,F=SPEC ;2S COMPL MPY LAST
CYCLE
r=GPR1,GPR1,GPR1,F=Q+CY,D=W ;COPY LS PROD IN Q TO R1
SWAIT D=PASS,F=ZERO,Q=JUMP,N=SWAIT ;hang for user
to check result
; END OF UNSIGNED MULTIPLY
END
This tests the multiply functions on the 2903. The tab
formatting got messed up pasting this here,
it looked better in the original form.
Jon
More information about the cctalk
mailing list