/ > XSave/src v0.10 18-Feb-2015 J.G.Harston A Source for *XSAVE - save from page-wide extended RAM in JIM : (7OSARGS=&FFDA:OSFILE=&FFDD:OSGBPB=&FFD1:OSFIND=&FFCE 2GSINIT=&FFC2:GSREAD=&FFC5 <: F, mcode% &300:load%=&FFFF08C0:ver$="010" P: Z gbpb=&2EE d>addr=&A8:num=&AC:handle=&AF:lptr=&F2:latch=&FCFF:jim=&FD00 n P=0 1 xP%=load%:O%=mcode% [OPT P*3+4 .CopyData LDA num+0:BNE CopySub256 :\ Copy up to page boundary .Copy256 ;LDA addr+0:TAX:BEQ CopyBank :\ addr is paged aligned .CopySub256 < #&FF:TAX:INX :\ number to align transfer .CopyBank 8LDA num:PHA :\ Save current count BSTX num:TXA:PHA :\ num=count to do in this pass LDA addr+1:STA latch-0 LDA addr+2:STA latch-1 LDA addr+3:STA latch-2 "LDX #0:LDY addr+0 ,.CopyBytes 6LDA jim,Y:STA buffer,X @!INX:INY:DEC num:BNE CopyBytes J: T1PLA:PHA:STA gbpb+5 :\ count b0-b7 ^2LDX #0:TAY:BNE P%+3:INX :\ &0xx or &100 hSTX gbpb+6:LDX #0 rBSTX gbpb+7:STX gbpb+8 :\ count=&000000xx or &00000100 |DEX 4STX gbpb+4:STX gbpb+3 :\ addr=&FFFFxxxx  LDA #buffer 256:STA gbpb+2 4LDA #buffer 255:STA gbpb+1 :\ addr=&FFFFbuffer ,LDA handle:STA gbpb+0 :\ handle LDX #gbpb 255 LDY #gbpb 256 LDA #2:JSR OSGBPB 6PLA:TAX :\ X=number written : 1CLC:ADC addr+0:STA addr+0:PHP :\ Update addr 2LDA #0:CPX #1:BCS P%+4:LDA #1 :\ &100 or &0xx PLP:ADC addr+1:STA addr+1  LDA #0:ADC addr+2:STA addr+2  LDA #0:ADC addr+3:STA addr+3 : EPLA:STA num:TXA:PHA:TSX:SEC :\ Restore num, SP=>number written &2LDA num+0:SBC &101,X:STA num+0 :\ Update count 0BPLA:PHP:TAX :\ Save Carry, X=number written :2LDA #0:CPX #1:BCS P%+4:LDA #1 :\ &100 or &0xx DPLP:PHA:TSX N"LDA num+1:SBC &101,X:STA num+1 X"PLA:LDA num+2:SBC #0:STA num+2 bJMP CopyData l: v .Close 0LDY handle:LDA #0:JSR OSFIND :\ Close file TAX:\LDX #0 .GetAddrs1 -PLA:STA ctrl+0,X:INX:CPX #6:BNE GetAddrs1 8LDA #2:JSR CallOsfile:LDX #0 :\ Write load address .GetAddrs2 -PLA:STA ctrl+6,X:INX:CPX #4:BNE GetAddrs2 8LDA #3 :\ Write exec address .CallOsfile LDX #ctrl 255 LDY #ctrl 256 JMP OSFILE : (\ Code used once, use as buffer area  .ctrl  .buffer  : * .start% 4&LDA #1:LDX #addr:LDY #0:JSR OSARGS >R\ Can't read directly to &F2/3 'cos 4-byte address, would overwrite &F4 ROMNUM H3LDA addr+0:STA lptr+0:STA ctrl+0 :\ =>filename R$LDA addr+1:STA lptr+1:STA ctrl+1 \ CLC:JSR GSINIT:BEQ jmpSyntax f .SkipName p7JSR GSREAD:BCC SkipName :\ Step past name z9JSR SkipSpace:BEQ jmpSyntax :\ No start address : >LDX #10:JSR GetHexCheck:BEQ jmpSyntax :\ No /  GSTA ctrl+6,X:STA ctrl+2,X :\ =, = DEX:BPL CopyAddr : "PLA:CMP #"+":PHP:BNE ScanSize ?JSR SkipSpace1 :\ Step past + and spaces  .ScanSize >LDX #14:JSR GetHexCheck :\ Get or LDX #0:PLP:BEQ SizeLength : SEC .SizeEndLp $?LDA ctrl+14,X:SBC ctrl+10,X:STA num,X :\ num=- .INX:TXA: #4:BNE SizeEndLp 8BEQ ScanAddrs B.jmpSyntax LJMP errSyntax V: `.SizeLength jCLC t.SizeLengthLp ~5LDA ctrl+14,X:STA num,X :\ num= ?ADC ctrl+10,X:STA ctrl+14,X :\ =+ !INX:TXA: #4:BNE SizeLengthLp : .ScanAddrs 5LDA (lptr),Y:CMP #13:BEQ Create :\ No 6LDX #6:JSR GetHexCheck:BEQ Create :\ Get 6LDX #2:JSR GetHexCheck:BNE jmpSyntax :\ Get  .Create  LDX #9 .SaveAddrs @LDA ctrl+0,X:PHA:DEX:BPL SaveAddrs :\ Save addrs for later 7LDA #7:JSR CallOsfile :\ Create file 8LDX ctrl+0:LDY ctrl+1 :\ XY=>filename  +LDA #&80:JSR OSFIND:TAY:BEQ errCantOpen STY handle:JMP CopyData : (.GetHexDigit 2LDA (lptr),Y <CMP #"0":BCC HexDigitBad FCMP #"9"+1:BCC HexDigitOk PCMP #"A":BCC HexDigitBad Z #&DF dCMP #"F"+1:BCS HexDigitBad n SBC #7 x.HexDigitOk SBC #"0"-1:RTS .HexDigitBad  CLC:RTS : .GetHexCheck !JSR GetHexDigit:BCC errSyntax  LDA #0 STA ctrl+0,X:STA ctrl+1,X STA ctrl+2,X:STA ctrl+3,X .GetHexNext !JSR GetHexDigit:BCC SkipSpace PHA:TYA:PHA:LDY #4 .GetHexMultiply ASL ctrl+0,X:ROL ctrl+1,X ROL ctrl+2,X:ROL ctrl+3,X DEY:BNE GetHexMultiply "PLA:TAY:PLA ,A ctrl+0,X:STA ctrl+0,X 6INY:BNE GetHexNext @: J.SkipSpace1 TINY ^.SkipSpace h)LDA (lptr),Y:CMP #" ":BEQ SkipSpace1 rCMP #13:RTS |: .errCantOpen *\BRK:\EQUB 192:\EQUS "Can't open file" .errSyntax YBRK:EQUB 220:EQUS "Syntax: XSave |+ ( ())":BRK :  EQUS ver$ : ]: ' (P%&FFFF)>&B00:"Code overrun": % buffer>&A00:"Buffer overrun": V"*SAVE XSave "+~mcode%+" "+~O%+" "+~(start%&FFFF0000)+" "+~(load%&FFFF0000)