• Please review our updated Terms and Rules here

Introducing pcZIP - A full replacement DOS driver for parallel port Iomega ZIP and Jaz drives for vintage systems.

ktmchrisv

Experienced Member
Joined
Oct 28, 2015
Messages
61
Location
Mantua, UT
Hello Everyone,

This project has been a long time in the making. Back in 2017, I decided that I really like the Iomega ZIP/JAZ drives for bridging back to older systems. Unfortunately, the drivers that Iomega provided did not work well or at all on older systems, and were rather poorly documented and very cumbersome to use. But, the hardware itself seemed perfect for the job. So, I thought, wouldn't it be great to have a small driver in a single file, with GUEST and FDISK capability that could be used with an original IBM 5150 using a single sided 180KB floppy, or a modern PC with a parallel port. Thus, the idea behind pcZIP was born. The first problem was finding enough documentation on the hardware to start the project. Enter the Linux IMM and PPA project / drivers. They provided the roadmap / datasheet for addressing the hardware. After that, it was designing an application framework to work with different parallel ports and drives along with the process communication to allow the drivers to communicate as a system. This driver has been working in various forms for the past 5-6 years. However in the last 3 months, I decided to finish it and publish it. Give it to the world. It was entirely too much work for just my own use cases, and I believe that others will find it as useful as I have.
This driver is entirely written in x86 assembly language using Borland TASM Ideal mode for size and speed. It can compile on a IBM 5150 (It will take about 20 minutes), or new system with an i7. My intention is to release the full source code with it's build system under GPLv3. That will happen in the future.

Today, I am releasing the binary version of the driver as a V1.00 release. Source will come, stay tuned.
Here is what pcZIP provides:
1. Single executable file which provides a DOS device driver, FDISK program, disk editor and guest application all in a small executable file.
2. It works and has been tested on DOS 2 - DOS 7.
3. It will provide access to the drive through the original SPP port of the 5150, or a modern EPP port with hardware handshaking. There is a special mode to allow EPP operation on 808x processors. The driver defaults to attempting bi-directional access with a fallback to nibble based access. To use EPP capabilities, you have to use command line overrides and obviously have an EPP parallel board installed in your computer. As well, you need to test your system. EPP mode is a bit fickle, and it can look like it's working when it really isn't. However, the reward for testing is a drive that is much faster and more reactive to the system. On a higher performance system with a Jaz 2GB attached via the Jaz Traveler, you can get around 800KB/s transfers. On a 10Mhz V20, you can expect the same drive to have around 400KB/s performance. Separately, I will provide a full write-up on how to get EPP mode working properly.
4. It is intended to be an extensible framework. Multiple drivers can be loaded addressing different drives and hardware while still allowing access from FDISK and the Disk Editor. One instantiation of the driver will manage 1 drive.. In the future, the framework will allow using other hardware. Think ASPI and ATAPI.
5. The FDISK program provides standard formats for different disk partitions and target applications. So, you can specifically target a DOS 2 32MB partition or standard ZIP 100 / ZIP 250 partitions by choosing standard options in FDISK. It allows for low level formatting of media. It is quite extensive. Please press F1 for help.
6. There is a reasonably full featured Disk Editor available. Primarily this was for my use to debug writing the FDISK functionality, and it sort of turned into it's own feature. Fair warning: There is little to no warnings in the editor for updating the disk. It expects you to know what you are doing. If you are not comfortable looking at the innards of a file system, then you should probably use the version of pcZIP without the editor and save 6KB of file space.
7. The GUEST functionality works on DOS 3.0+.
8. The actual drive does not need to be present when the driver is loaded and run. It will automatically determine the drive that is atttached at the time a drive is accessed and self-configure for that drive at that time. So, you are really managing the port configuration for accessing drives. So, you could load the driver with no drive attached. Then plugin a ZIP100, then unplug the ZIP 100 and plug in a ZIP 250, access files there. Then at the end, you could plug in your Jaz drive (through a traveler) and access files on that drive (with the appriate DOS version and partitioning).
9. If using a Jaz Traveler SCSI adaptor, you can plug multiple drives into the SCSI chain. So, you could have a JAZ 2GB, JAZ 1GB and a ZIP250 all on LPT1. To get this to work properly, you will need to extensively test your configuration. However, it does work. Each drive requires it's own driver. So, you would have the driver loaded 3 times in this configuration. Each driver takes about 7K of memory (without debug data).


Here is what is being provided today:
PCZIPEXE.ZIPEXE versions of the drivers.
PCZIPCOM.ZIPCOM versions of the drivers. Primarily for PC-DOS 2.x use cases where .EXE's can't be loaded in CONFIG.SYS

Please note that when using DOS 2.x, that GUEST functionality is not available. The driver must be loaded in CONFIG.SYS and use the .COM files. If I remember correctly, MSDOS 2.x can load EXE files in config.sys.

In each archive, you will find
PCZIP.COM, PCZIP.EXEFull version of the driver with FDISK, Disk Editor and GUEST functionality
PCZIPDBG.COM, PCZIPDBG.EXEFull version of the driver above, however with DEBUG messages and data turned on. Adds 4KB of messaging to the low level driver. However, makes it easier to identify problems.
PCZIPFD.COM, PCZIPFD.EXEVersion of the driver with FDISK and GUEST functionality. A good place to start if you don't plan on editing disks.
PCZIPDRV.COM, PCZIPDRV.EXEVersion of the driver that provides GUEST functionality. ~13Kbytes. Usefull for putting on old 180KB or 360KB floppies which are limited with space.

To get started: (Please initially try this out on a scratch disk, until you are sure the driver is working properly for you, and you understand it's operation)
1. To see if the system can address your drive, plug the drive into a port and execute: pczip /scan /lptx where x is the port number where the drive is attached. If it lists a drive, then go to step 2.
2. To load the drive as a DOS drive letter, execute: pczip /guest /lptx where x is the port number where the drive is attached. The drive letter(s) will be reported on program output.
3. To use the FDISK disk partition editor on a GUEST drive or one loaded with CONFIG.SYS, execute: pczip /fdisk
4. To use the FDISK disk partition editor on a drive that does not have a loaded driver, execute: pczip /fdisk /lptx /hw where x is the port number where the drive is attached.
5. To load the pcZIP driver through config.sys, add DEVICE=PCZIP.COM /lptx to the file.
6. While in the FDISK or Disk Editor, F1 gives a help screen to guide on usage
7. Using the CLI, you can get help by executing: pczip /?
8. At any time, you can just execute: pczip and it will list the currently loaded drivers, the current drive / disk present in the drive, what drive letters are associated with the drive....etc......

This is a BETA release, so please use it on scratch disks until you verify operation for your use cases. Please report any problems you may have back here. As well, I will be updating this initial post with more documentation, as I write it. Topics will include a full description of all command line switches and when / how to use them, a detailed approach to getting EPP operation working and a deeper dive through the design and architecture of the driver itself.

Tell me what you think and how it could be improved, or if there is a feature you think is missing or not implemented correctly. This project was an astronomical amount of work, but, I now have the driver system that I originally envisioned and wanted from back in 2017. And, I want to share it with all of you. I think it can be a very useful tool in our endeavor to understand and use our old vintage systems.

Enjoy - Happy New Year!🎉

~Chris V.
 

Attachments

First test is successfull!

This is really amazing work. The pczip.com still fits on the 360 kB MS-DOS boot disk (with some other essential things), so I don't need a disk in B: for the GUEST files. And mostly the best thing is that it uses 90 kB less of RAM, so now I have 584 kB RAM free instead of 493 before.

Thanks a lot for this fine piece of programming!

1735666925793.png

I let it run now again DOOM8088 timedemo 3 to see if it works over longer time and if the more available memory may speedup the game a bit.
 
Another result, running pcZIP on Olivetti M21:

1735678102207.png

1735678132742.png

Here it is "only" 66 kB more free RAM. I can't explain the difference to the Olimarck result where it is about 90 kB difference but anyhow I am happy. Lateron I will try on my 2nd M21 which is having only an 8088.
 
@1ST1 We should dig in to the difference between the two. If you run "mem /d/p" and post the results, we can see the exact amount of ram taken by pcZIP in each system. However, under all conditions the driver should take about 6.9KB of RAM. It's almost hard coded in the driver that way, so there is not a lot to go wrong. If you are running with the /guest functionality, there is a DPB tacked onto the end of the driver for each drive letter used. But, each DPB is only ~32 bytes. Post mem /d/p from both guest.exe and pczip.com
 
Sol basically did not hat problems with the drivers until now. It seems to work good. Tested with MS-DOS 5. But not tested the enhanced things like fdisk yet.


So here are the mem results
1. Olivetti M21 Iomega Guest mem /d
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - D:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       0031B0     Systemdaten
                SETVER     000190      DEVICE=   
                  SETVERXX              Installierter Gerätetreiber
                           000380      FILES=     
                           000100      FCBS=     
                           002990      BUFFERS=   
                           0001C0      LASTDRIVE=
  00E820      COMMAND      0012E0     Programm 
  00FB10      IBMDOS       000040     -- Frei --
  00FB60      COMMAND      000100     Umgebung 
  00FC70      MEM          000070     Umgebung 
  00FCF0      DOSKEY       001030     Programm 
  010D30      IBMDOS       000040     -- Frei --
  010D80      GUEST        000080     Umgebung 
  010E10      GUEST        00A520     Programm 
  01B340      IBMDOS       005BD0     -- Frei --
  020F20      ASPIPPM1     001BE0     Programm 
  022B10      MEM          0176F0     Programm 
  03A210      IBMDOS       065B50     -- Frei --
  09FD70      mKEYB        000280     Programm 
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    512592 Byte max. Größe für ausführbares Programm
2. Olivetti M21 Iomega Guest mem /p
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       0031B0     Systemdaten
                SETVER     000190      DEVICE=   
                           000380      FILES=     
                           000100      FCBS=     
                           002990      BUFFERS=   
                           0001C0      LASTDRIVE=
  00E820      COMMAND      0012E0     Programm 
  00FB10      IBMDOS       000040     -- Frei --
  00FB60      COMMAND      000100     Umgebung 
  00FC70      MEM          000070     Umgebung 
  00FCF0      DOSKEY       001030     Programm 
  010D30      IBMDOS       000040     -- Frei --
  010D80      GUEST        000080     Umgebung 
  010E10      GUEST        00A520     Programm 
  01B340      IBMDOS       005BD0     -- Frei --
  020F20      ASPIPPM1     001BE0     Programm 
  022B10      MEM          0176F0     Programm 
  03A210      IBMDOS       065B50     -- Frei --
  09FD70      mKEYB        000280     Programm 
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    512592 Byte max. Größe für ausführbares Programm
3. Olivetti M21 pcZIP mem /d
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - D:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       0031B0     Systemdaten
                SETVER     000190      DEVICE=   
                  SETVERXX              Installierter Gerätetreiber
                           000380      FILES=     
                           000100      FCBS=     
                           002990      BUFFERS=   
                           0001C0      LASTDRIVE=
  00E820      COMMAND      0012E0     Programm 
  00FB10      IBMDOS       000040     -- Frei --
  00FB60      COMMAND      000100     Umgebung 
  00FC70      MEM          000070     Umgebung 
  00FCF0      DOSKEY       001030     Programm 
  010D30      IBMDOS       0000E0     -- Frei --
  010E20      PCZIP        001B00     Programm 
  012930      MEM          0176F0     Programm 
  02A030      IBMDOS       075D30     -- Frei --
  09FD70      mKEYB        000280     Programm 
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    578608 Byte max. Größe für ausführbares Programm
4. Olivetti M21 pcZIP mem /p
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       0031B0     Systemdaten
                SETVER     000190      DEVICE=   
                           000380      FILES=     
                           000100      FCBS=     
                           002990      BUFFERS=   
                           0001C0      LASTDRIVE=
  00E820      COMMAND      0012E0     Programm 
  00FB10      IBMDOS       000040     -- Frei --
  00FB60      COMMAND      000100     Umgebung 
  00FC70      MEM          000070     Umgebung 
  00FCF0      DOSKEY       001030     Programm 
  010D30      IBMDOS       0000E0     -- Frei --
  010E20      PCZIP        001B00     Programm 
  012930      MEM          0176F0     Programm 
  02A030      IBMDOS       075D30     -- Frei --
  09FD70      mKEYB        000280     Programm 
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    578608 Byte max. Größe für ausführbares Programm

To be continued...
 
... continued here

5. Olimarck Top 15 Iomega Guest mem /d
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       0009F0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - B:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0010F0      IBMDOS       00A440     Systemdaten
  00B530      IBMBIO       001900     Systemdaten
                           000130      FILES=     
                           000100      FCBS=     
                           0014D0      BUFFERS=   
                           0001C0      LASTDRIVE=
  00CE40      COMMAND      0012E0     Programm 
  00E130      IBMDOS       000040     -- Frei --
  00E180      COMMAND      000100     Umgebung 
  00E290      GUEST        000050     Umgebung 
  00E2F0      GUEST        00A520     Programm 
  018820      KEYB2        000050     Umgebung 
  018880      MEM          000070     Umgebung 
  018900      IBMDOS       005AF0     -- Frei --
  01E400      ASPIPPM2     002560     Programm 
  020970      GRAFTABL     0004A0     Programm 
  020E20      KEYB2        000240     Programm 
  021070      DOSKEY       001030     Programm 
  0220B0      MEM          0176F0     Programm 
  0397B0      IBMDOS       066840     -- Frei --
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    515904 Byte max. Größe für ausführbares Programm
  35666944 Byte fortlaufender Erweiterungsspeicher insgesamt
  35651584 Byte fortlaufender Erweiterungsspeicher verfügbar
6. Olimarck Top 15 Iomega Guest mem /p
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       0009F0     Systemdaten
  0010F0      IBMDOS       00A440     Systemdaten
  00B530      IBMBIO       001900     Systemdaten
                           000130      FILES=     
                           000100      FCBS=     
                           0014D0      BUFFERS=   
                           0001C0      LASTDRIVE=
  00CE40      COMMAND      0012E0     Programm 
  00E130      IBMDOS       000040     -- Frei --
  00E180      COMMAND      000100     Umgebung 
  00E290      GUEST        000050     Umgebung 
  00E2F0      GUEST        00A520     Programm 
  018820      KEYB2        000050     Umgebung 
  018880      MEM          000070     Umgebung 
  018900      IBMDOS       005AF0     -- Frei --
  01E400      ASPIPPM2     002560     Programm 
  020970      GRAFTABL     0004A0     Programm 
  020E20      KEYB2        000240     Programm 
  021070      DOSKEY       001030     Programm 
  0220B0      MEM          0176F0     Programm 
  0397B0      IBMDOS       066840     -- Frei --
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    515904 Byte max. Größe für ausführbares Programm
  35666944 Byte fortlaufender Erweiterungsspeicher insgesamt
  35651584 Byte fortlaufender Erweiterungsspeicher verfügbar
7. Olimarck Top 15 pcZIP mem /d
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       0009F0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - B:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0010F0      IBMDOS       00A440     Systemdaten
  00B530      IBMBIO       001900     Systemdaten
                           000130      FILES=     
                           000100      FCBS=     
                           0014D0      BUFFERS=   
                           0001C0      LASTDRIVE=
  00CE40      COMMAND      0012E0     Programm 
  00E130      IBMDOS       000040     -- Frei --
  00E180      COMMAND      000100     Umgebung 
  00E290      KEYB2        000050     Umgebung 
  00E2F0      PCZIP        001B00     Programm 
  00FE00      GRAFTABL     0004A0     Programm 
  0102B0      KEYB2        000240     Programm 
  010500      MEM          000070     Umgebung 
  010580      IBMDOS       000050     -- Frei --
  0105E0      DOSKEY       001030     Programm 
  011620      MEM          0176F0     Programm 
  028D20      IBMDOS       0772D0     -- Frei --
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    584144 Byte max. Größe für ausführbares Programm
  35666944 Byte fortlaufender Erweiterungsspeicher insgesamt
  35651584 Byte fortlaufender Erweiterungsspeicher verfügbar
8. Olimarck Top 15 pcZIP mem /p
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       0009F0     Systemdaten
  0010F0      IBMDOS       00A440     Systemdaten
  00B530      IBMBIO       001900     Systemdaten
                           000130      FILES=     
                           000100      FCBS=     
                           0014D0      BUFFERS=   
                           0001C0      LASTDRIVE=
  00CE40      COMMAND      0012E0     Programm 
  00E130      IBMDOS       000040     -- Frei --
  00E180      COMMAND      000100     Umgebung 
  00E290      KEYB2        000050     Umgebung 
  00E2F0      PCZIP        001B00     Programm 
  00FE00      GRAFTABL     0004A0     Programm 
  0102B0      KEYB2        000240     Programm 
  010500      MEM          000070     Umgebung 
  010580      IBMDOS       000050     -- Frei --
  0105E0      DOSKEY       001030     Programm 
  011620      MEM          0176F0     Programm 
  028D20      IBMDOS       0772D0     -- Frei --
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    584144 Byte max. Größe für ausführbares Programm
  35666944 Byte fortlaufender Erweiterungsspeicher insgesamt
  35651584 Byte fortlaufender Erweiterungsspeicher verfügbar

Strange, the Olimark says it has extended memory... I need to verify that, but that is another topic. (no himem.sys driver or alternative installed/tested)
 
@1ST1 The extended memory being reported is probably via the INT 15h interface.

When looking at the dumps, PCZIP is always taking 1B00h bytes of memory in both machines.
In contrast, Guest loads the ASPIPPM2 module, in addition to itself. So, ASPIPPM2 and GUEST are both part of the Iomega GUEST program. By the nature of the way it is designed, GUEST can create memory holes which effectively reduce the maximum program size that can be loaded. This is denoted in both the M21 and Olimark.

Specifically on the M21, there is a memory hole being created in the memory map @1B340. This is denoted here in the IBMDOS line with 5BD0 bytes:

Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - D:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       0031B0     Systemdaten
                SETVER     000190      DEVICE=   
                  SETVERXX              Installierter Gerätetreiber
                           000380      FILES=     
                           000100      FCBS=     
                           002990      BUFFERS=   
                           0001C0      LASTDRIVE=
  00E820      COMMAND      0012E0     Programm
  00FB10      IBMDOS       000040     -- Frei --
  00FB60      COMMAND      000100     Umgebung
  00FC70      MEM          000070     Umgebung
  00FCF0      DOSKEY       001030     Programm
  010D30      IBMDOS       000040     -- Frei --
  010D80      GUEST        000080     Umgebung
  010E10      GUEST        00A520     Programm
  01B340      IBMDOS       005BD0     -- Frei --    << Memory Hole
  020F20      ASPIPPM1     001BE0     Programm
  022B10      MEM          0176F0     Programm
  03A210      IBMDOS       065B50     -- Frei --
  09FD70      mKEYB        000280     Programm
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    512592 Byte max. Größe für ausführbares Programm

On the Olimark, there is a memory hole being created at @18900. It is slightly smaller because MEM's environment segment was placed at 18820. I'm not quite sure what KEYB2 is, but it is also taking a small amount of memory.

Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       0009F0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - B:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0010F0      IBMDOS       00A440     Systemdaten
  00B530      IBMBIO       001900     Systemdaten
                           000130      FILES=     
                           000100      FCBS=     
                           0014D0      BUFFERS=   
                           0001C0      LASTDRIVE=
  00CE40      COMMAND      0012E0     Programm
  00E130      IBMDOS       000040     -- Frei --
  00E180      COMMAND      000100     Umgebung
  00E290      GUEST        000050     Umgebung
  00E2F0      GUEST        00A520     Programm
  018820      KEYB2        000050     Umgebung
  018880      MEM          000070     Umgebung
  018900      IBMDOS       005AF0     -- Frei --  << Memory Hole here
  01E400      ASPIPPM2     002560     Programm
  020970      GRAFTABL     0004A0     Programm
  020E20      KEYB2        000240     Programm
  021070      DOSKEY       001030     Programm
  0220B0      MEM          0176F0     Programm
  0397B0      IBMDOS       066840     -- Frei --
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    515904 Byte max. Größe für ausführbares Programm
  35666944 Byte fortlaufender Erweiterungsspeicher insgesamt
  35651584 Byte fortlaufender Erweiterungsspeicher verfügbar
 
For PCZIP on M21. FILES= and BUFFERS= are larger

Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - D:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       0031B0     Systemdaten
                SETVER     000190      DEVICE=   
                  SETVERXX              Installierter Gerätetreiber
                           000380      FILES=     
                           000100      FCBS=     
                           002990      BUFFERS=   
                           0001C0      LASTDRIVE=
  00E820      COMMAND      0012E0     Programm
  00FB10      IBMDOS       000040     -- Frei --
  00FB60      COMMAND      000100     Umgebung
  00FC70      MEM          000070     Umgebung
  00FCF0      DOSKEY       001030     Programm
  010D30      IBMDOS       0000E0     -- Frei --
  010E20      PCZIP        001B00     Programm
  012930      MEM          0176F0     Programm
  02A030      IBMDOS       075D30     -- Frei --
  09FD70      mKEYB        000280     Programm
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    578608 Byte max. Größe für ausführbares Programm

For pcZIP on the Olimark, The FILES= and BUFFERS= statements in config.sys are significantly smaller, yielding more available memory.

Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       0009F0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - B:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0010F0      IBMDOS       00A440     Systemdaten
  00B530      IBMBIO       001900     Systemdaten
                           000130      FILES=     
                           000100      FCBS=     
                           0014D0      BUFFERS=   
                           0001C0      LASTDRIVE=
  00CE40      COMMAND      0012E0     Programm
  00E130      IBMDOS       000040     -- Frei --
  00E180      COMMAND      000100     Umgebung
  00E290      KEYB2        000050     Umgebung
  00E2F0      PCZIP        001B00     Programm
  00FE00      GRAFTABL     0004A0     Programm
  0102B0      KEYB2        000240     Programm
  010500      MEM          000070     Umgebung
  010580      IBMDOS       000050     -- Frei --
  0105E0      DOSKEY       001030     Programm
  011620      MEM          0176F0     Programm
  028D20      IBMDOS       0772D0     -- Frei --
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    584144 Byte max. Größe für ausführbares Programm
  35666944 Byte fortlaufender Erweiterungsspeicher insgesamt
  35651584 Byte fortlaufender Erweiterungsspeicher verfügbar


So, in summary, the GUEST program is creating a large memory hole fragementing the memory map. For PCZIP, the difference between the two is primarily with the amount of FILES and BUFFERS allocated in config.sys
 
keyb2 is a keyboard driver to enable german keyboard layout (keyb2 gr), a much smaller replacement to Microsoft's original "keyb gr" (there is also mkeyb, but keyb2 is again some bytes smaller). For files and buffers, I use now the same values on my M21 as on the Olimarck, both are set to 10 nowWhat I already did as Quarterdeck MFT (from QEMM 386) proposed is to set stacks to 0,0 to safe memory. But that does not change results with the ZIP drive, still working.

Anyhow, I played arround for comparison, on my M21 I have more possibilities...

1736201343586.png

1. Comparison: loading aspippm1.sys (iomega) and aspidisk.sys (adaptec) from Config.sys

Remark: This is not the way IOMEGA propose and does when setting up, instead of aspidisk.sys they use scsicfg.exe and SCSIDRVR.SYS. But that loads three files instead of two, needs more memory and is a disadvantage when having another ASPI compatible SCSI controller in the system. Adaptecs aspidisk.sys replaces both of them and can also handle other aspi drivers of other SCSI hostadapters if installed. As the name already says, aspippm1.sys is an ASPI driver which is compatible to aspidisk.sys.

mem /d
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - D:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       0060C0     Systemdaten
                SETVER     000190      DEVICE= 
                  SETVERXX              Installierter Gerätetreiber
                ASPIPPM1   001B60      DEVICE= 
                  SCSIMGR$              Installierter Gerätetreiber
                ASPIDISK   002AA0      DEVICE= 
                  E:                    Installierter Gerätetreiber
                           000130      FILES=   
                           000100      FCBS=   
                           0014D0      BUFFERS= 
                           0001C0      LASTDRIVE=
  011730      COMMAND      0012E0     Programm
  012A20      IBMDOS       000040     -- Frei --
  012A70      COMMAND      000100     Umgebung
  012B80      MEM          000070     Umgebung
  012C00      DOSKEY       001030     Programm
  013C40      MEM          0176F0     Programm
  02B340      IBMDOS       074A20     -- Frei --
  09FD70      mKEYB        000280     Programm
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    573728 Byte max. Größe für ausführbares Programm
mem /p
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       0060C0     Systemdaten
                SETVER     000190      DEVICE= 
                ASPIPPM1   001B60      DEVICE= 
                ASPIDISK   002AA0      DEVICE= 
                           000130      FILES=   
                           000100      FCBS=   
                           0014D0      BUFFERS= 
                           0001C0      LASTDRIVE=
  011730      COMMAND      0012E0     Programm
  012A20      IBMDOS       000040     -- Frei --
  012A70      COMMAND      000100     Umgebung
  012B80      MEM          000070     Umgebung
  012C00      DOSKEY       001030     Programm
  013C40      MEM          0176F0     Programm
  02B340      IBMDOS       074A20     -- Frei --
  09FD70      mKEYB        000280     Programm
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    573728 Byte max. Größe für ausführbares Programm
2. Comparison: loading the PALMZIP driver from config.sys
This one is an alternative, it supports 8088 and 8086 like your driver, but it only supports ZIP 100 drives with older firmware.
mem /d
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
                  CON                   System-Gerätetreiber
                  AUX                   System-Gerätetreiber
                  PRN                   System-Gerätetreiber
                  CLOCK$                System-Gerätetreiber
                  A: - D:               System-Gerätetreiber
                  COM1                  System-Gerätetreiber
                  LPT1                  System-Gerätetreiber
                  LPT2                  System-Gerätetreiber
                  LPT3                  System-Gerätetreiber
                  COM2                  System-Gerätetreiber
                  COM3                  System-Gerätetreiber
                  COM4                  System-Gerätetreiber
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       002660     Systemdaten
                SETVER     000190      DEVICE= 
                  SETVERXX              Installierter Gerätetreiber
                PALMZIP    000BB0      DEVICE= 
                  E:                    Installierter Gerätetreiber
                           000130      FILES=   
                           000100      FCBS=   
                           0014D0      BUFFERS= 
                           0001C0      LASTDRIVE=
  00DCD0      COMMAND      0012E0     Programm
  00EFC0      IBMDOS       000040     -- Frei --
  00F010      COMMAND      000100     Umgebung
  00F120      MEM          000070     Umgebung
  00F1A0      DOSKEY       001030     Programm
  0101E0      MEM          0176F0     Programm
  0278E0      IBMDOS       078480     -- Frei --
  09FD70      mKEYB        000280     Programm
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    588672 Byte max. Größe für ausführbares Programm
mem /p
Code:
  Adresse     Name         Größe      Art
  -------     ----         -----      ---
  000000                   000400     Interrupt-Vektor
  000400                   000100     ROM-Übertragungsbereich
  000500                   000200     DOS-Übertragungsbereich
  000700      IBMBIO       000AE0     Systemdaten
  0011E0      IBMDOS       00A480     Systemdaten
  00B660      IBMBIO       002660     Systemdaten
                SETVER     000190      DEVICE= 
                PALMZIP    000BB0      DEVICE= 
                           000130      FILES=   
                           000100      FCBS=   
                           0014D0      BUFFERS= 
                           0001C0      LASTDRIVE=
  00DCD0      COMMAND      0012E0     Programm
  00EFC0      IBMDOS       000040     -- Frei --
  00F010      COMMAND      000100     Umgebung
  00F120      MEM          000070     Umgebung
  00F1A0      DOSKEY       001030     Programm
  0101E0      MEM          0176F0     Programm
  0278E0      IBMDOS       078480     -- Frei --
  09FD70      mKEYB        000280     Programm
    655360 Byte konventioneller Speicher insgesamt
    655360 Byte für MS-DOS verfügbar
    588672 Byte max. Größe für ausführbares Programm

The smallest driver seems to be the palmzip driver, but that is more unflexible than pczip driver.
 
I played with all of the above. Both ASPIDISK.SYS and PALMZIP don't manage disk changes well. PALMZIP always reports that the disk might have changed versus using the SCSI Request Sense command and as you noted only works with very old firmware ZIP 100 drives. ASPIDISK.SYS report write protected errors when there is no disk in the drive. It's also quite large. I wrote pcZIP for a reason. When I get some time, one of the updates to pcZIP will be to create an ASPI layer to main driver. It will probably be implemented with the /aspi switch versus the /lpt switch. Then there will be no reason to use ASPIDISK with Zip or Jaz SCSI drives.
 
For me aspidisk and disk change works fine. Maybe you have the wrong version from different EZSCSI version?

But anyhow, your driver is better. Thanks for your efforts.
 
Thank you Chris V for the incredible amount of assembly programming and testing effort you have applied to this project. At least several thousand hours I estimate.
For the first time, I can now connect my ZIP 100 parallel port drive to my IBM 5150 and IBM5160 computers and have access to the ZIP drive. Eureka!! Thank you!

Like many others, I haven't been successful in installing any of the many Iomega ZIP drive guest programs and utilities I've found online after trying to install them on the two machines.
Is there a tool which can be used to perform the standard high-level formatting of these disks after the partitioning work is done?
Thanks for any advice.
 
I am also quite happy, but now I see two little problems:

1. when I start pczip /guest /lpt1: without having a zip drive attached (for example in autoexec.bat) then the driver still displays driveletter d: (pc has c: harddisk) without mounting a drive. In that situation it should display that the driver is not installed.

2. When running pczip /guest /lpt1: twice it will two drive letters for the same drive. That makes no sense and it might be dangerous, corrupting the file system when reading/writing alternated on both logical drive letters. pczip should check if the drive already has been mounted and cancel a 2nd mount.

1739214282584.png
Maybe first typewriter ever with ZIP drive attached... First typewriter ever running DOOM (from ZIP drive).

For that I had to update the Olivetti ETV 260 MS-DOS version. Originally it runs on DOS 3.20. Years ago I already tried DOS 5 but the ETV daiswheel printer driver is incompatible with DOS 5. But now I tested DOS 4.01 and that is fine.
 
@nova
I'm going to give you a text description, as I don't have access to my lab for the next month... So, here it goes:

When you use the command pczip /fdisk, a window will be brought up which shows the current partitions on the disk. You select the partition with the up / down arrow keys. You can press <Enter> on the partition that you want to format, and select Y/N on whether you want to format, verify or clear the partition. Format = DOS Format. Clear = Write 00's to the partition. Verify = read / verify every sector of partition. When you are done selecting what you want to do, press F10 to initiate your request.

You can also execute a low level format, which issues a command to the drive to completely refresh and erase the disk. This will clear ALL data off the disk in the drive and yield an empty disk without partitions. To perform a low level format, press ALT-L from the partition selection screen in pczip /fdisk. After this, you can create partitions and format as required.

When creating partitions, you select different partition types with the space bar. You can create partitions compatible with DOS 2, 3 and 4+. DOS 2 and 3 can only address 32MB maximum partition size. DOS 4+ can accommodate up to 2GB partition size. The partition sizes available will reflect the disk that is currently in the drive.

Let me know if this answers your question. I'll answer as quickly as I can.
 
@1ST1
The typewriter is amazing! The driver can run on DOS 3.2 or 4.01. Good work on getting a large drive attached.

1. The intended operation is to load a drive letter regardless of whether the physical drive is attached or not. This was one of my original criteria for the driver. I built a MS-DOS network boot disk where I load the driver and optionally use a drive on any system where I boot the disk. Quite a bit of effort was put into this feature, so you can just add any drive you want to the port when you want to access files. The driver will auto-recognize the drive, the disk in the drive and allow access. Just attach the drive, select the drive letter and press enter a few times. This allows you to access files on any drive / media you have without needing to reboot.

2. Yes, this was intended operation during development. It might be possible to perform the detection with the available information in the driver, however, there is a tricky caveat: When using a Jaz Traveler adapter, you can load the driver against multiple targets on the same LPT port. So, you could have a jaz traveler attached to a Jaz 2GB drive, and a ZIP 100 SCSI drive and then load the driver against each target. So, you would have to look at the actual drive the was on the port. However, the driver is designed to load when the drive is not present as described in 1. So, there will be cases when you simply can't make a determination. My inclination is to leave it alone.
 
@Thelgord

Yes, this driver was a large amount of work and an interesting engineering challenge. I would estimate about 4 man months of full time work over the last 5-6 years. The challenge was creating a driver, an fdisk / disk editor program and a guest application all in the same executable. Then keeping it small and usable on the oldest systems. All the modules in the system were written from scratch and optimized for just what was needed: memory management, text windowing, dos driver, and then a modular driver architecture using an API driven low level SCSI driver and port driver. The port driver is what I plan on expanding so that I can add support for the ATAPI and ASPI. When this is done, pcZIP will be a single executable driver that will address all of the ZIP / JAZ drives / media regardless of their interface under DOS..... Too bad I couldn't have done this 20 years ago...

I've had some "life" issues happen lately, and I am currently living in a hotel waiting for my house to be repaired...long story.. So, my plans to GPL the code, release it and perform updates will be delayed for atleast another month or two. But, the full plan is still to release everything.
 
Back
Top