.. 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: 2024.01.22 05:37:29 :_modified: 1970.01.01 00:00:00 :tags: doc :authors: Gilhad :summary: Comp24 specification :title: Comp24 specification :nice_title: |logo| %title% |logo| %HEADER% .. {{{ Comp24 specification Comp24 specification ================================================================================ |detailson| `Comp24` is my **8-bit** computer for year **2024**, so the name. I bought `OMEN kilo` but its lack of periferials and inability to control communication (like with RTS/CTS) resulted in desire to improve it radically. * **CPU** - `HD6309` for now, but later should be possible to use also 6502 and maybe more others * **Speed** - `4MHz` for CPU, `115.220 baud` for Serial * **I/O** * at least 3 Serial ports (with RTS/CTS) * PC (debug, upload) * PS/2 keyboard+terminal * generic use * at least 4 Paralel ports (8-bit each) * 2 for generic use (and with LED indicators) * SPI, I2C (both by bit bang) * maybe SD card for filesystem * RTC (and time interrupts 100x per sec) * date + time * debounce * alarms * beeper * maybe with tones? * mayne sound card later? * video output * 80x25 text `Grant Searle - video + keyboard interface `__ (2x Arduino, PS/2 keyboard, 74HC166) * maybe full graphic later * keyboard * 80x25 text `Grant Searle - video + keyboard interface `__ (2x Arduino, PS/2 keyboard, 74HC166) * **Expansions** * `Expanduino `__ or something like that - SD card interface, SPI, I2C and full Arduino connectivity + compatibility * `RAM only` - ATMEGA will **Halt** 6309 on start and prefill **ROM part** of RAM (vectors and basic system) * `Shared RAM` - 8kB of RAM will be shared with ATMEGA for fast communication * one or more chips, so both computers could run in paralel * filesystem transfers * videoRAM * \... * `system bus` for future expansion * **Memory** * 0000-7FFF - 32K RAM (1. UT62256C) * 8000-9FFF - 8K bank (shared with ATMEGA) * A000-BCFF - 7.5K RAM (A000..Devices) for system (part of 2.UT62256C) (I/O buffers, system variables and such) * BE00-BFFF - 16 x 32B - **Memory mapped Devices** * C000-FFFF - 16K "ROM" (part of 2.UT62256C) * **Memory mapped Devices** * IO[0..15] x 32 Bytes = 512 Bytes (BE00-BFFF) * decoded to 16 lines active LOW * each card can/should use only :overlinecite:`IOxx` + `A0..A4` + `Read` + `Write` (maybe GAL to decode?) * BE00-BE1F * BE20-BE3F * BE40-BE5F * BE60-BE7F * BE80-BE9F * BEA0-BEBF * BEC0-BEDF * BEE0-BEFF * BF00-BF1F * BF20-BF3F * BF40-BF5F * BF60-BF7F * BF80-BF9F * BFA0-BFBF * BFC0-BFDF * BFE0-BFFF * first address for read is 8-bit ID of device (binary: `xxxx xxxx xxx0 0000` address) * special signal is generated, so :overlinecite:`IOxx` x :overlinecite:`IDreq` is all needed (and `245` with fixed DIR and set of pull-ups/downs) * Serial cards: * `0 000` + `0 0001` write = **Set** and **Reset** registers for SR pinheader, `0 0001` read = value of SR pinheader (for RTS and such) |/details| .. }}} .. {{{ Shared RAM Shared RAM ================================================================================ |detailson| * 8K RAM at 8000 (from 32K RAM) * device with registres .. code:: asm WANTED_PART EQU 2 BANK EQU $BE20 BANK_STATUS_REG EQU BANK+1 BANK_CONTROL_REG EQU BANK+1 BANK_PART_REG EQU BANK+2 FILE_READ EQU 12 ; value be decided later LDA #WANTED_PART ; 0..3 for RAM from 32K bank (later maybe more values for ROM, video, etc.) CheckLoop1 ; it may take time CMPA BANK_STATUS_REG ; ?is already mapped? (read reg, containing number of currently mapped part, or #$FF for nothing) BEQ AlreadyDone ; .. if yes, nothing more neaded STA BANK_CONTROL_REG ; .. if no, ask for it ; ... ; possibly do some other work BRA CheckLoop1 ; and look again AlreadyDone ; now we have the part accessible ; LDX #$8000 ; the mapped block LDA #0 ; the requested use - 00 none (page is empty, nothing to do), FF none (page is full, do not touch it) STA 0,X ; set the use at first byte (well, not good example, we should not request it, when we not need it) ; ... ; later FileReadReq LDA #FILE_READ ; read file 'FNAME\0' from 'FIRST', 'TOTAL' bytes at max (max 7K or so) STA ,X+ ; store command, move pointer ; LDY #FNAME ; get address of requested FNAME FNAMELoop1 LDA ,Y+ ; copy byte STA ,X+ BNE FNAMELoop1 ; including zero after end of string ; LDY #$1234 ; from this byte (1234) STY ,X++ ; store it LDY #$FFFF ; so much (as much as possible, the limit if less than 2000 anyway) STY ,X++ ; store it STA ,X+ ; placeholder for return code (00 = success) STY ,X++ ; placeholder for data lenght in case of success ; ; now X contains position of first byte of (future) result LDA #$FF ; none Part (so take this away and do what you want) STA BANK_CONTROL_REG ; sent it ; ... ; later FileReadResult CheckLoop2 LDA #WANTED_PART ; we want out task processed STA BANK_PART_REG ; request status of WANTED_PART LDA BANK_PART_REG ; 00 part Empty, 01 part under construction (busy), 02 part finished, FF does not exist at all (unknown Part) CMPA #01 BEQ CheckLoop2 ; busy wait, while is there work on the page CMPA #02 BNE FatalError ; LDA #WANTED_PART CheckLoop3 STA BANK_CONTROL_REG ; request the part CMPA BANK_STATUS_REG BNE CheckLoop3 ; wait for it ; ; Now we have the part mapped, we may check, wheather it is the right request (should be), and how it ended (should have for return code 00 = success and some value in data lenght word, followed by so many bytes from file) FatalError ; some error handling FNAME FCN "FILE.TMP" |/details| .. }}} .. {{{ RAM Expansion Card Documentation RAM Expansion Card Documentation ================================================================================ |detailson| Overview -------- The RAM Expansion Card is designed for 8-bit computers, providing an additional 32kB of RAM that can be mapped to an 8kB address space. This documentation outlines the structure, registers, and functionality of the card. Technical Specifications ------------------------- * **Memory Size:** 32kB * **Address Space:** 8kB * **Addresses:** * Mapped RAM from 8000 to 9FFF * Registers from BE20 up Registers --------- **Register 0: Expansion Card ID (Read Only)** * **Address:** BE20 * **Description:** Identifies the expansion card. * **Access:** Read Only **Register 1: Control/Status Register** * **Address:** BE21 * **Description:** Controls the mapping of RAM to the address space and provides status information. * **Access:** Read/Write **Control/Status Register Bits:** * **Bits 0-3:** RAM Part Selection (Write) * 0 to 7: Maps the corresponding RAM part to the address space (8000 to 9FFF). * FF: No RAM mapped (default). * **Bit 7:** Busy Flag (Read) * 0: RAM part is ready or mapped. * 1: RAM part is busy. **Register 2: Query Register** * **Address:** BE22 * **Description:** Provides the status of the currently requested RAM part. * **Access:** Read **Query Register Bits:** * **Bits 0-3:** Status (Read) * 0: RAM part is ready or mapped. * 1: RAM part is busy. * FF: RAM part does not exist. Operation --------- * **Read Expansion Card ID:** * Read from BE20 to get the expansion card ID. * **Control RAM Mapping:** * Read/Write to BE21 to control RAM mapping. * Writing a value from 0 to 7 maps the corresponding RAM part. * Writing FF disables RAM mapping. * **Query RAM Status:** * Read from BE22 to get the status of the currently requested RAM part. Notes ----- * When RAM is not mapped in, it is not accessible to the processor, and reads/writes are directed to the underlying system RAM. * Changes to RAM mapping in the control register may take some time to be completed. This documentation provides the technical details for integrating and utilizing the RAM Expansion Card in your 8-bit computer system. |/details| .. }}}