2 FUJITSU FMR-30 Emulator 'eFMR-30'
3 FUJITSU FMR-50 Emulator 'eFMR-50'
4 FUJITSU FMR-60 Emulator 'eFMR-60'
6 Author : Takeda.Toshiya
14 #include "../../fileio.h"
50 #define ERR_FDD_NOTREADY 1
51 #define ERR_FDD_PROTECTED 2
52 #define ERR_FDD_DELETED 4
53 #define ERR_FDD_NOTFOUND 8
54 #define ERR_FDD_CRCERROR 0x10
55 #define ERR_SCSI_NOTREADY 1
56 #define ERR_SCSI_PARAMERROR 2
57 #define ERR_SCSI_NOTCONNECTED 4
58 #define ERR_MEMCARD_NOTREADY 1
59 #define ERR_MEMCARD_PROTECTED 2
60 #define ERR_MEMCARD_PARAMERROR 0x200
64 #define CMOS_SIZE 0x2000
65 #define VRAM_SIZE 0x20000
66 #define IPL_SIZE 0x10000
70 #define CMOS_SIZE 0x800
71 #define VRAM_SIZE 0x40000
72 #define IPL_SIZE 0x4000
76 #define CMOS_SIZE 0x800
77 #define VRAM_SIZE 0x80000
78 #define IPL_SIZE 0x4000
82 #define BLOCK_SIZE 512
84 static const int iotable[][2] = {
86 {0x0100, 0x19}, // pic
96 {0x0042, 0x00}, // timer
100 {0x000b, 0x02}, // sio
106 {0x001d, 0x02}, // memory
108 {0x0040, 0x9f}, // psg
112 {0x0300, 0x01}, // lcdc
136 {0x0060, 0x00}, // timer
137 {0x0604, 0x00}, // keyboard
138 {0x0000, 0x19}, // pic
149 {0x0046, 0x36}, // pit
152 {0x0404, 0x00}, // memory
153 {0x0500, 0x00}, // crtc
193 {0xfd98, 0x00}, // palette
201 {0xfda0, 0x0f}, // video
207 static const uint8 cmos_t[] = {
209 0x01,0xff,0x42,0x4f,0x4f,0x54,0xa8,0x00,0x40,0x00,0x01,0xfe,0x53,0x45,0x54,0x55,
210 0xe8,0x00,0x00,0x01,0x01,0xfd,0x4c,0x4f,0x47,0x20,0xe8,0x01,0x10,0x03,0x01,0xfc,
211 0x4f,0x41,0x53,0x59,0xf8,0x04,0x20,0x00,0x01,0xfb,0x44,0x45,0x42,0x20,0x18,0x05,
212 0x00,0x01,0x01,0xfa,0x44,0x45,0x53,0x4b,0x18,0x06,0x32,0x00,0x00,0x00,0x00,0x00,
213 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
214 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
215 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
216 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
217 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
218 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
219 0x4a,0x06,0x7b,0x19,0x97,0x62,0x79,0x41
221 0x01,0xff,0x42,0x4f,0x4f,0x54,0xa8,0x00,0x40,0x00,0x01,0xfe,0x53,0x45,0x54,0x55,
222 0xe8,0x00,0x00,0x01,0x01,0xfd,0x4c,0x4f,0x47,0x20,0xe8,0x01,0x10,0x03,0x01,0xfc,
223 0x4f,0x41,0x53,0x59,0xf8,0x04,0x20,0x00,0x01,0xfb,0x58,0x45,0x4e,0x49,0x18,0x05,
224 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
225 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
226 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
227 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
228 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
229 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
230 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
231 // 0x28,0x05,0x99,0x02,0xe1,0xe1,0x79,0x41
232 0x28,0x05,0x99,0x02,0x00,0x00,0x79,0x41
235 // FMR-30: cmos $1fd0-
236 // FMR-50: cmos $7d0-
237 static const uint8 cmos_b[] = {
239 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0xff,0xff,0xff,0xff,0xff,
240 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
241 0x7f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
243 0x00,0x00,0x01,0x02,0x03,0x04,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
244 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
245 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
250 static const uint8 msg_c[] = {
251 0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,
252 0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,
253 0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,
254 0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07,0xff,0x47,0xff,0x07
257 // '
\83V
\83X
\83e
\83\80\82ð
\83Z
\83b
\83g
\82µ
\82Ä
\82Â
\82¾
\82³
\82¢'
258 static const uint8 msg_k[] = {
259 0x25,0x37,0x00,0x00,0x25,0x39,0x00,0x00,0x25,0x46,0x00,0x00,0x25,0x60,0x00,0x00,
260 0x24,0x72,0x00,0x00,0x25,0x3b,0x00,0x00,0x25,0x43,0x00,0x00,0x25,0x48,0x00,0x00,
261 0x24,0x37,0x00,0x00,0x24,0x46,0x00,0x00,0x24,0x2f,0x00,0x00,0x24,0x40,0x00,0x00,
262 0x24,0x35,0x00,0x00,0x24,0x24,0x00,0x00,0x21,0x21,0x00,0x00
265 void BIOS::initialize()
268 disk_pc1 = disk_pc2 = cmos_pc = wait_pc = -1;
270 FILEIO* fio = new FILEIO();
271 if(fio->Fopen(emu->bios_path(_T("IPL.ROM")), FILEIO_READ_BINARY)) {
272 fio->Fread(buffer, sizeof(buffer), 1);
275 uint32 addr = 0xfffc4;
276 if(buffer[addr & (IPL_SIZE - 1)] == 0xea) {
277 int ofs = buffer[++addr & (IPL_SIZE - 1)];
278 ofs |= buffer[++addr & (IPL_SIZE - 1)] << 8;
279 int seg = buffer[++addr & (IPL_SIZE - 1)];
280 seg |= buffer[++addr & (IPL_SIZE - 1)] << 8;
281 disk_pc1 = addr = ofs + (seg << 4);
283 if(buffer[addr & (IPL_SIZE - 1)] == 0xea) {
284 int ofs = buffer[++addr & (IPL_SIZE - 1)];
285 ofs |= buffer[++addr & (IPL_SIZE - 1)] << 8;
286 int seg = buffer[++addr & (IPL_SIZE - 1)];
287 seg |= buffer[++addr & (IPL_SIZE - 1)] << 8;
288 disk_pc2 = ofs + (seg << 4);
296 register_frame_event(this);
300 memset(scsi_blocks, 0, sizeof(scsi_blocks));
301 for(int i = 0; i < MAX_SCSI; i++) {
302 _stprintf_s(scsi_path[i], _MAX_PATH, _T("%sSCSI%d.DAT"), emu->application_path(), i);
303 if(fio->Fopen(scsi_path[i], FILEIO_READ_BINARY)) {
304 fio->Fseek(0, FILEIO_SEEK_END);
305 scsi_blocks[i] = fio->Ftell() / BLOCK_SIZE;
311 memset(memcard_blocks, 0, sizeof(memcard_blocks));
312 for(int i = 0; i < MAX_MEMCARD; i++) {
313 _stprintf_s(memcard_path[i], _MAX_PATH, _T("%sMEMCARD%d.DAT"), emu->application_path(), i);
314 if(fio->Fopen(memcard_path[i], FILEIO_READ_BINARY)) {
315 fio->Fseek(0, FILEIO_SEEK_END);
316 memcard_blocks[i] = fio->Ftell() / BLOCK_SIZE;
317 memcard_protected[i] = fio->IsProtected(memcard_path[i]);
326 for(int i = 0; i < MAX_DRIVE; i++) {
327 access_fdd[i] = false;
335 void BIOS::event_frame()
340 bool BIOS::bios_call_i86(uint32 PC, uint16 regs[], uint16 sregs[], int32* ZeroFlag, int32* CarryFlag)
342 uint8 *regs8 = (uint8 *)regs;
345 if(PC == 0xfffc4 || PC == disk_pc1 || PC == disk_pc2) {
348 emu->out_debug_log(_T("%6x\tDISK BIOS: AH=%2x,AL=%2x,CX=%4x,DX=%4x,BX=%4x,DS=%2x,DI=%2x\n"), get_cpu_pc(0), AH,AL,CX,DX,BX,DS,DI);
350 // if(!((AL & 0xf0) == 0x20 || (AL & 0xf0) == 0x50 || (AL & 0xf0) == 0xb0)) {
351 // target drive is not floppy, memcard and scsi hard drive
356 if((AL & 0xf0) == 0x20) {
358 if(!(drv < MAX_DRIVE && disk[drv]->inserted)) {
360 CX = ERR_FDD_NOTREADY;
366 if(disk[drv]->write_protected) {
373 if((AL & 0xf0) == 0x50) {
375 if(!(drv < MAX_MEMCARD && memcard_blocks[drv])) {
377 CX = ERR_MEMCARD_NOTREADY;
383 DL = memcard_protected[drv] ? 2 : 0;
388 if((AL & 0xf0) == 0xb0) {
390 if(!(drv < MAX_SCSI && scsi_blocks[drv])) {
392 CX = ERR_SCSI_NOTCONNECTED;
397 AL = (BLOCK_SIZE == 128) ? 0 : (BLOCK_SIZE == 256) ? 1 : (BLOCK_SIZE == 512) ? 2 : 3;
398 BX = scsi_blocks[drv] >> 16;
399 DX = scsi_blocks[drv] & 0xffff;
407 } else if(AH == 3 || AH == 4) {
409 if((AL & 0xf0) == 0x20) {
411 if(!(drv < MAX_DRIVE && disk[drv]->inserted)) {
413 CX = ERR_FDD_NOTREADY;
422 if((AL & 0xf0) == 0xb0) {
424 if(!(drv < MAX_SCSI && scsi_blocks[drv])) {
426 CX = ERR_SCSI_NOTCONNECTED;
440 if((AL & 0xf0) == 0x20) {
442 if(!(drv < MAX_DRIVE && disk[drv]->inserted)) {
444 CX = ERR_FDD_NOTREADY;
449 int ofs = DS * 16 + DI;
455 disk[drv]->get_track(trk, hed);
456 access_fdd[drv] = true;
458 if(!disk[drv]->get_sector(trk, hed, sct - 1)) {
460 CX = ERR_FDD_NOTFOUND;
464 // check deleted mark
465 if(disk[drv]->deleted) {
467 CX = ERR_FDD_DELETED;
472 for(int i = 0; i < disk[drv]->sector_size.sd; i++) {
473 d_mem->write_data8(ofs++, disk[drv]->sector[i]);
477 if(disk[drv]->crc_error) {
479 CX = ERR_FDD_CRCERROR;
484 if(++sct > disk[drv]->sector_num.sd) {
497 if((AL & 0xf0) == 0x50) {
499 if(!(drv < MAX_MEMCARD && memcard_blocks[drv])) {
501 CX = ERR_MEMCARD_NOTREADY;
505 FILEIO* fio = new FILEIO();
506 if(!fio->Fopen(memcard_path[drv], FILEIO_READ_BINARY)) {
508 CX = ERR_MEMCARD_NOTREADY;
514 int ofs = DS * 16 + DI;
515 int block = (CL << 16) | DX;
516 fio->Fseek(block * BLOCK_SIZE, FILEIO_SEEK_SET);
519 if(!(block++ < memcard_blocks[drv])) {
521 CX = ERR_MEMCARD_PARAMERROR;
528 fio->Fread(buffer, BLOCK_SIZE, 1);
529 for(int i = 0; i < BLOCK_SIZE; i++) {
530 d_mem->write_data8(ofs++, buffer[i]);
541 if((AL & 0xf0) == 0xb0) {
543 if(!(drv < MAX_SCSI && scsi_blocks[drv])) {
545 CX = ERR_SCSI_NOTCONNECTED;
549 FILEIO* fio = new FILEIO();
550 if(!fio->Fopen(scsi_path[drv], FILEIO_READ_BINARY)) {
552 CX = ERR_SCSI_NOTREADY;
558 int ofs = DS * 16 + DI;
559 int block = (CL << 16) | DX;
560 fio->Fseek(block * BLOCK_SIZE, FILEIO_SEEK_SET);
564 if(!(block++ < scsi_blocks[drv])) {
566 CX = ERR_SCSI_PARAMERROR;
573 fio->Fread(buffer, BLOCK_SIZE, 1);
574 for(int i = 0; i < BLOCK_SIZE; i++) {
575 d_mem->write_data8(ofs++, buffer[i]);
591 if((AL & 0xf0) == 0x20) {
593 if(!(drv < MAX_DRIVE && disk[drv]->inserted)) {
595 CX = ERR_FDD_NOTREADY;
599 if(disk[drv]->write_protected) {
601 CX = ERR_FDD_PROTECTED;
606 int ofs = DS * 16 + DI;
612 disk[drv]->get_track(trk, hed);
613 access_fdd[drv] = true;
615 if(!disk[drv]->get_sector(trk, hed, sct - 1)) {
617 CX = ERR_FDD_NOTFOUND;
622 for(int i = 0; i < disk[drv]->sector_size.sd; i++) {
623 disk[drv]->sector[i] = d_mem->read_data8(ofs++);
626 // clear deleted mark and crc error
627 disk[drv]->set_deleted(false);
628 disk[drv]->set_crc_error(false);
630 if(++sct > disk[drv]->sector_num.sd) {
643 if((AL & 0xf0) == 0x50) {
645 if(!(drv < MAX_MEMCARD && memcard_blocks[drv])) {
647 CX = ERR_MEMCARD_NOTREADY;
651 if(memcard_protected[drv]) {
653 CX = ERR_MEMCARD_PROTECTED;
657 FILEIO* fio = new FILEIO();
658 if(!fio->Fopen(memcard_path[drv], FILEIO_READ_WRITE_BINARY)) {
660 CX = ERR_MEMCARD_NOTREADY;
666 int ofs = DS * 16 + DI;
667 int block = (CL << 16) | DX;
668 fio->Fseek(block * BLOCK_SIZE, FILEIO_SEEK_SET);
672 if(!(block++ < scsi_blocks[drv])) {
674 CX = ERR_MEMCARD_PARAMERROR;
681 for(int i = 0; i < BLOCK_SIZE; i++) {
682 buffer[i] = d_mem->read_data8(ofs++);
684 fio->Fwrite(buffer, BLOCK_SIZE, 1);
694 if((AL & 0xf0) == 0xb0) {
696 if(!(drv < MAX_SCSI && scsi_blocks[drv])) {
698 CX = ERR_SCSI_NOTCONNECTED;
702 FILEIO* fio = new FILEIO();
703 if(!fio->Fopen(scsi_path[drv], FILEIO_READ_WRITE_BINARY)) {
705 CX = ERR_SCSI_NOTREADY;
711 int ofs = DS * 16 + DI;
712 int block = (CL << 16) | DX;
713 fio->Fseek(block * BLOCK_SIZE, FILEIO_SEEK_SET);
717 if(!(block++ < scsi_blocks[drv])) {
719 CX = ERR_SCSI_PARAMERROR;
726 for(int i = 0; i < BLOCK_SIZE; i++) {
727 buffer[i] = d_mem->read_data8(ofs++);
729 fio->Fwrite(buffer, BLOCK_SIZE, 1);
744 if((AL & 0xf0) == 0x20) {
746 if(!(drv < MAX_DRIVE && disk[drv]->inserted)) {
748 CX = ERR_FDD_NOTREADY;
758 disk[drv]->get_track(trk, hed);
759 access_fdd[drv] = true;
761 if(!disk[drv]->get_sector(trk, hed, sct - 1)) {
763 CX = ERR_FDD_NOTFOUND;
769 if(disk[drv]->crc_error) {
771 CX = ERR_FDD_CRCERROR;
776 if(++sct > disk[drv]->sector_num.sd) {
789 if((AL & 0xf0) == 0xb0) {
791 if(!(drv < MAX_SCSI && scsi_blocks[drv])) {
793 CX = ERR_SCSI_NOTCONNECTED;
798 int block = (CL << 16) | DX;
802 if(!(block++ < scsi_blocks[drv])) {
804 CX = ERR_SCSI_PARAMERROR;
819 // reset hard drive controller
826 if((AL & 0xf0) == 0x20) {
828 if(!(drv < MAX_DRIVE && disk[drv]->inserted)) {
830 CX = ERR_FDD_NOTREADY;
835 int ofs = DS * 16 + DI;
839 disk[drv]->get_track(trk, hed);
840 access_fdd[drv] = true;
841 if(++secnum > disk[drv]->sector_num.sd) {
844 if(!disk[drv]->get_sector(trk, hed, secnum - 1)) {
846 CX = ERR_FDD_NOTFOUND;
850 for(int i = 0; i < 6; i++) {
851 d_mem->write_data8(ofs++, disk[drv]->id[i]);
861 } else if(AH == 0xa) {
863 if((AL & 0xf0) == 0x20) {
865 if(!(drv < MAX_DRIVE && disk[drv]->inserted)) {
867 CX = ERR_FDD_NOTREADY;
872 int ofs = DS * 16 + DI;
876 disk[drv]->get_track(trk, hed);
877 access_fdd[drv] = true;
878 for(int i = 0; i < disk[drv]->sector_num.sd; i++) {
879 disk[drv]->get_sector(trk, hed, i);
880 memset(disk[drv]->sector, 0xe5, disk[drv]->sector_size.sd);
881 disk[drv]->set_deleted(false);
882 disk[drv]->set_crc_error(false);
892 } else if(AH == 0xd) {
898 } else if(AH == 0xe) {
900 if((AL & 0xf0) == 0x20) {
902 if(!(drv < MAX_DRIVE && disk[drv]->inserted)) {
911 DL = disk[drv]->changed ? 1 : 0;
912 disk[drv]->changed = false;
916 if((AL & 0xf0) == 0xb0) {
918 if(!(drv < MAX_SCSI && scsi_blocks[drv])) {
933 } else if(AH == 0xfa) {
935 if((AL & 0xf0) == 0x20) {
942 if((AL & 0xf0) == 0xb0) {
944 if(!(drv < MAX_SCSI && scsi_blocks[drv])) {
946 CX = ERR_SCSI_NOTCONNECTED;
958 } else if(AH == 0xfd) {
960 if((AL & 0xf0) == 0x20) {
967 if((AL & 0xf0) == 0xb0) {
969 if(!(drv < MAX_SCSI && scsi_blocks[drv])) {
984 } else if(AH == 0x80) {
985 // pseudo bios: init i/o
986 for(int i = 0;; i++) {
987 if(iotable[i][0] < 0) {
990 d_io->write_io8(iotable[i][0], iotable[i][1]);
993 memset(cmos, 0, CMOS_SIZE);
994 memcpy(cmos, cmos_t, sizeof(cmos_t));
995 memcpy(cmos + CMOS_SIZE - sizeof(cmos_b), cmos_b, sizeof(cmos_b));
997 for(int i = 0, ofs = 0; i < 256; i++) {
998 // int vector = ffff:0008
999 d_mem->write_data16(ofs + 0, 0x0008);
1000 d_mem->write_data16(ofs + 2, 0xffff);
1004 memset(vram, 0, VRAM_SIZE);
1006 memset(cvram, 0, 0x2000);
1007 memset(avram, 0, 0x2000);
1009 memset(cvram, 0, 0x1000);
1010 memset(kvram, 0, 0x1000);
1011 memcpy(cvram + 0xf00, msg_c, sizeof(msg_c));
1012 memcpy(kvram + 0xf00, msg_k, sizeof(msg_k));
1016 } else if(AH == 0x81) {
1017 // pseudo bios: boot from fdd #0
1018 *ZeroFlag = (timeout > (int)(FRAMES_PER_SEC * 4));
1019 if(!disk[0]->inserted) {
1024 disk[0]->get_track(0, 0);
1025 access_fdd[0] = true;
1026 if(!disk[0]->get_sector(0, 0, 0)) {
1030 for(int i = 0; i < disk[0]->sector_size.sd; i++) {
1031 buffer[i] = disk[0]->sector[i];
1034 if(!(buffer[0] == 'I' && buffer[1] == 'P' && buffer[2] == 'L' && buffer[3] == IPL_ID)) {
1039 for(int i = 0; i < disk[0]->sector_size.sd; i++) {
1040 d_mem->write_data8(0xb0000 + i, buffer[i]);
1044 memset(cvram, 0, 0x2000);
1045 memset(avram, 0, 0x2000);
1047 memset(cvram, 0, 0x1000);
1048 memset(kvram, 0, 0x1000);
1057 } else if(AH == 0x82) {
1058 // pseudo bios: boot from scsi-hdd #0
1060 if(!scsi_blocks[0]) {
1064 FILEIO* fio = new FILEIO();
1065 if(!fio->Fopen(scsi_path[drv], FILEIO_READ_BINARY)) {
1072 fio->Fread(buffer, BLOCK_SIZE * 4, 1);
1076 if(!(buffer[0] == 'I' && buffer[1] == 'P' && buffer[2] == 'L' && buffer[3] == IPL_ID)) {
1081 for(int i = 0; i < BLOCK_SIZE * 4; i++) {
1082 d_mem->write_data8(0xb0000 + i, buffer[i]);
1086 memset(cvram, 0, 0x2000);
1087 memset(avram, 0, 0x2000);
1089 memset(cvram, 0, 0x1000);
1090 memset(kvram, 0, 0x1000);
1100 } else if(PC == cmos_pc) {
1103 emu->out_debug_log(_T("%6x\tCMOS BIOS: AH=%2x,AL=%2x,CX=%4x,DX=%4x,BX=%4x,DS=%2x,DI=%2x\n"), get_cpu_pc(0), AH,AL,CX,DX,BX,DS,DI);
1107 memcpy(cmos, cmos_t, sizeof(cmos_t));
1108 memcpy(cmos + CMOS_SIZE - sizeof(cmos_b), cmos_b, sizeof(cmos_b));
1109 } else if(AH == 5) {
1111 BX = cmos[0xa2] | (cmos[0xa3] << 8);
1112 } else if(AH == 10) {
1114 int block = AL * 10;
1115 int len = cmos[block + 6] | (cmos[block + 7] << 8);
1116 int dst = cmos[block + 8] | (cmos[block + 9] << 8);
1117 int src = DS * 16 + DI;
1118 for(int i = 0; i < len; i++) {
1119 cmos[dst++] = d_mem->read_data8(src++);
1121 } else if(AH == 11) {
1123 int block = AL * 10;
1124 int len = cmos[block + 6] | (cmos[block + 7] << 8);
1125 int src = cmos[block + 8] | (cmos[block + 9] << 8);
1126 int dst = DS * 16 + DI;
1127 for(int i = 0; i < len; i++) {
1128 d_mem->write_data8(dst++, cmos[src++]);
1130 } else if(AH == 20) {
1131 // check block header
1137 } else if(PC == wait_pc) {
1140 emu->out_debug_log(_T("%6x\tWAIT BIOS: AH=%2x,AL=%2x,CX=%4x,DX=%4x,BX=%4x,DS=%2x,DI=%2x\n"), get_cpu_pc(0), AH,AL,CX,DX,BX,DS,DI);
1148 bool BIOS::bios_int_i86(int intnum, uint16 regs[], uint16 sregs[], int32* ZeroFlag, int32* CarryFlag)
1150 uint8 *regs8 = (uint8 *)regs;
1152 if(intnum == 0x93) {
1154 return bios_call_i86(0xfffc4, regs, sregs, ZeroFlag, CarryFlag);
1155 } else if(intnum == 0xaa) {
1156 // power management bios
1167 } else if(AH == 1) {
1177 uint32 BIOS::read_signal(int ch)
1179 // get access status
1181 for(int i = 0; i < MAX_DRIVE; i++) {
1185 access_fdd[i] = false;
1190 access_scsi = false;