Digitalker: wel de source code, maar welke assembler/linker gebruiken

bprosman

Golden Member

Wat ik begrijp is dat die roms geen machinecode voor een processor bevatten maar wat werd genoemd "canned words" voor de digitalker zelf.

De jongere generatie loopt veel te vaak zijn PIC achterna.

Op 29 mei 2018 08:58:47 schreef bprosman:
Wat ik begrijp is dat die roms geen machinecode voor een processor bevatten maar wat werd genoemd "canned words" voor de digitalker zelf.

Klopt, het is data, geen executeerbare code. Maar, dus geen idee waar dat mee te compileren tot iets binairs.

En jouw Eprom data klinkt als: https://www.youtube.com/watch?v=4Nqveo0Psuk

Als ik kijk naar het stukje "asm", dan is het nog niet af.
Zo te zien was het de bedoeling om de Rom data naar CP/M te porten.(dat denk ik te zien aan de b2 en b3 directives aan het begin van de listing) Of het is het adres waar deze rom zit in de memorymap van digitalker. Nu even onbekend dus.
Het plan was vermoedelijk om iedere gesproken phrase zoals bekend in de eerste spraakrom van "This is digitalker" ... tot aan het laatste word "weight" in een asm listing formaat te zetten.
Enkel het laatst gedane is "320ms silence"

Zie ook het bijgevoegde NS digitalker standard vocabulary kit pdfje.

TonHek
[Edit] Maarten hieronder: Juist, een constante. Het is een offset in zijn applicatie/memorymap.
K7Jz: Het is eigenlijk een omgekeerde ASM. Iemand die probeert van een dump een te assembleren file te maken om die wellicht later in zijn applicatie te linken.

[Bericht gewijzigd door TonHek op dinsdag 29 mei 2018 15:11:27 (16%)

The fastest way to succeed is to double your failure rate.
maartenbakker

Golden Member

b2 en b3 zijn geen directives maar gedefinieerde constanten die verderop ook gewoon gebruikt worden. De b zal vast wel staan voor base address (voor de betreffende categorie).

Ik heb de syntax niet gecontroleerd, maar als ik moest gokken denk ik aan 8080 of Z80. Omdat er geen instructies in staan maakt de processor niet zoveel uit, maar bijvoorbeeld x86 assemblers die ik ken hebben geen db's met een komma erin.

[Bericht gewijzigd door maartenbakker op dinsdag 29 mei 2018 13:54:46 (22%)

www.elba-elektro.nl | "The mind is a funny thing. Sometimes it needs a good whack on the side of the head to jar things loose."

Heel vreemd! Je kan het zelf 'parsen':

code:



last	equ	80h
b2	equ	08000h
b3	equ	0c000h

<<<<skip>>>
	db	2,2BH		;ten   "tien staat op locatie 022db"
        db	2,3DH		;eleven "eleven staat op 023d"
<<<skip>>>>
; ten

l022b:	db	10H             ;  één byte data : 10
	 dw	 l0a72 + b3     ;  0a72+0c000 = twee bytes data: CA72
	db	0               ;  data: 00
	 dw	 l0c4e + b3      ;  data: CC4e
	db	33H              ;  data : 33
	 dw	 l104c           ;  data : 104C
	db	10H
	 dw	 l1070
	db	11H
	 dw	 l1079
	db	13H + last
	 dw	 l0ba3

; eleven

l023d:	db	25H
....

Het woordje 'ten' lijkt op locatie 022B te staan en heeft de bytes:
10 CA 72 00 CC 4E 33 10 4C ...etc..
Precies 18 bytes verder begint woordje 'eleven' op 023D.

Helaas moet je even die "+ last" en "+b3" regels uitrekenen.. Je zou het bijna met Excel of Word kunnen doen.

Op 29 mei 2018 13:21:50 schreef TonHek:
En jouw Eprom data klinkt als: https://www.youtube.com/watch?v=4Nqveo0Psuk

Klopt, dit is deel 1 van 2 van wat de binary in the MM52164SSR1 ROM moet zijn, een 8K ROM, waar dus ook een 2764 voor kan worden gebruikt (na wat aanpassingen voor de pins).

Als ik kijk naar het stukje "asm", dan is het nog niet af.
Zo te zien was het de bedoeling om de Rom data naar CP/M te porten.

Ik durf het niet te zeggen, het lijkt redelijk compleet en matcht ook met de woordenlijst. CP/M zou goed kunnen, gezien de tijd (ca. 1982). Ik weet weinig tot niets van CP/M, maar draaide dat niet (ook) op een Z80? Misschien is het te assembleren met een Z80 assembler, geen idee of daar dan een binary uitrolt?

bprosman

Golden Member

Heeft er niemand die ROM's in .BIN of .HEX op het Internet gedumpt ergens ?

De jongere generatie loopt veel te vaak zijn PIC achterna.

Alle data is wel aanwezig, maar nog niet in het format zoals het begin. Dus iedere phrase met een "pointer" en dus te assembleren en te linken in de applikatie (weet op het moment niet hoe ik het beter kan uitleggen).
Je hoeft niks van CP/M af te weten om deze data te gebruiken.
Ja, iets van Z80 of 8080. Ook omdat Natianal Semiconductor in die tijd erg bezig was een Z80 compatible proc te promoten, de NSC800 (even uit het hoofd). Daarmee hadden ze trouwens wel een leuk stapelbaar ontwikkelssysteem bij ons neergezet.

TonHek
[Edit] Bram, die dumps zullen er best wel zijn. In mijn snelle zoektocht vond ik al een link naar een andere digitalker fan die de Eproms via een Arduino uit wilde lezen, een stuk of 4 dacht ik.

[Bericht gewijzigd door TonHek op dinsdag 29 mei 2018 16:05:57 (16%)

The fastest way to succeed is to double your failure rate.

Op 29 mei 2018 14:26:45 schreef K7Jz:
Heel vreemd! Je kan het zelf 'parsen':

code:



last	equ	80h
b2	equ	08000h
b3	equ	0c000h

<<<<skip>>>
	db	2,2BH		;ten   "tien staat op locatie 022db"
        db	2,3DH		;eleven "eleven staat op 023d"
<<<skip>>>>
; ten

l022b:	db	10H             ;  één byte data : 10
	 dw	 l0a72 + b3     ;  0a72+0c000 = twee bytes data: CA72
	db	0               ;  data: 00
	 dw	 l0c4e + b3      ;  data: CC4e
	db	33H              ;  data : 33
	 dw	 l104c           ;  data : 104C
	db	10H
	 dw	 l1070
	db	11H
	 dw	 l1079
	db	13H + last
	 dw	 l0ba3

; eleven

l023d:	db	25H
....

Het woordje 'ten' lijkt op locatie 022B te staan en heeft de bytes:
10 CA 72 00 CC 4E 33 10 4C ...etc..
Precies 18 bytes verder begint woordje 'eleven' op 023D.

Helaas moet je even die "+ last" en "+b3" regels uitrekenen.. Je zou het bijna met Excel of Word kunnen doen.

Ik kan je, bij gebrek aan kennis, niet helemaal volgen... Het lijkt een beetje op een soort van lookup table die dan verwijst naar de daadwerkelijke data in hex? Die hex kan je wel binair krijgen en laten we aannemen dat het allemaal achter elkaar staat. Maar hoe kan je dan die lookup table maken. Dat is wellicht precies wat de assembler voor je doet... ;-) Tja, wat zou er gebeuren als je het probeert te assembleren in een Z80 assembler?

Op 29 mei 2018 16:00:12 schreef bprosman:
Heeft er niemand die ROM's in .BIN of .HEX op het Internet gedumpt ergens ?

Was het maar waar ;-) De echte ROMs zijn niet te vinden, maar de dumps ervan helaas ook niet. En stiekem lijkt het me ook leuk als o.b.v. die .asm, je een binair bestand kan maken om in een EPROM te branden. Als dat werkt, zou je ook nog kunnen gaan spelen met de data in de .asm...

Op 29 mei 2018 16:00:41 schreef TonHek:
Alle data is wel aanwezig, maar nog niet in het format zoals het begin. Dus iedere phrase met een "pointer" en dus te assembleren en te linken in de applikatie (weet op het moment niet hoe ik het beter kan uitleggen).

Matcht een beetje met mijn gevoel van een soort van lookup table die naar een bepaalde geheugenplaats verwijst, waar de daadwerkelijke data staat... (niet gehinderd door enige kennis)

Je hoeft niks van CP/M af te weten om deze data te gebruiken.
Ja, iets van Z80 of 8080. Ook omdat Natianal Semiconductor in die tijd erg bezig was een Z80 compatible proc te promoten, de NSC800 (even uit het hoofd).

Wellicht is er een oude NSC assembler voor nodig...

...die dumps zullen er best wel zijn. In mijn snelle zoektocht vond ik al een link naar een andere digitalker fan die de Eproms via een Arduino uit wilde lezen, een stuk of 4 dacht ik.

Ws. een post van ene "W4olf"? Die post had ik ook gezien op het Arduino forum, die meneer een PM gestuurd, nog een keer een PM, gereageerd op het bericht, maar er is nooit een reactie gekomen. Daarnaast vind ik het ook wel een uitdaging om te kijken of het mogelijk is met de source code, te komen tot een werkende Digitalker. Ik heb nu een werkende opstelling met een custom ROM.

Arco

Special Member

Schijnbaar is daar niet veel over openbaar gemaakt. In de datasheet staat:

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 29 mei 2018 17:18:37 schreef Arco:
Schijnbaar is daar niet veel over openbaar gemaakt. In de datasheet staat:
[bijlage]

Inderdaad. Als je de datasheet van de MM52164 bekijkt, dan staat daar ook een invulformulier in om te bestellen. Prachtig!

Totaal niet aan te komen natuurlijk en op 8" flop voor CP/M, maar zie hier H14-1: de software DTSW500. Wow! Dat zou pas gaaf zijn om te hebben ;-)

Het lijkt wel assembleerbaar door een oude MASM assembler van microsoft. Misschien dat er nog een "org 0" voor in moet.

Als je verder kijkt kun je ook active-perl installeren en de module http://search.cpan.org/dist/CPU-Z80-Assembler/lib/CPU/Z80/Assembler.pm gebruiken.

Dat kun je dan zelf eventueel nog aanpassen. Maar als je dat kunt had je de vraag waarschijnlijk hier niet gesteld. ;-)

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Arco

Special Member

Aangezien er geen processor-specific instructies instaan, zou iedere assembler zoal bijv. de Tasm assembler ermee overweg moeten kunnen.
(hooguit wat search/replace; sommige assemblers bijv. willen een punt voor .db en .equ)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
bprosman

Golden Member

TASM kun je zelfs je eigen processor .tab bestand maken

De jongere generatie loopt veel te vaak zijn PIC achterna.

Er zijn diverse online (Z80) assemblers, maar geen assembler gevonden die deze code kan lezen. Code ziet er eigenlijk een beetje vreemd uit, soms een inleidende 0, dan weer niet. Het lijkt wel of dat eerste deel een soort verwijzing is naar de data.

Wat ook opvalt is dat er soms "db", dus in kleine letters, dan weer "DB" staat. Aanvankelijk dacht ik dat het automatisch gedisassembleerd was, maar dat zou dan niet consequent zijn geweest.

Ik had nog zo'n bestand, een stuk kleiner, zie bijgaand. Toen ik het aantal bytes ging tellen, ik tel dan alleen de individuele bytes vanaf het laatste label + het adres wat het label lijkt te zijn, dan kom ik precies op 2048, niet het meest toevallige getal.

Doe ik dat met de de SSR1 .asm, waarvan ik weet dat het een 8K ROM is, dan kom ik precies op 8192, ook niet het meest toevallige getal. Het zou dus kunnen zijn dat het stuk vanaf het eerst label met data, gewoon de bytes zijn die in de ROM staan (al heb ik niet direct een idee wat het eerst is). Ik kan eens met een macrootje in een text editor er een hex file van maken en dan een bin en die branden in een EPROM en kijken wat er gebeurt...

Het lijkt een beetje op de structuur in BASIC met:
40 DATA 12, 4E, 67, 88, AA, etc.

Als iemand nog een idee heeft welke assembler dit is? MASM had ik geprobeerd (die voor PIC's, is dat toch, al meen ik dat ik vroeger voor mijn PC AT ook een MASM en/of TASM had).

Deze is nog raar 5 regels voor het einde: "DB 40H,99H,88H,2 DUP(99H),2AH" - volgens mij betekent dit dan:

DB 40H,99H,88H,99H,99H,2AH

Arco

Special Member

Als je alle DB/DW vervangt door .byte/.word, equ door .equ en een .end toevoegt, kan TASM er prima mee overweg.
(en de DUP inderdaad vervangen door 99H,99H)

Er staan wel 3 fouten in met niet bestaande labelnamen, heb ik >>>>> bij gezet. Commandline:

code:


tasm -t80 -i -x1 ssr1.asm

Default wordt er een .bin epromfile aangemaakt...
TASM vindt je hier: https://www.circuitsonline.net/forum/view/message/1958514#1958514

[Bericht gewijzigd door Arco op woensdag 30 mei 2018 13:35:10 (11%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Het is volgens mij een heel simpel formaat alleen iemand heeft dat als assembly opgeslagen met behulp van een deassembler die er hele rare aannames bij heeft gemaakt.

Deze 'decodering' kan ik uitleggen:

1 - 9 is altijd 1 - 9, ook in hexidecimaal, er hoeft dan dus geen H achter.

10H - 99H begint met een cijfer dus wordt herkend al getal, er hoeft dan geen 0 voor.

'Words' (2 bytes) worden gezien als locatie, en beginnen met de kleine 'L'.

De lookup/index is niet meer dan een lijst van 0120 (hex) bytes. De processor die hierbij hoort heeft dan waarschijnlijk iets in de code waardoor hij weet "het adres van 'ten'" kan ik vinden op byte 20 en byte 21. Zo kan je potentieel andere uitspraak/taal programmeren, als je op byte 20 en 21 maar verteld waar die bits staan (in dit geval op 022b)

Als ik het zou moeten doen in bijvoorbeeld Perl/PHP/Basic/shell script:

Alle H wissen
Alle l wissen
Alle + last + b3 + b2 uitrekenen
Alle locaties (l1234:) wissen
Alle db en dw wissen
Alle commentaren wissen (;blabla)

En dan heb je al bijna een lijst van hexidecimaal genoteerde bytes.

Beste Arco en K7Jz,

Jullie zijn me beiden voor. Ik heb inmiddels zelf bin files kunnen maken, maar ik wilde van het weekend proberen deze te programmeren en te testen of het werkt en dan wat laten weten.

Ik heb in korte tijd zeer veel geleerd, zelfs de checksum van het Intel hex format kan ik nu zelf uitrekenen ;-) Ik heb zelfs bytes toegevoegd om SSR1.asm aan te vullen tot 8.192 bytes (al kan de buffer van de programmer natuurlijk default met FF's worden gevuld).

Dit is wat ik heb gedaan:

  1. Copy .asm file in https://www.asm80.com/onepage/asm8080.html;
  2. Klik "Assemble";
  3. Resultaat is IntelHex (https://en.wikipedia.org/wiki/Intel_HEX);
  4. Deze is om te zetten naar binary met BinEx (binex /b <input>).

Voor digits.asm ging dit meteen goed. Voor SSR1 gold:

  • er stond ergens een "H" achter een label, waardoor dat label niet matchte, die heb ik weggehaald;
  • er werd verwezen naar een label, maar dat label bestond helemaal niet, die verwijziging heb ik verwijderd.

Inderdaad, mijn idee is ook een disassembly, waaraan iemand heeft ge-edit. Ben zeer benieuwd of ik hiermee een SSR1 ROM heb...??

Wat ik nog niet helemaal snap is hoe die assembly file nu in elkaar steekt. Het gaat hier niet als bij de SP0256AL2 om allefonen, maar om brokjes 'canned speech', die kennelijk hergebruikt worden. Ik dacht altijd dat het gedigitaliseerde, gecompreste, complete woorden waren, maar volgens mij werkt het als volgt:

  • er is een soort van index, waar als commentaar ook het woord / zin / letter / getal bij staat - het vertrekpunt;
  • daar staan eigenlijk de ingrediënten, bijv.

    code:

    ; eleven
    
    L023d:	db	25H
    	dw	L108b
    	db	32H
    	dw	L0f8f
    	db	16H
    	dw	L0faa
    	db	13H + last
    	dw	L0ba3
    ;
  • ik heb voor de leesbaarheid alle labels met een hoofdletter 'L' laten beginnen, ik zag het verschil tussen '1' en 'l' niet. De gegevens bij een label worden (voor 'eleven' bijv. "L108B") er tussen geplakt (of zoiets);
  • en het resultaat is het woord 'eleven';
  • lijkt erop dat je labels hebt waar platte data achter zit, en labels waar misschien nog wat stuursignalen achter zitten, als bovenstaande;
  • het lijkt erop dat de laatste DW in een definitie van bijv 'eleven' een gereserveerde set is, kennelijk voor de eindklanken (?). Ergens moet Digitalker natuurlijk ook weten wanneer ie klaar is...

En speaking of Digitalker, wat me nog niet duidelijk is, is het volgende:

  • een woord / zin / letter / getal wordt geselecteerd via de 8 data ingangen, dat geeft 256 mogelijkheden;
  • Bij verschillende ROM's, met verschillende woorden, van verschillende lengte, weet Digitalker welke adressen hij moet genereren om de ROM te de juiste data te laten ophoesten, die Digitalker verwerkt. De ROM geeft voor de verschillende adressen databits terug op de 8 data uitgangen (naar Digitalker)...

Maar hoe dit nu werkt met die adressen, dat is me niet direct duidelijk. Hoe weet Digitalker welke adressen achtereenvolgens moeten worden afgeroepen, dat zzal vermoedelijk verband houden met de structuur van de .asm

Bijgaand de bijgewerkte .asm en .bin voor wie het leuk vindt.
Ik had zelf nog de Intel hex eerst gestript van alle overhead, zoals een hexdump vroeger in Elektuur stond, maar dat bleek met Binhex helemaal niet nodig (resultaat was, natuurlijk, exact dezelfde .bin). Ook valt goed te zien dat als je in het Intel Hex format de checksum aanpast, dat Binhex dat ziet.

Sorry voor het ellenlange verhaal ;-)

Arco

Special Member

Zoals gezegd hikte de assembler hier wel over ontbrekende labels.
Bijv. 'L1148H' wordt aangeroepen, maar bestaat niet. (de 'H' is waarschijnlijk een foutje). En 'L0cfc' bestaat ook niet.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 30 mei 2018 13:32:36 schreef Arco:
Er staan wel 3 fouten in met niet bestaande labelnamen, heb ik >>>>> bij gezet.

Even gekeken naar jouw .asm: inderdaad precies de 3 punten die ik met de online assembler, zie eerdere post, had gevonden. Vreemde is wel dat als je de, veel mooiere, assembler waar op die pagina naar wordt verwezen (kleurtjes e.d.) gebruikt (https://www.asm80.com), deze meteen piept, zelfs bij digits.asm waar geen fouten in stonden ("Unrecognized ASM type")...

Commandline:

code:


tasm -t80 -i -x1 ssr1.asm

Default wordt er een .bin epromfile aangemaakt...
TASM vindt je hier: https://www.circuitsonline.net/forum/view/message/1958514#1958514

Super, kan altijd van pas komen. Wel handig die online compilers,ik dacht ik ga eens zoeken. Ook nog wat geleerd along the way over CP/M ;-)

Op 30 mei 2018 16:33:37 schreef Arco:
Zoals gezegd hikte de assembler hier wel over ontbrekende labels.
Bijv. 'L1148H' wordt aangeroepen, maar bestaat niet. (de 'H' is waarschijnlijk een foutje). En 'L0cfc' bestaat ook niet.

Ha, ha, was net aan het tikken, ik reageer net op je post. Ben benieuwd of het spraak oplevert ;-) Nu nog de andere ROM dumps voor de Digitalker, of beter... de echte ROMs. En dan weer verder met andere speech chips als de TMS5100, werkt weer totaal anders...

Op 30 mei 2018 16:21:50 schreef gdb:...
[*]ik heb voor de leesbaarheid alle labels met een hoofdletter 'L' laten beginnen, ik zag het verschil tussen '1' en 'l' niet.

Beetje OT: Daar heeft ook iemand al eens naar gekeken, zie deze link https://itnext.io/11-best-programming-fonts-724283a9ed57

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.