home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 3
/
FreeSoftwareCollection3pd199x-jp.img
/
oh_fm
/
townsfos
/
twfos.bas
< prev
next >
Wrap
BASIC Source File
|
1980-01-02
|
16KB
|
443 lines
1000 '****************************************************************
1001 '
1002 ' TownsFOS : The F-BASIC386 Operation System
1003 '
1004 ' By TaroPYON
1005 '
1006 ' Filename "TWFOS.BAS" : Version 1.02
1007 '
1008 ' Last Update 1989. 5.21
1009 '
1010 '
1011 ' 1000 初期設定
1012 ' 2000 SHELL & 内蔵コマンド
1013 ' 3000 システムサブルーチン : 文字列処理
1014 ' 4000 システムサブルーチン2 : 入出力処理
1015 ' 5000 システムサブルーチン3 : 環境変数
1016 ' 6000 リザーブ領域1
1017 ' 7000 リザーブ領域2
1018 ' 8000 割り込み処理 & スクリーン
1019 ' 9000 エラー処理
1099 '****************************************************************
1100 '
1101 ' システム変数の設定
1102 '
1110 S_TCOL%=7:S_BCOL%=0:GOSUB *S_SCR_INIT : GOSUB *S_OPMSG
1120 *S_RUN
1130 S_DPATH$="B:\S_DATA.DAT"
1140 S_ARMAX%=32 : DIM ARGV$(S_ARMAX%) : ARGC%=0
1150 S_Q$=CHR$(&H22)
1160 DIM S_EMSG$(127) : GOSUB *S_SET_EMSG
1170 S_GRA%=0 : S_EXE%=0
1180 S_BREAK_PFKEY%=1 : S_PAUSE_PFKEY%=2
1190 S_VMAX%=80 : DIM S_VAR$(S_VMAX%,1) : S_VUSE%=0
1200 S_STDOUT%=0 : S_STDIN%=0 : S_STDERR%=0
1400 '
1401 ' 環境変数の初期設定
1402 '
1410 ON ERROR GOTO *S_VERROR
1420 OPEN "I",#1,S_DPATH$
1430 INPUT #1,A$ : S_VUSE%=VAL(A$)
1440 FOR S_I%=0 TO S_VUSE%-1
1450 LINE INPUT #1,S_VAR$(S_I%,0) : LINE INPUT #1,S_VAR$(S_I%,1)
1460 NEXT : CLOSE
1470 GOSUB *S_VARSORT
1490 GOTO *S_SHELL
1500 '
1501 ' 環境変数保存ファイルの読み取りエラー
1502 '
1503 *S_VERROR : CLOSE
1510 S_ERR%=ERR
1520 RESTORE *S_VAR_DATA : S_A$=""
1530 *S_VERR_1
1540 READ S_A$,S_B$ : IF S_A$="*END*" THEN *S_VERR_2
1550 S_VAR$(S_VUSE%,0)=S_A$ : S_VAR$(S_VUSE%,1)=S_B$ : S_VUSE%=S_VUSE%+1
1560 GOTO *S_VERR_1
1570 *S_VERR_2 : GOSUB *S_VARSORT
1580 S_A$="* 環境変数は初期化されました。\n":GOSUB *S_PUTS_E
1590 RESUME *S_VERR_WRITE
1600 '
1601 ' 環境変数の保存
1602 '
1610 *S_VERR_WRITE
1620 GOSUB *S_SAVE_VAR
1630 IF S_ERR%<>0 THEN S_A$="@ 環境変数保存ファイルがオープンできません。\n": GOSUB *S_PUTS_E
1690 GOTO *S_SHELL
1800 '
1801 '環境変数の初期設定値
1802 '
1803 *S_VAR_DATA
1810 DATA "$BREAK","1"
1820 DATA "$PAUSE","2"
1830 DATA "$CHD","B:"
1840 DATA "$CHX","B:"
1850 DATA "$TCOL","7"
1860 DATA "$BCOL","0"
1870 DATA "$VERSION","1.02"
1880 DATA "PROMPT","TownsFOS:"
1890 DATA "*END*",""
2000 '
2001 ' SHELL
2002 '
2003 *S_SHELL
2010 ON ERROR GOTO 0
2020 GOSUB *S_PFKEY_SET
2030 S_I$="$TCOL":GOSUB *S_GETVAR:S_TCOL%=VAL(S_A$): IF S_TCOL%=0 THEN S_TCOL%=7
2040 S_I$="$BCOL":GOSUB *S_GETVAR:S_BCOL%=VAL(S_A$): IF S_TCOL%=S_BCOL% THEN S_BCOL%=0
2050 COLOR S_TCOL%,S_BCOL%:S_I$="PROMPT" : GOSUB *S_GETVAR : PRINT S_A$;
2060 GOSUB *S_GETS
2070 IF S_I$="" THEN GOTO *S_SHELL
2080 GOSUB *S_SETARG
2090 S_I$=ARGV$(0) : IF S_I$="" THEN *S_SHELL ELSE GOSUB *S_TOUPPER
2100 '
2101 ' コマンドの解析
2102 '
2110 IF S_A$="?" THEN GOSUB *S_OPMSG : PRINT "Command [CLS: [CHD: [CHX: [DIR: [EXIT: [SET: [UNSET:":GOTO *S_SHELL
2120 IF S_A$="CHD" THEN S_I$="$CHD": GOSUB *S_CHD : GOTO *S_SHELL
2130 IF S_A$="CHX" THEN S_I$="$CHX": GOSUB *S_CHD : GOTO *S_SHELL
2140 IF S_A$="CLS" THEN GOSUB *S_CLS : GOTO *S_SHELL
2150 IF S_A$="DIR" OR S_I$="FILES" THEN GOSUB *S_DIR : GOTO *S_SHELL
2160 IF S_A$="SET" THEN GOSUB *S_SET : GOTO *S_SHELL
2170 IF S_A$="UNSET" THEN GOSUB *S_UNSET : GOTO *S_SHELL
2180 IF S_A$="EXIT" THEN PRINT "Good Bye..." : DELETE 10000- : END
2300 '
2301 ' トランジェ・コマンド
2302 '
2310 S_I$="$CHX":GOSUB *S_GETVAR
2320 IF S_A%<0 THEN S_DN$="" ELSE S_DN$=S_A$
2330 S_FN$=ARGV$(0)+".BAS" : GOSUB *S_MAKFN
2340 ON ERROR GOTO *S_ERROR
2350 OPEN "I",#5,S_FLNAME$ : CLOSE #5 : 'Bug 対策用
2360 CHAIN MERGE S_FLNAME$,2403,ALL,DELETE 10000-
2400 '
2401 ' トランジェ・コマンド実行部分
2402 '
2403 *S_TRANGE
2410 GOSUB *S_PFKEY_SET
2420 S_ERR%=0 : S_EXE%=-1 : S_GRA%=0
2430 ON ERROR GOTO *S_ERROR
2440 GOSUB 10000
2450 *S_T_RETURN
2460 IF S_GRA% THEN GOSUB *S_SCR_INIT:S_GRA%=0
2470 IF S_ERR% THEN GOSUB *S_EMSG_PUT
2490 RUN *S_RUN
2500 '
2501 ' 内蔵コマンド処理
2502 '
2504 *S_CLS
2510 COLOR S_TCOL%,S_BCOL%,S_TCOL% : CLS
2590 RETURN
2600 '
2601 ' CHD & CHX
2602 '
2604 *S_CHD
2610 IF ARGC%>1 THEN *S_CHD2
2620 GOSUB *S_GETVAR:IF S_A%<0 THEN S_A$="@ ディレクトリが設定されていません。\n":GOSUB *S_PUTS_E:RETURN
2630 PRINT "=",S_A$
2640 RETURN
2650 *S_CHD2
2660 S_I2$=ARGV$(1):IF INSTR(S_I2$,":")<>2 OR LEN(S_I2$)<2 THEN S_A$="ディレクトリ設定エラー\n":GOSUB *S_PUTS_E : RETURN
2670 S_I1$=S_I$
2680 GOSUB *S_SETVAR
2690 RETURN
2700 '
2701 ' Directory
2702 '
2704 *S_DIR : S_PN$="*.*"
2710 IF ARGC%=1 THEN S_I$="$CHD":GOSUB *S_GETVAR:S_DN$=S_A$:GOTO *S_DIR2
2720 IF ARGV$(1)="-X" OR ARGV$(1)="-x" THEN S_I="$CHX":GOSUB *S_GETVAR: S_DN$=S_A$:GOTO *S_DIR2
2730 S_PN$=ARGV$(1)
2740 *S_DIR2
2750 GOSUB *S_MAKPATH
2760 ON ERROR GOTO *S_ERROR
2770 FILES S_PNAME$
2790 RETURN
2800 '
3000 '
3001 ' 大文字を小文字に変換する。in:S_I$ out:S_A$
3002 '
3004 *S_TOUPPER
3010 S_A$="" : S_L%=KLEN(S_I$) : IF S_L%=0 THEN RETURN
3020 FOR S_I%=1 TO S_L%
3030 S_C%=ASC(KMID$(S_I$,S_I%,1))
3040 IF S_C%>=ASC("a") AND S_C%<=ASC("z") THEN S_C%=S_C%-&H20
3050 S_A$=S_A$+CHR$(S_C%)
3060 NEXT
3090 RETURN
3200 '
3201 ' 文字列が数値かどうか調べる in:S_I$ out:S_A%
3202 '
3204 *S_CHKNUM
3210 S_A%=-1 : S_L%=KLEN(S_I$) : IF S_L%=0 THEN RETURN ELSE S_I%=1
3220 *S_CHKNUM1 : S_C$=KMID$(S_I$,S_I%,1) : S_I%=S_I%+1
3230 IF S_I%>S_L% THEN IF INSTR("0123456789+-.",S_C$)=0 THEN RETURN ELSE A=0:RETURN
3240 IF S_C$=" " THEN *S_CHKNUM1
3250 IF INSTR("0123456789+-.",S_C$)=0 THEN RETURN
3260 *S_CHKNUM2 : S_C$=KMID$(S_I$,S_I%,1) : S_I%=S_I%+1
3270 IF INSTR("0123456789.",S_C$)=0 THEN RETURN
3280 IF S_I%>S_L% THEN S_A%=0:RETURN ELSE GOTO *S_CHKNUM2
3300 '
3301 ' 文字列を単語に分解する。 in:S_I$ out:ARGC%,ARGV$()
3302 '
3304 *S_SETARG
3310 ARGC%=0:FOR S_I%=0 TO S_ARMAX% : ARGV$(S_I%)="" : NEXT
3320 S_L%=KLEN(S_I$) : IF S_L%=0 THEN RETURN
3330 S_I%=1 : S_A$="" : S_CM%=0
3340 *S_SETARG1
3350 S_A$=KMID$(S_I$,S_I%,1) : S_I%=S_I%+1
3360 IF S_A$=" " OR S_A$=" " THEN *S_SETARG1
3370 IF S_A$="," THEN ARGC%=ARGC%+1:S_CM%=-1:GOTO *S_SETARG1
3380 IF S_A$="" THEN IF S_CM% THEN ARGC%=ARGC%+1:RETURN ELSE RETURN
3390 *S_SETARG2
3400 IF S_A$=S_Q$ THEN *S_SETARG4
3410 ARGV$(ARGC%)=ARGV$(ARGC%)+S_A$
3420 *S_SETARG3
3430 S_B$=S_A$:S_A$=KMID$(S_I$,S_I%,1) : IF S_I%>S_L% THEN *S_SETARG5 ELSE S_I%=S_I%+1
3440 IF S_A$=" " OR S_A$=" " OR S_A$="," THEN *S_SETARG5
3450 GOTO *S_SETARG2
3460 *S_SETARG4
3470 S_A$=KMID$(S_I$,S_I%,1):S_I%=S_I%+1
3480 IF S_A$=S_Q$ THEN *S_SETARG3
3490 ARGV$(ARGC%)=ARGV$(ARGC%)+S_A$ : IF S_I%>S_L% THEN *S_SETARG5
3500 GOTO *S_SETARG4
3510 *S_SETARG5
3520 S_B$=S_A$:S_J%=S_I%:WHILE S_A$=" " OR S_A$=" ":S_A$=KMID$(S_I$,S_I%,1):S_I%=S_I%+1:WEND:IF S_A$<>"," THEN S_I%=S_I%-1
3530 IF S_I%<S_J% THEN S_I%=S_J%
3540 ARGC%=ARGC%+1 : IF S_A$<>"," THEN S_CM%=0 ELSE S_CM%=-1
3550 IF S_I%>S_L% THEN IF S_CM% THEN ARGC%=ARGC%+1:RETURN ELSE RETURN
3560 GOTO *S_SETARG1
3600 '
3601 ' ファイルネームの設定 in:S_DN$,S_FN$ out:S_FLNAME$
3602 '
3604 *S_MAKFN
3610 IF S_DN$="" THEN S_FLNAMR$=S_FN$:RETURN
3620 IF INSTR(S_FN$,":") THEN S_FLNAME$=S_FN$:RETURN
3630 IF LEFT$(S_FN$,1)="\" THEN S_FLNAME$=LEFT$(S_DN$,2)+S_FN$:RETURN
3640 IF RIGHT$(S_DN$,1)="\" THEN S_FLNAME$=S_DN$+S_FN$:RETURN
3650 IF RIGHT$(S_DN$,1)=":" THEN S_FLNAME$=S_DN$+S_FN$:RETURN
3660 S_FLNAME$=S_DN$+"\"+S_FN$
3690 RETURN
3700 '
3701 ' ディレトクリの設定 in:S_DN$,S_PN$ out:S_PNAME$
3702 '
3704 *S_MAKPATH
3710 IF RIGHT$(S_PN$,1)="\" THEN S_PN$=S_PN$+"*.*"
3720 IF INSTR(S_PN$,":") THEN S_PNAME$=S_PN$:RETURN
3730 IF LEFT$(S_PN$,1)="\" THEN S_PNAME$=LEFT$(S_CHD$,2)+S_PN$:RETURN
3740 IF RIGHT$(S_DN$,1)="\" THEN S_PNAME$=S_DN$+S_PN$:RETURN
3750 IF RIGHT$(S_DN$,1)=":" THEN S_PNAME$=S_DN$+S_PN$:RETURN
3760 S_PNAME$=S_DN$+"\"+S_PN$
3790 RETURN
4000 '
4001 ' 文字列の入力 : out:S_I$
4002 '
4004 *S_GETS
4010 S_I$="KANJI_IN" : GOSUB *S_GETVAR : IF S_A%>=0 THEN LINE INPUT S_I$:RETURN
4020 S_X%=POS(0):S_Y%=CSRLIN:S_I$="":S_P%=0
4030 *S_GET_LOOP:S_K$="":PRINT "_";:GOSUB *S_GET_BACK: WHILE S_K$="":S_K$=INKEY$:WEND: S_K%=ASC(S_K$):PRINT " ";:GOSUB *S_GET_BACK
4040 IF S_K%=13 THEN PRINT : S_A%=KLEN(S_I$):RETURN
4050 IF S_K%<>8 THEN *S_GET_2 : 'Back Spsce
4060 IF S_P%=0 THEN *S_GET_LOOP
4070 IF S_P%=1 THEN S_I$="" ELSE S_I$=LEFT$(S_I$,S_P%-1)
4080 GOSUB *S_GET_BS:GOTO *S_GET_LOOP
4090 *S_GET_2
4100 IF S_K%=3 THEN S_I$="":S_A%=-3:WHILE S_P%>0:GOSUB *S_GET_BS:WEND: PRINT "@ CANCEL" : RETURN
4110 IF S_K%<&H20 THEN GOTO *S_GET_LOOP
4120 PRINT S_K$; : S_I$=S_I$+S_K$ : S_P%=S_P%+1
4190 GOTO *S_GET_LOOP
4300 '
4304 *S_GET_BACK
4310 S_X%=POS(0):S_Y%=CSRLIN
4320 S_X%=S_X%-1:IF S_X%>=0 THEN LOCATE S_X%,S_Y%:RETURN
4330 IF S_Y%=0 THEN S_X%=0 ELSE S_X%=79
4340 S_Y%=S_Y%-1:IF S_Y%<0 THEN S_Y%=0
4350 LOCATE S_X%,S_Y%:RETURN
4360 '
4364 *S_GET_BS
4370 IF S_P%=0 THEN RETURN
4380 GOSUB *S_GET_BACK:PRINT " ";:GOSUB *S_GET_BACK:S_P%=S_P%-1
4390 RETURN
4500 '
4501 ' 文字列の出力 : in:S_A$
4502 '
4504 *S_PUTS : S_PUT_P%=S_STDOUT%
4510 *S_PUT_6: S_PUT_L%=KLEN(S_A$):S_PUT_S$="":IF S_PUT_L%=0 THEN RETURN
4520 *S_PUT_3: FOR S_PUT_I%=1 TO S_PUT_L%:S_PUT_K$=KMID$(S_A$,S_PUT_I%,1)
4530 IF S_PUT_K$="\" THEN *S_PUT_C
4540 *S_PUT_5: S_PUT_S$=S_PUT_S$+S_PUT_K$
4550 *S_PUT_4: NEXT:GOTO *S_PUT_2
4560 *S_PUT_C: S_PUT_K$=KMID$(S_A$,S_PUT_I%+1,1):S_PUT_I%=S_PUT_I%+1
4570 IF S_PUT_K$="n" THEN S_PUT_K$=CHR$(&H0A)+CHR$(&H0D):GOTO *S_PUT_5
4590 IF S_PUT_K$="\" THEN GOTO *S_PUT_5
4690 GOTO *S_PUT_4
4700 '
4704 *S_PUT_2 : ON S_PUT_P% GOTO *S_PUT_21,*S_PUT_22,*S_PUT_23,*S_PUT_24
4705 PRINT S_PUT_S$;:RETURN
4710 *S_PUT_21: PRINT #1,S_PUT_S$;:RETURN
4720 *S_PUT_22: PRINT #2,S_PUT_S$;:RETURN
4730 *S_PUT_23: PRINT #3,S_PUT_S$;:RETURN
4740 *S_PUT_24: PRINT #4,S_PUT_S$;:RETURN
4800 '
4804 *S_PUTS_E : S_PUT_P%=S_STDERR%
4810 GOTO *S_PUT_6
5000 '
5001 ' 環境変数の読み取り in:S_I$ out:S_A$,S_A%
5002 '
5004 *S_GETVAR
5010 GOSUB *S_TOUPPER : S_M$=S_A$
5020 FOR S_VAR_I%=0 TO S_VUSE%-1
5030 S_I$=S_VAR$(S_VAR_I%,0) : GOSUB *S_TOUPPER
5040 IF S_M$=S_A$ THEN S_A$=S_VAR$(S_VAR_I%,1) : S_A%=S_VAR_I% : RETURN
5050 NEXT
5060 S_A$="" : S_A%=-1
5090 RETURN
5100 '
5101 ' 環境変数の設定 in:S_I1$,S_I2$
5102 '
5104 *S_SETVAR
5110 S_I$=S_I1$:GOSUB *S_GETVAR:IF S_A%<0 THEN S_A%=S_VUSE%: S_VAR$(S_A%,0)=S_I1$:S_VUSE%=S_VUSE%+1
5120 S_VAR$(S_A%,1)=S_I2$ : GOSUB *S_VARSORT
5130 GOSUB *S_SAVE_VAR
5190 RETURN
5200 '
5201 ' 環境変数のソーティング
5202 '
5204 *S_VARSORT : KEY (S_BREAK_PFKEY%) STOP
5210 FOR S_II%=0 TO S_VUSE%-2 : FOR S_JJ%=S_II%+1 TO S_VUSE%-1
5220 S_I$=S_VAR$(S_II%,0):GOSUB *S_TOUPPER:S_II1$=S_A$
5230 S_I$=S_VAR$(S_JJ%,0):GOSUB *S_TOUPPER:S_II2$=S_A$
5240 IF S_II1$>S_II2$ THEN SWAP S_VAR$(S_II%,0),S_VAR$(S_JJ%,0): SWAP S_VAR$(S_II%,1),S_VAR$(S_JJ%,1)
5250 NEXT : NEXT
5290 RETURN
5300 '
5301 ' 環境変数の削除 in:S_I$ out:S_A%
5302 '
5304 *S_DELVAR
5310 GOSUB *S_GETVAR:IF S_A%<0 THEN RETURN
5320 KEY (S_BREAK_PFKEY%) STOP : IF S_A%=S_VUSE%-1 THEN *S_VDL2
5330 FOR S_I%=S_A% TO S_VUSE%-1
5340 S_VAR$(S_I%,0)=S_VAR$(S_I%+1,0):S_VAR$(S_I%,1)=S_VAR$(S_I%+1,1)
5350 NEXT
5360 *S_VDL2:S_VUSE%=S_VUSE%-1
5380 GOSUB *S_SAVE_VAR
5390 RETURN
5400 '
5401 ' 環境変数の保存
5402 '
5404 *S_SAVE_VAR : KEY (S_BREAK_PFKEY%) STOP : S_ERR%=0
5410 ON ERROR GOTO *S_SVERR
5420 KILL S_DPATH$ : OPEN "O",#5,S_DPATH$
5430 PRINT #5,STR$(S_VUSE%)
5440 FOR S_II%=0 TO S_VUSE%-1
5450 PRINT #5,S_VAR$(S_II%,0):PRINT #5,S_VAR$(S_II%,1)
5460 NEXT
5470 *S_SVRES
5480 CLOSE #5
5490 RETURN
5500 '
5503 *S_SVERR
5510 IF ERR=63 THEN S_ERR%=0 : RESUME NEXT : 'File Not Found
5520 S_ERR%=ERR
5530 S_A$="@ 環境変数の保存ができません。\n":GOSUB *S_PUTS_E
5540 RESUME *S_SVRES
5600 '
5601 ' 環境変数の設定 内蔵コマンド
5602 '
5604 *S_SET
5610 IF ARGC%=1 THEN *S_SET01 ELSE IF ARGC%=2 THEN *S_SET02
5620 S_I1$=ARGV$(1):S_I2$=ARGV$(2):GOSUB *S_SETVAR
5630 IF LEFT$(S_I1$,1)="$" THEN RUN *S_RUN
5640 RETURN
5650 *S_SET01 : FOR S_I%=0 TO S_VUSE%-1 : PRINT S_VAR$(S_I%,0),"= "; S_VAR$(S_I%,1) : NEXT
5660 RETURN
5670 *S_SET02 : S_I$=ARGV$(1):GOSUB *S_GETVAR : IF S_A%>=0 THEN PRINT S_VAR$(S_A%,0),"= ";S_VAR$(S_A%,1): RETURN
5680 S_A$="@ 指定の環境変数は設定されていません。\n":GOSUB *S_PUTS_E
5690 RETURN
5700 '
5701 ' 環境変数の削除 内蔵コマンド
5702 '
5704 *S_UNSET
5710 IF ARGC%=1 THEN *S_UNSET01 ELSE S_I$=ARGV$(1)
5720 *S_UNSET02
5730 IF LEFT$(S_I$,1)="$" THEN S_A$="@ システム変数は削除できません。\n": GOSUB *S_PUTS_E:RETURN
5740 GOSUB *S_DELVAR :IF S_A%<0 THEN S_A$="@ 指定の環境変数は設定されていません。\n" : GOSUB *S_PUTS_E
5750 RETURN
5760 *S_UNSET01:FOR S_I%=0 TO S_VUSE%-1:PRINT RIGHT$(" "+STR$(S_I%+1),3); " ";S_VAR$(S_I%,0) : NEXT : PRINT " ? ";
5770 GOSUB *S_GETS : IF S_I$="" THEN RETURN ELSE S_I%=VAL(S_I$)
5780 IF S_I%<=0 OR S_I%>S_VUSE% THEN RETURN
5790 S_I$=S_VAR$(S_I%-1,0) : GOTO *S_UNSET02
8000 '
8001 ' PF-KEY の設定
8002 '
8004 *S_PFKEY_SET
8010 S_I$="$BREAK":GOSUB *S_GETVAR:IF S_A%<0 THEN RETURN
8020 S_A%=VAL(S_A$):IF S_A%=0 OR S_A%>10 THEN RETURN
8030 S_BREAK_PFKEY%=S_A%
8040 S_I$="$PAUSE":GOSUB *S_GETVAR:IF S_A%<0 THEN RETURN
8050 S_A%=VAL(S_A$):IF S_A%=0 OR S_A%>10 THEN RETURN
8060 S_PAUSE_PFKEY%=S_A%
8070 ON KEY(S_BREAK_PFKEY%) GOSUB *S_BREAK: ON KEY(S_PAUSE_PFKEY%) GOSUB *S_PAUSE
8080 KEY (S_BREAK_PFKEY%) ON : KEY (S_PAUSE_PFKEY%) ON
8090 RETURN
8100 '
8101 ' BREAK KEY 処理
8102 '
8104 *S_BREAK
8110 IF S_GRA% THEN GOSUB *S_SCR_INIT
8120 PRINT : RUN *S_RUN
8200 '
8201 ' PAUSE KEY 処理
8202 '
8204 *S_PAUSE
8210 WHILE INKEY$<>"":WEND
8220 WHILE INKEY$="":WEND
8290 RETURN
8300 '
8301 ' 画面初期設定
8302 '
8304 *S_SCR_INIT
8310 COLOR S_TCOL%,S_BCOL%,7 : WIDTH 80,25
8390 RETURN
8400 '
8401 ' オープニング・メッセージ
8402 '
8404 *S_OPMSG
8410 PRINT:PRINT "***** TownsFOS Ver.1.02 : By TaroPYON *****":PRINT
8420 PRINT SPC(4);STR$(FRE(4));" Bytes Free" : PRINT
8490 RETURN
8997 '
8998 ' エラーメッセージの設定
8999 '
9000 *S_SET_EMSG
9051 S_EMSG$(51)="Bad File Mode"
9052 S_EMSG$(52)="File Alreay Open"
9053 S_EMSG$(53)="Device I/O Error"
9054 S_EMSG$(54)="Input Past End"
9055 S_EMSG$(55)="Bad File Descripter"
9056 S_EMSG$(56)="Direct Statement in File"
9057 S_EMSG$(57)="File Not Open"
9058 S_EMSG$(58)="Bad Data in File"
9059 S_EMSG$(59)="Device in Use"
9060 S_EMSG$(60)="Device Unavailable"
9061 S_EMSG$(61)="Buffer Overflow"
9062 S_EMSG$(62)="Protected Program"
9063 S_EMSG$(63)="File Not Found"
9064 S_EMSG$(64)="File Alreay Exist"
9065 S_EMSG$(65)="Directry Full"
9190 RETURN
9200 '
9201 ' エラーメッセージの出力
9202 '
9204 *S_EMSG_PUT
9210 S_A$="@ Line"+STR$(ERL)+" : "
9220 IF S_EMSG$(S_ERR%)="" THEN S_A$=S_A$+"ERROR #"+MID$(STR$(S_ERR%),2)+"\n": GOSUB *S_PUTS_E : RETURN
9230 S_A$=S_A$+S_EMSG$(S_ERR%)+"\n" : GOSUB *S_PUTS_E
9290 RETURN
9300 '
9301 ' エラートラップ処理
9302 '
9304 *S_ERROR
9310 IF S_GRA% THEN GOSUB *S_SCR_INIT : S_GRA%=0
9320 S_ERR%=ERR : GOSUB *S_EMSG_PUT
9330 RUN *S_RUN