Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Erste Programmierversuche » Themenansicht

Autor Thread - Seiten: -1-
000
04.02.2018, 19:06 Uhr
andy62



Hallo,
auf Grund des PEPS habe ich mich heute in der Programmierung versucht.
Nicht lachen, es sind erste Versuche.
Zielsystem ist die AC1-2010 CPU- und BWS- Karte.
Das Programm besteht nur aus der PIO Initialisierung und dem Löschen des Bildschirmes. Dann springt es in eine Endlosschleife.
Mein Problem, der Bildschirm wird nicht gelöscht.
Auch nach dem Drücken von RESET bleibt der Müll auf dem Bildschirm stehen.
Lade ich mit dem PEPS den richtigen AC1-Monitor rein funktionieren die Baugruppen wie es sein soll.
Hier mal mein Progrämmchen:

Quellcode:

ROM:       EQU       0000h        ;-0FFF
BRAM:      EQU       1000h        ;-17FF Bildschirmram                          0FC00h
BRAM_END:  EQU       17FFh
RAM:       EQU       1800h        ;-1FFF Systemram                              0CFF0h

STACK:     EQU       1856h                                                      ;0FCEh
RAMZK:     EQU       1FFCh                                                      ;0FFCh
CURS:      EQU       1FFEh

BRAM_SIZE: EQU       07FFh

PIOAD:     EQU       04h                                                        ;0FCh
PIOBD:     EQU       05h                                                        ;0FDh
PIOAC:     EQU       06h                                                        ;0FEh
PIOBC:     EQU       07h                                                        ;0FFh



           ORG 0000h
BEGIN:     DI
           LD  SP,STACK
           CALL INIT_PIO
           CALL BLOE
           JR    START

;-----------NMI---------------------------

       ORG  66h    ;NMI Einsprung
NMI:      RETN



;---------------Hauptschleife---------------
START:   LD (1877h),SP
          CALL ZS
          JR START         ;Hauptschleife


;-------INIT PIO---------------
INIT_PIO: LD A,4FH               ;Port A = Eingabe
          OUT (PIOAC),A                      
          LD A,0CFH              ;Port B = Einzelbitsteuerung              
          OUT (PIOBC),A                      
          LD A,80H               ;PB0-4 = Eingang, PB5-7 = Ausgang              
          OUT (PIOBC),A                      
          LD A,0FFH              ;Leitungen auf High              
          OUT (PIOBD),A
          RET      
;----------------Bildschirm loeschen-----------------
BLOE:  PUSH HL
       PUSH DE
       PUSH BC
       LD   HL,BRAM_END    ;17FFh
       LD   DE,BRAM_END-1       ;17FE
       LD   BC,BRAM_SIZE        ; 07FF
       LD   (HL),20h
       LDDR
       LD   (CURS),HL
       POP  BC
       POP  DE
       POP  HL
       RET
       ;-------------Zeitschleife--------------
ZS:    PUSH HL
       PUSH AF
       LD   HL,RAMZK
ZS1:   DEC  HL
       LD   A,H
       OR   L
       JR   NZ,ZS1
       POP  AF
       POP  HL
       RET
END



Kann mir jemand erklären wieso das nicht funktioniert?
Als Assembler habe ich den ASIDE verwendet
Danke und Gruß
Andy

P.S.hier noch das .bin File

Quellcode:

F3315618CD7100CD8200185C00000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
000000000000ED45ED737718CD990018
F73E4FD3063ECFD3073E80D3073EFFD3
05C9E5D5C521FF1711FE1701FF073620
EDB822FE1FC1D1E1C9E5F521FC1F2B7C
B520FBF1E1C9


Dieser Beitrag wurde am 04.02.2018 um 21:13 Uhr von andy62 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
04.02.2018, 20:04 Uhr
ambrosius



Den AC1-2010, speziell das Betriebssystem, kenne ich nicht im Detail und weiß auch nicht, ob das BS Interrupts verwendet. Trotzdem solltest Du, bevor der Stackpointer manipuliert wird, den Interrupt abschalten (DI), um eventuelle Stackinkonsistenzen zu vermeiden. Ist der Bildschirmspeicher immer aktiv oder hat die Initialisierung der PIO mit dem BWS zu tun? Hat der AC1 den ASCII-Zeichensatz? Es könnte ja sein, daß das Zeichen 20h eine andere Bedeutung hat. Ansonsten müßten die Routinen eigentlich funktionieren, wenn die Adressen stimmen.

edit: ist mir gerade noch aufgefallen: org 66h sollte nicht hinter dem Label NMI: stehen, sondern davor:

org 066h
NMI:
RETN

Ich kann nicht sagen, was sonst der Assembler daraus macht

edit2: irgendetwas stimmt auch beim Assemblieren nicht: die ersten Bytes Deines bin-files deassembliert ergibt folgendes:


Quellcode:

org 0
31 56 18    ld sp, 1856h
3e 20        ld a, 20h
21 ff 13    ld hl, 13ffh
06 10        ld b, 10h
s1:
77        ld (hl), a
23 cd 99    ld hl, 99cdh
00        nop
10 f9        djnz s1
22 fe 1f    ld (1ffeh), hl
18 52        jr $+52



Das könnte evtl. daran liegen, das Du im Listing die EQU-Zuweisungen als Label definiert hast:

Quellcode:

00000h            ROM:                  EQU       0000H          ;-0FFF
00000h            BRAM:                 EQU       1000H          ;-17FF              
00000h            BRAM_END:             EQU       17FFH
00000h            RAM:                  EQU       1800H          ;-1FFF Systemram


es müßten aber, zumindest bei den mir bekannten Assemblern, die Doppelpunkte weggelassen werden, um der Bezeichnung 'ROM' den Wert '0000H' zuzuweisen.
--
Viele Grüße
Holger

Dieser Beitrag wurde am 04.02.2018 um 20:43 Uhr von ambrosius editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
04.02.2018, 20:18 Uhr
holm

Avatar von holm

Andy poste lieber das Listing File des Assemblers als die Quelle, eingeschlossen in code Tags [ ]
Gruß,

Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
04.02.2018, 20:23 Uhr
andy62



Hallo Holger,
DI und ORG hat keine Veränderung ergeben.
Es werden keinerlei Interrupts verwendet und der Bildspeicher ist als normaler Speicherbereich von 1000h- 17FFh definiert. Er bekommt ASCII Zeichen.
@Holm

Das Listfile:

Quellcode:

00000h            ROM:                  EQU       0000H          ;-0FFF
00000h            BRAM:                 EQU       1000H          ;-17FF Bildschirmram
00000h            BRAM_END:             EQU       17FFH
00000h            RAM:                  EQU       1800H          ;-1FFF Systemram                            
00000h                                            
00000h            STACK:                EQU       1856H          ;0FCEh
00000h            RAMZK:                EQU       1FFCH          ;0FFCh
00000h            CURS:                 EQU       1FFEH
00000h                                            
00000h            BRAM_SIZE:            EQU       07FFH
00000h                                            
00000h            PIOAD:                EQU       04H            ;0FCh
00000h            PIOBD:                EQU       05H            ;0FDh
00000h            PIOAC:                EQU       06H            ;0FEh
00000h            PIOBC:                EQU       07H            ;0FFh
00000h                                            
00000h                                            
00000h                                            
00000h                                  ORG       0000H
00000h F3         BEGIN:                DI        
00001h 315618                           LD        SP,STACK
00004h CD7100                           CALL      INIT_PIO
00007h CD8200                           CALL      BLOE
0000Ah 185C                             JR        START
0000Ch                                            
0000Ch                                                           ;-----------NMI---------------------------
0000Ch                                            
0000Ch 0000000000                       ORG       66H            ;NMI Einsprung
00066h ED45       NMI:                  RETN      
00068h                                            
00068h                                            
00068h                                            
00068h                                                           ;---------------Hauptschleife---------------
00068h ED737718   START:                LD        (1877H),SP
0006Ch CD9900                           CALL      ZS
0006Fh 18F7                             JR        START          ;Hauptschleife
00071h                                            
00071h                                            
00071h                                                           ;-------INIT PIO---------------
00071h 3E4F       INIT_PIO:             LD        A,4FH          ;Port A = Eingabe
00073h D306                             OUT       (PIOAC),A
00075h 3ECF                             LD        A,0CFH         ;Port B = Einzelbitsteuerung              
00077h D307                             OUT       (PIOBC),A
00079h 3E80                             LD        A,80H          ;PB0-4 = Eingang, PB5-7 = Ausgang              
0007Bh D307                             OUT       (PIOBC),A
0007Dh 3EFF                             LD        A,0FFH         ;Leitungen auf High              
0007Fh D305                             OUT       (PIOBD),A
00081h C9                               RET      
00082h                                                           ;----------------Bildschirm loeschen-----------------
00082h E5         BLOE:                 PUSH      HL
00083h D5                               PUSH      DE
00084h C5                               PUSH      BC
00085h 21FF17                           LD        HL,BRAM_END    ;17FFh
00088h 11FE17                           LD        DE,BRAM_END-1  ;17FE
0008Bh 01FF07                           LD        BC,BRAM_SIZE   ; 07FF
0008Eh 3620                             LD        (HL),20H
00090h EDB8                             LDDR      
00092h 22FE1F                           LD        (CURS),HL
00095h C1                               POP       BC
00096h D1                               POP       DE
00097h E1                               POP       HL
00098h C9                               RET      
00099h                                                           ;-------------Zeitschleife--------------
00099h E5         ZS:                   PUSH      HL
0009Ah F5                               PUSH      AF
0009Bh 21FC1F                           LD        HL,RAMZK
0009Eh 2B         ZS1:                  DEC       HL
0009Fh 7C                               LD        A,H
000A0h B5                               OR        L
000A1h 20FB                             JR        NZ,ZS1
000A3h F1                               POP       AF
000A4h E1                               POP       HL
000A5h C9                               RET      
000A6h                                  END



Grüße Andy

Dieser Beitrag wurde am 04.02.2018 um 21:15 Uhr von andy62 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
04.02.2018, 20:36 Uhr
Heiko_P



Hallo Andy,

das Listing in (000) stimmt mit dem .BIN-File nicht überein. Das Listing in (003) sieht auf den ersten Blick in Ordnung aus, bitte stell mal das erzeugte .BIN-File dazu. Dein RAM beginnt bei 1800h und geht bis 1FFFh?

Gruß
Heiko
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
04.02.2018, 20:39 Uhr
holm

Avatar von holm

Mach mal schrittweise Andy. Ich kenne die HW des AC1 nicht..geht Dein RAM?

Für das Löschen des Bildschirms brauchst Du erst mal keinen Stack und keine initialisierte PIO.
Mach das BS-Löschen mal ohne den anderen Kram drumherum, also direkt HL,DE,BC laden und die LDDR Geschichte. PUSH und POP kannst Du Dir an der Stelle auch kneifen, weil es simpel noch nichts zu retten gibt. danach simpel einen JR auf sich selbst als ende. Probiere ob das läuft.

Gruß,

Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
04.02.2018, 20:45 Uhr
ambrosius



... da waren Heiko und Holm schneller, siehe mein edit2, hätte es gleich als neuen Post schreiben sollen. Die Routinen an sich sehen in Ordnung aus, falls die Adressen stimmen.
--
Viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
04.02.2018, 21:02 Uhr
Heiko_P



@Holger: Der ASIDE braucht für EQU diese Schreibweise mit den Doppelpunkten.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
04.02.2018, 21:08 Uhr
ambrosius



@Heiko_P Ach so, ich kenne den Aside nicht. Wie werden dann aber Label/Sprungmarken unterschieden? Oder erkennt der Assembler das dann am 'EQU'? Weil bei der Disassemblierung seines bin-Files ja etwas komplett anderes als der Quellcoder herauskommt.
--
Viele Grüße
Holger
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
04.02.2018, 21:28 Uhr
Wusel_1



INIT_PIO ist falsch

LD A,80H ;PB0-4 = Eingang, PB5-7 = Ausgang

Damit ist PIO B0 - 6 Out und Pio B7 In

Richtig ist:

LD A,1FH ;PB0-4 = Eingang, PB5-7 = Ausgang


Löschprogramm müsste eigentlich laufen.
--
Beste Grüße Andreas
______________________________________
DL9UNF ex Y22MF es Y35ZF
JO42VP - DOK: Y43 - LDK: CE

*** wer glaubt, hört auf zu denken ***

Dieser Beitrag wurde am 04.02.2018 um 21:33 Uhr von Wusel_1 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
04.02.2018, 21:40 Uhr
andy62



Hallo,
danke für eure Hilfe.
Aber das Problem saß mal wieder vor dem Bildschirm.
Meine AC Karte hat die Tastaturplatine als Huckepack oben drauf.
Durch das Ziehen der 64k RAM Karte habe ich die Huckepackplatine auf sie Sub- D Buchse der CTC Ausgänge gedrückt. Da gab s irgendwo einen Schluß.
Jetzt funktioniert der Quellcode.
@Andreas
Die PIO habe ich noch nicht in Verwendung. Da habe ich das noch nicht bemerkt.
Danke für die Korrektur.
Tut mir Leid eure Zeit verschwendet zu haben. Aber ich probiere auch schon den ganzen Tag.
Danke nochmals an alle
Grüße Andy
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek