-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsubroutine.asm
More file actions
104 lines (99 loc) · 1.8 KB
/
subroutine.asm
File metadata and controls
104 lines (99 loc) · 1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
; ECS 154A subroutine.asm
; Loads a sinwave into the LED matrix and repeatedly starts over
MAIN: ; Entry point to program
; Setup the stack at 32512 (I/O starts at 32736), not necessary
LI x2, 32512
LI x3, STRING
JAL x1, PUTSTR
; Main loop
MAINLOOP:
; Call GETCHAR
JAL x1, GETCHAR
; Call PUTCHAR
JAL x1, PUTCHAR
; Branch always to loop
J MAINLOOP
; GETCHAR
; x1 - Return address
; x3 - Return character
GETCHAR:
; Push x7
ADDI x2, x2, -1
SW x7, 0(x2)
GETCHARLOOP:
; Loop until character
; Compare I flag
SF x7, x0
SRLI x7, x7, 6
; Jump back to loop
BEQ x7, x0, GETCHARLOOP
; Readchar
GETCHARREAD:
; Load keyboard address
LI x7, 0x7FF0
LW x3, 0(x7)
; Pop x7
LW x7, 0(x2)
ADDI x2, x2, 1
; Return
JR x1
; PUTCHAR
; x1 - Return address
; x3 - Holds char to put out
PUTCHAR:
; Push x7
ADDI x2, x2, -1
SW x7, 0(x2)
; Load screen address
LI x7, 0x7FF1
; Write char to screen
SW x3, 0(x7)
; Pop x2
LW x7, 0(x2)
ADDI x2, x2, 1
; Return
JR x1
; PUTSTR
; x1 - Return address
; x3 - Holds address of string
PUTSTR:
; Push x7
; Push x6
ADDI x2, x2, -2
SW x7, 1(x2)
SW x6, 0(x2)
; Load screen address
LI x7, 0x7FF1
PUTSTROUTCHAR:
; Load charater from string
LW x6, 0(x3)
; Check for null
BEQ x0, x6, PUTSTRDONE
; Write to screen
SW x6, 0(x7)
; Increment pointer
ADDI x3, x3, 1
; Loop
J PUTSTROUTCHAR
PUTSTRDONE:
; Pop x7
; Pop x6
LW x7, 1(x2)
LW x6, 0(x2)
ADDI x2, x2, 2
; Return
JR x1
STRING:
DAT 0x0048
DAT 0x0065
DAT 0x006C
DAT 0x006C
DAT 0x006F
DAT 0x0020
DAT 0x0057
DAT 0x006F
DAT 0x0072
DAT 0x006C
DAT 0x0064
DAT 0x000A
DAT 0x0000