HET CX - SCHAKELSYSTEEM

 
INLEIDING

Ter herinnering; de schakelkaart van de club is als volgt ingedeeld:

2 x 4k RAM op #A000
2 x 4k RAM op #E000
6 x 4k EPROM op #A000

De software in de zes 4k EPROMs en de twee 4k RAM-blokken op pagina A0 moet hetzij elk apart hetzij in samenwerking met elkaar te gebruiken zijn. Om het laatste te realiseren zal een vorm van 'bank - switching' moeten worden toegepast. (het beurtelings 'voor' schakelen van de betreffende voet)

Na de komst van de schakelkaart zijn een aantal schakelroutines ontwikkeld. In de loop der tijd zijn een groot aantal 4k EPROMS verschenen met een nog grotere hoeveelheid commando's, statements en functies. Er is onvoorstelbaar veel vernuft in dit werk gestoken en zeker niet in de laatste plaats door de leden van de Fed. Acorn Computerclubs zelf. Er is echter een maar. In (te) veel 'boxen' komt bijv. een 1200 Baud COS-routine, READ, DATA en ESTORE voor. Daarnaast verzetten Toolkit(box) en Superbasic van PP een aantal vectoren en maken het er niet gemakkelijker op deze op te nemen in een systeem. En last but not least is onze toch al aparte basic met P-CHARME verrijkt. Deze laatste 4k EPROM heeft onze ATOM min of meer uniek gemaakt. Een en ander heeft geleid tot het volgende concept.
  • Installeer als basis P-CHARME en gebruik de uitbreidings- faciliteiten daarvan.
  • Gebruik 4k EPROMS waarvan naar gebruiksaard gesorteerde routines voorkomen. (Calcrom, Wordpack en recent de Gagsrom en de DISKROM).
  • Maak daarnaast een EPROM met meer algemene, veelvuldig, toegepaste (basic) extensions..
  • De typische voor gebruik in eigen of kleinere kring bestemde uitbreidingen moeten de uitbreidings- mogelijkheden van P-CHARME simpel in het systeem kunnen worden geimplementeerd.
  • Ontwikkel een schakelsoft die dit aankan en initialiseer met een bootstraproutine een aantal systeemuitbreidingen (DOS,functietoetsen,controls,etc.).
  • Probeer alles zo gebruikersvriendelijk mogelijk te houden..
  • Documenteer alles zo volledig mogelijk..
Een schakelsysteem dat hieraan voldoet is het CX-systeem. (CX van Club-eXtension)

images/terug.gif

CX-systeem en P-CHARME met schakelkaart

De P-CHARME box is in eerste instantie bedoeld voor gebruikers zonder schakelkaart. Omdat de breakvector verwijst naar deze box zal P-CHARME niet weggeschakeld mogen worden tijdens een programma. De schakelroutine is gebaseerd op 'CHAIRPROGRAM' van Bram Poot, (zie AN 2.4, p.51 e.v.) en is zodanig aangepast dat de P-CHARME als eerste doorlopen wordt; omdat deze box een zeer zinvolle basic-uitbreiding vormt die niet door schakelen vertraagt mag worden. Tevens is het mogelijk omzelf ontworpen functies toe te voegen, doordat P-Fun van F.v.Hoesel is ingebouwd.
images/terug.gif

Beschrijving van de schakelroutine.

Bij binnenkomst op 1002 wordt eerst de "lock-feature" (het "vastzetten van een box") bekeken, eventueel een statement tabel op het 1000 blok doorlopen, waarna de P-CHARME adressen geinitialiseerd worden. Dit houdt in dat m.b.v. een indirecte sprong in P-CHARME via adres in het 1000-blok, hier #1100, in de schakelsoft teruggesprongen wordt (zie handleiding P-CHARME pg. 37). Wordt tijdens de interpretatie door P-CHARME een fout ontdekt, dan wordt teruggesprongen naar de schakelsoft. Hier wordt bekeken of een onbekend statement betreft (error 94), zo ja dan de schakelroutine in, als het een onbekende functie betreft (error 29): P-Fun in, zo nee dan verder in P-CHARME. In de schakelroutine wordt eerst het stuk #90-#9F waard voor o.m. de error aanwijs-routine waarna de overige boxen worden afgezocht met als laatste voet nummer 6 voor de P-CHARME-voet nummer 7. Indien het statement nog steeds niet is herkend kan nog een extra tabel doorlopen worden op een nader te bepalen plaats, indien geen gebruik van de mogelijkheid in P-CHARME gewenst is. Is het statement dan nog niet herkend dan wordt P-CHARME weer voortgezet, het stuk #90-#9F weer teruggezet en wordt een error gegeven, eventueel met aanwijzing. Indien een bepaalde box is "vastgezet", bit 6 van het schakelbyte is dan gezet, wordt over de gehele schakelroutine heen gesprongen, rechtstreeks deze box in. Dit gebeurt na het lezen van de tabel op #1Fxx zodat deze statements altijd bereikt kunnen worden. Het schakelen kan weer geactiveerd worden door een SHIFT/RETURN te geven. Het statement OFF kan eveneens hiervoor worden gebruikt.
images/terug.gif
Mogelijkheden.

In principe kunnen nu alle statements door elkaar in een programma gebruikt worden (ook in procedures en functies), mits ze niet blijvend zero-page adressen gebruiken in het stuk #90-#9F. Ttevens kan na de eerste run van een "PROGRAM" met een "GOTO" in een programma gesprongen worden. Uiteraard niet 'middenin' routines springen. Bovendien moet het mogelijk zijn een (mini) symbolische assembler hierachter te hangen of meerletterige variabelennamen. Een functie (bv. TRUE) kan in deze routine niet in combinatie met een andere box dan P-CHARME gebruikt worden (bv. DISAS(TRUE)). Dit lijkt mij geen onoverkomelijk bezwaar omdat de functie eerst aan een hulpvariabele kan worden gegeven (bv. A=TRUE;DISAS(A)).
images/terug.gif
Voorbereidingen

Wat te doen bij de practische realisatie?
Lees eerst om het geheugen wat op te frissen de artikels over het 'driewegwissel' in AN.2.2 p.61 e.v. Dan is het duidelijk dat er een aangepaste Floatingpoint EPROM moet worden gemaakt met een verwijzing naar het adres waar de schakelsoft staat. Kies voor de plaats waar de schakelsoft komt #1000 en niet #E000. Voor de nieuwe schakelkaart een kwestie van instellen; voor de oude kaart een 'daktuintje' bouwen op de LS 138 (IC.7) zoals hieronder is getekend. De niet gebruikte poten van de LS138 afknippen, buig de overige pootjes, behalve pen 8 en pen 16 (aarde en +5 V), horizontaal en 'scheer' ze totdat de 'lepeltjes' resten. Monteer nu het 'gecastreerde' IC op het tussenvoetje. Plak tot slot met tweecomponentenlijm e.e.a. vast en plaats het resultaat in voet 7.

images/ombouw-sk.gi

De onderstaande wijziging moet in de Floatingpoint Eprom worden aangebracht:

   D4AF: AD 00 10    LDA #1000
   D4B2: C9 40       CMP@#40
   D4B4: F0 0A       BEQ #D4C0
   D4B6: AD 01 A0    LDA #A001
   D4B9: C9 BF       CMP@#BF
   D4BB: D0 83       BNE #D440
   D4BD: 4C 02 A0    JMP #A002 
   

images/terug.gif
Zonder de bootstrap worden de mogelijkheden van de ATOM niet volledig gebruikt. Gebruik voet IC.24 op het Atomboard om een nieuwe, aangepaste, F-pagina te installeren volgens onderstaand schema.

Vanuit die aangepaste F-EPROM wordt nu met een indirecte jump naar het startadres van de bootstrap routine(s) gesprongen.

images/terug.gif De installatie

Als dit gereed is kan het CX gebeuren worden geinstalleerd.
  d.w.z.:

  CX-1.8      naar  #1000
  CX-2.7      naar  #A000 in voet 2
  P-CHARME    naar  #A000 in voet 7
  CX-DATA     naar  #6800 -- #7FFF (eventueel)

De overige EPROMS zoals CALC, EDIT, GAGSROM, DISKROM etc. naar de overige voetjes in willekeurige volgorde. Voorts is het hoodzakelijk voor een goede werking dat RAM in het geheugengebied #9800-#9FFF aanwezig is. Voor het gebruik van de interupt-routines is het VIA-IC noodzakelijk. Ook moet link 2 op het ATOM- board gesloten zijn.
images/terug.gif

Het gebruik.

SHIFT-BREAK

Hiermee wordt een orginele ATOM-break uitgevoerd. Dit moet gegeven worden als de machine aangezet wordt. Voor alle duidelijkheid: druk dus eerst op bv. SHIFT; daarna, dus samen met de SHIFT op BREAK; laat dan eerst de BREAK-toets los en daarna de SHIFT-toets. Stel we willen voor BREAK een bootstrap programma op #6800. Eerst het programma schrijven op #6800, daarna ?#7FFD=#68. Voor REPEAT-BREAK kan bijvoorbeeld een bootstrapje op #6A00, (?#7FFC=#6A), gezet worden.

BREAK ALLEEN

Reset de poorten, controleert of het DOS aangesloten is, zo ja: #DOS; controleert of de klok loopt, zo ja: doorlopen. De bootstrap vervolgt met de melding "BREAK"; indien een basic-programma liep volgt nog: "AT LINE XX". Dan wordt er gekeken op #7FFD om daar het paginanummer te halen waar eventueel een basic-bootstrapje staat. Op #7FFD kan een willekeurige pagina aangewezen worden om een basic bootstrap te plaatsen. Nadat de pagina-pointer van #7FFD is gehaald wordt eerst nog gekeken of daar inderdaad een programma staat; zo ja, dan wordt de TOP-pointer goed gezet (belangrijk voor DIM- statements) en het basic-programma gestart. Het is belangrijk om bij het gebruik van de bootstrap de write-protect van de schakelkaart aan te hebben omdat anders geheugenplaatsen gewijzigd kunnen worden door de processor. De oude text-space, van waaruit men de break gaf wordt opgeslagen op #9FFC om later te gebruiken, bv. om na het programma terug te springen naar de oude pagina.

ESC-BREAK

Indien men het basic-bootstrapje niet wil laten uitvoeren geef dan ESCAPE-BREAK. Er volgt dan tevens geen melding meer op het scherm. Indien in GRMOD een break gegeven wordt deze volgen met CTRL- L.

REPEAT-BREAK

Hierbij wordt het gehele systeem gereset, d.w.z. poorten goed zetten; indien het DOS aanwezig: *DOS; initialiseerd de DISKBOX, FAST, zet keyclics en page-mode aan; tijdmelding uit; scherm schoon, meldt "ACORN ATOM DOS CX-RESET" ( COS , indien geen DOS ) en geeft een overzicht van de basicprogramma's in het geheugen. Ook hier bestaat de mogelijkheid een eigen bootstrapje te runnen; de pagina-verwijzing staat nu op #7FFC. Ook bij deze break blijven de text- en array- pointers onveranderd; de oude pagina staat weer op #9FFC.

EPROM x

EPROM gevolgd door een box nummer zet het schakelbyte uit en de gekozen box wordt 'voor' gezet. Met SHIFT en RETURN samen of het commando OFF wordt het schakelsysteem weer ingeschakeld en de eerder geselecteerde eprom opgenomen in het schakelsysteem.

images/terug.gif Uitbreidingen

Zelf statements en functies toevoegen

Een mogelijkheid van dit systeem is het zelf toevoegen van commando's, statements en functies, bijvoorbeeld op de 16K. kaart onder write protect. Dit kan op twee manieren: - op de in de handleiding van P-CHARME beschreven wijze (pg.35-37), - met de in CX-1 ingebouwde interpreter.
In de CX-1 is een interpretor opgenomen die in een tabel zoekt op #xx00 (xx staat voor het high-byte). Indien op #xx00 staat: #40., en op #xx01 staat #BF dan springt de schakelroutine na in alle boxen gezocht te hebben naar de interpretor die dan in de tabel op #xx02 gaat zoeken. De routines die bij deze extra statements horen mogen overal on het geheugen staan, bv. in het blok #6B00 en verder. Dit heeft als voordeel dat statements die we niet zoveel nodig hebben, of die erg veel ruimte gebruiken (zoals de 40*24 schermroutine) op het moment dat we ze gebruiken willen ingeladen kunnen worden. Ook kan op deze manier een nieuwe routine risicoloos getest worden.

Op het blok #6800-#7FFF kan een CX-DATA gebeuren gemaakt worden dat naast een serie statements ook een evt. basic-bootstrap bevat, alles naar eigen behoefte. het hoofdsysteem blijft dan voor iedereen gelijk, alleen de CX-DATA verschilt per gebruiker.

images/terug.gif

CX - SYSTEEM COMMANDO'S

CX-1.8

GRMOD schakelt deze routine uit de CX-2.7 in.

TXMOD schakelt GRMOD uit.

EPROM x

Schakelt het schakelsysteem uit en de gekozen EPROM voor, met SHIFT & RETURN samen wordt het schakelsysteem weer ingeschakeld en de geselecteerde EPROM wordt weer opgenomen in her systeem. EPROM is uit te schakelen met OFF.

# (zie AN 3.2 p.50 )

Voert ?1B=#xx uit, met OLD of NEW naar gelang #0D het eerste byte van de beteffend pagina is.
p (zie AN 3.2 p.50 )

p is bedoeld voor gebruik in de direct-mode. Het verzet de BRK-vector naar P-CHARME zodat ook multidimensionale array's kunnen worden afgedrukt. ( zie de P-CHARME doc. p. 49 )

BREAK

Voert een deel van de ATOM-breakroutine uit. De routine zet de vectoren op default en reset een aantal poorten.

TIME "uu-mm:ss"

Geeft een tijd op interrupt in de R-bovenhoek van het scherm. In de toekomst zal deze routine gaan samenwerken met de real time clock. PRINT $T drukt de waarde van TIME af.

TMOFF zet de klok op interrupt basis af.

DTIME

Zet de tijd op interrupt basis op het scherm of juist niet; afhankelijk of TIME geinitialiseerd is of niet.

IRQ xxxx,yy

een commando dat men moet leren waarderen. Het wijst als IRQ (interrupt ReQuest) een stuk machinetaal aan met startadres xxxx, met als tijdsinterval tussen de interrupts de waarde yy (<256>). In principe moet de assembler routine met RTS worden afgesloten. Let op TIME blijft doorlopen.

Bijvoorbeeld:

P=#2800;[;LDA#B002;EOR@4;STA#B002;RTS ; de IRQ-routine Vervolgens: IRQ#2800,100
of:
TIME"00-00:00";IRQ#135C,1 , een 1 honderdste sec. timer.

OFF

Zet de IRQ-routine af, laat echter de klok op interrupt basis doorlopen. Tevens zet deze routine, nadat met EPROM een box is geselecteerd (schakelsoft uit), het schakelsysteem weer aan.

BLIP

Zet de keyclics en de knipperende cursor aan en uit, autorepeat op de toetsen tevens blijft naar gelang FAST of SLOW geselecteerd is een van deze twee actief en voert de CTRL-functies uit zonder ERROR. Tijdelijke opslag van leesvectoren voor deze routine op #9FF8 tot #9FFB. De bootstrap op #1C00 initialiseert een aantal routines: het DOS indien aanwezig, de klok op interrupt basis indien aan, voert een eventueel aanwezige BASIC bootstrap (testbyte #7FFD) uit. Op #7FFD staat het paginanummer voor de bootstrap die uitgevoerd wordt na BREAK. Op #7FFC kan het testbyte voor een BASIC bootstrap, uit te voeren na REPT & BREAK, worden gezet. Deze laatste vorm meldt zich met ACORN ATOM CX-RESET, geeft een opgave van de in het geheugen aanwezige BASIC-programma's en haalt tevens van #9FFC de tekstpagina op waar u het laatst in werkte.

De commando's DISAS, HDUMP, XDUMP en RELOC zijn gebaseerd op de AXR1 en in alle boxen te gebruiken.

TYD, DATE en DAY zijn de prints statements voor de real time clock (Big Benny, AC 2.4, bl.45)

CODE #xxx,#yyy (zie AN 3.3 p.91)

Na invoer van het bovenstaande volgt de vraag INSTRUCTION ? , waarop u bijvoorbeeld intoetst LDA@0 of EOR@#4;STA#B002 . In het laatste geval volgt waarschijnlijk : #1DE7. Kortom deze routine geeft u het adres waar de gevraagde code voorkomt in het opgegeven geheugengebied.

SEARCH "----------" (sie AN 3.5 p.36)

zoekt in het geheugen naar de opgegeven string.

BUFFER (zie Acorntjesbrood 1.4 p.13 e.v. TYPEAHEAD )

Dit programma verzorgt een typeahead buffer voor de ATOM. Met timer 1 van de VIA wordt regelmatig een interrupt opgewekt, waarbij gekeken wordt of een toets is ingedrukt. Zo ja dan wordt de ASCII waarde opgeslagen in een buffer. Als er weer invoer nodig is, wordt door een nieuwe OSRDCH routine die ASCII waarde weer uit de bufefr gehaald. Als de buffer vol is hoort u een piepje. Omdat de echo van de vooruitgetypte tekst ontbreekt, worden de REPT-, COPY-, LOCK- en cursor toetsen uitgeschakeld. Verder wordt gewacht tot de ESC- toets wordt losgelaten voordat de karakters uit de buffer worden ingelezen. in pagemode na een vol scherm reageren met een van de genegeerde toetsen. Uiteraard is deze routine niet te gebruiken met IRQ en of TIME (op interupt).
images/terug.gif

CX-2.7

USKEY x,"------"

Geeft u 9 functietoetsen: dus met CTRL & 1 ect. Aan de hand van een paar voorbeelden wordt de werking van dit commando het best verduidelijkt.

USKEY 1."LINK#6ED5)" executeert ( doordat de geinverteerde teksthaak voor de afsluitende aanhalingstekens staat ) de string.

USKEY 2."LDA@" drukt deze string af in bijvoorbeeld een stuk te typen basic tekst.

PAGE x

PAGE #30 is ?18=#30
PAGE (?#xxxx) kan ook mits op dat adres een zinnige waarde isneergezet.

PSCREEN x ( zie AN 3.5 p.38 )

Zet een scherm weg in de upper tetxtspace (tot 12 toe)

GSCREEN x ( zie AN 3.5 p.38 )

Haalt de schermen weer op. Ook bruikbaar in basic programma's.

LIB

Geeft een overzicht van de in het geheugen aanwezige basic programma's. REM en PROGRAM worden genegeerd, dus alleen zinnige tekst.

PLAY, GRMOD,TXMOD en FIND zijn uit de AXR1.

FIX \X,Y\ ( zie Atomix )

Is een nieuw printstatement. Tussen de \'s twee variabelen, met een som =< 9> , die het aantal te printen cijfers voor en na de komma bepalen. In tabellen worden de komma's onder elkaar geprint.

FLASH x,y,z ( zie AN 3.1 p.93 )

Laat een schermdeel knipperen vanaf de cursorpositie x met een breedte van y en met z regels groot. Let op met het berekenen van de variabelen dat u niet 'buiten'het scherm komt.

HEADER x ( zie AN 3.6 p.98 )

Staat u maximaal 6 vaste kopregels toe. met de cursor kunt u tekst in de kop schuiven in de direct mode. HEADER 0 zet de routine uit.

EXEC$ ( zie AN 3.6 p.96 )

Maakt het mogelijk om bijvoorbeeld direct mode command's ook vanuit een programma te gebruiken. Ook kunnen variabelen en bewerkingen daarvan vannuit een string als een functie worden gebruikt. bijvoorbeeld het volgende programma:
10 DIM A(6),B(3),C(7);X=50 20 $A="GOTO 90";$B="X=3" 30 INPUT"TOETS EEN VERGELIJKING IN"$C (bv. Y=3*X+1 ) 40 P.X';EXEC$B;P.X' 50 EXEC$C;P.$C,Y' 60 EXEC$A 70 END 90 P.'"OVER - END - GESPRONGEN "'

TP drukt op een regel de gekozen tekstpagina, TOP en DIMTOP af.

SLOW en FAST regelene de output naar het scherm.

LCASE

In GRMOD kunt u nadat, dit commando is gegeven, onderkast (kleine, geinverteerde) letters typen

CURSOR x,y

Zet de cursor op positie x van lijn y gerekend vanaf 0, de linker bovenkant van het scherm.

DUMP dumpt de tekst van het scherm naar de printer en voert PRINT $2 en PRINT $3 uit.

FILL #xxxx,#yyyy,#zz

Vult het geheugen van locatie xxxx tot yyyy met zz.

FVAR drukt de floatingpoint variabelen af.

FZERO maakt de floatingpointvariabelen gelijk aan nul. CLC maakt het scherm schoon tot aan de cursor.

CLS voert PRINT $ 12 uit en laat de cursor, al naar gelang geselecteerd, aan of uit.

CON , COF zet de cursor respectievelijk aan of uit.

images/terug.gif CX-3.02 Een voorlopige versie met een aantal grafische commando's.

INITTURTLE x

Initialiseert de super snelle turtle commando's TMOVE, RANGLE en ANGLE. Het zal ergo altijd deze commando's vooraf moeten gaan. De variabele heeft een waarde, overeenkomstig het CLEAR- commando, tussen 0 en 4. De turtle wordt in het midden van het beeld gezet met een hoekwaarde van 0 graden: d.w.z. naar rechts gericht.

TMOVE x,y ( Turtle MOVE )
Verplaatst de turtle over het scherm; x is de plotparameter met een waarde tussen de 4 en 7 (zie ook ATOM Th.& P.); y bepaalt de lengte van het lijnstuk.

ANGLE x

Hiermee zet u de turtle onder een hoek op het scherm; x is de hoekwaarde >=0; gerekend vanaf 0 graden

RANGLE x (Relative ANGLE of TURN)

Verhoogt de hoekwaarde met x ten opzichte van een eerder ingenomen waarde.

GFILL x,y (AC.3.5 p.22)

Vult een omlijnd schermgedeelte vanaf de coordinaat x,y.

SHAPE is de bekende routine uit de AXR1.

SIRCLE x,y,r,m (AC.3.4 p.61) (tijdelijk aanpassing i.v.m. de Gagsrom)

Tekent een cirkel op coordinaat x,y met een straal r in plotmode m.

DIF (10variabelen) (Atomix 2.8 \GRAPHICS\)

(In een latere versie zal deze routine vervallen.)

Met deze routine kunnen 8x8 dots figuren worden gedefineerd.
Bijvoorbeeld:
DIF#48,0,60,126,255,235,235,126,36,60
Waarbij #48 de plaats van de data tabel is waar de figuur wordt opgeslagen. (max 32 per tabel). De volgende waarde is het figuur nummer (hier dus 0).


De B volgende variabelen bepalen de figuur.

   128 64 32 16 8  4  2  1

    0  0  x  x  x  x  0  0  60
    0  x  x  x  x  x  x  0  126
    x  x  x  x  x  x  x  x  255
    x  x  x  0  x  0  x  x  235
    x  x  x  0  x  0  x  x  235
    0  x  x  x  x  x  x  0  126
    0  0  x  x  x  x  0  0  36
    0  0  x  x  x  x  0  0  60

FIG (5 variabelen) (Atomix 2,8)
(In een latere versie vervalt deze routine.)

bijvoorbeeld:
FIG#48,0,0,25,122
#48 is weer de plaats van de tabel. Dan volgt het figuurnummer, de wijze van plotten, de x-coordinaat en de y-coordinaat.

SPRITE (5 variabelen) (Atomix 2.8)

(In een latere versie vervalt deze routine.)
Deze routine plaatst een 16 x 16 figuur op het scherm. Een sprite is opgebouwd uit vier opvolgende 8 x 8 figuren in de volgorde 1 3 en daaronder 2 4. Voor de wijze waarop de variabelen worden gedeclareerd zie FIG. Sprite 0 gebruikt de figuren 0,1,2,3.

GWINDOW x1,y1,x2,y2 (Dataceck 2.6 p.16)

(Deze routine is nam het verschijnen van de GAGSrom overbodig en vervalt in een latere versie.)

De coordinaten x1 en y1 bepalen de linker benedenhoek; x2 en y2 de rechter boven hoek van het window. Buiten het window wordt niet geplot.

GWRESET (Datacheck 2.6 p.17) (zie onder GWINDOW )

Reset de geldende grafische mode.

images/terug.gif Het DATA-blok

Op het blok #6800-#7FFF kan een CX-DATA gebeuren gemaakt worden dat naast een serie statements ook een basic-bootstrap bevat, alles naar eigen behoefte. Er zijn veel manieren om een datablok samen te stellen. Ze hangen af van de eisen die u er aan stelt.
Bijvoorbeeld:
  • een blok voor liefhebbers van het programmeren in assembler, (debug-programmatuur), symbolische-assembler)
  • een blok met VDU-grappen voor de VDU fanaten (VDU 40,24 en tekenroutines)
  • een blok met zendamateur programma's
  • een blok voor hen die van twee walletjes willen eten.
Een mogelijke uitvoering van een datablok is hierna beschreven.

Op #6800 staat bij voorbeeld de basic boot up voor BREAK. (testbyte op #7FFD)

0 FAST;PAGE(?#9FFC);TP;?#3FC=#6B;BE,10,8;E.

Bij BREAK dus terug in de fast-output-mode, met behoud van de tekstpagina waarin u werkte en met P-CHARME uitbreidingen geinitialiseerd.

Op #6A00 kan een basic boot up voor REPT & BREAK worden geplaatst. (testbyte op #7FFC) Een dergelijk programma kan er zo uitzien,

10 REM BOOT
20 BE.12,9;BE.9,12
30 US.1,"X.0}"
40 US.2,"IRQ#6B4*,150}"
50 COF;P.';DAY;P." ";DATA;P." ";TYD''
60 FA.;BL.;CON
70 PAGE(?#9FFC);E.

Regel 30 maakt het mogelijk met USKEY 1 een driekoloms catalog van de schijf die in de drive zit op m te zetten.
Regel 40 maakt het mogelijk, met USKEY 2 onder interrupt, de STATUS regel op het scherm te zetten. Met regel 50 wordt de real time clock gepresenteerd.
Let op; pas het statement PROGRAM met beleid toe in deze basic bootstrapjes. Dit statement 'vult' van #28BD tot #2900 het geheugen met nullen. U kunt zich indenken wat een REPT/BREAK teweeg brengt in een zojuist gereed gekomen textfile.
Hieronder volgt de indeling van het geheugen van #6800 tot #7FFF.
                 van    t/m    exec.   comment.

BREAK   boot up  6800   6834   basic,  testbyte #7FFD

REPT+BREAK  "    6A00   6A92   basic,  testbyte #7FFD

P-CHARME uitbreidingen

ATTACH           6835   6869   6835    (#6B+#E8),
                                       zie PC.doc p.30
VLIST            6889   68F3   6889        idem
                                       zie AN.3.2 p.48
EXTERN           7720   77BD   7720    (#77+#80=#F7),
                                       zie AN.3.2 p.48

CST P-CHARME,    6B00   6B02           testbytes #FFECC6
commandwords     6B03   6B3F           CST afsluiten
                                       met #80
Uitbreidingen van de schakelsoft in het datablok

CST              6900   6901           testbyte #40BF
CST words        6902   ----           voor elk adres #FF
                                       en afsluiten
                                       met #FFC55
MEMORYED #xxxx   7000   770B   7102    HEXIT
                                       zie AN.3.3 p.598
MONIT            6C00   6FFF   6ED5    de APPLE monitor
                                       zie AN.jrg82 p.30
STATUS           6B40   6BFF   6B40    status SHIFT,CTRL,
                                       Pagemode,FAST/SLOW,
                                       EPROM.*MON
VDU x,y          7800   7F6A   7EFE    zie AN.2.4 p.70
images/terug.gif Het Kladblok

Enkele notities over het gebruik van het kladblok. Het geheugen gebied van #9900 tot en met #9FFF wordt door het CX-systeem als kladblok gebruikt. In een latere versie zal dit beperkt worden van #9E00 tot #9FFF.
USKEY gebruikt #9900 tot #99FF voor het opslaan van de strings. Een versie van cx-2 waarin dew strings vanaf #9E00 worden opgeslagen is in voorbereiding.
De timer op interrupt (TIME) gebruikt #9F70 tot #9F7A voor het opslaan van string $T . #9F7E is het testbyte voor TIME aan/uit.
Van #9F7B tot #9Fb0 wordt gebruikt door respectievelijk IRQ en TIME.
Page gebruikt #9FFC om de tekstpagina te bewaren.
Het schakelbyte wordt op #9FFF bewaard.
De BLIP routine gebruikt de adressen #9FF8 tot #9FFB en #9FFD met #9FFE als tijdelijke opslag van vectoren. Door GRMOD wordt het boxnummer van de diskbox bewaard.

Geheugen-map voor #9Fxx e.v.
#9FFF                   schakelbyte
#9FFE                   BLIP writevec
#9FFD                         "
#9FFC                   PAGE nr.(BREAK)
#9FFB                   BLIP saveadres
#9FFA                         "
#9FF9                         "
#9FF8                         "
#9FF7                   sprongadres FAST
#9FF6                   vrij
#9FF5                     "
#9FF4                     "
#9FF3                     "
#9FF2                   boxnr. diskbox
#9FF1                   CLI vec.diskbox
#9FF0                           "
#9FF0 tot #9FE5         vrij
#9FE5 tot #9FE0         diskbox terugspring routine
#9FE0 tot #9FDB         vrij
#9FDB tot #9FA0         CLI hulproutine bij gebruik
                        van statement DISK
#9FA0 tot #9F90         back-up voor cx-schakelsysteem
#9F90 tot #9F81         vrij
#9F80 tot #9F70         IRQ en TIME vect. en $T
#9F70 tot #9F00         vrij
#9F00 tot #9E00         USKEY strings cx-2.8
Overzicht van plaatsvervangende write- en readvectoren.
routine          208   209     20A   20B

standaard ATOM    52    FE      94    FE

LCASE             A9    11      70    11
GRMODE            BA    11      70    11
FAST              A0    11      7C    11
SLOW              50    14      7C    11

Geheugen-map voor #9Fxx e.v.

#9FFF                   schakelbyte
#9FFE                   BLIP writevec
#9FFD                         "
#9FFC                   PAGE nr.(BREAK)
#9FFB                   BLIP saveadres
#9FFA                         "
#9FF9                         "
#9FF8                         "
#9FF7                   sprongadres FAST
#9FF6                   vrij
#9FF5                     "
#9FF4                     "
#9FF3                     "
#9FF2                   boxnr. diskbox
#9FF1                   CLI vec.diskbox
#9FF0                           "
#9FF0 tot #9FE5         vrij
#9FE5 tot #9FE0         diskbox terugspring routine
#9FE0 tot #9FDB         vrij
#9FDB tot #9FA0         CLI hulproutine bij gebruik
                        van statement DISK
#9FA0 tot #9F90         back-up voor cx-schakelsysteem
#9F90 tot #9F81         vrij
#9F80 tot #9F70         IRQ en TIME vect. en $T
#9F70 tot #9F00         vrij
#9F00 tot #9E00         USKEY strings cx-2.8

Overzicht van plaatsvervangende write- en readvectoren.

routine          208   209     20A   20B

standaard ATOM    52    FE      94    FE

LCASE             A9    11      70    11
GRMODE            BA    11      70    11
FAST              A0    11      7C    11
SLOW              50    14      7C    11
images/terug.gif bijlage 1 DE   F- ROM

Zoals die aangepast kan worden voor het CX- systeem.

FF3F: 2C 01 B0     ,.. BIT #B001
FF42: 10 04        ..  BPL #FF4B
FF44: 6C FC 1F     l.. JMP (#1FFC)  de indirecte jump
                                    naar de bootstrap
FF47: EA           .   NOP
FF48: A2 17        ..  LDX @#17
FF4A: BD 9A FF     ... LDA #FF9A,X
FF4D: 9D 04 02     ... STA #0204,X
FF50: CA           .   DEX
FF51: 10F7         ... BPL #FF4A
FF53: 9A           .   TXS
FF54: 8A           .   TXA
FF55: EB           .   INX
FF56: 86 EA        ..  STX #EA
FF58: 86 E1        ..  STX #E1
FF5A: 86 E7        ..  STX #E7
FF5C: A2 33        .3  LDX @#33
FF5E: 9D EB 02     ... STA #02EB,X
FF61: CA           .   DEX
FF62: 10 FA        ..  BPL #FF5E
FF64: A9 0A        ..  LDA @#0A
FF66: 85 FE        ..  STA #FE
FF68: A9 8A        ..  LDA @#8A
FF6B: 8D 03 B0     ... STA #B003
FF6D: A9 07        ..  LDA @#07
FF6F: 8D 02 B0     ... STA #B002
FF72: 20 D1 F7      .. JSR #F7D1
FF75: 06 0C        ..  ASL #0C
FF77: 0F           .   ???
FF78: 41 43        AC  EOR (#43,X)
FF7A: 4F           O   ???
FF7B: 52           R   ???
FF7C: 4E 3A 41     N:A LSR #413A
FF7F: 54           T   ???
FF80: 4F           O   ???
FF81: 4D 0A 0A     M.. EOR #0A0A
FF84: 0D A9 82     ... ORA #82A9
FF87: 85 12        ..  STA #12
FF89: 58           X   CLI
FF8A: A9 55        .U  LDA @#55
images/terug.gif bijlage 2a CX-1.7

Overzicht van de indeling.

De schakelroutine van          : #1000 tot #1C8

De CSI voor de uitbreidingen
op de geheugenkaart            : #10CC tot #10FF

op #10A7, #10D6, 10E1, 10F1 en 10F6 staat het highbyte van de
CST voor de uitbreidingen (niet via P-CHARME) op de 16 Kb.
kaart. (b.v. #69 of #7F)

De jump vanuit P-CHARME naar:
de schakelsoft (JMP!1040)      : #1100
functie routine (P-FUN)        : #1A60 tot #1AC6

De CSI voor de altijd
bereikbare commandwords        : #1103 tot #1138

Vectoren t.b.v. de BOOTSTRAP   : #1139 tot #115C
en t.b.v. GRMOD, FAST, SLOW ea : #1FF0 tot #1FF8

Indirecte jump naar
de bootstraproutine            : #1FFC
de bootstraproutine            : #1C00 tot #1DCD
RPT/BREAK                      : #1C22
SHIFT/BREAK                    : #1C78
("linkin" #1C78)

De Command string tabel (CST)  : #1F60 tot #1FEF
Deze tabel afsluiten met
(terug naar schakelsof)        : #100F

De FUNCTIE tabel               : #1F00 tot #1F60

voor de tabel opbouw zie AN 3.7 pg. 88
Op adres #11CB en #120C staat het nummer van de voet waarin de GRMOD routine moet worden geplaatst. (voet 2 voor CX-2.7h ). Het adres #1192 bevat het nummer van de voet waarin FAST, SLOW en de USKEY routines zijn opgenomen. (voet 2 voor CX-2.7h ). op #1739 moet de voet van de P-CHARME worden vemeld. (voet 7 ) Voor de resetroutine staat op #1d10 het voetnummer van CX-2. En op #1D68 staat de subroutine verwijzing naar LIB in CX-2.

Hulproutines

GRMOD 140E terug naar CX-2.7 141D idem 1422 idem 1438 idem hulproutine SLOW 1450 tot 1459 HEADER 1EF2 tot 1EF4 subroutines 1160 tot 1180

bijlage 2b vervolg CX-1.7

In de CST zijn de volgende commandowords opgenomen.

                 van      tot         exec

TXMOD            121A     ----        121A
GRMOD            ----     1236        121E
EPROM x          125A     1269        125A
TIME "uu-mm:ss"  126A     12D6        126A
TMOFF            12D9     12E2        12D9
DTIME            12EA     12F3        12EA
$T (van TIME) wordt bewaard op #9F70
IRQ xxxx,yy      12F4     144C        130A
OFF              1ABC     1AC6        1ABC
CODE #xxxx,#yyyy 145B     154B        145B
BUFFER           154C     1671        154C
SEARCH "      "  1672     171E        1672
#                171F     1737        171F
p                1738     1742        1738
BREAK            1C25     1DCA        1DD0
Toonhoogte (#0A of #1E)       : 1E21
vervangende routine #FE92     : 1E15
"linkin"vanuit opvang CNTR    : 1EA2
DISAS           1743      ----        18EA
XDUMP           ----      ----        177C
HDUMP           ----      ----        1782
RELOC           ----      1A58        1917
TYD             1B00      ----        1BB4
DATE            ----      ----        1BB7
DAY             ----      1BEA        1BBA
images/terug.gif

bijlage 3 CX-2.7

Overzicht van de indeling.

De CSI van  A000  tot  A02B
De CST van  AA00  tot  AAAF

Subroutines A02C  sub voor USKEY
            A02E  sub voor PAGE
            A03F  sub voor
            A04C  sub voor PAGE,FAST
            A055  sub voor PAGE (num?)
            A05F                (arg?)
            A069  sub voor USKEY,FAST,HEADER (system?)
            AABE  t/m AAFF routine voor S(et)INT(erupt)
            AB00  t/m AB0F vectoren
            AB10  (p.$#AB10)
            AB20  t/m ABFF tabel voor LCASE
            ACoo           tabel voor GRMOD
In de CST zijn de volgende commandwords opgenomen

                van     tot     exec.     comment.

USKEY X,"    "  A076    A1BC    A076 van #10xx A0DB (1182)
SLOW                            A197 (samen met FAST en
CX-1.7)
FAST            A13C    A1BC    A19B van #10xx A13C (11A3)
PAGE X          A1BB    A1DC    A1BB
LCASE           A1DD    A1F4    A1DD
CURSOR X,Y      A200    A25C    A200
FILL X,Y,Z      A25D    A2BF    A2B3
PSCREEN X       A2C0    ----    A2C0
GSCREEN X       A2E0    A326    A2E0
DUMP            A326    A375    A343
LIB             A376    A41A    A376 van #10xx A37C (1D3B)
TP              A420    A46B    A420
PLAY X,Y        A46D    A562    A46D (tabel A52A tot A557)
FVAR            A563    A5A9    A563
FZERO           A5A0    A5AC    A5A0
CLC             A5AD    A5D9    A5AD
CLS             A5DA    A5DF    A5DA
FIX \X,Y\       A5E0    A7F1    A603
\ (REM)         A7F1    A7F6    A7F1
FLASH X,Y,Z     A7F7    A89A    A7F7
HEADER X        A8A0    A8FB    A8A0 (vectoren op A8B5 + A8BA
                                      voor #10xx #A8BF)
EXEC$ "     "   A900    A96A    A900
PIP             A944    A96A    A951 (sub van EXEC$)
FIND "string"   A96B    A9F9    A976
CON             A9FA    A9FF    A9FA
COF             AAB0    AAB7    AAB0
GRMOD           AC00    AFFF    AE06
TXMOD           AC00    AFFF    AE02

Bootstrap

images/terug.gif

Hieronder volgt de source van de bootstrap op #1C00. 10REM BOOTSTRAP CX-1.7 20REM 17-12-1984 30REM (C) DUKE URBANIK 40DIMBB10,CC20 50F.I=0TO20;BBI=-1;CCI=-1;N. 60IN.''"ASSEMBLE TO "M 70CC15=#1C00 80Z=M 90F.I=1TO2;P.$21 100P=M 110[ 120:BB0 130BIT#B002 140BVC BB2 \REPT-BRK 150\ 60\ 170LDA#FE;CMP@#A;BEQBB1;JMP#FF48 180:BB1 \ALLEEN BRK 190 JSRCC1 200 JSRCC2 210 JSRBB3 220 LDA @Z%256 230 STA #5 240 LDA @Z/256 250 STA #6 260 JMP #C2F2 270:BB2 JMPBB5 280\ 290:CC1 \BREAKSUB 300LDX@#05;JSR#FB83 310LDA@3;JSR#FE52;LDA@6;JSR#FE52 320LDA@#8A;STA#B003;LDA@#07;STA#B002 330CLI 335LDA#B000;AND@#F0;STA#B000 340LDX@0;STX#EA;STX#E7 350LDA@#0A;STA#FE;LDA@#80;STA#E1 360RTS 370\ 380:CC2 \CHECK DOS 400LDA#E001;COP@#01;BNECC5 410JSR#E000 420LDA@CC15/256;STA#207 430LDA@CC15%256;STA#206433LDA@0 435:CC5 RTS 460\ 470:BB3 \CHECK TIME 480LDA#9F7E;CMP@#13;BNECC3 490JSR#12BA 500:CC3 RTS 510\ 520];N=P;[ 530:BB4 \START BASIC AT #6800 540LDA#7FFD;STA#6;LDY@0;STY#5;TAX 550:BB6 LDA#12;STA#9FFC 560LDA(#05),Y;;;CMP@#D;BNECC4 565INY;LDA(#05),Y;CMP@0;BNECC4;DEY 570STY#D;DEY;STX#12;STX#E 580LDX@#FF;TXS 590:CC6 INY;LDA(#D),Y;CMP@#D;BNECC6 600JSR#CDBC;LDA(#D),Y;BMICC7;INY 610BNECC6;:CC7 INY;JSR#CDBC;LDA#E 620STA#24;LDY#D;STY#23;JMP#C2E0 630:CC4 JMP#CD9B 640\ 650\ 660];Z=P 670 $P="@=8;P.$6'`BREAK`;IF?1|?2P.` AT LINE `!1&#FFFF" 680 Z?9=34;Z?#F=34;Z?#1A=34;Z?#24=34 690 P=P+LENP+1 700 ?P=0;P?1=0;P=P+2;$P="P.';LI.";P=P+L.P 710STR N,P;P=P+5;?(P-1)=#0D 720[ 730\ 740\ 750:BB5 \REPEAT-BREAK 760JSRCC1 780JSRCC12 790LDX@#1B;:CC8 LDA#1140,X;STA#200,X;DEX;BPLCC8 800LDA@2;STA#BFFF;STA#9FFF 810STA#9F7E \TIJDBIT 820JSR#F7D1;] 830$P=" ACORN ATOM DOS CX-RESET " 840?P=6;P?1=#0C;P?2=#E;P=P+L.P+1 850?(P-3)=#A;?(P-2)=#A;?(P-5)=#A;?(P-4)=#A 860[ 870NOP 880JSRCC2 \DOS 890BEQCC19 892LDX@3 \GEEN DOS 894:CC14LDA#144C,X;STA#8011,X;DEX;CPX@0;BNECC14 920:CC19 930LDX@#3F;:CC9 LDA#8000,X;EOR@#80;STA#8000,X 940DEX;CPX@0;BPLCC9 950JSR#A37C \CAT 960:CC10LDA#7FFC;STA#6;LDY@0;STY#5;TAX;JMPBB6 970:CC12 980LDX@6;:CC11 LDA#1139,X;STA#9FF8,X;DEX;BPLCC11 990RTS 1000\ T.B.V. DISKROM--> CLI 1010:CC15 1020LDA#9FFF;STA#9FF2;LDA#202;STA#9FF0;LDA#203;STA#9FF1 1030LDA@#C9;STA#203;LDA@#D8;STA#202;LDX@8 1040:CC16 DEX;STX#BFFF;LDY@3 1045:CC17 LDA#A03F,Y;CMPCC18,Y;BNECC16 1050DEY;BPLCC17;STX#9FFF;JMP#A047 1059:CC18 1060];$P="DISK";P=P+L.P;[ 1070\ STATEMENT BREAK 1080:CC13 JSRCC1;LDX@#17 1090:CC14 LDA#FF9A,X;STA#204,X;DEX;BPLCC14 1100JMP#C558 1110];N.;P.$6 1120P.'&N" LINK.."'&CC13" BREAK-STAT"'&P" EERSTE VRIJE BYTE"' 1130E.

images/terug.gif

De schakelsoft met de mogelijkheid om statements en functies uit te breiden.

10REM CXS-1.7 SCHAKELSOFT 20REM (C) DUKE URBANIK 30REM 12-12-1984 40 50Q=#1000 60!Q=0 70?#23=0;?#24=#82 80S=#9FFF;REM SCHAKELBYTE 90E=#7F00;REM EVT. EXTRA TABEL 100V=7;REM VOET VAN P-CHARME 110 REM MOET LAATSTE VOET VAN 120 REM DE TE BEREIKEN BOXEN ZIJN! 130DIM BB25;P.$21 140F.I=0TO25;BBI=Q;N 150BB7=#1100;REM INDIRECTE JUMP 160 REM ZIE REGEL 730 170 REM MOET NIEUWE PAGINA ZIJN! 180BB11=#1F00;REM TABEL FUNCTIES 190F.I=1TO2;P=Q+2 200[ 210\SHIFT-RETURN INGEDRUKT? 220BIT#B001;BMIBB3 230LDA@V;STA S 240:BB3 250JMP#1103 \EVT UITBREIDEN OP #1103 E.V. 260\ TABEL EINDE: BB4270:BB4 280LDA S;BIT S;BVSBB2 290\ INIT P-CHARME 300LDA@0;STA#3EE;LDA@#B3;STA#3FB 310LDA@BB11/256;STA#3FA 320LDA@BB7/256;STA#3EF 330LDA@V;STA#BFFF;STA S 340LDA@#AB;STA#203;LDA@#D5;STA#202 350JMP#A002 \ENTER P-CHARME 370 380:BB15 \VANUIT P-CHARME VIA #1100 390PLA;PLA;CMP@29;BNEBB12 400:BB13 410TAY;PLA;STA#90;JMPBB21 420:BB12 STA#00 430CMP@#5E;BEQBB14;JMP#AC4F 440:BB2 STA#BFFF 450LDA#A001;CMP@#BF;BNEBB6 460JMP#A002 470 480\ SCHAKELEN MAAR! ERROR 94 490:BB14 \SAVE #90-#9F 500LDX@#0F 510:BB10 LDA#90,X;STA#9F90,X;DEX;CPX@#FF;BNEBB10 520:BB5 \START POOT-SOS 530LDA@BB0&#FF;STA#202 540LDA@BB0/256;STA#203 550LDA@#FF;STA S 560:BB1 LDX@#FF;TXS570INC S;LDA S 580CMP@V;BCCBB2 590:BB9 600\ NIETS GEVONDEN610\ RELOAD #90-#9F 620LDX@#0F 630:BB8 LDA#9F90,X;STA#90,X;DEX;CPX@#FF;BNEBB8 640LDA@V;STA#BFFF 650LDA@#AC;STA#203;LDA@#4F;STA#202 660\ INDIEN GEEN TABEL OP 670\#7F00 DAN VOLGENDE 3 REGELS 680\ WISSEN EN IN PLAATS HIERVAN: 690\ JMP#C558 700LDA E;CMP@#40;BNEBB6 710JMP #10CC 720\ TABEL EINDE: #C558 730 740\ FOUT AFVANGEN 750:BB0PLA;PLA;STA#0 760CMP@#5E;BEQBB1 \SCHAKELEN 770CMP@29;BNEBB9 780PHA;LDA@7;STA#BFFF;PLA 790JMPBB13 800:BB6JMP#C558 810 820\ STARTADRES P-FUN 830];P=#1A60;[ 840 850\start p-fun v.hoesel 860\error 29 870:BB21;LDX @0 880:BB22;LDA #91,X;PHA;INX 890CPX @#07;BNE BB22;STY #97 900LDY @#03;STY #93;LDA @#A4 910STA #94;JSR #A8EA 920JSR #A52B;BCS BB23 930\function-call 940JMP #AB9C 950\extra-functions 960:BB23;LDA #3FA;STA #92 970JSR BB24;LDY @#03;JMP #AB82 980:BB24;LDY @#00;STY #91 990LDA #92;STA #94 1000LDA (#91),Y;STA #92;INY 1010STY #93;DEY;LDA (#93),Y 1020CMP @#E3;BNE BB25;INY 1030LDA (#93),Y;CMP @#C7 1040BNE BB25;JSR #A8EA;JMP BB24 1050\not-found 1060:BB25;LDY #97;STY #00 1070JSR #ADC6;INX;INX;TXS 1080JMP #AC60 1090] 1100REM INDIRECTE JUMP VANUIT P-CHARME 1110P=BB7;[;JMP BB15;] 1120P.$6;N.I 1130?Q=#40;?(Q+1)=#BF 1140E. CX- 3.0 images/terug.gif Overzicht van de indeling. De CSI van A000 tot A032 De CST van A032 tot A0FF De sin.- cos.tabel met subroutines van (Init)turtle van AEA5 tot AFFF. De CST zijn de volgende commandwords opgenomen. van tot exec. INITTURTLE x ACE0 AEA4 ACE0 TMOVE x,y AB9C AC6A AB9C RANGLE x AC6B ACDF AC6B ANGLE x AB49 AB71 AB49 WHITE x AB72 AB9B AB72 GFILL x,y A360 A45E A35E SIRCLE x,y,r,m A100 A101 A1F3 SHAPE(tabel)(AXR1) A530 A5B2 A54D INVERT A5C0 A60D A5C0 DIF (10 var.) A230 ==== A230 FIG (5 var.) ==== ==== A305 SPRITE (5 var.) ==== A359 A31F GWINDOW x1,y1,x2,y2 A480 A509 A4AA GWRESET A510 A529 A510 images/terug.gif