
|
Clockchip RP-501 Arjen Zeilemaker, 00-00-00
De clockchip van de MSX2 computer
---------------------------------
De MSX2 computer is voorzien van de RP-5C01 klokchip (of
compatible) met tijd en kalender functie. Bovendien bevat de chip
een aantal geheugenplaatsen, die door de NiCad batterij constant
van spanning worden voorzien. Deze geheugenplaatsen zijn
uitermate geschikt om opstartgegevens in op te slaan.
Algemene opbouw:
----------------
De chip heeft vier banken met ieder 13 geheugen plaatsen. Deze
plaatsen zijn echter niet in 8 bits (zoals we gewend zijn)
uitgevoerd, maar in 4 bits (z.g.n. nibbles).
De chip is aan te spreken via de I/O poorten B4H en B5H. I/O
poort B4H geeft de te lezen/schrijven nibble aan, terwijl via I/O
poort B5H de data gelezen of geschreven kan worden.
Zoals gezegd, heeft de chip de beschiking over 13 nibbles per
bank. Dit zijn de nibbles 00H tot 0CH. De nibbles 0DH tot 0FH
hebben speciale betekenis en kunnen onafhankelijk van de
ingestelde bank beschreven worden.
Programeer nibbles:
-------------------
De nibbles 0DH tot 0FH zijn speciale programeer nibbles. Ze
kunnen in iedere bank beschreven worden.
3 2 1 0
nibble 0DH R A B1 B0
R = Running, (1 = Klok loopt, 0 = Klok gepauseerd)
Dit bit staat normaal natuurlijk op 1, waardoor de
tijd en datum informatie constant wordt aangepast.
Echter bij het lezen of schrijven van tijd en datum
informatie is het belangrijk dat de gegevens even
niet veranderen. Door nu het bit voor het lezen of
schrijven te resetten, en na het lezen of schrijven
weer te zetten, kan dit probleem makkelijk worden
omzeild. Let er op dat het bit niet te lang op 0
staat, omdat er dan tijdsafwijkingen gaan onstaan.
A = Alarm, (1 = Alarm mode aan,0 = Alarm mode uit)
Dit bit wordt geset indien er een alarmtijd wordt
ingesteld. Indien de ingestelde alarmtijd/datum
gelijk wordt aan de huidige tijd/datum en het alarm
bit is 1, dan zal een speciale pin van de klokchip
actief worden. Als het bit echter 0 is, dan vindt
deze actie niet plaats.
B1 en B0 zijn de current bank selectors
De inhoud van deze bits bepalen welke bank actief
is. M.a.w. van welke bank de nibbles 00H tot 0CH
kunnen worden beschreven, dan wel gelezen.
3 2 1 0
Nibble 0EH Y D M S
Y is de snelle mode bit voor het jaar
Als het bit geset is, wordt om de 1/16384 seconde
het jaar opgehoogt. (En daarmee ook de schrikel-
jaar nibble). Als het bit gereset is, functioneerd
het jaar gewoon afhankelijk van de rest van de
datum.
D is de snelle mode bit voor de dag
Als het bit geset is, wordt om de 1/16384 seconde
het dagnr. opgehoogt. (En daarmee wordt ook de rest
van de datum versneld, afh. van dag).
M is de snelle mode bit voor de minuten
Als het bit geset is, wordt om de 1/16384 seconde
de minuten opgehoogt. (En daarmee wordt ook de rest
versneld). De seconden blijven normaal.
S is de snelle mode bit voor de seconden
Als het bit geset is, wordt om de 1/16384 seconde
de seconden opgehoogt.
OPM: In het speciale geval van M en S = 1 geldt de
versnelling niet meer voor de seconden en minuten,
die functioneren normaal!
Nibble 0FH
Haven't got a idea
Geheugen nibbles.
-----------------
Zoals reeds gezegd hebben de nibbles 00H tot 0CH een geheugen
functie. Van de verschillende banken hebben de nibbles de
volgende betekenis:
Bank 00:
nibble 0 en 1
Deze nibbles bevatten de seconde informatie van de
huidige tijd. Nibble 1 is de highnibble en nibble 0 is
de lownibble. Samengevoegt krijgen we een byte met de
seconden als BCD-getal. (min 00H en max 59H)
nibble 2 en 3
Deze nibbles bevatten de minuten informatie van de
huidige tijd. Nibble 3 is de highnibble en nibble 2 is
de lownibble. Samengevoegt krijgen we een byte met de
minuten als BCD-getal. (min 00H en max 59H)
nibble 4 en 5
Deze nibbles bevatten de uren informatie van de huidige
tijd. Nibble 5 is de highnibble en nibble 4 is de
lownibble. Samengevoegt krijgen we een byte met de uren
als BCD-getal. (min 00H en max 23H)
nibble 6
Deze nibble bevat het dagnr. in de week van de huidige
datum. Helaas wordt deze functie van de klokchip niet
gebruikt bij de MSX2-computer (onbegrijpelijk). Het
nibble is min 00H en max 06H. (0 = Zondag)
nibble 7 en 8
Deze nibbles bevatten de dagnr. informatie van de
huidige datum. Nibble 8 is de highnibble en nibble 7 is
de lownibble. Samengevoegt krijgen we een byte met het
dagnr. als BCD-getal. (min 01H en max (afh. maand) 31H)
nibble 9 en A
Deze nibbles bevatten de maandnr. informatie van de
huidige datum. Nibble A is de highnibble en nibble 9 is
de lownibble. Samengevoegt krijgen we een byte met het
maandnr. als BCD-getal. (min 01H en max 12H)
nibble B en C
Deze nibbles bevatten het jaar tov 1980 van de huidige
datum. Nibble C is de highnibble en nibble B is de
lownibble. Samengevoegt krijgen we een byte met het jaar
tov 1980 als BCD-getal. (min 00H en max 99H)
Bank 01
nibble 0 en 1
Deze nibbles heben geen geheugenfunctie, en kunnen dus
niet beschreven worden.
nibble 2 en 3
Deze nibbles bevatten de minuten informatie van de alarm
tijd. Nibble 3 is de highnibble en nibble 2 is de
lownibble. Samengevoegt krijgen we een byte met de
minuten als BCD-getal. (min 00H en max 59H)
nibble 4 en 5
Deze nibbles bevatten de uren informatie van de alarm
tijd. Nibble 5 is de highnibble en nibble 4 is de
lownibble. Samengevoegt krijgen we een byte met de uren
als BCD-getal. (min 00H en max 23H)
nibble 6
Deze nibble bevat het dagnr. in de week van de alarm
datum. Helaas wordt deze functie van de klokchip niet
gebruikt bij de MSX2-computer (onbegrijpelijk). Het
nibble is min 00H en max 06H. (0 = Zondag)
nibble 7 en 8
Deze nibbles bevatten de dagnr. informatie van de alarm
datum. Nibble 8 is de highnibble en nibble 7 is de
lownibble. Samengevoegt krijgen we een byte met het
dagnr. als BCD-getal. (min 01H en max (afh. maand) 31H)
nibble 9
Deze nibble heeft geen geheugenfunctie.
nibble A
Haven't got a clue.
nibble B
Deze nibble bevat het schrikkeljaar offset. offset 00H
betekend een schrikeljaar en dan heeft februari dus 29
dagen. De offset is min 00H en max 03H.
nibble C
Deze nibble heeft geen geheugenfunctie.
Bank 02
nibble 0
Deze nibble bevat altijd 0AH. Is dit niet het geval,
dan zal de MSX2 subrom geheugenbanken 2 en 3 instaleren
met standaardwaarden. Nibble 0 heeft dus een soort
checkfunctie. Als de stroom van de chip zou uitvallen,
dan zal nibble 0 leeg worden (=00H).
nibble 1
Deze nibble bevat de pixel verplaatsing in X-richting,
zoals die bij het opstarten van de computer naar de VDP
moet worden geschreven. Standaard is de verplaatsing 0,
echter door het SETADJUST commando kan het gewijzigt
worden. LET OP: een negatieve waarde wordt als twee
complement opgeslagen, dus -1 = 16-1 = 15.
nibble 2
Deze nibble bevat de pixel verplaatsing in Y-richting,
zoals die bij het opstarten van de computer naar de VDP
moet worden geschreven. Zie verder nibble 1.
nibble 3
Deze nibble bevat de screenmode instellingen, zoals die
bij het opstarten worden ingesteld. Bit 0
bevat de textmode (0 = SCREEN 0 en 1 = SCREEN 1),
terwijl bit 1 bepaald of de interlacing aan (1) dan wel
uit (Bit = 0) staat. Standaard geldt SCREEN 0 en
interlacing uit.
nibble 4 en 5
Deze beide nibbles vormen samen een byte (nibble 4 is
de lownibble), die de schermbreedte van de textmode
bevat, zoals die bij het opstarten moet worden
ingesteld. Standaard geldt een schermbreedte van 37.
LET OP: als de schermbreedte bij een ingesteld
textscherm 0, 0 of groter dan 80 is, dan worden banken
2 en 3 opnieuw geinstaleerd. Dit zelfde gebeurt als de
ingestelde textmode 1 is, en de schermbreedte is 0 of
groter dan 32.
nibble 6
Deze nibble bevat de voorgrondkleur van het textscherm,
zoals die bij het opstarten moet worden ingesteld.
Standaard is de kleur 15 (wit).
nibble 7
Deze nibble bevat de achtergrondkleur van het
textscherm, zoals die bij het opstarten moet worden
ingesteld. Standaard is de kleur 4 (donker blauw).
nibble 8
Deze nibble bevat de randkleur van het textscherm,
zoals die bij het opstarten moet worden ingesteld.
Standaard is de kleur 4 (donker blauw).
nibble 9
Deze nibble bevat diverse instellingen, zoals die bij
het opstarten worden ingesteld. Bit 0 geeft aan
of de funktietoetsen niet (Bit= 0), dan wel wel
zichtbaar zijn. Bit 1 geeft aan of de toetsklick niet
aan is (Bit= 0), danwel wel aan is. Bit 3 geeft aan of
er wel een MSX-printer (Bit= 0), danwel geen MSX-
printer is aangesloten. Bit 2 tenslotte geeft aan of de
standaard cassette snelheid 1200 baud (Bit= 0), danwel
2400 baud is. Standaard gelden de volgende
instellingen: Funktietoetsen aan, Toetsklick aan, MSX-
printer en 1200 baud cassettesnelheid.
nibble A
Deze nibble bevat de beep instellingen, zoals die
gelden bij de uitvoering van het BEEP commando. Bit 1
en 0 geven het volume van de BEEP aan. 00B is zeer
zacht, en 11B is zeer hard. Bit 3 en 2 geven de melodie
aan.
Standaard geldt: volume 01B en melodie 00B.
nibble B
Deze nibble weet ik nog niet
Bit 1 en 0 bevatten de kleurcode bij het opstartscherm.
Standaard geldt dat de kleurcode 0 is.
nibble C
Haven't got a clue
Bank 03
nibble 0 Deze nibble geeft aan voor welk doel bank 3
wordt gebruikt. Als het nibble 00H is, dan is er sprake
van een TITLE. Is het nibble 01H, dan kan er sprake zijn
van een PASSWORD. Als het nibble 02H is, dan is er een
PROMPT ingesteld. Standaard is echter een lege TITLE
ingesteld.
TITLE:
De nibbles 1 t/m C bevatten de TITLE string. Er moeten
telkens twee nibbles bij elkaar worden genomen, waardoor
een byte ontstaat met een ASCII code. Dus nibble 1 met
nibble 2 vormen het eerste byte enz. (volgens het
lownibble,highnibble systeem). Het einde van de string
wordt gevormd door een 00H byte of door het einde van
bank 3. De TITLE string kan dus maximaal 6 karakters
lang zijn.
OPM. Als de TITLE string precies 6 karakters lang is,
dan wordt na het tonen van de TITLE string eerst op een
toets gewacht.
PROMPT:
De nibbles 1 t/m C bevatten de PROMPT string. De nibbles
heben precies dezelfde opbouw als bij de TITLE string,
alleen vormen ze nu de PROMPT string. Als er geen PROMPT
is ingesteld, dan wordt de standaard PROMPT genomen
("Ok").
PASSWORD:
De nibbles 1 t/m 3 hebben een speciale waarde, zodat er
door een stroomstoring niet toevallig een PASSWORD
instelling kan onstaan. Nibble 1 moet 01H, nibble 2 02H
en nibble 3 03H bevatten voor een geldig PASSWORD. De
nibbles 4 t/m 7 bevatten het PASSWORD in een gecodeerde
vorm. nibble 8 heeft een speciale betekenis. Is het
nibble ongelijk aan 00H , dan wordt er via I/O poort 7FH
een "password gelezen" (16 bits) en wordt vergeleken met
de inhoud van nibbles 9 t/m C. Zijn deze waarden niet
gelijk, dan komt de computer in een eindeloze lus
terecht en start hij niet op.
De klokchip beschrijven of lezen:
---------------------------------
Het schrijven en lezen via de I/O poorten is echter niet conform
de MSX-regels en het is daarom beter om I/O met de chip over te
laten aan de daarvoor bestemde BIOS-routines.
Het lezen van een nibble gaat via de BIOS routine REDCLK (01F5H)
in het MSX2 subrom:
Input: C = klokadres met bit 5 en 4 als banknummer
met bit 3 t/m 0 als nibblenummer
Output: A = gelezen data (bit 3 t/m 0)
Change: F
Het schrijven van een nibble gaat via de BIOS routine WRTCLK
(01F9H) in het MSX2 subrom:
Input: C = klokadres met bit 5 en 4 als banknummer
met bit 3 t/m 0 als nibblenummer
A = te schrijven data (bit 3 t/m 0)
Output: -
Change: F
Voorbeelden:
RP-501.BAS Een basic programma die de informatie uit dit document toepast
op de gegevens die in uw clockchip zijn opgeslagen.
RP-501.GEN Een assembler Source programma die de waarden van alle nibbles
uit alle banken afdrukt op het scherm. Assembler programma
geschreven met DEVPAC.
RP-501.BIN Het eigenlijke machinetaal programma (Object) van RP-501.GEN
Run het in basic met: BLOAD"RP-501.BIN",R
Informatie verzamelt en samengesteld door:
Arjen Zeilemaker
Woldweg 195
9606 PD Kropswolde
05980-22794 (Spraak)
>> RP-501.BAS ---------------------------------------------------------------
1 ' (C) 1992 by Ultrasoft
2 ' ********************************************
3 ' * Door: Arjen Zeilemaker *
4 ' * Woldweg 195 *
5 ' * 9606 PD Kropswolde *
6 ' * *
7 ' * Dit programma analyseert de gegevens die *
8 ' * in de clockchip van uw MSX2 zijn op- *
9 ' * geslagen. *
10 ' * Door het gebruik van de I/O poorten is *
11 ' * het programma eigenlijk niet conform *
12 ' * de MSX regels. *
13 ' ********************************************
20 SCREEN0:WIDTH80:KEYOFF
25 PRINT"RP-501 Analyser":PRINT
30 PRINT"Current mode setting: ";
35 OUT&HB4,13:VA=INP(&HB5)
40 PRINT"Bank";VA AND 3;" ";
45 IF (VA AND 4) THEN PRINT"Alarm On ";ELSEPRINT"Alarm Off ";
50 IF (VA AND 8) THEN PRINT"Clock Running"ELSEPRINT"Clock Halted"
55 PRINT:PRINT"Bank 00"
60 OUT&HB4,13:OUT&HB5,INP(&HB5)AND7
65 BA=0:NI=0:GOSUB475:T1=VA
70 BA=0:NI=2:GOSUB475:T2=VA
75 BA=0:NI=4:GOSUB475:T3=VA
80 BA=0:NI=7:GOSUB475:D1=VA
85 BA=0:NI=9:GOSUB475:D2=VA
90 BA=0:NI=11:GOSUB475:D3=VA+1980
95 OUT&HB4,13:OUT&HB5,INP(&HB5)OR8
100 PRINTUSING"Current time information: ##:##:##";T3,T2,T1;
105 PRINTUSING" date information: ##/##/####";D1,D2,D3
110 PRINT:PRINT"Bank 01"
115 BA=1:NI=0:GOSUB475:T1=VA
120 BA=1:NI=2:GOSUB475:T2=VA
125 BA=1:NI=4:GOSUB475:T3=VA
130 BA=1:NI=7:GOSUB475:D1=VA
135 BA=1:NI=9:GOSUB475:D2=VA
140 BA=1:NI=11:GOSUB475:D3=VA
145 PRINTUSING"Alarm time setting: ##:##:##";T3,T2,T1;
150 PRINTUSING" date setting: ##/##/##";D1,D2,D3
155 PRINT:PRINT"Bank 02"
160 BA=2:NI=0:GOSUB460
165 IF VA<>10 THEN PRINT"Information in Bank 02 and 03 not valid"
170 BA=2:NI=1:GOSUB460:DX=VA:IFDX>7THENDX=DX-16
175 BA=2:NI=2:GOSUB460:DY=VA:IFDY>7THENDY=DY-16
180 PRINTUSING"Screen adjust in X-pixels: +##";DX
185 PRINTUSING"Screen adjust in Y-pixels: +##";DY
190 BA=2:NI=3:GOSUB460
195 PRINT"INITIAL: Screen-mode:";VA AND 1;
200 PRINT" Interlace-mode ";
205 IF (VA\2) THENPRINT"On"ELSEPRINT"Off"
210 BA=2:NI=4:GOSUB480
215 PRINT" Screen width:";VA
220 BA=2:NI=6:GOSUB460
225 PRINT" Colors; Foreground";VA;
230 BA=2:NI=7:GOSUB460
235 PRINT",Background";VA;
240 BA=2:NI=8:GOSUB460
245 PRINT",Border";VA
250 BA=2:NI=9:GOSUB460
255 PRINT" Functionkeys ";
260 IF (VA AND 1) THENPRINT"On";ELSEPRINT"Off";
265 PRINT", Key-klick ";
270 IF (VA AND 2) THENPRINT"On";ELSEPRINT"Off";
275 PRINT", ";
280 IF (VA AND 4) THENPRINT"No";
285 PRINT"MSX-printer, Cas baudrate ";
290 IF (VA AND 8) THENPRINT"2400"ELSEPRINT"1200"
295 BA=2:NI=10:GOSUB460
300 PRINT" Beep; Melody";VA\4;"Volume";VA AND 3
305 BA=2:NI=11:GOSUB460
310 PRINT" Start-up colors:";VA AND 3
315 PRINT:PRINT"Bank 03"
320 BA=3:NI=0:GOSUB460
325 IF VA<>0 THEN 345
330 BA=3:NI=1:TI$="":FORA=0TO5:GOSUB480:NI=NI+1:TI$=TI$+CHR$(VA):NEXTA
335 IFASC(TI$)=0 THEN445
340 PRINT"Title = ";TI$:GOTO450
345 IF VA<>2 THEN 360
350 BA=3:NI=1:TI$="":FORA=0TO5:GOSUB480:NI=NI+1:TI$=TI$+CHR$(VA):NEXTA
355 PRINT"Prompt = ";TI$:GOTO450
360 IF VA<>1 THEN 445
365 BA=3:NI=1:GOSUB460:IF VA<>1 THEN445
370 BA=3:NI=2:GOSUB460:IF VA<>2 THEN445
375 BA=3:NI=3:GOSUB460:IF VA<>3 THEN445
380 BA=3:NI=4:GOSUB480:PW=VA
385 BA=3:NI=6:GOSUB480:PW=PW+VA*256
390 PRINT"Password = ";
395 FORLP=0TO15
400 IF (PW/2)=INT(PW/2)THENOF=0:GOTO420
405 V1=INT(PW/256):V2=PW-V1*256
410 V2=V2XOR4:V1=V1XOR128:PW=V1*256+V2
415 OF=32768!
420 PW=INT(PW/2)+OF
425 NEXTLP
430 PRINTHEX$(PW)"H= "CHR$(PW/256)CHR$(PW-INT(PW/256)*256);
435 BA=3:NI=8:GOSUB480:IF VA=1 THEN PRINT" Halt password"
440 GOTO450
445 PRINT"No (valid) information in bank 03"
450 '
455 GOTO 455
460 OUT&HB4,13:OUT(&HB5),(INP(&HB5)AND12)OR BA
465 OUT&HB4,NI:VA=INP(&HB5)
470 RETURN
475 GOSUB460:TP=VA:NI=NI+1:GOSUB460:VA=VA*10+TP:RETURN
480 GOSUB460:TP=VA:NI=NI+1:GOSUB460:VA=VA*16+TP:RETURN
|