10
20
30 oscli=&FFF7:OSWORD=&FFF1:OSBYTE=&FFF4
40 OSWRCH=&FFEE:OSNEWL=&FFE4:OSASCI=&FFE3
50 nvwrch=&FFCB:DIM mcode% &1000
60 FOR P=0 TO 1
70 O%=mcode%:P%=&8000
80 [OPT P*3+4
90 JMP lang
100 JMP serv
110 EQUB &C2
120 EQUB copy-&8000
130 EQUB &02:\ Version
140 EQUS "Extra Utilities":BRK:EQUS "1.02 (20 Jan 1989)"
150 .copy
160 BRK:EQUS "(C)1988 J.G.Harston":BRK
170 \ Language part
180 .lang
190 LDX #&FF:TXS:CLD:CLI
200 LDA #err_handler AND 255:STA &202
210 LDA #err_handler DIV 256:STA &203
220 .lang_loop
230 LDA #ASC"*":JSR OSWRCH
240 LDA #0:LDX #buff AND 255
250 LDY #(buff) DIV 256
260 JSR OSWORD:BCS escape
270 LDX #0:LDY #7:JSR oscli
280 JMP lang_loop
290 .escape
300 LDA #124:JSR OSBYTE
310 BRK:EQUB 17:EQUS "Escape":BRK
320 .buff
330 EQUW &700
340 EQUB 255:EQUB 32:EQUB 255
350 .err_handler
360 LDX &F4:LDA #252:LDY #0:JSR OSBYTE
370 JSR OSNEWL:JSR report
380 JMP lang_loop
390 .report
400 LDY #1
410 .errloop
420 LDA (&FD),Y:BEQ err2
430 JSR OSWRCH:INY:JMP errloop
440 .err2
450 JMP OSNEWL
460 \ Service part
470 .serv7:PHA:LDA &EF:CMP #90:BNE serv7try
480 LDA &F0:BEQ serv7info:CMP #2:BNE disabled:\ Recognises *FX90,2
490 LDA &DF0,X:ORA #128:STA &DF0,X:PLA:LDA #0:RTS
500 .serv7try:CMP #89:BNE disabled
510 LDA &F0:JSR pr_hex:PLA:LDA #0:RTS
520 .serv7info:LDA &F1:BEQ serv7help
530 CMP #1:BNE disabled
540 JSR pr_text:EQUS "2: ":BRK:JSR pr_title
550 JMP disabled
560 .serv7help:LDA #90:LDX #0:LDY #1:JSR OSBYTE
570 PLA:LDA #0:RTS
580 .serv
590 CMP #7:BEQ serv7
600 PHA:LDA &DF0,X:AND #128:BEQ disabled:PLA
610 CMP #2:BEQ serv2
620 CMP #4:BEQ serv4
630 CMP #6:BEQ serv6:\Errors
640 CMP #9:BEQ serv9
650 CMP #&FE:BEQ servFE
660 RTS
670 .disabled:PLA:RTS
680 .serv4:JMP serv4run
690 .serv6:JSR new_oscli_ret_check:LDA #6:RTS
700 .serv9:JMP serv9run
710 .servFE
720 JSR new_os
730 LDA #1:STA &267:JSR OSNEWL:JSR pr_title
740 LDA &28D:BEQ servFEexit
750 LDA #7:JSR OSWRCH
760 .servFEexit:JSR OSNEWL:LDA #&FE:RTS
770 .serv2
780 TYA:PHA:ORA #128:STA &DF0,X:JSR find_ws:LDY #8:LDA #0:STA (&A8),Y
790 LDA #3:STA &202:LDA #255:STA &203:LDA #&A8:LDX #0:LDY #&FF:JSR OSBYTE
800 STX &A8:STY &A9:LDY #3:LDA #err_handler AND&FF:STA (&A8),Y:INY:LDA #err_handler DIV256:STA (&A8),Y:INY:LDA &F4:STA (&A8),Y
810 TAX:PLA:TAY:INY:LDA #2:RTS
820 .pr_title:JSR pr_text:EQUS "Extended BBC MOS 1.00":EQUB 13:BRK:RTS
830 .serv9run
840 STY &AF:LDA (&F2),Y:CMP #13:BEQ serv9simple
850 CMP #ASC".":BEQ serv9print:AND #&DF:CMP #ASC"E":BNE serv9exit
860 INY:LDA (&F2),Y:CMP #ASC".":BEQ serv9print:AND #&DF:CMP #ASC"X":BNE serv9exit
870 INY:LDA (&F2),Y:CMP #ASC".":BEQ serv9print:AND #&DF:CMP #ASC"T":BNE serv9exit
880 .serv9print
890 JSR serv9text
900 LDA #osc_help_text1 AND 255:STA &AC
910 LDA #osc_help_text1 DIV 256:STA &AD
920 LDA #osc_table1 AND 255:STA &A9
930 LDA #osc_table1 DIV 256:STA &AA
940 JSR do_help
950 LDY &AF:LDA (&F2),Y:CMP #ASC".":BEQ serv9exit
960 LDA #0:RTS
970 .serv9text
980 JSR pr_text
990 EQUB 13:EQUS "Sideways RAM Extension 1.00 ":EQUB 13:BRK
1000 RTS
1010 .serv9simple:JSR serv9text
1020 .serv9exit:LDY &AF:LDA #9:RTS
1030 .run_help
1040 STY &AF:LDA (&F2),Y:CMP #13:BNE run_help2
1050 JSR OSNEWL:JSR pr_title:JSR pr_text:EQUS " FILE":EQUB 13:EQUS " MOS":EQUB 13:BRK
1060 .run_help_end
1070 LDA #9:LDY &AF:RTS
1080 .run_help2
1090 LDA (&F2),Y:CMP #ASC".":BEQ do_help1
1100 AND #&DF:CMP #ASC"F":BNE not_file_help
1110 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help1:AND #&DF:CMP #ASC"I":BNE not_file_help
1120 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help1:AND #&DF:CMP #ASC"L":BNE not_file_help
1130 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help1:AND #&DF:CMP #ASC"E":BNE not_file_help
1140 .do_help1
1150 JSR pr_text:EQUB 13:EQUS "Extended file handler 1.00":EQUB 13:BRK
1160 LDA #file_os_text AND 255:STA &AC
1170 LDA #file_os_text DIV 256:STA &AD
1180 LDA #file_os AND 255:STA &A9
1190 LDA #file_os DIV 256:STA &AA
1200 JSR do_help:LDY &AF
1210 LDA (&F2),Y:CMP #ASC".":BNE run_help_finish
1220 JMP do_help2
1230 .run_help_end2:JMP run_help_end
1240 .not_file_help
1250 LDA (&F2),Y:AND #&DF:CMP #ASC"M":BNE run_help_end2
1260 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help2:AND #&DF:CMP #ASC"O":BNE run_help_end2
1270 INY:LDA (&F2),Y:CMP #ASC".":BEQ do_help2:AND #&DF:CMP #ASC"S":BNE run_help_end2
1280 .do_help2
1290 JSR OSNEWL:JSR pr_title
1300 LDA #mos_os_text AND 255:STA &AC
1310 LDA #mos_os_text DIV 256:STA &AD
1320 LDA #mos_os AND 255:STA &A9
1330 LDA #mos_os DIV 256:STA &AA
1340 JSR do_help:LDY &AF
1350 LDA (&F2),Y:CMP #ASC".":BEQ run_help_end2
1360 .run_help_finish
1370 LDA #0:RTS
1380 .do_help
1390 TYA:PHA:LDA #&BD:STA &A8:LDA #&60:STA &AB
1400 LDX #0:LDY #0
1410 .help_mess_loop
1420 LDA #32:JSR OSWRCH:JSR OSWRCH
1430 .help_mess_loop2
1440 JSR &A8:BEQ help_word
1450 JSR OSWRCH:INX:CLC:BCC help_mess_loop2
1460 .help_word
1470 LDA #32:JSR OSWRCH
1480 .help_mess_loop3
1490 LDA (&AC),Y:BEQ help_text_end
1500 JSR OSWRCH:INY:CLC:BCC help_mess_loop3
1510 .help_text_end
1520 JSR OSNEWL
1530 INY:INX:INX:INX:JSR &A8:CMP #&FF:BNE help_mess_loop
1540 PLA:TAY:RTS
1550 .search_table
1560 LDA #&BD:STA &A8
1570 LDA #&60:STA &AB
1580 STY &AF
1590 LDX #0
1600 .search_main_loop
1610 LDY &AF
1620 .search_loop
1630 LDA (&F2),Y:CMP #ASC".":BEQ dot
1640 JSR &A8:CMP (&F2),Y:BNE not_equal
1650 .equal
1660 INX:INY:JSR &A8:BEQ zero_byte
1670 BNE search_loop
1680 .dot
1690 JSR fnd_zero1
1700 INY
1710 .zero_byte
1720 INX:JSR &A8:STA &AC
1730 INX:JSR &A8:STA &AD
1740 .no_spaces
1750 LDA (&F2),Y:CMP #32:BNE found_code
1760 INY:CLC:BCC no_spaces
1770 .found_code
1780 CLC:RTS
1790 .fnd_zero
1800 INX
1810 .fnd_zero1
1820 JSR &A8:BNE fnd_zero
1830 RTS
1840 .not_equal
1850 EOR #32:CMP (&F2),Y:BEQ equal
1860 JSR fnd_zero
1870 INX:INX:INX:JSR &A8:CMP #&FF
1880 BNE search_main_loop
1890 LDY &AF:SEC:RTS
1900 .serv4run
1910 LDA #(osc_table1)MOD 256
1920 STA &A9
1930 LDA #(osc_table1)DIV 256
1940 STA &AA
1950 .serv4bit:JSR search_table
1960 BCC serv4go
1970 LDA #4:LDX &F4:RTS
1980 .serv4go:LDX &F4
1990 JSR jump
2000 LDA #0:RTS
2010 .jump:JMP (&AC)
2020 \ Tables
2030 .osc_table1
2040 EQUS "NEWOS":BRK:EQUW new_os_command
2050 EQUS "NEWOFF":BRK:EQUW rom_disable
2060 EQUB 255
2070 .file_os
2080 EQUS "CAT":BRK:EQUW cat
2090 EQUS "BUILD":BRK:EQUW build
2100 EQUS "DUMP":BRK:EQUW dump
2110 EQUS "EXEC":BRK:EQUW exec
2120 EQUS "INFO":BRK:EQUW info
2130 EQUS "LIST":BRK:EQUW list
2140 EQUS "LOAD":BRK:EQUW load
2150 EQUS "OPT":BRK:EQUW opt
2160 EQUS "RUN":BRK:EQUW run
2170 EQUS "SAVE":BRK:EQUW save
2180 EQUS "SPOOL":BRK:EQUW spool
2190 EQUS "TYPE":BRK:EQUW type
2200 EQUB 255
2210 .mos_os
2220 EQUS "FX":BRK:EQUW fx
2230 EQUS "HELP":BRK:EQUW help
2240 EQUS "KEY":BRK:EQUW key
2250 EQUS "MESSAGE":BRK:EQUW message
2260 EQUS "MEDIT":BRK:EQUW enter
2270 EQUS "MDUMP":BRK:EQUW examine
2280 EQUS "OS":BRK:EQUW os
2290 EQUS "ROMS":BRK:EQUW roms
2300 EQUS "TAPE":BRK:EQUW tape
2310 EQUB 255
2320 .file_os_text
2330 EQUS "(#<strm>) (<directory>)":BRK
2340 EQUS "<afsp>":BRK
2350 EQUS "(#<strm>) <afsp> (<addr>)":BRK
2360 EQUS "(<afsp>)":BRK
2370 EQUS "(#<strm>) <afsp>":BRK
2380 EQUS "(#<strm>) <afsp>":BRK
2390 EQUS "<afsp> (<load>)":BRK
2400 EQUS "<opt> (<param>)":BRK
2410 EQUS "<afsp> (<params>)":BRK
2420 EQUS "<afsp> <start> <end>|+<length> (<exec> (<load>))":BRK
2430 EQUS "(<afsp>)":BRK
2440 EQUS "(#<strm>) <afsp>":BRK
2450 .mos_os_text
2460 EQUS "<num> (<param1> (<param2>))":BRK
2470 EQUS "(#<strm>) <word>":BRK
2480 EQUS "<key> <text>":BRK
2490 EQUS "<text>":BRK
2500 EQUS "<addr>":BRK
2510 EQUS "(#<strm>) <start> (<end>|+<length>)":BRK
2520 EQUS "":BRK
2530 EQUS "(#<strm>)":BRK
2540 EQUS "(<baud>)":BRK
2550 .osc_help_text1
2560 EQUS "":BRK
2570 EQUS "":BRK
2580 \ Routines
2590 .os
2600 LDA #142:JMP OSBYTE
2610 .enter:.examine:.message
2620 JSR errors:EQUB 254:EQUS "Not yet written":BRK
2630 .list:.type:.roms:.dump:.build
2640 .exec:.fx:.key:.load:.opt:.run:.save:.spool:.tape:.rom
2650 LDY &AF:PLA:PLA:LDA #4:RTS
2660 .new_os_command:LDA (&F2),Y:CMP #13:BEQ new_os_c2
2670 CMP #ASC"#":BEQnew_os
2680 .new_os_c2
2690 JSR find_ws
2700 LDY #8:LDA (&A8),Y:BEQ new_os_cont
2710 JSR errors:EQUB 254:EQUS "NewOs already selected":BRK
2720 .new_os
2730 JSR find_ws
2740 LDY #8:LDA (&A8),Y:BEQ new_os_cont
2750 RTS
2760 .new_os_cont
2770 SEI:LDA #255:STA (&A8),Y:\ NewOS On flag at Y=8
2780 LDY #4:LDA &208:STA (&A8),Y:INY
2790 LDA &209:STA (&A8),Y:INY:\ CLIV at Y=4/5
2800 \Store old FILE_V as well
2810 LDA #12:STA &208:\LDA #18:\STA &20C
2820 LDA #21:STA &20E
2830 LDA #&FF:STA &209:STA &20F:\STA &20D
2840 LDA #&A8:LDX #0:LDY #&FF:JSR OSBYTE
2850 STX &A8:STY &A9:LDY #12:LDX &F4
2860 LDA #new_oscli AND &FF:STA (&A8),Y
2870 INY:LDA #new_oscli DIV 256:STA (&A8),Y
2880 INY:TXA:STA (&A8),Y
2890 LDY #21:LDA #new_vdu AND &FF:STA (&A8),Y
2900 INY:LDA #new_vdu DIV 256:STA (&A8),Y
2910 INY:TXA:STA (&A8),Y
2920 \ Set new osword vectors
2930 JSR collapse:LDA #0:STA &A8:TAY:INY:STA (&A8),Y
2940 CLI:CLD:RTS
2950 .new_oscli
2960 PHA:TXA:PHA:TYA:PHA:JSR new_oscli_go
2970 PLA:TAY:PLA:TAX:PLA:RTS
2980 .new_oscli_go
2990 STX &F2:STY &F3:LDY #&FF
3000 .new_oscli_loop
3010 INY:LDA (&F2),Y:CMP #ASC"*":BEQ new_oscli_loop
3020 CMP #ASC" ":BEQ new_oscli_loop
3030 CMP #13:BEQ new_oscli_ret
3040 CMP #ASC"|":BNE new_oscli1
3050 .new_oscli_ret:RTS
3060 .new_oscli_ret_check:JSR find_ws:LDY #2:LDA (&A8),Y:TAX:LDA #255:STA (&A8),Y
3070 CPX #255:BEQ new_oscli_ret:LDA #18:JSR OSWRCH:LDA #&89:JSR OSWRCH:TXA:JMP OSWRCH
3080 .new_oscli1
3090 INY:CMP #ASC":":BEQ do_old_cli:DEY:TYA:PHA
3100 JSR find_ws:LDY #2:LDA #255:STA (&A8),Y:PLA:TAY
3110 LDA #file_os AND 255:STA &A9
3120 LDA #file_os DIV 256:STA &AA
3130 JSR serv4bit:CMP #0:BEQ new_oscli_ret_check
3140 LDA #mos_os AND 255:STA &A9
3150 LDA #mos_os DIV 256:STA &AA
3160 JSR serv4bit:CMP #0:BEQ new_oscli_ret_check
3170 .do_old_cli
3180 STY &AF:JSR find_ws:LDY #4
3190 LDA (&A8),Y:STA &AC
3200 INY:LDA (&A8),Y:STA &AD
3210 LDA &AF:CLC:ADC &F2:TAX
3220 LDA #0:ADC &F3:TAY:JMP (&AC):\Jump
3230 \ Misc. routines
3240 .pr_hex
3250 PHA:LSR A:LSR A:LSR A:LSR A
3260 JSR first
3270 PLA
3280 .first
3290 AND #&0F:CMP #10
3300 BCC over
3310 ADC #6
3320 .over
3330 ADC #48:JMP OSWRCH
3340 \
3350 .pr_text
3360 STA &AE
3370 PLA:STA &AC:PLA:STA &AD:TXA:PHA:TYA:PHA
3380 LDY #0:.pr_main_loop
3390 INC &AC:BNE continue
3400 INC &AD:.continue
3410 LDA (&AC),Y
3420 BEQ end_of_string
3430 JSR OSASCI:JMP pr_main_loop
3440 .end_of_string
3450 INC &AC:BNE pr_exit_end
3460 INC &AD:.pr_exit_end
3470 PLA:TAY:PLA:TAX:LDA &AE:JMP (&AC)
3480 \
3490 .errors
3500 PLA:STA &FD:PLA:STA &FE
3510 LDY #0
3520 .error_main_loop
3530 INY:LDA (&FD),Y:STA &100,Y
3540 BNE error_main_loop
3550 STA &100:JMP &100
3560 \
3570 .check_strm
3580 TYA:PHA:JSR find_ws:PLA:TAY
3590 LDA (&F2),Y:CMP #ASC"#"
3600 BNE check_strm_ret
3610 JSR nextch
3620 PHA:JSR nextch:JSR separ
3630 BCS Bad_Command
3640 TYA:PHA:LDY #1:LDA (&A8),Y:INY:STA (&A8),Y:PLA:TAY
3650 LDA #18:JSR OSWRCH:LDA #&89:JSR OSWRCH:PLA:AND #7:JSR OSWRCH
3660 .check_strm_ret:RTS
3670 .nextch
3680 INY:LDA (&F2),Y:CMP #32:BEQ nextch
3690 RTS
3700 .separ
3710 CMP #13:BEQ separ_ret1
3720 CMP #ASC";":BEQ separ_ret
3730 CMP #ASC",":BEQ separ_ret
3740 SEC:RTS
3750 .separ_ret
3760 JSR nextch
3770 .separ_ret1
3780 CLC:RTS
3790 .Bad_Command
3800 JSR errors
3810 EQUB 254:EQUS "Bad command":BRK
3820 .Bad_Number
3830 JSR errors
3840 EQUB 252:EQUS "Bad number":BRK
3850 .find_ws
3860 PHA:LDX &F4:LDA &DF0,X:AND #127:STA &A9:LDA #0:STA &A8:PLA:LDY #0:RTS
3870 \ 1=window, 2=winpend, 4/5=OldCLI, 8=NewOS On, 16+ windows
3880 .cat
3890 JSR check_strm
3900 TYA:CLC:ADC &F2:PHP:TAX
3910 LDA #0:PLP:ADC &F3:TAY
3920 LDA #5:JMP (&21E)
3930 .help
3940 JSR check_strm
3950 JSR run_help
3960 CMP #9:BNE info_end
3970 LDA #143:LDX #9:JMP OSBYTE
3980 .info
3990 JSR check_strm
4000 LDA #ASC"I":STA &700
4010 LDA #ASC"N":STA &701
4020 LDA #ASC"F":STA &702
4030 LDA #ASC"O":STA &703
4040 LDA #ASC" ":STA &704
4050 LDX #5
4060 .infoloop
4070 LDA (&F2),Y:STA &700,X:INY:INX
4080 CMP #13:BNE infoloop
4090 LDX #0:LDY #7:LDA #3:JMP (&21E)
4100 .info_end
4110 RTS
4120 .Bad_Number2:JMP Bad_Number
4130 .rom_disable
4140 LDA &DF0,X:AND #127:STA &DF0,X
4150 JSR pr_text:EQUS "Press CTRL-BREAK":BRK
4160 .rom_dis2:JMP rom_dis2
4170 :
4180 :\ Window handler
4190 :
4200 .find_wind_addr
4210 AND #7:PHA
4220 JSR find_ws
4230 PLA:ASL A:STA &A8
4240 ASL A:ASL A:ADC &A8:ADC #&10:STA &A8:RTS
4250 .new_vdu
4260 PHA:PHP:TXA:PHA:TYA:PHA
4270 LDA &A8:PHA:LDA &A9:PHA
4280 TSX:LDA &106,X
4290 JSR new_vdu_go
4300 PLA:STA &A9:PLA:STA &A8
4310 PLA:TAY:PLA:TAX:PLP:PLA
4320 RTS
4330 .new_vdu_go
4340 JSR find_ws
4350 PHA:LDA &26A:\ Queue
4360 CMP #&FF:BEQ last_item
4370 PLA:BIT &26A:BMI old_jmp
4380 STA (&A8),Y:\ last_ch at Y=0
4390 CMP #26:BEQ do_collapse
4400 .old_jmp
4410 JMP nvwrch:\ Do this so RS232, SPOOL, etc can have a chance
4420 .last_item
4430 LDA (&A8),Y:\ last_ch at Y=0
4440 CMP #22:BEQ do_mode
4450 CMP #23:\BEQ do_char
4460 CMP #18:BEQ do_gcol_etc
4470 .do_old
4480 PLA:JMP nvwrch
4490 .do_ignore
4500 PLA
4510 .do_spool
4520 LDX #&FE:STX &26A:JSR nvwrch:INC &26A:RTS
4530 .do_mode:PLA
4540 .do_collapse
4550 JSR nvwrch
4560 .collapse
4570 LDA #7
4580 .coll_loop
4590 PHA:JSR save_window
4600 PLA:SEC:SBC #1:BPL coll_loop
4610 RTS
4620 .do_gcol_etc
4630 LDA &322:CMP #&89:BNE do_ignore:\ GCOL &89,window
4640 .do_window
4650 INY:LDA (&A8),Y:\ window at Y=1
4660 JSR save_window
4670 PLA:JSR do_spool:LDY #0:STY &A8:INY:AND #7
4680 STA (&A8),Y:\ window
4690 JSR get_window
4700 RTS
4710 .save_window
4720 JSR find_wind_addr:LDX #0
4730 .save_loop
4740 LDA &308,X:STA (&A8),Y:INY:INX:CPX #4:BCC save_loop
4750 LDA #134:JSR OSBYTE:TYA:LDY #5
4760 STA (&A8),Y:DEY:TXA:STA (&A8),Y:INY:INY
4770 LDA &357:STA (&A8),Y:INY
4780 LDA &358:STA (&A8),Y:INY
4790 LDA &D2:STA (&A8),Y:INY
4800 LDA &D3:STA (&A8),Y:RTS
4810 .get_window
4820 PHA
4830 LDA #3:LDX #&54:LDY #0:JSR OSBYTE:\ select screen only
4840 PLA:TAY:TXA:PHA:TYA:JSR find_wind_addr
4850 LDA #28:JSR nvwrch
4860 .get_w_loop
4870 LDA (&A8),Y:JSR nvwrch:INY:CPY #4:BCC get_w_loop
4880 LDA #31:JSR nvwrch
4890 LDA (&A8),Y:JSR nvwrch:INY
4900 LDA (&A8),Y:JSR nvwrch:INY
4910 LDA (&A8),Y:STA &357:INY
4920 LDA (&A8),Y:STA &358:INY
4930 LDA (&A8),Y:STA &D2:INY
4940 LDA (&A8),Y:STA &D3
4950 PLA:TAX:LDY #0:LDA #3:JMP OSBYTE:\ Restore outputs
4960 :
4970 \ Stick new editor here...
4980 :
4990 ]
5000 NEXT P
5010 PRINT" *SAVE ROM "+STR$~(mcode%)+" "+STR$~(O%+1)+" 0 FFFBBC00"