10 ';**************************** BB.REX Ver0.11B **********************
20 ';***  各プロシジャJMPル−チン ***
30 '                                                   ;CALL番地
40 ' jmp p_no0  ;機械語プロシジャNo.0へ [拡張PEEK]        &H00
50 ' jmp p_no1  ;機械語プロシジャNo.1へ [拡張POKE]        &H05
60 ' jmp p_no2  ;機械語プロシジャNo.2へ [各BIOSコ−ル+α] &H0A
70 '
80 ';***  機械語プロシジャNo.0 ***
90 ';DUM&=CALLM (&H00,SRC&,ADR&,?,??)
100 ';指定アドレスを､指定単位 "?"(1,2,4byt)で読む
110 ';読んだDATAを並べ替えるかどうか指定する("??"=1で並び替え)
120 '
130 'p_no0:
140 '
150 ';equの後ろは､十進数
160 '
170 ' src   equ 4   ;スタックに積まれた数値(espからのオフセット値)
180 ' adr   equ 8   ;                〃
190 ' byt   equ 12  ;                〃
200 ' trn   equ 16  ;                〃
210 '
220 '  mov  ebp , esp        ;esp(オフセット 0)を､ebp へ
230 '
240 ';読み取りバイト数のチェック
250 '
260 '  cmp  [ebp+byt] , 1
270 '  jz read_one           ;1なら 8bit(1byt)単位へ
280 '
290 '  cmp  [ebp+byt] , 2
300 '  jz read_two           ;2なら16bit(2byt)単位へ
310 '
320 ';各バイト数で読み取り
330 '
340 'read_four:
350 '  mov  bx  , [ebp+src]  ;スタックからBASIC変数srcの数値をbxへ
360 '  mov  ds  , bx         ;(BASIC変数srcの数値)bxをdsへ 
370 '  mov  ebx , [ebp+adr]  ;スタックからBASIC変数adrの数値をebxへ
380 '  mov  eax , ds:[ebx]   ;dsセレクタとebxオフセットの示すアドレスの数
390 '                        ;値をeaxへ
400 '  cmp  [ebp+trn]  ,  1                      
410 '  jz   transfer_four    ;4Byt並び替えル−チンへ
420 '
430 'read_four_return:
440 '  ret                   ;BASICへ戻る
450 '
460 'read_one:
470 '  mov  bx  , [ebp+src]
480 '  mov  ds  , bx
490 '  mov  ebx , [ebp+adr]
500 '  mov  al  , ds:[ebx]   ;dsセレクタとebxオフセットの示すアドレスの数
510 '                        ;値をalへ(余計な型は､書かない方がいい)
520 '                        ;レジスタがalだからだろうか?
530 '  ret                   ;BASICへ戻る
540 '
550 'read_two:
560 '  mov  bx  , [ebp+src]
570 '  mov  ds  , bx
580 '  mov  ebx , [ebp+adr]
590 '  mov  ax  , ds:[ebx]   ;dsセレクタとebxオフセットの示すアドレスの数
600 '                        ;値をaxへ
610 '  cmp  [ebp+trn]  ,  1                      
620 '  jz   transfer_two     ;2Byt並び替えル−チンへ
630 '
640 'read_two_return:
650 '  ret                   ;BASICへ戻る
660 '
670 'transfer_four:
680 '  mov  cl , 8  
690 '  ror  ax , cl         ;axの"1-0"を"0-1"へ
700 '  mov  cl , 16  
710 '  ror  eax, cl         ;eaxの"3-2-0-1"を"0-1-3-2"へ
720 '  mov  cl , 8  
730 '  ror  ax , cl         ;axの"3-2"を"2-3"へ (eax="0-1-2-3")
740 '  jmp  read_four_return 
750 '  
760 'transfer_two:
770 '  mov  cl , 8  
780 '  ror  ax , cl         ;axの"1-0"を"0-1"へ (eax="0-1")
790 '  jmp  read_two_return 
800 '                              ;使用レジスタ bx,ebx,eax,ds,cl
810 '                              ;使用レジスタ ebp,esp
820 '
830 ';***  機械語プロシジャNo.1 ***
840 ';CALLM &H05,SRC&,ADR&,DAT&,?
850 ';指定アドレスにDAT&を､指定単位 "?"(1,2,4byt)で書き込む
860 '
870 'p_no1:
880 '
890 ';equの後ろは､十進数
900 '
910 ' sr    equ 4              ;同じ文字列をEQUするとエラ−の元
920 ' ad    equ 8
930 ' dat   equ 12
940 ' b     equ 16
950 '
960 '  mov  ebp , esp
970 '
980 ';書き込みバイト数のチェック
990 '
1000 '  cmp [ebp+b]   , 1
1010 '  jz write_one             ;1なら 8bit(1byt)単位へ
1020 '
1030 '  cmp [ebp+b]   , 2
1040 '  jz write_two             ;2なら16bit(2byt)単位へ
1050 '
1060 ';各バイト数で書き込み
1070 '
1080 'write_four:
1090 '  mov  bx       , [ebp+sr] ;スタックからBASIC変数srcの数値をbxへ
1100 '  mov  ds       , bx       ;(BASIC変数srcの数値)bxをdsへ 
1110 '  mov  ebx      , [ebp+ad] ;スタックからBASIC変数adrの数値をebxへ
1120 '  mov  eax      , [ebp+dat];スタックからBASIC変数datの数値をeaxへ
1130 '  mov  ds:[ebx] , eax      ;eaxの数値をdsセレクタとebxオフセットの示す
1140 '                           ;アドレスに書く
1150 '  ret                      ;BASICへ戻る
1160 '
1170 'write_one:
1180 '  mov  bx       , [ebp+sr]
1190 '  mov  ds       , bx
1200 '  mov  ebx      , [ebp+ad]
1210 '  mov  al       , [ebp+dat]
1220 '  mov  ds:[ebx] , al       ;alの数値をdsセレクタとebxオフセットの示す
1230 '                          ;アドレスに書く
1240 '  ret                     ;BASICへ戻る
1250 ' 
1260 'write_two:
1270 '  mov  bx       , [ebp+sr]
1280 '  mov  ds       , bx
1290 '  mov  ebx      , [ebp+ad]
1300 '  mov  ax       , [ebp+dat]
1310 '  mov  ds:[ebx] , ax       ;axの数値をdsセレクタとebxオフセットの示す
1320 '                          ;アドレスに書く
1330 '  ret                     ;BASICへ戻る
1340 '  
1350 '                              ;使用レジスタ bx,ebx,al,ax,eax,ds
1360 '                              ;使用レジスタ ebp,esp
1370 '                              
1380 ';***  機械語プロシジャNo.2 ***
1390 ';CALLM &h0A,BIOSNO&,VARPTR(R_EAX&),VARPTR(R_EBX&),VARPTR(R_ECX&),VARPTR(R_EDX&),VARPTR(R_ESI&),VARPTR(R_EDI&),VARPTR(R_DS%),VARPTR(R_ES%),VARPTR(R_FS%),VARPTR(R_GS%)
1400 '
1410 'p_no2:
1420 '
1430 ';equの後ろは､十六進数
1440 '
1450 ' tbios     equ 0110h ;TBIOSセレクタ(実行用)
1460 '
1470 ' n_gra     equ 0020h ;ネイティブ グラフィック BIOS
1480 ' n_mus     equ 0040h ;ネイティブ マウス BIOS
1490 ' n_spr     equ 0060h ;ネイティブ スプライト BIOS
1500 ' n_snd     equ 0080h ;ネイティブ サウンド BIOS
1510 ' n_fnt     equ 00a0h ;ネイティブ フォント BIOS
1520 ' n_mid     equ 00c0h ;ネイティブ MIDI BIOS
1530 ' n_sndint  equ 01a0h ;ネイティブ 音源割り込み管理 BIOS
1540 ' n_sysinf  equ 01c0h ;ネイティブ システム情報 BIOS
1550 '
1560 ' dos_call  equ 21h   ;システムコ−ル
1570 ' ms_cdex   equ 2fh   ;MSCDEXのドライブ番号読み取り
1580 '
1590 ' r_exserv  equ 8eh   ;拡張サ−ビスル−チン BIOS
1600 ' r_key     equ 90h   ;キ−ボ−ド BIOS
1610 ' r_con     equ 91h   ;コンソ−ル BIOS
1620 ' r_gra     equ 92h   ;グラフィック BIOS
1630 ' r_disk    equ 93h   ;DISK BIOS
1640 ' r_prin    equ 94h   ;プリンタ− BIOS
1650 ' r_hard    equ 95h   ;ハ−ドコピ−BIOS
1660 ' r_t1      equ 96h   ;カレンダ時計 BIOS
1670 ' r_t2      equ 97h   ;タイマ管理 BIOS
1680 ' r_t3      equ 98h   ;時計管理 BIOS
1690 ' r_mus     equ 99h   ;マウス BIOS(キ−ボ−ド接続のFMR用)
1700 ' r_rs232c  equ 9bh   ;rs232c BIOS
1710 ' r_beep    equ 9eh   ;BEEP BIOS
1720 ' r_int     equ aeh   ;割り込み管理 BIOS 
1730 ' r_serv    equ afh   ;サ−ビスル−チン BIOS
1740 ' r_k1      equ ech   ;かな漢字変換(表示制御) BIOS
1750 ' r_k2      equ edh   ;かな漢字変換(ストリング変換) BIOS
1760 ' r_st      equ fdh   ;ソフトタイマ− BIOS
1770 '
1780 ';equの後ろは､十進数
1790 '
1800 ' biosno    equ 4    ;スタックに積まれた数値    (espからのオフセット)
1810 ' r_eax     equ 8    ;スタックに積まれたアドレス(espからのオフセット)
1820 ' r_ebx     equ 12   ;                    〃
1830 ' r_ecx     equ 16   ;                    〃
1840 ' r_edx     equ 20   ;                    〃
1850 ' r_esi     equ 24   ;                    〃
1860 ' r_edi     equ 28   ;                    〃
1870 ' r_ds      equ 32   ;                    〃
1880 ' r_es      equ 36   ;                    〃
1890 ' r_fs      equ 40   ;                    〃
1900 ' r_gs      equ 44   ;                    〃
1910 '
1920 ';各変数アドレスより数値を各レジスタへ         
1930 '  mov  ebp , esp        ;esp(オフセット 0)をebp へ
1940 '  mov  eax , [ebp+r_gs] ;変数r_gsのアドレスをeax へ
1950 '  mov  gs  ,   [eax]      ;変数r_gsの数値をgs へ
1960 '  mov  eax , [ebp+r_fs] ;変数r_fsのアドレスをeax へ
1970 '  mov  fs  ,   [eax]      ;変数r_fsの数値をfs へ
1980 '  mov  eax , [ebp+r_es] ;変数r_esのアドレスをeax へ
1990 '  mov  es  ,   [eax]      ;変数r_esの数値をes へ
2000 '  mov  eax , [ebp+r_ds] ;変数r_dsのアドレスをeax へ
2010 '  mov  ds  ,   [eax]      ;変数r_dsの数値をds へ 
2020 '
2030 '  mov  edi , [ebp+r_edi];変数r_ediのアドレスをediへ
2040 '  mov  edi ,   [edi]      ;変数r_ediの数値をediへ
2050 '  mov  esi , [ebp+r_esi];変数r_esiのアドレスをesiへ
2060 '  mov  esi ,   [esi]      ;変数r_esiの数値をesiへ
2070 '  mov  edx , [ebp+r_edx];変数r_edxのアドレスをedxへ
2080 '  mov  edx ,   [edx]      ;変数r_edxの数値をedxへ
2090 '  mov  ecx , [ebp+r_ecx];変数r_ecxのアドレスをecxへ
2100 '  mov  ecx ,   [ecx]      ;変数r_ecxの数値をecxへ
2110 '  mov  ebx , [ebp+r_ebx];変数r_ebxのアドレスをebxへ
2120 '  mov  ebx ,   [ebx]      ;変数r_ebxの数値をebxへ
2130 '  mov  eax , [ebp+r_eax];変数r_eaxのアドレスをeaxへ
2140 '  mov  eax ,   [eax]      ;変数r_eaxの数値をeaxへ
2150 '
2160 ';ネイティブBIOSチェック
2170 '  cmp word ptr [ebp+biosno] , n_gra
2180 '  jz   graphic_nbios
2190 '  cmp word ptr [ebp+biosno] , n_mus
2200 '  jz   mouse_nbios
2210 '  cmp word ptr [ebp+biosno] , n_spr
2220 '  jz   sprite_nbios
2230 '  cmp word ptr [ebp+biosno] , n_snd
2240 '  jz   sound_nbios
2250 '  cmp word ptr [ebp+biosno] , n_fnt
2260 '  jz   font_nbios
2270 '  cmp word ptr [ebp+biosno] , n_mid
2280 '  jz   midi_nbios
2290 '  cmp word ptr [ebp+biosno] , n_sndint
2300 '  jz   sound_int_control_nbios
2310 '  cmp word ptr [ebp+biosno] , n_sysinf
2320 '  jz   system_information_nbios
2330 '
2340 ';リアルBIOSチェック
2350 '  cmp  [ebp+biosno] , dos_call
2360 '  jz   dos
2370 '  cmp  [ebp+biosno] , ms_cdex
2380 '  jz   mscdex_driveno
2390 '  cmp  [ebp+biosno] , r_exserv
2400 '  jz   exservice_rbios
2410 '  cmp  [ebp+biosno] , r_key
2420 '  jz   key_rbios
2430 '  cmp  [ebp+biosno] , r_con
2440 '  jz   console_rbios
2450 '  cmp  [ebp+biosno] , r_gra
2460 '  jz   graphic_rbios
2470 '  cmp  [ebp+biosno] , r_disk
2480 '  jz   disk_rbios
2490 '  cmp  [ebp+biosno] , r_prin
2500 '  jz   printer_rbios
2510 '  cmp  [ebp+biosno] , r_hard
2520 '  jz   hardcopy_rbios
2530 '  cmp  [ebp+biosno] , r_t1
2540 '  jz   time1_rbios
2550 '  cmp  [ebp+biosno] , r_t2
2560 '  jz   time2_rbios
2570 '  cmp  [ebp+biosno] , r_t3
2580 '  jz   time3_rbios
2590 '  cmp  [ebp+biosno] , r_mus
2600 '  jz   mouse_rbios
2610 '  cmp  [ebp+biosno] , r_rs232c
2620 '  jz   rs232c_rbios
2630 '  cmp  [ebp+biosno] , r_beep
2640 '  jz   beep_rbios
2650 '  cmp  [ebp+biosno] , r_int
2660 '  jz   int_rbios
2670 '  cmp  [ebp+biosno] , r_serv
2680 '  jz   service_rbios
2690 '  cmp  [ebp+biosno] , r_k1  
2700 '  jz   kanji1_rbios
2710 '  cmp  [ebp+biosno] , r_k2  
2720 '  jz   kanji2_rbios
2730 '  cmp  [ebp+biosno] , r_st
2740 '  jz   softtimer_rbios
2750 '
2760 '     jmp exit
2770 '
2780 ';リアルBIOS割り込み
2790 'exservice_rbios:
2800 '                 int r_exserv
2810 '                 jmp exit
2820 'key_rbios:
2830 '                 int r_key
2840 '                 jmp exit
2850 'console_rbios:
2860 '                 int r_con
2870 '                 jmp exit
2880 'graphic_rbios:
2890 '                 int r_gra
2900 '                 jmp exit
2910 'disk_rbios:
2920 '                 int r_disk
2930 '                 jmp exit
2940 'printer_rbios:
2950 '                 int r_prin
2960 '                 jmp exit
2970 'hardcopy_rbios:
2980 '                 int r_hard
2990 '                 jmp exit
3000 'time1_rbios:
3010 '                 int r_t1
3020 '                 jmp exit
3030 'time2_rbios:
3040 '                 int r_t2
3050 '                 jmp exit
3060 'time3_rbios:
3070 '                 int r_t3
3080 '                 jmp exit
3090 'mouse_rbios:
3100 '                 int r_mus
3110 '                 jmp exit
3120 'rs232c_rbios:
3130 '                 int r_rs232c
3140 '                 jmp exit
3150 'beep_rbios:
3160 '                 int r_beep
3170 '                 jmp exit
3180 'int_rbios:
3190 '                 int r_int
3200 '                 jmp exit
3210 'service_rbios:
3220 '                 int r_serv
3230 '                 jmp exit
3240 'kanji1_rbios:
3250 '                 int r_k1
3260 '                 jmp exit
3270 'kanji2_rbios:
3280 '                 int r_k2
3290 '                 jmp exit
3300 'softtimer_rbios:
3310 '                 int r_st
3320 '                 jmp exit
3330 'dos:
3340 '                 int dos_call
3350 '                 jmp exit
3360 'mscdex_driveno:
3370 '                 int ms_cdex
3380 '                 jmp exit
3390 '
3400 '
3410 '
3420 ';ネイティブBIOS割り込み
3430 'graphic_nbios:  
3440 '                push tbios      ;ネイティブBIOS CALL準備
3450 '                pop  fs
3460 '                call pword ptr fs:[n_gra] ;ネイティブBIOS CALL
3470 '                jmp exit
3480 'mouse_nbios:
3490 '                push tbios
3500 '                pop  fs
3510 '                call pword ptr fs:[n_mus]
3520 '                jmp exit
3530 'sprite_nbios:
3540 '                push tbios
3550 '                pop  fs
3560 '                call pword ptr fs:[n_spr]
3570 '                jmp exit
3580 'sound_nbios:
3590 '                push tbios
3600 '                pop  fs
3610 '                call pword ptr fs:[n_snd]
3620 '                jmp exit
3630 'font_nbios:
3640 '                push tbios
3650 '                pop  fs
3660 '                call pword ptr fs:[n_fnt]
3670 '                jmp exit
3680 'midi_nbios:
3690 '                push tbios
3700 '                pop  fs
3710 '                call pword ptr fs:[n_mid]
3720 '                jmp exit
3730 'sound_int_control_nbios:
3740 '                push tbios
3750 '                pop  fs
3760 '                call pword ptr fs:[n_sndint]
3770 '                jmp exit
3780 'system_information_nbios:
3790 '                push tbios
3800 '                pop  fs
3810 '                call pword ptr fs:[n_sysinf]
3820 '                                ;ここでネイティブBIOS最後
3830 '
3840 'exit:                           ;各レジスタの数値を各変数アドレスへ
3850 '  push ebx
3860 '  mov  ebx           , [ebp+r_eax]
3870 '  mov   [ebx]        , eax
3880 '  pop  ebx
3890 '  mov  eax           , [ebp+r_ebx]
3900 '  mov   [eax]        , ebx
3910 '  mov  eax           , [ebp+r_ecx]
3920 '  mov   [eax]        , ecx
3930 '  mov  eax           , [ebp+r_edx]
3940 '  mov   [eax]        , edx
3950 '  mov  eax           , [ebp+r_edi]
3960 '  mov   [eax]        , edi
3970 '  mov  eax           , [ebp+r_esi]
3980 '  mov   [eax]        , esi
3990 '
4000 '  mov  eax           , [ebp+r_ds]
4010 '  mov    [eax]       , ds
4020 '  mov  eax           , [ebp+r_es]
4030 '  mov    [eax]       , es
4040 '  mov  eax           , [ebp+r_fs]
4050 '  mov    [eax]       , fs
4060 '  mov  eax           , [ebp+r_gs]
4070 '  mov    [eax]       , gs
4080 '
4090 '  ret
4100 '
4110 '                   ;使用レジスタ eax,ebx,ecx,edx,esi,edi,ds,es,fs,gs
4120 '                   ;使用レジスタ ebp,esp
4130 '
4140 ';コ−ド部分=876BYT
