UEBERSICHT UEBER DIE BELEGUNG DES SPEICHERS BEIM C-CONTROL/BASIC-CHIP ===================================================================== Um die Arbeitsweise der verschiedenen Betriebssystemroutinen besser nach- vollziehen zu koennen folgt eine detaillierte Beschreibung der Belegung des Speichers. Die Liste beginnt bei Adresse 0 und endet an der letzten vom Mikrokontroller ansprechbaren Adresse $1fff (8191). Wenn hinter einer Adresse oder einem Port "nicht benutzt" steht, wird das entsprechende Register oder der Inhalt des entsprechenden Speicherbereichs innerhalb des Betriebssystems (bzw. BASIC-Interpreter) nicht benutzt. Die Liste enthaelt die Adressen aller Daten auf die entweder direkt, per Index-Register oder ueber die Pseudo-Adressierungsbefehle lesend oder schreibend zugegriffen wird. REGISTER-BEREICH ================ Ports und Register eines MC68HC05B6 und deren Bedeutung im CCBASIC-Chip $00 = PORTA (Port A data register) $00 #0 = SDA (Datenleitung des I2C Bus) $00 #1 = SCL (Clockleitung des I2C Bus) $00 #2 = wenn Bit geloescht wird leuchtet die RUN-LED $00 #3 = wenn Bit geloescht wird leuchtet die ACTIVE-LED $00 #4 = wenn Bit geloescht wird leuchtet die DCF-OK-LED $00 #5 = hiermit kann der START-Jumper abgefragt werden $00 #6 = hiermit wird RTS gesetzt (ist LOW-aktiv) $00 #7 = hiermit kann CTS abgefragt werden (dito) $01 = PORTB (Port B data register) $02 = PORTC (Port C data register) $03 = PORTD (Port D input data register) $04 = DDRA (Port A data direction register) $05 = DDRB (Port B data direction register) $06 = DDRC (Port C data direction register) $07 = EEPROM/ECLK control register $07 #0 = E1PGM (EEPROM charge pump enable/disable) $07 #1 = E1LAT (EEPROM programming latch enable bit) $07 #2 = E1ERA (EEPROM erase/programming bit) $07 #3 = ECLK (External clock output bit), nicht benutzt $07 #4 = reserviert $07 #5 = reserviert $07 #6 = reserviert $07 #7 = reserviert $08 = A/D data register $09 = A/D status/control register $09 #0 = CH0 \ $09 #1 = CH1 \ Select A/D channel 0-7 $09 #2 = CH2 / (or VRH, (VRH+VRL)/2, VRL for test purpose) $09 #3 = CH3 / $09 #4 = reserviert $09 #5 = ADON (A/D converter on) $09 #6 = ADRC (A/D RC oscillator control) $09 #7 = COCO (Conversion complete flag) $0a = Pulse length modulation A data register $0b = Pulse length modulation B data register $0c = Miscellaneous register $0c #0 = WDOG (enable Watchdog; cannot be disabled by software) $0c #1 = SM, wenn Bit gesetzt ist, wird der Takt auf 1/16 reduziert $0c #2 = SFB (Slow or fast mode selection for PLMB) $0c #3 = SFA (Slow or fast mode selection for PLMA) $0c #4 = INTE (External interrupt enable) $0c #5 = INTN \ External interrupt sensitivity options $0c #6 = INTP / INTN=1 & INTP=0 -> Negative edge only $0c #7 = POR (to distinguish between a power-on and an external reset) $0d = BAUD (SCI baud rate register) $0d #0 = SCR0 \ SCI rate select bits (receiver) $0d #1 = SCR1 > SCR0=0, SCR1=0 & SCR2=0 -> NR=1 $0d #2 = SCR2 / baudRX = 2000000/(16*NP*NR) = 9615.4 baud $0d #3 = SCT0 \ SCI rate select bits (transmitter) $0d #4 = SCT1 > SCT0=0, SCT1=0 & SCT2=0 -> NT=1 $0d #5 = SCT2 / baudTX = 2000000/(16*NP*NT) = 9615.4 baud $0d #6 = SCP0 \ Serial prescaler select bits (Prescaler division ratio) $0d #7 = SCP1 / SCP1=1 & SP0=1 -> NP=13 $0e = SCCR1 (SCI control register 1) $0e #0 = LBCL (Last bit clock) $0e #1 = CPHA (Clock phase) $0e #2 = CPOL (Clock polarity) $0e #3 = WAKE (Wake-up mode select) $0e #4 = M (Mode, select character format) $0e #5 = reserviert $0e #6 = T8 (Transmit data bit 8) $0e #7 = R8 (Receive data bit 8) $0f = SCCR2 (SCI control register 2) $0f #0 = SBK (Send break) $0f #1 = RWU (Receiver wake-up) $0f #2 = RE (Receiver enable) $0f #3 = TE (Transmitter enable) $0f #4 = ILIE (Idle line interrupt enable) $0f #5 = RIE (Receiver interrupt enable) $0f #6 = TCIE (Transmit complete interrupt enable) $0f #7 = TIE (Transmit interrupt enable) $10 = SCSR (SCI status register) $10 #0 = reserviert $10 #1 = FE (Framing error flag) $10 #2 = NF (Noise error flag) $10 #3 = OR (Overrun error flag) $10 #4 = IDLE (Idle line detected flag) $10 #5 = RDRF (Receive data register full flag) $10 #6 = TC (Transmit complete flag) $10 #7 = TDRE (Transmit data register empty flag) $11 = SCDR (SCI data register) $12 = TCR (Timer control register) $12 #0 = OLVL1 (Output level 1) $12 #1 = IEDG1 (Input edge 1) $12 #2 = OLVL2 (Output level 2) $12 #3 = FOLV1 (Force output compare 1) $12 #4 = FOLV2 (Force output compare 2) $12 #5 = TOIE (Timer overflow interrupt enable) $12 #6 = OCIE (Output compares interrupt enable) $12 #7 = ICIE (Input captures interrupt enable) $13 = TSR (Timer status register) $13 #0 = reserviert $13 #1 = reserviert $13 #2 = reserviert $13 #3 = OCF2 (Output compare flag 2) $13 #4 = ICF2 (Input capture flag 2) $13 #5 = TOF (Timer overflow status flag) $13 #6 = OCF1 (Output compare flag 1) $13 #7 = ICF1 (Input capture flag 1) $14:$15 = ICR1 (Input capture register 1) $16:$17 = OCR1 (Output compare register 1) $18:$19 = TR (Timer counter register) $1a:$1b = ATR (Alternate timer counter register) $1c:$1d = ICR2 (Input capture register 2) $1e:$1f = OCR2 (Output compare register 2) ZWISCHENBEREICH =============== Im Bereich von Adresse $20 bis $4f liegt das sogenannte "Page 0 User ROM". Dieser Bereich haette von Conrad Electronic beschrieben werden koennen, ist aber leer. $20-$4f = Page 0 User ROM RAM-BELEGUNG ============ Das RAM liegt beim MC68HC06B6 im Bereich von Adresse $50 bis $ff. Davon wird der Bereich von $c0 bis $ff vom Hardwarestack benutzt (beim CCBASIC- Chip bleibt fuer den Stack etwas weniger Platz). Es folgt die Belegung des RAMs durch den CCBASIC-Interpreter. $50 = IRQPTR (Userpointer fuer IRQ-Interrupt) $51 = CAPPTR (Userpointer fuer TIMERCAP-Interrupt) $52 = CMPPTR (Userpointer fuer TIMERCMP-Interrupt) $53 = OFLPTR (Userpointer fuer TIMEROFL-Interrupt) $54-$59 = temporaer, fuer verschiedene Aufgaben $5a = das letzte ausgefuehrte Basic-Token (Byte wird nur beschrieben) $5b-$62 = Ringbuffer der seriellen Schnittstelle (RS232), 8 Byte lang $63 = Anzahl der Bytes die noch aus dem Buffer gelesen werden koennen $64 = Pointer auf das naechste zu lesende Byte im Ringbuffer der RS232 $65 = Pointer auf den naechsten freien Platz im Ringbuffer der RS232 falls Buffer leer ist, ist $63 gleich null und $64 gleich $65 $66:$67 = entspricht der EEPROM-Adresse auf die beim naechsten sequentiel- len Zugriff zugegriffen wird (z.B. BASIC-Programmzaehler) $68:$69 = Millisekundenzaehler der Uhr, nur von TIMERCMP benutzt $6a = DAY $6b = DOW $6c = Zaehler fuer aktuelle DCF77-Bitmarke, nur von TIMERCAP benutzt $6d:$6e = Zaehler fuer die Zeit, die seit der letzten Zustandsaenderung des DCF77-Signals vergangen ist, von TIMERCAP und TIMERCMP benutzt $6f = Buffer fuer neues DCF77-Kalenderjahr, nur von TIMERCAP benutzt $70 = Buffer fuer neuen DCF77-Kalendermonat, nur von TIMERCAP benutzt $71 = Buffer fuer neuen DCF77-Kalendertag, nur von TIMERCAP benutzt $72 = Buffer fuer neuen DCF77-Wochentag, nur von TIMERCAP benutzt $73 = Buffer fuer neue DCF77-Stunden, nur von TIMERCAP benutzt $74 = Buffer fuer neue DCF77-Minuten, nur von TIMERCAP benutzt $75 = Buffer fuer letztes DCF77-Kalenderjahr, nur von TIMERCAP benutzt $76 = Buffer fuer letzten DCF77-Kalendermonat, nur von TIMERCAP benutzt $77 = Buffer fuer letzten DCF77-Kalendertag, nur von TIMERCAP benutzt $78 = Buffer fuer letzten DCF77-Wochentag, nur von TIMERCAP benutzt $79 = Buffer fuer letzte DCF77-Stunden, nur von TIMERCAP benutzt $7a = Buffer fuer letzte DCF77-Minuten, nur von TIMERCAP benutzt $7b = allgemeines Statusregister des CCBASIC-Interpreters $7b #0 = Bit ist high wenn ein gueltiges DCF77-Signal empfangen wird $7b #1 = Bit ist waehrend der BASIC-Programmausfuehrung high $7b #2 = nicht benutzt $7b #3 = nicht benutzt $7b #4 = Bit ist high wenn die Systemzeit von aussen (ueber DCF77 oder die serielle Schnittstelle) wenigstens einmal gestellt wurde $7b #5 = Bit ist im SLOWMODE (interner Takt auf 1/16 reduziert) high $7b #6 = Bit ist der Marker fuer den CCBASIC-Interpreter, dass die BASIC- IRQ-Interruptroutine aufgerufen werden soll $7b #7 = Bit legt fest, ob RTS & CTS benutzt oder ignoriert werden (wird aber bisher kaum abgefragt) $7c:$7d = FREQ1 $7e:$7f = FREQ2 $80 = HOUR $81 = MINUTE $82 = MONTH $83:$84 = zum Zwischenspeichern von Rechenergebnissen (OCR1 & OCR2 laden), von TIMERCMP- & TIMERCAP-Interrupt und BEEP benutzt $85:$86 = Buffer fuer FREQ1, nur von TIMERCMP- & TIMERCAP-Interrupt benutzt $87:$88 = Buffer fuer FREQ2, nur von TIMERCMP- & TIMERCAP-Interrupt benutzt $89 = SECOND $8a:$8b = TIMER $8c:$8d = Halbe Periodendauer des BEEP-Ausgangssignals (in Prozessortakten), von TIMERCMP-Interrupt und BEEP benutzt $8e:$8f = Anzahl der Ticks die bei PAUSE noch gewartet werden, wird von TIMERCMP2 alle 20 ms um eins dekrementiert $90 = YEAR $91-$9e = Rechenstack, $91:$92 wird beim naechsten POP vom Stack gelesen und anschliessend $95-$9e nach $93-$9c kopiert $9f:$a0 = RAND-Zahl (fuer Zufallszahlengenerator) $a1-$b8 = 24 User-Bytes $b9:$ba = Adresse der BASIC-Routine die bei einem IRQ aufgerufen werden soll oder Null, wenn keine Routine aufgerufen wird $bb:$bc = Buffer fuer Aufnahme des BASIC-PCs vor Ausfuehrung einer BASIC- IRQ-Routine (zum spaeteren Restaurieren bei RETURN INTERRUPT) $bd-$bf = Code fuer Simulation eines 'jmp adr16' Befehls (fuer SYS) $c0-$c7 = GOSUB-Stack (insgesamt 4 Eintraege) $c8:$c9 = Anzahl der Bytes in der EEPROM-Datendatei $ca:$cb = aktuelle Lese- oder Schreibposition in der EEPROM-Datendatei $cc:$cd = nach dem Oeffnen die EEPROM-Anfangsadresse der EEPROM-Datendatei $ce-$d4 = temporaer, fuer verschiedene Aufgaben $d5:$d6 = letztes in die Datendatei im seriellen EEPROM uebertragenes Word $d7 = letztes gelesene Byte von der RS232, wird nur von SCI benutzt $d8 = Fehlermarker fuer RS232, wird nur vom SCI-Interrupt benutzt $d9-$da = temporaer, fuer verschiedene Aufgaben $db = temporaer, nur von SQR benutzt $dc = nicht benutzt (?) $dd-$e0 = Code zur Erweiterung der Adressmodi (Pseudo-Adressierungsmodi) $e1 = letztes ueber den I2C-Bus uebertragenes Byte $e2 = Differenz der Minutenwerte der beiden letzten empfangenen DCF77-Uhrzeiten, nur von TIMERCAP benutzt $e3 = Anzahl der Tage im aktuellen Monat (wird um Mitternacht gesetzt), nur von TIMERCMP benutzt $e4 = Zwischenspeicher zum Ermitteln eines Schaltjahres, nur von TIMERCMP benutzt $e5-$ff = HARDWARE-STACK-BEREICH (eigentlich $c0-$ff) EEPROM-BEREICH ============== $0100 = Options register (OPTR) (wird vom Self-check ROM I benutzt) $0100 #0 = SEC (Security bit) nur wenn Bit gesetzt ist kann der "test mode" gestartet werden $0100 #1 = EE1P (EEPROM protect bit) wenn Bit geloescht ist, dann sind die letzten 224 Bytes des EEPROMs gegen Ueberschreiben geschuetzt $0100 #2 = reserved $0100 #3 = reserved $0100 #4 = reserved $0100 #5 = reserved $0100 #6 = reserved $0100 #7 = reserved $0101-$011f = Non protected EEPROM $0120-$01ff = Protected EEPROM ROM-BEREICH =========== $0200-$02bf = Self-check ROM I $02c0-$07ff = unbenutztes ROM / reserviert $0800-$1eff = User ROM (CCBASIC-Interpreter, von Conrad Electronic) $1f00-$1fef = Self-Check ROM II (enthaelt am Ende vermutlich eine Sprung- tabelle, ist ansonsten aber leer) $1ff0 = COPR (COP control register) oder reserviert (?) $1ff1 = reserviert (?) $1ff2-$1fff = User vectors (Sprungtabelle zu den Interruptroutinen) BELEGUNG DES SERIELLEN EEPROMS ============================== Alle Adressen sind EEPROM-Adressen! $0000:$0001 = Groesse des BASIC-Programms in Byte $0002:$0003 = Groesse der Daten-Datei in Byte $0004 = Beginn des BASIC-Programms, dahinter folgt die Daten-Datei ----------------------------------------------------------------------------- SPEICHERBELEGUNG NACH IDI05.EXE =============================== Beim Disassemblieren des ROMs hat der Disassembler IDI05 die folgenden Bereiche gefunden. Maschinencodebereiche: (von/bis Adresse) $200-$2a9,$800-$9b4,$9b6-$9e8,$9ea-$9f6,$9f8-$a9a,$a9d-$c24,$c26-$cde, $ce0-$ce6,$ce8-$d87,$d89-$db1,$db3-$de3,$de5-$10f5,$10f7-$1118,$111a-$1265, $1267-$164f,$1651-$1aa5,$1aa7-$1d75 Prozedur-Einsprungpunkte: (Startadressen aller Prozeduren die ueber jsr, bsr, jmp oder ueber eine der beiden Sprungtabellen aufgerufen werden) $0,$50,$51,$bd,$dd,$200,$800,$811,$83c,$846,$86f,$8bb,$8e5,$8ee,$940,$98b, $9ab,$9b0,$9b6,$9ea,$9f8,$a0a,$a28,$a5c,$a7d,$a82,$a87,$a9d,$aa4,$b9f,$bca, $bff,$c26,$c49,$c63,$c74,$c77,$c7d,$cb5,$cce,$cd9,$ce0,$ce8,$d89,$d92,$db3, $de5,$e01,$e04,$e0d,$e18,$e70,$ee9,$f0d,$f45,$fce,$1040,$105b,$106a,$10f7, $110b,$1112,$111a,$1155,$115c,$1163,$116a,$1187,$11b8,$11e1,$11f3,$1226, $1235,$1246,$125c,$1267,$1273,$12a3,$12aa,$12b6,$12c3,$12d2,$12d6,$12e5, $12e9,$12f8,$1316,$1334,$1342,$1351,$1360,$137e,$139c,$13ba,$13cc,$13e8, $1442,$1468,$1484,$14a4,$14c4,$14ea,$1510,$1536,$155c,$1579,$1596,$15b7, $15b8,$15bb,$15cb,$15e0,$161f,$1628,$1631,$1640,$169d,$16a6,$170a,$1714, $1720,$172b,$1736,$1740,$174b,$1756,$1761,$176f,$177a,$1781,$1788,$178f, $1796,$17a0,$17a7,$17ae,$17b5,$17bc,$17c3,$17ca,$1806,$1881,$18d4,$18df, $18ed,$18f2,$18f9,$1900,$190e,$1915,$197c,$19d8,$19df,$19e6,$19ee,$1a0b, $1a24,$1a48,$1a69,$1a91,$1aa7,$1ad4,$1afe,$1b0f,$1b2d,$1b6b,$1b84,$1bb0, $1bb9,$1c0f,$1c1a,$1c37,$1c5d,$1c7a,$1c83,$1c8c,$1c95,$1c9e,$1ca2,$1cb5, $1cc9,$1cdb,$1ce3,$1cfc,$1d06,$1d09,$1d12,$1d15,$1d26,$1d35,$1d5f Speicherbereiche oder Portadressen aus denen byteweise gelesen wird: (ueber das Index Register oder die Pseudo-Adressierungsmodi angesprochene Adressen bleiben unberuecksichtigt) $0-$3,$8-$9,$11,$13,$15-$19,$1d-$1f,$50-$59,$63-$7a,$7c-$82,$84-$a0, $b9-$bc,$c0-$db,$de-$df,$e1-$e4,$100 Speicherbereiche oder Portadressen in die byteweise geschrieben wird: (s.o.) $1-$2,$5-$7,$9,$d-$f,$11,$13,$16-$17,$19,$1e-$1f,$50-$5a,$63-$a0,$b9-$db, $dd-$e4 Speicherbereiche oder Portadressen aus denen bitweise gelesen wird: (alle Bits die in der in Klammern stehenden Bitmaske gesetzt sind) $0 (%10000001), $9 (%10000000), $10 (%01100110), $12 (%00000111), $13 (%11000000), $56 (%10000000), $59 (%00000001), $7b (%11100001) Speicherbereiche oder Portadressen in die bitweise geschrieben wird: (s.o.) $0 (%01011111), $4 (%01011111), $7 (%00000111), $9 (%00100000), $c (%00100010), $f (%00000100), $12 (%11000111), $7b (%11110011), $dd (%00001011) Speicherbereiche die unter Zuhilfenahme des Index-Registers adressiert werden und aus denen gelesen wird: $0-$1,$5,$5b,$a1-$a2,$100,$1d76,$1dbc,$1dc1,$1dc4,$1dca,$1dd1,$1dd9,$1de1 Speicherbereiche die unter Zuhilfenahme des Index-Registers adressiert werden und in die geschrieben wird: $0-$1,$5,$a,$5b,$a1-$a2,$100-$101 FEHLER & PROBLEME BEIM DISASSEMBLIEREN: ======================================= Die folgenden Spruenge haben beim CCBASIC-Chip keine Bedeutung: Sprung an Adresse $0 des Exclude-Bereichs von Adresse $20f aus. Sprung zur Subroutine an Adr. $0 des Exclude-Bereichs von Adr. $1ffc aus. Sprung an Adresse $51 des Exclude-Bereichs von Adresse $268 aus. Sprung zur Subroutine an Adr. $50 des Exclude-Bereichs von Adr. $294 aus. Um die Adressierungmodi des MC68HC05 zu erweitern benutzt das Betriebs- system kleine Maschinencode-Programme in der Zeropage: ("Pseudo-Adressierungsmodi") Sprung zur Subroutine an Adr. $dd des Exclude-Bereichs von Adr. $1cbb aus. Sprung an Adresse $dd des Exclude-Bereichs von Adresse $1cc7 aus. (hiermit wird in die Words $9f:$a0, $cf:$d0 und $d0:$d1 geschrieben) Sprung an Adresse $dd des Exclude-Bereichs von Adresse $1ce1 aus. (zum Anspringen der BASIC-Hauptroutinen) Sprung an Adresse $dd des Exclude-Bereichs von Adresse $1d04 aus. (fuer den ASCII-Dump des internen EEPROMS) Sprung zur Subroutine an Adr. $bd des Exclude-Bereichs von Adr. $1711 aus. (zum Aufruf eines Assemblerprogramms mittels "SYS"-Befehl) Sprung zur Subroutine an Adr. $dd des Exclude-Bereichs von Adr. $1ca6 aus. Sprung zur Subroutine an Adr. $dd des Exclude-Bereichs von Adr. $1cb0 aus. (hiermit werden die Words $9f:$a0, $cf:$d0 und $d0:$d1 ausgelesen) Sprung zur Subroutine an Adr. $dd des Exclude-Bereichs von Adr. $1ccd aus. Sprung zur Subroutine an Adr. $dd des Exclude-Bereichs von Adr. $1cd6 aus. (Word aus Tabelle zum ASCII-Kodieren einer Zahl holen) Sprung zur Subroutine an Adr. $dd des Exclude-Bereichs von Adr. $1ceb aus. Sprung zur Subroutine an Adr. $dd des Exclude-Bereichs von Adr. $1cf5 aus. (zum Holen der Adressen der BASIC-Hauptroutinen aus der Sprungtabelle) Es besteht die Moeglichkeit, eigene Maschinensprache-Interruptroutinen zu benutzen: Sprung zur Subroutine an Adresse $100+x von Adresse $1d1a aus. Sprung zur Subroutine an Adresse $100+x von Adresse $1d2b aus. Sprung zur Subroutine an Adresse $100+x von Adresse $1d3a aus. Sprung zur Subroutine an Adresse $100+x von Adresse $1d64 aus. ----------------------------------------------------------------------------- Dieser Text gehoert zur Informationssammlung "C-Control intern" von Dietmar Harlos zum C-Control-Mikrokontrollersystem. Die Fehlerfreiheit der Angaben kann nicht garantiert werden. Die kommerzielle Nutzung irgendeiner Informa- tion oder eines Verfahrens dieser Sammlung ist ausdruecklich untersagt! Eine aktuelle Version dieser Sammlung kann als ZIP-Archiv im Internet unter der Adresse "http://www.geocities.com/ccontrolintern" heruntergeladen werden. Weitere Informationen zum Copyright entnehmen Sie bitte der Datei INFO.TXT. -----------------------------------------------------------------------------