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 |