10
20
30
40
50 :
60
70
80
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
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%