10 REM > AS/SRC 20 REM J.G.Harston, 15-Feb-1990 30 REM Save BASIC program with embedded filename 40 REM Demonstrates writing code in BASIC workspace 50 REM Up to 256 bytes will fit in string buffer at &600-&6FF 60 : 70 REM Based on CSAVER, Micro User, Apr 1988 80 REM and *AS, Micro User, Nov 1989 90 : 100 DIM mcode% &200 :REM memory to assemble to 110 load%=&600 :REM Address to load to 120 osbyte=&FFF4 130 ptr=&70:cr=&0D:rem=&F4 140 FOR L%=4 TO 7 STEP 3 150 P%=load%:O%=mcode% 160 [OPT L% 170 .exec% 180 \ Header identifies this as 6502 code 190 JMP start:BRK:BRK:BRK :\ Entry point 200 EQUB &42:EQUB copy-exec% :\ &42=6502 code 210 EQUB &01:EQUS "AutoSave" :\ Title 220 EQUB &00:EQUS "1.00 (15 Feb 1990)" 230 .copy 240 EQUB &00:EQUS "(C) J.G.Harston" 250 EQUB &00 260 270 .start 280 \ Check that BASIC is the current language 290 LDA #187:JSR rdbyte:STA ptr :\ Read BASIC ROM number 300 LDA #252:JSR rdbyte:CMP ptr :\ Read current language ROM number 310 BEQ basicok :\ They match 320 BRK:EQUB 249:EQUS "Not in BASIC":BRK 330 .rdbyte 340 LDX #0:LDY #255:JSR osbyte :\ Read an OSBYTE variable 350 TXA:AND #63:RTS :\ Return it in X without b7-b6 360 370 .basicok 380 LDA #21:LDX #0:JSR osbyte :\ Clear keyboard buffer 390 LDA &18:STA ptr+1 400 LDY #0:STY ptr+0 :\ ptr=>PAGE 410 LDA (ptr),Y 420 CMP #13:BNE noprog :\ No program in memory 430 INY:LDA (ptr),Y 440 CMP #&FF:BEQ noprog :\ Empty program 450 LDY #3 460 .remloop 470 INY:LDA (ptr),Y :\ Get byte from line 480 CMP #cr:BEQ norem :\ Found , no REM 490 CMP #rem:BNE remloop :\ Loop until REM found 500 .spaceloop 510 INY:LDA (ptr),Y 520 CMP #32:BEQ spaceloop :\ Step past any spaces 530 CMP #ASC">":BEQ foundname :\ REM > filename 540 CMP #34:BEQ foundname :\ REM "filename 550 DEY :\ No prefix, step back 560 .foundname 570 TYA:PHA:LDX #0 :\ Remember offset to filename 580 .loop 590 LDY save,X:JSR osbyte138 :\ Insert characters from 600 INX:CPX #4:BNE loop :\ DELETEBGET 610 PLA:TAY :\ Get back offset to filename 620 .getname 630 INY:TYA:PHA:LDA (ptr),Y :\ Get filename character 640 CMP #cr:BEQ addcr :\ End of line 650 CMP #34:BEQ addcr :\ Terminating quote 660 TAY:JSR osbyte138 :\ Insert the character 670 PLA:TAY:BNE getname 680 .addcr 690 PLA 700 LDY #34:JSR osbyte138 :\ Insert terminating quote 710 LDY #cr :\ Insert 720 .osbyte138 730 TXA:PHA :\ Save X 740 LDA #138:LDX #0:JSR osbyte :\ Insert Y into kbd buffer 750 PLA:TAX:RTS :\ Restore X 760 .noprog 770 BRK:BRK:EQUS "No program" 780 .norem 790 BRK:BRK:EQUS "No REM" 800 BRK 810 .save 820 EQUS "SA.""" 830 ]:NEXT 840 A$="*SAVE AS "+STR$~mcode%+" "+STR$~O%+" "+STR$~exec%+" "+STR$~load% 850 PRINTA$;:OSCLIA$:PRINT