blog:ibm_tp_240

IBM Thinkpad 240

  • Intel Celeron 300 / 366 / 400MHz
  • 64MB PC66 RAM onboard + 1 SODIMM socket (maximum of 192MB, or 230MB - with low density modules)
  • Intel 440DX chipset
  • NeoMagic 128XD 2MB video
  • ESS Solo-1 sound
  • 1x PCMCIA/Cardbus, 1x Parallel, 1x Serial, 1x IRDA, 1x USB, Line-in/Mic-in/Headphone out
  • IBM Floppy connector

Bought December 2024 with a cracked screen (which I knew about). Fortunately it is all working, as tested via the VGA output:

From the Thinkpad 240 Hardware Reference Manual:

There are two models of LCD panel used with the ThinkPad 240: LCD Type A and LCD Type B. Check the last five letters of the unit's serial number you are servicing to determine the model.

LCD Type A:
All ThinkPad 240 computers that have serial numbers whose last five alphanumeric characters are “00001” to “YZZZZ” are fitted with Type A panels.
Note: The number range is from 00001 to 99999, and the letter range is from AAAAA to YZZZZ.

LCD Type B:
All ThinkPad 240 computers that have serial numbers whose last five letters are “ZAAAA” to “ZZZZZ” are fitted with Type B panels.
The servicer need only check the fifth letter from the end.
If the fifth letter from the end is “0 — Y” (inclusive), then the LCD panel is Type A. If the fifth letter from the end is “Z”, then the LCD panel is Type B.
Part Thinkpad 240 Type A LCD Thinkpad 240 Type B LCD Thinkpad 240X Type A LCD Thinkpad 240X Type B LCD
Misc parts 10L1955 10L1955 04P3067 04P3067
Bezel 10L1941 10L1941 04P3056 04P3056
LCD unit 05K9523 (Sharp LQ104S1LH11) 05k9589 (Hitachi TX26D31VC1CAA) 05K9653 05K9651 (Hitachi TX26D32VC1CAA)
LCD Cable 05K2859 27L0489 10L2164 27L0489
Hinge 10L1943 10L1943 10L1943 10L1943
Rear cover 10L1939 08K5820 04P3052 08K5820
Inverter 10L1306 10L1431 10L1530 10L1431

tldr; The screens are not swappable between Type A and Type B systems. It is the entire lid that is needed.

Fixed Screen

Swapping the entire 240X LCD assembly + cover does indeed work:

The ESS 1946 Solo-1E is a PCI sound chip that is Soundblaster Pro compatible. It is the last variation from ESS which contained their excellent ESFM technology for great-sounding FM music. Everything after this (both the ESS Allegro and ESS Maestro parts) sounds very poor in comparison.

This did take me a while to figure out, as I was trying to configure the ESS chip not to use the standard MPU401 port (since my Roland SCP-55 MIDI card also wanted it). I initially tried to disable the use of that port by the ESS drivers, but on doing so it would block access to the IBM keyboard! So, if you do have a Thinkpad 240 AND a Roland SCP-55, do not configure the ESS .ini file to disable MPU401, but instead move it to a different port (e.g. 0x300 instead of the standard 0x330>

You need the following three files to configure the ESS card fully:

  • ESSOLO.SYS - loaded in config.sys
  • ESSOLO.COM - loaded in autoexec.bat
  • ESSOLO.INI - configuration file to set resources used

If the ESS card is configured correctly it should not leave behind a driver or TSR in memory (at least in real mode - YMMV with EMM386). Note that ESSOLO.INI is a binary file and needs to be edited with a hex editor

BYTE POSITION / MEANING
00: Sound Blaster IO (20 = 220, 40 = 240)
01: Sound Blaster IO (02 = 2xx (Cannot be changed))
02: DMA (00, 01, 03)
03: DMA (Not used and don't change, default 00)
04: FM Address (Default is 88 for 388h (Cannot be changed))
05: FM Address (Default is 03 for 388h (Cannot be changed))
06: IRQ (05, 07, 09, 10 (0A), 11-14 (0B-0E, serialized IRQ only))
07: IRQ (Not used and do not change, default 00)
08: Gameport Address (Default 01 for 201h (Cannot be changed)))
09: Gameport Address (Default 02 for 2xxh, change this to anything else to disable the Gameport)
0A: MPU401 Address (Default 30 for 330h, can be 00, 20, 30, 40)
0B: MPU401 Address (Default 03 for 3xxh, change this to anything else to disable MPU401)
0C: DDMA/TDMA/SB-Link (00 (DDMA), 01 (TDMA), 02 (SB-Link aka PC/PCI, set to this if using SB-Link connector on board))
0D: DDMA/TDMA/SB-Link (Not used and don't change, default 00)
0E: Not Used
0F: Not Used

Note: definition of ESSOLO.INI taken from: https://www.vogons.org/viewtopic.php?t=79832

It seems that on the Thinkpad 240 IBM wired up the ESS Solo-1E in PC/PCI mode, which gives it the highest level of compatibility possible.

Drivers and config for my ESS configuration (Address: 0x220, Interrupt: 5, DMA: 1, MPU: 0x300, Game Port: Disabled, DMA mode: PC/PCI), of course you should also set a BLASTER line in autoexec.bat (e.g. SET BLASTER=A220 D1 I5 T4):

The PCMCIA chipset in the Thinkpad 240 is supported by Cardsoft drivers, and is available via from the IBM driver repository for the Thinkpad 240. The following entries are needed in config.sys to enable PCMCIA support (tested with several network cards as well as the Roland SCP-55):

DEVICEHIGH=C:\DRIVERS\CARDSOFT\CARDXTND.SYS
DEVICEHIGH=C:\DRIVERS\CARDSOFT\SSCBTI.SYS /numada:1 /ada1skts:1
DEVICEHIGH=C:\DRIVERS\CARDSOFT\CS.SYS
DEVICEHIGH=C:\DRIVERS\CARDSOFT\CSALLOC.EXE

Note that the Cardsoft installer adds extra entries (CS_APM.EXE and CARDID.SYS), but these do not appear to be necessary for normal operation and take up more precious base / upper memory.

Here is a copy of the IBM-distributed Cardsoft drivers for the Thinkpad 240, extracted from the floppy-disk .exe they use, and compressed into a simple .zip:

XMS / Real Mode

In non-EMS mode you can use UMBPCI.SYS to enable upper memory blocks to enable device driver loading, since the 440DX/ZX chipset of the Thinkpad 240 is well supported by those drivers.

DEVICE=C:\DRIVERS\UMBPCI\UMBPCI.SYS /i=cc00-d7ff /i=dc00-dfff

The inclusion ranges above map to the free areas that MSD shows as not being used. CheckIt shows other areas as potentially being free, but this is not the case once all of the PCMCIA drivers are loaded. The best way to test this is to boot without any memory manager loaded (neither HIMEM/EM386), but with all of the device drivers loaded… then run UMBCHK from UMBPCI and/or MSD… it should show that the above ranges are effectively the only ones available. The in-use areas include:

a000 - b000 : 64KB VGA
b000 - b800 : 32KB MDA
b800 - c000 : 32KB CGA
c000 - ca00 : 40KB Neomagic video bios
ca00 - e000 : 88KB NOTHING (but there IS actually something here!!! Do not trust CheckIt!)
e000 - e800 : 32KB Unknown ROM
e800 - ea00 : 8KB NOTHING
ea00 - 0000 : 88KB System ROM

SO my config.sys becomes:

DEVICE=C:\TOOLS\JEMM386\himemx.exe
DEVICE=C:\DRIVERS\UMBPCI\UMBPCI.SYS /i=cc00-d7ff /i=dc00-dfff
DEVICEHIGH=C:\DRIVERS\CARDSOFT\CARDXTND.SYS
DEVICEHIGH=C:\DRIVERS\CARDSOFT\SSCBTI.SYS /numada:1 /ada1skts:1
DEVICEHIGH=C:\DRIVERS\CARDSOFT\CS.SYS
DEVICEHIGH=C:\DRIVERS\CARDSOFT\CSALLOC.EXE

Sadly, for some reason I am unable to loaded all of the PCMCIA drivers high (despite enough UMB to do so). So I am left with 594KB of base memory, rather than the 620KB or so which would be available if all of the PCMCIA drivers were able to be mapped high.

EMS Mode

The lack of space in upper memory becomes more of an issue if you want to run EMM386 (or JEMM386 or similar)… since there isn't enough free space with all of the option ROMs to set the 64KB EMS page frame.

Test Base Config +FASTVID
3DBench 1.0c 205.8 fps 362.5 fps
Chris 3D Bench 195.6 fps 238.8 fps
Chris 3D Bench SVGA Mode not supported Mode not supported
PC Player VGA 80.4 fps 86.3 fps
PC Player SVGA 21.7 fps 36.5 fps
Doom (low detail) 259 realtics 246 realtics
Doom (high detail) 1041 realtics 991 realtics
Quake (320×200) 66.3 fps 70.1 fps
Quake (360×480) 27.4 fps 27.3 fps
Quake (640×480) 13.4 fps 27.5 fps
Norton SI 747.1 747.1
Landmark CPU 2865 MHz 2865 MHz
Landmark FPU 4862 MHz 4862 MHz
Landmark Video 15360 22861
Fastvid: FASTVID.EXE 011 2 F5000000

Benchmarks using 3DBench 1.0c and various slowdown techniques.

Using a combination of the SETMUL utility and the IBM PS2 Speed option:

PS2 Speed FixedMax (300MHz) PS2 Speed FixedMedium (225MHz) PS2 Speed FixedSlow (150MHz) PS2 Speed FixedMin (3)
SETMUL L1E L2E 205.8 fps 154.3 91.3 ???
SETMUL L1E L2D 183.2 fps 137.3 91.3 ???
SETMUL L1D L2E 12.5 61.7 (1) 35.3 (2) ???
SETMUL L1D L2D 12.5 61.7 (1) 35.3 (2) ???
  1. Although reported as 61.7fps, this was in reality much, much slower. More likely single-digit fps speeds. Possible bug in the benchmark?
  2. Reported as 35.3fps, but was actually much, much slower.
  3. Although the lowest possible value set by the PS2 tool, 'FixedMin' seems to result in a processor clock equal to 'FixedMedium'.

Using a combination of the CPUSPD utility, along with SETMUL:

Default SETMUL L2D SETMUL L1D
CPUSPD T8 206.2 183.2 12.5
CPUSPD T7 180.3 160.5 9.0
CPUSPD T6 (1) 154.4 137.6 TOO SLOW
CPUSPD T5 (1) 128.5 114.5 TOO SLOW
CPUSPD T4 (1) 102.7 91.5 TOO SLOW
CPUSPD T3 (1) 76.8 68.5 TOO SLOW
CPUSPD T2 (1) 51.0 45.5 TOO SLOW
CPUSPD T1 (1) 25.1 22.4 TOO SLOW
  1. Using the PS2 Speed utility, to access states at T6 and below, you must have set PS2 SPEED FIXEDMEDIUM or less. If the PS2 tool has been set to FIXEDMAX the new state will not stick.

This gives the following approximate speed levels:

Configuration 3DBench 1.0c Score Nearest Equivalent
Default + Fastvid 362
Default 205
SETMUL L2D 183 Pentium II 233
CPUSPD T7 + SETMUL L2D 160 Pentium MMX 233
CPUSPD T6 154 Pentium MMX 200
CPUSPD T6 + SETMUL L2D 137 Pentium MMX 166
CPUSPD T5 128 Pentium MMX 133
CPUSPD T5 + SETMUL L2D 114 Pentium 150
CPUSPD T4 102 Pentium 133
CPUSPD T4 + SETMUL L2D 91 Pentium 100
CPUSPD T3 76 Am5x86 133
CPUSPD T3 + SETMUL L2D 68 486 DX4 100
CPUSPD T2 51 486 DX2 66 (upper range)
CPUSPD T2 + SETMUL L2D 45 486 DX2 66 (lower range)
CPUSPD T1 25 486 DX 33
CPUSPD T1 + SETMUL L2D 22 486 SX 33
SETMUL L1D L2D 12.5 386 SX 40
CPUSPD T7 + SETMUL L1D 9 286 20
  • blog/ibm_tp_240.txt
  • Last modified: 2025/01/02 10:44
  • by john