TweetFollow Us on Twitter

Eject the Disk
Volume Number:1
Issue Number:12
Column Tag:Basic School

Building A Library Routine To Eject The Disk

By Dave Kelly, Hybrids Engineer, MacTutor Editorial Board

This months BASIC column features some of the ins and outs of installing your own 68000 code to your MS BASIC programs. The potential power that this provides is mind boggling. With just a few lines of code you can access some of the other ROM routines that are not provided with MS BASIC 2.0.

First off, if you are not already familiar with the Apple Macintosh 68000 Development System then I suggest that you read through the manual to become familiar with the system. In MacTutor Vol. 1 No. 1 the Assembly Language Lab column provides an overview of the MDS system that will be useful for our discussion in this column. It is not necessary that you know 68000 assembly to enter and compile the BASIC Library we will be installing. I will try to lead you through step by step from the point of view of someone that is not very familiar with the MDS system.

Now before we get into the thick of things we will discuss the BASIC LIBRARY statement. The LIBRARY command is a BASIC reserved word but there is no description of it in the BASIC manual other than a brief mention of it on page 103. This page also refers to some special documentation entitled "Microsoft BASIC for the Macintosh -- Building Machine Language Libraries" (hereafter abbreviated as BMLL) which is available by contacting the Microsoft Consumer Response Department. The BMLL document has all the necessary information required to set up your own machine language library and includes 3 sample libraries: CopyFile, PrintArgs, and AddStrings.

A BASIC Library is a Macintosh resource with one or more named CODE segments. Refer to the Inside Macintosh Programmer's Guide section for the definition of the file structure of a resource file. Other sections of Inside Macintosh will be useful in setting up your own routines.

To open a library file you use the statement LIBRARY <filename string expression>. Up to 5 library files may be opened at the same time. When the Library file is opened BASIC calls the routine LIBinit which must exist in each file. The purpose of LIBinit is to allow a way for you to inform BASIC of the compatability of your library routine with the version of BASIC being used. If the library routine is incompatible or the LIBinit routine does not exist or the handshake with that routine fails, then the library is closed and an "Illegal function call" error is generated. This statement can result in other errors which are described in BMLL.

Once the library has been opened the routines within the library may be called by BASIC with the BASIC statements: <routine name> [argument-list] or by CALL <routine name> [(argument-list)]. More on the CALL statement may be found in your BASIC manual starting on page 101.

Constructing a library resource for BASIC

A library is detatched from BASIC whenever NEW, SYSTEM, RUN, or LIBRARY CLOSE is executed. To close the library, BASIC looks for the routine called LIBterm if present and executes it. The routine LIBterm should release any memory which was allocated from the heap, and close any files which were opened by routines in the library. Unless you need to allocate or deallocate memory you probably won't need to use LIBterm.

A sample source file for LIBinit is given with BMLL, but you'll have to work out your own LIBterm if needed depending on the routine you are writing. The sample LIBinit file demonstrates how the routine can check the BASIC version and see if it is compatible with the routines in the library. This sample checks to see that the binary version of BASIC is being used and tells BASIC if it is not compatible. Also included is an equate file named BASIC.D which defines entry points in BASIC which you should use to communicate with BASIC. For my sample library I have included all applicable equates in my source listing so the equate file will not be needed. You will want to use these routines to allocate memory and read the variable argument lists in the BASIC CALL statement. It is advisable that you obtain BMLL before writing your own routines as there are alot of useful routines that can be used that are part of BASIC. BMLL explains what each routine does and what registers are effected.

Alright, now we'll get right down to business. First we need to create several files with the MDS editor which are to be used by the assembler, linker and resource compiler. The two code segments that we want to create are listed below and should be saved with the file names shown. The LIBinit routine will be installed as the first segment and our routine called Eject will be the second segment. Eject will allow you to eject either the internal or external disk from within your program (under BASIC control). Type in the two routines then save them to disk.

Save this routine as "LIBinit.asm".

;
; LIBinit ROUTINE
;Sample version of LIBinit routine
;
;  REGISTER INFORMATION
;
;  A0 = pointer to a version record containing:
;     2 bytes = version of Basic interpreter (ie 2 for 2.01)
;  2 bytes = revision number of Basic interpreter (01)
;  2 bytes = 0 if decimal math, 1 if IEEE binary format
;2 bytes = compatibility variable of this routine to Basic:
;0 = compatible
;-1= incompatible
;8 bytes = reserved array of four INTEGER values
;
; A4 = pointer to a handle (long word) owned by this library
;Use this as a handle to a static data segment.
; A5 = pointer to the base of the application jump table
; D0 = 0 on exit if this routine is purgeable.

LIBVER_Result  EQU 6 ;offset to version record field
 ;for compatibility. (See above)
 
LIBinit:
 CLR.W  LIBVER_Result(A0)       ;assume compatible 
LIBinitExit:
 MOVEQ  #0,D0
 RTS

Here is the Eject Library source code. Save this file as "Eject.asm".

; BASIC Eject Library Source Code
; By Dave Kelly
; MacTutor 1985

;Synopsis:
;CALL Eject ( VolRefNum )
;Output:
;The specified disk is ejected (not dismounted) from
;the selected drive where VolRefNum may be 0 for the
;default drive, 1 for the internal drive, 2 for the
;external drive.

GetNextLibArg  EQU $2A    ; Basic Lib offset from A5
IntegerArgEQU  $32   ; Basic Lib offset from A5
BasicErrorEQU  $42 ; Basic Lib offset from A5

.TRAP _Eject$A000+23 ;toolbox  trap

Ejectdisk:
 BSR  GetIntegerVar;integer arg in [d3:w]
 CMP.W  #0,d3
 BEQ  Doit;branch if on 0 (default drive)
 CMP.W  #1,d3
 BEQ  Doit;branch if on 1 (internal drive)
 CMP.W  #2,d3
 BEQ  Doit;branch if on 2 (external drive)
UnknownVol:
 MOVEQ  #74,d2   ;Unknown Volume error
 JSR  BasicError(a5) 
Doit: 
 LEA  ParamBlock,a0;get pointer
 MOVE.W d3,22(a0);move drive # to ioVRefNum 
 _Eject 
 RTS  
GetIntegerVar:
 JSR  GetNextLibArg(a5) ;Get the next  ;argument
 JSR  IntegerArg(a5) ;[d3:w] = integer ;(error if arg can't be forced 
 ;into an integer
 RTS

;  local data area
 
ParamBlock:
 DC.L 0 ;ioLinkptr.
 DC.W 0 ;ioType
 DC.W 0 ;ioTrap
 DC.L 0 ;ioCmdAddr
 DC.L 0 ;ioCompletionptr.
 DC.W 0 ;ioResult
 DC.L 0 ;ioFileNameptr.
 DC.W 0 ;ioDrvNum (ioVRefNum)

 END

By the way, the Eject routine shows an example of using the file manager parameter block similar to what has been discussed in a few places in the last few MacTutor issues. Refer to those columns for more information. (ie Vol. 1 number 7 & 8)

Next we need to start a new MDS editor file to create a link file for the linker to use. The link shown below should be typed in and saved as "EjectLib.link". Note that if you are not using the default (startup) disk to save these files, the volume name must also be included with the filename.

;Eject Library Link
;MacTutor 1985

/OUTPUT EjectLib
LIBinit.Rel
<
Eject.Rel
$

Now create one last editor file for the Resource compiler. This file creates the resource file that BASIC will call to use the library. Be sure that each line (including the last one) has a carriage return at the end of the line or all the resources may not be compiled. Save this file as "EjectLib.R"

EjectLib.Rsrc
BLIB
TYPE CODE = GNRL
LIBinit,1
.R
EjectLib CODE 1

TYPE CODE = GNRL
Eject,2
.R
EjectLib CODE 2

Ok, we are now ready to assemble our code segments. Assemble LIBinit.asm and Eject.asm by selecting ASM from the MDS system transfer menu or by double clicking on the assembler if you are running the finder desktop. A standard file dialog box will appear and you can select each file and assemble them one at a time. Two new files containing the assembled code are stored on the disk, LIBinit.Rel and Eject.Rel. These two files will be used by the linker to create a linked application file. Select the LINK application from the transfer menu of the MDS system. Note you may have to push the cancel button from the dialog box to get to the transfer menu. The LINKER will create an application to be used by RMAKER. Don't try to run the EjectLib application as it will BOMB!! It only contains resource code segments and is not a regular application program. After linking, select RMAKER from the transfer menu and use the EjectLib.R file to create the resource file to be used by our BASIC library.

Figure 1 shows the files required and the flow of the above procedures. If you have any problems with this then I recommend that you study the MDS system manual and the BMLL supplement.

To try out the Eject Library routine, type in the Eject Demo program. To call the Eject routine, open the Eject Library and then use CALL Eject (VolRefNum). The VolRefNum is a number for the volume which you want to eject. A "0" will eject the disk in the default drive, a "1" will eject the internal drive and "2" will eject the external drive. For any other VolRefNum the file manager returns a unknown volume name error which could be trapped in your BASIC error trap routine if necessary. By the way, using ResEdit you can move the resource segments from the resource files into your BASIC program file (data file where your program is stored). Then the routine can be called by opening up the library with the filename the same as the program. The program would now be completely transportable as one file.

Installing the routines is the easy part. After trying out the demo routines in the BMLL supplement and the Eject routine your mouth may be watering for some more. Well next time we will take a look at some routines which have been prewritten to attach to your BASIC programs allowing access to over a hundred more ROM routines. They are available from a company called Clear Lake Research, 5353 Dora Street #7, Houston, Texas 77005 (1-800-835-2246 X199). If you've felt that BASIC just didn't have enough access to ROM routines then check this one out.

'Eject Library Demo
'By Dave Kelly
'MacTutor ©1985

'Note: EjectLib.Rsrc must be on default disk
'or you must specify vol name in Library statement
LIBRARY  "EjectLib.Rsrc"
'Set up menus
FOR i=1 TO 5
    MENU i,0,0,""
NEXT i
MENU 1,0,1,"File"
MENU 1,1,1,"Quit"
MENU 2,0,1,"Eject Disk"
MENU 2,1,1,"Eject Default Disk"
MENU 2,2,1,"Eject Internal Disk"
MENU 2,3,1,"Eject External Disk"

ON MENU GOSUB Menucheck:MENU ON
pause:GOTO pause

Menucheck:
    menunumber = MENU(0)
    menuitem=MENU(1):MENU
    IF menunumber = 1 THEN filemenu
    IF menunumber <>2 THEN RETURN
    IF menuitem = 1 THEN vol= 0
    IF menuitem = 2 THEN vol = 1
    IF menuitem = 3 THEN vol = 2
    CALL Eject (vol)
    RETURN
    
filemenu:
    IF menuitem <> 1 THEN RETURN
    MENU RESET:LIBRARY CLOSE:END

Thanks go to Robert Millis for sending us an improvement to the Cursor Editor routine in the August '85 issue. Due to editorial deadlines it is not possible to streamline all the code used in each issue for maximum efficiency. We do try to make sure that each and every program works. Keep in mind also that the code for most of the columns must be edited to fit properly. The programs are run before editing and placed on the source disks which you may order from us. We encourage you to modify and improve our programs. Please feel encouraged to send us any improvements that you have made so that our other readers may also benefit. The following code may replace the getpixel routine in the August Cursor Editor for improved speed and usability of the program:

getpixel: 'For Cursor Editor
    pixel%=256
    xp=MOUSE(1):yp=MOUSE(2)
    IF xp<20 OR xp>196 THEN RETURN
    IF yp<20 OR yp>196 THEN RETURN
    row=INT((yp-20)/11):col = INT((xp-20)/11)
    pixel%=row*16+(15-col)
    RETURN

It should be noted that the same routine was used in the September Paint Pattern Editor with some minor differences. Don't mix them up; they are different. The following code may replace the getpixel routine in Paint Pattern Editor:

getpixel: 'For Paint Pattern Editor
    pixel%=64
    xp=MOUSE(1):yp=MOUSE(2)
    IF xp<20 OR xp>108 THEN RETURN
    IF yp<20 OR yp>108 THEN RETURN
    row=INT((yp-20)/11):col = INT((xp-20)/11)
    pixel%=row*8+(7-col)
    RETURN
 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Adobe Animate CC 2018 18.0.1.115 - Anima...
Animate CC 2018 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous Flash Professional customer). Animate CC 2018 (was Flash CC) lets you... Read more
Postbox 5.0.22 - Powerful and flexible e...
Postbox is a new email application that helps you organize your work life and get stuff done. It has all the elegance and simplicity of Apple Mail, but with more power and flexibility to manage even... Read more
Tunnelblick 3.7.4b - GUI for OpenVPN.
Tunnelblick is a free, open source graphic user interface for OpenVPN on OS X. It provides easy control of OpenVPN client and/or server connections. It comes as a ready-to-use application with all... Read more
Carbon Copy Cloner 5.0.5 - Easy-to-use b...
Carbon Copy Cloner backups are better than ordinary backups. Suppose the unthinkable happens while you're under deadline to finish a project: your Mac is unresponsive and all you hear is an ominous,... Read more
Bartender 3.0.32 - Organize your menu-ba...
Bartender lets you organize your menu-bar apps by hiding them, rearranging them, or moving them to Bartender's Bar. You can display the full menu bar, set options to have menu-bar items show in the... Read more
Adobe Lightroom Classic CC 7.1 - Import,...
Adobe Lightroom is available as part of Adobe Creative Cloud for as little as $9.99/month bundled with Photoshop CC as part of the photography package. Lightroom 6 is also available for purchase as a... Read more
Ortelius 2.0.8 - Vector drawing app espe...
Ortelius is a full-featured vector drawing application especially for map design. Draw directly with features such as roads, rivers, coastlines, buildings, symbols and contours. Ortelius is known for... Read more
Tunnelblick 3.7.4b - GUI for OpenVPN.
Tunnelblick is a free, open source graphic user interface for OpenVPN on OS X. It provides easy control of OpenVPN client and/or server connections. It comes as a ready-to-use application with all... Read more
Carbon Copy Cloner 5.0.5 - Easy-to-use b...
Carbon Copy Cloner backups are better than ordinary backups. Suppose the unthinkable happens while you're under deadline to finish a project: your Mac is unresponsive and all you hear is an ominous,... Read more
Postbox 5.0.22 - Powerful and flexible e...
Postbox is a new email application that helps you organize your work life and get stuff done. It has all the elegance and simplicity of Apple Mail, but with more power and flexibility to manage even... Read more

Latest Forum Discussions

See All

Amazing Katamari Damacy guide - beginner...
Amazing Katamari Damacy brings the bizarro world of the original games to mobile and shifts them into an endless format that's just as addictive as the PlayStation entries. Your goal is still to roll as much random stuff as you possibly can, though... | Read more »
Portal Knights guide - crafting tips and...
In Portal Knights, you're only as strong as the items you have at your disposal. This sandbox adventure is all about crafting and building up the next big thing. Whether you're an avid explorer or collector, crafting will likely play a large part... | Read more »
The best deals on the App Store this wee...
A new week means new discounts on the App Store. This week's deals run the gamut of action-adventure titles, puzzle games, and one of the best narrative adventure series out there. If you're looking to fill out your mobile gaming library on a... | Read more »
What you need to know about Animal Cross...
We hope you've been hard at work on collecting all of those holiday items in Animal Crossing: Pocket Camp, because you're about to get a whole new list of fun things to do as the game receives its first big update sometime soon. There are a lot of... | Read more »
Reigns: Her Majesty guide - how to use e...
Ruling a kingdom isn't easy--doubly so for a queen whose every decision is questioned by the other factions seeking a slice of power. Reigns: Her Majesty builds on the original game's swipey tactics, adding items that you can use to move the story... | Read more »
The best new games we played this week -...
Friday has crept up on us once again, so it's time to honor the best new games we've played over the past few days. This past week was a pretty exciting one, with the debut of lots of beautiful new indies and some familiar faces returning to the... | Read more »
Portal Knights guide- beginner tips and...
Portal Knights is finally making the jump to iOS and Android, and it's already climbing the ranks to become the next big MMO experience on mobile. This sprawling sandbox game will let you pursue any adventure you wish, whether you want to sling... | Read more »
Reigns: Her Majesty guide - how to swipe...
Reigns: Her Majesty is storming the App Store this week, bringing more tinder-esque kingdom building to eager players everywhere. If you've played the original Reigns, you'll know that leading a kingdom is never easy. It's a careful balancing act... | Read more »
Getting Over It (Games)
Getting Over It 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: A game I madeFor a certain kind of person To hurt them. • Climb up an enormous mountain with nothing but a hammer and a pot.•... | Read more »
Reigns: Her Majesty (Games)
Reigns: Her Majesty 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: | Read more »

Price Scanner via MacPrices.net

Apple Watch Series 2, Certified Refurbished,...
Apple has Certified Refurbished Apple Watch Nike+ Series 2s, 42mm Space Gray Aluminum Case with Anthracite/Black Nike Sport Bands, available for $249 (38mm) or $279 (42mm). The 38mm model was out of... Read more
Apple offers Certified Refurbished 2016 12″ R...
Apple has Certified Refurbished 2016 12″ Retina MacBooks available starting at $949. Apple will include a standard one-year warranty with each MacBook, and shipping is free. The following... Read more
B&H drops price on 13″ 256GB MacBook Air...
B&H has the 13″ 1.8GHz/256GB Apple MacBook Air (MQD42LL/A) now on sale for $1079 including free shipping plus NY & NJ sales tax only. Their price is $120 off MSRP, and it’s the lowest price... Read more
Holiday sale: 9″ iPads starting at $299, take...
MacMall has 9″ WiFi iPads on sale for $30 off including free shipping: – 9″ 32GB WiFi iPad: $299 – 9″ 128GB WiFi iPad: $399 Read more
Green Monday deal: 15″ 2.8GHz MacBook Pro on...
B&H Photo has the 15″ 2.8GHz Space Gray MacBook Pro on sale for $250 off MSRP for today only as part of their Green Monday/Holiday sale. Shipping is free, and B&H charges sales tax for NY... Read more
Green Monday sale: B&H offers 12″ Apple i...
B&H Photo has 12″ iPad Pros on sale for up to $150 off MSRP as part of their Green Monday/Holiday sale. Shipping is free, and B&H charges sales tax in NY & NJ only: – 12″ 64GB WiFi iPad... Read more
Holiday deal: 21″ and 27″ Apple iMacs on sale...
MacMall has 2017 21″ and 27″ Apple iMacs on sale for up to $200 off MSRP. Shipping is free: – 21″ 2.3GHz iMac: $999 $100 off MSRP – 21″ 3.0GHz iMac: $1199 $100 off MSRP – 21″ 3.4GHz iMac: $1379 $120... Read more
Holiday deal: Apple Mac minis for up to $150...
MacMall has Mac minis on sale for up to $100 off MSRP, each including free shipping: – 1.4GHz Mac mini: $399 $100 off MSRP – 2.6GHz Mac mini: $599 $100 off MSRP – 2.8GHz Mac mini: $949 $50 off MSRP... Read more
Beats by Dr. Dre – BeatsX Earphones on sale f...
Best Buy has BeatsX Earphones on sale for $109, $40 off, on their online store. Sale price for online orders only. Choose free store pickup, if available, or choose free shipping. Read more
10″ 64GB WiFi Apple iPad Pros on sale for $59...
MacMall has 10.5″ 64GB Apple iPad Pros on sale for $599 including free shipping. That’s $50 off MSRP and among the lowest prices available for these iPads from any Apple reseller. Read more

Jobs Board

QA Automation Engineer, *Apple* Pay - Apple...
# QA Automation Engineer, Apple Pay Job Number: 113202642 Santa Clara Valley, California, United States Posted: 11-Dec-2017 Weekly Hours: 40.00 **Job Summary** At Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description:SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description:SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Information Security - Security Data...
# Apple Information Security - Security Data Analyst Job Number: 113119545 Austin, Texas, United States Posted: 10-Nov-2017 Weekly Hours: 40.00 **Job Summary** This Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.