> SRSave/src v1.05  Source for *SRSave command , 15-Oct-1996 v1.04: Electron compatible (/ 12-Feb-2016 v1.05: Changes MODE if needed 2: <& *SRSAVE file r - ROM r F8 *SRSAVE file nnnn+llll r - ROM r, ignore nnnn+llll P: Z7OSARGS=&FFDA:OSFILE=&FFDD:GSINIT=&FFC2:GSREAD=&FFC5 d7OSBYTE=&FFF4:OSRDCH=&FFE0:OSWRCH=&FFEE:OSNEWL=&FFE7 n! mcode% &200:load%=&FFFF0900 x#src=&A8:dst=&AA:rom=&AC:flg=&AD 7 flg=%BxxxIRQP for Bank, Insert, Run, Quick, Pause : P=0 1 P%=load%:O%=mcode% [OPT P*2+4 .text EQUS "Press SPACE to save" .errSyntax ;BRK:EQUB 220:EQUS "Syntax: SRSave (P)":BRK : .exec% >LDA #0:LDX #1:JSR OSBYTE :\ Find machine type DTXA:BNE CmdLine :\ If not Electron, X<>&00 FLDA #&05:STA ROMSEL+1 :\ Change to Electron ROMSEL  .CmdLine ?STY rom:STY flg :\ ROM=0, clear flags "OLDA #1:LDX #src:JSR OSARGS :\ Find command line (Y=0 from above) ,ALDA src+0:STA &F2:LDA src+1:STA &F3 :\ GSTEXT=>command line 6 CLC:JSR GSINIT:BEQ errSyntax @ .loop1 J?JSR GSREAD:BCC loop1 :\ Step past filename T .loop2 ^8LDA (&F2),Y:INY:CMP #32:BEQ loop2 :\ Skip spaces hGCMP #13:BEQ save :\ End of line, save the file r3CMP #"+":BEQ loop2 :\ Skip '+' |6CMP #"0":BCC errSyntax :\ <'0', error BCMP #"9"+1:BCC digit :\ '0'-'9', set ROM number 9CMP #"A":BCC errSyntax :\ '9'-'A', error  #&DF BCMP #"G":BCC digithex :\ 'A'-'F', set ROM number  0 -> 1 <\CMP #"Q":\BEQ option :\ 'Q'uick -> 1 -> 2 <\CMP #"R":\BEQ option :\ 'R'un -> 2 -> 4 3\CMP #"I":\BNE jmperror :\ 'I'nsert B\ADC #1 :\ Convert 'I' to 3 -> 8  .option \ #3:\TAX:\LDA BitMap,X  LDA #1  .option2 A flg:STA flg:BNE loop2  .digithex  SBC #6 & .digit 0 #15:LDX #4 : .digitlp DASL rom:DEX:BNE digitlp NFA rom:STA rom :\ Move digit into ROM number XALDA #&80:BNE option2 :\ ROM number specified b \.BitMap l#\EQUB 1:\EQUB 2:\EQUB 4:\EQUB 8 v .jmperror JMP errSyntax :  .save LDA &F4:PHA : 8LDA rom:CMP #&10:BCC presave :\ rom<&10 - use as hex @SBC #6:STA rom :\ rom=&10-&15 - use as decimal *CMP #16:BCS jmperror :\ rom>15 :  .presave 4LDA src+0:STA blk+0 :\ Point to filename LDA src+1:STA blk+1 5LDA #&84:JSR OSBYTE :\ Read top of memory 5CPY #&70:BCS savefile1 :\ Enough free memory  LDA #22:JSR OSWRCH 0LDA #&87:JSR OSWRCH :\ Change to 7  ;LDA #&84:JSR OSBYTE :\ Read top of memory again *.savefile1 4(STY blk+15 :\ end= >0TYA:SEC:SBC #&40:STA blk+11 :\ start=-&4000 H.STA dst+1 :\ dst=-&4000 R: \@LSR flg:PHP:BCC savefile :\ No 'P'ause, flag is now flg/2 fLDY #0:BEQ prmsg p .prmsglp zJSR OSWRCH:INY  .prmsg LDA text,Y:BNE prmsglp :  .savefile ,LDX rom:JSR SelectRom :\ Select ROM 7LDY #0:STY src+0:STY dst+0 :\ Also set Y=0 for loop +LDA #&80:STA src+1 :\ src=&8000  .copylp +LDA (src),Y:STA (dst),Y :\ Copy data INY:BNE copylp INC src+1:INC dst+1 BIT src+1:BVC copylp : 2LDA &8006 :\ Check Lang+Tube @ASL A:BPL noreloc :\ Not a language, use &FFFF8000 BSEC:LDY #2 :\ If no reloc, start with Y=2, CS $E #&40:BEQ savelp2 :\ No relocation address, use &00008000 .0LDX &8007 :\ Offset to (C) 8 .savelp1 B8INX:LDA &8000,X:BNE savelp1 :\ Step past (C) message LCLC:LDY #0 V .savelp2 `3BCS P%+5:LDA &8001,X :\ Get Tube address j8STA blk+2,Y:STA blk+6,Y :\ Copy to control block t INX:INY:TYA: #4:BEQ savelp2 ~ .noreloc : PLP:PHP:BCC savego 5JSR OSRDCH :\ Wait for a keypress B\ We displayed the message before copying the data so we don't 0\ overwrite the data with the prompt message :  .savego !LDX #blk 255:LDY #blk 256 +LDA #0:JSR OSFILE :\ Save file 6PLP:BCC done:JSR OSNEWL :\ Newline after saving  .done -PLA:TAX :\ Restore ROM .SelectRom  LDA #12:JSR SelectRom2:TXA .SelectRom2  STA &F4 ( .ROMSEL 24STA &FE30:RTS :\ Select ROM to read <: F.blk P(EQUW 0:EQUD &FFFF8000:EQUD &FFFF8000 Z!EQUD &FFFF3000:EQUD &FFFF7000 dEQUS "v1.05" n] xP%>&B00:"Code overrun": E" *SAVE SRSave ";~mcode%;" ";~O%;" ";~exec%&FFFF0000;" ";~load%