10 REM > SRLoad/src v1.05
   20 REM Source for *SRLoad command
   30 REM 12-Oct-1996 v1.04: Electron compatible
   40 REM 12-Feb-2016 v1.05: Changes MODE if needed, EEPROM compatible
   50 :
   60 REM *SRLOAD file        - load to highest unused RAM
   70 REM *SRLOAD file r      - ROM r
   80 REM *SRLOAD file nnnn r - ROM r, ignore nnnn
   90 :
  100 OSARGS=&FFDA:OSFILE=&FFDD:GSINIT=&FFC2:GSREAD=&FFC5
  110 OSBYTE=&FFF4:OSRDCH=&FFE0:OSWRCH=&FFEE:OSNEWL=&FFE7
  120 DIM mcode% &300:load%=&FFFF0900
  130 src=&A8:dst=&AA:rom=&AC:flg=&AD
  140 REM flg=%BxxxIRQP for Bank, Insert, Run, Quick, Pause
  150 :
  160 FOR P=0 TO 1
  170   P%=load%:O%=mcode%
  180   [OPT P*2+4
  190   .text
  200   EQUS "Press SPACE to load"
  210   .errSyntax
  220   BRK:EQUB 220:EQUS "Syntax: SRLoad <afsp> (<rom>) (I)(R)(P)":BRK
  230   :
  240   .exec%
  250   LDA #0:LDX #1:JSR OSBYTE              :\ Find machine type
  260   TXA:BNE CmdLine                       :\ If not Electron, X<>&00
  270   LDA #&05:STA ROMSEL+1                 :\ Change to Electron ROMSEL
  280   DEC ROMTABLE1+1:DEC ROMTABLE2+1       :\ Change to Electron ROMTABLE
  290   .CmdLine
  300   STY rom:STY flg                       :\ ROM=0, clear flags
  310   LDA #1:LDX #src:JSR OSARGS            :\ Find command line (Y=0 from above)
  320   LDA src+0:STA &F2:LDA src+1:STA &F3   :\ GSTEXT=>command line
  330   CLC:JSR GSINIT:BEQ errSyntax
  340   .loop1
  350   JSR GSREAD:BCC loop1                  :\ Step past filename
  360   .loop2
  370   LDA (&F2),Y:INY:CMP #32:BEQ loop2     :\ Skip spaces
  380   CMP #13:BEQ load                      :\ End of line, load the file
  390   CMP #ASC"0":BCC errSyntax             :\ <'0', error
  400   CMP #ASC"9"+1:BCC digit               :\ '0'-'9', set ROM number
  410   CMP #ASC"A":BCC errSyntax             :\ '9'-'A', error
  420   AND #&DF
  430   CMP #ASC"G":BCC digithex              :\ 'A'-'F', set ROM number
  440   CMP #ASC"P":BEQ option                :\ 'P'ause -> 0 -> 1
  450   CMP #ASC"R":BEQ option                :\ 'R'un   -> 2 -> 4
  460   \CMP #ASC"Q":\BEQ option              :\ 'Q'uick -> 1 -> 8
  470   CMP #ASC"I":BNE loop2                 :\ 'I'nsert
  480   ADC #1                                :\ Convert 'I' to 3 -> 2
  490   .option
  500   AND #3:TAX:LDA BitMap,X
  510   .option2
  520   ORA flg:STA flg:BNE loop2
  530   .digithex
  540   SBC #6
  550   .digit
  560   AND #15:LDX #4
  570   .digitlp
  580   ASL rom:DEX:BNE digitlp
  590   ORA rom:STA rom                       :\ Move digit into ROM number
  600   LDA #&80:BNE option2                  :\ ROM number specified
  610   .BitMap
  620   EQUB 1:EQUB 8:EQUB 4:EQUB 2
  630   .jmpSyntax
  640   JMP errSyntax
  650   :
  660   .load
  670   SEI                        :\ Disable IRQs while manipulating ROMs
  680   LDA &F4:PHA
  690   BIT flg:BMI loadrom        :\ <rom> specified, use it
  700   :
  710   LDX #15                    :\ Look for highest empty RAM
  720   .findlp
  730   JSR SelectRom
  740   .ROMTABLE1
  750   LDA &2A1,X:BNE findnext    :\ ROM table entry, check next
  760   .findtest
  770   STX rom
  780   JSR ramtest:BEQ loadgo     :\ Writable, jump to use it
  790   .findnext
  800   DEX:BPL findlp             :\ Loop through all banks
  810   BRK:EQUB 133:EQUS "No free SRAM found":BRK
  820   :
  830   .loadrom
  840   LDA rom:CMP #&10:BCC lorom :\ rom<&10 - use as hex
  850   SBC #6:STA rom             :\ rom=&10-&15 - use as decimal
  860   CMP #16:BCS jmpSyntax      :\ rom>15
  870   .lorom
  880   TAX:JSR SelectRom
  890   JSR ramtest:BEQ loadgo     :\ Writable, jump to use it
  900   BRK:EQUB 135:EQUS "Bank not writable":BRK
  910   :
  920   .loadgo
  930   CLI
  940   LDA src+0:STA blk+0        :\ Point to filename
  950   LDA src+1:STA blk+1
  960   LSR flg:BCC preload        :\ No 'P'ause, flg=flg/2
  970   LDY #0:BEQ prmsg
  980   .prmsglp
  990   JSR OSWRCH:INY
 1000   .prmsg
 1010   LDA text,Y:BNE prmsglp
 1020   JSR OSRDCH:JSR OSNEWL      :\ Wait for a keypress
 1030   :
 1040   .preload
 1050   LDA #&84:JSR OSBYTE        :\ Read top of memory
 1060   CPY #&70:BCS loadfile      :\ Enough free memory
 1070   LDA #22:JSR OSWRCH
 1080   LDA #&87:JSR OSWRCH        :\ Change to MODE 7
 1090   LDA #&84:JSR OSBYTE        :\ Read top of memory again
 1100   :
 1110   .loadfile
 1120   TYA:SEC:SBC #&40:STA blk+3 :\ load=HIMEM-&4000
 1130   STA src+1                  :\ src=HIMEM-&4000
 1140   LDX #blk AND 255:LDY #blk DIV 256
 1150   LDA #255:JSR OSFILE        :\ Load file to main memory
 1160   LDA #0:JSR InsertRom       :\ Remove ROM from ROM table
 1170   TAY:JSR SelectRom          :\  and page it in
 1180   STY src+0:STY dst+0        :\ Also set Y=0 for loop
 1190   LDA #&80:STA dst+1         :\ dst=&8000
 1200   .copylp1
 1210   LDX #64                    :\ 64 bytes at a time
 1220   .copylp2
 1230   LDA (src),Y:STA (dst),Y    :\ Copy data
 1240   INY:DEX:BNE copylp2        :\ Loop for 64 bytes
 1250   DEY                        :\ Step back to last byte
 1260   .copylp3
 1270   CMP (dst),Y:BNE copylp3    :\ Wait for data to settle
 1280   INY:BNE copylp1            :\ Loop for 256 bytes
 1290   INC src+1:INC dst+1
 1300   BIT dst+1:BVC copylp1      :\ Loop until dst=&C000
 1310   :
 1320   LSR flg:BCC done           :\ No 'I'nsert, flg=flg/2
 1330   LDX #3:LDY &8007
 1340   .chkhdr
 1350   LDA &8003,Y:CMP header,X   :\ Check ROM header
 1360   BNE done                   :\ No ROM header
 1370   DEY:DEX:BPL chkhdr         :\ ROM has valid header
 1380   LDA &8006:JSR InsertRom    :\ Store ROM type in ROM table
 1390   :
 1400   LSR flg:BCC done           :\ No 'R'un
 1410   LDA #142:JMP OSBYTE        :\ Enter as a language
 1420   :
 1430   .done
 1440   PLA:TAX                    :\ Restore ROM
 1450   .SelectRom
 1460   LDA #12:JSR SelectRom2
 1470   TXA:STA &FF30,X            :\ Enable WERAM writes
 1480   .SelectRom2
 1490   STA &F4
 1500   .ROMSEL
 1510   STA &FE30:RTS              :\ Select ROM
 1520   .InsertRom
 1530   LDX rom
 1540   .ROMTABLE2
 1550   STA &2A1,X:RTS             :\ Store ROM type in ROM table
 1560   :
 1570   .ramtest
 1580   LDA &8008:EOR #&AA:STA &8008     :\ Modify version byte
 1590   CMP &8008:PHP:EOR #&AA:STA &8008 :\ Restore version byte
 1600   .romtest
 1610   LDA &8008:EOR &8008:BNE romtest  :\ Loop until stops changing
 1620   PLP:RTS                          :\ EQ=writable, NE=not writable
 1630   :
 1640   .header
 1650   EQUB 0:EQUS "(C)"
 1660   .blk
 1670   EQUW 0:EQUD &FFFF3000:EQUD 0
 1680   \EQUD 0:\EQUD 0
 1690   :
 1700   EQUS "v1.05"
 1710 ]NEXT
 1720 IFP%>&B00:PRINT"Code overrun":END
 1730 PRINT" *SAVE SRLoad ";~mcode%;" ";~O%;" ";~exec%OR&FFFF0000;" ";~load%