Ich beziehe mich hier auf folgenden Beitrag: Beitrag "Alles neu macht der Mai" Präambel Im folgenden werde ich das Projekt als Objektcode bereitstellen, ungeachtet der Defizite des momentanen Bewertungssystems. Es scheint (bedauerlicherweise) so zu sein, das der Betreiber dieses Forums kein Gespür dafür hat, wie man "Beitragende" motiviert - und dies ist keine exklusive Einschätzung meinerseits!. Ganz offenbar wird auch hier den "Besonderen", (wie z.Zt. überall in der Gesellschaft) ungeachtet Ihrer teilweise schädlichen Einflüsse, zuviel Raum gegeben. Ich will es trotzdem versuchen! Worum geht es? Was ist "48as"? - Das Programm "48as" ist ein rudimentärer Assembler für den Mikroprozessor Intel 8048. - Der Syntax orientiert sich am "MCS-48(TM) FAMILY OF SINGLE CHIP MICROCOMPUTERS USER'S MANUAL". - Eine direkte Ansteuerung des "EPROM-EMU-NG" von Kris Sekula wurde implementiert. Das Projekt wird innerhalb der nächsten 1 bis 2 Wochen in diesem Faden hochgeladen, sofern dieser Beitrag nicht der "Zensur" zum Opfer fällt...
:
Bearbeitet durch User
Hier ein Beispielprogramm zum Testen:
1 | ;****************************************************** |
2 | ; |
3 | ; THIS IS AN EXAMPLE PROGRAM FOR THE 8048 PROCESSOR. |
4 | ; IT IS TAKEN FROM PAGE 335 OF THE NOVEMBER 15, 1984 |
5 | ; ISSUE OF EDN. |
6 | ; |
7 | ; DATA LOGGER SOFTWARE |
8 | ; BY: WUNNAVA V. SUBBARAO |
9 | ; FLORIDA INTERNATIONAL UNIVERSITY, MIAMI, FLORIDA |
10 | ; |
11 | INITIAL: MOV R0,#10 ;R0 & R1 LOADED WITH #10, WHICH |
12 | MOV R1,#10 ;HAS BLANK CODE LOCATION IN PAGE |
13 | START: CLR A ;THREE. |
14 | OUTL P1,A ;INPUT SHIFT REG IS IN LOAD MODE |
15 | OUTL BUS,A ;P17 & P16 AT 0. |
16 | CPL C ;CARRY COMPLEMENTED |
17 | JC DIGIT1 |
18 | DIGIT0: MOV A,#00 ;MAKE P20=0 ACTIVATING DIGIT 0 |
19 | OUTL P2,A ;IF CARRY=0 & LOAD R0 INTO A FOR |
20 | MOV A,R0 ;DISPLAY ON DIGIT 0. |
21 | JMP DISPLAY |
22 | DIGIT1: MOV A,#01 ;MAKE P20=1 ACTIVATING DIGIT 1 |
23 | OUTL P2,A ;IF CARRY=1 & LOAD R1 INTO A FOR |
24 | MOV A,R1 ;DISPLAY ON DIGIT 1. |
25 | DISPLAY: MOVP3 A,@A ;CONTENTS OF CODE TABLE ON PG 3 |
26 | OUTL BUS,A ;PUT ONTO DATA BUS. |
27 | MOV R6,#0FH |
28 | DLY1: DJNZ R6,DLY1 ;DELAY LOOP 1, SMALL DELAY. |
29 | JT1 OTOREG ;IF T1=1, JUMP TO NEXT LOAD. |
30 | MOV R6,#0FFH ;IF T1=0 PROGRAM CHECKS DEBOUNCE |
31 | DLY2: DJNZ R6,DLY2 ;IF SO, KEEP CHECKING DEBOUNCE. |
32 | JT1 OTOREG ;OTHERWISE JUMP TO NEXT LOAD. |
33 | SERDAT: MOV A,#80H ;P17 MADE 1 FOR SHIFT MODE. |
34 | OUTL P1,A |
35 | MOV R3,#04 ;SHIFT CTR R3 INITIALIZED TO 4. |
36 | MOV R4,#00 ;INITIALIZE DATA REGISTER TO 0. |
37 | NXTB: CLR C ;T0 EXAMINED & T0 CORRESPONDING |
38 | RDXIN: JNT0 SHIFTD ;DATA BIT IS SHIFTED INTO R4, IF |
39 | CPL C ;T0=0 (CARRY CLEARED);IF T0=1, |
40 | SHIFTD: MOV A,R4 ;SET CARRY=1, THEN SHIFT INTO R4 |
41 | RLC A |
42 | MOV R4,A |
43 | CLOCK: MOV A,#0C0H ;CLOCK SIGNAL GENERATED ON P16, |
44 | OUTL P1,A ;KEEPING P17=1 IN SHIFT MODE. |
45 | MOV A,#80H ;FOR SHIFTING P16 DATA. |
46 | OUTL P1,A |
47 | DJNZ R3,NXTB ;DECREMENT R3 AND CHECK FOR 0 TO |
48 | MOV A,R4 ;SEE IF ALL 4 SHIFTS ARE OVER. |
49 | XRL A,R5 ;IF R4=R5 SIGNIFYING OLD DATA, |
50 | JZ START ;PROGRAM JUMPS TO START AT 0004 |
51 | DIGITSH: MOV A,R4 ;FOR NEW DATA, LOAD R5 WITH |
52 | MOV R5,A ;CONTENTS OF R4. |
53 | MOV A,R0 ;R0 SHIFTED TO R1. |
54 | MOV R1,A |
55 | MOV A,R4 ;NEW DATA IN R4 SHIFTED TO R0. |
56 | MOV R0,A |
57 | JMP START ;JUMP TO START FOR NEXT WORD. |
58 | OTOREG: MOV R5,#0FFH ;ONE TIME ONLY REG (R5)=#FF. |
59 | JMP START ;JUMP TO START FOR NEXT WORD. |
60 | ; |
61 | ORG 0300H ; TABLE ADDRESS |
62 | |
63 | DFB 3FH ;0 D7 D6 D5 D4 D3 D2 D1 D0 |
64 | DFB 06H ;1 dp g f e d c b a |
65 | DFB 5BH ;2 a |
66 | DFB 4FH ;3 --------- |
67 | DFB 66H ;4 | | |
68 | DFB 6DH ;5 f | | b |
69 | DFB 7DH ;6 | | |
70 | DFB 07H ;7 --------- |
71 | DFB 7FH ;8 | g | |
72 | DFB 6FH ;9 e | | c |
73 | DFB 77H ;A | | |
74 | DFB 7CH ;B --------- |
75 | DFB 58H ;C d |
76 | DFB 5EH ;D |
77 | DFB 79H ;E |
78 | DFB 71H ;F |
79 | DFB 00H ;BLANK |
80 | |
81 | END |
Quelle mußte leicht modifiziert werden: DFB->DB
1 | ;****************************************************** |
2 | ; |
3 | ; THIS IS AN EXAMPLE PROGRAM FOR THE 8048 PROCESSOR. |
4 | ; IT IS TAKEN FROM PAGE 335 OF THE NOVEMBER 15, 1984 |
5 | ; ISSUE OF EDN. |
6 | ; |
7 | ; DATA LOGGER SOFTWARE |
8 | ; BY: WUNNAVA V. SUBBARAO |
9 | ; FLORIDA INTERNATIONAL UNIVERSITY, MIAMI, FLORIDA |
10 | ; |
11 | INITIAL: MOV R0,#10 ;R0 & R1 LOADED WITH #10, WHICH |
12 | MOV R1,#10 ;HAS BLANK CODE LOCATION IN PAGE |
13 | START: CLR A ;THREE. |
14 | OUTL P1,A ;INPUT SHIFT REG IS IN LOAD MODE |
15 | OUTL BUS,A ;P17 & P16 AT 0. |
16 | CPL C ;CARRY COMPLEMENTED |
17 | JC DIGIT1 |
18 | DIGIT0: MOV A,#00 ;MAKE P20=0 ACTIVATING DIGIT 0 |
19 | OUTL P2,A ;IF CARRY=0 & LOAD R0 INTO A FOR |
20 | MOV A,R0 ;DISPLAY ON DIGIT 0. |
21 | JMP DISPLAY |
22 | DIGIT1: MOV A,#01 ;MAKE P20=1 ACTIVATING DIGIT 1 |
23 | OUTL P2,A ;IF CARRY=1 & LOAD R1 INTO A FOR |
24 | MOV A,R1 ;DISPLAY ON DIGIT 1. |
25 | DISPLAY: MOVP3 A,@A ;CONTENTS OF CODE TABLE ON PG 3 |
26 | OUTL BUS,A ;PUT ONTO DATA BUS. |
27 | MOV R6,#0FH |
28 | DLY1: DJNZ R6,DLY1 ;DELAY LOOP 1, SMALL DELAY. |
29 | JT1 OTOREG ;IF T1=1, JUMP TO NEXT LOAD. |
30 | MOV R6,#0FFH ;IF T1=0 PROGRAM CHECKS DEBOUNCE |
31 | DLY2: DJNZ R6,DLY2 ;IF SO, KEEP CHECKING DEBOUNCE. |
32 | JT1 OTOREG ;OTHERWISE JUMP TO NEXT LOAD. |
33 | SERDAT: MOV A,#80H ;P17 MADE 1 FOR SHIFT MODE. |
34 | OUTL P1,A |
35 | MOV R3,#04 ;SHIFT CTR R3 INITIALIZED TO 4. |
36 | MOV R4,#00 ;INITIALIZE DATA REGISTER TO 0. |
37 | NXTB: CLR C ;T0 EXAMINED & T0 CORRESPONDING |
38 | RDXIN: JNT0 SHIFTD ;DATA BIT IS SHIFTED INTO R4, IF |
39 | CPL C ;T0=0 (CARRY CLEARED);IF T0=1, |
40 | SHIFTD: MOV A,R4 ;SET CARRY=1, THEN SHIFT INTO R4 |
41 | RLC A |
42 | MOV R4,A |
43 | CLOCK: MOV A,#0C0H ;CLOCK SIGNAL GENERATED ON P16, |
44 | OUTL P1,A ;KEEPING P17=1 IN SHIFT MODE. |
45 | MOV A,#80H ;FOR SHIFTING P16 DATA. |
46 | OUTL P1,A |
47 | DJNZ R3,NXTB ;DECREMENT R3 AND CHECK FOR 0 TO |
48 | MOV A,R4 ;SEE IF ALL 4 SHIFTS ARE OVER. |
49 | XRL A,R5 ;IF R4=R5 SIGNIFYING OLD DATA, |
50 | JZ START ;PROGRAM JUMPS TO START AT 0004 |
51 | DIGITSH: MOV A,R4 ;FOR NEW DATA, LOAD R5 WITH |
52 | MOV R5,A ;CONTENTS OF R4. |
53 | MOV A,R0 ;R0 SHIFTED TO R1. |
54 | MOV R1,A |
55 | MOV A,R4 ;NEW DATA IN R4 SHIFTED TO R0. |
56 | MOV R0,A |
57 | JMP START ;JUMP TO START FOR NEXT WORD. |
58 | OTOREG: MOV R5,#0FFH ;ONE TIME ONLY REG (R5)=#FF. |
59 | JMP START ;JUMP TO START FOR NEXT WORD. |
60 | ; |
61 | ORG 0300H ; TABLE ADDRESS |
62 | DB 3FH ;0 D7 D6 D5 D4 D3 D2 D1 D0 |
63 | DB 06H ;1 dp g f e d c b a |
64 | DB 5BH ;2 a |
65 | DB 4FH ;3 --------- |
66 | DB 66H ;4 | | |
67 | DB 6DH ;5 f | | b |
68 | DB 7DH ;6 | | |
69 | DB 07H ;7 --------- |
70 | DB 7FH ;8 | g | |
71 | DB 6FH ;9 e | | c |
72 | DB 77H ;A | | |
73 | DB 7CH ;B --------- |
74 | DB 58H ;C d |
75 | DB 5EH ;D |
76 | DB 79H ;E |
77 | DB 71H ;F |
78 | DB 00H ;BLANK |
79 | END |
:
Bearbeitet durch User
1 | x:\>fc /b PRG.BIN mc_test.bin |
2 | Comparing files PRG.HEX and MC_TEST.BIN |
3 | 00000048: FF 00 |
4 | 00000049: FF 00 |
5 | ... |
Wenn du EPROMs schreiben willst, solltest du das Fuellbyte auf 0xFF aendern. Sieht ansonsten gut aus.
Danke für den Hinweis. Ich hatte "00H" gewählt, weil es für "NOP" steht. "FFH" läßt sich natürlich "nachbrennen" - gute Idee. Werde es einstellbar machen.
:
Bearbeitet durch User
Hm, auch wenn ich vor Jahrzehnten schon meine MCS-48 Controller entsorgt habe wäre es doch bestimmt für diejenigen, die damit noch etwas machen wollen "interessant", das Wiindowsprogramm hier zum Download angeboten zu bekommen, oder ?
Ralph S. schrieb: > Hm, auch wenn ich vor Jahrzehnten schon meine MCS-48 Controller entsorgt > habe wäre es doch bestimmt für diejenigen, die damit noch etwas machen > wollen "interessant", das Wiindowsprogramm hier zum Download angeboten > zu bekommen, oder ? Wenn du nicht solange warten willst: https://daveho.github.io/asm48/ >asm48 PRG.ASM *** asm48 v0.4.1 *** Assembled 785 bytes. Erfordert aber einige Anpassungen in der Assemblerquelle ORG -> .ORG DFB -> .DB usw. usf.
Motopick schrieb: > Wenn du nicht solange warten willst: > https://daveho.github.io/asm48/ Wie gesagt, ich brauche es ja nicht. Allerdings für die, die das interessiert, wäre der Code dann schon von Vorteil. :- ) für die, die einen Assembler für MCS-48 brauchen (und hier eben nicht fündig werden) gibt es "naken asm", der sehr klein, sehr schnell ist und einige andere MCU's dazu auch kann (wie bspw. MCS-51, AVR, STM8 etc.) https://www.mikekohn.net/micro/naken_asm.php
Wer heute noch mit MCS-48 arbeitet, der tut das meist im Kontext mit historischen Computern. Und da gibt es as, dieser Assembler unterstützt so ziemlich jeden älteren Mikrocontroller oder-prozessor. http://john.ccac.rwth-aachen.de:8000/as/
Soul E. schrieb: > im Kontext mit historischen Computern. Und da gibt es as, Es gibt alles, dennoch ist es eine schöne Übung, einen Assembler „from scratch“ zu bauen. Vielleicht nicht lebenswichtig, aber eine Art Ingenieur-Sudoku. Dieser 1-Pass Z80-Assembler z.B. ist einfach und geradeaus strukturiert (Lexer -> Compiler -> basta) und kann leicht aufgebohrt werden, um nützliche undokumentierte Opcodes zu erzeugen oder Intel-Hex statt binär auszugeben. Das ist gerade mein Zeitvertreib. https://github.com/sarnau/Z80DisAssembler
Ralph S. schrieb: > Motopick schrieb: >> Wenn du nicht solange warten willst: >> https://daveho.github.io/asm48/ > > Wie gesagt, ich brauche es ja nicht. Allerdings für die, die das > interessiert, wäre der Code dann schon von Vorteil. Ja ist doch. :) Man sollte aber lex und yacc dabei haben. Brauchen tue ich es auch nicht. Ein kommerzieller Crossassembler ist der Cross-32 Meta-Assembler. Der ist nun recht unversell: 1802, 320C1X, 320C2X, 320C5X, 34010, 37700, 3870, 4004, 50740, 64180, 6502, 65816, 6800, 68000, 6805, 6809, 68HC08, 68HC11, 68HC16, 782XX, 7831X, 80166, 80186, 80251B, 80251S, 8041, 8048, 8051, 8085, 8086, 8096, COP400, COP800, H8-300, H8-300H, H8-500, HMCS400, NEC7500, NEC7810, PIC165X, PIC16XX, PIC17XX, ST6, ST9, SUPER8, TLCS90, TMS370, TMS7000, TMS9900, V800, Z180, Z280, Z380, Z8, Z80 und Z8002 stehen da auf der Liste der unterstuetzten Prozessoren. > :- ) für die, die einen Assembler für MCS-48 brauchen (und hier eben > nicht fündig werden) gibt es "naken asm", der sehr klein, sehr schnell > ist und einige andere MCU's dazu auch kann (wie bspw. MCS-51, AVR, STM8 > etc.) > > https://www.mikekohn.net/micro/naken_asm.php Sieht interessant aus. Leider fehlen dem die TI-DSPs.
Motopick schrieb: > Der ist nun recht unversell: 1802, 320C1X, 320C2X, 320C5X, 34010, > 37700, 3870, 4004, 50740, 64180, 6502, 65816, 6800, 68000, 6805, 6809, > 68HC08, 68HC11, 68HC16, 782XX, 7831X, 80166, 80186, 80251B, 80251S, > 8041, 8048, 8051, 8085, 8086, 8096, COP400, COP800, H8-300, H8-300H, > H8-500, HMCS400, NEC7500, NEC7810, PIC165X, PIC16XX, PIC17XX, ST6, ST9, > SUPER8, TLCS90, TMS370, TMS7000, TMS9900, V800, Z180, Z280, Z380, Z8, > Z80 und Z8002 stehen da auf der Liste der unterstuetzten Prozessoren. Das wird nix werden. Dem fehlt die Unterstützung für 7805 und NE555... SCRN
Harald K. schrieb: > Motopick schrieb: >> Leider fehlen dem die TI-DSPs. > > Sind das MCS-48?! Wer nicht kognitiv beschraenkt ist, koennte die darauf emulieren. Und wer 555 benutzt, der weiss es nicht besser.
In der Anlage befindet sich der Assembler. Ich möchte mich an dieser Stelle ausdrücklich bei Kris Sekula für die Genehmigung zum Beipacken seiner Firmware des "EPROM EMULATOR NG" bedanken. Hinweise: Die Anwendung wurde weder zertifiziert noch signiert. Möglicherweise wird es Fehlermeldungen bei deren Start geben. Die Anwendung wurde auf einer 64Bit-Plattform kompiliert. Möglicherweise ist sie auf 32Bit-Betriebssystemen nicht lauffähig. Vor der Nutzung bitte ich die dem Archiv beigefügte Datei "Lesen.txt" gründlich zu "studieren". Danke. Themenbezogene, konstruktive Beiträge sind jederzeit willkommen - der Rest wird ignoriert.
:
Bearbeitet durch User
Der G. schrieb: > In der Anlage befindet sich der Assembler. Kein Sourcecode? Da muss man aber viel Gottvertrauen haben. Und ... was hat das unter "Projekte & Code" verloren?
Der G. schrieb: > In der Anlage befindet sich der Assembler. Wird der Source-Code noch nachgeliefert? Titel dieses Subforums: Hier könnt ihr Projekte, Schaltungen oder Codeschnipsel vorstellen. Projekte bitte nur mit Code oder Schaltplan posten (falls ihr nur Fotos vorstellen möchtet, bitte in "Zeigt her eure Kunstwerke"). Bitte hier keine Fragen posten. Wenn es keinen Source-Code gibt, muss ich den Thread nach "µC und Elektronik" verschieben.
Frank M. schrieb: > Wird der Source-Code noch nachgeliefert? im anderen, von Soul E. genannten Beispiel Beitrag "Re: 8048 Assembler für aktuelle Windows-Versionen" ist der Source-Code dabei.
Ich sehe hier den "Workflow" nicht. Es gibt wohl Assembler und "Treiber" für Windows, da ist dann aber auch gleich die Erklärung dabei, wie eingeschränkt die Nutzbarkeit ist. So gesehen erscheint diese Seite (s.o.) hier schon mal etwas freundlicher bzw. transparenter: https://github.com/daveho/asm48 Welche aber auch mit Bedacht zu genießen wäre, weil Windows früher ja auch einen DOS - Unterbau hatte, den man nutzen konnte. Und das war sogar recht trickreich gelöst. Aktuell könnte man z.B. schauen, was über WSL ginge, denn auch das gehört zum aktuellen Windows. https://blog.golioth.io/program-mcu-from-wsl2-with-usb-support/
Rbx schrieb: > Welche aber auch mit Bedacht zu genießen wäre, weil Windows früher ja > auch einen DOS - Unterbau hatte, den man nutzen konnte. Windows hat schon sehr, sehr lange keinen "DOS-Unterbau" mehr. Ernstgemeintes Windows hatte sogar noch nie einen, und das war schon vor über 30 Jahren. Aber den brauchts auch nicht, um stinknormale Kommandozeilenanwendungen nutzen zu können - dazu braucht man definitiv kein "WSL". Auch kein "cygwin" oder andere Krücken. Oh, und auch keine "bash". Das einzige, was der geneigte Ahnungslose kapieren muss, ist, daß ein Doppelklick auf die *.exe des Assemblers kein sinnvolles Resultat liefert.
Harald K. schrieb: > Windows hat schon sehr, sehr lange keinen "DOS-Unterbau" mehr. > Ernstgemeintes Windows hatte sogar noch nie einen, und das war schon vor > über 30 Jahren. Wobei man für "echte" DOS-Programme auf solchen Unterbau auch nicht mehr angewiesen ist. Dies kann man unter https://de.wikipedia.org/wiki/DOSBox (für alle heute üblichen Plattformen) ausführen. Die emuliert auch die damals üblichen Sound/Grafikkarten, die hier aber nicht benötigt werden.
Harald K. schrieb: > Das einzige, was der geneigte Ahnungslose kapieren muss, ist, daß ein > Doppelklick auf die *.exe des Assemblers kein sinnvolles Resultat > liefert. Ich sehe immer noch keinen Workflow. Soll das so etwas werden wie Jasmin?
Rbx schrieb: > Ich sehe immer noch keinen Workflow. Workflow? Das ist ein Kommandozeilenprogramm. Da kannst Du Dir jeden beliebigen "Workflow" drumherumbasteln, so, wie man das mit jedem beliebigen anderen Kommandozeilenprogramm auch macht. Wer oder was soll "jasmin" sein?
Im Zweifel kann man ja das Original von Intel auch heute noch benutzen:
1 | >ASM48 PRG.ASM |
2 | |
3 | ISIS-II MCS-48/UPI-41 MACRO ASSEMBLER, V4.2 |
4 | |
5 | ASSEMBLY COMPLETE, NO ERRORS |
6 | . |
7 | . |
8 | ASM48 PRG.ASM |
9 | |
10 | |
11 | |
12 | ISIS-II MCS-48/UPI-41 MACRO ASSEMBLER, V4.2 PAGE 1 |
13 | |
14 | |
15 | LOC OBJ LINE SOURCE STATEMENT |
16 | |
17 | 1 ;****************************************************** |
18 | 2 ; |
19 | 3 ; THIS IS AN EXAMPLE PROGRAM FOR THE 8048 PROCESSOR. |
20 | 4 ; IT IS TAKEN FROM PAGE 335 OF THE NOVEMBER 15, 1984 |
21 | 5 ; ISSUE OF EDN, AND AFTER ONLY FORMAT MODIFICATIONS, |
22 | 6 ; IT IS PASSED ON AS AN EXAMPLE, FREE OF CHARGE, |
23 | 7 ; BY UNIVERSAL CROSS-ASSEMBLERS. |
24 | 8 ; |
25 | 9 ; DATA LOGGER SOFTWARE |
26 | 10 ; BY: WUNNAVA V. SUBBARAO |
27 | 11 ; FLORIDA INTERNATIONAL UNIVERSITY, MIAMI, FLORIDA |
28 | 12 ; |
29 | 0000 B80A 13 INITIAL: MOV R0,#10 ;R0 & R1 LOADED WITH #10, WHICH |
30 | 0002 B90A 14 MOV R1,#10 ;HAS BLANK CODE LOCATION IN PAGE |
31 | 0004 27 15 START: CLR A ;THREE. |
32 | 0005 39 16 OUTL P1,A ;INPUT SHIFT REG IS IN LOAD MODE |
33 | 0006 02 17 OUTL BUS,A ;P17 & P16 AT 0. |
34 | 0007 A7 18 CPL C ;CARRY COMPLEMENTED |
35 | 0008 F610 19 JC DIGIT1 |
36 | 000A 2300 20 DIGIT0: MOV A,#00 ;MAKE P20=0 ACTIVATING DIGIT 0 |
37 | 000C 3A 21 OUTL P2,A ;IF CARRY=0 & LOAD R0 INTO A FOR |
38 | 000D F8 22 MOV A,R0 ;DISPLAY ON DIGIT 0. |
39 | 000E 0414 23 JMP DISPLAY |
40 | 0010 2301 24 DIGIT1: MOV A,#01 ;MAKE P20=1 ACTIVATING DIGIT 1 |
41 | 0012 3A 25 OUTL P2,A ;IF CARRY=1 & LOAD R1 INTO A FOR |
42 | 0013 F9 26 MOV A,R1 ;DISPLAY ON DIGIT 1. |
43 | 0014 E3 27 DISPLAY: MOVP3 A,@A ;CONTENTS OF CODE TABLE ON PG 3 |
44 | 0015 02 28 OUTL BUS,A ;PUT ONTO DATA BUS. |
45 | 0016 BE0F 29 MOV R6,#0FH |
46 | 0018 EE18 30 DLY1: DJNZ R6,DLY1 ;DELAY LOOP 1, SMALL DELAY. |
47 | 001A 5644 31 JT1 OTOREG ;IF T1=1, JUMP TO NEXT LOAD. |
48 | 001C BEFF 32 MOV R6,#0FFH ;IF T1=0 PROGRAM CHECKS DEBOUNCE |
49 | 001E EE1E 33 DLY2: DJNZ R6,DLY2 ;IF SO, KEEP CHECKING DEBOUNCE. |
50 | 0020 5644 34 JT1 OTOREG ;OTHERWISE JUMP TO NEXT LOAD. |
51 | 0022 2380 35 SERDAT: MOV A,#80H ;P17 MADE 1 FOR SHIFT MODE. |
52 | 0024 39 36 OUTL P1,A |
53 | 0025 BB04 37 MOV R3,#04 ;SHIFT CTR R3 INITIALIZED TO 4. |
54 | 0027 BC00 38 MOV R4,#00 ;INITIALIZE DATA REGISTER TO 0. |
55 | 0029 97 39 NXTB: CLR C ;T0 EXAMINED & T0 CORRESPONDING |
56 | 002A 262D 40 RDXIN: JNT0 SHIFTD ;DATA BIT IS SHIFTED INTO R4, IF |
57 | 002C A7 41 CPL C ;T0=0 (CARRY CLEARED);IF T0=1, |
58 | 002D FC 42 SHIFTD: MOV A,R4 ;SET CARRY=1, THEN SHIFT INTO R4 |
59 | 002E F7 43 RLC A |
60 | 002F AC 44 MOV R4,A |
61 | 0030 23C0 45 CLOCK: MOV A,#0C0H ;CLOCK SIGNAL GENERATED ON P16, |
62 | 0032 39 46 OUTL P1,A ;KEEPING P17=1 IN SHIFT MODE. |
63 | 0033 2380 47 MOV A,#80H ;FOR SHIFTING P16 DATA. |
64 | 0035 39 48 OUTL P1,A |
65 | 0036 EB29 49 DJNZ R3,NXTB ;DECREMENT R3 AND CHECK FOR 0 TO |
66 | 0038 FC 50 MOV A,R4 ;SEE IF ALL 4 SHIFTS ARE OVER. |
67 | 0039 DD 51 XRL A,R5 ;IF R4=R5 SIGNIFYING OLD DATA, |
68 | 003A C604 52 JZ START ;PROGRAM JUMPS TO START AT 0004 |
69 | 003C FC 53 DIGITSH: MOV A,R4 ;FOR NEW DATA, LOAD R5 WITH |
70 | 003D AD 54 MOV R5,A ;CONTENTS OF R4. |
71 | |
72 | |
73 | |
74 | ISIS-II MCS-48/UPI-41 MACRO ASSEMBLER, V4.2 PAGE 2 |
75 | |
76 | |
77 | LOC OBJ LINE SOURCE STATEMENT |
78 | |
79 | 003E F8 55 MOV A,R0 ;R0 SHIFTED TO R1. |
80 | 003F A9 56 MOV R1,A |
81 | 0040 FC 57 MOV A,R4 ;NEW DATA IN R4 SHIFTED TO R0. |
82 | 0041 A8 58 MOV R0,A |
83 | 0042 0404 59 JMP START ;JUMP TO START FOR NEXT WORD. |
84 | 0044 BDFF 60 OTOREG: MOV R5,#0FFH ;ONE TIME ONLY REG (R5)=#FF. |
85 | 0046 0404 61 JMP START ;JUMP TO START FOR NEXT WORD. |
86 | 62 ; |
87 | 0300 63 ORG 0300H ; TABLE ADDRESS |
88 | 64 |
89 | 0300 3F 65 DB 3FH ;0 D7 D6 D5 D4 D3 D2 D1 D0 |
90 | 0301 06 66 DB 06H ;1 dp g f e d c b a |
91 | 0302 5B 67 DB 5BH ;2 a |
92 | 0303 4F 68 DB 4FH ;3 --------- |
93 | 0304 66 69 DB 66H ;4 | | |
94 | 0305 6D 70 DB 6DH ;5 f | | b |
95 | 0306 7D 71 DB 7DH ;6 | | |
96 | 0307 07 72 DB 07H ;7 --------- |
97 | 0308 7F 73 DB 7FH ;8 | g | |
98 | 0309 6F 74 DB 6FH ;9 e | | c |
99 | 030A 77 75 DB 77H ;A | | |
100 | 030B 7C 76 DB 7CH ;B --------- |
101 | 030C 58 77 DB 58H ;C d |
102 | 030D 5E 78 DB 5EH ;D |
103 | 030E 79 79 DB 79H ;E |
104 | 030F 71 80 DB 71H ;F |
105 | 0310 00 81 DB 00H ;BLANK |
106 | 82 |
107 | 83 END |
108 | |
109 | USER SYMBOLS |
110 | CLOCK 0030 DIGIT0 000A DIGIT1 0010 DIGITS 003C DISPLA 0014 DLY1 0018 DLY2 001E INITIA 0000 |
111 | NXTB 0029 OTOREG 0044 RDXIN 002A SERDAT 0022 SHIFTD 002D START 0004 |
112 | |
113 | ASSEMBLY COMPLETE, NO ERRORS |
Motopick schrieb: > Im Zweifel kann man ja das Original von Intel auch heute noch benutzen ... wenn man eine Umgebung hat, unter der das noch läuft. Da braucht man halt DOSBox, ein 32-Bit-Windows oder eine andere Art der Emulation. BTW: Wo findet sich das Original?
Harald K. schrieb: > Motopick schrieb: >> Im Zweifel kann man ja das Original von Intel auch heute noch benutzen > > ... wenn man eine Umgebung hat, unter der das noch läuft. Da braucht man > halt DOSBox, ein 32-Bit-Windows oder eine andere Art der Emulation. > > BTW: Wo findet sich das Original? (M)Ein 64 bittiges kann das viel einfacher. :) >MSDOS ISIS.EXE DOS ISIS environment V1.0 =asm48 prg.asm ISIS-II MCS-48/UPI-41 MACRO ASSEMBLER, V4.2 ASSEMBLY COMPLETE, NO ERRORS =exit Das Original findet sich natuerlich bei Intel. Eine Kopie konnte(/kann) man anfordern, oder muss sie selbst finden. LICENSE: Intel grants you ... "You agree to prevent any unauthorized copying of the Software."
Motopick schrieb: > Das Original findet sich natuerlich bei Intel. > Eine Kopie konnte(/kann) man anfordern, oder muss sie selbst finden. Tolle Antwort.
Beitrag #7728225 wurde vom Autor gelöscht.
In der Anlage findet Ihr eine Vorlage für ein 8048-Testbrett. Ich stelle die Daten unter Public Domain. Nicht ganz uneigennützig verweise ich hier auf folgenden Diskussionfaden: Beitrag "[V] Leerplatine 8048 Testbrett" Es ist immer noch einer Leerplatine vorhanden.
:
Bearbeitet durch User
Moin, Soul E. schrieb: > Wer heute noch mit MCS-48 arbeitet, der tut das meist im Kontext > mit > historischen Computern. Und da gibt es as, dieser Assembler unterstützt > so ziemlich jeden älteren Mikrocontroller oder-prozessor. > > http://john.ccac.rwth-aachen.de:8000/as/ Yeah! Mit dem habbich mal vor zig Jahren gewerkelt, habe noch ein paar 8741, mit denen ich damals noch bisschen gebastelt habe. Der taugt. Gruss WK
Frank M. schrieb: > Wird der Source-Code noch nachgeliefert? Natürlich nicht. Das ganze ist doch von vornherein als Systemkritik angelegt. Der G. schrieb: > Präambel > > Im folgenden werde ich das Projekt als Objektcode bereitstellen, > ungeachtet der Defizite des momentanen Bewertungssystems. Oliver
:
Bearbeitet durch User
Der G. schrieb: > In der Anlage findet Ihr eine Vorlage für ein 8048-Testbrett. Ich habe auch mit so einem Board mit µCs angefangen. Allerdings mit 8031, die 8048 waren damals schon tot. Insbesondere MUL und DIV erleichtern deutlich die Programmierung. Als dann 1993 die Atmel Flash-Typen rauskamen, verstaubten die Platinen mit Adreßlatch und EPROM-Fassung. Alle IO-Pins nutzen zu können war ein großer Vorteil. Ich hatte mir auch einen Prommer selber gebastelt. Ein AT89C51 programmiert den Ziel AT89C51. Ein UV-Löschgerät mag ich nicht mal mit spitzen Fingern mehr anfassen. 1995 gabs dann den Keil C51, der erstaunlich kompakten Code erzeugte. Da konnte man sich ne Menge Assemblertricks von abgucken, auf die ich nie selber gekommen wäre. Meine Routinen waren allesamt deutlich größer und langsamer. Auch die RAM Nutzung wurde deutlich effektiver (Daten-Overlay). Seitdem bin ich skeptisch, wenn jemand behauptet, er wäre in Assembler schneller und könne alles besser machen. Er ist einfach in C nur noch nicht gut.
Hallo Peter. Vorweg. Dieses Projekt verfolgt keinem "erzieherischen" Zweck. Mir ging es nur darum, eine wiederaufgetauchte Kiste mit 80C49 sinnvoll zu nutzen. Verfügbare Assembler gab es nur für DOS und/oder als Kommandozeilen Interface. Ich wollte es etwas komfortabler und das Ergebnis meiner Bemühungen nicht im "Nirvana" verschwinden lassen... Zum Thema C und den diversen Optimierungen (wie von Dir bewundert und gelobt) kann ich aus eigener beruflicher Erfahrung sagen, daß diese unter Umständen zu völlig unreproduzierbarem Verhalten im Feld führen. Mein Vorgänger führte dies auf EMV-Probleme zurück und ließ die Hardware für viel Geld von einem Dienstleister optimieren. Dies brachte leider nicht den gewünschten Erfolg. Am Ende des Tages war die eingeschaltete Optimierung die Wurzel des Übels. Wenn ein C-Compiler die Intension des Programmieres 1:1 umsetzt, gibt es in der Regel keine Probleme. Blind verlassen auf das, was einem ein C-Compiler "anbietet" würde ich mich allerdings nicht mehr...
:
Bearbeitet durch User
Der G. schrieb: > Mein Vorgänger führte dies auf EMV-Probleme zurück und ließ die Hardware > für viel Geld von einem Dienstleister optimieren. Dies brachte leider > nicht den gewünschten Erfolg. Das klingt stark danach, daß bei Optimierung die Mainloop schneller durchlaufen wird und keine funktionierende Entprellung implementiert wurde. Der Effekt ist dann, daß Störungen (EMV) den Ablauf durcheinander bringen können. Die Abschaltung der Optimierung baut quasi Delays mit ein, was eine minimale aber recht armselige Entprellung bewirken kann. Ein beliebter Anfängerfehler ist auch, daß Pins an verschiedenen Stellen eingelesen werden und angenommen wird, daß sie dazwischen auch immer den gleichen Wert haben. Alle äußeren Signale dürfen nur an einer Stelle im Ablauf eingelesen werden und müssen dann entstört/entprellt werden. Der G. schrieb: > Blind verlassen auf das, was einem > ein C-Compiler "anbietet" würde ich mich allerdings nicht mehr... Wenn ein Programm nicht das gewünschte macht, sollte man immer den Fehler finden wollen. Dabei hilft es, wenn man mit Assembler noch nicht ganz eingerostet ist und das Listing analysieren kann. Was überhaupt nicht hilft, ist planloses Umschreiben des Codes. Der Compiler sieht sofort, wenn Du das gleiche hinschreibst, nur mit anderen Worten (i++; statt i=i+1;). In der Regel sitzt der Fehler aber immer vor dem Bildschirm. Ich habe in all den Jahren bisher nur einen einzigen Bug in meiner Keil C51 Version gefunden, der betrifft zusammengesetzte Operationen mit long Variablen. Dafür habe ich schon oft logische Fehler gemacht, es hat also nie funktionieren dürfen. Und man wundert sich, daß für diese Stelle kein Code generiert wurde, weil der Ausdruck nie wahr werden kann und der Compiler ihn deshalb wegoptimiert hat. Ohne Optimierung compiliert er natürlich auch den größten Stuss hin.
Schönes Projekt, hatte vor vielen Jahren, noch unter CP/M, auch einen 8048-Assembler geschrieben. Damals natürlich ohne grafische Oberfläche, einfach nur Quellcode rein, Intel-Hex raus. Danach bin ich auch auf MCS51 umgestiegen. Hatte mir seinerzeit eine Platine gebaut deren Monitorprogramm es erlaubt Programme ins RAM zu übertragen (Download) und dort auszuführen. Das ersparte das lästige programmieren von EPROM's. Habe das Projekt kürzlich wieder ausgegraben und im Moment sitze ich grad dran und bastel mir eine IDE dafür. Soll mal Editor, Hex-Editor und Debugger für Assembler und C können. Den Assembler und C-Compiler schreibe ich allerdings nicht selbst, werde wohl den SDCC dafür nutzen. Der Multifile-Editor ist schon beinahe fertig, fehlen nur noch Kleinigkeiten und Syntaxhighlight. Im Anhang ein Bild davon. Tom
Hallo Peter, ich programmiere nun schon seit mehr als 20 Jahren in C. Jedoch nicht ausschließlich. Natürlich gibt es den einen oder anderen "Brett vor dem Kopf"-Moment. Aber nach so langer Zeit sollten die von Dir beschriebenen "Anfängerfehler", wenn überhaupt, nur noch selten auftreten. Habe alle Projekte "geerbt". Jeder mit ein wenig Ahnung hat eine Idee davon, was passiert, wenn man versucht, in riesigen Projekten "alles hübsch zu machen"... Auch wenn der Geist willig ist - das Fleisch ist schwach...
Tom A. schrieb: > ... Programme ins RAM zu übertragen (Download) und dort auszuführen. > Das ersparte das lästige programmieren von EPROM's... Ich habe mich da dem EPROM Emulator NG von Kris Sekula (natürlich mit dessen Genehmigung) bedient. Warum das Rad neu erfinden...
Der G. schrieb: > Habe alle Projekte "geerbt". Ich habe auch ein recht großes Projekt geerbt. Als der Kollege die Firma verlassen hat, habe ich gemerkt, daß er ein sehr guter Programmierer war. Ich konnte Erweiterungen hinzufügen, ohne das gesamte Programm analysiert zu haben und alles hat sofort geklappt, ohne jegliche Seiteneffekte. Als wir das Projekt starteten, habe ich mich gewundert, warum er ohne die Hardware schon arbeiten konnte. Er hatte einige #ifdefs eingefügt und das C51-Programm fast komplett unter Unix entwickelt. Der G. schrieb: > Aber nach so langer Zeit sollten die von Dir beschriebenen > "Anfängerfehler", wenn überhaupt, nur noch selten auftreten. Auch wenn nur selten, sitzt dann das Problem vor dem Bildschirm. Gerne wird vergessen, daß Interrupts parallele Instanzen sind, mit denen man atomar kommunizieren muß. Beim 8051 mit 4 Interruptleveln muß man also bis zu 5 Instanzen verwalten. Und Interruptfehler können erstmal lange Zeit unentdeckt bleiben. Dabei können auch Laufzeiteffekte auftreten, d.h. die Fehler treten je nach Optimierungslevel mehr oder weniger häufig auf.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.