NKC Forum
Registrieren | FAQ | Suche | Wer ist online? | Mitgliederliste | Heutige Beiträge | Einloggen



Autor Thema: Programmierproblem
cerker68k
Kennt sich schon aus
**
ID # 37



264-610-044
  Erstellt am 11. November 2005 20:28 (#1)  |  Zitat Zitat   PN PN   E-Mail E-Mail
Darf ich euch mal kurz belästigen?

Die BCLRs auf den VIA sind dazu da LEDs abzuschalten, ist meine Dianose :D

Daraus sehe ich der kommt aus "WAITTIME" nicht mehr zurück. Warum? Fehler an dem Stack? Eigentlich liegt von 0000 - 8000 ein gültiges RAM, ich habe eine Funktion die erst das Zeug aus dem EPROM ins RAM kopiert und dort ausführt, die TRAP-Routine bleibt im EPROM.

Ist ein Einplatinencomputer, bei dem EPROM erst auf 40000 UND 00000 ist, nach einem beliebigen Zugriff auf 70000 wird von 0000-8000 das RAM eingeblendet.

Leider ists hier nicht so einfach ein Listing einzufügen, auch mit CODE sind alle TABs weg.

Ich hoffe man kann das trotzdem lesen, ansonsten schick ich gerne eine Textdatei per Mail..




* Program Name : Testprogramm Displayausgabe
* Author : Christian Erker
* Date : 11.11.2005
* Time : 17:10:00
* Dieses Programm testet die Displayausgabe

* Adresstabelle

RAMSTARTEQU $00000 Startadresse des Systemrams (32 KB)
STACKUPEQU $06000 Obere Grenze des Stacks
ROMSTARTEQU $40000 Startadresse des EPROMs
PROGSTARTEQU $01000 Startadresse des Programms im RAM
VARSTARTEQU $00400 Startadresse des Bereichs für Systemvariablen
VIA_6522EQU $50020 Startadresse des VIA-Chips
ACIA_6850EQU $50010 Startadresse des ACIA-Chips
LCD_DATAEQU $60000 Latch 1 für LCD-Daten
LCD_CTRLEQU $70000 Latch 2 für LCD-Steuersignale (Bit 7 = E, Bit 0 = RS)
STAFLIFLEQU $70000Start-FlipFlop

ACIA_datEQU ACIA_6850+0 Datenregister
ACIA_staEQU ACIA_6850+1 Statusregister
ACIA_comEQU ACIA_6850+2 Befehlsregister
ACIA_conEQU ACIA_6850+3 Steuerregister

VIA_da_BEQU VIA_6522+$0 Datenregister Port B
VIA_da_AEQU VIA_6522+$1 Datenregister Port A
VIA_di_BEQU VIA_6522+$2 Datenrichtung Port B
VIA_di_AEQU VIA_6522+$3 Datenrichtung Port A
VIA_T1_LEQU VIA_6522+$4 Timer 1 niederwertig
VIA_T1_HEQU VIA_6522+$5 Timer 1 höherwertig
VIA_L1_LEQU VIA_6522+$6 Timer Latches 1 niederwertig
VIA_L1_HEQU VIA_6522+$7 Timer Latches 1 höherwertig
VIA_T2_LEQU VIA_6522+$8 Timer 2 niederwertig
VIA_T2_HEQU VIA_6522+$9 Timer 2 höherwertig
VIA_SREQU VIA_6522+$A VIA-Statusregister
VIA_ACREQU VIA_6522+$B Auxilary Control Register
VIA_PCREQU VIA_6522+$C Peripheral Control Register
VIA_IFREQU VIA_6522+$D Interrupt Flag Register
VIA_IEREQU VIA_6522+$E Interrupt Enable Register
VIA_IOBEQU VIA_6522+$F IOB

*Vektortabelle

ORG $0 Startadresse der Vektortabelle

VECT_SSPDC.L STACKUP Definiere Startadresse des Stacks
VECT_PCDC.L LOADER+$40000 Beginne Programmausführung mit Loader
VEC_BERRDC.L 0 Platzhalter für BERR-Exception
VECT_AERDC.L 0 Platzhalter für Adressfehlerbehandlung
VEC_ILINDC.L 0 Platzhalter für Befehlsfehlerbehandlung
VEC_DIVZDC.L 0 " Divison durch Null
VECT_CHKDC.L 0 " CHK-Befehl
VEC_TRAVDC.L 0 " TRAP-V Befehl
VEC_PRIVDC.L 0 " Privilegverletzung
VEC_TRCEDC.L 0 " Einzelschrittmodus
VEC_1010 DC.L 0 " Befehlcodeemulator für Axxx
VEC_1111DC.L 0 " "Fxxx
VEC_RES1DS.L 3 3x32 bit freihalten
VEC_NINTDC.L 0 Platzhalter für nicht initialiesierten Interrupt
VEC_RES2DS.L 8 8x32 bit freihalten
VEC_WINTDC.L 0 Platzhalter für falschen Interrupt
VEC_AIN1DC.L 0 " Interrupt 1 (nicht bei 68008)
VEC_AIN2DC.L 0 " Interrupt 2 (ACIA)
VEC_AIN3DC.L 0 " Interrupt 3 (nicht bei 68008)
VEC_AIN4DC.L 0 " Interrupt 4 (nicht bei 68008)
VEC_AIN5DC.L 0 " Interrupt 5 (VIA)
VEC_AIN6DC.L 0 " Interrupt 6 (nicht bei 68008)
VEC_AIN7DC.L 0 " Interrupt 7 (NMI)
VEC_TRA0 DC.L LCDROUTS+$40000 " Softwareinterrupt (TRAP) 0:LCD-Kontrolle
VEC_TRA1 DC.L 0 " Softwareinterrupt (TRAP) 1
VEC_TRA2 DC.L 0 " Softwareinterrupt (TRAP) 2
VEC_TRA3 DC.L 0 " Softwareinterrupt (TRAP) 3
VEC_TRA4 DC.L 0 " Softwareinterrupt (TRAP) 4
VEC_TRA5 DC.L 0 " Softwareinterrupt (TRAP) 5
VEC_TRA6 DC.L 0 " Softwareinterrupt (TRAP) 6
VEC_TRA7 DC.L 0 " Softwareinterrupt (TRAP) 7
VEC_TRA8 DC.L 0 " Softwareinterrupt (TRAP) 8
VEC_TRA9 DC.L 0 " Softwareinterrupt (TRAP) 9
VEC_TRAA DC.L 0 " Softwareinterrupt (TRAP) 10
VEC_TRAB DC.L 0 " Softwareinterrupt (TRAP) 11
VEC_TRAC DC.L 0 " Softwareinterrupt (TRAP) 12
VEC_TRAD DC.L 0 " Softwareinterrupt (TRAP) 13
VEC_TRAE DC.L 0 " Softwareinterrupt (TRAP) 14
VEC_TRAF DC.L 0 " Softwareinterrupt (TRAP) 15
VEC_RES3DS.L 16 16x32 bit freihalten
VEC_USIDS.L 192 192 Autovektorinterrupts


* Hauptprogramm
* ==============

ORG $1000 Startadresse des Programms

MAINMOVE.B #$FF,VIA_da_B Testanzeige
MOVE.B #1,D0 Nummer 1 = LCD_Init
TRAP #0
BCLR #0,VIA_da_B
MOVE.B #2,D0 Nummer 2 = Zeichen ausgeben
MOVE.B #'H',D1 Zeichen H
TRAP #0
BCLR #1,VIA_da_B
MOVE.B #2,D0 Nummer 2 = Zeichen ausgeben
MOVE.B #'a',D1 Zeichen a
TRAP #0
BCLR #2,VIA_da_B
MOVE.B #2,D0 Nummer 2 = Zeichen ausgeben
MOVE.B #'l',D1 Zeichen l
TRAP #0
BCLR #3,VIA_da_B
MOVE.B #2,D0 Nummer 2 = Zeichen ausgeben
MOVE.B #'l',D1 Zeichen l
TRAP #0
MOVE.B #2,D0 Nummer 2 = Zeichen ausgeben
MOVE.B #'o',D1 Zeichen o
TRAP #0
STOP #$2700 Stop the program

*Unterprogramme
*==============

LOADERMOVE.B #$FF,VIA_di_B Alles am VIa auf Ausgang
MOVE.B #$00,VIA_da_B Alle LEDs an Port B aus
TST.B STAFLIFLKippe Start-FlipFlop
LEA ROMSTART,A0 Lade EPROM-Adresse in A0
LEA RAMSTART,A1 Lade RAM-Adresse in A1
MOVE.L #$7FFE,D0 Es sind 32 KB zu kopieren
LOOP1MOVE.B (A0)+,(A1)+ Kopiere ein Byte
MOVE.W D0,D1 Kopiere den Schleifenzähler
ROR.W #8,D1 Rotiere ihn nach rechts
MOVE.B D1,VIA_da_B Und zeige den Stand auf den LEDs
DBRA D0,LOOP1wiederhole bis alles kopiert ist
JSR MAIN und springe Hauptprogamm an
STOP #$2700

*Systemroutinen
*==============

ORG $8000

LCDROUTSMOVE.L D7,-(A7) Register auf den Stack retten
CMP.B #1,D0 D0 = 1:
BEQ LCD_INIT LCD_DISPLAY initialiesieren
CMP.B #2,D0 D0 = 2:
BEQ PUT_CHAR Zeichen setzen
BCLR #6,VIA_da_B
BRA RETURNT0 Wenn kein gültige Funktion, tue nichts
LCD_INITBCLR #7,VIA_da_B
MOVE.L #2,D7 Initialisierung muss 3 mal durchlaufen werden
LOOP2MOVE.L #$7FFF,D0Lange
BSR WAITTIMEwarten
MOVE.B #$80,LCD_CTRL E auf High, RS auf Low
MOVE.B #$30,LCD_DATA Befehl für Init
MOVE.L #$7FFF,D0Lange
BSR WAITTIMEwarten
MOVE.B #$00,LCD_CTRL E auf Low, RS auf Low
DBRA D7,LOOP2wiederholen
MOVE.B #$38,D0 2 Zeilen, 5x7 Matrix
BSR LCD_INST
MOVE.B #$01,D0 CLS
BSR LCD_INST
MOVE.B #$06,D0 Entrymode setzen
BSR LCD_INST
MOVE.B #$0D,D0 Display an
BSR LCD_INST
MOVE.B #$02,D0 Return Home
BSR LCD_INST
BRA RETURNT0
PUT_CHARMOVE.B D1,D0 Kopiere Zeichen ins Übergaberegister
BSR LCD_DATW Schreibe es auf das Display
RETURNT0MOVE.L (A7)+,D7 Register zurückholen
BCLR #4,VIA_da_B
RTE Zurück ins Hauptprogramm

WAITTIMEBCLR #5,VIA_da_B
LOOPNOP
DBRA D0,LOOP Zähle Schleifenzähler herunter
RTS

LCD_INSTMOVE.L D1,-(A7) rette Register
MOVE.B D0,D1 sichere Befehl
MOVE.B #$80,LCD_CTRL E auf High, RS auf Low
MOVE.B D1,LCD_DATA Befehl auf den Bus legen
MOVE.L $FF,D0
BSR WAITTIMEE-Takt verlängern
MOVE.B #$00,LCD_CTRL E wegnehmen
MOVE.L $FF,D0 Display Zeit zum übernehmen geben
BSR WAITTIME
MOVE.B #$00,LCD_DATA Daten vom Bus nehmen
MOVE.L (A7)+,D1 Register zurückholen
RTS

LCD_DATWMOVE.L D1,-(A7) rette Register
MOVE.B D0,D1 sichere Befehl
MOVE.B #$81,LCD_CTRL E auf High, RS auf High
MOVE.B D1,LCD_DATA Befehl auf den Bus legen
MOVE.L $FF,D0
BSR WAITTIMEE-Takt verlängern
MOVE.B #$01,LCD_CTRL E wegnehmen
MOVE.L $FF,D0 Display Zeit zum übernehmen geben
BSR WAITTIME
MOVE.B #$00,LCD_DATA Daten vom Bus nehmen
MOVE.L (A7)+,D1 Register zurückholen
RTS


END $1000 End of assembly

Beiträge: 62 | Mitglied seit: November 2005 | IP-Adresse: gespeichert
DerInder
Voll in Gange
Seitenadmins
***
ID # 2


  Erstellt am 14. November 2005 09:18 (#2)  |  Zitat Zitat   PN PN   E-Mail E-Mail
Hallo Christian,
mit solchen Sachen werd ich ganz gerne mal belästigt :D
Nachdem ich das Progrämmchen erstmal in "lesbare" Form gebracht habe (dein Hinweis mit der Mail hab ich erst danach gesehen) sind mir 2 Sachen aufgefallen die ich etwas seltsam finde.
Du initialisierst VECT_PC und VEC_TRA0 auf LOADER+$40000 bzw. LCDROUTS+$40000. Ich hab es aber eigentlich so verstanden, dass ab $40000 das EPROM liegt??? Eigentlich würde ich denken, dass LOADER auf $1000 + LOADER Offset liegt und LCDROUTS auf $8000.
Ach ja, ich würde den Ansprung von MAIN aus dem LOADER lieber mit einem BRA oder JMP machen (nicht JSR), dabei wird der Stack nicht beeinflusst und du beendest das MAIN ja per STOP.
Ansonsten sieht das Programm sehr gut aus.
Bei welchen Aufruf von WAITTIME kehrt es nicht mehr zurück?

-----------------------
Gruß
-=jens=-

Beiträge: 642 | Mitglied seit: Juni 2004 | IP-Adresse: gespeichert
DerInder
Voll in Gange
Seitenadmins
***
ID # 2


  Erstellt am 14. November 2005 09:28 (#3)  |  Zitat Zitat   PN PN   E-Mail E-Mail
Ich nochmal,
in deiner LCD_INST Routine lädst du D0 vor dem WAITTIME Aufruf mit $FF statt #$FF (was da wohl auf der Adresse $FF steht??). Ich tipp mal das ist der Fehler. Die anderen Sachen würden mich aber auch noch mal interessieren :)

-----------------------
Gruß
-=jens=-

Beiträge: 642 | Mitglied seit: Juni 2004 | IP-Adresse: gespeichert
cerker68k
Kennt sich schon aus
**
ID # 37



264-610-044
  Erstellt am 14. November 2005 17:38 (#4)  |  Zitat Zitat   PN PN   E-Mail E-Mail
Das EPROM liegt beim Start auf 40000, dann wird das Programm ins RAM kopiert und auf $1000 angesprungen, JSR hab ich probiert, der bleibt am ersten Aufruf von WAITTIME hängen. Ich habe das Programm auf der anderen Platte, aber ich denke den Fehler mit der Konstante habe ich schon beseitigt. Ich muss gleich nochmal auf das andere OS gehen und dann nochmal nachsehen. Vielleicht war ich nur Blind :D

Beiträge: 62 | Mitglied seit: November 2005 | IP-Adresse: gespeichert
cerker68k
Kennt sich schon aus
**
ID # 37



264-610-044
  Erstellt am 14. November 2005 18:12 (#5)  |  Zitat Zitat   PN PN   E-Mail E-Mail
Ich muss blind gewesen sein. $FF ist ein leerer Platz in der Vektortabelle und enthält daher 00 .. dadurch lief das Programm zwar aber die "E"-Impulse für das Display waren so kurz das es nicht mitkam.

Zu den Adressen, das Programm ist ja mit ORG $0 begonnen. Das EPROM liegt beim RESET auf $00000 UND $40000. Dann wird "LOADER" im oberen Adressbereich des EPROMs gestartet und der untere abgeschaltet. Da liegt dann ein RAM, dann kopiert sich das Programm inkl. Vektortabelle selbst ins RAM, was nicht unbedingt nötig ist aber ja bei späteren Anwendungen gebraucht wird. Die TRAPs usw. bleiben aber im EPROM, da sie in den oberen 32 KB liegen (ORG $8000), die nicht kopiert werden (es ist ein 43256 auf der Platine), daher der Offset +$40000 .. ich hätte natürlich auch +ROMSTART schreiben können, dann wäre es ev. einleuchtender gewesen.

Beiträge: 62 | Mitglied seit: November 2005 | IP-Adresse: gespeichert
DerInder
Voll in Gange
Seitenadmins
***
ID # 2


  Erstellt am 15. November 2005 07:22 (#6)  |  Zitat Zitat   PN PN   E-Mail E-Mail
Und läufts jetzt??

OK mit den Traps ins EPROM macht Sinn. Mir war aus deinem Programm nur nich klar geworden, dass LOADER und Co. Routinen im EPROM sind.

-----------------------
Gruß
-=jens=-

Beiträge: 642 | Mitglied seit: Juni 2004 | IP-Adresse: gespeichert
cerker68k
Kennt sich schon aus
**
ID # 37



264-610-044
  Erstellt am 15. November 2005 12:52 (#7)  |  Zitat Zitat   PN PN   E-Mail E-Mail
Ja jetzt geht alles wie es soll ... jetzt heisst es weitermachen das auch CR, Cursorpostionierung usw. geht.

Demnächst hab ich ja auch nen Taschenrechner mit 68000er CPU :D

Beiträge: 62 | Mitglied seit: November 2005 | IP-Adresse: gespeichert



| NDR Computer | Boardregeln


Tritanium Bulletin Board 1.6
© 2010–2016 Tritanium Scripts


Seite in 0,053729 Sekunden erstellt
17 Dateien verarbeitet
gzip Komprimierung ausgeschaltet
1585,85 KiB Speichernutzung