[Back to DOS SWAG index] [Back to Main SWAG index] [Original]

    {
    I recently loaded some SWAG Pascal files from a CDROM and found the question -
    How do you get or set the DOS version ?

    Getting the DOS version is easy - call INT 21H, Function 30H - }

    USES Dos;

    procedure id_version;

    var regs : registers;

    begin
      regs.ah := $30;
      msdos( regs);
      write( 'DOS version = ', regs.al,'.' );
      IF ( regs.ah < 10 ) THEN write( '0' );
      writeln( regs.ah );
    end;

    Setting the DOS version is another matter - I suspect you will have to
    disassemble your boot files to do this. I've not tried it and cannot recommend
    it!

    However, some DOS programs ( especially games ) do test the DOS version before
    running by using the INT 21H Function 30H as above. This CAN be programmed
    around by diverting calls to INT 21H to a custom handler and capturing the
    Function 30 calls. I've included a minimal TSR to do this.

    I can't see this being of any use to users with standard MSDOS setups as your
    program still won't run but is of use if you have an unusual or custom setup
    e.g. DRDOS or Novell DOS users.

    Many thanks anyway for the tips in the SWAG collection - I've used several
    including WHATCPU routines, PCX file readers / writers and Douglas Webb's
    JumpToInterrupt !

    Finally - do you have a compuserve forum?

    Richard Muirhead.

    100675.2153@compuserve.com.

    (***************************************************)

    PROGRAM dos6;
    {$M 1024, 0,0 }

    USES dos;

    CONST
      new_dos_version = 6;
    {
      new_dos_version must hold the word in AX returned by INT 21H, Function 30.
      As AL = major version number, and
         AH = minor version number, the following are valid codes:-

        DOS version                new_dos_version
        3.20                       5123
        3.30                       7683
        4.00                          4
        4.01                        260
        5.00                          5
        6.00                          6
        6.22                       5638
        6.23                       5894

      new_dos_version = 256*minor_version + major_version
    }

    VAR p : pointer;

    {
     FROM SWAG - Douglas Webb 27/1/94.

     If you have an interrupt handler and you want to jump to the original
     interrupt handler and NOT return to your handler.

     Call the following procedure with a pointer to the old interrupt handler
     ( which you'd better have saved ) :-
    }

    PROCEDURE JumpToInterrupt( oldvector : Pointer );

    INLINE(                        { Jump to old Intr from local ISR  }
       $5B/                        { POP  BX IP part of vector        }
       $58/                        { POP  AX CS part of vector        }
       $87/$5E/$0E/                { XCHG BX,[BP+14] switch ofs/bx    }
       $87/$46/$10/                { XCHG AX,[BP+16] switch seg/ax    }
       $8B/$E5/                    { MOV  SP,BP                       }
       $5D/                        { POP  BP                          }
       $07/                        { POP  ES                          }
       $1F/                        { POP  DS                          }
       $5F/                        { POP  DI                          }
       $5E/                        { POP  SI                          }
       $5A/                        { POP  DX                          }
       $59/                        { POP  CX                          }
       $CB                         { RETF      Jump [ToOldVector]     }
       );                          { to original timer vector         }
    {end JumpToInterrupt}

    PROCEDURE New21( Flags,CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP : word );
    interrupt;

    BEGIN
      IF Hi( AX ) = $30 THEN
          AX := new_dos_version
        ELSE
          JumpToInterrupt( p );
    END;

    BEGIN
      getintvec( $21, p );
      setintvec( $21, @new21 );
      keep( 0 );
    END.

    (***************************************************************)

    program getver;

    uses dos;

    procedure id_version;

    var regs : registers;

    begin
      regs.ah := $30;
      msdos( regs);
      write( 'DOS version = ', regs.al,'.' );
      IF ( regs.ah < 10 ) THEN write( '0' );
      writeln( regs.ah );
    end;

    begin
      id_version;
    end.

[Back to DOS SWAG index] [Back to Main SWAG index] [Original]