D-ACCESS (Version 1.0) Library of Interface Modules Between FORTRAN 77 And DOS, BIOS, I/O and Hardware For the IBM PC/XT/AT/PS2 and Compatibles Developed for Microsoft MSFOR and Ryan-McFarland PROFORT by OLYMPIC SOFTWARE P.O. BOX 769, Bryn Mawr, PA 19010, 215-353-6971 (C) Copyright 1988 OLYMPIC SOFTWARE ALL RIGHTS RESERVED REGISTRATION If you are not a registered user of D-ACCESS, please register now by sending $25.00 to our address. Registration brings the following benefits: 1. Most importantly, you will help continue the further development of this product. 2. You will be notified of all changes, updates, tips, etc. TRADEMARKS: International Business Machines: IBM PC, XT, AT, PS/2, Proprinter Microsoft Corporation: Windows Epson America, Inc: Epson FX C.Itoh Digital Products, Inc: C.Itoh Okidata Corporation: Okidata D-ACCESS Version 1.0, (C) Copyright 1988, Olympic Software P.O. Box 769, Bryn Mawr, PA 19010, 215-353-6971 I. INTRODUCTION D-ACCESS, provides access to all the functions available in the IBM DOS and BIOS, access to the I/O ports including the mouse and direct memory operations, all from FORTRAN. The possibilities presented to the IBM PC FORTRAN programmer by D-ACCESS are limitless. He is no longer restricted to the functions provided by the FORTRAN compiler. He has the freedom to use as high level or as low level a function as he sees appropriate. It is good programming practice, however, to use the highest level function available. First choice is the FORTRAN compiler, second is DOS, third is BIOS and then come direct I/O and memory operations. For portability, it makes sense to avoid direct access of I/O and memory. BIOS can help you do that in most cases, by providing a nice set of functions. D-ACCESS is a set of interface modules which you can call from within FORTRAN with the appropriate parameters. In most cases these parameters are 8086/80286 register values. The modules in turn call DOS, BIOS or the mouse driver, or perform direct I/O or memory operations. Applications where D-Access will be extremely valuable include Graphics Programs (typically using BIOS), Data Base Programs (typically using DOS), Sound Programs (typically using I/O operations), Mouse Based User Interface Programs (typically using the mouse module), Communication Programs (typically using BIOS), Printer oriented utilities (typically using BIOS), etc. The possibilities are endless. Our Olympic Software DPLOT, for example, makes an extensive use of BIOS. Effective use of DOS, BIOS, I/O, mouse or direct memory in a FORTRAN program (or any type of program) requires, however, some knowledge of the 8086 family of CPUs, the IBM PC microcomputer family architectures, PC-DOS (or MS-DOS), BIOS and the mouse driver MOUSE.SYS. The books referenced in section III have been found to be excellent for the library of the serious programmer. They are available in most general bookstores, computer specialty stores, or University bookstores. D-ACCESS consists of 24 interface modules in 6 groups: 1. FORTRAN-DOS Interface Modules 2. FORTRAN-BIOS Interface Modules 3. FORTRAN-I/O Interface Modules 4. FORTRAN-MOUSE Interface Module 5. FORTRAN-Memory Interface Modules 6. Miscellaneous Modules This document is organized in four parts. Part I is the introduction, Part II is a description of the contents on this disk, Part III is a detailed description of the interface modules, and Part IV is the reference section. If you have a copy of D-ACCESS library and you are not registered, please register now, by sending $25.00 to our address, with your name and address. Being registered brings benefits: a) You become notified of changes, updates, tips, etc. b) You can participate with your ideas for exciting future upgrades, applications, etc. Finally, we would like to note that your opinions count; we urge you to write to us with any concerns, problems, suggestions for the next update, etc. II. DISK CONTENTS The files included on the D-ACCESS disk are as follows: 1. OSLIB1M.LIB: A library containing the 24 interface modules used by MSFOR (Microsoft) FORTRAN programs. 2. OSLIB1P.LIB: A library containing the 24 interface modules used by PROFORT (Ryan-McFarland) FORTRAN programs. 3. OSLIB1.TXT: This document 4. Source code for a number of FORTRAN programs, provided as examples referenced by section III: TGDOS.FOR, TUDOS.FOR, TIMDAT.FOR, TVBIOS.FOR, LINES.FOR, RDKEY.FOR, PRMESS.FOR, SDMESS.FOR, STIMER.FOR, RFAT.FOR, TMBIOS.FOR, SOUND.FOR, TMOUSE.FOR, RMOUSE.FOR, PEKPOK.FOR, VPP.FOR, TSLOG.FOR, TRAN.FOR, TRANDU.FOR. 5. Executable code for LINES.FOR, RDKEY.FOR, SOUND.FOR, RMOUSE.FOR, VPP.FOR for a quick check of the D-ACCESS versatility. Assuming that your FORTRAN subdirectory name is MSFOR and D-ACCESS programs are at subdirectory ACCESS, here is an example Link command for your program MYPROG: LINK MYPROG,,NUL,\MSFOR\+\ACCESS\OSLIB1M.LIB III. MODULE DESCRIPTION The information provided in this Part for each module consists of a) module name, b) module function, c) interrupt number which is used internally by each module (if applicable), d) calling statement from FORTRAN, e) description of parameters, and f) reference to an example program. In most cases, the parameters are register values which are discussed in detail in the books referenced in section IV. 1. FORTRAN-DOS INTERFACE MODULES A. GDOSIF Module function: General access to all DOS functions Interrupt numbers: 32 (Program Terminate), 33 (DOS Universal Functions), 34 (Terminate Address), 35 (Break Address), 36 (Critical-Error Handler Address), 37 (Absolute Disk Read), 38 (Absolute Disk Write), 39 (Terminate-But-Stay-Resident), 47 (Print Spool Control). Calling statement: CALL GDOSIF(IARRAY) Description of parameters: IARRAY is an integer array of size 15, type INTEGER*2 and defined as: IRQ, IAH, IAL, IBH, IBL, ICH, ICL, IDH, IDL, IDS, IES, ISI, IDI, IZF, ICF. IRQ is the desired interrupt number. IAH, IAL, IBH, IBL, ICH, ICL, IDH, IDL, IDS, IES, ISI, IDI contain the contents of the 8086/80286 registers AH, AL, BH, BL, CH, CL, DH, DL, DS, ES, SI and DI. IZF, ICF contain contents of the Zero and Carry flags. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to or less than 16 bits wide. Example programs: TGDOS.FOR B. UDOSIF Module function: Access to the Universal DOS functions. Interrupt number: 33 Calling statement: CALL UDOSIF(IARRAY) Description of parameters: IARRAY is an integer array of size 14, type INTEGER*2 and defined as: IAH, IAL, IBH, IBL, ICH, ICL, IDH, IDL, IDS, IES, ISI, IDI, IZF, ICF. IAH, IAL, IBH, IBL, ICH, ICL, IDH, IDL, IDS, IES, ISI, IDI contain the contents of the 8086/80286 registers AH, AL, BH, BL, CH, CL, DH, DL, DS, ES, SI and DI. IZF, ICF contain contents of the Zero and Carry flags. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to or less than 16 bits wide. Example program: TUDOS.FOR C. LDOSIF Module function: Limited access to the Universal DOS Functions Interrupt number: 33 Calling statement: CALL LDOSIF(IARRAY) Description of parameters: IARRAY is an integer array of size 8, type INTEGER*2 and defined as: IAH, IAL, IBH, IBL, ICH, ICL, IDH, IDL. These parameters contain the contents of the 8086/80286 registers AH, AL, BH, BL, CH, CL, DH and DL. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to 8 bits wide. Example program: TIMDAT.FOR 2. FORTRAN-BIOS INTERFACE MODULES A. VBIOS Module function: General access to BIOS Video Services Interrupt number: 16 Calling statement: CALL VBIOS(IARRAY) Description of parameters: IARRAY is an integer array of size 10, type INTEGER*2 and defined as: IAH, IAL, IBH, IBL, ICH, ICL, IDH, IDL, IES, IBP. These parameters contain the contents of the 8086/80286 registers AH, AL, BH, BL, CH, CL, DH, DL, ES and BP. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to or less than 16 bits wide. Example program: TVBIOS.FOR B. GBIOS Module function: Limited access to BIOS Video Services, optimized for fast writing/reading pixels Interrupt number: 16 Calling statement: CALL GBIOS(IARRAY) Description of parameters: IARRAY is an integer array of size 4, type INTEGER*2 and defined as: IAH, IAL, ICX, IDX. These parameters contain the contents of the 8086/80286 registers AH, AL, CX and DX. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to or less than 16 bits wide. Example program: LINES.FOR C. KBIOS Module function: General Access to BIOS Keyboard Services Interrupt number: 22 Calling statement: CALL KBIOS(IARRAY) Description of parameters: IARRAY is an integer array of size 3, type INTEGER*2 and defined as: IAH, IAL, IZF. IAH, IAL contain the contents of the 8086/80286 registers AH, AL, and IZF contains the contents of the Zero flag. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to or less than 8 bits wide. Example program: RDKEY.FOR D. PBIOS Module function: General Access to BIOS Printer Services Interrupt number: 23 Calling statement: CALL PBIOS(IARRAY) Description of parameters: IARRAY is an integer array of size 3, type INTEGER*2 and defined as: IAH, IAL, IDX. These parameters contain the contents of the 8086/80286 registers AH, AL and DX. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to or less than 16 bits wide. Example program: PRMESS E. SBIOS Module function: General Access to BIOS Serial Port Services Interrupt number: 20 Calling statement: CALL SBIOS(IARRAY) Description of parameters: IARRAY is an integer array of size 3, type INTEGER*2 and defined as: IAH, IAL, IDX. These parameters contain the contents of the 8086/80286 registers AH, AL and DX. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to or less than 16 bits. Example program: SDMESS F. TBIOS Module function: General Access to BIOS Time Services Interrupt number: 26 Calling statement: CALL TBIOS(IARRAY) Description of parameters: IARRAY is an integer array of size 6, type INTEGER*2 and defined as: IAH, IAL, ICH, ICL, IDH, IDL. These parameters contain the contents of the 8086/80286 registers AH, AL, CH, CL, DH and DL. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to 8 bits wide. Example program: STIMER.FOR G. DBIOS Module function: General Access to BIOS Diskette Services Interrupt number: 19 Calling statement: CALL DBIOS(IARRAY,IES,IBX) Description of parameters: IARRAY is an integer array of size 7, type INTEGER*2 and defined as: IAH, IAL, ICH, ICL, IDH, IDL, ICF. IAH, IAL, ICH, ICL, IDH, IDL contain the contents of the 8086/80286 registers AH, AL, CH, CL, DH and DL. ICF contains the contents of the Carry flag. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to or less than 8 bits wide. IES, IBX are INTEGER*2 and their values are loaded to registers ES, BX in the interface module. Example program: RFAT.FOR H. MBIOS Module function: Access to BIOS Print Screen, Equipment List, Memory Service, Cassette Tape/Joystick, Switch to BASIC and Reboot Services. WARNING: Although the module does what it is supposed to do, some things may not be possible to do from within FORTRAN (ie. return to BASIC). Interrupt numbers: 5, 17, 18, 21, 24, 25 Calling statement: CALL MBIOS(IARRAY) Description of parameters: IARRAY is an integer array of size 15, type INTEGER*2 and defined as: IRQ, IAH, IAL, IBH, IBL, ICH, ICL, IDH, IDL, IDS, IES, ISI, IDI, IZF, ICF. IRQ is the interrupt number. IAH, IAL, IBH, IBL, ICH, ICL, IDH, IDL, IDS, IES, ISI, IDI contain the contents of the 8086/80286 registers AH, AL, BH, BL, CH, CL, DH, DL, DS, ES, SI and DI. IZF, ICF contain the contents of the Zero and Carry flags. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to or less than 16 bits wide. Example program: TMBIOS.FOR 3. FORTRAN-I/O INTERFACE MODULES A. INPUT Module function: Input from I/O Ports Calling statement: CALL INPUT(IAL,IDX) Description of parameters: IAL and IDX are type INTEGER*2 and contain the values in registers AL and DX. IAL returns the byte value input from the port whose number is in IDX. Example program: SOUND.FOR B. OUTPUT Module function: Output to I/O Ports Calling statement: CALL OUTPUT(IAL,IDX) Description of parameters: IAL and IDX are type INTEGER*2 and contain the values in registers AL and DX. IAL contains the byte value to be output to the port whose number is in IDX. Example program: SOUND.FOR 4. FORTRAN-MOUSE INTERFACE MODULE MOUSDR Module function: Access the Mouse Driver MOUSE.COM Interrupt number: 51 Calling statement: CALL MOUSDR(IARRAY) Description of parameters: IARRAY is an integer array of size 4, type INTEGER*2 and defined as: IAX, IBX, ICX, IDX. These parameters contain the contents of the 8086/80286 registers AX, BX, CX and DX. Note that IARRAY is defined as INTEGER*2, and so it covers the individual registers which are equal to 16 bits wide. Example program: TMOUSE.FOR, RMOUSE.FOR 5. FORTRAN-HARDWARE INTERFACE MODULES A. MXFER Module function: Inter-Memory Data Transfer Calling statement: CALL MXFER(ISEG1,IOFF1,ISEG2,IOFF2,NBYT) Description of parameters: Data in memory at Segment:Offset ISEG1:IOFF1, NBYT bytes long (NBYT should be even), is copied to memory at Segment:Offset ISEG2:IOFF2. ISEG1 and ISEG2 are INTEGER*4, all others are INTEGER*2. Example program: PEKPOK.FOR, VPP.FOR B. MXFER1 Module function: Inter-Memory Data Transfer Calling statement: CALL MXFER1(IOP,IARRAY,ISEG,IOFF,NBYT) Description of parameters: NBYT bytes of data in array IARRAY is copied to (IOP=0) or copied from (IOP=1) memory at Segment:Offset ISEG:IOFF. ISEG is INTEGER*4, all others INTEGER*2. NBYT should be even. Example program: PEKPOK.FOR, VPP.FOR C. MCLR Module function: Memory Clear Calling statement: CALL MCLR(ISEG,IOFF,NBYT) Description of parameters: NBYT bytes of memory at Segment:Offset ISEG:IOFF is cleared (set to 0). ISEG should be INTEGER*4, others INTEGER*2. NBYT should be even. Example program: PEKPOK.FOR, VPP.FOR 6. MISCELLANEOUS MODULES A. GETADR Module function: Get Variable Address Calling statement: CALL GETADR(VAR,ISEG,IOFF) Description of parameters: Upon return ISEG, IOFF contain the address (Segment:Offset) of variable VAR. ISEG should be INTEGER*4, others INTEGER*2. Example program: PEKPOK.FOR, VPP.FOR B. GETCAD Module function: Get Character Variable Address Calling statement: CALL GETCAD(CVAR,ISEG,IOFF) Description of parameters: Upon return ISEG, IOFF contain the address (Segment:Offset) of character variable CVAR. ISEG should be INTEGER*4, others INTEGER*2. Example program: RFAT.FOR C. SLOGIC Module function: Logical Operations, AND, OR, XOR, NOT Calling statement: CALL SLOGIC(IOP,IARG1,IARG2,IARG3) Description of parameters: IARG1 equals IARG2.AND.IARG3 (IOP=1), or IARG2.OR.IARG3 (IOP=2), or IARG2.XOR.IARG3 (IOP=3), or NOT(IARG2). All parameters are INTEGER*2. Example program: TSLOG.FOR, STIMER.FOR D. RAN Module function: Random Number Generator, functionally equivalent to that found in VAX/VMS minicomputers. Calling statement: X=RAN(ISEED) Description of parameters: X is a real number (0.0 to 1.0). ISEED is the seed, INTEGER*4. Example program: TRAN.FOR E. SDRAN Module function: Used internally by RAN to update the seed Calling statement: CALL SDRAN(ISEED) Description of parameters: ISEED is the seed, INTEGER*4 F. RANDU Module function: Random number generator (yes, it is functionally equivalent to the classic RANDU). Calling statement: CALL RANDU(X,ISEED) Description of parameters: X is a real number (0.0 to 1.0). ISEED is the seed, INTEGER*4. Example program: TRANDU.FOR G. SDRDU Module function: Used internally by RANDU to update the seed Calling statement: CALL SDRDU(ISEED) Description of parameters: ISEED is the seed, INTEGER*4 IV. REFERENCE BOOKS 1. Peter Norton, 'PROGRAMMER'S GUIDE TO THE IBM PC AND PS/2', Microsoft Press, 1985, 1988. 2. Ray Duncan, 'ADVANCED MSDOS PROGRAMMING', Microsoft Press, 1986. 3. Terry R. Dettmann, 'DOS PROGRAMMER'S REFERENCE',QUE,1988. 4. Richard Wilton, 'PROGRAMMER'S GUIDE TO PC & PS/2 VIDEO SYSTEMS', Microsoft Press, 1987.