10
20 oscli=&FFF7:OSWORD=&FFF1:OSBYTE=&FFF4
30 OSWRCH=&FFEE:OSNEWL=&FFE4:OSASCI=&FFE3
40 mcode%=TOP+&1800
50 FOR P=0 TO 1
60 O%=mcode%:P%=&8000
70 [OPT P*3+4
80 JMP lang
90 JMP serv
100 EQUB &C2
110 EQUB copy-&8000
120 BRK
130 EQUS "Skeleton ROM"
140 .copy
150 BRK:EQUS "(C)1987 J.G.Harston":BRK
160 \ Language part
170 .lang
180 LDX #&FF:TXS:CLD:CLI
190 LDA #err_handler AND 255:STA &202
200 LDA #err_handler DIV 256:STA &203
210 .lang_loop
220 LDA #ASC"*":JSR OSWRCH
230 LDA #0:LDX #buff AND 255
240 LDY #(buff) DIV 256
250 JSR OSWORD
260 BCS escape
270 LDX #0:LDY #4:JSR oscli
280 JMP lang_loop
290 .escape
300 LDA #124:JSR OSBYTE
310 BRK:EQUB 17:EQUS "Escape":BRK
320 .buff
330 EQUW &400
340 EQUB 255:EQUB 32:EQUB 255
350 .err_handler
360 JSR OSNEWL:JSR report
370 JMP lang_loop
380 .report
390 LDY #1
400 .errloop
410 LDA (&FD),Y:CMP #0:BEQ err2
420 JSR OSWRCH:INY:JMP errloop
430 .err2
440 JMP OSNEWL
450 \ Service part
460 .serv
470 PHA:LDA &DF0,X:CMP #255:BEQ disabled:PLA
480 CMP #2:BEQ serv2:\ Private WS
490 CMP #4:BEQ serv4:\ *comms
500 CMP #6:\BEQ serv6:\Errors
510 CMP #9:BEQ serv9:\ *HELP
520 CMP #&22:BEQ serv22:\ Master PV WS
530 RTS
540 .disabled:PLA:RTS
550 .serv2
560 TYA:PHA:LDA #&81:LDX #0:LDY #255:JSR OSBYTE
570 CPY #0:BNE serv2go
580 CPX #253:BEQ serv2end:CPX #245:BNE serv2go
590 .serv2end:PLA:TAY:LDA #2:RTS
600 .serv2go:PLA:STA &DF0,X:LDA #2:RTS
610 .serv22
620 TYA:STA &DF0,X:LDA #22:RTS
630 .serv4
640 JMP serv4run
650 .serv3
660 TYA:PHA:LDA #122:JSR OSBYTE
670 TXA:BMI init_rom
680 CMP #51:BEQ init_rom:\ R key
690 PLA:TAY:LDX &F4:LDA #3:RTS
700 .init_rom:LDA #120:JSR OSBYTE
710 PLA:\JSR rom_init:\Init the ROM
720 \ If A=0, boot up at rom_init
730 LDX &F4:LDA #0:RTS
740 .run_help_end
750 LDA #9:LDY &AF:LDX &F4:RTS
760 .serv9
770 STY &AF
780 \ Next few lines check HELP text:
790 LDA (&F2),Y:CMP #ASC".":BEQ do_help1
800 AND #&DF:CMP #ASC"F":BNE not_file_help
810 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help1:AND #&DF:CMP #ASC"I":BNE not_file_help
820 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help1:AND #&DF:CMP #ASC"L":BNE not_file_help
830 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help1:AND #&DF:CMP #ASC"E":BNE not_file_help
840 .do_help1
850 JSR pr_text:EQUB 13:EQUS "Skeleton Filer":EQUB 13:BRK
860 LDA #os_comm1_text AND 255:STA &AC
870 LDA #os_comm1_text DIV 256:STA &AD
880 LDA #os_comm1 AND 255:STA &A9
890 LDA #os_comm1 DIV 256:STA &AA
900 JSR do_help:LDY &AF
910 LDA (&F2),Y:CMP #ASC".":BNE run_help_finish
920 JMP do_help2
930 .run_help_end2:JMP run_help_end
940 .not_file_help
950 LDA (&F2),Y:AND #&DF:CMP #ASC"M":BNE run_help_end2
960 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help2:AND #&DF:CMP #ASC"O":BNE run_help_end2
970 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help2:AND #&DF:CMP #ASC"S":BNE run_help_end2
980 .do_help2
990 JSR pr_text:EQUB 13:EQUS "Skeleton MOS 1.00":EQUB 13:BRK
1000 LDA #os_comm2_text AND 255:STA &AC
1010 LDA #os_comm2_text DIV 256:STA &AD
1020 LDA #os_comm2 AND 255:STA &A9
1030 LDA #os_comm2 DIV 256:STA &AA
1040 JSR do_help:LDY &AF
1050 LDA (&F2),Y:CMP #ASC".":BEQ run_help_end2
1060 .run_help_finish
1070 LDA #0:RTS
1080 .do_help
1090 TYA:PHA:LDA #&BD:STA &A8:LDA #&60:STA &AB
1100 LDX #0:LDY #0
1110 .help_mess_loop
1120 LDA #32:JSR OSWRCH:JSR OSWRCH
1130 .help_mess_loop2
1140 JSR &A8:BEQ help_word
1150 JSR OSWRCH:INX:CLC:BCC help_mess_loop2
1160 .help_word
1170 LDA #32:JSR OSWRCH
1180 .help_mess_loop3
1190 LDA (&AC),Y:BEQ help_text_end
1200 JSR OSWRCH:INY:CLC:BCC help_mess_loop3
1210 .help_text_end
1220 JSR OSNEWL
1230 INY:INX:INX:INX:JSR &A8:CMP #&FF:BNE help_mess_loop
1240 PLA:TAY:RTS
1250 .search_table
1260 LDA #&BD:STA &A8
1270 LDA #&60:STA &AB
1280 STY &AF
1290 LDX #0
1300 .search_main_loop
1310 LDY &AF
1320 .search_loop
1330 LDA (&F2),Y:CMP #ASC".":BEQ dot
1340 JSR &A8:CMP (&F2),Y:BNE not_equal
1350 .equal
1360 INX:INY:JSR &A8:BEQ zero_byte
1370 BNE search_loop
1380 .dot
1390 JSR fnd_zero1
1400 INY
1410 .zero_byte
1420 INX:JSR &A8:STA &AC
1430 INX:JSR &A8:STA &AD
1440 .no_spaces
1450 LDA (&F2),Y:CMP #32:BNE found_code
1460 INY:CLC:BCC no_spaces
1470 .found_code
1480 CLC:RTS
1490 .fnd_zero
1500 INX
1510 .fnd_zero1
1520 JSR &A8:BNE fnd_zero
1530 RTS
1540 .not_equal
1550 EOR #32:CMP (&F2),Y:BEQ equal
1560 JSR fnd_zero
1570 INX:INX:INX:JSR &A8:CMP #&FF
1580 BNE search_main_loop
1590 LDY &AF:SEC:RTS
1600 .serv4run
1610 LDA #(os_comm1)MOD 256
1620 STA &A9
1630 LDA #(os_comm1)DIV 256
1640 STA &AA
1650 .serv4bit:JSR search_table
1660 BCC serv4go
1670 LDA #4:LDX &F4:RTS
1680 .serv4go:LDX &F4
1690 JSR jump
1700 LDA #0:RTS
1710 .jump:JMP (&AC)
1720 \ Tables
1730 .os_comm1
1740 EQUS "TEST":BRK:EQUW 0:\ test
1750 EQUB 255
1760 .os_comm1_text
1770 EQUS "<params>":BRK
1780 .os_comm2
1790 EQUS "CHECK":BRK:EQUW 0:\ check
1800 EQUB 255
1810 .os_comm2_text
1820 EQUS "more <params>":BRK
1830 \ Routines
1840 \ Misc. routines
1850 .pr_hex
1860 PHA:LSR A:LSR A:LSR A:LSR A
1870 JSR first
1880 PLA
1890 .first
1900 AND #&0F:CMP #10
1910 BCC over
1920 ADC #6
1930 .over
1940 ADC #48:JMP OSWRCH
1950 \
1960 .pr_text
1970 STA &AE
1980 PLA:STA &AC:PLA:STA &AD:TXA:PHA:TYA:PHA
1990 LDY #0:.pr_main_loop
2000 INC &AC:BNE continue
2010 INC &AD:.continue
2020 LDA (&AC),Y
2030 BEQ end_of_string
2040 JSR OSASCI:JMP pr_main_loop
2050 .end_of_string
2060 INC &AC:BNE pr_exit_end
2070 INC &AD:.pr_exit_end
2080 PLA:TAY:PLA:TAX:LDA &AE:JMP (&AC)
2090 \
2100 .errors
2110 PLA:STA &AC:PLA:STA &AD
2120 LDY #0:LDX #0
2130 .error_main_loop
2140 INX:INY:LDA (&AC),Y:STA &100,X
2150 BNE error_main_loop
2160 LDA #0:STA &100:JMP &100
2170 \
2180 .Bad_Command
2190 JSR errors
2200 EQUB 254:EQUS "Bad command":BRK
2210 .Bad_Number
2220 JSR errors
2230 EQUB 200:EQUS "Bad Number":BRK
2240 .get_hex_addr
2250 LDX #&A8:LDA #0
2260 STA 0,X:STA 1,X:STA 2,X
2270 .next_char
2280 LDA (&F2),Y:JSR ascii_to_binary
2290 BCS get_hex_error
2300 ASL A:ASL A:ASL A:ASL A
2310 STY 2,X:LDY #4
2320 .get_hex_again
2330 ASL A:ROL 0,X:ROL 1,X
2340 DEY:BNE get_hex_again
2350 LDY 2,X:INY:BNE next_char
2360 .get_hex_error
2370 LDA 2,X:RTS
2380 .ascii_to_binary
2390 CMP #48:BCC illegal
2400 CMP #58:BCC zero_nine
2410 SBC #7:BCC illegal
2420 CMP #64:BCS ascii_return
2430 .zero_nine
2440 AND #&0F
2450 .ascii_return
2460 RTS
2470 .illegal
2480 SEC:RTS
2490 .find_ws
2500 PHA:LDX &F4:LDA &DF0,X:STA &A9:LDA #0:STA &A8:PLA:RTS
2510 \
2520 ]
2530 NEXT P
2540 PRINT"SAVE ROM "+STR$~(mcode%)+" "+STR$~(O%+1)+" 8000 8000"