ROM en RAM in een ROMforth

Vergelijkbare documenten
n o F o r t h voor MSP430 Launchpad 1. Memory map Er zijn twee ROM gebieden (alle getallen zijn hex): , verdeeld in vier blokken van 40

Een mechaniekje met mogelijkheden in forth (2002) Albert Nijhof

R e c h t e h a k e n

What's in a name? (Over datamanagers)

Acht opgaven met antwoorden (Albert Nijhof)

UNIVERSITEIT ANTWERPEN FACULTEIT WETENSCHAPPEN DEPARTEMENT WISKUNDE-INFORMATICA OBERON CODE CONVENTIONS

Programma HCC!Forth komende zaterdag

Pascal uitgediept Data structuren

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

1) Intro biped. Commando's: Demo:

Geheugenbeheer. ICT Infrastructuren 2 december 2013

Computervaardigheden. Universiteit Antwerpen. Computervaardigheden en Programmatie. Grafieken en Rapporten 1. Inhoud. Wat is scripting?

In de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal.

Zelftest Programmeren in COBOL - deel I

Tentamen Computersystemen

Programma HCC!Forth komende zaterdag

Examen Algoritmen en Datastructuren III

Inhoud. Informatica. Hoofdstuk 5 Scripting. Context. Editor voor Programmeercode. Scripting 1

THEORIE TALSTELSELS. 1 x 10 0 = 1 (een getal tot de macht 0 = 1) 8 x 10 1 = 80 2 x 10 2 = x 10 3 = Opgeteld: 9281d(ecimaal)

Programma HCC!Forth komende zaterdag

Teamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008

Inleiding Programmeren 2

HOE TEKEN IK EEN OMGEVINGSMODEL

Programma HCC!Forth komende zaterdag

DOMjudge teamhandleiding

Programma HCC!Forth bijeenkomst in augustus

Dynamiek met VO-Script

Privacy instellingen in ios 9! Dit zijn de privacy instellingen van ios 9 die je moet weten.

Een spoedcursus python

Getalformaten, timers en tellers

Linux Assembly Uitwerkingen van de vragen en opdrachten

Korte uitleg: Wat doet de shell met mijn commandoregel?

Computerarchitectuur. H&P Appendix A: Instruction Set Principles

Computerarchitectuur. H&P Appendix A: Instruction Set Principles

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Inleiding Programmeren 2

Variabelen gebruiken in ons programma

Antwoorden vragen en opgaven Basismodule

Proeftentamen in1211 Computersystemen I (NB de onderstreepte opgaven zijn geschikt voor de tussentoets)

Samenvatting Computer Architectuur

Opgave Tussentijdse Oefeningen Jaarproject I Reeks 4: Lcd Interface & Files

Info-books. Toegepaste Informatica. Deel 20 : Algoritmen en programmeren in Access en Excel (Basis) AL20. Jos Gils Erik Goossens

De Soldeerbout: Memorymappers

Dynamisch geheugen beheer

Sparse columns in SQL server 2008

Opgaven. Python Assessment

Programmeren onder RISC OS: de snelstart. in BBC-Basic

Programmeermethoden. Controle-structuren. Walter Kosters. week 3: september kosterswa/pm/

{ specificatie (contract) en toelichting }

ˆ het voorkomen van bepaalde woorden in de body van de mail,

Tentamen Computersystemen

/20. richtlijnen. Lees deze richtlijnen! Log in op de pc met. login: paswoord: examen i examen001. Log in op. x.toledo.ucll.be

Oefententamen 2. Tijd: 2 uur. Maximaal aantal punten: 30. Naam: Studentnummer:

Vraag 1 (2 punten) (iii) Een lees-opdracht van virtueel adres 2148 seg 0, offset idem

Cursus Programmeren en Dataverwerking.

Formulieren maken met Dreamweaver CS 4/CS 5

Let op dat de scoping regels gerespecteerd blijven; het volgende voorbeeld mag geen fout melden.

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

Wat als je een heleboel informatie wilt opslaan? Bijvoorbeeld alle namen van iedereen die bij jouw dojo's aanwezig is? Hier gebruik je een lijst voor:

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

Amorized Analysis en Union-Find Algoritmiek

2 Algemene opbouw van een computersysteem

Pascal uitgediept Recursie

Programmeren (1) Examen NAAM:

BEGINNER JAVA Inhoudsopgave

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

10 Meer over functies

17 Operaties op bits Bitoperatoren en bitexpressies

5 april _iv3_indeling_JSON.docx

II. ZELFGEDEFINIEERDE FUNCTIES

Combinatoriek groep 1 & 2: Recursie

Java virtuele machine JVM

FAT32 disk structuur 2007 stam.blogs.com

Dynamisch Programmeren. Het Rugzakprobleem

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

Small Basic Programmeren Text Console 2

Wat zijn de verschillen tussen SPSS 9 en SPSS 10?

Organiseer uw verschillende SOAP services in één scenario

Opgaven Registers Concurrency, 29 nov 2018, Werkgroep.

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

De Arduino-microcontroller in de motorvoertuigentechniek (2)

Hoe werkt een computer precies?

Handleiding ISaGRAF. Wil men het programma bewaren, dan is het verstandig een back-up te maken: C9 Back-up / Restore

Maak een pivot uit een Generic.List

Je gaat leren programmeren en een spel bouwen met de programmeertaal Python. Websites zoals YouTube en Instagram zijn gebouwd met Python.

Microcontrollers Week 4 Introductie microcontroller Jesse op den Brouw (met dank aan Ben Kuiper) INLMIC/

Assembly en Assemblers. Processoren 5 januari 2015

Examen computerarchitectuur

MICRO:BIT. Uitdaging 5 Magic8. Origineel: Micro:bit Educational Foundation 2016 Vertaling: CoderDojo Kennemerwaard 2017

FIT TEST 4 MENDIX. Low code & kwaliteit

Het Versacom systeem is gedefinieerd in DIN 43861, deel 301 als "transfer protocol A".

1 Rekenen in eindige precisie

Werkboek studiekeuzecheck Opleiding HBO-ICT

SQL datadefinitietaal

Digitale Systemen (ET1 410)

Bij dit hoofdstukken horen geen opgaven.

Tentamen Kunstmatige Intelligentie (INFOB2KI)

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse

SERVICE LEVEL AGREEMENT SERVICE LEVEL AGREEMENT ADDENDUM VIRTUALISATIE VERSIE

Transcriptie:

Albert Nijhof 24/06/2016 ROM en RAM in een ROMforth Vragen Twee HERE's? Voor een forth die in (Flash)ROM compileert is het uitgangspunt dat programmacode en onveranderlijke data naar ROM gaan en veranderbare data in RAM thuishoren. Zijn er dan twee HERE's nodig? Dubbele set commando's? Schrijven naar ROM is technisch een andere actie dan schrijven naar RAM. Hebben we nu een dubbele volledige set commando's nodig van woorden die iets in het geheugen zetten of veranderen? CFA in RAM? DOES> overschrijft het CFA van een woord, maar dat is niet mogelijk in ROM. Moeten CFA's daarom in RAM liggen? Body in RAM of in ROM? CREATE TEST Staat er na uitvoering van TEST nu een RAM of een ROM adres op stack? Omdat de forthstandaard deze zaken niet regelt zal een forth die in ROM compileert altijd afwijken van de standaard. Antwoorden ROM woorden en RAM woorden -- voor ROM -- ROMHERE ROM! ROMC! ROMMOVE ROM, ROMC, ROMALIGN ROMALLOT ROMCREATE -- voor RAM -- RAMHERE RAM! RAMC! RAMMOVE RAM, RAMC, RAMALIGN RAMALLOT RAMCREATE

Oplossing 1: Woorden die een doeladres op stack meekrijgen zou je "adres-smart" kunnen maken, Forth zoekt dan zelf wel uit of het ROM of RAM is. Helaas gaat die vlieger niet op voor woorden die rondom HERE functioneren. Omdat het doeladres van bijvoorbeeld C, impliciet is moet de programmeur op een of andere manier aan kunnen geven of het ROMHERE of RAMHERE betreft. Oplossing 2: Maak twee losse woordjes ROM en RAM die schakelen tussen RAMmodus en ROMmodus. De haken en ogen die daaraan zitten laat ik voor wat ze zijn, want er is een eenvoudiger oplossing: De noforth oplossing Voor noforth hebben we een eenvoudiger oplossing bedacht. Bij nadere beschouwing blijkt dat de lijst met dubbele commando's behoorlijk uitgedund kan worden. We kunnen volstaan met de standaard forthwoorden zonder de voorvoegsels ROM of RAM plus slechts twee nieuwe woorden CHERE en M, (rood gedrukt in deze tekst). Twee HERE's Ja, we hebben twee HERE's nodig. HERE is de data space pointer in RAM. CHERE is de dictionary pointer in ROM (code-here). Je zult CHERE zelden expliciet gebruiken. ROM woorden De kommawoorden, C, M, en ALIGN gebruik je alleen bij CHERE in ROM. Met M, (een meervoudige C,) voeg je bij CHERE een string toe aan de dictionary. Hij vervangt de functie van een MOVE naar ROM. : M, ( adr len -- ) 0?DO COUNT C, LOOP DROP ; Detail: In noforth kijkt een woord dat x naar ROM moet schrijven eerst of x er al staat. Zo ja, dan blijft de schrijfactie achterwege. Dit voorkomt overbodige schrijfacties in ROM. Waarom zijn de kommawoorden en ALIGN niet nodig voor RAM? Stel je hebt een programma in noforth geladen en bevroren met FREEZE. Als het programma tijdens het compileren RAM gereserveerd heeft en die RAM tegelijkertijd met data heeft gevuld (dat is wat RAM, en RAMC, doen) gaat de inhoud van die gereserveerde RAM verloren bij het uitzetten van de chip. Hoe los je dit op?

Door de RAM tijdens het compileren alleen maar te reserveren, met behulp van ALLOT. De inhoud van die RAM is dan onbepaald. Later, in runtime, zet je met de gewone store-woorden de beginwaarden in de gereserveerde RAM. Om deze reden is er in noforth geen getal op stack nodig bij de definitie van een value. De inhoud van een zojuist gedefinieerde value is onbepaald. (Misschien hadden we hem VAL moeten noemen?) Bij ALLOT geef je expliciet op hoeveel ruimte je reserveert. Je kunt er zelf voor zorgen dat dit altijd een even hoeveelheid is (afhankelijk van de processor). Dat maakt een ALIGN voor RAM overbodig. RAM woorden ALLOT reserveert ruimte bij HERE in RAM. Later kunnen die gevuld worden met! C! en MOVE. Ook andere niet-kommawoorden die iets in het geheugen veranderen zoals: +! TO *BIS *BIC *BIX UPPER MOVE FILL enz. functioneren alleen in RAM. Waarom zijn! C! en MOVE niet nodig voor ROM? Het schrijven naar onbeschreven ROM gebeurt altijd incrementeel bij CHERE met de kommawoorden (behalve: zie "Patchen in ROM" hieronder). Woorden die iets veranderen in het geheugen zoals bijvoorbeeld +! zijn onbruikbaar in ROM Dit is wat er overblijft van de RAM/ROM woorden: voor RAM: HERE! C! MOVE ALLOT voor ROM: CHERE, C, M, ALIGN Patchen in ROM Mocht je bij hoge uitzondering ooit een ROMALLOT nodig hebben, bijvoorbeeld voor het maken van een tabel in ROM die je om een of andere reden pas achteraf denkt te kunnen vullen, dan kun je dat oplossen met bijvoorbeeld CREATE LIJST CHERE 8 M, CHERE schuift 8 bytes op, maar er wordt niets naar ROM geschreven. Om de tabel te vullen heb je ROM! ROMC! of ROMMOVE nodig. Ze bestaan in noforth (ze zitten in de kommawoorden) maar als programmeur zul je ze zelden gebruiken.

DOES> In noforth kan CREATE al deze situaties aan: 1. CREATE in ROM zonder DOES> 2. CREATE in ROM met DOES> 3. CREATE met ALLOT in RAM zonder DOES> (allot-bit = 0) 4. CREATE met ALLOT in RAM en DOES> (allot-bit = 0) De noforth truuk met DOES> CREATE zet niets in het CFA van het nieuwe woord want er kan nog een DOES> komen. Hoe komt het juiste adres nu in het CFA terecht bij een CREATE zonder DOES>? Als je een woord uitvoert zul je het eerst moeten vinden. FIND controleert het CFA van ieder gevonden woord. Is het leeg? Dan wordt het alsnog gevuld met dorombody of dorambody, in overeenstemming met het allot-bit (zie verderop). CREATE in ROM zonder DOES> create HI ( -- ROMadr ) S" Hello! " dup c, m, align hi count type <enter> Hello! CREATE in ROM met DOES> : CONSTANT ( x 'name' -- ) create, does> @ ; 12 constant DOZEN dozen. <enter> 12 CREATE n ALLOT reserveert n bytes bij HERE in RAM. Als er achter het CFA van het nieuwe woord nog niets gecompileerd is, a l l e e n d a n, gebeurt er bovendien het volgende: De noforth truuk met CREATE A l l e e n d a n zet ALLOT een pointer naar de gereserveerde RAM in de ROMbody ( HERE, ) en maakt het allot-bit nul.

In noforth heeft elk woord naast een immediate-bit ook een allot-bit. Zoals IMMEDIATE het immediate-bit nul maakt, doet ALLOT dat met het allot-bit. Om te vermijden dat allot-bit en immediate-bit bij elkaar in een byte staan gebruikt noforth het laagste bit in het CFA als allot-bit. Dat bit zal toch ooit nul worden omdat er altijd een even adres in het CFA komt te staan. (Technisch kan een 1-bit in ROM 0 gemaakt worden, het omgekeerde is niet mogelijk zonder een heel blok te wissen.) Een leeg CFA wordt door FIND ingevuld in overeenstemming met het allot-bit. Daarna speelt het allot-bit geen rol meer. CREATE met ALLOT zonder DOES> (allot-bit = 0) : STRING ( #bytes 'name' -- ) create allot ; 8 string HI ( -- RAMadr ) : PLACE ( adr len dest -- ) 2dup c! 1+ swap move ; S" Ciao! " hi place hi count type <enter> Ciao! S" Ola! " hi place hi count type <enter> Ola! CREATE met ALLOT en DOES> (allot-bit = 0) : VVALUE ( 'name' -- ) create 2 allot does> @ @ ; vvalue TRY Tja, hoe kun je die nou vullen? : TTO ( 'name' -- ) ' >body @ state @ if postpone literal postpone! exit then! ; immediate 9 tto try try. <enter> 9 Bij de echte value wordt dat veiliger opgelost met TO maar het voert te ver om dat hier te beschrijven. Voor de puzzelaars: een van deze zeven definities is niet correct. Welke? Waarom? : VARIABLE1 here 2 allot create, does> @ ; : VARIABLE2 create here, 2 allot does> @ ; : VARIABLE3 create 2 allot here, does> @ ; : VARIABLE4 create 2 allot does> @ ; : VARIABLE5 here 2 allot constant ; : VARIABLE6 here constant 2 allot ; : VARIABLE7 create 2 allot ; <><>