10 REM P(artial)SAVE utility V.1.2 20 REM by M.Bobrowski 8'90 30 : 40 pptr=&A8:ptr=&70:lineno=&72:number=&74:temp=&76:crflag=&78:endflag=&79 50 osargs=&FFDA:osfile=&FFDD:osword=&FFF1:osbyte=&FFF4:osasci=&FFE3:osnewl=&FFE7:osrdch=&FFE0 60 : 70 FOR pass=0 TO 3 STEP 3 80 P%=&900 90 [OPT pass 100 .read_command 110 LDA #1:LDX #pptr:LDY #0:JSR osargs 120 LDA #5:LDX #pptr:LDY #0:JSR osword 130 LDA pptr+4:CMP #13:BNE main 140 .syntax 150 BRK:EQUB 128:EQUS "Syntax: *PSAVE ,,()":EQUB0 160 : 170 .main 180 JSR read_filename:BNE nosave 190 JSR set_fileblock 200 LDA #1:STA endflag:JSR read_param 210 LDA &18:STA ptr+1:LDA #0:STA ptr 220 JSR read_program 230 LDA crflag:BEQ second_param 240 \set TOP as endaddress 250 LDA &12:STA endaddr:LDA &13:STA endaddr+1 260 BNE save 270 .second_param 280 DEC endflag 290 JSR read_param:LDA crflag:BEQ syntax 300 JSR read_program 310 .save 320 LDA #0:LDX #fileblock MOD 256:LDY #fileblock DIV 256:JSR osfile 330 LDA endflag:BEQ exit 340 .nosave 350 RTS 360 .exit 370 LDA temp:LDY #1:STA (ptr),Y 380 RTS 390 : 400 .read_filename 410 LDY #0 420 .rfn2 430 LDA (pptr),Y:CMP #13:BEQ syntax 440 CMP #ASC",":BEQ rfn3:CMP #32:BEQ rfn3 450 STA filename,Y:INY:BNE rfn2 460 .rfn3 470 TYA:ADC pptr:STA pptr 480 LDA #13:STA filename,Y 490 \ check filename 500 JSR zero 510 LDX #fileblock MOD 256:LDY #fileblock DIV 256 520 LDA #5:JSR osfile:CMP #1:BNE notpresent 530 JSR printname:JSR message 540 EQUS " file exists on disc."+CHR$13+"Overwrite it (Y/N)?"+CHR$0 550 .getyn 560 LDA #15:LDX #1:JSR osbyte:JSR osrdch 570 CMP #27:BEQ escape 580 AND #&5F:CMP #ASC("Y"):BEQ yn2 590 CMP #ASC"N":BNE getyn 600 .yn2 610 TAY:JSR osasci:JSR osnewl:BNE erfn 620 .notpresent 630 LDY #ASC"Y" 640 .erfn 650 CPY #ASC"Y":RTS 660 : 670 .escape 680 BRK:EQUB 17:EQUS "Escape":EQUB 0 690 : 700 .set_fileblock 710 JSR zero:LDA #&82:JSR osbyte 720 STX loadaddr+2:STX execaddr+2:STX startaddr+2:STX endaddr+2 730 STY loadaddr+3:STY execaddr+3:STY startaddr+3:STY endaddr+3 740 \read OSHWM 750 CLC:ADC #1:JSR osbyte 760 STX loadaddr:STY loadaddr+1 770 \set execaddr 780 LDA #&23:STA execaddr:LDA #&80:STA execaddr+1 790 RTS 800 : 810 .read_param 820 LDA #0:STA number:STA number+1:TAY 830 .getchar 840 LDA (pptr),Y 850 CMP #13:BEQ gch2 860 CMP #ASC",":BEQ gch2 870 CMP #32:BEQ gch2 880 JSR mult_ten 890 LDA (pptr),Y 900 SEC:SBC #ASC"0" 910 CMP #10:BCS badnum 920 JSR inc_num 930 CPY #6:BNE getchar 940 BEQ toobig 950 .gch2 960 STA temp 970 LDA number+1:BMI toobig 980 LDA temp:CMP #13:BNE update 990 LDA #&FF:STA crflag:RTS 1000 .update 1010 TYA:ADC pptr:STA pptr 1020 LDA #0:STA crflag:RTS 1030 : 1040 .badnum 1050 BRK:EQUB 255:EQUS"Bad number" 1060 .toobig 1070 BRK:EQUB 20:EQUS"Too big":BRK 1080 : 1090 .inc_num 1100 CLC:ADC number:STA number 1110 LDA number+1:ADC #0:STA number+1 1120 INY:RTS 1130 .mult_ten 1140 JSR mult_two 1150 LDA number+1:PHA:LDA number:PHA 1160 JSR mult_two:JSR mult_two 1170 PLA:CLC:ADC number:STA number 1180 PLA:ADC number+1:STA number+1 1190 RTS 1200 .mult_two 1210 ASL number:ROL number+1 1220 RTS 1230 : 1240 .read_program 1250 LDY #0:LDA (ptr),Y 1260 CMP #&0D:BNE badprog 1270 INY:LDA (ptr),Y:STA lineno+1 1280 CMP #&FF:BEQ notfound 1290 INY:LDA (ptr),Y:STA lineno 1300 \compare 1310 LDA lineno+1:CMP number+1:BCC getnextline 1320 BNE notfound 1330 LDA lineno:CMP number:BCC getnextline 1340 BNE notfound 1350 LDA endflag:BEQ set_endpoint 1360 LDA ptr:STA startaddr:LDA ptr+1:STA startaddr+1 1370 RTS 1380 .set_endpoint 1390 INY:LDA (ptr),Y 1400 CLC:ADC ptr:STA ptr:BCC sep2 1410 INC ptr+1 1420 .sep2 1430 LDY #1:LDA (ptr),Y:STA temp 1440 LDA #&FF:STA (ptr),Y 1450 CLC:LDA ptr:ADC #2:STA endaddr 1460 LDA ptr+1:ADC #0:STA endaddr+1 1470 RTS 1480 : 1490 .getnextline 1500 INY:LDA (ptr),Y 1510 CLC:ADC ptr:STA ptr:BCC continue 1520 INC ptr+1 1530 .continue 1540 JMP read_program 1550 : 1560 .badprog 1570 BRK:EQUB 0:EQUS"Bad program" 1580 .notfound 1590 BRK:EQUB 41:EQUS"No such line":BRK 1600 : 1610 .printname 1620 LDX #0 1630 .pfn1 1640 LDA filename,X:CMP #13:BEQ pnf2 1650 JSR osasci:INX:BNE pfn1 1660 .pnf2 1670 RTS 1680 : 1690 .message 1700 PLA:STA temp:PLA:STA temp+1 1710 LDY #1 1720 .mes1 1730 LDA (temp),Y:BEQ mes2 1740 JSR osasci:INY:BNE mes1 1750 .mes2 1760 INC temp:BNE mes3:INC temp+1 1770 .mes3 1780 DEY:BPL mes2 1790 JMP (temp) 1800 : 1810 .zero 1820 LDA #0:LDX #15 1830 .zero2 1840 STA fileblock+2,X:DEX:BPL zero2 1850 RTS 1860 : 1870 .fileblock 1880 EQUW filename 1890 .loadaddr:EQUD 0 1900 .execaddr:EQUD 0 1910 .startaddr:EQUD 0 1920 .endaddr:EQUD 0 1930 .filename 1940 EQUS STRING$(20,CHR$0) 1950 :] 1960 NEXT 1970 : 1980 PRINT'"To save object code press COPY ";:REPEAT UNTIL INKEY-106:PRINT 1990 OSCLI"SAVE PSAVE 900 "+STR$~P% 2000 END