おじさんの懐古趣味スレ
おじさんの懐古趣味スレ
とりあえず汎用的に使えそうなCのソースを書いておく
コンパイラはLSI-C86 試食版
/*-----------------------------------------------------------------------------
HI_LIB Macro module
hi_macro.h
-----------------------------------------------------------------------------*/
#ifndef HI_MACRO
#define HI_MACRO 1
/*
* user defined type
*
*/
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
/*
* bool value
*
*/
#define FALSE (0)
#define TRUE (!FALSE)
#define OFF (0)
#define ON (!OFF)
/*
* file attribute
*
*/
#define FAnormal 0X00 /* Normal file */
#define FArdonly 0x01 /* Read only file */
#define FAhidden 0x02 /* Hidden file */
#define FAsystem 0x04 /* System file */
#define FAvolid 0x08 /* Volume ID file */
#define FAdirec 0x10 /* Subdirectory */
#define FAarch 0x20 /* Archive file*/
/*
* special character
*
*/
#define NIL 0x00
#define TAB 0x09
#define ESC 0x1B
#define CR 0x0d
#define LF 0x0a
#define SPACE 0x20
#define ZEN_SPACE1 0x81 /* 全角空白 first byte */
#define ZEN_SPACE2 0x40 /* second byte */
/*
* color code for ESCape sequence control
*
*/
#define EC_NORMAL 0
#define EC_BLACK 30 /* normal color */
#define EC_RED 31
#define EC_GREEN 32
#define EC_YELLOW 33
#define EC_BLUE 34
#define EC_MAGENTA 35
#define EC_CYAN 36
#define EC_WHITE 37
#define EC_RBLACK 40 /* reverse color */
#define EC_RRED 41
#define EC_RGREEN 42
#define EC_RYELLOW 43
#define EC_RBLUE 44
#define EC_RMAGENTA 45
#define EC_RCYAN 46
#define EC_RWHITE 47
/*
* ESCape sequense text video control
*
*/
#define M_cls() printf("¥x1b[2J")
#define M_beep() printf("¥a")
#define M_color(c) printf("¥x1b[%dm",(int)(c))
#define M_locate(x,y) printf("¥x1b[%d;%dH",(int)((y)+1),(int)((x)+1))
#define M_cursor(sw) printf("¥x1b[>5%c",(sw)?'l':'h')
#define M_function(sw) printf("¥x1b[>1%c",(sw)?'l':'h')
#define M_rollup(s,e) ¥
printf("¥x1b[s¥x1b[%d;1H¥x1b[1M¥x1b[%d;1H¥x1b[1L¥x1b[u", ¥
(int)(s)+1,(int)(e)+1)
#define M_rolldown(s,e) ¥
printf("¥x1b[s¥x1b[%d;1H¥x1b[1M¥x1b[%d;1H¥x1b[1L¥x1b[u", ¥
(int)(e)+1, (int)(s)+1)
#define M_inkey() (bdos(6,0xff,0)&0xff)
/*
* character test macro
* 0:FALSE !0:TRUE
*/
#define M_isdigit(c) ((c)>='0'&&(c)<='9')
#define M_islhex(c) ((c)>='a'&&(c)<='f')
#define M_ishhex(c) ((c)>='A'&&(c)<='F')
#define M_ishex(c) (M_islhex(c)||M_ishhex(c))
#define M_isxdigit(c) (M_isdigit(c)||M_i
/*
* character test macro
* 0:FALSE !0:TRUE
*/
#define M_isdigit(c) ((c)>='0'&&(c)<='9')
#define M_islhex(c) ((c)>='a'&&(c)<='f')
#define M_ishhex(c) ((c)>='A'&&(c)<='F')
#define M_ishex(c) (M_islhex(c)||M_ishhex(c))
#define M_isxdigit(c) (M_isdigit(c)||M_ishex(c))
#define M_iskanji(c) (((c)>=0x81&&(c)<=0x9f)|| ¥
((c)>=0xe0&&(c)<=0xfc))
#define M_iskana(c) ((c)>=0xa1&&(c)<=0xdf)
#define M_isank(c) (M_iskana(c)||((c)>=0x20&&(c)<=0x7f))
#define M_islower(c) ((c)>='a'&&(c)<='z')
#define M_isupper(c) ((c)>='A'&&(c)<='Z')
#define M_isalpha(c) (M_islower(c)||M_isupper(c))
#define M_isspecial(c) (((c)>=0x21&&(c)<= 0x2f)|| ¥
((c)>=0x3a&&(c)<= 0x40)|| ¥
((c)>=0x5b&&(c)<= 0x60)|| ¥
((c)>=0x7b&&(c)<= 0x7e))
/*
* character convert macro
* c:char
*/
#define M_toupper(c) (((M_islower(c))?(c)-32:(c)))
#define M_tolower(c) (((M_isupper(c))?(c)+32:(c)))
/*
* etc
*
* DIR_CONSOLE_INPUT ..... ダイレクトコンソール入力 ( [STOP] キーで 0x03 を返す )
*/
#define GETCHLE() (bdos(0x01,0,0)&0x00ff)
#define PUTCH(dl) (bdos(0x02,(dl),0))
#define AUX_GETCH() (bdos(0x03,0,0)&0x00ff)
#define AUX_PUTCH(dl) (bdos(0x04,(dl),0))
#define PRN_PUTCH(dl) (bdos(0x05,(dl),0))
#define GETCH() (bdos(0x06,0xFF,0)&0x00ff)
#define PUTCH2(c) (bdos(0x06,(c),0))
#define GETCHLS() (bdos(0x07,0,0)&0x00ff)
#define GETCHL() (bdos(0x08,0,0)&0x00ff)
#define KBHIT() (bdos(0x0B,0,0)&0x00ff)
#define GETCHM(al) (bdos(0x0C,0,(al))&0x00ff)
#define DISK_RESET() (bdos(0x0D,0,0))
#define SELECT_DISK(dl) (bdos(0x0E,(dl),0)&0x00ff)
#define CURRENT_DISK() (bdos(0x19,0,0)&0x00ff)
#define M_hibyte(x) (BYTE)((WORD)(x)>>8)
#define M_hiword(x) (WORD)((DWORD)(x)>>16)
#define M_lobyte(x) ((WORD)(x)&0xff)
#define M_loword(x) ((DWORD)(x)&0xffffL)
#define M_clear(x) (memset(&(x),0,sizeof(x)))
#define M_ctoi(c) ((int)(M_isdigit(c)?((c)-'0'):0))
#define M_lctoi(c) ((int)(M_islhex(c)?((c)-'a'+10):0))
#define M_hctoi(c) ((int)(M_ishhex(c)?((c)-'A'+10):0))
#define M_xctoi(c) ((int)(M_ctoi(c)+M_lctoi(c)+M_hctoi(c)))
#define M_sgn(val) ((val)==0)?0:(((val)<0)?-1:1)
/*
* セグメント、オフセットから FAR ポインターを生成
* void far *MK_FP( ???? segment, ???? offset )
*/
#ifndef MK_FP
#define MK_FP(s,o) ((void far *)(((DWORD)(s)<<16)|(WORD)(o)))
#endif
/*
* FAR ポインターからセグメント、オフセットを取り出す
* unsigned short FP_SEG( ????
/*
* FAR ポインターからセグメント、オフセットを取り出す
* unsigned short FP_SEG( ???? far *p )
* unsigned short FP_OFF( ???? far *p )
*/
#ifndef FP_SEG
#define FP_SEG(p) ((WORD)((DWORD)((void far *)(p))>>16))
#endif
#ifndef FP_OFF
#define FP_OFF(p) ((WORD)(p))
#endif
/*
* PEEK POKE
* s:segment o:offset c:char or unsigned int
*/
#define M_poke(s,o,c) (*((WORD far *)MK_FP((s),(o))) = (WORD)(c))
#define M_pokeb(s,o,c) (*((BYTE far *)MK_FP((s),(o))) = (BYTE)(c))
#define M_peek(s,o) (*((WORD far *)MK_FP((s),(o))))
#define M_peekb(s,o) (*((BYTE far *)MK_FP((s),(o))))
/*
* Bit test
* b:bit(0‾?) c:char or short or long s:segment o:offset
*/
#define M_isBITon(b,c) ( ((c)&(0x01<<(b))))
#define M_isBIToff(b,c) (!((c)&(0x01<<(b))))
#define M_isBITAon(b,s,o) (M_isBITon( (b),M_peekb((s),(o))))
#define M_isBITAoff(b,s,o) (M_isBIToff((b),M_peekb((s),(o))))
/*
* Bit set
* b:bit(0‾7) s:segment o:offset
*/
#define M_setBITon(b,c) ((c) = ((c)|(0x01<<(b))))
#define M_setBIToff(b,c) ((c) = (‾(‾(c)|(0x01<<(b)))))
#define M_setBITAon(b,s,o) (M_pokeb((s),(o),M_peekb((s),(o))|(0x01<<(b))))
#define M_setBITAoff(b,s,o) (M_pokeb((s),(o),‾(‾M_peekb((s),(o))|(0x01<<(b)))))
/*
* メモリーモデル識別
* S,Tiny,Small = 0 D,Compact = 1 P,Medium = 2 L,Large,Huge = 3
*/
#define MEMORY_MODEL ( sizeof( void (*)() ) == 2 ? ¥
( sizeof( void * ) == 2 ? 0 : 1 ) : ¥
( sizeof( void * ) == 2 ? 2 : 3 ) )
/*
* C++ の new, delete もどき
*
*/
#define NEW(p) ((p) = malloc(sizeof *(p)))
#define DELETE(p) (free(p))
#define FARNEW(p) ((p) = farmalloc((unsigned long)(sizeof *(p))))
#define FARDELETE(p) (farfree(p))
#endif
/*-----------------------------------------------------------------------------
HI_LIB マクロ記述モジュール (98専用)
hi_98mac.h
-----------------------------------------------------------------------------*/
#ifndef HI_MACRO
#include "hi_macro.h"
#endif
#ifndef HI_98MAC
#define HI_98MAC 1
/*-------------------------------------
B4670, B4680 インターフェースの有無
-------------------------------------*/
#define M_isB4670() ( M_isBITon( 0, 0x0000, 0x0400 ) )
/*-------------------------------------
CPU = 80386 ?
-------------------------------------*/
#define M_is80386() ( M_isBITon( 1, 0x0000, 0x0400 ) )
/*-------------------------------------
CPU = V33A ?
-------------------------------------*/
#define M_isV33A() ( M_isBITon( 3, 0x0000, 0x0400 ) )
/*-------------------------------------
resume ON ? (HA, NV, NS/E, NC)
-------------------------------------*/
#define M_isRESUME() ( M_isBITon( 5, 0x0000, 0x0400 ) )
/*-------------------------------------
mashine = 98NOTE series ?
-------------------------------------*/
#define M_is98NOTE() ( M_isBITon( 7, 0x0000, 0x0400 ) )
/*-------------------------------------
プロテクトメモリーサイズ (128 KB単位)
RAMDISK.SYS や EMM.SYS 等の資源管理用
プロテクトメモリを使用するときは必要とする
メモリ量に相当するだけこの値をへらす。
高位のアドレスから必要量を使うことが出来る
-------------------------------------*/
#define M_protect_size1() M_peekb( 0x0000, 0x0401 )
/*-------------------------------------
BEEP の継続時間カウンタ
AH=24H, int 18H の BEEP の残り時間を
10 ミリ秒単位で格納する
-------------------------------------*/
#define M_beep_time() ( M_peek( 0x0000, 0x0448 ) )
/*-------------------------------------
BEEP 音程
AH=23H, INT 18H で設定する音程。
8253A の分周値が格納される
-------------------------------------*/
#define M_beep_tone() ( M_peek( 0x0000, 0x044a ) )
/*-------------------------------------
98NOTE 機種判別
0x00 : N, NV
0x3F : NS, NS/E, NC, NS/T FD model
0x27 : NS, NS/E 20 MB HDD model (256 bytes/sector)
0xA7 : NS, NS/E 20 MB HDD model (512 bytes/sector)
0x37 : NS, NS/E 40 MB HDD model (256 bytes/sector)
0xB7 : NS, NS/E 40 MB HDD model (512 bytes/sector)
0x2F : NS, NS/E 80 MB HDD model (256 bytes/sector)
0xAF : NS, NS/E 80 MB HDD model (512 bytes/sector)
-------------------------------------*/
#define M_NOTES() ( M_peekb( 0x0000, 0x0457 ) )
/*-------------------------------------
フロッピーディスクモーター制御
1 → 自動停止モード 0 → 常時 ON
-------------------------------------*/
#define M_FDDmotor() ( M_isBITon( 4, 0x0000, 0x0480 ) )
/*-------------------------------------
キーボード識別
0 → 旧キーボード
1 → 新キーボード (numキー有り DIP SW 2-7 ON )
2 → 新キーボード (numキーなし)
3 → 新キーボード (numキー有り DIP SW 2-7 OFF)
------------------------------------*/
#define M_KBDtype() ((( M_peekb( 0x0000, 0x0481 ) & 0x40 ) >> 5 ) | ¥
(( M_peekb( 0x0000, 0x0481 ) & 0x08 ) >> 3 ))
/*------------------------------------
SCSI ハードディスク接続状態
SCSI#n が接続されていると M_SCSIconnect(n)
が 1 となる (n: 0 ‾ 6)
------------------------------------*/
#define M_SCSIconnect(n) (M_isBITon((int)(n),0x0000,0x0482 ))
/*------------------------------------
内臓ハードディスクの種類
3 → SCSI 内蔵 ハードディスクあり
2 → SCSI 内蔵 ハードディスクあり (DA7)
1 → RL-SASI 内蔵ハードディスク有り
0 → SCSI/RL-SASI 内蔵ハードディスクなし
------------------------------------*/
#define M_innerSCSItype() ((M_peekb(0x0000,0x0484)&0x30)>>4)
/*------------------------------------
キーバッファオーバーフロー時の BEEP
1 → ON , 0 → OFF
------------------------------------*/
#define M_KBD_beep() ( M_isBITon( 5, 0x0000, 0x5000 ) )
/*------------------------------------
CPU = V series ?
1 : V30/V30HL/V50/V33/V30モード
0 : 80x86
------------------------------------*/
#define M_isVseries() ( M_isBITon( 6, 0x0000, 0x0501 ) )
/*------------------------------------
SHIFT KEY 押下状態
------------------------------------*/
#define M_isSHIFTkey() ( M_isBITAon( 0, 0x0000, 0x053a ) )
#define M_isCAPSkey() ( M_isBITAon( 1, 0x0000, 0x053a ) )
#define M_isKANAkey() ( M_isBITAon( 2, 0x0000, 0x053a ) )
#define M_isGRPHkey() ( M_isBITAon( 3, 0x0000, 0x053a ) )
#define M_isCTRLkey() ( M_isBITAon( 4, 0x0000, 0x053a ) )
/*------------------------------------
実装プロテクトメモリ容量
使用/未使用にかかわらず、実装している
プロテクトメモリの容量
------------------------------------*/
#define M_protect_size0() M_peekb( 0x0060, 0x0031 )
/*------------------------------------
漢字/グラフモード
00h → グラフ文字モード (エスケープシーケンス '^[)3' 発行時)
01h → 漢字モード (エスケープシーケンス '^[)0' 発行時)
------------------------------------*/
#define M_isVideoMode0() M_peekb( 0x0060, 0x008a )
/*------------------------------------
行折り返しフラグ
00h → 1行が80桁を越えたとき、カーソルを1行下の左端に移動
(エスケープシーケンスの '^[[?7H' で設定)
01h → 1行が80桁を越えたとき、越えた部分を表示しない
(エスケープシーケンスの '^[[?7l' で設定)
------------------------------------*/
#define M_isVideoMode1() M_peekb( 0x0060, 0x0117 )
/*------------------------------------
スクロールスピード
00h → ノーマル
01h → スロー
------------------------------------*/
#define M_isSlowScroll() M_peekb( 0x0060, 0x0118 )
#define M_setNormalScroll() (M_pokeb( 0x0060, 0x0118, 0x00 )
#define M_setSlowScroll() (M_pokeb( 0x0060, 0x0118, 0x01 )
/*------------------------------------
画面消去キャラクタ
初期状態は 20h
------------------------------------*/
#define M_getVideoClearChar() M_peekb( 0x0060, 0x0119 )
#define M_setVideoClearChar(c) M_pokeb( 0x0060, 0x0119, (unsigned char)(c))
/*------------------------------------
AH=84H,INT 1BH をサポートする新 SASI インターフェースの有無 (1:有り 0:なし)
------------------------------------*/
#define M_isSASInew() ( M_isBITon( 7, 0x0000, 0x0480 ) )
#endif
以上、LSI-C86 試食版用のマクロ定義ヘッダでした。
hi_macro.h ・・・LSI-C86試食版で汎用的に使えるマクロ
hi_98mac.h ・・・PC-98にゴリゴリ依存したマクロ
もういっちょ
テキスト VRAM 制御関数
tvram.h
tvramc
面倒くさいことに挑むね
実機もお待ちか
おお、こんなスレにも書き込みがw
実機ははるか昔に廃棄処分したなー
最近PC-98エミュレータの存在を知って、98用のMS-DOSとBIOSファイルも手に入ったので
昔持ってたPC-98の環境を再現してみてたんだけど、いじってると若い頃の感覚が戻って面白いのよね。
これ作ってる時はあんな事があったな、なんて唐突に思い出したり。
昔持ってた98のHDD内容をずっと保存してたんだけど、消さなくてよかった。
LSI-C86 3.30試食版とMS QuickBASIC 4.5とN88BASIC 6.1を超久しぶりに動かしたよ。
そういえばFDの作者の出射さんもLSI-Cの作者の森さんももう亡くなってるんだよなぁ。
時の流れを感じるわ。
3つのPC-98エミュレータを試した。
np2.exe ねこープロジェクト2
CPUは80286相当
MS-DOS3.30 動作OK
MS-DOS6.20 動作NG (DOS3.30しか使えないので、仮想HDDは128MBまで。HIMEM.SYSも使えない)
N88BASIC (6.1)正常動作
Cのコンパイルスピードは遅い
テキストVRAM 正常
グラフィックVRAM 正常
他のエミュレータに比べれば速度は遅いがちょうど実機のPC-9801とほぼ同じ速度で動くのでかなりリアル。
next.exe T98-next
実機のBIOS-ROMイメージファイルが必要
486DXか486SXを選ぶ、クロックはプリダウンメニューから設定できるが、まともに動くのは4MHzのみ。
MS-DOS6.20 動作OK
MS-DOS3.30 動作OK
N88BASIC(6.1)正常動作
Cのコンパイルスピード、中
テキストVRAM 正常
グラフィックVRAM 異常(輝度プレーンがないようで、明暗がつけられない)
anex86.exe Anex86
PC-98xxではなくエプソン互換機のエミュレータなので、ソフトのエプソンチェックを外す必要がある。
キーボード入力が変な時がある(CAPS LOCKがたまに出来ない)
実機のフォントデータ(font.bmp)が必要。
CPUは選択肢なし
MS-DOS6.20 動作OK
MS-DOS3.30 動作OK
N88BASIC(6.1)正常NG (エプソンチェックを外しても動作せず)
Cのコンパイルスピード、速い
テキストVRAM 正常
グラフィックVRAM 異常(輝度プレーンがないようで、明暗がつけられない)
それぞれ一長一短があり甲乙つけがたいが、一つだけ選ぶとすればnp2.exeかな。
PC-98xxを最も正確にエミュレートできている。
復活して幸せなHDDだろね
よくあんなの保管できた
任意のシステムフォントからfont.bmpを作成できるプログラムあった気がする
なので実機はなくても良し
PC-98で使ってたHDDをそのまま残してたわけじゃなくて、中のファイルをごっそりバックアップしたのを代々HDDに継続コピーしてたのよ。
流石に実機で使ってたSASIや98SCSIのHDDが今あったってデータは取り出せそうもないわw
98を初めて手に入れた時は貧乏学生で、バイトしまくってPC-9801RX2をやっと買ったんだよね。
モニタと色々小物を揃えて40万くらいしたようなw
その後就職して40MBのSCSI-HDDを8万くらい出して買って、コンパイラもボチボチ揃えてって頃で、プログラミングが楽しかったあの頃の思い出が一杯詰まっているHDD内容を消すのが忍びなくてね。
ずっとHDDにコピーしては保存してた。
それを今回エミュレータにぶっこんだわけ。
惜しむらくは開発環境以外のアプリケーションソフトを取ってなかったことかな。
一太郎Ver.3とかVJE-penとかマルチプランとか、その辺のソフトが今あればなぁ・・
DOS標準の日本語FEPがバカ過ぎるのに驚愕したけど、WX2が深いディレクトリから見つかったのでそれに置き換えた。
これ当時としてはすごいわ。
今のWindows標準の漢字変換より確実に賢くてびっくり。
フォントデータは解決したよ。
np2.exeのフォルダにあったfont.tmpをfont.bmpにリネームしたらそのまま使えた。
ついでに当時作った小物プログラム
何かのソフトを動かしてグラフィック表示が残ったままになった場合に消去するやつ。
LSI-C86試食版でコンパイルしたらちゃんと動いた
/*-------------------
gvram クリア
-------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <dos.h>
#ifdef LSI_C
#include <machine.h>
#define outportb( p, v ) outp( p, v )
#endif
/*
GVRAM アドレス
*/
#define PLANE1 ((unsigned char far *)0xa8000000L) /* 青プレーン */
#define PLANE2 ((unsigned char far *)0xb0000000L) /* 赤プレーン */
#define PLANE3 ((unsigned char far *)0xb8000000L) /* 緑プレーン */
#define PLANE4 ((unsigned char far *)0xe0000000L) /* 輝度プレーン */
union REGS regs; /* 8086レジスタ */
/*----------------------------------
グラフィックバンク選択
----------------------------------*/
void bank( int bank )
{
if ( bank == 0 ) {
regs.h.ch = 0xc0;
} else if (bank == 1) {
regs.h.ch = 0xd0;
}
regs.h.ah = 0x42;
int86( 0x18, ®s, ®s );
}
/*----------------------------------
GVRAM クリア
----------------------------------*/
void cls( void )
{
register int i;
for ( i = 0; i < 32000; i++ ) {
*( PLANE1 + i ) = 0x00;
*( PLANE2 + i ) = 0x00;
*( PLANE3 + i ) = 0x00;
*( PLANE4 + i ) = 0x00;
}
}
/*----------------------------------
グラフィック表示 OFF
----------------------------------*/
void groff( void )
{
regs.h.ah = 0x41;
int86( 0x18, ®s, ®s );
}
/*----------------------------------
メイン
----------------------------------*/
void main( void )
{
groff();
bank( 1 );
cls();
bank( 0 );
cls();
}
Annex86
CPUの設定をいじくると激しく動作がおかしくなるみたい。
ざっと試してみた所、まともに動くのは4MHz設定までで、それ以上のクロック数にするとハングアップに近いような動きになってしまう。
これはもうパスだな。
T98-Next
これはAnnex86に比べるとだいぶマシなんだけど、VZエディタの動きがちょっとおかしいのとGVRAMの輝度プレーンがないのが痛い。
VZエディタでおかしいところとは、カーソルを高速ブリンクの設定にしていても普通の速度のブリンクのまま、という点。
これは同じ+.nhdをneko-proj2で起動してみるとちゃんと高速ブリンクになってるので、T98-Nextのバグだろう。
T98-Nextは折角DOS6.20が使えるのにここだけが惜しい。
(neko-prj2はCPUが80286しか選択できないのでDOSは3.30まで)
Neko-prj2
かなりの完成度で、実機を触っているのに等しい感覚で使えるんだけど、CPUが80286しか選択できないのがちょっと残念。
286系列のCPUだとMS-DOS6.20をインストールすることができず、3.30Dが使用できる最新バージョンになる。
DOS3.30だと、HDDが128GBまでというキツイ制限があって、環境変数エリアも小さいのでバッチファイルでの凝った設定が何一つできないw
でも一番忠実に実機をエミュレートできているので現在はこれを使用している。
上記補足
MS-DOS3.30の環境変数エリアはconfig.sysで拡張可能なのを忘れてた。
config.sysに
shell=a:\command.com a:\ /E:1024 /P
と書けば環境変数エリアが 1024 バイトに拡張される
これで環境変数自体はいくつも設定できるようになったんだけど
個々の環境変数そのものに容量制限があるのか、pathが長くなると設定できないみたい。
autoexec.bat中に
path=a:\dos
path=%path%;a:\language\msc60
path=%path%;a:\language\turbocpp
path=%path%;a:\language\optasm
path=%path%;a:\language\masm
これくらい連続して追加すると path が空になってしまう。
苦肉の策として subst コマンドで個々の実行パスにドライブ名を割り当てて、pathにはそのドライブ名を指定するようにした。
a:\dos\subst v: a:\dos
a:\dos\subst w: a:\language\msc60
a:\dos\subst x: a:\language\turbocpp
a:\dos\subst y: a:\language\optasm
a:\dos\subst z: a:\language\masm
path v:;w:;x:;y:;z:
といった具合。
ドライブレターの後ろの方まで使うので、config.sysには
LASTDRIVE=Z
の行が必要。
MS-DOS3.30までしか使えないnp2.exeだけど、np21.exeであればMS-DOS6.20がインストールできるみたい。
試してみた結果、インストールはうまくいったのだけど、ハマった点を書き置き。
np21.exeのCPUクロックを4倍以上に上げるとエディタのスクロールがカクついて見にくかったんだけど、これは設定で直った。
np21.exeのメニューバー項目 Screen の中の nowait にチェックを入れると(デフォルトではチェックなし)カクつかなくなった。
np21.exeのおかしな点を一個見つけた。
VZエディタのカーソル点滅速度を二倍速にしているのだけど、np2.exeでは正常に2倍速で点滅するけどnp21.exeでは2倍速にならず通常の点滅速度のままだ。
やっぱ中身は少し違うんだろうなあ。
np21のおかしな点追加
vzエディタ付属のezkeyを常駐させてるとshiftキーを押すとF11からF20の内容が画面下部に表示されるはずだが、shiftキーを押してもF16からF20の内容が表示されない。
shiftキーを押すと画面上のF11からF15までが空白になり、本来F11からF15に表示されるべき内容がF16からF20に表示される。
VZのデフォルトでは[shift]+[F10]はタグジャンプだが、表示内容が右に5個ズレているため「複写」と表示される。
実際に[shift]+[F10]を押すと本来の機能(タグジャンプ)が働く。
これもnp2.exeでは出ない現象なのでnp21.exeのバグ?
環境変数のエリアは拡張できるけど、一個の環境変数のエリアは128バイトまでなんだな。
一太郎ver.5をインストールしてみたが、HDD容量を30MBほど使っててワロタ。
あの当時は100MBとか240MBくらいのHDDが普通だったのに、これはアカンやろ。
メモリの使い方もエグい。
DOS標準のメモリ管理ドライバ(emm.sys)とか使ってると一太郎で警告が出て、ろくに動かない。
結局I-O DATAのVMM386に切り替えた。
結局40MBのHDDファイルを作って、そこにDOSと一太郎をインストールして動かしてみたけど、当然のことながらプリンタが使えないので無意味だった。
同梱されていた一太郎DASHは制限がゆるく、そこそこ動いた。
たかがワープロソフトがリリソース食い過ぎw
ただ、漢字変換の精度は素晴らしいね。
この変換精度でいろんな環境にFEPだけインストールできればいいんだけど、ATOK8は環境を選びすぎで普通の環境にはインストールできない。
ATOK6くらいいろんな環境にインストールできればまた潮目は変わっただろうにな。
これもワンマン社長が一人で会社を牛耳っていた弊害か。
np21系列はダメだな
np2でdos3.3を使うか
NP21はVzでカーソルブリンク速度を変えても期待通りに動作しない。
VZエディタかぁ
間接的に大変お世話になった
xnp2しか使ったことないので他のエミュレータの比較はありがたいな
普通にMS-DOS 6.2が使えると思ったけど違うのか
https://i.imgur.com/9S8O7IA.png
MS-DOS 用の 16 ビットコードを生成できて今もメンテナンスが続いている開発環境として Open Watcom を推す。
http://www.openwatcom.org/
LSI C-86 試食版は C99 をサポートしてないからしんどいわ。
最新の仕様に追従して欲しいとまでは言わんけど、 C89 と C99 の差って結構大きくない?
LSI-CのPC-98用ライブラリのFLAVORをHDDから発掘した
いやー探してたんだよこれ
ついでにTurboPASCAL ver.3もめっけ
確かパソコン通信ホストプログラムのBIG-MODELがTurboPASCAL Ver.3で書かれてたんだよな
>>28
それnp2.exeなら何か裏技使ってるよ
もしくは起動ドライブとは別のドライブの内容を表示させてる
>>29
昔の人間なんでC89の方が慣れてるんだよなw
それにC89の方がコンパイラも言語仕様も単純だし
リンクThx
久しぶりに組み込みの仕事が舞い込んできた
CPUがマイナーなのか変なCコンパイラでの開発なんだと
>>29>>32
ffmpegの中の人(OTCCやTCCコンパイラを自作したっていう原作者とは別)がC99移行するときに作ったc99-to-c89 が使えないかな?
msvcターゲットの変換ツールみたいだけども
http://hhsprings.pinoko.jp/site-hhs/2017/07/ffmpeg%E3%80%8C%E9%96%8B%E7%99%BA%E3%80%8D%E3%81%8B%E3%82%89%E4%B8%89%E3%83%8D%E3%82%BFmsinttypes-%E3%81%A8-c99wrap%E3%80%81makedef/
>>34
こんなのがあるのか
一度使ってみるよ
と思ったら、MSVC専用か・・・
C89はCの規格で要するにANSI CなんだからそのソースにMSVC専用も何もないと思うなあ
-keepで変換されたソースが残るみたいだからとりあえずこれを他のコンパイラにもっていくか、
リンク先では保守したくないと言われてリンクされてるがラッパー部分を作りなおして他のコンパイラ対応にするか
https://blog.canele.dev/2014/01/09/clang34-visualstudio/
こういうcl互換のコンパイラドライバをリネームして誤魔化す手もある気がするね
Cの規格は同じでも規格外のライブラリ関数が違ってたりするのでコンパイラ間の互換性はないだろう
そりゃそうだろ
そもそもコード書かずにコンパイルできるんならCの規格なんてなんでもいいというか、未知の言語でも同じだ
しかしホント互換ライブラリやら共通ライブラリやらラッパー類って見当たらんよね
>>17をちょっと弄れば移植できたりするのとかもありそうな気もするんだけど
■ ゲーム開発講座 -RPGをつくろう-
http://web.archive.org/web/20010629021842/http://www3.yomogi.or.jp/hobby/Seminar/__Seminar_main.html
未完ながら主人公が動かせる所までの解説は有り、使用コンパイラはTurbo C++ Ver1.0
自作ライブラリを移植するのが面倒だったから最新版に乗り換えなかったとあるけど、同じコンパイラでもそんなことあるんだな
TurboPascal V3の本を捨てられたのが痛い。
俺が退職する時に有給消化している間に捨てやがった宮崎死ね。
宮崎の母ちゃんでべそだからな
今は無料なんだっけ?
ツイてない人生だったな
NP21/W を動かしてたんだが、DOS6.2+VEM486だとDBASE4がハングアップして動かん
IO-DATAのIOSだと動いた
やっぱフリーウェアは色々あるなあ
>>46
https://j02.nobody.jp/jto98/n_desk_mem/vem486.htm
CPUの問題ということはないか?実機でもバージョンによっては元々動かないみたいだぞ
「女の価値計算機」を作ってみようと思う
男が考える自分にとっていい女とは
若い
美人
スタイルがいい
性格がいい
優しい
常識がある
エロい
親離れしている
ある程度頭がいい
男性経験が少ない
バツがない
できれば処女
実家がマトモ
親類に犯罪者がいない
親類に精神病がいない
親がまとも
実家が裕福
金持ちに越したことはない
ちゃんと仕事する
社会に出て社会性を身に着けている
料理ができる
これらのファクターの重要度を数値化して女の価値を点数化する