Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| builderpages:phillip_m_gallo:start [2023/10/02 09:52] – Revision from 2023-10-02 | builderpages:phillip_m_gallo:start [2026/06/15 13:04] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | /* Imported from Wayback Machine | ||
| + | | ||
| + | | ||
| + | | ||
| + | */ | ||
| + | |||
| + | ===== Inspiration : ===== | ||
| + | |||
| + | I acquired a TRS-80 Model 1 rig (system unit, CRT, tape recorder) for $30USD at an estate sale here in the Denver, CO area. Plugging it in i found it “charming”. I immediately wondered if a 64180/eZ80 plug in for the 1.7MHz CPU existed. Thinking this likely, i searched the interweb and like so many fell down the RETROBREW rabbit hole. Now the TRS-80 Model 1 sits unattended while another platform gets all the attention. | ||
| + | |||
| + | In the course of deciding which retro-cpu environment would be of interest, i came across a Hack-a-Day Project by AGP Cooper. | ||
| + | |||
| + | **https:// | ||
| + | |||
| + | **https:// | ||
| + | |||
| + | I found this project to be a do it yourself kit for implementing CP/M 2.2 upon a 8085 platform. Alan includes schematics, software, self-composed simulator, and a log of his implementation effort. | ||
| + | |||
| + | The simple but elegant “brute force” implementation of CP/M (without MOVCPM or SYSGEN) and the example silicon disks which saved a lot of trial and error and pointed the way. Specifically, | ||
| + | |||
| + | ==== The Initial Platform ==== | ||
| + | |||
| + | Into the garage and out of a plastic storage bin, i retrieved an 8085 board from the 1980' | ||
| + | |||
| + | Purpose built, the top level Architecture of this board split the memory map into two 32k segments the lower 32k occupied by EPROM (later E< | ||
| + | |||
| + | Natively, this board was not going to Host CP/M (which requires R/W memory in the segment occupied by my ROM. The solution was to pull out the lower 32k ROM and construct an Expansion Board which would mount in place of the socketed 32k ROM. This Expansion Board would include what seemed to me to be a typical RETROBREW 1MB memory map. That is, 512k of Flash from 00:0000H to 0F:FFFFH and 512k of Static RAM from 10:0000 to 1F:FFFFH. Additionally, | ||
| + | |||
| + | First thing the board was powered up in native format. Then many NMOS Chips replaced by CMOS, and the wait-state generator removed. | ||
| + | |||
| + | **Note:** //When this board was built the 6MHz 8085-AH1 seemed fast and components on a companion I/O board (three Yamaha YM-2203' | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | I liked the physical look of the original 8085 cpu but the expansion technique would obscure this board with a less attractive daughter board which works very well. The daughter board mounted into the ROM Socket using Headers with 3 level length pins. These are commonly used to stack Arduinio boards. These pins solder to a DIP header which performs the actual connection into the boards ROM socket. | ||
| + | |||
| + | The graphic left depicts the daughter boards initial mounting of these headers. A 512k FLASH ROM (ST39SF040) mounts into the female receptacle end of the header with the pin side fitting into the original 32k ROM socket. As ROM doesn' | ||
| + | |||
| + | An octal latch provided the Address lines A15 through A19. This is common for many of the CP/M compatible boards i've found in the Retrobrew-RomWBW world. The latch allows selection of any of thirty-two pages each 32kB in “length”. When A19 is low any of sixteen 32kB pages can be selected. Conversely, A19 high selects any of sixteen 32kB pages to selected into the lower 32kB address space. The graphic right depicts the allocation of the FLASH and SRAM from the architectural and system viewpoint. | ||
| + | |||
| + | ==== Memory ==== | ||
| + | |||
| + | As shown, FLASH ROM is allocated as two 256kB ROM Disks (A and B). At this time these “silicon disks” are programmed off board with standard CP/M Utility Files which intend to support the use of the system. In this way the 256kB Static RAM R/W Memory need not be filled with files that perform utility system functions. | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ==== The Static RAM ==== | ||
| + | |||
| + | 512kB of Static RAM allocates as depicts right. Writing 10H to the //Page Select Latch// results in memory from 0000H to 7FFFH to address the first 16 “virtual” Tracks of Drive C:. As a “DATA” (non-boot) drive the first two tracks addresses the disk directory (2kB) and the first 30kB of disk content (programs and data files). | ||
| + | |||
| + | Taken directly from Allen' | ||
| + | |||
| + | The last 256kB RAM allocates to the CP/M, System and the USER Programs. Writing 18H to the Page Select Latch places the first 32kB of this non-disk allocated segment as CP/M's lower 32kB TPA RAM. This is important as the interrupt vectors and the TPA start Address (100H) is in here. | ||
| + | |||
| + | If in the course of operation a[[https:// | ||
| + | |||
| + | A 32kB page is allocated for System Structures and Buffers which will be detailed later in this presentation. The remaining 196kB could have been another disk but disk space but it was my feeling that the 64k paradigm (ignoring MP/M/CP/M3) makes data handling cumbersome. It is a simple task to provide “cross-page” block moves in the top of CP/M's address space to allow transaction of data where the procedure protects the system from errant methodology (sadly not errant logic). | ||
| + | |||
| + | The RomWBW provide sophisticated cross-page capability. CP/M3 and MPM provide well understood and long used methodology as well. The kSys system provides no more than a Interrupt Disable/ | ||
| + | |||
| + | The RomWBW Architectural Description, | ||
| + | |||
| + | ==== Board Schematics ==== | ||
| + | |||
| + | The schematic below left is of the base kSys CPU Board. The graphic below right is the Daughter card schematic. | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | The schematic right depicts the Expansion Board' | ||
| + | |||
| + | The Base Board required two new headers to provide signals not normally terminating at a ROM Socket but are required for Expansion Board Functionality. These signals are Interrupt, and Write related signalling. The RTC optionally connect to 8085 interrupts (7.5). The Flash Rom is provided an optional WR* signal to allow “In circuit programming” to occur. | ||
| + | |||
| + | ==== Platform Software - CP/M ==== | ||
| + | |||
| + | When the base platform was first in use it connected to a CP/M machine. Now it are one. This time there are no mechanical drives. Instead the ROM and RAM are understood to represent 128 Tracks of sixteen 128 byte Sectors. Files allocate on 128 byte boundaries. | ||
| + | |||
| + | The CBIOS Translates CP/M's Select Disk, Set Track, Set Sector requests into a Page: Offset Memory Address. As example, The “BOOT Sector” ( Track 0, Sector 1 ) is understood as ROM address 00H-7FH. Track 0, Sector 2 occurs at address 80H-FFH. This second Sector is the start of CP/M's CCP System Component with the BDOS and CBIOS following. | ||
| + | |||
| + | Sixteen 128 byte sectors results in each Track representing 2kB of memory such that 128 Tracks then represent 256kB of storage. | ||
| + | |||
| + | ==== Booting the System ==== | ||
| + | |||
| + | Although different, the RESET relocation implemented in Alan Coopers MyCPM was direct inspiration for the method of booting CP/M for this platform. Alan's platform jumps to 8003H upon RESET. The interesting things is there is nothing there until A15 asserts as the address generates for the JMP opcode. The JMP sets a latch which relocates the ROM base address from 0000H to 8000H (and enables RAM in from 0-7FFFH). | ||
| + | |||
| + | Analogous to Allen' | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | {{[[lib: | ||
| + | |||
| + | ==== Upon First Boot ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | After this initial bout of nostalgic joy, it wasn't long before i found the CCP could be annoying. Three characteristics immediately reared their head: | ||
| + | |||
| + | Semi-ambiguous File specification required the “ *.* ” use, which after years of alternate console operation seemed unnatural. | ||
| + | |||
| + | For maximum usefulness, all the Utilities and commonly used files on A: User 0 needed to be in the file “Search Path” | ||
| + | |||
| + | As console screens can easily get visually cluttered, a method for “clearing the display” avoids “messy” console screens. | ||
| + | |||
| + | ==== CCP Alteration ==== | ||
| + | |||
| + | To deal with these issues and make CP/M a little easier to deal with i .. Modified the CCP to allow semi-ambiguous file spec with a single asterisk i.e “ **stat di*** ” or “ **dir s*** ” instead of “ **stat di*.*** ” or “ **dir s*.*** ”. | ||
| + | |||
| + | Implemented the well known mode to make A: User 0 into the search path if the file as spec'd cannot be found on current disk or user area. | ||
| + | |||
| + | As an ANSI Terminal was my dedicated target i modified the CCP to add “ **CLS** ” as an intrinsic CP/M CCP command. | ||
| + | |||
| + | //It wasn't long before i made several more alterations to the CCP.// | ||
| + | |||
| + | I removed the TYPE intrinsic command and wrote a new Transient Command **TYPE.COM** which pages display of text. | ||
| + | |||
| + | I added an alias for the intrinsic command ERA called DEL. This is just returning the MS-DOS 1.0 favor of allowing ERA to alias DEL on that system. | ||
| + | |||
| + | I wrote a program which executes with ever cold or warm start which checks for new files, file changes, file omission and updates a “ META FILE ” to reflect the detected change | ||
| + | |||
| + | I established another META File which correlates User Areas to User created NAMEs provided a psuedo-directory format, a historically common CP/M technique. | ||
| + | |||
| + | Wrote several system Transient programs to express Disk/User file locations as “ **directories** ”. MD,CD,RD (made, change and remove directory) **D** and **PHI** which provided disk directory information that includes date and file size information in their formats. | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | The graphic left depicts the new **D.COM** directory format. CP/M's dir works as usual but D.com represents an extension of the standard CP/M DIR command functionality. | ||
| + | |||
| + | D.COM appends child directory names (read from the Director META FILE) and includes CP/M Drive Directory information File Names File Size (on disk) and File Attributes. | ||
| + | |||
| + | Like CP/Ms DIR command, it allow fully ambiguous file spec (as shown), semi-ambiguous file spec “ **D N*.HEX** ” or specific file reference ( “ **D SHODIR.COM** ” ). | ||
| + | |||
| + | The graphic below left, depicts the display format of **PHI.COM** . PHI.COM is a “long directory format” that also appends Directory META INFO file information (Dir Names), as well as, file Time and Date information. Time and Date information reflect the time and date of a files first discovery by the Cold/Ward boot process procedure ( Z.COM ) which inserts this information into the FILE META file. | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | The kSys System or memory pages and drive directories is still evolving but is very stable and is in regular use. It does not impede standard CP/M program functionality, | ||
| + | |||
| + | A log of console transactions between the operator and the modified CCP can be reviewed below. | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ==== Non-Volatile Storage ==== | ||
| + | |||
| + | As the the R/W Drive C: is really just SRAM Storage, some non-volitile memory would allow save storage for battery or operator/ | ||
| + | |||
| + | This particular logger is called a [[https:// | ||
| + | |||
| + | The uMMC has a form of User Interface that seems characterized for both terminal use and for very high level language interface. In all cases commands use either “displaying characters” or simple Controls like ESC and CR. I proceeded to add a wrapper around this protocol that integrated the SD functionality into the system in a more regular way. The graphic right depicts the available command for operating the SD from a command prompt. | ||
