.. vim: noexpandtab fileencoding=utf-8 nomodified wrap textwidth=270 foldmethod=marker foldmarker={{{,}}} foldcolumn=4 ruler showcmd lcs=tab\:|- list tabstop=8 noexpandtab nosmarttab softtabstop=0 shiftwidth=0 :date: 2023.11.20 03:16:08 :modified: 2023.12.07 02:50:40 :tags: 6809,OMENkilo,Castor,Pollux :authors: Gilhad :summary: Castor :title: Castor :nice_title: |logo| %title% |logo| %HEADER% Castor -------------------------------------------------------------------------------- * Rozhodl jsem se, že nový EEPROM systém pro OMEN kilo nazvu `Castor`, protože proč ne :) * A firmware pro Arduino do Expanduina pak bude `Pollux`, protože to jsou `Blíženci` * A už jsem to vypálil do EEPROM, takže z toho jde bootovat, a při startu to na Castor pošle příkaz `*BOOT`, který nahraje soubor `/BOOT.HEX` (ale AutoExec je vypnutý, takže je ho nutno spustit ručně, nebo povolit AutoExec (`a`) a on se spustí sám následně. * Jde to relokovat do RAM (`>`) a pak přehrát ROM na něco jiného (novou verzi) Memory Map -------------------------------------------------------------------------------- .. {{{ Push order for 6309 stack Push order for 6309 stack ================================================================================ .. code:: New S Old S | | | | $0000 v v $FFFF +--+- -+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---+---+--+--+--+--+- -+--+ |..|.......|..|..|CC| A| B| E| F|DP|Xh|Xl|Yh|Yl|Uh|Ul|PCh|PCl|##|##|##|..|.......|..| +--+- -+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---+---+--+--+--+--+- -+--+ |Sh|Sl| +--+--+ for PSHU ... PUSH / PULL order +-----+-----------------------------+ | CC | Condition Code Register | . | +-----+-----------------------------+ /_\ | | A | A Accumulator | | | +-----+-----------------------------+ | | | B | B Accumulator | | | +-----+-----------------------------+ | | | E | E Accumulator *) | | | +-----+-----------------------------+ | | F | F Accumulator *) | | P +-----+-----------------------------+ U | DP | Direct Page Register | P L +-----+-----------------------------+ U L | X | X Index Register | S +-----+-----------------------------+ H | | Y | Y Index Register | | +-----+-----------------------------+ | _|_ | S/U | Hardware/User Stack Pointer | | \ / +-----+-----------------------------+ | ' | PC | Program Counter | +-----+-----------------------------+ *) Only 6309 in Interrupt in NATIVE mode (MD[N]=1) .. }}} .. {{{ 6309 Interrupt vectors 6309 Interrupt vectors ================================================================================ * 6309 have hardwarde wired Interrupt vectors to go indirect via $FFF0 ... $FFFE adresses (top of ROM) * `Castor` have the values there pointing to bottom of ROM (so if wearing will be problem, this whole section can be easily moved) * on bottom of ROM are jumps into top of RAM (except RESET), where each RESET will create jumps into 2nd table in ROM which points to final ROM code. * so user program can simply install there (on top of RAM) its own routines entry points * also can simply jump to the 2nd table to get to original ROM routines * Example: * `SWI` is executed * **6309** pushes registers on S stack * jumps indirect `JMP [FFFA]` to `C008` (in **ROM**) * there is instruction `JMP [7FF3]` so it jumps indirect via **RAM** pointer * **7FF3** is in **RAM**, where `RESET` prepared pointer `C026` (but user may change this to point on his own code) * `C026` is in **ROM** again contains `JMP` to actual routine to manage `SWI 1` * the routine does something and returns with `RTI` just to instruction after the original `SWI` * `RESET` is exception, it goes from both `C000` and `C020` directly to `ROM` code and cannot be redirected * `7FFC,7FFD` is initial stack `S` value can can be used by user to reinitialise `Stack S`. Points under the RAM vectors and RAM system data. * `RESET` restores this value and stack and then pushes `C000` to stack, so return from there goes again to `RESET` .. code:: +------+-------+---------+--------------+----------------------------------+ | SVec | Hdlr | 2.table | function | Registers Auto-pushed onto stack | +------+-------+---------+--------------+----------------------------------+ | FFFE | C000 | C020 | RESET Vector | none | +------+-------+---------+--------------+----------------------------------+ | FFFC | C004 | C024 | NMI Vector | D,X,Y,U,DP,CC | +------+-------+---------+--------------+----------------------------------+ | FFFA | C008 | C028 | SWI 1 Vector | D,X,Y,U,DP,CC (masked Ints) | +------+-------+---------+--------------+----------------------------------+ | FFF8 | C00C | C02C | IRQ Vector | D,X,Y,U,DP,CC | +------+-------+---------+--------------+----------------------------------+ | FFF6 | C010 | C030 | FIRQ Vector | CC (E flag cleared) | +------+-------+---------+--------------+----------------------------------+ | FFF4 | C014 | C034 | SWI 2 Vector | D,X,Y,U,DP,CC | +------+-------+---------+--------------+----------------------------------+ | FFF2 | C018 | C038 | SWI 3 Vector | D,X,Y,U,DP,CC | +------+-------+---------+--------------+----------------------------------+ | FFF0 | C01C | C03C | Trap Vector | D,X,Y,U,DP,CC | +------+-------+---------+--------------+----------------------------------+ SVec .. System VECtor Hdlr .. HanDLeR .. }}} .. {{{ RAM Layout RAM Layout ================================================================================ .. {{{ Interrupts Interrupts ################################################################################ .. code:: +------+-------+-------------------------+----------------------------------+ | Addr | value | function | Commentary | +------+-------+-------------------------+----------------------------------+ | 7FFE | C000 | RESET Vector | just adress | +------+-------+-------------------------+----------------------------------+ | 7FFC | 7FB0 | Initial Stack | just value | +------+-------+-------------------------+----------------------------------+ | 7FFA | C020 | JMP to RESET Vector | not used by Castor | +------+-------+-------------------------+----------------------------------+ | 7FF8 | C024 | JMP to NMI Vector | D,X,Y,U,DP,CC | +------+-------+-------------------------+----------------------------------+ | 7FF6 | C028 | JMP to SWI 1 Vector | D,X,Y,U,DP,CC (masked Ints) | +------+-------+-------------------------+----------------------------------+ | 7FF4 | C02C | JMP to IRQ Vector | D,X,Y,U,DP,CC | +------+-------+-------------------------+----------------------------------+ | 7FF2 | C030 | JMP to FIRQ Vector | CC (E flag cleared) | +------+-------+-------------------------+----------------------------------+ | 7FF0 | C034 | JMP to SWI 2 Vector | D,X,Y,U,DP,CC | +------+-------+-------------------------+----------------------------------+ | 7FEE | C038 | JMP to SWI 3 Vector | D,X,Y,U,DP,CC | +------+-------+-------------------------+----------------------------------+ | 7FEC | C03C | JMP to Trap Vector | D,X,Y,U,DP,CC | +------+-------+-------------------------+----------------------------------+ .. }}} .. {{{ System RAM entry points System RAM entry points ################################################################################ .. code:: +------+-------+-------------------------+----------------------------------+ | Addr | value | function | Commentary | +------+-------+-------------------------+----------------------------------+ | 7FEA | ???? | Sys.Debug | debugger, not implemented yet | +------+-------+-------------------------+----------------------------------+ | 7FE8 | ???? | Std.DumpRegs | Dump all regs and top of stack | +------+-------+-------------------------+----------------------------------+ | 7FE6 | ???? | Sys.call.by.next.byte | * LBSR [7FE6]; FB num | +------+-------+-------------------------+----------------------------------+ | 7FE4 | ???? | Sys.call.by.stack | * PSHS num; LBSR [7FE4] | +------+-------+-------------------------+----------------------------------+ | 7FE2 | ???? | Sys.switch | A,X -> value in X | +------+-------+-------------------------+----------------------------------+ | 7FE0 | ???? | Sys.switch_JMP | A,X -> jump to X | +------+-------+-------------------------+----------------------------------+ * roughly, see System functions .. }}} .. {{{ System RAM data System RAM data ################################################################################ .. code:: +------+----+-----------------------------------------------------------------+ | 7FB0 | 0A | ScratchPad - System may write here, but otherwise free to use | +------+----+-----------------------------------------------------------------+ | 7FBA | 1 | LOOP.FastIHEX.allowed | +------+----+-----------------------------------------------------------------+ | 7FBB | 1 | LOOP.exec.allowed | +------+----+-----------------------------------------------------------------+ | 7FBC | 1 | LOOP.exec.pending | +------+----+-----------------------------------------------------------------+ | 7FBD | 1 | LOOP.exec.addr | +------+----+-----------------------------------------------------------------+ | 7FBF | 1 | EXPANDUINO.detected | +------+----+-----------------------------------------------------------------+ | 7FC0 | 1 | ALT.Read | +------+----+-----------------------------------------------------------------+ | 7FC0 | 1 | ALT.Read.Status | +------+----+-----------------------------------------------------------------+ | 7FC2 | 1 | ALT.Read.Mask | +------+----+-----------------------------------------------------------------+ | 7FC3 | 1 | ALT.Read.Data | +------+----+-----------------------------------------------------------------+ | 7FC5 | 1 | ALT.Read.Timeout | +------+----+-----------------------------------------------------------------+ | 7FC7 | 1 | ALT.Read.Config | +------+----+-----------------------------------------------------------------+ | 7FC8 | 1 | ALT.Write | +------+----+-----------------------------------------------------------------+ | 7FC8 | 1 | ALT.Write.Status | +------+----+-----------------------------------------------------------------+ | 7FCA | 1 | ALT.Write.Mask | +------+----+-----------------------------------------------------------------+ | 7FCB | 1 | ALT.Write.Data | +------+----+-----------------------------------------------------------------+ | 7FCD | 1 | ALT.Write.Timeout | +------+----+-----------------------------------------------------------------+ | 7FCF | 1 | ALT.Write.Config | +------+----+-----------------------------------------------------------------+ | 7FD0 | 1 | STD.Read | +------+----+-----------------------------------------------------------------+ | 7FD0 | 1 | STD.Read.Status | +------+----+-----------------------------------------------------------------+ | 7FD2 | 1 | STD.Read.Mask | +------+----+-----------------------------------------------------------------+ | 7FD3 | 1 | STD.Read.Data | +------+----+-----------------------------------------------------------------+ | 7FD5 | 1 | STD.Read.Timeout | +------+----+-----------------------------------------------------------------+ | 7FD7 | 1 | STD.Read.Config | +------+----+-----------------------------------------------------------------+ | 7FD8 | 1 | STD.Write | +------+----+-----------------------------------------------------------------+ | 7FD8 | 1 | STD.Write.Status | +------+----+-----------------------------------------------------------------+ | 7FDA | 1 | STD.Write.Mask | +------+----+-----------------------------------------------------------------+ | 7FDB | 1 | STD.Write.Data | +------+----+-----------------------------------------------------------------+ | 7FDD | 1 | STD.Write.Timeout | +------+----+-----------------------------------------------------------------+ | 7FDF | 1 | STD.Write.Config | +------+----+-----------------------------------------------------------------+ (I/O channels, internal switches, etc) .. }}} .. {{{ Top of Stack S Top of Stack S ################################################################################ (with return to `RESET` on its top - `C000`) .. }}} .. }}} .. {{{ ROM Layout ROM Layout ================================================================================ .. }}} .. {{{ System functions System functions ================================================================================ * `Sys.switch` ( `A,X|X` A case, X table|X value) - searches table pointed by `X` register for value in `A` register. * Table rows are 3 bytes wide (1 byte value to compare wuth `A`, 2 bytes value to return in `X`). * Table ends when two following rows have the same first byte (A), the 2 bytes of the second row are `Default` value to use, when match was not found. * Modifies only `X` register (and flags are trahed), everytime. * Fast way to select some 2 byte value from more alternatives. (or 2 byte pointer, ...) * as extremely usefull, it was made accessible directly * `Sys.switch_JMP` ( `A,X|X` A case, X table|X value, JMP X) - searches table as `Sys.switch`, jumps to address pointed by `X` * as extremely usefull, it was made accessible directly * `System Table` ( func. number, func. address ) is table of all published system function * there is not extra order, except of historical, as more functions was added * `Sys.call.by.stack` - push number of system function onto stack and call this * Example .. code:: LDA #123 ; function nubmer PSHS A ; push on stack S LDA #some_value ; LDX #a_pointer ; prepare arguments for system function JSR Sys.call.by.stack ; call the function BNE > ; do somethin else * `Sys.call.by.next.byte` - get the function number from byte just after the call (which is then skipped) * similar to `OS9` calls (and maybe later SWI2 will replace this) * Example .. code:: LDA #some_value ; LDX #a_pointer ; prepare arguments for system function JSR Sys.call.by.next.byte ; call the function FCB 123 ; function nubmer BNE > ; do somethin else * both system call are fully equivalent, use whichever you like more .. }}} .. {{{ Screenshot Screenshot -------------------------------------------------------------------------------- .. code:: --==### CASTOR ###==-- v.0.1.0-r3 / master 07.12.2023 01:44:51 Address range: C000 - D8D8 (Total 18D8 ROM) +++0000+ ## Expanduino_I v.00.00.03 (Nano Every) # Expanduino detected (Channel set to 1 ) Boot *BOOT Main Loop > ### Expanduino_I v.00.00.03 (Nano Every) > :20 2200 ################################ ;) > :20 2220 #####=########################## ;) > :20 2240 ################################ ;) > :20 2260 #######=######################## ;) > :20 2280 ################################ ;) > :20 22A0 ################################ ;) > :20 22C0 ################################ ;) > :1A 22E0 ########################## ;) > :00 2200 ;) > a Autoexec is now allowed > exec pending: Hello World! Welcome back in Loop > .. }}} .. {{{ Help Help -------------------------------------------------------------------------------- .. code:: > ? Regs: A: 3F; B: 00; CC: 51=eFhInzvC; DP: 00; X: 0B9D; Y: 03A6; S: 7FAC; U: 7FAC; W: 0000; V: 0016; PC[0BA0]: 97 20 E2 30 8D 09 3C 17 F9 98 39 17 FB 32 ^ 17 F7 0F 30 8D 09 B6 17 F9 8A 30 8D 0C 22 17 F9; St[7FAC]: 03 A6 02 00 E5 E5 E5 E5 E5 20 5B 00 08 64 00 00 00 00 00 00 83 FE 01 83 FF 00 00 02 83 FE 02 83; +---------------------------------------------+ | | | --==### CASTOR ###==-- | | | +----------------------+----------------------+ | v.0.1.0-r10 / master | 15.01.2024 01:48:51 | +----------------------+----------------------+ | Address range: 0200 - 194B (Total 174B RAM) | +---------------------------------------------+ Help: Q, q - quit Castor (Reboot computer) R, r - return to calling program C, c - call address > - Relocate to new RAM place D, d - dump memory : - IHEX (type 0 & 3 ( & 1)) # - the rest of line is Comment (and so ignored) * - the rest of line is StarCommand for Expanduino ^ - send 1 byte ControlCommand to Expanduino | - SetAltChannel for communication with Expanduino A,a - SwapAutoexec for IHEX etc. F, f - SwapFastIHEX - fast=only RAM ` - Test (do not use) ~ - Diff memory to memory K - KillROM (do not use) Z, z - Zero - clear RAM to 00 (or any value) ^B - long text - up to ^C ?, H, h - this help SYSTEM_Autoexec_allowed: No SYSTEM_FastIHEX_allowed: No LOOP.exec.pending: No LOOP.exec.addr: 0000 Expanduino detected: No .. }}} .. {{{ ChangeLog ChangeLog -------------------------------------------------------------------------------- * `2024.01.15 01:57:01` `v.0.1.0-r10` barevné logo * `2023.12.09 04:40:44` `v.0.1.0-r4` dobře vypálená, umí ^B ^C blok, takže Pollux může posílat delší výpisy s odřádkováním (a Pollux umí \*LS, \*TYPE a \*EXEC , takže další stupeň samostatnosti) * `2023.12.07 02:32:40` `v.0.1.0-r3` snad plně funkční * `2023.12.07 02:29:32` Vypisuje se i kus kolem PC, KillROM formátuje začátek ROM, FastIHEX jen pro RAM, SLOW.IHEX prepisuje jen co je potřeba a validuje každý zapsaný byte, kvůli polofunkční EEPROM (zápisy jsou nespolehlivé)(při pečlivé práci a následném vypnutí to chodí celkem dobře) * `2023.11.30 12:20:58` CC se vypisuje jako pojmenované bity, vypisuje se i kus stacku, vektory jsou, systémová data jsou nad stackem * `2023.11.30 08:34:21` `v.0.0.1-r5` * `2023.11.30 08:30:58` Chodí `*BOOT`, různé drobnosti, IOSpeedTest. Je potřeba napsat vektory a přesunout systémová data na 7Fxx a napsat relocate, pak už to bude vypálitelné * `2023.11.28 17:40:05` `Castor` ve vlastním repozitáři, měl by být plně relokovatelný (position independent) * `2023.11.24 19:32:16` `Castor` už v podstatě funguje, brutálně jsem zrychlil IHEX, ale vyžaduje buď potvrzování řádků, nebo bufferování na straně `Pollux`\u. Taky jsem přidal lepší Dump, Call, Comment, přehazování Autoexecu, ControlCommand, StarCommand a vylepšil Help, zbývá doladit Interrupt Vectory a I/O, které chci dát pod vrchol RAM * `2023.11.20 03:05:57` Rozhodl jsem se, že systémové proměnné na `Castor` budu dávat pod vrchol RAM (teda 7Fxx-7FFF) v podstatě v zásobníkovém přístupu - tedy popis bloků shora dolu - první je defaultní adresa zásobníku, následuje blok skoků do systému (RESET,DEBUG, ...) asi obsadím SWI pro DEBUG, SWI2 pro int21h ? * `2023.11.20 03:04:20` IHEX pro Castor už v podstatě funguje, jen čtení vstupu je pomalé a přeskakuje znaky z paste/souborů, ruční zadávání OK * `2023.11.20 03:02:21` Rozhodl jsem se, že nový EEPROM systém pro OMEN kilo nazvu `Castor`, protože proč ne :) .. }}} .. {{{ GitLog GitLog -------------------------------------------------------------------------------- * 8236880 fixed KillROM, + -> # (HEAD -> master, master, HEAD) * f736fda fixed EXPANDUINO detect (len) * 5e43559 Zero with value * 11cef01 ===== Podarilo se nabootovat z EEPROM, zda se to pouzitelne (0.1.0) * f254e37 IHEX.SLOW * 6a1fce3 Diff * eb03305 some tools * e08b9b2 +KillROM * fd2f0bf Debug pro autoreloc part in IHEX_COPY * 968daa5 bezkecnostni konce CODE, DATA, ... * 8d09d87 fix utilit na python3 a bez f-stringu pro mahoro * 7038951 bootuje bez expanduina, usekava konce v IHEXu * a93e05b Vektory, Reloc, cas na vypaleni * e72c920 HelloWorld * 764755e +HW_Vectors * 3f52231 SetChannel->SetAltChannel, IO_SpeedTest/ * e9223c1 color title, addr. range * b055198 Plně relokovatelný kód * e6dd8df Úprava na RAM/ROM verze, jméno a verze, gtouch.sh, \*.disassm * a5ed777 uvodni commit (0.0.1) .. }}} .. {{{ Odkazy Odkazy -------------------------------------------------------------------------------- * ``__ .. }}}