DIAMOND reference, 1983
The DIAMOND reference shown here describes an early version of DIAMOND,
probably dating from late 1983. The original document was hand-written by Luc.

first page
The document does not describe the Alter command; this
appears to be an oversight in the original since the command was
certainly present in the earliest versions of DIAMOND,
without it you could not enter programs!
This version of DIAMOND did not have a Disassemble command; instead it
had a Format Dump command. This was a variant of the Dump
command that grouped and re-ordered the bytes for display; a skilled
Z80 machine language programmer (which we all were at the time)
could read this relatively easy, at least when compared with a
conventional hexdump. When a disassembler became available later,
we had to rename the Dump command (it became Hex Dump) so that
we could re-use the letter D for Disassemble.
The document contains 13 pages, each describing a separate
subject or command. You can read the document from top to bottom or
use the page index below (the numbering is not present in the original).
DIAMOND, DIAgnostic MONitor and Debugger
Zoals de naam al zegt, is het de taak van DIAMOND om het mogelijk te maken
programma's te kunnen intypen, testen, laden en wegschrijven.
Daarnaast bevat DIAMOND opstart routines voor ORDSYS.
DIAMOND geheugenopbouw / ORDINATOR geheugenopbouw
De ORDINATOR werkt met virtueel geheugen. Dit wil zeggen, dat het
geheugen hergroepeerbaar en verplaatsbaar is, vanuit de Z80 gezien.
De reëele, werkelijke, geheugencapaciteit van de ORDINATOR is 256K,
met reëele adressen 00000 tot en met 3FFFF.
Dit reëele geheugen is verdeeld in partjes van 4K, de reëele segmenten.
De virtuele geheugencapaciteit, dat wil zeggen het adresbereik van de
Z80, is maar 64K. Ook deze 64K is onderverdeeld in partjes van 4K,
de virtuele segmenten.
Het virtuele geheugenconcept nu houdt in, dat elk virtueel segment
via de zogenaamde Link Layout gekoppeld is aan precies één reëel segment.
Reëele segmenten kunnen dus op een bepaald moment helemaal niet, dan
wel tot 16 keer in het virtuele geheugen zitten.
Bovendien bied het ORDINATOR geheugenconcept nog de mogelijkheid
om per virtueel segment een hardware write-protect aan te brengen.
Schrijven naar zo'n segment is dan "dat in de lucht schrijven" en heeft
geen enkel effect.
Op dit concept is één uitzondering: de virtuele adressen 0000 tot en met
00FF (pagina nul). Deze pagina is altijd hetzelfde, en wel verbonden
met 3F000 tot en met 3F00FF (reëel).
We vinden hier de RESET, NMI en RST (Restart) routines.
Reëel segment 3E is 1K statische ram, 4-dubbel geadresseerd. De eerste
pagina hiervan bevat DIAMOND pointers.
Reëel segment 3F is 4K EPROM. Het bevat DIAMOND.
Segment 3E en 3F (reëel) zitten op de processor-kaart.
Omdat alle programma's op de ORDINATOR in virtueel geheugen moeten
draaien, bevat DIAMOND voorzieningen die het mogelijk maken,
DIAMOND te zien als een los-staand geheel, buiten de geheugen-structuur
van de ORDINATOR.
Alle geheugen operaties van DIAMOND vinden dan ook plaats in het
virtuele geheugen.
Implementatie en gebruik van het virtuele geheugen met DIAMOND
Alle geheugen-adressen via DIAMOND aangeroepen, worden door
DIAMOND gelinkt, verwezen, naar een reëel adres.
De tabel die DIAMOND hiervoor gebruikt heet de USER layout, ook wel
kortweg layout genoemd.
Er is ook een DIAMOND layout: de layout actief zolang DIAMOND run't.
De reëele segmenten van de user-layout zijn genummerd van 00 tot en met 0F.
Segmenten 10 tot en met 1F vormen de DIAMOND layout.
Deze layout(s) zijn te veranderen en bekijken met het L(ink) commando.
De layout bevat voor iedere reëel segment een virtueel segment nummer.
Hierbij wordt segment 3C + write protect gezien als "leeg" segment (vol met FF's).
Het specificeren van het reëele segment + write protect status gebeurt met ééen byte.
| Bit 0 tot en met 5 | : | het reëele segment nummer, 00 .. 3F |
| Bit 6 | : | ongebruikt (meestal 0) |
| Bit 7 | : | Write protect. |
Dus: BF wil zeggen: segment 3F write protected.
Opstarten van DIAMOND / Functies van de RESET en NMI toetsen.
Het volkomen koud opstarten van DIAMOND gaat met RESET NMI.
De functie van de RESET-toets:
Er wordt een initialisatie gedaan van de belangrijkste hardware dingen, b.v.
UART en CRTC, en een byte ge-set, zodat de volgende NMI een koude
start geeft.
N.B. Gebruik RESET nooit, behalve bij het voor de aller-eerste keer
opstarten van DIAMOND.
De functies van de NMI toets:
De NMI-toets heeft twee functies: Na RESET wordt een koude start
gegeven. Registers, Link Layout(s), Breakpoints enz. worden allemaal
gecleard.
Normaal: NMI onderbreekt het programma dat bezig was, en displayed en
saved de registers op het moment van de NMI. (Mogelijke uitzondering: PC)
B. Breakpoint. Het zetten/weghalen van breakpoints.
Syntax:
B .
B <adres>
Na de B drukt DIAMOND het aantal breakpoints af, of .... als er
geen is.
| U kunt dan | : | met . een eventueel breakpoint wissen. |
| |
| | met <adres> een breakpoint zetten of verplaatsen. |
Wanneer een gebruikersprogramma bij een BREAKPOINT komt, zal
het terugkeren in DIAMOND via de BREAKPOINT entry.
NB. Het breakpoint byte (FF) wordt pas geplaatst in een
Execute, Jump of Call.
Voorbeelden:
#>B .... ....
#>B .... 1A20
#>B 31A6 ....
#>B 3120 3A61
C. Call. Het CALL'en van een gebruikers subroutine.
Syntax:
C <return> <return>
C <adres> <return>
Zie voor complete beschrijving het E commando, met uitzondering van:
Voor CALL moeten onder SP minstens 10 (decimal) bytes RAM staan.
Na het CALL'en van de routine staat op de gebruikers-stack het
Return-adres van DIAMOND, 00C0, bovenaan, zodat een subroutine
mag RETurnen. U komt DIAMOND dan binnen via het RETURN
entry point.
Voorbeelden:
#>C 1000
C:CALLING 1000
*
#>:RETURN
#>:
#>:A F BC DE HL SP PC
#>:16 SZ.....C 1A63 2136 1A20 21A6 ....
#>:A' F' BC' DE' HL' IX IY I IFF
#>:00 ........ 0000 0000 0000 1236 0000 00 0
#>_
#>C 1A20
#C:3A26 <-- NO WRITE AT BREAKPOINT
#>_
#>C 1261
#C:CALLING 1261
_
D. Dump. Dump geheugen, in hex en in ascii.
Syntax:
D <return>
D <adres>
D <return> neemt het eind-adres van de vorige Dump.
Als het laatste Dump-Kind commando D was, kan D <return>
afgekort worden tot <return>
Het aantal lijnen dat per keer ge Dumpt wordt, is instelbaar.
Voorbeeld:
#>D 1000
#D:
#D: 0 1 2 3 4 5 6 7 8 9 A B C D E F
#D:1000
#D:1010 FF ......
E. Execute. Het uitvoeren van een gebruikersprogramma.
Syntax:
E <return> <return>
E <adres> <return>
Na de E wordt een adres verwacht: waar het programma moet starten.
D.M.V. <return> gaaft u aan, dat u door wilt gaan op PC. (PC moet
natuurlijk wel gedefenieerd zijn)
DIAMOND gaat dan: Breakpoints zetten, en pushen op de gebruikers-stack.
Voor EXECUTE moeten onder SP minstens 8 bytes ram staan!
Lukt dit niet, dan krijgt u de melding
#E:XXXX <-- NO RAM AT (SP) of AT BREAKPOINT
(NO LINK of NO WRITE kan natuurlijk ook).
De laatste <return> geeft aan, dat het programma moet beginnen.
DIAMOND drukt af EXECUTING XXXX en start het programma.
Voorbeelden:
#>E 1A36
#E:21F3 <-- NO LINK AT (SP)
#>_
#>E 1A36
#E:EXECUTING 1A36
_
I. Inspect. Display/verander registers.
Syntax:
I
Het I commando verwacht een register. Mogelijke registers zijn:
| A | | In te typen als | | A_ |
| F | | F_ |
| BC | | B_ |
| DE | | D_ |
| HL | | H_ |
| SP | | S |
| A' | | A' |
| F' | | F' |
| BC' | | B' |
| DE' | | D' |
| HL' | | H' |
| IX | | IX |
| IY | | IY |
| I | | I_ |
| IFF | | IF |
Van het ingetypte register wordt vervolgens de inhoud gedisplayed.
U kunt dan een nieuwe inhoud intypen
Voorbeeld:
#>I
#I:PC .... 1A36
#I:IFF 0 1
#I:IX 1A20
#I:<ESC>
#>_
#>I
#I:F SZ5N3HPC SZNP
#I:F ..5.3H.C <ESC>
#>
J. Jump. Het springen naar een vast (instelbaar) adres
Syntax:
J
Jump is eigenlijk een Execute, behalve dat je het adres niet in
hoeft te typen, en niet op <return> hoeft te drukken om uitvoering
te starten.
Zie voor complete beschrijving het E commando.
Ook voor Jump zijn 8 bytes RAM onder SP nodig.
NB. Het adres wordt ingesteld met het V commando.
Voorbeelden:
#>J
#J:JUMPING 1A21
_
#>V 0000 1063
#>J
#J:JUMPING 1063
_
R. Registers. Laat alle registers zien.
Syntax:
R
Voorbeeld:
#>R
#R:A F BC DE HL SP PC
#R:16 SZ.....C 016A 1A32 7A9F 3016 A261 3E 0C
#R:A' F' BC' DE' HL' IX IY I IFF
#R:00 ........ A217 3106 2A10 63A1 1A20 00 0
#>_
T. Test. Memory Test van alle reeele segmenten
Syntax:
T
Voor ieder segment wordt een status gedisplayd:
| .. | | ROM |
| ## | | RAM |
| ?? | | Beetje RAM, Beetje ROM |
De inhoud is na afloop niet veranderd.
Voorbeeld:
#>T
#T: 0 1 2 3 4 5 6 7 8 9 A B C D E F
#T:0000 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
#T:0010 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
#T:0020 ## ## ## ## ## ## ## ## .. .. .. .. .. .. .. ..
#T:0030 .. .. .. .. .. .. .. .. .. .. .. .. .. .. ## ..
#>_
V. Set Jump adres.
Syntax:
V <adres>
V <return>
Na V displayed DIAMOND het current Jump adres. U kunt dan
een nieuw adres intypen. <return> behoudt het oude.
Zie ook Jump.
Voorbeelden:
#>V 0000 16A4
#>V 1632 1632
Z. Format Dump. Dump instructies in hex/ascii.
Syntax:
Z <return>
Z <adres>
Z <return> gaat door op de vorige Format Dump.
Als het laatste Dump-Kind commando een Z was, kan Z <return>
afgekort worden tot <return>
Het aantal lijnen, dat per keer ge Format Dumpt word, is instebaar.
Voorbeeld:
#>Z 0000
#Z:0000 01 00FF ...
#Z:0003 3E BF >?
#Z:0005 C3 000B C..
#Z:0008 C3 F112 C.q
#Z:000B ED 79 my
#Z:000D C3 011E C..
#Z:0010 C3 F115 C.q
#>