hpr3807 :: PeePaw builds a computer
Brian starts the process of building an 8 bit retro computer
Hosted by Brian in Ohio on Tuesday, 2023-03-07 is flagged as Clean and is released under a CC-BY-SA license.
retro computing, forth, arduino.
3.
The show is available on the Internet Archive at: https://archive.org/details/hpr3807
Listen in ogg,
spx,
or mp3 format. Play now:
Duration: 00:34:00
general.
- intro
- who is peepaw?
Me! - why a retro computer?
help a kid understand computers - why z80?
cheap, available, cheap
- who is peepaw?
- the plan
- build from scratch
- build something like a tec1
https://en.wikipedia.org/wiki/TEC-1 - a great guide is the 1981 book build your own z80 computer
Build Your Own Z80 Computer Steve Ciarcia/ - get started with nop tester
http://www.z80.info/z80test0.htm - want an expandable system
- keep the cost down
- work up to a system like the jupiter ace (which is like a zx-81
sinclair computer)
https://en.wikipedia.org/wiki/Jupiter_Ace
- getting started, the nop test
- use an arduino mega board and some forth to spin up the most basic
z80 system
https://gitlab.com/8bitforce/retroshield-hw/-/tree/master/hardware - give the z80 5 volts, a clock and the right data and it will happily start up and run through its address space doing nothing
- use an arduino mega board and some forth to spin up the most basic
z80 system
- the nop tester, in software
- make a forth logic probe
https://en.wikipedia.org/wiki/Logic_probe - use a gate method of frequency counting
https://ww1.microchip.com/downloads/en/Appnotes/doc8365.pdf - create a few forth words to make a "logic probe" and test that
probe
https://pajacobs-ghub.github.io/flashforth/ff5-tutorial-guide.html#_counting_button_presses - need an arduino mega running flashforth
https://store.arduino.cc/products/arduino-mega-2560-rev3
https://flashforth.com/atmega.html - datasheet
https://store.arduino.cc/products/arduino-mega-2560-rev3
https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf - some jumper wires
- z80
- solderless bread board
- make a forth logic probe
- the code walk through, start from the bottom up note: ( -- ) are
stack effect comments, back slashes are plain comments
- constants
- variable
@ ! mset mclr mtst
- set up external interrupt, int4, arduino board pin4
\ the source code
\ declare some constants and variable as labels
variable Compare
variable Count
$100 constant PINH \ these labels come from the atmega2560 datasheet
$101 constant DDRH
$102 constant PORTH
$a0 constant TCCR4A
$a1 constant TCCR4B
$a8 constant OCR4A
$2c constant PINE
$2d constant DDRE
$2e constant PORTE
$6a constant EICRB
$3d constant EIMSK
: ext4.irq ( -- ) Count @ 1+ Count ! ;i \ the frequency counter
: logicprobe-init ( -- )
1249 Compare ! \ 100 hz
%0000.1000 DDRH mset \ h3 output
%0100.0000 TCCR4A c! \ toggle d6, ph3 on compare match
0000.1011 %TCCR4B c! \ set ctc mode, clk/64
Compare @ OCR4A ! \ set compare value
%0 DDRE c! \ e input
0001.0000 PORTE mset \ pullup on e4
%0000.0010 %EICRB mset \ falling edge
['] ext4.irq #6 int!
;
\ helper words
: start-clock ( -- ) %0100.0000 TCCR4A c! %0000.1011 TCCR4B c! ; \ the bit manipulation does what the word says
: stop-clock ( -- ) %0000.0000 TCCR4A c! %0000.0000 TCCR4B c! ;
: set-frequency ( n -- ) OCR4A ! ; \ set compare value
: pin-high ( -- ) %0000.1000 PORTH mset ;
: pin-low ( -- ) %0000.1000 PORTH mclr ;
: open-gate ( -- ) 0 Count ! %0001.0000 EIMSK mset ;
: close-gate ( -- ) %0001.0000 EIMSK mclr ;
: process-data ( -- )
Count @ 1- Count ! \ clean up value in Count
Count @ dup 0 > if \ is Count greater than 0, if so its pulsing
cr ." freq=" 10 * .
else \ otherwise its not so is it high or low?
drop
%0000.1000 PINH mtst
if
." high"
else
." low"
then then
;
: wait ( -- ) 100 ms ;
: sample-pin ( -- ) open-gate wait close-gate process-data ; \ the 'logic probe'
test
Arduino
- clock, using 16 bit timer4, its output is on pin6, running at 100hz
- need to be able to start and stop the clock, and set the output pin high or low
- sample-pin is the word that does the work
- ouput from the serial terminal exercising the logic probe ( comments add after the fact):
E FlashForth 5 ATmega2560 13.06.2022 ok<#,ram> logicprobe-init ok<#,ram> (start up the logic probe) sample-pin (sample the pin) freq=100 ok<#,ram> ( its oscilating at 100hz) stop-clock ok<#,ram> sample-pin low ok<#,ram> ( after stopping the clock the pin is low) pin-high ok<#,ram> sample-pin high ok<#,ram> ( now its high) 125 set-frequency ok<#,ram> start-clock ok<#,ram> sample-pin freq=1000 ok<#,ram> ( after changing the frequency its 1000hz)
next time
- repurpose the 16bit clock and use it to drive the z80, we'll hook up the data port of the z80 to the arduino mega and use the logic probe to see if the z80 is working