- OS-9/X68000って知ってますか?。
その昔モトローラ社のMPU 6809(8bit !!)用にマイクロウェア社が開発
したオペレーティングシステム(OS-9/6809)を源流としてMPU 68000シリーズ用
に発表された OS-9/68000(OSKと呼ぶ場合も有る)をSHARP X68000シリーズに対
応させた物で、TSSを基本としたマルチユーザ&マルチタスクを可能とする、
現在の基準に当てはめても遜色の無い先進のオペレーティングシステムでした。
-
OS-9(6809/68000),OS-9000関係のftp site
- 私の作ったふりーうぇあ(^^;。
- OS-9/X68000 物理フロッピーからベタイメージの吸出しスクリプト(Linux)
getxos9fdimg.sh
#! /bin/sh
#
# OS-9/X68000 BOOT DISK
# セクタ長 セクタ/トラック ヘッド数 シリンダ数
# 256バイト 26 2 77 (No.0: IPL, No.1 to 76: DATA)
#
# OS-9/X68000 DATA DISK
# セクタ長 セクタ/トラック ヘッド数 シリンダ数
# 不定(未使用)------------- 2 1 (No.0)
# 256バイト 26 2 76 (No.1 to 76: DATA)
#
ipl="n"
drive="1"
output="fd.img"
while [ "$#" != "0" ]
do
case $1 in
-h|--help )
echo "Usage: $0 [options] output"
echo "get image file from OS-9/X68000 floppy."
echo ""
echo " -h|--help show help"
echo " -b|--boot get bootable disk"
echo " -d|--drive DRIVE default 1(/dev/fd1)"
echo " output default fd.img(1,025,024 bytes = 77cyl * 2head * 26secs * 256bytes)"
echo ""
exit 0
;;
-b|--boot )
ipl="y"
;;
-d|--drive )
shift
drive="$1"
;;
*)
output="$1"
;;
esac
shift
done
total_cyl=77
total_head=2
gpl=27
dtl=255
secsz=1 # 128*2^secsz = 256
spt=26
cp /dev/null ${output}
floppycontrol -d /dev/fd${drive} --resetnow 2
floppycontrol -d /dev/fd${drive} --reset 2
cyl=0
head=0
sec=1
drvsel=`echo "${head} * 4 + ${drive}" | bc`
length=`echo "${spt} * 128 * 2^${secsz}" | bc`
while [ ${cyl} -lt ${total_cyl} ]
do
fdrawcmd drive=/dev/fd${drive} \
rate=0 \
seek ${drvsel} ${cyl}
while [ ${head} -lt ${total_head} ]
do
echo "cyl=${cyl} head=${head} sec=${sec} drvsel=${drvsel} length=${length}"
if [ ${cyl} -eq 0 ]
then
if [ ${ipl} = "y" ]
then
fdrawcmd drive=/dev/fd${drive} \
rate=0 \
length=${length} \
cylinder=${cyl} \
read ${drvsel} ${cyl} ${head} ${sec} ${secsz} ${spt} ${gpl} ${dtl} >>${output}
else
dd bs=${length} count=1 if=/dev/zero >>${output}
fi
else
fdrawcmd drive=/dev/fd${drive} \
rate=0 \
length=${length} \
cylinder=${cyl} \
read ${drvsel} ${cyl} ${head} ${sec} ${secsz} ${spt} ${gpl} ${dtl} >>${output}
fi
head=`expr ${head} + 1`
drvsel=`echo "${head} * 4 + ${drive}" | bc`
done
head=0
drvsel=`echo "${head} * 4 + ${drive}" | bc`
cyl=`expr ${cyl} + 1`
done
- OS-9/X68000 物理フロッピーのベタイメージからD88ファイルに変換するスクリプト(Linux)
makexos9d88.sh
#! /bin/sh
#
# D88 format
#
# ディスクイメージ
# +---------------------+
# | ヘッダ部 | サイズ 0x2b0 バイト
# +---------------------+
# |トラック部 (0 Track) | サイズ 不定
# +---------------------+
# |トラック部 (1 Track) | サイズ 不定
# +---------------------+
# | ・ | ・
# | ・ | ・
# | ・ | ・
# +---------------------+ トラック部の数は不定
#
# ヘッダ部分の詳細
# offset サイズ
# 0x00 17 ディスクの名前(ASCII + '\0')
# 0x11 9 リザーブ ( 0x00 )
# 0x1a 1 ライトプロテクト 0x00 なし、0x10 あり
# 0x1b 1 ディスクの種類 0x00 2D、 0x10 2DD、 0x20 2HD
# 0x1c 4 ディスクのサイズ
# 0x20 4*164 トラック部のオフセットテーブル 0 Track 〜 163 Track
#
# トラック部の詳細
# トラック部は、セクタ部を必要数連結したもの
#
# セクタ部の詳細
# offset サイズ
# 0x00 1 ID の C
# 0x01 1 ID の H
# 0x02 1 ID の R
# 0x03 1 ID の N
# 0x04 2 このトラック内に存在するセクタの数
# 0x06 1 記録密度 0x00 倍密度、0x40 単密度、0x01 高密度
# 0x07 1 DELETED MARK 0x00 ノーマル、0x10 DELETED
# 0x08 1 ステータス
# 0x09 5 リザーブ
# 0x0e 2 このセクタ部のデータサイズ
# 0x10 不定 データ (サイズは、0x0e に格納しているバイト数)
#
ipl="n"
input=""
output=""
while [ "$#" != "0" ]
do
case $1 in
-h|--help )
echo "Usage: $0 [options] input output"
echo "convert floppy image file to d88 format file."
echo ""
echo " -h|--help show help"
echo " -b|--boot convert bootable disk"
echo " input default fd.img"
echo " output default fd.d88"
echo ""
exit 0
;;
-b|--boot )
ipl="y"
;;
*)
if [ "X${input}" = "X" ]
then
input="$1"
elif [ "X${output}" = "X" ]
then
output="$1"
else
echo "Unknown option: $1"
exit 1
fi
;;
esac
shift
done
if [ "X${input}" = "X" ]
then
input="fd.img"
fi
if [ "X${output}" = "X" ]
then
input="fd.d88"
fi
headsz=`echo "17+9+1+1+4+4*164"|bc`
sectsz=`echo "1+1+1+1+2+1+1+1+5+2+256"|bc`
spt=26
total_cylinder=77
total_over_cylinder=82
total_head=2
#--------------------
# Header
#--------------------
# Disk name
echo -n "Default" >${output}
echo -n -e "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" >>${output}
# Reserve area
echo -n -e "\x00\x00\x00\x00\x00\x00\x00\x00\x00" >>${output}
# Write protect off
echo -n -e "\x00" >>${output}
# Disk type 2HD
echo -n -e "\x20" >>${output}
# Disk size
disksize=`echo "${headsz}+${sectsz}*${spt}*${total_cylinder}*${total_head}" | bc`
disksize_hex=`printf "%08x" ${disksize}|sed -e 's/^\(..\)\(..\)\(..\)\(..\)$/\\\\x\4\\\\x\3\\\\x\2\\\\x\1/'`
echo -n -e ${disksize_hex} >>${output}
# Offset for each sector part
offset=${headsz}
c=0
while [ ${c} -lt ${total_cylinder} ]
do
offset_hex=`printf "%08x" ${offset}|sed -e 's/^\(..\)\(..\)\(..\)\(..\)$/\\\\x\4\\\\x\3\\\\x\2\\\\x\1/'`
echo -n -e ${offset_hex} >>${output}
offset=`echo "${offset}+${sectsz}*${spt}" | bc`
offset_hex=`printf "%08x" ${offset}|sed -e 's/^\(..\)\(..\)\(..\)\(..\)$/\\\\x\4\\\\x\3\\\\x\2\\\\x\1/'`
echo -n -e ${offset_hex} >>${output}
c=`expr ${c} + 1`
offset=`echo "${offset}+${sectsz}*${spt}" | bc`
done
# Offset for filler secter part
while [ ${c} -lt ${total_over_cylinder} ]
do
offset=0
offset_hex=`printf "%08x" ${offset}|sed -e 's/^\(..\)\(..\)\(..\)\(..\)$/\\\\x\4\\\\x\3\\\\x\2\\\\x\1/'`
echo -n -e ${offset_hex} >>${output}
offset=0
offset_hex=`printf "%08x" ${offset}|sed -e 's/^\(..\)\(..\)\(..\)\(..\)$/\\\\x\4\\\\x\3\\\\x\2\\\\x\1/'`
echo -n -e ${offset_hex} >>${output}
c=`expr ${c} + 1`
done
#--------------------
# Tracks
#--------------------
n=1
# den=1 # なぜか高密度(2HD)ではseek errorで読めないD88ファイルになってしまう...
den=0
sts=0
rsv=0
secsz=`echo "128*2^${n}"|bc`
c=0
while [ ${c} -lt ${total_cylinder} ]
do
h=0
while [ ${h} -lt ${total_head} ]
do
r=1
while [ ${r} -le ${spt} ]
do
#--------------------
# Sectors
#--------------------
# Cylinder
c_hex=`printf "%02x" ${c}|sed -e 's/^\(..\)$/\\\\x\1/'`
echo -n -e ${c_hex} >>${output}
# Head
h_hex=`printf "%02x" ${h}|sed -e 's/^\(..\)$/\\\\x\1/'`
echo -n -e ${h_hex} >>${output}
# Sector
r_hex=`printf "%02x" ${r}|sed -e 's/^\(..\)$/\\\\x\1/'`
echo -n -e ${r_hex} >>${output}
# Sector size(128*2^${n})
n_hex=`printf "%02x" ${n}|sed -e 's/^\(..\)$/\\\\x\1/'`
echo -n -e ${n_hex} >>${output}
# Sector/track
spt_hex=`printf "%04x" ${spt}|sed -e 's/^\(..\)\(..\)$/\\\\x\2\\\\x\1/'`
echo -n -e ${spt_hex} >>${output}
# Dencity(2DD)
den_hex=`printf "%02x" ${den}|sed -e 's/^\(..\)$/\\\\x\1/'`
echo -n -e ${den_hex} >>${output}
# Delete mark
if [ ${c} -eq 0 ]
then
if [ ${ipl} = y ]
then
dm=0
else
dm=1
fi
else
dm=0
fi
dm_hex=`printf "%02x" ${dm}|sed -e 's/^\(..\)$/\\\\x\1/'`
echo -n -e ${dm_hex} >>${output}
# Status
sts_hex=`printf "%02x" ${sts}|sed -e 's/^\(..\)$/\\\\x\1/'`
echo -n -e ${sts_hex} >>${output}
# Reserve
rsv_hex=`printf "%010x" ${rsv}|sed -e 's/^\(..\)\(..\)\(..\)\(..\)\(..\)$/\\\\x\5\\\\x\4\\\\x\3\\\\x\2\\\\x\1/'`
echo -n -e ${rsv_hex} >>${output}
# Sector size
secsz_hex=`printf "%04x" ${secsz}|sed -e 's/^\(..\)\(..\)$/\\\\x\2\\\\x\1/'`
echo -n -e ${secsz_hex} >>${output}
# Sector data
skip=`echo "${c}*${total_head}*${spt} + ${h}*${spt} + ${r} - 1"|bc`
dd bs=${secsz} skip=${skip} count=1 if=${input} of=${input}.tmp
cat ${input}.tmp >>${output}
echo ${c}_${h}_${r}
r=`expr ${r} + 1`
done
h=`expr ${h} + 1`
done
c=`expr ${c} + 1`
done
rm ${input}.tmp
- XM6 TypeGから(仮想)MOを利用する方法
エミュレータの操作
- ツール
- SCSI MOディスクイメージの作成
- ファイル名 scsimo_superfd 保存
- ディスク容量 128MB
- 論理フォーマット IBMフォーマット(スーパーフロッピー形式)
- MO 開く
OS-9/X68000の操作
$ chd cmds/bootobjs
$ fdisk
(1)SCSI(内蔵) (2)SCSI(ボード) (3)ハードディスク
>ハードディスク・タイプを選択して下さい (1-3,?,q): 2
(1)レベル2 (2)レベル4
>割り込みレベルを選択して下さい (1-2,?,q): 1
>ターゲットのSCSI IDを選択して下さい (0-7,?): 2
パーティションが初期化されていません!
パーティションを使用する場合は、初めにHuman68kでフォーマットして下さい。
OS-9だけで使用するには、デバイス全体用のディスクリプタが必要です。
ディスクリプタを作成しますか (Y/N)? Y
>モジュール名を入力して下さい (最大 15文字) [h0]: m2
>格納ディレクトリを入力して下さい (最大256文字) []:
フォーマット可能 : m2fmt (file=m2fmt_all)
フォーマット不可 : m2 (file=m2_all)
デフォルト・デバイス用 (file=dd.m2_all)
よろしいですか (Y/N)? Y
$ load -d m2fmt_all
$ iniz m2fmt
$ format /m2fmt
ディスク フォーマット
OS-9/68K V2.4 SHARP X68000 - 68000
----------------------------------
固定値:
ディスク・タイプ: ハード(ディスク着脱式)
セクタ・サイズ: 256
ディスク容量: 248822 セクタ
(127396864 バイト)
セクタ・オフセット: 0
トラック・オフセット: 0
LSN オフセット: $000004
アロケーション最小セクタ: 8
可変値:
セクタ・インタリーブ: 1
フォーマット・デバイス: /m2fmt
よろしいですか? Y
ハード・ディスクです。よろしいですか? Y
物理フォーマットしますか? Y
物理ベリファイしますか? N
ボリューム名:
ビットマップ作成中
ルートディレクトリを作成中
$ load -d m2_all
$ iniz m2
- MOにtarで書き込む方法
$ tar cvf - . | wrd /m2
- MOからtarで読み込む方法
$ rrd /m2 | tar tf -
- 上記の方法で書き込んだMOをLinux等のtarで読む方法
$ dd bs=256 skip=10 if=scsimo_superfd.MOS of=scsimo_superfd.tar
$ tar xvf scsimo_superfd.tar