Today I went to Awesomespace.
The same space I went to on 2015/Mar/14 with Bigred.
Smaller, but I moved from Utrecht to Hilversum!





Photos from 2015






A long time ago I had an Action Replay II.
I modded it and was planning to rebuild this using pluggable eurocard-prints.
Then it got lost, somewhere.
Today I went to Almelo with Tyrone.
In the morning reverse engineering a lift controller print, and afternoon going to a guy selling a lot of Retro stuff.
And there it was, an Action Replay II for Amiga just catching dust.
I had to buy it, and got a sh*tload of 27256 Eproms for free!











This version is compatible with the A500/A1000 version only. It also plugs into the side expansion port. It introduces the following features:
A special A2000 version is available for this particular revision. Instead of plugging into the side expansion port it plugs into the 86 pin CPU slot.
Soldering almost done, except for the space bar all tactile buttons in place.


Using my USBasp programmer I tried to program the Atmega328pb.
Same one I used for:
I first needed to implement some udev rules to get the rights for the reader correct.
#/etc/udev/rules.d/99-usbasp.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", GROUP="dialout"
Next I tried to burn a bootloader.
Well, not as planned, back to the drawing board.
Hopefully I compiled at least the Pico part correctly.
A week ago I got the last components delivered to my doorstep.
This project was made by Silvervest and it’s f*ckin awesome.
https://github.com/silvervest/c64pico
I was afraid to start this myself, SMD is on another level for me.
But my good friend Marco said … No problem!
So I ordered components online, which was not easy.
Selecting the correct parts, sizes and options.






These things are really really small


Using tweezers to place the components was even difficult.
The slippery tiny bastard got catapulted everywhere. (Or got stuck on fingers, soldering iron and alike)
Many small components got lost into the 7th dimension. Never to be found again.
Awesome to work on this together, but Marco said that I have to try it myself.
Welllll, I got 3/4 of the ATmega328PB-A perfectly soldered, then I notished that it was crooked.
Desoldering was a mess, and I heated the PCB TOO much with the heatgun.
Next step for me is soldering the 75 mini buttons!
Got a Trinitron display from him, I was looking for this for a long time.


UPDATE: 20240225
I’ve written about General Instrument AY-3-8910 before, here is some work I did today.
This sound chip i wanted to implement in my amiga, and now it’s a alternative for my 6502 computer. ( As an alternative setup for the SID chip. )
Btw this is the same kind of chip used in the Atari ST.
Above a Kicad drawing I made today, a little different from my design from the 90’s.
Below a movie clip I recorded today. Running a test setup using an Arduino nano and a sdcard reader.
The sound is bad, this is due to clipping and the absence of multiple resistors and capacitors.
Music is a register dump from a YM music file.
Amplifier is a bare LM386.
UPDATE: 20240225
I don’t like tying those three outputs together, and amplifying those.
So I’m going to use a LM324 i’ve got left from my 8085 interface, and make a 3-channel amplifier.
Something like this
A while ago I started a soldering a 6502 bare SBC.

I got it running now.
It has an EPROM with Wozmon and Basic for now.
I have to redo the address decoder, but I like the simple serial interface by Geoffrey. (I hate the PIC18F15Q41, made by Microchip, but still the best minimal option .. for now)
Probably the last time i’ve used a pic was in 1998




I’ve posted in the past something about pl/m.
Today i got this running again in a dosbox.
The PL/M programming language (an acronym of Programming Language for Microcomputers) is a high-level language conceived and developed by Gary Kildall in 1973 for Intel’s microprocessors.
We learned to program PL/M at school (MTS)
Below the compiler and lib files
https://media.henriaanstoot.nl/plm86.zip
Compiling a PLM source code
PLM86 PROGRAM.PLM LINK86 PROGRAM.OBJ, PLM\DOSLIBS.LIB, PLM\UTILS.LIB TO %1.LNK INITCODE LINK PROGRAM.LNK;;;
Tic Tac Toe in PLM
bke:do;
/*DOEL: */
/*Dit programma is boter kaas en eieren voor twee */
/*spelers, er wordt gecontroleerd of iemand gewonnen */
/*heeft. (Je speelt niet tegen de computer) */
/*UPDATE:12/2/90,15/2/90,18/2/90 RELDATE:19/2/90 */
/*PROGRAMMER:H.M.Aanstoot */
/*UPDATE 5/3/90 1:13:23 */
/*De volgende 4 regels zorgen ervoor dat de compiler */
/*de PLM DOS,UTIL routines die op disk staan */
/*meestuurt naar de linker */
/* bla bla 2de versie met STRINGS!! eindelijk gelukt */
$include(plm\doslibs.inc)
$include(plm\doslibs.dcl)
$include(plm\utils.dcl)
dcl naam(3) pointer;
dcl plaats(9) word;
dcl teken(2) pointer;
dcl aanzet word;
dcl loop word;
dcl a word;
dcl winnaar word;
dcl nummer word;
dcl item word;
dcl error_status word;
spelerzet:procedure;
call dsso(naam(aanzet));
call dsso(@(', geef een getal: $'));
invoer:
nummer=dsin;
nummer=nummer-48;
if nummer<1 or nummer>9 then goto invoer;
if plaats(nummer)<>0 then goto invoer;
call dso(nummer+48);
plaats(nummer)=aanzet;
end spelerzet;
update:procedure;
item=1;
call dsso(@(cr,lf,'+-----+-----+-----+',cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dso(124);call zet;call dso(124);call zet;call dso(124);call zet;
call dsso(@(124,cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dsso(@('+-----+-----+-----+',cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dso(124);call zet;call dso(124);call zet;call dso(124);call zet;
call dsso(@(124,cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dsso(@('+-----+-----+-----+',cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dso(124);call zet;call dso(124);call zet;call dso(124);call zet;
call dsso(@(124,cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dsso(@('+-----+-----+-----+',cr,lf,eos));
call dsso(@(' 1 2 3',cr,lf,eos));
call dsso(@(' 4 5 6',cr,lf,eos));
call dsso(@(' 7 8 9',cr,lf,eos));
end update;
zet:procedure;
if plaats(item)=0 then call dsso(@(' $'));
if plaats(item)=1 then call dsso(@(' X $'));
if plaats(item)=2 then call dsso(@(' O $'));
item=item+1;
end zet;
check:procedure;
do a=1 to 2;
if plaats(1)=a and plaats(2)=a and plaats(3)=a then winnaar=a;
if plaats(4)=a and plaats(5)=a and plaats(6)=a then winnaar=a;
if plaats(7)=a and plaats(8)=a and plaats(9)=a then winnaar=a;
if plaats(1)=a and plaats(4)=a and plaats(7)=a then winnaar=a;
if plaats(2)=a and plaats(5)=a and plaats(8)=a then winnaar=a;
if plaats(3)=a and plaats(6)=a and plaats(9)=a then winnaar=a;
if plaats(1)=a and plaats(5)=a and plaats(9)=a then winnaar=a;
if plaats(3)=a and plaats(5)=a and plaats(7)=a then winnaar=a;
end;
end check;
hoofdprogramma:
winnaar=3;
naam(1)=@('Speler 1$');
naam(2)=@('Speler 2$');
naam(3)=@('Niemand$');
do a=1 to 9; plaats(a)=0; end;
teken(1)=@('kruisje$');
teken(2)=@('rondje$');
aanzet=1;
do loop=1 to 9;
call update;
call check;
if winnaar<>3 then goto gewonnen;
call spelerzet;
aanzet=3-aanzet;
end;
call update;
gewonnen:
call dsso(naam(winnaar));
call dsso(@(' heeft gewonnen',cr,lf,eos));
if winnaar=3 then call dsso(@('Helaas, pindakaas!$'));
else call dsso(@('Gefeliciteerd ermee!$'));
call dexit(error_status);
end;
UPDATE 20240104
I’ve met Dirk, he brought his SDK85.
And demo-ed a working cassette interface, using audio cables and a second laptop.



Saw a presentation about the MC14500B a weird little chip, robots, retro rebuilds using Raspberries.






Update 20240104 some soldering


Meanwhile .. my old MicroTapes are not using the Intel AP-29 method for data, so that needs some work also.

My scope didn’t save the test capture .. Next time.
But I could see the clear ones and zeros.
Dirk cleaned up a OCR version of the program, which I cleaned up some more, and found some errors.
So that should be okay now.
A dentro (Combination of demo and intro.) from 1995
It using only background colors behind existing text to display the dentro text. There is (somewhere) a version with animations.
New work:
Booting from floppy, showing a flash screen in mode 13h.
Starting a trackloader, which loads a raw adlib file and plays it.
All sectors written to floppy using my new sector writer.
WOOT .. music at boot time!
Sector writer
use16 org 0100h ; 0 0 1 ; bootblock with flashcode mov cl,1 ; start mov al,1 ; # sectors mov dh,0 ; head mov bx,bootblock call wrtsector ; flash image mov cl,8 mov al,4 mov dh,0 mov bx,gfx call wrtsector ; Music loader mov cl,7 ; start mov al,1 ; # sectors mov dh,0 ; head mov bx,nextpart call wrtsector ; Music raw mov cl,13 ; start mov al,4 ; # sectors mov dh,0 ; head mov bx,musicraw call wrtsector jmp do_exit printerror: push cs ; make ds same as cs pop ds MOV DX,TxtErr1 ; error MOV AH,09h INT 21h mov ax,4c00h int 21h do_exit: mov ax,4c00h int 21h wrtsector: ; On entry: AH 03h ; AL Number of sectors to write ; CH Cylinder number (10-bit value; upper 2 bits ; in CL) ; CL Starting sector number ; DH Head number ; DL Drive number ; ES:BX Address of memory buffer ; ; Returns: AH Status of operation (See Service 01h) ; AL Number of sectors written ; CF Set if error, else cleared cld mov ah, 3h ; int13h function 2 mov ch, 0 ; from cylinder number 0 mov dl,0 push cs pop es int 13h jc printerror ret TxtErr1: DB "Error!",7,10,13,"$" bootblock: file 'flash_b.bin' gfx: file 'flashgfx.raw' nextpart: file 'nextpart.bin' musicraw: file 'LVLINTRO.RAW'
I wanted to know how a floppy differs from a floppy.
So i wrote below code to fill each sector on a floppy disk or image with information at the start of each sector.
(Head, Cylinder and Sector)
empty.bin was made using
dd if=/dev/zero of=empty.bin count=1 bs=512
use16 org 0100h mov ch,0 ; cyl mov cl,1 ; sector mov dh,0 ; head nextsector: mov bx,empty mov [empty],dh mov [empty+1],ch mov [empty+2],cl push cx push ax push dx call printer call wrtsector pop dx pop ax pop ax inc cl cmp cl,19 jnz nextsector mov cl,1 inc ch cmp ch,79 jnz nextsector ; other side mov dh,1 mov ch,0 mov cl,1 nextsector1: mov bx,empty mov [empty],dh mov [empty+1],ch mov [empty+2],cl push cx push ax push dx call wrtsector pop dx pop ax pop ax inc cl cmp cl,19 jnz nextsector1 mov cl,1 inc ch cmp ch,79 jnz nextsector1 jmp do_exit printerror: push cs ; make ds same as cs pop ds MOV AX,3 ; default text mode 3 INT 10h MOV DX,TxtErr1 ; error MOV AH,09h INT 21h mov ax,4c00h int 21h do_exit: mov ax,3 int 10h mov ax,4c00h int 21h printer: push cx push dx mov dl,dh mov ah, 02h add dl, 30h int 21h mov dl,ch add dl, 30h int 21h mov dl,cl add dl, 30h int 21h mov dx,13 mov ah,2 int 21h mov dx,10 mov ah,2 int 21h pop dx pop cx ret wrtsector: ; On entry: AH 03h ; AL Number of sectors to write ; CH Cylinder number (10-bit value; upper 2 bits ; in CL) ; CL Starting sector number ; DH Head number ; DL Drive number ; ES:BX Address of memory buffer ; ; Returns: AH Status of operation (See Service 01h) ; AL Number of sectors written ; CF Set if error, else cleared ; cld mov ah, 3h ; int13h function 2 mov al,1 mov dl,0 push cs pop es int 13h jc printerror ret TxtErr1: DB "Error!",7,10,13,"$" empty: file 'empty.bin'

Viewing the floppy image with ghex
Offset 7000 = Head 1, Cylinder 1 and sector 3
When doing
times 512 – ($-$$) db 0
to fill binaries to 512 bytes, you could cat the sectors to a disk/file with this knowledge.