From a552c25b3221e3789bdda72fce0490330da78e93 Mon Sep 17 00:00:00 2001 From: SarahW Date: Sat, 7 Mar 2020 18:01:47 +0000 Subject: [PATCH] Added Leading Edge Model M. --- src/ibm.h | 1 + src/keyboard_xt.c | 21 +++++++++++++++++++-- src/mem_bios.c | 8 ++++++++ src/model.c | 1 + 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/ibm.h b/src/ibm.h index 889d029..ee076de 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -257,6 +257,7 @@ enum ROM_CBM_SL386SX25, ROM_IBMPS1_2133_451, ROM_ECS_386_32, + ROM_LEDGE_MODELM, ROM_MAX }; diff --git a/src/keyboard_xt.c b/src/keyboard_xt.c index 0cfac2c..7f5c794 100644 --- a/src/keyboard_xt.c +++ b/src/keyboard_xt.c @@ -157,7 +157,7 @@ uint8_t keyboard_xt_read(uint16_t port, void *priv) switch (port) { case 0x60: - if ((romset == ROM_IBMPC) && (keyboard_xt.pb & 0x80)) + if ((romset == ROM_IBMPC || romset == ROM_LEDGE_MODELM) && (keyboard_xt.pb & 0x80)) { if (video_is_ega_vga()) temp = 0x4D; @@ -190,7 +190,12 @@ uint8_t keyboard_xt_read(uint16_t port, void *priv) else temp = ((mem_size-64) / 32) >> 4; - temp |= (cassette_input()) ? 0x10 : 0; + temp |= (cassette_input()) ? 0x10 : 0; + } + else if (romset == ROM_LEDGE_MODELM) + { + /*High bit of memory size is read from port 0xa0*/ + temp = ((mem_size-64) / 32) & 0xf; } else if (romset == ROM_ATARIPC3) { @@ -227,6 +232,16 @@ uint8_t keyboard_xt_read(uint16_t port, void *priv) return temp; } +static uint8_t ledge_modelm_read(uint16_t port, void *p) +{ + uint8_t temp = 0; + + if (((mem_size-64) / 32) >> 4) + temp |= 0x40; + + return temp; +} + void keyboard_xt_reset() { keyboard_xt.wantirq = 0; @@ -238,6 +253,8 @@ void keyboard_xt_init() { //return; io_sethandler(0x0060, 0x0004, keyboard_xt_read, NULL, NULL, keyboard_xt_write, NULL, NULL, NULL); + if (romset == ROM_LEDGE_MODELM) + io_sethandler(0x00a0, 0x0001, ledge_modelm_read, NULL, NULL, NULL, NULL, NULL, NULL); keyboard_xt_reset(); keyboard_send = keyboard_xt_adddata; keyboard_poll = keyboard_xt_poll; diff --git a/src/mem_bios.c b/src/mem_bios.c index 85f8169..a6ef874 100644 --- a/src/mem_bios.c +++ b/src/mem_bios.c @@ -1064,6 +1064,14 @@ int loadbios() fclose(ff); fclose(f); return 1; + + case ROM_LEDGE_MODELM: + f = romfopen("leadingedge_modelm/Leading Edge - Model M - BIOS ROM - Version 4.71.bin","rb"); + if (!f) break; + romfread(rom, 0x4000, 1, f); + fclose(f); + biosmask = 0x3fff; + return 1; } printf("Failed to load ROM!\n"); if (f) fclose(f); diff --git a/src/model.c b/src/model.c index 1e205e5..c1ea6a4 100644 --- a/src/model.c +++ b/src/model.c @@ -144,6 +144,7 @@ MODEL models[] = {"[8088] IBM PCjr", ROM_IBMPCJR, "ibmpcjr", { {"", cpus_pcjr}, {"", NULL}, {"", NULL}}, MODEL_GFX_FIXED, 128, 640, 64, pcjr_init, &pcjr_device}, {"[8088] IBM XT", ROM_IBMXT, "ibmxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, {"[8088] Juko XT clone", ROM_JUKOPC, "jukopc", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, + {"[8088] Leading Edge Model M", ROM_LEDGE_MODELM, "ledge_modelm", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 128, 704, 64, xt_init, NULL}, {"[8088] NCR PC4i", ROM_NCR_PC4I, "ncr_pc4i", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 256, 640, 64, xt_init, NULL}, {"[8088] Phoenix XT clone", ROM_PXXT, "pxxt", { {"", cpus_8088}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 64, 640, 64, xt_init, NULL}, {"[8088] Schneider EuroPC", ROM_EUROPC, "europc", { {"", cpus_europc}, {"", NULL}, {"", NULL}}, MODEL_GFX_NONE, 512, 640, 128, europc_init, NULL},