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.

handwritten page
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).

Page 1 DIAMOND, DIAgnostic MONitor and Debugger
Page 2 Implementatie en gebruik van het virtuele geheugen met DIAMOND
Page 3 Opstarten van DIAMOND / Functies van de RESET en NMI toetsen.
Page 4 B. Breakpoint. Het zetten/weghalen van breakpoints.
Page 5 C. Call. Het CALL'en van een gebruikers subroutine.
Page 6 D. Dump. Dump geheugen, in hex en in ascii.
Page 7 E. Execute. Het uitvoeren van een gebruikersprogramma.
Page 8 I. Inspect. Display/verander registers.
Page 9 J. Jump. Het springen naar een vast (instelbaar) adres
Page 10 R. Registers. Laat alle registers zien.
Page 11 T. Test. Memory Test van alle reeele segmenten
Page 12 V. Set Jump adres.
Page 13 Z. Format Dump. Dump instructies in hex/ascii.


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_
FF_
BCB_
DED_
HLH_
SPS
A'A'
F'F'
BC'B'
DE'D'
HL'H'
IXIX
IYIY
II_
IFFIF

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
#>