TweetFollow Us on Twitter

MacFORTRAN 3.2
Volume Number:9
Issue Number:7
Column Tag:Jörg's Folder

Absoft MacFORTRAN 3.2

An interface to match the quality of its code optimizer

By Jörg Langowski, MacTech Magazine Regular Contributing Author

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

Those of you who have followed this column may have noticed that there are two major Fortran compilers for the Macintosh available: Absoft and Language Systems Fortran. And, for a long time, the main difference between the two products was that Absoft offered better performance - for typical programs, the code executed of the order of 25-40% faster than Language Systems, depending on the program and on the machine. Language Systems, on the other hand, had by far the superior Macintosh user interface, with easy assignment of subroutines to menu items, with Apple Events support and Publish/Subscribe possibilities. Absoft’s Macintosh support was only very rudimentary compared to that.

Well, some weeks ago I received an evaluation copy of MacFortran 3.2 by Absoft, and I must say that the situation has completely changed. Here is a version of MacFortran that finally comes with a Macintosh interface that matches the undeniable quality of Absoft’s code optimizer It is like someone at Absoft has read my columns (really! I’m flattered!) and incorporated each and every suggestion how to improve their Macintosh support, and then some. Of course, the general quality of the compiler and the performance of the code generated has not changed. So in this column I’d like to present you the main features of Absoft’s MRWE (MacFortran Runtime Window Environment), and show you an example program that uses them.

The MacFortran runtime window environment

Absoft’s MRWE is a library of Fortran routines that is usually linked into an application, unless you decide to build an MPW tool or create your own application framework around an event loop. At first glance, the new MRWE offers about the same possibilities as Language System’s runtime environment: one can associate a subroutine pointer to a menu item, and when the item is selected, the subroutine is executed; one can use the standard file dialog for opening a file, by specifying an empty filename string in the OPEN statement; the output window is a scrollable Text Edit window, fonts and font sizes can be changed and the text saved to a file. An application generated using MRWE will be Apple Event aware; you can easily add handlers for your own Apple Events, and send those events out. You can also open a file and publish it to other applications that support the subscribe/publish mechanism of System 7.

But Absoft has gone farther, and added features that the LS Fortran runtime package does not support (not yet - but we can be sure that they won’t be sleeping either. I am curious about their next upgrade ). One very important new addition is the possibility to assign an input/output window to any Fortran file unit - thus you can have multiple I/O windows, all scrollable and with custom font settings, and with the text saved to a file. The way to do this is simply to use OPEN (unit, ACCESS=’window’, ), and the window title will be the filename given in the OPEN statement. Up to 32 windows can be opened simultaneously this way, which gives you ample opportunity to confuse the user.

The OPEN statement is also used for implementing the publish/subscribe support. For creating a new edition of a file (which other programs can then subscribe to), you open the file by OPEN (unit, ACTION=’publish’, ); on the other hand, by using OPEN (unit, ACTION= ’subscribe’, ) you may read an edition generated by another program. In both cases, the files will be sequential and typically text files.

Finally, in the OPEN statement one can also define the filetype and creator of the newly opened file (which was already possible in LS Fortran).

A big new issue in Absoft MacFortran is the Apple Event support. This was not included at all in previous versions of MacFortran, and has been implemented now by adding a couple of powerful routines. Other than LS Fortran, where the only event class supported is ‘aevt’, here you may now define the class and the type of the event, and in addition supply two parameters which tell the Apple event sending routine whether there is any additional data to be sent and of what kind, and the data itself. In practice, you set up a call like this:

c          1

iresult=mrwe_SendAE(target,class,eventID,extraKind,extraInfo)   

where target is a character expression specifying the application receiving the event, which may be specified by its name, its creator ID or selected by the PPC browser; it can be the calling program itself, or one can just have the event sent to the target that the last event was sent to. extraKind may be 0, 1, or 2; 0 means there is no extra data, 1 means extraInfo specifies a document name (e.g., to be opened), and 2 specifies an arbitrary character string in extraInfo. This Apple Event sending routine gives you therefore the possibility to exchange data (e.g., between Fortran programs using any arbitrary event class and type), without all the contortions that I had to go through when I wrote the first example routines for arbitrary Apple Event support in LS Fortran (see V8#2, June 1992). Again, I wouldn’t bet my life on it, but I’m pretty sure that Language Systems won’t hesitate to follow up with an extension to their Fortran that implements Apple Events support in a more general way.

Handlers for Apple Events that your application wants to receive are installed through a routine mrwe_AddAppleEvent(class,eventID,extraKind,extraInfo), where the parameters have the same meaning as in the Send routine. Finally, together with the Apple Event support you also get a routine that allows you to launch another program, or put your own application in the foreground when it needs attention. Very useful.

Distributed processing shell

When I browsed through the examples that come with MacFortran, I came across a folder called ‘DPShell’; I looked at some files inside, and voila! there was a complete set of shell applications that implemented exactly the type of Apple Event based ‘distributed processing’ mechanism proposed in my V8#2 column! Seems like someone at Absoft is really reading us, thank you. In essence, you have here a small application that can turn in the background on different Macs on a network and accept small tasks when the machine is not used too much, and send the result back to a parent application that turns on another machine. The whole housekeeping task, that is to keep track of which requests were sent out to which machine, and which results have come back in, is implemented in the DPShell; it is up to you to fill this shell with some useful code. Lacking the time, I have not exploited this tool, but it makes a very valuable addition to the examples and will prove useful for anyone who wants to implement parallel processing on a Macintosh network.

Menu support

Adding new menus and items to existing ones is implemented similarly to the way LS Fortran does it; you write for example

c          2

iresult=mrwe_AddMenu(‘Display’,’List Data/L’,list_data)

which will add to the menu ‘Display’ the item ‘List Data’ with the keyboard equivalent -L, and call the routine list_data when the item is selected. In addition, you may remove any item from a menu, and by removing all the items, the whole menu is deleted. You are not restricted to your custom menus, but may also manipulate the standard File and Edit menus this way. When a menu response routine is called, a parameter is passed that contains the menu and item IDs; this way you can use the same response routine for different menu items and distinguish inside the routine from where it was called.

Full source for MRWE

I can’t give you a description of all the routines included in MRWE here. The points discussed up to here show you the main new features and important differences with the main competitor, LS Fortran. One last thing has to be said, however: you get the full source code for all the routines in the MRWE. That way, you can see exactly how they work (they are very well documented and easy to read), modify them if you need it, and swat that last bug that every good piece of software has although I still have to find it.

Documentation

Absoft’s documentation has evolved quite a bit over the last version changes, and to my opinion it is now every bit as good as Language System’s. Differences between the two manuals are in style rather than in quality, both of them are easy to use and you find what you’re looking for (although I found no entry for Publish/Subscribe, or the Edition manager, in the Absoft index). As said, the documentation inside the source code for the Macintosh runtime environment is excellent, and so is the description of the distributed processing shell.

Compatibility libraries

Porting programs from other machines to Absoft Fortran is now very easy. Not only is VAX code now compiled without any compatibility problems (i.e., the compiler now accepts program text with parts in VAX tab-delimited format and other parts in ANSI format), but there are also compatibility libraries that implement a few VAX system calls such as date, ran, time, and a lot of UNIX system functions, e.g., malloc, qsort, rename and others.

There is also a whole set of support libraries for AppMaker, the application prototyper that you’ve read about in earlier issues of this journal. I won’t go into details, because this deserves another column, but you can now create AppMaker application templates for Absoft MacFortran as well.

Debugging

MacFortran’s debugging support is still only possible using SANE. A debugging library like it is included with LS Fortran is unfortunately missing here, and you have to run SANE - or SourceBug - on the side. It would be nice to have some quick and dirty means of tracing variables or displaying the names of routines as they are entered. Anyway, my crashes are usually of the kind where nothing seems suspicious until the machine almost explodes, debugger or not; so I think I’ll have to keep on living with the old method of scattering WRITE statements through my code for debugging.

Summary

With this upgrade, MacFortran has finally treated itself to a comfortable and very powerful Macintosh runtime environment. Compared to LS Fortran it also creates the fastest-running code. So is this a clear winner? In my opinion, I think both systems can have their advantages. For running Fortran code on a Mac with FPU support, I’d prefer Absoft 3.2 with its faster speed and its - at the moment - superior Macintosh interface. For lots of inter-language calling, LS Fortran may be offering a performance advantage because it supports the Macintosh register-saving conventions by default. If you want your program to run on a machine without an FPU (LC, Classic II, Centris 610), you’ll need LS Fortran unless the machine has an INIT installed that emulates the FPU instructions (such an INIT exists).

Example

Before we end this column, let me briefly explain this month’s example. It shows how to use the Absoft Macintosh runtime routines in a Fortran program that reads a file with (x,y) data pairs and creates an edition out of it that can be subscribed to by Excel. Also, you can set some parameters through a dialog and create a theoretical curve that is also published, and Excel can subscribe to it.

Here we go: The main program sets some parameters, adds a custom menu with menu items and corresponding routine references, and drops into the Macintosh runtime environment. The first routine, Read_Data, opens a file using the SF dialog, and then calls a Lister routine that lists the contents of the file to a second output window, and publishes the (x,y) data pairs into an edition file ‘data.ed’. I have not provided any safety for bad number formats in the input file, so make sure this file looks correct. An example, ‘data1’, is included in the source code.

Draw_Curve will read the data pairs from the edition file ‘data.ed’ and use the x values to calculate ‘theoretical’ y-values through a function defined by three parameters a, b, c. The theoretical (x,y) data pairs are then published into a ‘curve.ed’ edition file.

Set_Pars, finally, puts up a modal dialog in which you can enter the three parameter values. They are converted from strings to real numbers using the Fortran ‘internal file’ READ statement. In this routine you find examples how to call toolbox routines from Absoft Fortran, where some parameters have to be passed by value.

The DLOG and DITL resources (ID=2000) are contained in a separate resource file (‘display.rsrc’ on the source code disk), which has to be merged into the compiled and linked application by using the MPW Rez tool or ResEdit.

Also included in the source code are two edition files ‘data.ed’ and ‘curve.ed’, and an Excel worksheet and a graph which subscribe to these edition files. Happy hacking; I hope you find the new Absoft MacFortran environment as useful as I have found it.

Example: Fortran program using ABsoft’s Macintosh Runtime Window Environment

 GLOBAL DEFINE
 INCLUDE 'Events.inc'
 INCLUDE 'Quickdraw.inc'
 INCLUDE 'OSUtils.inc'
 INCLUDE 'Sound.inc'
 INCLUDE 'Resources.inc'
 INCLUDE 'Files.inc'
 INCLUDE 'Windows.inc'
 INCLUDE 'Dialogs.inc'
 INCLUDE 'MRWE.inc'

 EXTERNAL Read_Data
 EXTERNAL Draw_Curve
 EXTERNAL Set_Pars
 EXTERNAL Idle
 EXTERNAL Goodbye
 RECORD /Str255/  mrwe_PasSTR
 EXTERNAL mrwe_PasSTR
      END

 program display
 
creads data (x,y) from file and displays it
csuperimposes theoretical curve whose parameters 
care entered into a dialog box
c
cf(x) = a + b*exp(-c*x)
c
cJ. Langowski/MacTutor May 1993
c
 implicit none
 integer*4 ReadID, DrawID, ParsID
cinteger*4 AEresult

 INTEGER*4 window, unit
 COMMON /flags/ window,unit
 data unit /10/ ! initial unit # of windows to be opened

 ! note which window was in front at startup
 window = FrontWindow()
 
 ! move main window with Toolbox calls
 call MoveWindow(VAL4(window),
 1 VAL2(20),VAL2(50),VAL2(0))
 call SizeWindow(VAL4(window),
 1 VAL2(300),VAL2(200),VAL2(-1))
 
 ! Set up the menus
 ReadID  = mrwe_AddMenu('Display',
 1 'Read Data /R', Read_Data)
 DrawID  = mrwe_AddMenu('Display', 
 1 'Draw curve/D', Draw_Curve)
 ParsID  = mrwe_AddMenu('Display', 
 1 'Set Params/O', Set_Pars)
 
 write (*,*) 'Hello World'
 
 ! Pass control to MRWE "forever" (or until told to quit)
 
 CALL mrwe_EventLoop(0,0) ! should never return
 
 END
 

 integer function Read_Data(itemID)
 IMPLICIT NONE
 CHARACTER filename*256
 INTEGER*4 status, Lister
 OPEN(1, FILE='', FILETYPE='TEXT',ACTION='READ',
 1 IOSTAT=status, STATUS='OLD')
 IF (status == 0) THEN
   INQUIRE (1, NAME=filename)
   Read_Data = Lister(TRIM(filename))
 ELSE
          Read_Data = status
 END IF
 
 return
 end

! List a file with line numbers + open publisher

 INTEGER*4 FUNCTION Lister(filename)
 IMPLICIT NONE
 CHARACTER*(*) filename
 CHARACTER*132 line
 INTEGER*4 status, num
 real x,y
 
 OPEN(2, FILE=TRIM(filename)//' Listing', 
 1 ACCESS='WINDOW,200,300,50,20',
 2 STATUS='UNKNOWN')
 WRITE(2,10) TRIM(filename)
 
 open (3, FILE='data.ed',ACTION='PUBLISH',
 1 STATUS='UNKNOWN')
 
 num = 0
 DO
   READ (1,20,IOSTAT=status) line
          IF (status <> 0) EXIT
          num = num + 1
          WRITE(2,30) num, TRIM(line)
   read (line,*) x,y
   write(3,35) x,char(9),y
 END DO
 close(3)

 WRITE(2,40)
 READ(2,*)
 CLOSE(2)
 Lister=0
 return
 
 10FORMAT ('*** Listing and publishing: "', a, '" ***', //)
 20FORMAT (a)
 30FORMAT (i4.4, ': ', a)
 35format (1xg15.5,1a,g15.5)
 40FORMAT (//,'*** End of listing ***',
 1 /,'To close window, press return')
 END

 integer function Draw_Curve(itemID)
 implicit none
 integer status
 real a,b,c,x,y
 common /params/ a,b,c
 
 open (2, FILE='data.ed',ACTION='READ',
 1 STATUS='OLD')
 open (3, FILE='curve.ed',ACTION='PUBLISH',
 1 STATUS='UNKNOWN')
 
 DO
   READ (2,*,IOSTAT=status) x,y
          IF (status <> 0) EXIT
   y = a*exp(-b*x) + c
 WRITE(3,35) x,char(9),y
 END DO
 
 close(2)
 close(3)
 
 Draw_Curve = 0
 return
 
35 format (1xg15.5,1a,g15.5)
 end
 

 integer function Set_Pars(itemID)
 implicit none
 real a,b,c
 common /params/ a,b,c
 
 integer*2 paramsDLOG,atext,btext,ctext
 parameter(paramsDLOG=2000,
 1 atext=3,btext=4,ctext=5)

 INTEGER*4 savePort

 ! Dialog variables

 INTEGER*4    theDialog,itemType,hItem,Box
 INTEGER*2    itemHit
 RECORD /Str255/     itemaText,itembText,itemcText


 CALL GetPort(savePort)
 theDialog = GetNewDialog(VAL2(paramsDLOG),
 1 VAL4(0),VAL4(-1))
 CALL SetPort(VAL4(theDialog))
 itemHit = 0
 
 DO 
    CALL ModalDialog(VAL4(0), itemHit)
    select case  (itemHit)
   case (ok)
 CALL GetDItem(VAL4(theDialog),
 1 VAL2(btext),itemType,hItem,Box)
 CALL GetIText(VAL4(hItem),itembText)
 CALL GetDItem(VAL4(theDialog),
 1 VAL2(ctext),itemType,hItem,Box)
 CALL GetIText(VAL4(hItem),itemcText)
 CALL GetDItem(VAL4(theDialog),
 1 VAL2(atext),itemType,hItem,Box)
 CALL GetIText(VAL4(hItem),itemaText)
 
 read (itemaText.chars(1:INT(itemaText.len)),*) a
 read (itembText.chars(1:INT(itembText.len)),*) b
 read (itemcText.chars(1:INT(itemcText.len)),*) c
 exit
 case (cancel)
 exit
 case default
    end select
 END DO
 
 CALL DisposDialog(VAL4(theDialog))

 CALL SetPort(VAL4(savePort))
 Set_Pars = 0
 
 write (*,*) a,b,c

 return
 end

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Paragraphs 1.0.1 - Writing tool just for...
Paragraphs is an app just for writers. It was built for one thing and one thing only: writing. It gives you everything you need to create brilliant prose and does away with the rest. Everything in... Read more
BlueStacks App Player 0.9.21 - Run Andro...
BlueStacks App Player lets you run your Android apps fast and fullscreen on your Mac. Version 0.9.21: Note: Now requires OS X 10.8 or later running on a 64-bit Intel processor. Initial stable... Read more
Apple iTunes 12.2 - Play Apple Music...
Apple iTunes lets you organize and stream Apple Music, download and watch video and listen to Podcasts. It can automatically download new music, app, and book purchases across all your devices and... Read more
Apple Security Update 2015-005 - For OS...
Apple Security Update 2015-005 is recommended for all users and improves the security of OS X. For detailed information about the security content of this update, please visit: http://support.apple.... Read more
Apple HP Printer Drivers 3.1 - For OS X...
Apple HP Printer Drivers includes the latest HP printing and scanning software for OS X Lion or later. For information about supported printer models, see this page. Version 3.1: The latest printing... Read more
Epson Printer Drivers 3.1 - For OS X 10....
Epson Printer Drivers installs the latest software for your EPSON printer or scanner for OS X Yosemite, OS X Mavericks, OS X Mountain Lion, and OS X Lion. For more information about printing and... Read more
Xcode 6.4 - Integrated development envir...
Xcode provides everything developers need to create great applications for Mac, iPhone, and iPad. Xcode brings user interface design, coding, testing, and debugging into a united workflow. The Xcode... Read more
OS X Yosemite 10.10.4 - Apple's lat...
OS X Yosemite is Apple's newest operating system for Mac. An elegant design that feels entirely fresh, yet inherently familiar. The apps you use every day, enhanced with new features. And a... Read more
Dash 3.0.2 - Instant search and offline...
Dash is an API Documentation Browser and Code Snippet Manager. Dash helps you store snippets of code, as well as instantly search and browse documentation for almost any API you might use (for a full... Read more
FontExplorer X Pro 5.0 - Font management...
FontExplorer X Pro is optimized for professional use; it's the solution that gives you the power you need to manage all your fonts. Now you can more easily manage, activate and organize your... Read more

Heroki (Games)
Heroki 1.0 Device: iOS Universal Category: Games Price: $7.99, Version: 1.0 (iTunes) Description: CLEAR THE SKIES FOR A NEW HERO!The peaceful sky village of Levantia is in danger! The dastardly Dr. N. Forchin and his accomplice,... | Read more »
Hands-On With Raceline CC
Set for release soon, Rebellion’s motorbike racing game, Raceline CC certainly looks stylish. But how does it play? I got my hands on a preview build to answer exactly that. | Read more »
Siegefall - Tips, Tricks, and Strategies...
So, you fancy establishing a base and ruling the world again. Siegefall is a convenient place to do that, but how about some great tips and tricks on how best to go about it? Here are a few ideas on how to get ahead as a beginner to this medieval... | Read more »
The WWE Comes to Racing Rivals - Because...
Racing Rivals is a racing game that's all about, well, rivalry. And who knows rivalry better than WWE superstars (shhhh, that was rhetorical)? [Read more] | Read more »
Hey, Who Put Apple Music in My SoundHoun...
One of the App Store's popular music discovery sources - SoundHound - has already been updated to include Apple's own music discovery source - Apple Music. That was fast! [Read more] | Read more »
Arcane Legends has a New Expansion Calle...
Arcane Legends has been going strong since it debuted at the tail end of 2012. So well, in fact, that it's already up to its sixth expansion. [Read more] | Read more »
Vector 2 is Officially a Thing and it...
Vector is a pretty cool parkour-driven runner that's gotten a pretty decent following since it first came out - although personally I think more people could stand to show it some love. Anyway, Nekki has announced that a sequel isofficially on its... | Read more »
Get Ready to Trucksform and Roll Out (an...
It looks like NuOxygen is bringing the truck-transforming racer Trucksform (get it?) to iOS in a couple of weeks. Although really it's more of an auto-driver than a racer. But still, transforming trucks! [Read more] | Read more »
This Week at 148Apps:June 22-26, 2015
June's Summer Journey Continues With 148Apps How do you know what apps are worth your time and money? Just look to the review team at 148Apps. We sort through the chaos and find the apps you're looking for. The ones we love become Editor’s Choice,... | Read more »
LEGO® Minifigures Online (Games)
LEGO® Minifigures Online 1.0.1 Device: iOS iPhone Category: Games Price: $4.99, Version: 1.0.1 (iTunes) Description: | Read more »

Price Scanner via MacPrices.net

Logo Pop Free Vector Logo Design App For OS X...
128bit Technologies has released of Logo Pop Free 1.2 for Mac OS X, a vector based, full-fledged, logo design app available exclusively on the Mac App Store for the agreeable price of absolutely free... Read more
21-inch 1.4GHz iMac on sale for $999, save $1...
B&H Photo has new 21″ 1.4GHz iMac on sale for $999 including free shipping plus NY sales tax only. Their price is $100 off MSRP. Best Buy has the 21″ 1.4GHz iMac on sale for $999.99 on their... Read more
16GB iPad mini 3 on sale for $339, save $60
B&H Photo has the 16GB iPad mini 3 WiFi on sale for $339 including free shipping plus NY tax only. Their price is $60 off MSRP. Read more
Save up to $40 on iPad Air 2, NY tax only, fr...
B&H Photo has iPad Air 2s on sale for up to $40 off MSRP including free shipping plus NY sales tax only: - 16GB iPad Air 2 WiFi: $489 $10 off - 64GB iPad Air 2 WiFi: $559 $40 off - 128GB iPad Air... Read more
Apple Releases OS X 10.10.4 With WIFi Fix, iO...
On Tuesday, Apple released final versions of OS X 10.10.4 and iOS 8.4, as well as updates for the Safari browser for OS X Yosemite, Mavericks, and Mountain Lion. The OS X 10.10.4 update focuses on... Read more
Dual-Band High-Gain Antennas for Home Wi-Fi N...
Linksys has announced what it claims are the first dual-band, omni-directional high-gain antennas for the consumer market. The new Linksys high-gain antennas available in a 2- and 4-pack (WRT004ANT... Read more
Apple refurbished 2014 15-inch Retina MacBook...
The Apple Store has Apple Certified Refurbished 2014 15″ 2.2GHz Retina MacBook Pros available for $1609, $390 off original MSRP. Apple’s one-year warranty is included, and shipping is free. They have... Read more
Clearance 2014 MacBook Airs available for up...
Adorama has 2014 MacBook Airs on sale for up to $301 off original MSRP including NY + NJ sales tax and free shipping: - 11″ 256GB MacBook Air: $798 $301 off original MSRP - 13″ 128GB MacBook Air: $... Read more
5K iMacs on sale for $100 off MSRP, free ship...
B&H Photo has the new 27″ 3.3GHz 5K iMac on sale for $1899.99 including free shipping plus NY tax only. Their price is $100 off MSRP. They have the 27″ 3.5GHz 5K iMac on sale for $2199, also $100... Read more
27-inch 3.2GHz iMac on sale for $1679, save $...
B&H Photo has the 27″ 3.2GHz iMac on sale for $1679.99 including free shipping plus NY sales tax only. Their price is $120 off MSRP. Read more

Jobs Board

Senior Payments Security Manager - *Apple*...
**Job Summary** Apple , Inc. is looking for a highly motivated, innovative and hands-on senior payments security manager to join the Apple Pay security team. You will Read more
Project Manager - *Apple* Pay Security - Ap...
**Job Summary** The Apple Pay Security team is seeking a highly organized, results-driven Project Manager to drive the development of Apple Pay Security. If you are Read more
Web Developer, *Apple* Online Store Innovat...
**Job Summary** The Apple Online Store Innovation Lab team is seeking a talented individual with strong web development and design skills to prototype future Apple Read more
*Apple* TV Live Streaming Frameworks Test En...
**Job Summary** Work and contribute towards the engineering of Apple 's state-of-the-art products involving video, audio, and graphics in Interactive Media Group (IMG) at Read more
Project Manager, WW *Apple* Fulfillment Ope...
…a senior project manager / business analyst to work within our Worldwide Apple Fulfillment Operations and the Business Process Re-engineering team. This role will work Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.