10
20
30
40
50
60 :
70 OSWRCH=&FFEE:OSNEWL=&FFE7:OSARGS=&FFDA:OSBYTE=&FFF4
80 DIM mc% &200:load%=&FFFF0900:zp%=&A8:roms=&AC:flg=&AD
90 :
100 FOR P=0 TO 1
110 P%=load%:O%=mc%
120 [OPT P*2+4
130 .start%
140 LDA #0:LDX #&FF:JSR OSBYTE :\ Find machine type
150 TXA:BNE CmdLine :\ If not Electron, X<>&00
160 LDA #&05:STA ROMSEL+1 :\ Change to Electron ROMSEL
170 DEC ROMTABLE+1:DEC ROMACTIVE+1 :\ Change to Electron ROMTABLE
180 .CmdLine
190 STY flg:LDA #1:LDX #zp%:JSR OSARGS :\ Find command line (Y=0 from above)
200 .CmdLp
210 LDA (zp%),Y:CMP #13:BEQ CountRoms :\ No more parameters
220 DEC flg:BNE RomsStart :\ Parameters present, do extended list
230 :
240 .CountRoms
250 TYA:DEY :\ A=&00, Y=&FF
260 .CountLoop
270 INY
280 .ROMTABLE
290 ORA &2A1,Y:BEQ CountLoop :\ Find lowest active ROM
300 :
310 .RomsStart
320 STY roms:LDA &F4:PHA:LDX #15 :\ Save current, count from 15 downwards
330 PHP:SEI
340 .RomsLoop
350 JSR SelectRom :\ Select this ROM
360 LDY #ASC"O"
370 LDA &8008:EOR #&AA:STA &8008 :\ Modify version byte
380 CMP &8008:PHP:EOR #&AA:STA &8008 :\ Restore version byte
390 .RomTest
400 LDA &8008:EOR &8008:BNE RomTest :\ Loop until stops changing
410 PLP:BNE RomType:LDY #ASC"A"
420 .RomType
430 LDA #ASC"R":JSR OSWRCH
440 TYA:JSR OSWRCH :\ 'ROM' or 'RAM'
450 LDA #ASC"M":JSR OSWRCH:JSR PrSpace
460 TXA:JSR PrNybble:JSR PrSpace
470 :
480 STX &F5:LDX #3:LDY &8007 :\ Check for ROM header
490 .CheckLp
500 LDA &8000,Y:CMP Header,X:BNE NoHeader
510 INY:DEX:BPL CheckLp:LDX &F5
520 .ROMACTIVE
530 LDA &2A1,X:CMP #4 :\ &00=empty, &01=duplicate, &02=SRDATA/SRROM
540 PHP:BCS RomEnabled
550 LDA #ASC"(":JSR OSWRCH
560 .RomEnabled
570 :
580 LDY #9:SEC:JSR PrString1 :\ Print title and version string
590 LDA &7FFE,Y:AND #&F0 :\ Check if number printed
600 CMP #&30:BEQ VersionDone :\ Version string printed
610 JSR PrSpace
620 LDA &8008:AND #&7F:LDY &8006 :\ Get version and ROM type
630 CPY #&60:BNE RomVersion :\ Not BASIC
640 CMP #2:BCS RomVersion:ADC #1 :\ If 0 or 1, change to 1 or 2
650 .RomVersion
660 CMP #&10:BCC RomVersion2 :\ Print &0x as x.00
670 PHA:ASL A:PLA :\ Change &xy to &yx
680 ROL A:ROL A:ROL A:ROL A:ROL A :\ Print &xy as x.y0
690 .RomVersion2
700 PHA:JSR PrNybble :\ Print x
710 LDA #ASC".":JSR OSWRCH :\ Print x.
720 PLA:AND #&F0:JSR PrHex :\ Print x.y0
730 .VersionDone
740 :
750 \ Y=>'(' of copyright string or '(' of version string
760 LDA flg:BEQ NoCopyrightString :\ No parameters given
770 CPY &8007:BCS NoVersionString
780 CLC:JSR PrStringSpc :\ Print rest of version string
790 .NoVersionString
800 :
810 LDY &8007:CLC:JSR PrStringSpc :\ Print Copyright string
820 .NoCopyrightString
830 :
840 PLP:BCS NoHeader
850 LDA #ASC")":JSR OSWRCH
860 .NoHeader
870 JSR OSNEWL:LDX &F5
880 CPX roms:BEQ RomsFinished
890 DEX:JMP RomsLoop :\ Step down to next ROM
900 :
910 .RomsFinished
920 PLP:PLA:TAX
930 .SelectRom
940 LDA #12:JSR SelectRom2 :\ Electron ROM select
950 TXA:STA &FF30,X :\ Enable WERAM writes
960 .SelectRom2
970 STA &F4
980 .ROMSEL
990 STA &FE30 :\ Select ROM
1000 .ZeroEnd
1010 RTS
1020 :
1030 .PrStringZero
1040 BCC ZeroEnd
1050 .PrStringSpc
1060 PHP:JSR PrSpace:PLP
1070 .PrStringLp
1080 INY
1090 .PrString1
1100 BCC PrString :\ CLC=&00 terminator
1110 LDA &8001,Y
1120 CMP #ASC"(":BEQ ZeroEnd:SEC :\ SEC='(' terminator
1130 .PrString
1140 LDA &8000,Y:BEQ PrStringZero :\ &00, check for terminator
1150 PHP:CMP #ASC" "
1160 BCC P%+5:JSR OSWRCH :\ Ignore control codes
1170 PLP:BNE PrStringLp
1180 :
1190 .PrSpace
1200 LDA #ASC" ":BNE PrChar
1210 :
1220 .PrHex
1230 PHA:LSR A:LSR A:LSR A:LSR A
1240 JSR PrNybble:PLA
1250 .PrNybble
1260 AND #15:CMP #10:BCC PrDigit:ADC #6
1270 .PrDigit
1280 ADC #ASC"0":.PrChar:JMP OSWRCH
1290 :
1300 .Header
1310 EQUS ")C(":EQUB 0
1320 EQUS "v1.12"
1330 ]
1340 NEXT
1350 PRINT" *SAVE ROMS ";~mc%;" ";~O%;" ";~start%OR&FFFF0000;" ";~load%