10
100
150
200
250
300
320
350
360
400
420
430
500 DIMcode 240
550 DIMbaud$(7):FORB%=0TO7:READbaud$(B%):NEXT
600 DIMprinter$(4):FORB%=0TO4:READprinter$(B%):NEXT
650 DIMregs$(9):FORB%=0TO9:READregs$(B%):NEXT
700 Y$=" 20":
710 I$=CHR$17+CHR$129+CHR$17+CHR$0:
720 N$=CHR$17+CHR$128+CHR$17+CHR$1:
730 R$="Press a key to return to menu"
750 PROCassemble
800 M%=128
850 ONERRORM%=M%+1
900 MODE M%
950 ONERRORREPORT:PRINT" at ";ERL;N$:VDU23,1,3;0;0;0;0;:OSCLI"FX4,0":END
1000 REPEAT
1050 CLS:VDU23,1;0;0;0;0;
1100 PRINTI$"Master CMOS/RTC Chip Settings v1.3"N$'
1150 PRINT"1. Show all CMOS settings"
1200 PRINT"2. Show time/date"
1250 PRINT"3. Test CMOS chip"
1300 PRINT"4. Show all time registers"
1350 PRINT"5. Test BST function"
1400 PRINT"6. Set Econet station number"
1450 PRINT"7. Show Registers A to D"
1460 PRINT"8. Show all CMOS registers and bytes"
1500 PRINT'"0. Exit"
1550 REPEATK%=GET:UNTILK%>47ANDK%<57
1600 IFK%=49PROCdisplaycmos
1650 IFK%=50PROCdisplaytime
1700 IFK%=51PROCtestchip
1750 IFK%=52PROCdisplayregs
1800 IFK%=53PROCbsttest
1850 IFK%=54PROCsetstation
1900 IFK%=55PROCshowregisters
1920 IFK%=56PROCshoweverything
1950 UNTILK%=48
2000 VDU23,1,3;0;0;0;0;
2050 END
2100 DATA75,150,300,1200,2400,4800,9600,19200
2150 DATANo printer,Parallel,Serial,User,Econet
2200 DATASeconds,Seconds Alarm,Minutes,Minutes Alarm,Hours,Hours Alarm,Day of Week,Day of Month,Month,Year
2250 DEFPROCassemble
2300 FORB%=0TO2STEP2
2350 P%=code
2400 oswrch=&FFEE
2450 slowbus=&FE4F:
2500 regb=&FE40 :
2550 ddra=&FE43 :
2600 [OPTB%
2650 .read JSRaddress
2700 LDA#&49 \select read
2750 STAregb
2800 LDA#0:STAddra \ WasSTZ ddra, make 6502 compatible
2850 LDA#&4A \set DS active
2900 STAregb
2950 LDYslowbus \value to be read in Y register
3000 JMPfinish
3050 .write JSR address
3100 LDA#&41 \select WR on addressable latch
3150 STAregb
3200 LDA#&4A \take DS active
3250 STAregb
3300 STYslowbus
3350 JMPfinish \ Was BRA, make 6502 compatible
3400 .address LDA #2\enter with X=selected address
3450 STAregb \Write CE & DS inactive to system via
3500 LDA#&82 \AS active
3550 STAregb
3600 LDA#&FF \slow databus as output
3650 STAddra
3700 STXslowbus \write register address
3750 LDA#&C2 \Take CE active
3800 STAregb
3850 LDA#&42 \strobe AS low to latch data
3900 STAregb
3950 RTS
4000 .finish LDA#&42 \deactivate DS
4050 STAregb
4100 LDA#&02 \deactivate CE
4150 STAregb
4200 RTS
4250 .readregister
4300 LDXreg:LDY#0:JSRread:STYcmos:RTS
4350 .writeregister
4400 LDXreg:LDYcmos:JSRwrite:RTS
4450 .readall
4500 LDX#0
4550 .readloop
4600 LDY#0
4650 JSRread
4700 TYA
4750 STAcmos,X
4800 INX
4850 CPX#65
4900 BNEreadloop
4950 RTS
5000 .printromtitle
5050 LDA#&80:STA&F7
5100 LDA#9:STA&F6 \ Rom title at &8009
5150 .romloop
5200 LDYreg \ Re-use register number byte - must be within loop to work on BBCB
5250 JSR&FFB9 \ OSRDRM
5300 CMP#31
5350 BMIskipprint
5400 JSR&FFE3 \ Print if sensible char
5450 .skipprint
5500 CMP#0
5550 BEQromfinish
5600 INC&F6
5650 LDA&F6
5700 CMP#9+16 \ 16 chars printed only (in case rubbish)
5750 BNEromloop
5800 .romfinish
5850 RTS
5900 .reg EQUB0
5950 .cmos EQUS STRING$(14,CHR$0)
6000 .cmosram EQUS STRING$(50,CHR$0)
6050 ]
6100 NEXT
6150 ENDPROC
6200 DEFFNreadreg(R%)
6250
6300 ?reg=R%
6350
6400 CALLreadregister:=?cmos
6450 DEFPROCwritereg(R%,V%)
6500
6550 ?reg=R%
6600 ?cmos=V%:
6650 CALLwriteregister
6700 ENDPROC
6750 DEFFNtime
6800 T%=TIME:REPEATUNTIL(FNreadreg(&A)AND128)=0ORTIME>T%+20:
6850 =FNh(FNreadreg(4))+":"+FNh(FNreadreg(2))+":"+FNh(FNreadreg(0))
6900 DEFFNdate
6950 T%=TIME:REPEATUNTIL(FNreadreg(&A)AND128)=0ORTIME>T%+20:
7000 =MID$("SunMonTueWedThuFriSat",FNreadreg(6)*3-2,3)+","+FNh(FNreadreg(7))+" "+MID$("JanFebMarAprMayJunJulAugSepOctNovDec",FNreadreg(8)*3-2,3)+Y$+FNh(FNreadreg(9))
7050 DEFFNtimestring
7100 =FNdate+"."+FNtime
7150 DEFFNtestcmos
7200
7250 R%=FNreadreg(26):W%=255:IFR%=255 W%=128
7300 PROCwritereg(26,W%)
7350 N%=FNreadreg(26)
7400 PROCwritereg(26,R%):
7450 IFN%=W% =TRUE ELSE =FALSE
7500 DEFFNreaddse
7550 =(FNreadreg(&B)AND1)=1
7600 DEFPROCwritedse
7650 PROCwritereg(&B,(FNreadreg(&B)OR1))
7700 ENDPROC
7750 DEFFNtestbst
7800 PROCwritedse
7850 T%=TIME:REPEATCALLreadall:UNTIL?cmos<&54 ORTIME>T%+600:
7900 REPEATUNTILFNreadreg(0)<>FNreadreg(0):
7950 PRINT"Current time: "TAB(20);FNtimestring
8000 FORB%=0TO9:?(cmos+B%+20)=?(cmos+B%):NEXT:
8050 PROCwritereg(&B,(FNreadreg(&B)OR128)):
8100 U%=TIME:
8150 PROCwritereg(8,&4):PROCwritereg(7,&30):PROCwritereg(6,1):PROCwritereg(4,&1):PROCwritereg(2,&59):PROCwritereg(0,&58):
8200 PRINT"Setting time to:"TAB(20);FNtimestring
8250 PROCwritereg(&B,(FNreadreg(&B)MOD128)):
8300 PRINT"Waiting 2 seconds till 3am..."
8350 T%=TIME:REPEATUNTILTIME>T%+200:
8400 B%=(FNreadreg(4)=&3):
8450 PRINT"Reading time..."TAB(20);FNtimestring
8500 PROCwritereg(&B,(FNreadreg(&B)OR128)):
8550 FORC%=1TO9:PROCwritereg(C%,?(cmos+C%+20)):NEXT:
8600 REPEATUNTILTIME>U%+300:Q%=EVAL(STR$~cmos?20):Q%=Q%+(TIME-U%)/100:Q%=EVAL("&"+STR$Q%):PROCwritereg(0,Q%):
8650 PROCwritereg(&B,(FNreadreg(&B)MOD128)):
8700 PRINT"Restoring time to:"TAB(20);FNtimestring
8750 =B%
8800 DEFPROCshowcmos
8850 CLS
8900 PRINTI$"CMOS RAM Settings:"N$
8950 CALLreadall
9000 PRINT"Econet Station Number"TAB(23);?cmosram
9050 PRINT"Econet Servers"TAB(23)"File server: ";cmosram?2;".";cmosram?1;", Printer Server: ";cmosram?4;".";cmosram?3
9100 PRINT"Default filing system"TAB(23);cmosram?5 MOD16;" (";:?reg=cmosram?5 MOD16:CALLprintromtitle:PRINT")"
9150 PRINT"Default language"TAB(23);cmosram?5 DIV16;" (";:?reg=cmosram?5 DIV16:CALLprintromtitle:PRINT")"
9200 IFM% MOD128=3 PROCshortplug ELSEPROClongplug
9250 PRINT"EDIT settings"TAB(23);"Mode: ";:IF(cmosram?8 AND7)=2PRINT"K";ELSEIF(cmosram?8 AND7)=5PRINT"D";ELSEPRINT;(cmosram?8 AND7);
9300 PRINT", TAB to ";:IFcmosram?8 AND8 PRINT"Words";ELSEPRINT"Columns";
9350 PRINT", ";:IFcmosram?8 AND16 PRINT"Insert";ELSEPRINT"Overwrite";
9400 PRINT", ";:IFcmosram?8 AND32 PRINT"Show";ELSEPRINT"Hide";
9450 PRINT" Returns"
9500 PRINT"Telecoms settings"TAB(23);cmosram?9
9550 PRINT"Screen settings"TAB(23);"Mode: ";128*((cmosram?10 AND8)/8)+(cmosram?10 AND7);", TV ";
9600 T%=(cmosram?10 AND 128)/128*4+(cmosram?10 AND 64)/64*2+(cmosram?10 AND 32)/32*1:IFT%>3 T%=T%+248
9650 PRINT;T%;",";(cmosram?10 AND16)/16;" (";:IFcmosram?10 AND16 PRINT"Interlace on)";ELSEPRINT"Interlace off)";
9700 PRINT", ";:IFcmosram?16 AND 8 PRINT"No scroll";ELSEPRINT"Scroll";
9710 IFcmos?16 AND 1:PRINT", Shadow"ELSEPRINT", No shadow"
9750 PRINT"Floppy drive timings"TAB(23);cmosram?11 AND7
9800 PRINT"ADFS Defaults"TAB(23);:IFcmosram?11 AND64 PRINT"No d";ELSEPRINT"D";
9850 PRINT"irectory, ";:IFcmosram?11 AND128 PRINT"Floppy"ELSEPRINT"Winchester"
9900 PRINT"Keyboard settings"TAB(23);"Repeat Delay: ";cmosram?12;", Repeat Rate: ";cmosram?13;", ";
9950 IF(cmosram?11 AND48)=0PRINT"SHIFT-CAPS ";
10000 IFcmosram?11 AND16PRINT"No CAPS ";
10050 IFcmosram?11 AND32PRINT"CAPS Lock ";
10100 PRINT'"Second processor"TAB(23);:IFcmosram?16 AND4 PRINT"External ";ELSEPRINT"Internal ";
10150 IFcmosram?15 AND1 PRINT"(Enabled) "ELSEPRINT"(Disabled)"
10200 PRINT"Serial settings"TAB(23);"Baud rate: ";1+(cmosram?15 AND 16)/16*4+(cmosram?15 AND 8)/8*2+(cmosram?15 AND 4)/4*1;" (";baud$((cmosram?15 AND 16)/16*4+(cmosram?15 AND 8)/8*2+(cmosram?15 AND 4)/4*1);"), Data format: ";
10250 PRINT;(cmosram?16 AND 128)/128*4+(cmosram?16 AND 64)/64*2+(cmosram?16 AND 32)/32*1
10300 S%=(cmosram?15 AND 128)/128*4+(cmosram?15 AND 64)/64*2+(cmosram?15 AND 32)/32*1:PRINT"Printer settings"TAB(23);"Type: ";S%;" (";:IFS%<5 PRINTprinter$(S%); ELSEPRINT"Unknown";
10350 PRINT"), Ignore character: ";cmosram?14;" (";:IFcmosram?15 AND2 PRINT"Not i";ELSEPRINT"I";
10400 PRINT"n use)"
10450 PRINT"Beep"TAB(23);:IFcmosram?16 AND 2 PRINT"Loud"ELSEPRINT"Quiet"
10500 PRINT"Autoboot"TAB(23);:IFcmosram?16 AND16 PRINT"Boot" ELSE PRINT"No boot"
10550 PRINT"ANFS Settings"TAB(23);:IFcmosram?17 AND 1 PRINT"Space";ELSEPRINT"No space";
10600 PRINT", FindLib ";:IFcmosram?17 AND2 PRINT"on";ELSEPRINT"off";
10650 PRINT", Workspace ";:IFcmosram?17 AND4 PRINT"&E/F";ELSEPRINT"&B/C";
10700 PRINT", Protection ";:IFcmosram?17 AND64PRINT"on";ELSEPRINT"off";
10750 PRINTTAB(23)"Display versions ";:IFcmosram?17 AND 128 PRINT"on"ELSEPRINT"off"
10800 PRINT"Joystick Settings"TAB(23)"Speed: ";cmosram?18 AND7;", ";:IFcmosram?18 AND 32 PRINT"Switched";ELSEPRINT"Proportional";
10810 PRINT", Century: ";19+(cmosram?18 DIV 64)
10820 PRINT"Country"TAB(23);cmosram?19
10830 PRINT"ROM bytes"TAB(23);:FOR A%=30 TO 45:PRINTFNh(cmos?A%);" ";:NEXT:PRINT
10850 ENDPROC
10900 DEFFNromtitle(?reg)
10950 CALLprintromtitle
11000 =TRUE:
11050 DEFPROCdisplaycmos
11100 PROCshowcmos:PRINT'R$
11150 REPEATPRINTTAB(50,0)"Time: ";FNtimestring:UNTILINKEY(10)<>-1
11200 ENDPROC
11250 DEFPROCdisplaytime
11300 CLS:PRINTI$"Display RTC Time and Date"N$''''R$
11350 REPEATPRINTTAB(0,2)FNtimestring:UNTILINKEY(10)<>-1
11400 ENDPROC
11450 DEFPROCtestchip
11500 CLS:PRINTI$"Test Presence of CMOS Chip"'N$
11550 IFFNtestcmos PRINT"6818 chip present"ELSEPRINT"No 6818 chip"
11600 PRINT'R$
11650 REPEATUNTILGET
11700 ENDPROC
11750 DEFPROCdisplayregs
11800 CLS:PRINTI$"Show Time Registers"N$
11850 *FX225,128
11900 REPEAT
11950 CALLreadall
12000 bcd=(cmos?&B AND4)=0
12050 PRINTTAB(0,2);
12100 FORB%=0TO13
12150 PRINT;B%;" - ";:IFB%<10 PRINTregs$(B%); ELSE PRINT"Register ";~B%;
12200 PRINTTAB(23);:IFB%<10 ANDbcd PRINT~cmos?B% ELSE PRINTcmos?B%
12250 NEXT
12300 PRINT'"Register B Settings (toggle with f0-f3):"
12350 PRINT"Daylight saving"TAB(23);:IFFNreaddse PRINT"Enabled "ELSEPRINT"Disabled"
12400 PRINT"12/24 Hour Clock"TAB(23);:IFcmos?&B AND2 PRINT"24-hour clock"ELSEPRINT"12-hour clock"
12450 PRINT"Data mode"TAB(23);:IFbcd PRINT"Binary coded decimal"ELSEPRINT"Decimal "
12500 PRINT"Clock set"TAB(23);:IFcmos?&B AND 128 PRINT"Clock halted "ELSEPRINT"Clock running"
12550 PRINT'"Press "I$"f0-f3"N$" or any other"RIGHT$(R$,22)
12600 PRINTTAB(50,0)"Time: ";FNtimestring
12650 K%=INKEY(10)
12700 IFK%=128 PROCwritereg(&B,FNreadreg(&B) EOR1):K%=-1
12750 IFK%=129 PROCwritereg(&B,FNreadreg(&B)EOR2):K%=-1
12800 IFK%=130 PROCwritereg(&B,FNreadreg(&B)EOR4):K%=-1
12850 IFK%=131 PROCwritereg(&B,FNreadreg(&B)EOR128):K%=-1
12900 UNTILK%<>-1
12950 K%=0
13000 *FX225,1
13050 ENDPROC
13100 DEFPROClongplug
13150 FORB%=0TO7
13200 PRINT"ROM ";B%;" ";:IFcmosram?6 AND2^B% PRINT"Inserted"; ELSEPRINT"Unplugged";
13250 PRINTTAB(23)"ROM ";B%+8;" ";:IFcmosram?7 AND2^B% PRINT"Inserted" ELSEPRINT"Unplugged"
13300 NEXT
13350 ENDPROC
13400 DEFPROCshortplug
13450 PRINT"ROMs Unplugged"TAB(23);
13500 FORC%=6TO7
13550 FORB%=0TO7
13600 IFcmosram?C% AND2^B% ELSE PRINT;B%+(C%-6)*8;" ";
13650 NEXT:NEXT
13700 PRINT'"ROMS Inserted"TAB(23);
13750 FORC%=6TO7
13800 FORB%=0TO7
13850 IFcmosram?C% AND2^B% PRINT;B%+(C%-6)*8;" ";
13900 NEXT:NEXT
13950 PRINT
14000 ENDPROC
14050 DEFPROCbsttest
14100 CLS:PRINTI$"Testing BST function of 6818 chip...."'N$
14150 IFNOTFNtestcmos PRINT"No 6818 chip":GOTO14250
14200 IFFNtestbst PRINT'"BST function present"ELSEPRINT'"No BST Function"
14250 PRINT''R$
14300 REPEATUNTILGET
14350 ENDPROC
14400 DEFPROCsetstation
14450 VDU23,1,3;0;0;0;0;
14500 CLS:PRINTI$"Set Econet station number"'N$
14550 PRINT"Current station number: ";FNreadreg(14)
14600 REPEAT
14650 PRINT"Input new station number: ";:INPUT""S%
14700 IFS%<0 OR S%>254 PRINT"Bad station number"
14750 UNTILS%>=0 AND S%<255
14800 IFS%=0 PRINT"Unchanged"ELSEPRINT"Setting station number to ";S%:PROCwritereg(14,S%)
14850 PRINT'R$;
14900 REPEATUNTILGET
14950 ENDPROC
15000 DEFPROCshowregisters
15050 regsel=65:bitsel=7
15100 *FX4,1
15110 *FX219,9
15150 CLS
15200 PRINTI$"Show Registers A-D"N$
15250 PRINTTAB(0,28)I$"Arrow keys"N$" to change highlighted selection"I$'"RETURN"N$" to toggle bit"I$'"TAB"N$RIGHT$(R$,18)
15300 PRINTTAB(0,13)I$"Register A (R/W except bit 7)"N$'"Update in progress (7)"'"Divider bits (6-4)"'"Rate selection bits (3-0)"
15350 PRINTTAB(40,13)I$"Register B (R/W)"N$'TAB(40,14)"Set (Halt RTC)"TAB(40,15)"Periodic Interrupt Enable"TAB(40,16)"Alarm Interrupt Enable"TAB(40,17)"Update-Ended Interrupt Enable"
15400 PRINTTAB(40,18)"Square Wave Enable"TAB(40,19)"Data Mode"TAB(40,20)"24/12 Hr Clock"TAB(40,21)"Daylight Saving Enable"
15450 PRINTTAB(0,18)I$"Register C (R/O bits 7-4)"N$'"Interrupt Request Flag"'"Periodic Interrupt Flag"'"Alarm Interrupt Flag"'"Update-Ended Interrupt Flag"
15500 PRINTTAB(0,24)I$"Register D (R/O bit 7)"N$'"Valid RAM and Time - Power sense pin"
15520 PRINTTAB(0,1)"Bit 7 6 5 4 3 2 1 0"
15550 PRINTTAB(0,2)"Value 128 64 32 16 8 4 2 1 Total"
15560 FORB%=65TO68:PRINTTAB(0,-126+(B%*2))CHR$B%;:NEXT
15600 REPEAT
15650 PRINTTAB(50,0)"Time: ";FNtimestring
15700 FORB%=65TO68
15720 currentreg=FNreadreg(B%-55):
15750
15850 FORC%=7TO0STEP-1
15900 IFregsel=B% AND bitsel=C% PRINTI$; ELSEPRINTN$
15950 PRINTTAB(ABS(-55+(C%*7)),-126+(B%*2));" ";:IFcurrentreg AND2^C% PRINT"1";ELSEPRINT"0";:
16000 PRINT" ";
16050 NEXT
16100 PRINTTAB(66,-126+(B%*2));N$;currentreg;" ";
16150 NEXT
16180 currentreg=FNreadreg(&A)
16200 IFcurrentreg AND128PRINTTAB(28,14)"Set "ELSEPRINTTAB(28,14)"Clear"
16250 PRINTTAB(28,15);((currentreg AND112)/16);" "
16300 PRINTTAB(28,16);currentreg AND15;" "
16320 currentreg=FNreadreg(&B)
16350 FORB%=7TO3STEP-1:IFcurrentreg AND2^B% PRINTTAB(70,ABS(-21+B%))"Set "ELSEPRINTTAB(70,ABS(-21+B%))"Clear"
16400 NEXT
16450 PRINTTAB(70,19);:IFcurrentreg AND2^2 PRINT"Decimal"ELSEPRINT"BCD "
16500 PRINTTAB(70,20);:IFcurrentreg AND2^1 PRINT"24-hr"ELSEPRINT"12-hr"
16550 PRINTTAB(70,21);:IFcurrentreg AND2^0 PRINT"Enabled "ELSEPRINT"Disabled"
16560 currentreg=FNreadreg(&C)
16600 FORB%=7TO4STEP-1:IFcurrentreg AND2^B% PRINTTAB(28,ABS(-26+B%))"Set "ELSEPRINTTAB(28,ABS(-26+B%))"Clear"
16650 NEXT
16700 IFFNreadreg(&D)AND2^7 PRINTTAB(37,25)"High"ELSEPRINTTAB(37,25)"Low "
16720 K%=INKEY(0):IFK%=-1 OR K%=9 ELSEPROCdokeypress
16750 UNTILK%=9
16800 *FX4,0
16850 ENDPROC
16900 DEFPROCdokeypress
16950 IFK%=139 regsel=regsel-1:IFregsel<65 regsel=68
17000 IFK%=136 bitsel=bitsel+1:IFbitsel>7 bitsel=0
17050 IFK%=137 bitsel=bitsel-1:IFbitsel<0 bitsel=7
17100 IFK%=138 regsel=regsel+1:IFregsel>68 regsel=65
17150 IFK%=13 PROCwritereg(regsel-55,(FNreadreg(regsel-55)EOR2^bitsel))
17200 *FX15,1
17250 ENDPROC
18000 DEFPROCshoweverything
18020 CLS:PRINTI$"Show All CMOS Registers and Bytes"N$
18030 REPEAT
18040 CALLreadall
18045 PRINTTAB(0,2);
18050 FORB%=0TO13
18055 IFB%>6 PRINTTAB(40,B%-5);
18060 PRINT"Register ";B%;TAB(16);cmos?B%;TAB(20);"(&";FNh(cmos?B%);")"
18080 NEXT
18100 PRINT
18140 FORB%=0TO49
18160 PRINTTAB(20*(B% DIV13),10+(B% MOD13))"Byte ";B%;SPC(3-LENSTR$B%);SPC(3-LENSTR$(cmosram?B%));cmosram?B%;" (&";FNh(cmosram?B%);")"
18180 NEXT
18900 PRINTTAB(0,26)R$
18950 UNTILNOTINKEY(0)
18990 ENDPROC
19000 DEFFNh(A%)=RIGHT$("0"+STR$~A%,2)