Relädatorn Zusie - Känd från TV :)

Berätta om dina pågående projekt.
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: Relädatorn Zusie

Inlägg av nablaman »

Varit i garaget ikväll, fixat en del buggar på flipdot-displayen, nu funkar den som jag vill. Har kopplat den till att trigga på minnets
läs/skriv-linjer, tidigare skrev den direkt ut vadhelst som låg på databussen så fort den fick något på adressbussen som den kände igen.

Tänkte jag skulle mikrokoda call och return-instruktionerna (subrutiner) också, men det hanns inte.. :(
När de är färdiga så är nog instruktionsuppsättningen klar.

Håller på med en vettigare hemsida till projektet också, med mycket mer info. Kunde va kul att pilla med tyckte jag :)
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: Relädatorn Zusie

Inlägg av nablaman »

Här kommer nåt ganska skojigt! :)

Jag har pillat på en Zusie-simulator, byggd i javascript.
Den följer maskinens faktiska uppbyggnad så nära jag kunde.
Den utgår t.ex. från råa, kompilerade mikrokoden för att generera alla
kontrollsignaler, precis som den riktiga maskinen. (jag har bara kopierat mikrokoden till en js-array).

Dessutom har simulatorn en inbyggd assembler som förstår samma opcoder som den
"riktiga" DOS-assemblern som jag använder annars.

En rejält tidig version ligger på
http://www.nablaman.com/relay/sim/zusie.html

Det mesta ska nog funka, förutom condition code-registret som jag inte orkat koda ännu.
Så villkorliga hopp funkar inte.

Och estetiskt ser programmet för jäkla fult ut, men det får fixas nån gång :)

Tanken är att den vänstra kolumnen ska svara mot kortens fysiska placering på Zusie.

Den läser ett par js-filer, som nog kan vara intressanta.

http://www.nablaman.com/relay/sim/mnem.js
Detta är maskinens opcoder, och för närvarande all dokumentation som finns för dessa :)
Fast de flesta borde vara självförklarande.

http://www.nablaman.com/relay/sim/mc.js
Den råa mikrokoden.

http://www.nablaman.com/relay/sim/ctrl.js
Maskinens styrsignaler och hur de mappar till mikrokoden.

Alla dessa filer är automatgenererade från mikrokods-källkoden
som jag jobbar med på min DOS-dator.
Jag ska givetvis göra dessa sourcar tillgängliga senare :)

Dessutom finns
http://www.nablaman.com/relay/sim/zusiesim.js
som är källkoden till själva simulatorn, om nån är intresserad :)

Några kul program som ni kan testa:

Följande program är det "stack test" program som jag har använt i flera youtube-filmer:

Kod: Markera allt

ldl->b  b11110000
ldl->c  b00001111
pushb
pushc
pop->a
pop->a
Här är ett kul program som utnyttjar flipdot-displayen
OBS! För att detta ska funka så måste ni klicka i bits 11, 10, 9, 8 i XY-registret
innan ni kör programmet. Detta för att sätta basadressen till flipdoten.

Kod: Markera allt

ldl->c  b10101010  % Ladda C-registret med 10101010

:again
notc->b        % Lägg NOT C i B
movb->c        % Och lägg tillbaka B i C
wrxy<-c        % Skriv värdet i C till minnespositionen i XY (dvs till flipdoten)
incxy          % Öka XY
sbr again      % Kör igen
Gör så här:
Skriv programmet i textrutan och tryck Assemble. Då kommer maskinen att resettas (vilket också sker om man
trycker på knappen Cycle 24V) och sen assembleras programmet och skrives till minnesadress 0x8000 och framåt, precis
som den riktiga Zusie skulle gjort.
Sen kan man köra programmet antingen genom att singlestega med Step-knappen, eller genom att trycka Autorun.
Hastigheten är justerbar.

Det är endast testat på Firefox 4. Säkerligen har jag gjort en massa webbprogrammeringsmässiga idiotier -
jag är en hederlig C-programmerare egentligen :)

Ha så kul!!! :)
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: Relädatorn Zusie

Inlägg av nablaman »

Nu har jag med simulatorns hjälp byggt subrutiner! :)

Betrakta följande program.
En loop överst som anropar subrutinen func, som inkrementerar XY och sedan anropar func2, som
kopierar Y till A. Dvs två nästlade funktionsanrop. Funkar perfekt i simulatorn - ej testat på den verkliga datorn men borde funka utan problem. :vissla:

Kod: Markera allt

:start
calls func
sbr start

:func
incxy
calls func2
rets

:func2
movy->a
rets
Testa själv på http://nablaman.com/relay/sim/zusie.html

Den borde klara rekursion utan problem också, problemet är ju nu att simulatorn inte har conditions ännu så stoppkriterier kan inte skrivas... Får fixa det snart ;)
Användarvisningsbild
Oskar
Inlägg: 1938
Blev medlem: 6 september 2005, 15:11:36
Ort: Storsjö, Sorsele

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av Oskar »

Testat simulatorn lite.
Så cooolt så man svimmar! Jag anar ett nytt forumnöje, skriva finurliga program till Zusie!! :D

:tumupp: :tumupp:
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av nablaman »

Kul!! :)

Några saker jag kanske skulle nämna:
Alla hoppinstruktioner finns i två versioner, long och short.
Skillnaden är att den korta versionen bara påverkar programräknarens låga byte.
Som det ser ut nu är de långa versionerna INTE implementerade ännu, inte i Zusie och inte i simulatorn.

Så använd bara hoppinstruktioner som har ett "s" i namnet, t.ex. sbr, calls, rets, ...
INTE br, call, ret,...

Detta betyder att man inte med enkelhet kan skriva program större än 256 bytes, men det är det nog
ingen som orkar i alla fall :D

Varför har man två versioner? För att mikrokoden för de långa instruktionerna blir mycket längre,
eftersom man ska hämta två bytes hoppadress från minnet istället för 1 byte. Och en relädator är ju
långsam som det är... Så de långa versionerna använder man bara om man absolut måste, dvs skriver ett riktigt maffigt program.
Användarvisningsbild
Oskar
Inlägg: 1938
Blev medlem: 6 september 2005, 15:11:36
Ort: Storsjö, Sorsele

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av Oskar »

En fråga, vilken av hastigheterna motsvarar den i dina videos?
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av nablaman »

"Normal" ligger nog ganska nära.
Användarvisningsbild
pbgp
Inlägg: 1450
Blev medlem: 11 november 2010, 09:09:22
Ort: Uppsala

Re: Relädatorn Zusie

Inlägg av pbgp »

nablaman skrev:Jag har pillat på en Zusie-simulator, byggd i javascript.
Den följer maskinens faktiska uppbyggnad så nära jag kunde.
Det ser riktigt bra ut! ser fram emot att implementera nått skojjigt, game of life på flip-dot:en kanske?

Kod: Markera allt

ldl->c  b10101010  % Ladda C-registret med 10101010

:again
notc->b        % Lägg NOT C i B
movb->c        % Och lägg tillbaka B i C
wrxy<-c        % Skriv värdet i C till minnespositionen i XY (dvs till flipdoten)
incxy          % Öka XY
sbr again      % Kör igen
Jag provade ovanstående program, som jag tror ska rita ut ett schackrutigt mönster på displayen. Men antingen så har jag missförstått eller så funkar det inte. notc->b verkar ge 0b10000111 i b-registret istället för 0b01010101 som väntat.

/P
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av ahlsten »

Det verkar som att några av instruktionernas resultat är opkoden och inte en funktion av operanderna (nota->c, orab->c, orac->b samt xorab->c har jag testat iaf) :)
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av nablaman »

Ajaj, vilken tabbe! Har fixat detta nu :)

Så mycket lättare det var att fixa buggar i simulatorn än i den riktiga maskinen, förresen.. :vissla:

Notera att flipflapen är lite spännande adresserad, av "lödskäl" :)
De första 7 kolumnerna ligger på adresserna 1-7, och de sista 7 på 9-15
Så det är två "banker" kan man säga.
Om jag blir tillräckligt vansinnig på detta så kanske jag bygger om det, men det var oerhört mycket lättare
att ha det så med den drivkrets jag använder till flipflapen.
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av nablaman »

Nu har jag byggt klart condition-code-registret och därmed också villkorliga hopp!
Plötsligt kan man skriva riktiga program :)

Här är ett exempel:

Kod: Markera allt

% If you load 0 into the A register, you should wind up at is_zero
ldl->a  b00000000

% You can try uncommenting this line:
% If you load something else than 0 into the A register,
% you should wind up at not_zero
% ldl->a  b00000001

% Load condition register from A
ldc<-a

% Uncomment these lines to try positive jump condition (jump on zero)
%sbrz is_zero
%sbr not_zero

% Uncomment these lines to try negative jump condition (jump on NOT zero)
sbrnz not_zero
sbr is_zero

:is_zero
ldl->b b00000001
sbr is_zero

:not_zero
ldl->b b10000000
sbr not_zero
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av nablaman »

Nu börjar jag verkligen få kläm på mitt eget assemblerspråk! 8)
Nedan följer det längsta Zusie-program jag någonsin skrivit, det är 93 bytes långt kompilerat.
Det gör väldigt kul saker med flipdiscen :)

Några saker jag lärt mig:
  • Jag har ju bara tre ALU-register, så varje gång jag t.ex. ska jämföra två tal B och C så måste jag ladda komplementtalet till C, addera dessa
    för att på så sätt effektivt göra en subtraktion, och dessutom ladda condition-registret. Sen kolla om det blev 0. Problemet här är att jag måste
    skriva svaret till det enda registret som finns över, nämligen A, (dvs använda operationen ADDBC->A).
    Och då får man pusha A på stacken om man inte vill sabba värdet där.
    Hela detta blir ju lite onödigt om man bara vill jämföra B och C... Det bör vara rätt lätt att lägga till ALU-operationer som gör sin grej och uppdaterar
    condition-registret, men sen slänger svaret (typ en ADDBC-instruktion). Då skulle man slippa en massa push/pop i programmet nedan.
  • Det finns ju ALU-operationer som skriver direkt till minnet (typ ADDBC->MJ som adderar B o C och placerar svaret i minnet som pekas på av J),
    men de har jag inte använt i programmet för att det kändes som fusk (dock e ju minnet snabbare än registren i min maskin..... :vissla: )
    Men retrocomputing handlar ju om att sätta upp begränsningar för sig själv och sen försöka göra så mkt som möjligt inom dessa, eller hur? :)
  • Det kan ju också vara bra att påpeka att X-registret kan man inte komma åt med programmet, det måste sättas manuellt.
    Det finns instruktioner som blandar in X (typ MOVA->X), men de är dummys. Varför? Jo, för jag hade inte fler ledningar ut från mikrokoden! :wall:
    Så X får man sätta med switchar (eller klick i simulatorn), alternativt genom 16bitsinstruktioner som påverkar hela XY.
  • Conditional calls vore väldigt trevligt att ha. Nu har jag bara conditional jumps. Detta borde vara lätt att lägga till.
Jag har lagt till ett turbo-läge i simulatorn. Detta utför 50 mikrosteg per cykel istället för 1. Jag tror du vill aktivera detta med så här långa program :)

Kod: Markera allt

%
% ZUSIE FLIPDISC FUN
% By Fredrik Andersson
%
% See comments at the bottom regarding different interesting logic functions you can use.
% Also load 1111 into X, or it won't work!
%
% Variables have the following uses
% A 	temporary scratch register
% B	keeps track of direction. Most significant bit is horizontal
%	and least significant is vertical.
% C	the current bit pattern to write to the current column
% X	MUST contain 1111 to address the flipdisc display
% Y	keeps track of the current column

% Set starting column. Whatever will do.
ldl->a h03
mova->y

% Set starting row. Whatever will do.
ldl->c b00100000

% Keep track of direction in b
ldl->b h0


%-----------------------------------------------
% Main loop
%-----------------------------------------------

:again

%-----------------------------------------------
% Horizontal update
%-----------------------------------------------

% If b has the top bit set, then we decrement the horizontal
% position, otherwise we increment it
ldc<-b
sbrs decrementxy
incxy
sbr xydone 
:decrementxy
decxy
:xydone

% Now for a little special complication: Memory position 8
% does not map to a flipdisc row. Detect this and do yet another round above.
pushb
pushc
movy->c
ldl->b b11111000 % 8 in complementary form
addbc->a
pop->c
pop->b
sbrz again

%-----------------------------------------------
% Vertical update
%-----------------------------------------------

% If b is non-zero (apart from the top bit),
% we go up, otherwise down
pushc
ldl->c b01111111
andbc->a
pop->c
sbrnz goup

% go down
src->a
mova->c
sbr cdone

% go up
:goup
addcc->a
mova->c

:cdone

%-----------------------------------------------
% Check for changed vertical
% direction from wall hit
%-----------------------------------------------

% If c has the highest bit set, we need to go down in next round
ldc<-c
sbrs change_to_down

% If c has the lowest bit set, we need to go up in next round
src->a
sbrs change_to_up

sbr done_up_down

:change_to_up
incb->a
mova->b
sbr done_up_down

:change_to_down
decb->a
mova->b

:done_up_down

%-----------------------------------------------
% Check for changed horizontal
% direction from wall hit
%-----------------------------------------------

% If y has the first bit set, we are at the leftmost
% column and must switch to right-going increments

% If y equals 15, we need to switch to left-going decrements
pushb
pushc
ldl->b b11110001    % This is 15 in complement form
movy->c
addbc->a
pop->c
pop->b
sbrz move_left

% If y equals 1, we need to switch to right-going increments
pushb
movy->b
decb->a
pop->b
sbrz move_right

sbr done

:move_left
pushc
ldl->c b10000000
orbc->a
mova->b
pop->c
sbr done

:move_right
pushc
ldl->c b01111111
andbc->a
mova->b
pop->c
sbr done

%-----------------------------------------------
% Write out the result to memory,
% i.e. the flipdisc
%-----------------------------------------------

% Note, you can try different operations here
% instead of XOR. Try OR for instance!

:done
rdxy->a
pushb
xorac->b      % You can change this logic op for different effects!
movb->a
pop->b
wrxy<-a

sbr again
Användarvisningsbild
Electricguy
Inlägg: 12479
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av Electricguy »

En video på när datorn "ritar" mönster på flipdisc displayen hade varit roligt! :)
Användarvisningsbild
anders_bzn
Inlägg: 5771
Blev medlem: 17 december 2008, 19:22:18
Ort: Kävlinge
Kontakt:

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av anders_bzn »

nablaman skrev: Conditional calls vore väldigt trevligt att ha. Nu har jag bara conditional jumps. Detta borde vara lätt att lägga till.
Du får väl göra en instruktion "Skip next instruction if not true" så kan man göra vad man vill i instruktionen efter. Jump, call, move...
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: Relädatorn Zusie - Nu med online-simulator!

Inlägg av nablaman »

Det vore det bästa, men jag tror inte det är möjligt eftersom man inte vet hur många bytes nästa instruktion består av, och man kan inte iterera i mikrokoden.
Man skulle iochförsig kunna göra en "skip next 1 byte instruction if not true", en "skip next 2 byte instruction if not true", och en "skip next 3 byte instruction if not true"
men det verkar inte så snyggt.. :) Iofs kunde ju assemblern välja lämplig instruktion åt en... Får se vilken variant jag använder.
Skriv svar