10OsWrch=&FFEE 20OsAscii=&FFE3 30OsNewl=&FFE7 40OsByte=&FFF4 50from=&A8 60to=&AA 70ZPStopAddr=&AC 80lengthZP=&90-&00 90startLAN=&8200 100startZP=startLAN-lengthZP 110lengthLAN=&800-&400 120startRAM=startLAN+lengthLAN 130PROCassemble 140PROCloadrom 150END 160DEFPROCassemble 170DIM Code startZP-&8000 180FOR Pass = 4 TO 6 STEP 2 190P%=&8000 200O%=Code 210[OPT Pass 220 Jmp Language 230 Jmp Service 240 EQUB &C2 250 EQUB CopyR-&8000 260.version EQUB 13 270.RomName 280 EQUB (ASC"U") AND 31 290 EQUS "Magic RamRom":EQUB 0 300.VersString 310 EQUS "V1.6" 320.CopyR 330 EQUB 0 340 EQUS "(C) GT+KDR 1986" 350 EQUB 0 360.HelpText 370 EQUS " *S Save Ram" 380 EQUB &0D 390 EQUS " *L Load Ram" 400 EQUB 0 410.NoLang EQUS "Lang?":EQUB 0 420.Language 430 Ldx #&FF:Txs:Cli 440 Lda #(ASC"F") AND 31:Jsr OsWrch 450 Jsr fromRom 460 Ldx LangNumber 470 Cpx &F4 480 Beq FindNextLang 490 Lda &2A1,X 500 And #&40 510 Beq FindNextLang 520.StartLang 530 Lda #142 540 Jmp OsByte 550 560 570.FindNextLang 580 Ldx &F4:Dex 590.findLoop 600 Lda #&40 610 And &2A1,X 620 Bne StartLang 630 Dex 640 Bpl findLoop 650 Ldx #NoLang-&8000 660 Jsr Write 670.ForEver Beq ForEver 680 690.Service 700 Cmp #4 710 Beq CheckComm 720 Cmp #9 730 Beq DoHelp 740 Rts 750.DoHelp 760 Lda (&F2),Y 770 Cmp #&0D 780 Bne NoHelp 790 Ldx #RomName+1-&8000 800 Jsr WriteSp 810 Ldx #VersString-&8000 820 Jsr WriteLn 830 Ldx #HelpText-&8000 840 Jsr WriteLn 850.NoHelp 860 Lda #9 870 Rts 880.CheckComm 890 Iny:Lda (&F2),Y:Dey 900 Cmp #&0D:Bne NotOurs 910 Lda (&F2),Y 920 And #95 930 Cmp #ASC("S") 940 Beq toRom 950 Cmp #ASC("L") 960 Beq fromRom 970.NotOurs 980 Lda #4 990 Rts 1000.fromRom 1010 Ldx #0 1020.recov 1030 Lda startZP,X 1040 Sta &0,X 1050 Inx 1060 Cpx #lengthZP+&00 1070 Bne recov 1080 Lda #startLAN DIV 256:Sta from+1 1090 Lda #&0400 DIV 256:Sta to+1 1100 Lda #(&0400+lengthLAN) DIV 256 1110 Sta ZPStopAddr 1120 Jsr CopyBytes 1130 Lda #startRAM DIV 256:Sta from+1 1140 Lda &244:Sta to+1 1150 Clc:Adc savedLength 1160 Sta ZPStopAddr 1170 Jmp copyExit 1180 1190.toRom 1200 Lda #&C0:Sta StopAddr 1210 Lda #&A0:Sta StopAddr+&2000 1220 Lda StopAddr 1230 Beq NotOurs \ Write Protected - ignore save 1240 Lda &28C 1250 Sta LangNumber 1260 Ldx #0 1270.TFRzp 1280 Lda &0,X 1290 Sta startZP,X 1300 Inx 1310 Cpx #lengthZP+&00 1320 Bne TFRzp 1330 Lda #&04:Sta from+1 1340 Lda #startLAN DIV 256:Sta to+1 1350 Lda #(startLAN+lengthLAN) DIV 256 1360 Sta ZPStopAddr 1370 Jsr CopyBytes 1380 Lda &244:Sta from+1 1390 Lda #startRAM DIV 256:Sta to+1 1400 Lda StopAddr:Sta ZPStopAddr 1410 Sec:Sbc to+1 1420 Sta savedLength 1430.copyExit 1440 Jsr CopyBytes 1450 Lda #0 1460 Sta StopAddr 1470 Rts 1480 1490.CopyBytes \Dont change X 1500 Ldy #0: Sty from: Sty to 1510.copyLoop 1520 Lda (from),Y:Sta (to),Y 1530 Inc from 1540 Bne from1:Inc from+1:.from1 1550 Inc to 1560 Bne to1:Inc to+1:.to1 1570 Lda to+1 1580 Cmp ZPStopAddr 1590 Bne copyLoop 1600.Rts Rts 1610 1620.Write 1630 Lda &8000,X 1640 Beq Rts 1650 Jsr OsAscii 1660 Inx 1670 Bne Write 1680 1690.WriteLn 1700 Jsr Write 1710 Jmp OsNewl 1720 1730.WriteSp 1740 Jsr Write 1750 Lda #ASC" " 1760 Jmp OsWrch 1770 1780.LangNumber EQUB &A \ 13 1790.StopAddr EQUB 0 1800.savedLength EQUB 0 1810] 1820NEXT Pass 1830PRINT"Size = &";~O%-Code 1840free=startZP-P% 1850IF free<0 THEN PRINT "Program ";-free;" bytes too long":STOP 1860PRINT "Bytes free = &";~free 1870ENDPROC 1880DEFPROCloadrom 1890DIM Loader &200 1900FOR Pass=0 TO 2 STEP 2 1910P%=Loader 1920[OPT Pass 1930PHP:SEI 1940Lda &F4:PHA 1950Lda #15:Sta &F4:Sta &FE30 1960Ldx #0 1970.Loop 1980 Lda Code,X 1990 Sta &8000,X 2000 Lda Code+&100,X 2010 Sta &8100,X 2020 Inx 2030 Bne Loop 2040PLA:Sta &F4:Sta &FE30 2050PLP 2060Rts 2070] 2080NEXT Pass 2090CALL Loader 2100ENDPROC