OpenCores
URL https://opencores.org/ocsvn/am9080_cpu_based_on_microcoded_am29xx_bit-slices/am9080_cpu_based_on_microcoded_am29xx_bit-slices/trunk

Subversion Repositories am9080_cpu_based_on_microcoded_am29xx_bit-slices

[/] [am9080_cpu_based_on_microcoded_am29xx_bit-slices/] [trunk/] [prog/] [boot.asm] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 zpekic
;--------------------------------------------------------------------------
2
; Simple test program for Sys9080 project https://github.com/zpekic/sys9080
3
;               (c) zpekic@hotmail.com - 2017, 2018
4
;--------------------------------------------------------------------------
5
ACIA0_STATUS    EQU 0x10; status read-only
6
ACIA0_DATA      EQU 0x11; data send/receive
7
ACIA1_STATUS    EQU 0x12; status read-only
8
ACIA1_DATA      EQU 0x13; data send/receive
9
PORT_0          EQU 0x00;
10
PORT_1          EQU 0x01;
11
MASK_VALID      EQU 0x01; fields in UART status register
12
MASK_READY      EQU 0x02;
13
MASK_ERROR      EQU 0x40;
14
MASK_INTREQ     EQU 0x80;
15
CR              EQU 0x0D; ASCII newline
16
LF              EQU 0x0A; ASCII line feed
17
MASK_BUTTON1    EQU 0x02;
18
Temp_PC         EQU 0xFF00; can't use DW because the hex file maps to ROM only
19
AltMon          EQU 0x0400; Altmon is org'd to this location
20
 
21
 
22
                ORG 0x0000      ;-----RST0 == RESET
23
                DI
24
                JMP Boot
25
 
26
                ORG 0x0008      ;-----RST1 (not used)
27
                DI
28
                JMP DumpState
29
 
30
                ORG 0x0010      ;-----RST2 (not used)
31
                DI
32
                JMP DumpState
33
 
34
                ORG 0x0018      ;-----RST3 (not used)
35
                DI
36
                JMP DumpState
37
 
38
                ORG 0x0020      ;-----RST4 (ACIA1)
39
                DI
40
                JMP OnByteReceived
41
 
42
                ORG 0x0028      ;-----RST5 (ACIA0)
43
                DI
44
                JMP OnByteReceived
45
 
46
                ORG 0x0030      ;-----RST6 (BTN1)
47
                EI              ;no interrupt servicing (used to control ACIA status)
48
                RET
49
 
50
                ORG 0x0038      ;-----RST7 (BTN0)
51
                DI
52
DumpState:      XTHL                    ;PC from stack is now in HL
53
                SHLD Temp_PC            ;store away (making this code non re-entrant)
54
                XTHL                    ;restore PC to stack
55
                PUSH H
56
                PUSH D
57
                PUSH B
58
                PUSH PSW
59
 
60
                PUSH H
61
                PUSH D
62
                PUSH B
63
                PUSH PSW
64
 
65
                LXI H, TextAF
66
                CALL TxStringAtHL
67
                XTHL
68
                CALL TxValueOfHL
69
                POP H
70
 
71
                LXI H, TextBC
72
                CALL TxStringAtHL
73
                XTHL
74
                CALL TxValueOfHL
75
                CALL BytesAtHL
76
                POP H
77
 
78
                LXI H, TextDE
79
                CALL TxStringAtHL
80
                XTHL
81
                CALL TxValueOfHL
82
                CALL BytesAtHL
83
                POP H
84
 
85
                LXI H, TextHL
86
                CALL TxStringAtHL
87
                XTHL
88
                CALL TxValueOfHL
89
                CALL BytesAtHL
90
                POP H
91
 
92
                LXI H, TextPC
93
                CALL TxStringAtHL
94
                LHLD Temp_PC
95
                CALL TxValueOfHL
96
                CALL BytesAtHL
97
 
98
                LXI H, TextSP
99
                CALL TxStringAtHL
100
                LXI D, 0xFFFF           ;start searching for stack position from top of memory down
101
                LHLD Temp_PC
102
                XCHG                    ;HL = 0xFFFF, DE = PC to search for
103
SearchForPC:    MOV A, D
104
                CMP M
105
                JNZ NotFound
106
                DCX H
107
                MOV A, E
108
                CMP M
109
                JNZ SearchForPC
110
                CALL TxValueOfHL
111
                CALL BytesAtHL
112
                MVI A, CR
113
                CALL SendChar
114
                JMP RestoreRegs
115
NotFound:       DCX H
116
                JMP SearchForPC
117
 
118
RestoreRegs:    POP PSW
119
                POP B
120
                POP D
121
                POP H
122
                EI
123
                RET
124
 
125
;-------------------------------------------
126
OnByteReceived: PUSH PSW
127
                IN PORT_1               ;hooked up to 4 push buttons
128
                ANI MASK_BUTTON1
129
                JZ ProcessByte
130
                PUSH H
131
                PUSH D
132
                PUSH B
133
 
134
                IN ACIA1_STATUS
135
                MOV H, A
136
                IN ACIA1_DATA
137
                MOV L, A
138
                PUSH H
139
 
140
                IN ACIA0_STATUS
141
                MOV H, A
142
                IN ACIA0_DATA
143
                MOV L, A
144
                PUSH H
145
 
146
                LXI H, TextACIA0
147
                CALL TxStringAtHL
148
                POP H
149
                CALL TxValueOfHL
150
 
151
                LXI H, TextACIA1
152
                CALL TxStringAtHL
153
                POP H
154
                CALL TxValueOfHL
155
 
156
                POP B
157
                POP D
158
                POP H
159
ProcessByte:    POP PSW
160
                EI
161
                RET
162
;-------------------------------------------
163
Boot:           LXI H, 0000H
164
                DCX H
165
                SPHL
166
                LXI H, TextGreet1
167
                CALL TxStringAtHL
168
                CALL GetLowestRam
169
                MOV A, L
170
                OUT PORT_0
171
                MOV A, H
172
                OUT PORT_1              ;display on LEDs
173
                CALL TxValueOfHL        ;display on console
174
                LXI H, TextPort
175
                CALL TxStringAtHL
176
                IN PORT_0
177
                MOV L, A
178
                IN PORT_1
179
                MOV H, A
180
                CALL TxValueOfHL
181
                LXI H, TextGreet2
182
                CALL TxStringAtHL
183
                CALL PrintAsciiSet
184
                EI
185
;               HLT                     ;interrupt is needed to go further
186
;-------------------------------------------------------------------------
187
                JMP AltMon              ;enter monitor program
188
;-------------------------------------------------------------------------
189
PrintAsciiSet:  LXI B, 0D20H            ;set C to ASCII space
190
SendNextChar:   MOV A, C
191
                CALL SendChar           ;send char
192
                CPI "~"                 ;end of printable chars reached?
193
                JZ NextLine
194
                INR C
195
                JMP SendNextChar
196
NextLine:       MOV A, B
197
                CALL SendChar           ;send char
198
                XRI 00000110B           ;cheap trick to convert newline to linefeed
199
                CALL SendChar           ;send char
200
                RET
201
 
202
TxStringAtHL:   MOV A, M
203
                ANA A
204
                RZ
205
                CALL SendChar
206
                INX H
207
                JP TxStringAtHL
208
 
209
BytesAtHL:      MVI C, 0x10             ;dump 16 bytes at (HL)
210
NextByteAtHL:   MVI A, " "
211
                CALL SendChar
212
                MOV A, M
213
                CALL TxValueOfA
214
                DCR C
215
                RZ                      ;return if reached 0
216
                INX H
217
                JMP NextByteAtHL
218
 
219
TxValueOfHL:    MOV A, H
220
                CALL TxValueOfA
221
                MOV A, L
222
TxValueOfA:     PUSH PSW
223
                RRC
224
                RRC
225
                RRC
226
                RRC
227
                ANI 0x0F
228
                CALL TxHexDig
229
                POP PSW
230
                ANI 0x0F
231
TxHexDig:       ADI '0'
232
                CPI '9' + 1
233
                JM TxHexDigOut
234
                ADI 0x07
235
TxHexDigOut:    CALL SendChar
236
                RET
237
 
238
SendChar:       PUSH PSW
239
CheckIfReady:   IN ACIA0_STATUS
240
                ANI MASK_READY
241
                JZ CheckIfReady
242
                POP PSW
243
                OUT ACIA0_DATA
244
                RET
245
 
246
GetLowestRam:   LXI H, 0xFFFF   ;assume RAM is located near top of address space
247
NextAddress:    MOV A, M
248
                CMP M
249
                JNZ LowestFound
250
                CMA             ;flip all bits
251
                MOV M, A
252
                CMP M
253
                JNZ LowestFound
254
                CMA
255
                MOV M, A
256
                MOV A, H
257
                ORA L
258
                RZ              ;Bail if HL = 0
259
                DCX H
260
                JMP NextAddress
261
LowestFound:    INX H
262
                RET
263
 
264
 
265
TextAF:         DB CR, "AF = ", 0x00
266
TextBC:         DB CR, "BC = ", 0x00
267
TextDE:         DB CR, "DE = ", 0x00
268
TextHL:         DB CR, "HL = ", 0x00
269
TextPC:         DB CR, "PC = ", 0x00
270
TextSP:         DB CR, "SP = ", 0x00
271
TextGreet1:     DB CR, CR, "** Sys9080 is ready. RAM starts at ", 0x00
272
TextPort        DB " Input port = ", 0x00
273
TextGreet2:     DB " **", CR, "  (Press BTN0 to show processor state, or BTN1 for ACIAs)", CR, 0x00
274
TextACIA0:      DB CR, "ACIA0 Rx status and data = ", 0x00
275
TextACIA1:      DB CR, "ACIA1 Rx status and data = ", 0x00
276
End:            DB 0x00         ;Cheap trick to see last used address

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.