10 REM > ROMS/src v1.12
   20 REM Source for *ROMS command
   30 REM 20-Feb-1991
   40 REM 22-Jun-1997 v1.11 Electron compatible
   50 REM 18-Jul-1997 v1.12 Default list displays version number/string
   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%