fredag 12. mai 2017

RC2014 Basic

RC2014 er datamaskin jeg har brukt en del på å bygge og studere virkningsmåten til den siste tiden, for mer informasjon om maskinen i seg selv se introduksjon. Basic var det de fleste av oss utover 70 og 80 tallet kjente som operativsystemet på maskinene, men i realiteten så var det egentlig et programmeringsspråk for hvordan man arbeider med maskinen.

Basic

Den etter hvert mest kjente versjonen av Basic er utvilsomt Microsoft Basic i og med at denne på det tidspunktet var en av de mer rimeligere av alternativene - til og med Apple 1 og 2 kjørte MS Basic!

Basic kan ikke sies å være en oppfinnelse fra fra Microsoft sin side, Bill Gates selv implementerte implementerte en egen versjon av rutinene i henhold til spesifikasjonene utviklet ved universitetet Dartmouth på slutten av 60-tallet - for den langt mer komplette historien se denne artikkelen. MS utgaven fokuserte på hjemmedatamaskinene som ble tilgjengelig fra slutten av 70-tallet mens den opprinnelige utgaven opptil da hadde fokusert på stordatamaskinen.

Til tross for at det hele virker noe arkaisk og til tider vanskelig å forstå, så var utgangspunktet for systemet et ønske om å lage et system som alle skulle være i stand til å skrive og forstå uten en doktorgrad innenfor relevante fag. Her må man huske på at sammenligningen da var sett opp mot systemer der man lastet inn data ved å flippe brytere og lese av svar i form av opplyste serier av lyspærer, innlesing av data via hullkort og utskrift på papir var fortsatt relativt moderne.

Basic la opp til å skrive inn operasjoner ved bruk av tastatur og så å kunne få resultatene direkte ut på skjermen, langt mer brukervennlig og manualen på noen få sider fulgte med datamaskinen. Mitt første møte med MS Basic var via Commodore 64-maskinen jeg hadde som liten, og den fikk jeg til å gjøre enkle ting selv om jeg fortsatt var for ung til å starte på skolen.

NASCOM Basic v4.7

NASCOM versjonen er en porting av MS Basic for bruk på Z80-baserte datamaskiner slik som RC2014-maskinen jeg har, noe som vil si at brøkdelen av et sekund etter å ha slått på maskinen så kan man begynne å bruke den. Skjermbildet nedenfor viser oppstarten av systemet samt et eksempel der man bruker PRINT-kommandoen for å skrive ut en tekst på skjermen.


I utgangspunktet litt fryktinngytende for selv dagens ferske IT-teknikere i og med at alt er tekstbasert, men det er tross alt ikke den svarte magien man husker fra tiden da jeg fortsatt ikke hadde lært bokstavene. Den komplette manualen til NASCOM Basic var tross alt kun på 31 sider, inkludert introduksjon, innholdsfortegnelse og forside - den er til og med tilgjengelig på Internett.

Praktisk eksempel

Det er egentlig ikke spesielt interessant å skrive ting ut til skjermen, så et mer praktisk anvendelig eksempel er gjengitt nedenfor. Dette skriptet skriver ut innholdet av de 88 første minneadressene, og var noe jeg laget for å lese ut den første delen av ROM på maskinen.

10 FOR I=0 TO 10
20 PRINT I*8;":";
30 FOR B=0 TO 7
40 PRINT PEEK(I*8+B);
50 NEXT B
60 PRINT
70 NEXT I
Hver av linjene skrives inn som skrevet, numrene foran angir rekkefølgen disse skal utføres i og vil lagre dem uten å kjøre disse direkte. Systemene hadde ikke noen editor i tradisjonell forstand, derfor var det lurt å legge inn hopp i numrene slik at man kunne angi noe mellom linjene - benytt samme nummer for å korrigere linje.

Kommandoen list lister ut programmet slik det er skrevet inn så langt, er man fornøyd så kan man kjøre det ved bruk av kommandoen run.


lørdag 22. april 2017

FTDI-kabler?

USB TTL Seriell Adapter
For programmering av mikrokontrollere, deriblant den Atmega-baserte Arduino og annet morsomt kommer man raskt til å trenge en FTDI-kabel. Disse er mer eller mindre de gode gamle seriell kablene som forsvant fra datamaskinene for mange år siden nå, forskjellen er den at disse opererer på et lavere spenningsnivå enn de gamle. Selv trengte jeg den for å kommunisere med RC2014.

Alt vel og bra i og med at den adapteren jeg allerede hadde fungerte helt fint, den var bare ikke spesielt praktisk for meg (løse ledninger som sklir ut hele tiden). Gikk derfor til innkjøp av en ny kabel som eksplisitt var merket FTDI, den ser ut som følgende ved innkjøp:

(Kilde: AliExpress.com)

Fungerer ikke når jeg prøver å bruke denn, men burde kanskje sett ekstra nøye på fargene til de ulike lederne - nesten, men ikke helt kan man si. Referer man til standarden, se nedenfor, så kobler man her 5v der enheten i andre siden forventer jord (GND) og jord der CTS-signalet er forventet - ved tilknytning til 3.3v enhet ender man opp med 5v på en input-pin samt feil polaritet! Morsom, ha ha...

(Kilde: FTDI Data Sheet

Kabelen kan enkelt repareres ved å bruke en kniv for å bøye opp mothakene på hver av kablene mens man trekker dem ut en etter en. Kobles inn på korrekt plass ved å kryssreferere dokumentasjon fra selger med den fra FTDI, legg merke til at fargene heller ikke nødvendigvis er de samme. Referer til følgende tabell for korrigert rekkefølge:

FraTilFargeFunksjon
21SvartGND
62BlåCTS
13RødVCC
44GrønnTXD
35HvitRXD
56GulRTS


Endelig resultat, nå fungerer den faktisk.

RC2014 Device Map

Dette er et innlegg relatert til byggingen av RC2014, se introduksjon, og vil mer eller mindre være mine egne notater relatert til dette spesifikke temaet.


Device Map

Zilog Z80-prosessoren benyttet innenfor RC2014-maskinene, se RC2014 Prosessor, skiller mellom håndtering av minne (RAM og ROM) ved bruk av henholdsvis MREQ og IORQ signalene. Dette eksplisitte skillet er interessant, i dag er man mer vant til at alt er plassert innenfor det samme adresseområdet - hvis vi har et forhold til dem i det hele tatt!

Utover bruken av ekstra signaler for å skille mellom dem så forenkler det mye av logikken som kreves. For å referere RC2014 Memory Map så ser man at disse gjerne forbruker hele blokker av 4K adresser, men for enheter så trenger man gjerne kun en håndfull adresser - de resterende adressene innenfor den brukte blokken er vanligvis "bortkastet". En oversimplifisering av logikken fører også til en duplisering av enheter på alle adresse der det samme bit-mønsteret går igjen.

$00 00000000 0 Digital IO – 0 R=Knapper W=LED
$38 00111000 56 ROM/RAM Paging W=Bytt aktiv modul
$80 10000000 128 Serial IO – 0 R=Status W=Control
$81 10000001 129 Serial IO – 1 R=RX W=TX

torsdag 20. april 2017

RC2014 RAM

Dette er et innlegg relatert til byggingen av RC2014, se introduksjon, og vil mer eller mindre være mine egne notater relatert til denne spesifikke modulen.


RAM

RAM, eller uten forkortelsen - Random Access Memory, er hovedminnet i maskinen. Den dag i dag er beskrivelsen kanskje litt pussig, mer eller mindre fordi man sjelden ønsker å bli overlevert tilfeldige ting fra minnet. Forklaringen hadde nok mer med at sammenlignet med de tidligere typene minne basert på magnetbånd så var man her i stand til å hoppe rundt i minnet som ønsket, helt uten bruk av spoleknappen.

RC2014-maskinen kommer med 32 KB RAM montert, med tanke på at datidens datamaskiner gjerne kom med 4 KB minne så må dette kunne regnes som ekstravagant - gjerne kun et alternativer! Bruken av 62256-brikker i hjemmebygde 8-bit datamaskiner er svært vanlig, av den enkle årsaken av at disse brikkene er tilgjengelig for småpenger - kjøpte fem av dem for rundt 30 NOK. 

Adressering

Adresseringen utført når det kommer til RAM-brikken er svært enkel, vi vet at den øverste halvdelen av adresserommet er RAM (fra $8000 til $FFFF) - se RC2014 Memory Map.
Binær adresse (x = don't care)
1xxx xxxx xxxx xxxx
Med andre ord bryr vi kun om den øverste adresselinjen (A15), dersom denne er høy så vet vi at adressen spesifisert er innenfor RAM-brikken. 62256 i likhet med ROM er kun aktiv dersom vi sender Chip Enable til jord, med andre ord må vi bruke en HEX Inverter for å snu dette signalet (74LS04).

Resterende logikk benytter et sett med OR-gater (74LS04) for å avgjøre hvorvidt vi ønsker å skrive eller lese data fra brikken.


RC2014 Backplane

Dette er et innlegg relatert til byggingen av RC2014, se introduksjon, og vil mer eller mindre være mine egne notater relatert til denne spesifikke modulen.


Backplane-8

Denne modulen kan så lenge man fokuserer hardt på det kalles maskinens hovedkort, bare ikke i den grad vi funksjonsmessig tenker på dem i dag - alt etter ønsket oppsett vil kortet potensielt kunne benyttes uten en eneste aktiv komponent. Det har 8 spor for bruk av RC2014 moduler, de tilsvarende pin-ene på hver slot er koblet sammen slik at hver av disse potensielt sett kan kommunisere over de samme kablene.

RC2014 kommer i utgangspunktet med hovedkort for 5 spor, men kan oppgraderes til 8 for et tillegg i prisen. Selve maskinen i seg selv trenger 5 spor for å fungere, så denne konfigurasjonen etterlater ikke rom for andre tilleggs-moduler - enten disse er kjøpt inn i tillegg eller er noe man har laget selv.

Alternativer for montering

Bildet under viser modulen slik jeg valgte å montere den, men det er god del alternativer man bør vurdere i denne sammenhengen.


Reset

Denne kretsen, den samme kretsen er også duplisert på klokke-modulen (se RC2014 Klokke for detaljer). I utgangspunktet er dette praktisk gitt at man kommer til å benytte maskinen slik den, personlig har jeg noen noenlunde fjerne tanker om å en dag bygge en 6502-basert maskin med utgangspunkt i det samme kortet - 6502-prosessoren i seg selv krever en noe mer sofistikert metode for å gjøre dette, det å ha kretsen tilstede her vil da bli en potensiell feilkilde.

Med andre ord, skal du benytte modulen i sammenheng med andre typer prosessorer så anbefaler jeg å droppe knappen samt tilhørende resistor.

Strømplugg

Manualen var ikke helt forståelig på hvordan man skulle koble disse tingene sammen, men den nevner muligheten til å sette inn en LM7805-strømregulator samt noen uspesifiserte elektrolytiske kapasitatorer i posisjon C1 og C2 (en gjetning basert på Google, tilsier 100uF og 10uF). Dette gjør at man kan plugge inn noe med spenning fra 7V til 25V.

Selve maskinen i seg selv opererer med utgangspunkt i 5V, noe som er det samme vi benytter for alt av ladere til mobiltelefoner og lignende. Gitt at regulatoren alltid vil ha et spenningsfallet, det er det som gjør at vi må ha en spenning på minimum 7V for at LM7805-regulatoren skal være i stand til å regulere den ned til 5V. Gitt mobilladeren som strømkilde ville vi dermed endt opp med å sløse med strøm for å regulere fra 5V til eksempelvis 12V, for så å regulere denne ned til 5V igjen.

Dette løses ved at man dropper å montere disse komponentene, men heller lodder på en 2-pin header som så jumperes for å indikere at det som kommer inn er ren 5V. Risikoen er selvsagt at dersom du da kobler til noe med langt høyere spenning, så kommer stua til å lukte brent silikon en stund fremover.

Isolering av spor

Modulen Backplane-8 gir muligheten til å isolere sporene 1 og 2 samt 7 og 8 fra resten av systemet, med dette menes at disse ikke vil se adresselinjene samt data-bussen dersom man ikke ønsker det. 

Manualen antyder at man bør lodde på tvers av disse, i og med at dette virket å redusere mulighetene så trodde jeg at jeg visste bedre og heller gikk inn for å montere pin-headere og så brukere jumpere for disse.

Det første problemet som åpenbarte seg rimelig raskt var at jeg er altfor dårlig til å lodde at dette kunne fullføres helt uten å skape 3-4 ekstra koblinger mellom ulike punkter (ikke en god ting), endte opp med å angre avgjørelsen innen kort tid. Ikke sikker på om jeg hadde unngått problemstillingen ved å bare lodde på tvers, de fleste problemene jeg hadde var mellom linjene. Problem nummer to var selvsagt at dette krevde 60 headere, hvem har slikt liggende? Ikke denne karen, og Kina er en måned postgang unna.

En anbefaling dersom du mot formodning skal lodde sammen en maskin av denne typen, og snublet over denne bloggen (only Google can tell); monter dem på andre siden av kortet, det vil si at pin-ene peker nedover. Erfarer nå at headerne kommer litt i veien for noen av kortene, vil sterkt anta at når jeg selv kommer i gang med med prototyping av kort med forskjellig tykkelse så kan dette potensielt sett bli en uønsket irritasjon.

onsdag 19. april 2017

RC2014 ROM

Dette er et innlegg relatert til byggingen av RC2014, se introduksjon, og vil mer eller mindre være mine egne notater relatert til denne spesifikke modulen.

ROM

ROM, eller uten forkortelsen - Read Only Memory, er ofte den eneste formen for permanent lagring av data på digitale kretser. Den dataen man lagret var i utgangspunktet det vi i dag refererer til som et operativsystem, med andre ord den grunnleggende programvaren som var nødvendig for å utføre selv de mest grunnleggende funksjoner slik som å lese inn inndata fra et tastatur og så vise dette på en skjerm.

Vel å merke så var det ikke alle av de opprinnelige datamaskinene som hadde noen form for programvare tilgjengelig, flere av dem slik som eksempelvis Cosmac ELF var avhengig av at brukeren manuelt programmerte den ved bruk av fysiske brytere på forsiden av den - mye blod, svette og tårer der bare for å få et enkelt lys til å blinke. RC2014 kommer heldigvis med NASCOM Basic installert ROM, modulens dokumentasjon tilgjengelig på http://rc2014.co.uk/modules/switchable-rom/.

Adressering

Var i utgangspunktet litt usikker på hvor denne skulle plasseres innenfor minnet, se RC2014 Memory Map, ettersom modulen har jumpere for konfigurering innenfor et 64K adresser-rom. Sett fra prosessoren og operativsystemet (Basic) sin side så er ROM alltid plassert på adressene fra $0000  til $1FFF - jumperne på modulen lar deg avgjøre hvilket 8K vindu innenfor EPROM-modulen (standard er 27C512, det vil si 64KB) som man er i stand til å se.
Binær adresse (x = don't care)
000x xxxx xxxx xxxx
Implementasjonen av denne logikken utnytter det faktum at for å signalisere til ROM at den skal svare på "henvendelsen" (husk at bare en brikke kan være aktiv på bussen til ethvert tidspunkt) slik den er nå så må CE (Chip Enable-pin på EPROM-brikken) dras til jord, den gjør dette ved å detektere hvorvidt adresse-linjene A15-13 har positiv spenning ved bruk av et sett med OR-gater (74HCT32).

Husker absolutt ingenting av det jeg lærte om boolsk algebra fra videregående, så for å forstå hvordan denne logikken fungerte fremfor å dra frem mattebøkene (har denne boken fortsatt, nederst i en veldig stor stabel) så fant det enklere å bare simulere den isteden ved bruk av Logic Gate Simulator:


RC2014 Memory Map

Dette er et innlegg relatert til byggingen av RC2014, se introduksjon, og vil mer eller mindre være mine egne notater relatert til dette spesifikke temaet.

Memory Map

RC2014 er basert på prosessoren Zilog Z80, se også innlegg RC2014 Prosessor. Dette er en 8-bit prosessor med adressering basert på 16 linjer - dette gir i utgangspunktet et maksimalt adresse-rom på 64K. Kartet er basert på mitt magre utvalg av tilleggskort, men er godt mulig dette endrer når kreditt-kortet mitt har fått muligheten til å kjøle seg litt ned.

$0000 - $0FFFF ROM
$1000 - $1FFFF
$2000 - $2FFFF
$3000 - $3FFFF
$4000 - $4FFFF
$5000 - $5FFFF
$6000 - $6FFFF
$7000 - $7FFFF
$8000 - $8FFFF RAM
$9000 - $9FFFF
$A000 - $AFFFF
$B000 - $BFFFF
$C000 - $CFFFF
$D000 - $DFFFF
$E000 - $EFFFF
$F000 - $FFFFF

Hver av radene er blokker av 4K, med start og slutt-adresse for den spesifikke blokken angikk i HEX. Den siste kolonnen er inntil videre etterlatt tom i tilfelle jeg finner noe verdt å notere om de spesifikke blokkene, eventuelt så syntes jeg bare det virket mer symmetrisk. Hvem vet?