torsdag 18. mai 2017

RC2014 IDE Compact Flash (revidert prototype)

Dette er et innlegg relatert til RC2014 og vil mer eller mindre være mine egne notater relatert til denne oppdaterte versjonen av RC2014 IDE Compact Flash-modulen.

RC2014 IDE Compact Flash

Har tatt en nærmere titt på andre Compact Flash (CF) kort som har vært utviklet for bruk sammen med Z80-baserte datamaskiner, ser ut til at disse løsningene legger på ekstra logikk for å kombinere direkte kombinere IOREQ med RD samt IOREQ med WR for å få de tilsvarende IORD og IOWR signalene.

(Designskisse, tilgjengelig i PDF-format

Ikke sikker på om dette gjør noen stor forskjell i og med at prototypen jeg loddet sammen på altfor lang tid tilsynelatende fungerte (det vil si; ETTER at jeg stokket om alle dataledningene slik at de ikke var bak fram). Uansett, det å bestille og få produsert nye PCB-er koster penger i tillegg til at de produsentene jeg har råd til er rundt en måned unna i postgang. Med andre ord... Jeg har råd til å bruke 5 kroner ekstra i komponenter for å unngå problemer jeg ikke har opplevd, bare for sikkerhetens skyld.

lørdag 13. mai 2017

RC2014 Bruk av Compact Flash

Dette er et innlegg relatert til RC2014, se introduksjon, og vil mer eller mindre være mine egne notater relatert til denne egenutviklede modulen. Har laget en egen Compact Flash modul basert på ATA-standarden, det vil si bruk av kortet som en IDE-enhet - les innlegget RC2014 IDE Compact Flash for detaljer om maskinvaren. Dette innlegget håndterer programvaresiden.

Compact Flash (CF)

Modulen benytter seg av en 74HCT138N-brikke for håndtering av adresseringen, dette gjøres på samme måte som på Grant Searle sitt design samt slik det gjøres på den tilsvarende offisielle RC2014-modulen - holder disse detaljene identisk for å på sikt kunne bruke den samme programvaren uten endringer. Modulen som jeg laget vil dermed ikke skille seg fra de offisielle, informasjonen nevnt her vil med andre ord være generell og ikke spesifikk for min modul.

Binær adresse (x = don't care)
x001 0???

Som ved tidligere IO-moduler så betyr don't care at man ikke tar stilling til verdiene, men det betyr ikke at man unngår kollisjoner dersom andre enheter benytter adresser som overlapper - typisk vil dette si at modulene vil gjentas flere ganger i adresserommet for hver av kombinasjonene, i dette tilfellet på adressen $10 (16) og $90 (144).

Helt spesifikt så må A6 være lav for å aktivere 74HCT138N, selve adapteren er koblet til Y2 på denne og avgjør dermed at A5, A4 og A3 må være L H L. De resterende bit-ene benyttes for å angi registrene benyttet for å snakke med den ATA-baserte enheten.

Registre

Med adressen $10 som utgangspunkt har man følgende relevante registre tilgjengelig på enheten:

AdresseBeskrivelse
HEXDECRegisterMerknad
$1016DataData ut (les) / Data ut (skriv)
$1117Error / FeatureFeilmelding (les) / Funksjon (skriv)
$1218Sector countAntall sektorer
$1319LBA 0LBA Adresse (A0 - A7)
$1420LBA 1LBA Adresse (A8 - A15)
$1521LBA 2LBA Adresse (A16 - A23)
$1622LBA 3LBA Adresse (A24 - A27), angi enhet
$1723Status / CommandStatus (les) / Utfør kommando (skriv)

Antallet sektorer angir hvor mange sektorer man skal håndtere innenfor en enkelt lese/skrive- operasjon, minste antallet er 1 og hver sektor er 512 byte (man må håndtere hele blokken). Sektorer angis sekvensielt ved bruk av en 28-bit adresse, disse angis gjennom LBA 0 - 3. LBA 0 - 2 de første 24 bit-ene av adressen, LBA 3 inkluderer de siste 4 bit-ene i den 28-bit sektor-adressen samt at man også her angir hvilken enhet som skal adresseres (Master / Slave) - for å holde ting enkelt bruker vi her bare E0 for å lese/skrive til Master.

For å arbeide med enheten vil man kort sagt skrive til et eller flere registre, deretter sende en kommando via kommando-registeret for å få den til å utføre den. Underveis må man sjekke status-registeret for å vite hvorvidt enheten fungerer som forventet, eventuelt er klar til å motta videre kommandoer - svaret vil være en enkel byte der hver bit har følgende betydning:
765x 3xx0 - Bit (x = don't care)
1         - Busy, enheten er opptatt
 1        - Ready, enheten er klar til å motta kommando
  1       - Write Fault, skrivefeil oppstått
     1    - Data request ready, data tilgjengelig for utlesing
        1 - Command error, forrige kommando feilet

Lese data

For å benytte seg av CF-kortet må man i praksis først initialisere kortet, det vil si å sette opp de innstillingene vi trenger for å arbeide med kortet i 8-bit modus (legg merke til CF er den eneste gjenlevende maskinvaren som støtter dette, moderne harddisker gjør ikke det). Deretter skriver man en 28-bit adresse til LBA adresse-registrene, sender kommando for å gjøre data tilgjengelig for lesning og til sist må vi lese ut hele sektoren.

Det meste av programvaren jeg har sett for Z80-baserte maskiner har vært implementert i Assembly, men har for tiden ikke noen løsning for å overføre kompilert programvare til maskinen så valgte å implementere rutinene i Basic isteden.

10 print "Set CF 8-bit mode"
15 OUT 17, 1
16 OUT 23, 239

20 PRINT "Disable write cache"
25 OUT 17, 130  
26 OUT 23, 239

30 PRINT "Set sector count = 0"
35 OUT 18, 1

40 PRINT "Set address = 0"
41 OUT 19, 0
42 OUT 20, 0
43 OUT 21, 0
44 OUT 22, 224
45 OUT 23, 32

50 PRINT "Read first sector:"
55 FOR I=0 TO 511 STEP 8
60 PRINT I;":";
65 FOR B=0 TO 7
70 PRINT INP(16);
75 NEXT B
80 PRINT
85 NEXT I

Dersom man får feilmeldinger, eller at ting ikke fungerer som forventet så kan man lese ut statusen fra registeret på $17. Strengt tatt bør man sjekke statusen mellom hver av kommandoene som utføres, dette for å være sikker på at CF-kortet er klart før man fortsetter - dette har jeg hoppet over her ettersom Basic i seg selv er såpass tregt at man ikke trenger dette, men skriver man tilsvarende Assembly-kode så må man gjøre dette.

For å verifisere at det man får lest ut er korrekt, så kan man åpne kortet i en Hex editor med støtte for dette (eksempelvis WinHex) - på mitt kort gir denne visningen under (til venstre). Gitt at ingenting ryker eller lukter brent elektronikk så vil man ved bruk av skriptet ovenfor få en utskrift slik den vist under til høyre.

  

Legg merke til at en Hex-editor viser, som navnet antyder alt av data i Hex mens skriptet jeg har lagt inn viser utskrift i desimal - for å sammenligne data må man oversette mellom tallsystemene, den vanlige kalkulatoren i Windows vil kunne gjøre dette. Får man det samme resultatet på begge sider, så vet man at kortet fungerer som forventet - i det minste under optimale forhold!

RC2014 IDE Compact Flash

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


IDE Compact Flash (CF)

Compact Flash, heretter referert til som CF, er en type minnekort som har vært tilgjengelig på markedet siden 1994. Til tross for at man i dag bruker man de langt rimeligere SD-kortene på det meste av kameraer og lignende så er de gamle CF-kortene fortsatt tilgjengelig for salg, noe som er bra for oss ettersom CF til tross for prisen er langt enklere å benytte sammen med gammel maskinvare (eventuelt ny maskinvare basert på horribelt utdatert teknologi slik som RC2014). Grunnen til dette er at CF kan benyttes direkte i 8-bit modus mens SD gjerne er implementert gjennom SPI, en kommunikasjonsform som oftest assosiert med mikrokontrollere og ikke datamaskiner.

Det er tilgjengelig en modul på markedet som man kan kjøpe inn og benytte bruk av Compact Flash-basert lagring, blant annet denne fra skaperen av RC2014-maskinen. Denne benytter dessverre en SMD-basert komponent (selve CF-holderen), noe som for min del betyr smått som helvete og langt unna det jeg har utstyr og tålmodighet til å håndtere.

CF-holderen er ikke mulig å oppdrive i en utgave med mer håndterbare størrelse på ledningene (50 av dem i alt), så gode råd er med andre ord dyre! Eller ikke, bestilte en bunch av komponenter til nesten ingenting direkte fra Kina.

Løsningen jeg valgte falt på bruken av en billig CF til IDE ATA adapter, i utgangspunktet en løsning for å erstatte en IDE harddisk med CF - ikke det at fins et spor av logikk på kretskortet, og av den grunn kan vi benytte dem direkte innenfor gammel maskinvare. På nettbutikken der jeg kjøpte den, AliExpress - se også innlegg Erfaringer med AliExpress.com, er denne beskrevet som 3.5 inch 40 pin CF to IDE Compact Flash Card Adapter Bootable 3.5" HDD Hard Drive Converter Adaptor Male Connector til rundt 15 kroner.

(Designskisse, tilgjengelig i PDF-format

Skissen baserer seg i all hovedsak på skissene laget av Grant Searle, referanse-skissen i midten er hentet fra hans side på http://searle.hostei.com/grant/cpm/ med tilpasninger for å bruke IDE ATA pluggen gjennom adapteren benyttet.

Merk at jeg benytter meg av 74HCT138 for håndtering av adresser, ikke 74LS138 - denne vil være mer egnet "hastigheten" på maskinen, men i teorien kan det hende at det fungerer likevel. Sistnevnte var den jeg hadde tilgjengelig i KiCad-programvaren, lenge leve latskapen!

Har designet en PCB ved hjelp av KiCad, men har per nå hverken bestilt eller fått produsert noen fysiske utgaver av kortet så da får man se hvordan det går når man får gjort dette. Inntil videre så får man ta til takke med å vise frem skissen i 3D.


Har derimot brukt et par ettermiddager på å bygge en fungerende versjon av kortet ved å lodde dette sammen på prototyping-kort. Mye arbeid for det som strengt tatt er en veldig moderat mengde kabling, men når man mangler erfaring og vett på området så starter man bare i en ende og fikler til det fungerer - noe som definitivt ga utslag i at jeg loddet alle datakablene i omvendt rekkefølge!


Se det neste innlegget, RC2014 Bruk av Compact Flash, for detaljer om hvordan kortet fungerer på programvarenivå samt hvordan man kan gjøre noe så basalt som å hente ut data fra kortet!

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.