PC-9801エミュレータ(T98-Next)でMS-DOSプログラミング ID:MAOnCu96

1名無しさん@Next2ch:2021/08/04(水) 16:28:45.21 ID:MAOnCu96

おじさんの懐古趣味スレ

2名無しさん@Next2ch:2021/08/04(水) 16:56:24.58 ID:MAOnCu96

とりあえず汎用的に使えそうなCのソースを書いておく
コンパイラはLSI-C86 試食版

3名無しさん@Next2ch:2021/08/04(水) 16:58:37.12 ID:MAOnCu96

/*-----------------------------------------------------------------------------
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

4名無しさん@Next2ch:2021/08/04(水) 17:01:46.05 ID:MAOnCu96


/*
* 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( ????

5名無しさん@Next2ch:2021/08/04(水) 17:02:52.42 ID:MAOnCu96

/*
* 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


6名無しさん@Next2ch:2021/08/04(水) 17:09:01.47 ID:MAOnCu96

/*-----------------------------------------------------------------------------
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 )

7名無しさん@Next2ch:2021/08/04(水) 17:10:09.06 ID:MAOnCu96

/*-------------------------------------
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)

8名無しさん@Next2ch:2021/08/04(水) 17:11:42.67 ID:MAOnCu96

/*------------------------------------
キーバッファオーバーフロー時の 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

9名無しさん@Next2ch:2021/08/04(水) 17:16:58.56 ID:MAOnCu96

以上、LSI-C86 試食版用のマクロ定義ヘッダでした。

hi_macro.h ・・・LSI-C86試食版で汎用的に使えるマクロ
hi_98mac.h ・・・PC-98にゴリゴリ依存したマクロ

10名無しさん@Next2ch:2021/08/04(水) 17:23:34.95 ID:MAOnCu96

もういっちょ
テキスト VRAM 制御関数

tvram.h
tvramc


このIDをNGリストに追加する

今後このIDの書き込みやスレッドを表示したくない場合、以下のボタンをクリックしてください。
NGリストに追加

レスを書き込む