I was posting about the 8085 System Design Kit in may, but now i’ve got one!
I found one online, it is a very clean almost like its never been used version!









More follows!
More info at http://www.bitsavers.org/components/intel/8085/
I was posting about the 8085 System Design Kit in may, but now i’ve got one!
I found one online, it is a very clean almost like its never been used version!









More follows!
More info at http://www.bitsavers.org/components/intel/8085/
UPDATE: 2022-09-29
Yesterday i got two 3DConnexion 3D CAD mouses (mice) from my friend Vincent. While we where fixing his Mikrotik network i got to play with these cool devices.
I always wanted one of those, but they are quite expensive
First i tried to install the Software from 3DConnexion. It kindda worked but needed some workarounds and still wasn’t okay.
Downloaded 3dxware-linux-v1-8-0.x86_64.tar.gz (Maybe this version is TOO new, SpacePilot i a little ouder)
there is a install-3dxunix.sh, but it was made for Suse/Redhat
This program needed motif .. and a lot of libraries (libmotif/libxm)
After that some fonts xfonts-100dpi xfonts-75dpi
workaround was starting by
sudo /etc/3DxWare/daemon/3dxsvr -userName ${USER} -d usb
After that the demo program worked perfectly … but Blender didn’t
After some tinkering it work a little, it was far to sensitive, and was all over the place.
Luckily i found a opensource replacement. https://spacenav.sourceforge.net/
git cloned the package, then i notished .. there is a precompiled version for ubuntu!
apt-get install spacenavd .. start the service .. and go!
i cloned the test demos (libspnav) and compiled those test programs.
apt-get install libglu1-mesa-dev git clone https://github.com/FreeSpacenav/libspnav.git cd libspnav ./configure make ... fly is a nice little test program
So lets start blender
This wil speedup modeling, and for sure sculpting !
Some settings which worked for me .. let the tweaking begin!
UPDATE: 2022-09-29
I removed the version in the apt repository, and installed everything from git. Now i have a cool configure tool
Today i got my watermeter in.
It’s a little device you can place on your watermeter.
You get a plastic clip/holder which you can use to place the device on your watermeter. You can easily remove the device to read the values.
The device measures the little round gauge, so it has no idea what the current values are. Add the current values of your meter to the output of the device.
The device works by measuring the rotation of the red part.
By default it sends the information over the internet to a server. Your phone connects to this server and the app wil give you the graphs.



If you want your own intergration, you have to enable “local api”
See image on the right.
When you want realtime data, you have to connect a usb-c power supply.
When using batteries, the device wil only connect to wifi once per 5 minutes, and you can’t use the API.
I wrote a little test script in bash to draw graphs using mqtt and Nodered.
#!/bin/bash calib=29.621 data=$(curl -s http://10.1.1.176/api/v1/data) totalwater=$(echo $data | cut -f9 -d\" | tr -d ':,') currentwater=$(echo $data | cut -f11 -d\" | tr -d ':,}') totalwater=$( echo $totalwater + $calib | bc) mosquitto_pub -h 127.0.0.1 -m "$totalwater" -t watermeter/total mosquitto_pub -h 127.0.0.1 -m "$currentwater" -t watermeter/current
Variable calib is what my watermeter was when i attached the device.
It wil add this to the newly measured values.
Home Assistant found the device using autodiscovery
I have to look into adjusting for offset in HA
Work in progress code
PORT2B = $5000 ; VIA PORTB PORT2A = $5001 ; VIA PORTA DDR2B = $5002 ; Data direction register DDR2A = $5003 ; Data direction register PORTB = $6000 ; display PORTA = $6001 ; control display + matrix keyboard DDRB = $6002 ; data direction register DDRA = $6003 ; data direction register SID = $7000 ; sid base address E = %10000000 ; enable bit RW = %01000000 ; RW bit RS = %00100000 ; Register Select bit HOME = %00000010 ; VIA PORTB HOME command DADDR = %00010000 ; VIA DADDRESS LINENO = $0200 ; temp address linenumber (move to other location) NEXTLINE = 40 ; 2x16 Chars but internally 40 .org $8000 reset: ldx #$ff txs ; reset stack ; ################################################### ; # DISPLAY CONTROL # ; ################################################### ; VIA Setup lda #%11111111 ; Set all pins on port B to output sta DDRB lda #%11100000 ; Set top 3 pins on port A to output sta DDRA ; DISPLAY Setup lda #%00111000 ; Set 8-bit mode; 2-line display; 5x8 font jsr lcd_instruction lda #%00001110 ; Display on; cursor on; blink off jsr lcd_instruction lda #%00000110 ; Increment and shift cursor; don't shift display jsr lcd_instruction lda #$00000001 ; Clear display jsr lcd_instruction ; ################################################### ; # PRINT MESSAGE LINE NO 0 # ; ################################################### lda #0 ; set line number sta LINENO ; store for subroutine jsr gotoline ; move cursor ldx #0 ; message index pointer print: lda message0,x ; start of message beq nextprint ; stop when null in message (asciiz <- Zero padded) jsr print_char ; print char inx ; incr index jmp print ; resume print ; ################################################### ; # PRINT MESSAGE LINE NO 1 # ; ################################################### nextprint: lda #1 ; set line number sta LINENO ; store jsr gotoline ldx #0 ; index pointer print2: lda message1,x ; absolute address message + x in A beq sidsound ; if x is 0, end of message jsr print_char ; jump subroutine inx ; increment x jmp print2 ; loop print2 ; ################################################### ; # SID SOUND # ; ################################################### sidsound: lda #0 sta SID+$5 ; attack/decay duration lda #250 sta SID+$6 ; sustain level/release duration lda #$95 ; frequency voice 1 low byte sta SID+$0 lda #$44 ; frequency voice 1 high byte sta SID+$1 lda #%00100001 ; sawtooth + gate sta SID+$4 ; control register voice 1 lda #$0f ; filter mode and volume (bits 3-0 main volume) sta SID+$18 ; filter mode and volume ; ################################################### ; # 2ND VIA # ; ################################################### lda #%11111111 ; set port A output sta DDR2A lda #%11111111 ; all ones! sta PORT2A ; ################################################### lda #%11111111 ; set port A output sta DDR2A lda #%11111111 ; all ones! sta PORT2A ; ################################################### ; # MAIN PROGRAM LOOP # ; ################################################### loop: jmp loop ; 1234567812345678 message0: .asciiz "VIA 1,2 SID TEST" message1: .asciiz " FASH 2022 " ; ################################################### ; # ONLY SUBROUTINES # ; ################################################### ; ################################################### ; # Subroutine gotoline # ; # Moves character placement position on display # ; # Needs : $LINENO ADDRESS # ; # Exit values : - # ; # Destroys registers: - # ; ################################################### gotoline: pha ; store a txa pha ; store x ldx LINENO lda #HOME ; cursor down jsr lcd_instruction lda #$80 nextline: ldx LINENO cpx #00 beq endnextlines loopline: adc #40 jsr lcd_instruction dex stx LINENO jmp nextline endnextlines: pla ; pop a tax ; a to x pla ; pop a rts ; ################################################### ; # LCD SUBROUTINES # ; ################################################### lcd_wait: pha lda #%00000000 ; Port B is input sta DDRB lcdbusy: lda #RW sta PORTA lda #(RW | E) sta PORTA lda PORTB and #%10000000 bne lcdbusy lda #RW sta PORTA lda #%11111111 ; Port B is output sta DDRB pla rts lcd_instruction: jsr lcd_wait sta PORTB lda #0 ; Clear RS/RW/E bits sta PORTA lda #E ; Set E bit to send instruction sta PORTA lda #0 ; Clear RS/RW/E bits sta PORTA rts print_char: jsr lcd_wait sta PORTB lda #RS ; Set RS; Clear RW/E bits sta PORTA lda #(RS | E) ; Set E bit to send instruction sta PORTA lda #RS ; Clear E bits sta PORTA rts nmi: rti irq: rti .org $fffa .word nmi .word reset .word irq ; .word $0000
As previously posted, i had an idea to create a dual matrix keyboard mashup using available components.
I mentioned that “it should theoretically work”. But only being using atf22v10c for a couple of days. It was a long shot.
I’ve put it to the test .. and it worked first time.
I can use above, to connect my extended matrix keyboard to a 6522 VIA chip using 5 pins and sending a data available signal to CA1.
In this case designed for my 6502, but it is a generic setup.
I it just a dual 16key matrix decoder merged together. You can probably use this with raspberries, arduinos etc.
I wanted to use 74C923 but these are nowhere to be found. And even then, the number of keys wil be 20.
So i am tying together two 74C922 using some logic in a PLD.
It wil be something like above. Using the data availabe signal i can combine both 16key matrixes. (In theory .. it is all untested)
PLD Code
GAL22V10 Address Decoder PHI2 DA0 DA1 D01 D02 D03 D04 D11 D12 D13 D14 GND NC D0 D1 D2 D3 D4 DA NC NC NC NC VCC DA = DA0 + DA1 D0 = D01 & DA0 + D11 & DA1 D1 = D02 & DA0 + D12 & DA1 D2 = D03 & DA0 + D13 & DA1 D3 = D04 & DA0 + D14 & DA1 D4 = DA1 DESCRIPTION Key matrix merger
I’ve got my new keys of the keyboard in today!
My inkscape template (keys are 10/10mm)
Printed on white and red paper
https://media.henriaanstoot.nl/keyboardmatrix.svg
New address decoder in place!
Connected RAM/ROM/SID/VIA1/VIA2 and ACIA
| ROM | 8000-FFFF |
| SID | 7000-700F (sound) |
| VIA1 | 6000-60xx (Hex key matrix) |
| ACIA | 6800-68xx (serial) |
| VIA2 | 5000-50xx (led test at the moment) |
| RAM | 0000-3FFF |
To plan: Bigger maxtrix keyboard and other displays
Got a serial connection working between the 6502 and my linux machine!


At the moment when a reset occurs , hello is being printed.
Text typed in the minicom terminal, is echo-ed back and displayed on the LCD display.
Things learned: Do not trust internet schematics blindly!
The crystal used for the ACIA (pin 6/7 1.8432Mhz needs a 1M ohm resistor parallel over the crystal, and a 30nF capacitor from pin 7 to GND
When using a terminal emulator, and using 3 wires. Disable hardware handshake.
What didn“t work as planned:
New amplifier schematic for the SID. There is too much noise.

Bought a dual power supply (5V and 12V). But this one has a lot of signal noise on the SID part and even my battlestation speakers!
LED test 2nd via
PORTB = $5000 ; VIA PORTB PORTA = $5001 ; VIA PORTA DDRB = $5002 ; Data direction register DDRA = $5003 ; Data direction register LED = %10000000 .org $8000 reset: lda #%11100000 ; Set top 3 pins on port A to output sta DDRA lda LED sta PORTA loop: ; done loop until doomsday jmp loop irq: nmi: .org $fffa .word nmi .word reset .word irq
ACIA part
ACIA_RX = $6800
ACIA_TX = $6800
ACIA_STATUS = $6801
ACIA_COMMAND = $6802
ACIA_CONTROL = $6803
lda #$00
sta ACIA_STATUS
lda #$0b
sta ACIA_COMMAND
lda #$1f
sta ACIA_CONTROL
Whereas i needed to use several logical components to make a address decoder, below i only need one!
cat addressdecoder-fash.PLD
ATF22V10 (GAL22V10)
Address Decoder
PHI2 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 GND
xx xx RAM ROM SID ACIA VIA1 VIA2 DEV0 DEV1 BANK VCC
/RAM = PHI2 * /A15 * /A14
/ROM = A15 * BANK
/SID = /A15 * A14 * A13 * A12
/VIA1 = /A15 * A14 * A13 * /A12 * /A11
/ACIA = /A15 * A14 * A13 * /A12 * A11
/VIA2 = /A15 * A14 * /A13 * A12
/DEV0 = A15 * /BANK
DESCRIPTION
Address decoder
galasm addressdecoder-fash.PLD # Generates below file which i can flash into the PLD
cat addressdecoder-fash.jed
Used Program: GALasm 2.1
GAL-Assembler: GALasm 2.1
Device: GAL22V10
*F0
*G0
*QF5892
*L0924 11111111111111111111111111111111111111111111
*L0968 11100111111111111111111111111111111111111111
*L1496 11111111111111111111111111111111111111111111
*L1540 11111011011110110111111111111111111111111111
*L2156 11111111111111111111111111111111111111111111
*L2200 11111011011101111011101111111111111111111111
*L2904 11111111111111111111111111111111111111111111
*L2948 11111011011101111011011111111111111111111111
*L3652 11111111111111111111111111111111111111111111
*L3696 11111011011101110111111111111111111111111111
*L4312 11111111111111111111111111111111111111111111
*L4356 11010111111111111111111111111111111111111111
*L4884 11111111111111111111111111111111111111111111
*L4928 01111011101111111111111111111111111111111111
*L5808 01000101010101010100
*L5828 0100000101100100011001000111001001100101011100110111001100100000
*C50fa
*
b734
So one chip replaces schematic below!
The ATF22V10 is a Programmable Logic Device. This means you can program the logic in the chip.
Internally it looks like a big matrix of connections which you can program to connect/disconnect from certain logic.
It has just a bunch of inputs/outputs
So if we want to have a 7 Segment decoder (you can easily buy a BCD decoder .. but these only work for displaying 0-9 and not 0-9A-F for displaying HEX numbers)
| Binary IN | 7 Segment decoded | Displays |
| D C B A | A B C D E F G | |
| 0 0 0 0 | 1 1 1 1 1 1 0 | 0 |
| 0 0 0 1 | 0 1 1 0 0 0 0 | 1 |
| 0 0 1 0 | 1 1 0 1 1 0 1 | 2 |
| 0 0 1 1 | 1 1 1 1 0 0 1 | 3 |
| 0 1 0 0 | 0 1 1 0 0 1 1 | 4 |
| 0 1 0 1 | 1 0 1 1 0 1 1 | 5 |
| 0 1 1 0 | 1 0 1 1 1 1 1 | 6 |
| 0 1 1 1 | 1 1 1 0 0 0 0 | 7 |
| 1 0 0 0 | 1 1 1 1 1 1 1 | 8 |
| 1 0 0 1 | 1 1 1 1 0 1 1 | 9 |
| 1 0 1 0 | 1 1 1 0 1 1 1 | A |
| 1 0 1 1 | 0 0 1 1 1 1 1 | B |
| 1 1 0 0 | 1 0 0 1 1 1 0 | C |
| 1 1 0 1 | 0 1 1 1 1 0 1 | D |
| 1 1 1 0 | 1 0 0 1 1 1 1 | E |
| 1 1 1 1 | 1 0 0 0 1 1 1 | F |
Now we see that segment A is 1 in the case of (0,2,3,5,6,7,8,9,A,C,E,F)
When programming the PLD we can write that as: (note / means inverted a plus is OR, and * is AND)
So A is 0 in case of input being (1,4,B,D)
/QA = /D1 * /C1 * /B1 * A1
+ /D1 * C1 * /B1 * /A1
+ D1 * /C1 * B1 * A1
+ D1 * C1 * /B1 * A1
Complete code for galasm
Compiling and burning
GAL22V10
7SEGMENT
Clock D1 C1 B1 A1 D2 C2 B2 A2 NC NC GND
/OE NC NC NC QG QF QE QD QC QB QA VCC
/QA = /D1 * /C1 * /B1 * A1
+ /D1 * C1 * /B1 * /A1
+ D1 * /C1 * B1 * A1
+ D1 * C1 * /B1 * A1
/QB= /D1 * C1 * /B1 * A1
+ /D1 * C1 * B1 * /A1
+ D1 * /C1 * B1 * A1
+ D1 * C1 * /B1 * /A1
+ D1 * C1 * B1 * /A1
+ D1 * C1 * B1 * A1
/QC = /D1 * /C1 * B1 * /A1
+ D1 * C1 * /B1 * /A1
+ D1 * C1 * B1 * /A1
+ D1 * C1 * B1 * A1
/QD= /D1 * /C1* /B1 * A1
+ /D1 * C1 * /B1 * /A1
+ /D1 * C1 * B1 * A1
+ D1 * /C1 * B1 * /A1
+ D1 * C1 * B1 * A1
/QE = /D1 * /C1 * /B1 * A1
+ /D1 * /C1 * B1 * A1
+ /D1 * C1 * /B1 * /A1
+ /D1 * C1 * /B1 * A1
+ /D1 * C1 * B1 * A1
+ D1 * /C1 * /B1 * A1
/QF = /D1 * /C1 * /B1 * A1
+ /D1 * /C1 * B1 * /A1
+ /D1 * /C1 * B1 * A1
+ /D1 * C1 * B1 * A1
+ D1 * C1 * /B1 * A1
/QG = /D1 * /C1 * /B1 * /A1
+ /D1 * /C1 * /B1 * A1
+ /D1 * C1 * B1 * A1
+ D1 * C1 * /B1 * /A1
DESCRIPTION
A 7 segment hex decoder
galasm 7seghex.gal
minipro -p ATF22V10CQZ -w 7seghex.jed
minipro -p ATF22V10CQZ -w 7seghex.jed Found TL866II+ 04.2.129 (0x281) Warning: Firmware is newer than expected. Expected 04.2.128 (0x280) Found 04.2.129 (0x281) VPP=12V Warning! JED file doesn't match the selected device! Declared fuse checksum: 0x98D5 Calculated: 0x98D5 ... OK Declared file checksum: 0x40B3 Calculated: 0x41A8 ... Mismatch! JED file parsed OK Use -P to skip write protect Erasing... 0.33Sec OK Writing jedec file... 5.01Sec OK Reading device... 0.32Sec OK Writing lock bit... 0.35Sec OK Verification failed at address 0x16C6: File=0x01, Device=0x00 < ------------------ Gives error, but burning seems okay henri@zspot:~/projects/galasm$ minipro -p ATF22V10CQZ -r 7seghex.out Found TL866II+ 04.2.129 (0x281) Warning: Firmware is newer than expected. Expected 04.2.128 (0x280) Found 04.2.129 (0x281) Reading device... 0.32Sec OK Gives all zeros as output, but device works!

