#! /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
#! /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
$ 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
$ tar cvf - . | wrd /m2
$ rrd /m2 | tar tf -
$ dd bs=256 skip=10 if=scsimo_superfd.MOS of=scsimo_superfd.tar $ tar xvf scsimo_superfd.tar