NKC Forum |
Autor | Thema: Programmierproblem |
---|---|
Gelöscht Gelöscht ID # 37 |
Erstellt am 11. November 2005 20:28 (#1)
Zitat
Darf ich euch mal kurz belästigen?
Die BCLRs auf den VIA sind dazu da LEDs abzuschalten, ist meine Dianose 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 |
IP-Adresse: gespeichert | |
DerInder Fast schon Admin Seitenadmins ID # 2 |
Erstellt am 14. November 2005 09:18 (#2)
Zitat
PN E-Mail
Hallo Christian,
mit solchen Sachen werd ich ganz gerne mal belästigt 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: 912 | Mitglied seit: Juni 2004 | IP-Adresse: gespeichert | |
DerInder Fast schon Admin Seitenadmins ID # 2 |
Erstellt am 14. November 2005 09:28 (#3)
Zitat
PN 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: 912 | Mitglied seit: Juni 2004 | IP-Adresse: gespeichert | |
Gelöscht Gelöscht ID # 37 |
Erstellt am 14. November 2005 17:38 (#4)
Zitat
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
|
IP-Adresse: gespeichert | |
Gelöscht Gelöscht ID # 37 |
Erstellt am 14. November 2005 18:12 (#5)
Zitat
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. |
IP-Adresse: gespeichert | |
DerInder Fast schon Admin Seitenadmins ID # 2 |
Erstellt am 15. November 2005 07:22 (#6)
Zitat
PN 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: 912 | Mitglied seit: Juni 2004 | IP-Adresse: gespeichert | |
Gelöscht Gelöscht ID # 37 |
Erstellt am 15. November 2005 12:52 (#7)
Zitat
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 |
IP-Adresse: gespeichert |
| https://hschuetz.selfhost.eu | Boardregeln | Datenschutzerklärung
Tritanium Bulletin Board 1.8
© 2010–2021 Tritanium Scripts
Seite in 0,024706 Sekunden erstellt
19 Dateien verarbeitet
gzip Komprimierung eingeschaltet
2110,61 KiB Speichernutzung