
 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 (BASIC-Interpreter) nicht benutzt.

 Die Liste enthaelt alle Adressen auf die entweder direkt oder per Index-
 Register lesend oder schreibend zugegriffen wird. Eventuell werden
 zusaetzliche Adressen ueber die Pseudo-Adressierungsbefehle angesprochen.


 REGISTER-BEREICH
 ================

 Ports 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 ist leuchtet die RUN-LED
 $00 #3  = wenn Bit geloescht ist leuchtet die ACTIVE-LED
 $00 #4  = wenn Bit geloescht ist leuchtet die DCF-OK-LED
 $00 #5  = hiermit kann der START-Jumper abgefragt werden
 $00 #6  = hiermit wird RTS gesetzt
 $00 #7  = hiermit kann CTS abgefragt werden

 $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) = 9600 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) = 9600 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 geholt
           und anschliessend $93-$9e nach $91-$9c kopiert

 $9f:$a0 = 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 uebertragene Word
 $d7     = letztes gelesene Byte 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 zum EEPROM uebertragene 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 = STACK-BEREICH (eigentlich $c0-$ff, mindestens $ed-$ff benutzt)


 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


 -----------------------------------------------------------------------------


 AUSGABE VON IDI05.EXE
 =====================

 Maschinencodebereich:
 (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 der Prozeduren, Quellen: Interrupts und Sprungtabellen)

 $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 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:

 $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:
 (alle Bits die in der in Klammern stehenden Bitmaske gesetzt sind)

 $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 in die Zeropage (an Adresse $0) von Adresse $20F.
 Sprung in die Zeropage (an Adresse $51) von Adresse $268.
 Sprung zur Subroutine in der Zeropage (an Adresse $50) von Adresse $294.

 Um die Adressierungmodi des MC68HC05 zu erweitern benutzt das Betriebs-
 system kleine Maschinencode-Programme in der Zeropage:

 Sprung in die Zeropage (an Adresse $DD) von Adresse $1CE1, ok.
 Sprung in die Zeropage (an Adresse $DD) von Adresse $1CC7.
 Sprung in die Zeropage (an Adresse $DD) von Adresse $1D04.
 Sprung zur Subroutine in der Zeropage (an Adresse $BD) von Adresse $1711.
 Sprung zur Subroutine in der Zeropage (an Adresse $DD) von Adresse $1CEB.
 Sprung zur Subroutine in der Zeropage (an Adresse $DD) von Adresse $1CF5.
 Sprung zur Subroutine in der Zeropage (an Adresse $DD) von Adresse $1CBB.
 Sprung zur Subroutine in der Zeropage (an Adresse $DD) von Adresse $1CCD.
 Sprung zur Subroutine in der Zeropage (an Adresse $DD) von Adresse $1CD6.
 Sprung zur Subroutine in der Zeropage (an Adresse $DD) von Adresse $1CA6.
 Sprung zur Subroutine in der Zeropage (an Adresse $DD) von Adresse $1CB0.

 Es besteht die Moeglichkeit, eigene Maschinensprache-Interruptroutinen
 zu benutzen:

 Sprung mit Index zur Subroutine an Adresse $100+x von Adresse $1D2B, ok.
 Sprung mit Index zur Subroutine an Adresse $100+x von Adresse $1D3A, ok.
 Sprung mit Index zur Subroutine an Adresse $100+x von Adresse $1D64, ok.
 Sprung mit Index zur Subroutine an Adresse $100+x von Adresse $1D1A, ok.

