Assembly (UCR CS61)

It’s been a while since I’ve actually done anything with assembly code, but going through some old directories from UCR, I found some of my old assembly code. I feel like posting it to get something on the site, so here’s some of the assignments. It’s assembly for the artificial architecture called the “LC2″. If I recall correctly it was made by a professors (or a couple) at UCR and had an emulator and everything ready to rock! Last I heard they had moved on to the LC3 and who knows where they are now?! If this needs to be removed because of any similarity to current projects/classes being taught, please contact me and I will pull it down immediately!

Assignment 1

; Lab section -> 21

;R0 = Multiplicand
;R1 = Multiplier
;R2 = Counter (8)
;R3 = x8000 For MSB test
;R4 = temp holder for lots of things
;R5 = holds mask for shifting right
;R6 = holds mask for shifting right
;R7 = Holds shifted numbers in right-shift operation

.ORIG x3100
LD      R0, DATA_ADDR1  ;loads data addresses and initializes values
LD      R1, DATA_ADDR2
LDR     R0, R0, 0       ;loads data from DATA_ADDR1
LDR     R1, R1, 0       ;loads data from DATA_ADDR2

LD      R2, COUNTER

SHIFT:                  ;shifts the multiplicand left
BRz     DONE
ADD     R1, R1, R1
ADD     R2, R2, -1
BRp     SHIFT

DONE:                   ;re-initializes the counter variables
LD      R2, COUNTER

COMPARE:
BRz     EXIT

COMPARE_LSB:
AND     R4, R0, x0001
BRz     COMPARE_MSB
ADD     R0, R0, R1

COMPARE_MSB:            ;compares most significant bit
LD      R3, MSB
AND     R4, R0, R3
BRn     SHIFT_ONE       ;shifts a 1 in if msb=1
BRzp    SHIFT_ZERO      ;shifts a 0 in if msb=0

SHIFT_ONE:
LD      R3, SHFTCTR     ;puts 15 in ctr variable
AND     R7, R7, 0       ;clears R7 for holding result
AND     R6, R6, 0       ;clears R6 for holding mask
AND     R5, R5, 0       ;clears R5 for holding mask -1 bit
ADD     R6, R6, 2       ;puts 2 in the mask
ADD     R5, R5, 1       ;puts 1 in the mask-1

O:
AND     R4, R6, R0      ;checks mask
BRz     SKIP_O
ADD     R7, R7, R5      ;adds mask-1 true
SKIP_O:
ADD     R6, R6, R6      ;moves mask
ADD     R5, R5, R5      ;moves mask-1
ADD     R3, R3, -1      ;subtracts 1 from inner counter
BRp     O
ADD     R5, R5, R5      ;shifts mask last time
ADD     R7, R7, R5      ;adds the 1 from mask
AND     R0, R0, 0
ADD     R0, R0, R7
ADD     R2, R2, -1      ;subtracts 1 from outer counter
BR      COMPARE

SHIFT_ZERO:
LD      R3, SHFTCTR     ;puts 15 in ctr variable
AND     R7, R7, 0       ;clears R7 for holding result
AND     R6, R6, 0       ;clears R6 for holding mask
AND     R5, R5, 0       ;clears R5 for holding mask -1 bit
ADD     R6, R6, 2       ;puts 2 in the mask
ADD     R5, R5, 1       ;puts 1 in the mask-1

Z:
AND     R4, R6, R0      ;checks mask
BRz     SKIP_Z
ADD     R7, R7, R5      ;adds mask-1 true
SKIP_Z:
ADD     R6, R6, R6      ;moves mask
ADD     R5, R5, R5      ;moves mask-1
ADD     R3, R3, -1      ;subtracts 1 from inner counter
BRp     Z
AND     R0, R0, 0
ADD     R0, R0, R7
ADD     R2, R2, -1      ;subtracts 1 from outer counter
BR      COMPARE

EXIT:
LD      R5, RESULT_ADDR
STR     R0, R5, 0
HALT

COUNTER         .FILL x0008
NEG1            .FILL xFFFF
DATA_ADDR1      .FILL x4200
DATA_ADDR2      .FILL x4201
RESULT_ADDR     .FILL x4500
MSB             .FILL x8000
SHFTCTR         .FILL x000F

.END

Assignment 2

; Lab section -> 21

;R0 = First number
;R1 = Second number
;R2 = Subtraction (add R0 to negative of R1)
;R3 = x8000 held for checking top bit
;R4 = temp storage
;R5 =
;R6 = x8000 if R0 is negative, 0 otherwise
;R7 = x8000 if R1 is negative, 0 otherwise

.ORIG x3504
LD      R0, DATA_ADDR1  ;loads data addresses and initializes values
LD      R1, DATA_ADDR2
LDR     R0, R0, 0       ;loads data from DATA_ADDR1
LDR     R1, R1, 0       ;loads data from DATA_ADDR2

LD      R3, ISNEG

NOT     R1, R1          ;converts num in R1 to negative
ADD     R1, R1, x0001   ;for subtraction function

ADD     R2, R1, R0      ;adds values to R2
LD      R5, RESULT_ADDR ;gets result address
STR     R2, R5, 0       ;loads R2 to result address

NOT     R1, R1
ADD     R1, R1, x0001

AND     R4, R2, R3      ;  RESULT CHECK
BRn     NUU             ;x8000 if negative
BRzp    PUU

NUU:
AND     R4, R0, R3      ; FIRST NUM CHECK
BRn     NNU             ;x8000 if negative
BRzp    NPU

NNU:
AND     R4, R1, R3      ;SECOND NUM CHECK
BRn     NNN             ;x8000 if negative
BRzp    NNP

NPU:
AND     R4, R1, R3      ;SECOND NUM CHECK
BRn     NPN             ;x8000 if negative
BRzp    NPP

NNN:
AND     R4, R4, 0
LD      R5, VALID_ADDR  ;gets validity address
STR     R4, R5, 0       ;loads R4 to validity address
BR      EXIT

NNP:
;**N/A**
BR      EXIT

NPN:
AND     R4, R4, 0
ADD     R4, R4, 1
LD      R5, VALID_ADDR  ;gets validity address
STR     R4, R5, 0       ;loads R4 to validity address
BR      EXIT

NPP:
AND     R4, R4, 0
LD      R5, VALID_ADDR  ;gets validity address
STR     R4, R5, 0       ;loads R4 to validity address
BR      EXIT

PUU:
AND     R4, R0, R3
BRn     PNU
BRzp    PPU

PNU:
AND     R4, R1, R3
BRn     PNN
BRzp    PNP

PPU:
AND     R4, R1, R3
BRn     PPN
BRzp    PPP

PNN:
AND     R4, R4, 0
LD      R5, VALID_ADDR  ;gets validity address
STR     R4, R5, 0       ;loads R4 to validity address
BR      EXIT

PNP:
AND     R4, R4, 0
ADD     R4, R4, 1
LD      R5, VALID_ADDR  ;gets validity address
STR     R4, R5, 0       ;loads R4 to validity address
BR      EXIT

PPN:
;**N/A**
BR      EXIT

PPP:
AND     R4, R4, 0
LD      R5, VALID_ADDR  ;gets validity address
STR     R4, R5, 0       ;loads R4 to validity address
BR      EXIT

EXIT:
HALT

DATA_ADDR1      .FILL x3500
DATA_ADDR2      .FILL x3501
RESULT_ADDR     .FILL x3502
VALID_ADDR      .FILL x3503
ISNEG           .FILL x8000

.END

Assigment 4

; Lab section -> 21

.ORIG x3100

        AND R0, R0, 0
        AND R1, R1, 0
        AND R2, R2, 0
        AND R3, R3, 0
        AND R4, R4, 0
        AND R5, R5, 0
        AND R6, R6, 0
        AND R7, R7, 0

        LD R6, NEGNUM
        LD R0, RETURN

GETNUM1:
        GETC
        ADD R7, R0, R6
        ADD R7, R7, #3
        BRz NEGATIVE
        ADD R7, R0, R6
        ADD R7, R7, #5
        BRz POSITIVE
        ADD R7, R0, R6
        BRn GETNUM1
        BRz GETNUM2
        ADD R7, R7, #-10
        BRnz GETNUM2
        BRp GETNUM1
GETNUM2:
        ADD R1, R0, R6
        OUT
        GETC
        ADD R7, R0, R6
        BRn GETNUM2
        BRz GETNUM3
        ADD R7, R7, #-10
        BRnz GETNUM3
        BRp GETNUM2
GETNUM3:
        ADD R2, R0, R6
        OUT
        GETC
        ADD R7, R0, R6
        BRn GETNUM3
        BRz GETNUM4
        ADD R7, R7, #-10
        BRnz GETNUM4
        BRp GETNUM3
GETNUM4:
        ADD R3, R0, R6
        OUT
        GETC
        ADD R7, R0, R6
        BRn GETNUM4
        BRz DONE
        ADD R7, R7, #-10
        BRnz DONE
        BRp GETNUM4
POSITIVE:
        OUT
        AND R5, R5, 0
        BR GETNUM1
NEGATIVE:
        OUT
        AND R5, R5, 0
        ADD R5, R5, 1
        BR GETNUM1
DONE:
        ADD R4, R0, R6
        OUT
SKIP1:
        LEA R0, STABLE
        ADD R0, R0, R1
        LDR R1, R0, 0

        LEA R0, HTABLE
        ADD R0, R0, R2
        LDR R2, R0, 0

        LEA R0, QTABLE
        ADD R0, R0, R3
        LDR R3, R0, 0

        LEA R0, GTABLE
        ADD R0, R0, R4
        LDR R4, R0, 0

        AND R0, R0, 0
        ADD R0, R0, R1
        ADD R0, R0, R2
        ADD R0, R0, R3
        ADD R0, R0, R4

        AND R5, R5, 1
        BRnz SKIP
        NOT R0, R0
        ADD R0, R0, 1
SKIP:
        ADD R6, R0, 0
        LD R0, RETURN
        OUT

;       ADD R7, R6, 0

        LEA R1, MASKTABLE
        LD R4, COUNTER
        LD R5, NEG1
        LD R3, MAKENUM
LOOP:
        LDR R2, R1, 0
        AND R2, R6, R2
        BRnp ONE
ZERO:
        AND R0, R0, 0
        ADD R0, R0, R3
        OUT
        BR COUNT
ONE:
        AND R0, R0, 0
        ADD R0, R0, 1
        ADD R0, R0, R3
        OUT
COUNT:
        ADD R1, R1, 1
        ADD R4, R4, R5
        BRp LOOP

EXIT:
HALT

MAKENUM .FILL   #48
COUNTER .FILL   #16
NEG1    .FILL   xFFFF
RETURN  .FILL   $A
RETNEG  .FILL   $-A
NEGNUM  .FILL   #-48
STABLE  .FILL 0
        .FILL 1000
        .FILL 2000
        .FILL 3000
        .FILL 4000
        .FILL 5000
        .FILL 6000
        .FILL 7000
        .FILL 8000
        .FILL 9000
HTABLE  .FILL 0
        .FILL 100
        .FILL 200
        .FILL 300
        .FILL 400
        .FILL 500
        .FILL 600
        .FILL 700
        .FILL 800
        .FILL 900
QTABLE  .FILL 0
        .FILL 10
        .FILL 20
        .FILL 30
        .FILL 40
        .FILL 50
        .FILL 60
        .FILL 70
        .FILL 80
        .FILL 90
GTABLE  .FILL 0
        .FILL 1
        .FILL 2
        .FILL 3
        .FILL 4
        .FILL 5
        .FILL 6
        .FILL 7
        .FILL 8
        .FILL 9
MASKTABLE       .FILL $8000
                .FILL $4000
                .FILL $2000
                .FILL $1000
                .FILL $0800
                .FILL $0400
                .FILL $0200
                .FILL $0100
                .FILL $0080
                .FILL $0040
                .FILL $0020
                .FILL $0010
                .FILL $0008
                .FILL $0004
                .FILL $0002
                .FILL $0001
.END

Test

.ORIG x3100
LD      R1, DATA_ADDR
LDR     R1, R1, 0

LEA     R2, 1
LD      R6, NEG1
AND     R4, R4, 0
LD      R3, COUNTER

COMPARE:
BRz     EXIT
AND     R5, R1, R2
BRz     OVER
ADD     R4, R4, 1

OVER:
ADD     R2, R2, R2
ADD     R3, R3, R6
BRnzp   COMPARE

EXIT:
LD      R5, RESULT_ADDR
STR     R4, R5, 0
HALT

COUNTER         .FILL x10
NEG1            .FILL xFFFF
DATA_ADDR       .FILL x30FE
RESULT_ADDR     .FILL x30FF

.END


Bookmark and Share