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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
|
0.ope ("12")##limit (15.5)#
#right#20.01.88
#center##ub#Beschreibung der Single-Chip-uP 8031/5/9/40/8/9/50#ue#
1.) Pinning MCS-48, UPI-41, UPI-42
+----__----+
T0 | 1 40 | Vcc +5V
Xtal1 | 2 39 | T1 (In)
Xtal2 | 3 38 | P27 -DACK =8x41/2
-Reset (In) | 4 37 | P26 DRQ =8x41/2
-SS (In) | 5 36 | P25 -IBF =8x41/2
-Int (In) | 6 35 | P24 -OBF =8x41/2
EA (In) | 7 34 | P17
-RD (Out) | 8 33 | P16
8x41/2=A0 -PSEN (Out) | 9 32 | P15
-WR (Out) | 10 31 | P14
8x41/2=SYNC ALE (Out) | 11 30 | P13
D0 | 12 29 | P12
D1 | 13 28 | P11
D2 | 14 27 | P10
D3 | 15 26 | Vdd/Vpp +5V/+21V bzw. 25V
D4 | 16 25 | PROG (O=8243 ioExpander,I=pulse)
D5 | 17 24 | P23
D6 | 18 23 | P22
D7 | 19 22 | P21
GND | 20 21 | P20
+----------+
-SS : Single Step (zusammen mit ALE-Output)
-RESET: 10uF Kondensator nach GND
-INT : muss mind. 3 Zyklen lang low sein
PROG : Programmierpuls (+18V, +23V) bzw.
bzw. Output fuer 8243 I/O Expander
SYNC : Output Clock wie ALE
A0 : Input from Host: 0 = Datatransfer, 1 = Commandtransfer (kann in F1
gelesen werden)
-IBF : Input buffer full
OBF : Outputbuffer full
-DACK : DMA Acknowledge
DRQ : DMA request
- Pinning MCS-51
+----__----+
8x32/52=T2 P10 | 1 40 | Vcc +5V
8x32/52=T2EX P11 | 2 39 | P00/AD0
P12 | 3 38 | P01/AD1
P13 | 4 37 | P02/AD2
P14 | 5 36 | P03/AD3
P15 | 6 35 | P04/AD4
P16 | 7 34 | P05/AD5
P17 | 8 33 | P06/AD6
Reset/Vpd | 9 32 | P07/AD7
P30/RXD | 10 31 | -EA
P31/TXD | 11 30 | ALE
P32/-INT0 | 12 29 | -PSEN
P33/-INT1 | 13 28 | P27/A15
P34/T0 | 14 27 | P26/A14
P35/T1 | 15 26 | P25/A13
P36/-WR | 16 25 | P24/A12
P37/-RD | 17 24 | P23/A11
Xtal2 | 18 23 | P22/A10
Xtal1 | 19 22 | P21/A9
GND | 20 21 | P20/A8
+----------+
T2 = Timer 2 counter trigger input
T2EX = Timer 2 external input clock
-Vdd : +5V im Betrieb,
0V fuer Low Power Standby
+21V/+25V fuer Programmierspannung
-T0 : Test Input 0 bzw.
Clock-Output des Timers falls ENT0 CLK Befehl gegeben wurde.
-T1 : Test Input 1 bzw.
Counter/Timer Input if STRT CNT Befehl gegeben wurde
XTAL1 : Quartz, bzw. CLock Input
XTAL2 : Quartz
ALE : Adresse Latch enable output (einmal pro Zyklus aktiviert, d.h.
als Clockoutput zu gebrauchen)
Negative Flanke uebernimmt Adressen auf dem Bus in ext. Latch
-RD : Output-Strobe to read Data from the BUS into the CPU
-WR : Output-Strobe indicating a write into external Memory
-PSEN : Low if a fetch to external memory occurs (ROM -CE)
P10..P17 : I/O Port 1 quasi-bidirektional
P20..P27 : I/O Port 2 "
P20..P23 dienen als A8..A11 bei Programstore fetches bzw.
mit PROG & 8243 als 4Bit I/O Expander Adresse
EA : External Access input, If high, all internal Programm Memory
fetches reference external memory (debugging mode)
D0..D7 : Datenbus, I/O zus. mit -RD, -WR, ALE
Enthaelt A0..A7 zusammen mit PSEN fuer ext. Prog.mem.References
" A0..A7 " mit ALE, -RD, -WR fuer ext.RAM-References
2.) Vergleich der Single-Chip-CPUs
UPI-41 : 8041, 8641, 8741
UPI-42 : 8042, 8742
MCS-48 Serie: 8035, 8039, 8040, 8048, 8049, 8050, 8748, 8749, (8243)
MCS-51 Serie: 8031, 8032, 8044, 8344, 8744, 8051, 8052
E = EPROM - Version
R = (Mask)-ROM Version
- = Kein ROM
X = External PROM
Buf=Buffered Port, Buffer-Full über Pins rausgeführt.
CPU | RAM | ROM |E|Ports|Serial |Timer |INTs| Sonstiges
------+-----+-----+-+-----+-------+------+----+--------------------------
8031 | 64 | - |-| 4(3)|1 Async| 2x16 | 2 | 128k ext.mem., boolean-cpu
8032 | 256 | - |-| 4(3)|1 Async| 3x16 | 2 | 128k ext.mem., boolean-cpu
8035 | 64 | - |-| 2 | - | 1x 8 | 1 | Timer/Counter
8039 | 128 | - |-| 2 | - | 1x 8 | 1 | "
8040 | 256 | - |-| 2 | - | 1x 8 | 1 | "
8041 | 64 | 1k |R|2xBuf| DMA | 1x 8 | - | 4 I/O Bits gempxt.
8042 | 128 | 2k |R|2xBuf| DMA | 1x 8 | - | 4 I/O Bits gempxt.
8044 | 192 | 4k |R| 4(3)|H/SDLC | 2x16 | 2 | 128k ext.,b-cpu,375kbaud-pll
8048 | 64 | 1k |R| 2 | - | 1x 8 | 1 | Timer/Counter
8049 | 128 | 2k |R| 2 | - | 1x 8 | 1 | "
8050 | 256 | 4k |R| 2 | - | 1x 8 | 1 | "
8051 | 128 | 4k |R| 4(3)|1 Async| 2x16 | 2 | 128k ext., boolean-cpu
8052 | 256 | 8k |R| 4(3)|1 Async| 3x16 | 2 | 128k ext., boolean-cpu
8243 | - | - |-|4x4B | - | - | - | I/O Expander f.MCS-48 Serie
8344 | 192 | 4k |X| 4(3)|H/SDLC | 2x16 | 2 | 128k ext.,b-cpu,375kbaud-pll
8741 | 64 | 1k |E|2xBuf| DMA | 1x 8 | - | 4 I/O Bits gempxt.
8742 | 128 | 2k |E|2xBuf| DMA | 1x 8 | - | 4 I/O Bits gempxt.
8744 ! 192 | 4k |E| 4(3)|H/SDLC | 2x16 | 2 | 128k ext.,b-cpu,375kbaud-pll
8748 | 64 | 1k |E| 2 | - | 1x 8 | 1 | Timer/Counter
8749 | 128 | 2k |E| 2 | - | 1x 8 | 1 | "
8751 | 128 | 4k |E| 4(3)|1 Async| 2x16 | 2 | 128k ext., boolean-cpu
8752 | 256 | 4k |E| 4(3)|1 Async| 3x16 | 2 | 128k ext., boolean-cpu
- Programmieren des 8748:
1.) Vdd = 5V, XTAL angeschlossen, -RESET = 0V, T0=5V, EA=5V
2.) 8748 in Sockel setzen
3.) T0=0V (* Program Mode select *)
4.) EA=23V (* Program Mode activate *)
5.) BUS (0..7) und P2.0..P2.3 (8..B) mit Adresse belegen
6.) -RESET=5V (* Latch Adress *)
7.) BUS := Databyte
8.) Vdd=25V (* Programmierspannung *)
9.) PROG=0V, dann 50ms PROG=23V (* Programmieren *)
10.) Vdd=5V (* Programmierspannung weg *)
11.) T0=5V (* Verify mode *)
12.) Read Data on BUS and compare (* Verify *)
13.) T0=0V (* Select Program Mode *)
14.) -RESET=0V, GOTO Step 5 (* Floating BUS *)
15.) Vdd=5V, -RESET=0V, EA=5V, 8748 aus Sockel nehmen
3.) Memory-Map des 8039
RAM
Adresse Funktion
00..07 Registerbank 0 (r0..r7)
08..17 Stack (8 Ebenen)
18..1F Registerbank 1 (r0..r7)
20..7F Frei belegbar
ROM
Adresse
000..0FF ROM-Page 0, Bank 0 (Bank 0 ist mb0)
...
700..7FF ROM-Page 7, Bank 0
800..8FF ROM Page 0, Bank 1 (Adressen 800..FFF treten im Code nur
... als 000..7FF auf!)
F00..FFF ROM Page 7, Bank 1 (Bank 1 ist mb1)
Bei Reset erfolgt ein Sprung nach 000
Bei (Timer-)Interrupt erfolgt ein Sprung nach 007
Register
Bezeichn. Name
a Akkumulator (8 Bit)
r0..r7 Register 0 bis 7 (Im internen RAM) (je 8 Bit)
t Timer (8 Bit)
p1 Port 1 (8 Bit)
p2 Port 2 (8 Bit)
Bits
i Interrupt-Leitung INT (1 Bit)
t0 Test-Eingang T0 (1 Bit)
t1 Test-Eingang T1 (91 Bit)
f0 Internes Flag 0
f1 Internes Flag 1
Jump-Conditions
jtf Jump if Timer finished (Nulldurchgang)
jntf Jump if Timer not finished (zählt noch)
jb0..jb7 Jump if Bit 0..7 in a is set
jt0 Jump if T0-Input is high
jnt0 Jump if T0-Input is low
jt1 Jump if T1-Input is high
jnt1 Jump if T1-Input is low
jf0 Jump if Flag 0 is set
jnf0 Jump if Flag 0 is cleared
jf1 Jump if Flag 1 is set
jnf1 Jump if Flag 1 is cleared
jz Jump if a is zero
jnz Jump if a is not zero
jc Jump if carry is set
jnc Jump if carry is cleared
jni Jump if Interrupt-Pin INT is low
4.) Befehlssatz nach Opcode sortiert
Symbolik (Beispiele)
@r0 Inhalt der Speicherstelle, deren Adresse in Register 0 steht.
#xx Die (Byte-)Konstante xx
2xx Die Adressen 200..2FF (je nach xx), xx ist ein Offset zur Seite 2.
mb1 ROM-Bank 1 ('800..FFF')
00 nop
01
02
03 xx add a,#xx
04 xx jmp 0xx
05
06 xx jntf xx
07 dec a
08
09 in a,p1
0A in a,p2
0B
0C
0D
0E
0F
10 inc @r0 Memoryvalue incrementieren
11 inc @r1
12 xx jb0 xx Jump if Bit 0 in a is high
13
14 xx call 0xx
15 dis i Disable Interrupts
16 xx jtf xx
17 inc a
18 inc r0
19 inc r1
1A inc r2
1B inc r3
1C inc r4
1D inc r5
1E inc r6
1F inc r7
20 xch a,@r0 a und Memoryinhalt bei @r0 austauschen
21 xch a,@r1
22
23 xx mov a,#xx a mit Konstante laden
24 xx jmp 1xx
25 en tcnti Enable Timer/Counter Interrupt
26 xx jnt0 xx
27 clr a a := 0
28 xch a,r0 a und Register vertauschen
29 xch a,r1
2A xch a,r2
2B xch a,r3
2C xch a,r4
2D xch a,r5
2E xch a,r6
2F xch a,r7
30
31
32 xx jb1 xx
33
34 xx call 1xx
35 dis tcnti Disable Timer/Counter Interrupt
36 xx jt0 xx
37 cpl a a := NOT a
38
39
3A
3B
3C
3D
3E
3F
40 orl a,@r0
41 orl a,@r1
42 mov a,t Timervalue lesen nach a
43 xx orl a,#xx Logisches Oder
44 xx jmp 2xx
45 strt cnt Counter starten, Timer aus
46 xx jnt1 xx
47
48 orl a,r0
49 orl a,r1
4A orl a,r2
4B orl a,r3
4C orl a,r4
4D orl a,r5
4E orl a,r6
4F orl a,r7
50 anl a,@r0
51 anl a,@r1
52 xx jb2 xx
53 xx anl a,#xx Logisches Und
54 xx call 2xx
55 strt t Timer starten, Counter aus
56 xx jt1 xx
57
58 anl a,r0
59 anl a,r1
5A anl a,r2
5B anl a,r3
5C anl a,r4
5D anl a,r5
5E anl a,r6
5F anl a,r7
60 add a,@r0
61 add a,@r1
62 mov t,a Timervalue mit a laden
63
64 xx jmp 3xx
65 stop tcnt Timer/Counter stoppen
66 xx jnf1 xx
67 rrc a a rechts rotieren (durchs Carry)
68 add a,r0 a := a + r0
69 add a,r1
6A add a,r2
6B add a,r3
6C add a,r4
6D add a,r5
6E add a,r6
6F add a,r7
70
71
72 xx jb3 xx
73
74 xx call 3xx
75
76 xx jf1 xx
77 rr a a rechts rotieren (ohne Carry)
78
79
7A
7B
7C
7D
7E
7F
80
81
82
83 ret Unterprogrammruecksprung
84 xx jmp 4xx
85 clr f0 Flag 0 loeschen
86 xx jni xx
87
88
89 xx orl p1,#xx Bits im Outputport 1 setzen
8A xx orl p2,#xx dto. Port 2
8B
8C
8D
8E
8F
90 movx @r0,a Port (@r0) mit a beschreiben
91 movx @r1,a
92 xx jb4 xx
93 retr Return from Interrupt
94 xx call 4xx
95 cpl f0 Flag 0 umdrehen
96 xx jnz xx
97 clr c Carry loeschen
98
99 xx anl p1,#xx Bit im Outputport 1 loeschen (mit NOT xx)
9A xx anl p2,#xx dto. Port 2
9B
9C
9D
9E
9F
A0 mov @r0,a Memory mit a beschreiben
A1 mov @r1,a
A2
A3 movp a,@a a mit ROMinhalt (a) laden (aktuelle Page)
A4 xx jmp 5xx
A5 clr f1
A6
A7 cpl c Carry umdrehen
A8 mov r0,a
A9 mov r1,a
AA mov r2,a
AB mov r3,a
AC mov r4,a
AD mov r5,a
AE mov r6,a
AF mov r7,a
B0 xx mov @r0,#xx Memoryzelle mit Konstante laden
B1 xx mov @r1,#xx
B2 xx jb5 xx
B3
B4 xx call 5xx
B5 cpl f1
B6
B7
B8 xx mov r0,#xx Register mit Konstante laden
B9 xx mov r1,#xx
BA xx mov r2,#xx
BB xx mov r3,#xx
BC xx mov r4,#xx
BD xx mov r5,#xx
BE xx mov r6,#xx
BF xx mov r7,#xx
C0 dec @r0
C1 dec @r1
C2
C3
C4 xx jmp 6xx
C5 sel rb0 Registerbank 0 waehlen (RAM 00..07)
C6 xx jz xx
C7
C8 dec r0
C9 dec r1
CA dec r2
CB dec r3
CC dec r4
CD dec r5
CE dec r6
CF dec r7
D0 xrl a,@r0
D1 xrl a,@r1
D2 xx jb6 xx
D3 xx xrl a,#xx Logisches Exklusiv-Oder
D4 xx call 6xx
D5 sel rb1 Registerbank 1 waehlen (RAM 18..1F)
D6
D7
D8 xrl a,r0
D9 xrl a,r1
DA xrl a,r2
DB xrl a,r3
DC xrl a,r4
DD xrl a,r5
DE xrl a,r6
DF xrl a,r7
E0 xx djnz @r0,xx
E1 xx djnz @r1,xx
E2
E3 movp3 a,@a a mit Inhalt von (3aa) laden, aa = (a)
E4 xx jmp 7xx
E5 sel mb0 Memorybank 0 (ROM 000..7FF) waehlen
E6 xx jnc xx
E7 rl a a nicht durch c links rotieren
E8 xx djnz r0,xx Decrement r0, jump to xx if r0 is not zero
E9 xx djnz r1,xx
EA xx djnz r2,xx
EB xx djnz r3,xx
EC xx djnz r4,xx
ED xx djnz r5,xx
EE xx djnz r6,xx
EF xx djnz r7,xx
F0 mov a,@r0
F1 mov a,@r1
F2 xx jb7 xx
F3
F4 xx call 7xx
F5 sel mb1 Memorybank 1 (ROM 800..FFF) waehlen
F6 xx jc x
F7 rlc a a durch carry links rotieren
F8 mov a,r0
F9 mov a,r1
FA mov a,r2
FB mov a,r3
FC mov a,r4
FD mov a,r5
FE mov a,r6
FF mov a,r7
5.) Befehlssatz nach Funktionsgruppen
- Arithmetik
@r0 @r1 - #xx - - - a r0..r7
dec c0 c1 - 07 C8..CF
inc 10 11 - 17 18..1F
clr - - - 27 -
cpl - - - 37 -
orl a,.. 40 41 43 - 48..4F
anl a,.. 50 51 53 - 58..5F
add a,.. 60 61 03 - 68..6F
rrc - - - 67 -
rr - - - 77 -
xrl a,.. D0 D1 D3 - D8..DF
rl - - - E7 -
rlc - - - F7 -
- Flags
f0 f1 c
clr 85 A5 97
cpl 95 B5 A7
- Transfer
@r0 @r1 - #xx - - - a r0..r7
xch a,.. 20 21 - 28..2F
mov a,.. F0 F1 23 F8..FF
mov ..,a A0 A1 - A8..AF
mov ..,#xx B0 B1 23 B8..BF
swap a
movp a,@a A3
movp3 a,@a E3
- I/O
i= 1 2
in a,pi 09 0A
orl pi,#xx 89 8A
anl pi,#xx 99 9A
outl pi,a
movx ..,a 90 91
movx a,xx
- Timer
i tcnti
en 05 25
dis 15 35
cnt t
strt 45 55
stop 65
mov a,t 42
mov t,a 62
- Programmsteuerung
ret 83
retr 93
rr= @r0 @r1 r0..r7
djnz rr,xx (E0 E1) E8..EF
i= 0 1 2 3 4 5 6 7
jmp $ixx 04 24 44 64 84 A4 C4 E4
call $ixx 14 34 54 74 94 B4 D4 F4
i= 0 1 2 3 4 5 6 7
jbi,xx 12 32 52 72 92 B2 D2 F2
cc= ntf tf nt0 t0 nt1 t1 nf1 f1 ni nz z nc c
jcc,xx 06 16 26 36 46 56 66 76 86 96 C6 E6 F6
- Sonstiges
rb0 rb1 mb0 mb1
sel C5 D5 E5 F5
nop 00
|