TweetFollow Us on Twitter

Technical Questions 2.2
Volume Number:2
Issue Number:2
Column Tag:Ask Prof. Mac

Readers Technical Questions

By Steve Brecher, Software Supply, MacTutor Contributing Editor

Prof. Mac depends on your technical questions for inspiration each month. If you have programming problems in your latest project, or are just curious, send your questions to Prof. Mac and let him research your problem.

PICTs from MacDraw

Q. Mike LePage would like to know if a MacDraw PICT file is really a QuickDraw picture; more generally, he asks how to get a MacDraw picture into a PICT resource that his application can use.

A. I really don't know what file format MacDraw uses; its PICT format sure doesn't look like a QuickDraw picture to me, but it may have such pictures buried within it. At any rate, a good way to get a PICT resource from a MacDraw document is to paste the drawing into the Scrapbook; it will be a PICT resource in the Scrapbook file, which can then be moved to your application using Copy/Paste within ResEdit. [Note: ResEdit is available on source code disk #6 for this issue of MacTutor. -Ed.]

Drawing Partial Pictures

Q. Mike LePage also asks, "Suppose I have a giant picture, but want to display only part of it in a window and not have it all scaled down into the window, with the rest able to be scrolled into view. Is there a way of setting the bounds rectangle without creating a bit image of the whole picture first?"

A. What I'd do is pass a bounds rectangle to DrawPicture that was as large as the whole picture. The drawing will be clipped to the window's rectangle, so only the part of the picture that is in the window will actually be drawn, and it will not be scaled down. To scroll, use ScrollRect, and draw the picture again with the boundsrect moved by the size of the scroll.

Simple FilterProc

Q. Mike LePage's third question is, "I have a FilterProc for a modal dialog 'About' box. I don't want any buttons or other controls, so the function will just check for a mousedown and return True on that condition only." Mike wants to know how to code such a FilterProc in assembler.

A. I'd suggest that such a function also return True if Return or Enter is pressed. So, that's the way I've coded it in Figure 1.

Figure 1

;
; Function MyFilter(theDialog: DialogPtr; 
;VAR theEvent: EventRecord; 
;VAR itemHit:  INTEGER): BOOLEAN;
;
; ModalDialog filterProc which returns True if the event is a 
; mousedown or Return or Enter key.
;
 IncludeSysEqu.D
;
;  ASCII codes
CR Equ  13
Enter Equ 3
;
; A6 offsets--
OldA6   Set 0
RtnAddr Set OldA6+4
itemHit Set RtnAddr+4
theEventSet itemHit+4
theDialog Set  theEvent+4
Result  Set theDialog+4
;
MyFilter:
 Link A6,#0 ;set up stack frame
 Move.L theEvent(A6),A0 ;A0 := addr of event record
 Cmp  #MButDwnEvt,(A0)  ;mousedown? 
 ;(note evtCode offset = 0)
; remove following 6 instructions if key events not to be tested
 Beq.S  @0;yes
 Cmp  #KeyDwnEvt,(A0);key down?
 Bne.S  @0;no
 Cmp.B  #CR,evtMessage+3(A0);Return?
 Beq.S  @0;yes
 Cmp.B  #Enter,evtMessage+3(A0) ;Enter?
@0 Seq  Result(A6) ;set result
 Unlk A6
 Move.L (SP)+,A0 ;return address
 Lea  Result-itemHit(SP),SP ;pop arguments
 Jmp  (A0);return

Resources Potpourri

Q. Pascal M. Giordano has a lot of questions about resources, so many that it would take too much space to list them all. So, in this case I'll provide only some answers without the questions!

A. OpenResFile is used to open a resource file and make the resources in it available to your application, typically via GetResource. When your application is launched, its resource fork is automatically opened. So, you only need to use OpenResFile to get at resources in a file other than your application. Some developers like to maintain their non-code resources in a separate resource file while they're working on the program, because code changes are much more frequent than resource changes. Hence, they must use OpenResFile to make those resources available. When the program is ready for release, the resources are included in the application file and the call to OpenResFile is removed. My own approach is to have a separate resource file, but to include the resources in my application file each time I link a test version. This requires a linker which will directly include resources, such as Consulair's Link or Signature Software's McAssembly; MDS Link won't do this (it will only include resources that are in .REL format). That way, I can create or change my resources directly using ResEdit or ReEdit, without a separate resource compiler step.

I very rarely use RMaker. The current version of ResEdit is quite good for creating and editing many kinds of standard resources. I use ReEdit primarily for editing text items in DITLs, since it provides a bigger editing box than ResEdit does for such items. RMaker is a resource compiler that translates textual descriptions of resources into actual resources. In olden days it was the only way to create resources; but as ResEdit matures in its long march to completion it becomes a better and better replacement for RMaker. [Resources can also be coded in assembler and assembled and linked under MDS, as previously mentioned. There is also some new software showing up that allows dialogs and windows to be "designed" on screen with the mouse and then automatically translated into RMaker text file format. A lot more work is needed in this area. -Ed.]

"Signature" is the name for the 4-byte code associated with an application. "Creator" is the name for the analogous code associated with a document. Usually, they are the same code, serving to link the document with it's creating application. Often, "Creator" is used in the sense of "Signature," as when one speaks of "the application's Type and Creator codes."

A BNDL resource is required in any application that is to have a custom icon displayed by the Finder, or in any that creates documents that need to be associated with the application (so that opening the document automatically launches the application).

Building an Editor

Q. Dr. K. Desikachary is developing a multilingual editor to process Indian Languages. He has several questions; again, I'll just imply the questions in my responses.

A. MacWrite file formats are documented in Apple's Technical Notes #11 (MacWrite 2.2) and #12 (MacWrite 4.5). The Technical notes are available by subscription at $20/yr from Apple Computer, 20525 Mariani Ave MS 3-T, Cupertino CA 95014.

I haven't seen any documentation of Microsoft Word file formats.

As far as I know, Apple's Core Edit package is the only text editor building-block available. (Dr. Desikachary would like to find an editing package that he could build on that doesn't have Core Edit's limit of 100 font/style changes in a document.) I haven't seen Core Edit, but I wonder if the limit could be increased by changes to the code. Any reader who can be of help on this may contact Dr. Desikachary at 13 McGregor St., Pinawa, MB ROE 1L0, Canada.

Finding All Files

Q. Bob Perez, author of VMCO (Visual/Vocal MAUG Conferencing program), wants to know how to find a file on an HFS-formatted volume, no matter in what directory the file may be.

A. The FCensus routine in Figure 2 can be used to do this. However, rather than search for a given file, it supplies information about each file, one at a time, to a routine that you supply. If you're looking for a specific file, your routine, when it recognizes a match, can tell FCensus to quit by returning True.

Note, however, that on an HFS volume there can be more than one file having the same name but in different directories. So, searching for a file on an HFS volume and stopping the search when you find the first instance of "the" file is a risky thing to do. Maybe the user really wants you to use another version of the file, with the same name, that's in another directory.

We use the new HFS routine _GetCatInfo, which is like _GetFileInfo except that it returns information for directories as well as files. The parameter block that it returns for files is the same as the GetFileInfo parameter block, except that it's longer -- it has extra information appended to it. (Purists note: GetCatInfo's ioTrap field in the parameter block header is different from GetFileInfo's.)

Figure 2

; 
; FCensus -- HFS/MFS file census routine; provides info on each file
; on a volume, whether MFS or HFS.  If HFS volume, provides info on each 
file
; in each directory.
;
; Procedure FCensus(vRefNum: integer; DirID: longint; Inspector: ProcPtr);
;   
;   vRefNum
;volume reference number (or drive number) of volume.
;   DirID
;ID of directory in which to begin search; pass 2 for root directory. 
 ; The designated directory and all directories below it in the tree 
will 
;be canvassed.  Value passed is immaterial for HFS volumes.
;   Inspector
;The address of a caller-supplied function:
;MyInspector(ParamBlock: ParmBlkPtr; DirID: longint): boolean;
;ParamBlock is the address of a GetFileInfo parameter block for a
;file on the volume.  DirID is the ID of the file's directory (if the
;volume is an MFS volume, DirID is whatever was passed to FCensus).
;If the Inspector function returns True, FCensus will return
;immediately; otherwise FCensus will continue canvassing (continue
;to call MyInspector) until all files have been processed.
;NOTE:  after FCensus returns neither the parameter block, nor the
;the filename string pointed to by its ioFileName parameter, exists.
;
; The census is depth-first, i.e., directories within directory X are
; canvassed before other directories within X's parent directory.  Within 
a
; directory, files are accessed in alphabetic order; then directories 
within
; that directory are accessed in reverse alphabetic order.

 IncludeMacTraps.D
 IncludeSysEqu.D
 IncludeSysErr.Txt
;
; not provided in pre-HFS SysEqu/MacTraps:
;
ioDirID Equ 48
ioHFQElSize Equ  $6C
ioDirFlgEqu 4
FSFCBLenEqu $3F6 ;addr of sys global, positive if HFS running
 .Trap  _HFSDispatch $A260
 Macro  _GetCatInfo =
 MoveQ  #9,D0    ;selector
 _HFSDispatch
 |
; A6 offsets--
OldA6 Set 0
RtnAddr Set OldA6+4
Inspec  Set RtnAddr+4
DirID Set Inspec+4
vRefNum Set DirID+4
ArgsSz  Set vRefNum+2-Inspec
;
ParmBlk Set OldA6-ioHFQElSize ;local parameter block
NameStr Set ParmBlk-256   ;local filename string buffer
Index Set NameStr-2;index in current directory
FCensus:
 Link A6,#Index
 Clr.L  -(SP)    ;sentinel for end of DirID list
NextDir:
 Clr  Index(A6)  ;init index
NextFile:
 Lea  ParmBlk(A6),A0 ;pointer to param block
 Move vRefNum(A6),ioVRefNum(A0)
 Move.L DirID(A6),ioDirID(A0)
 Lea  NameStr(A6),A1
 Move.L A1,ioFileName(A0)
 AddQ #1,Index(A6) ;bump index for _GetCat/FileInfo
 Move Index(A6),ioFDirIndex(A0)
 Tst  FSFCBLen   ;HFS running?
 Bmi.S  @0
 _GetCatInfo;yes
 Bra.S  @1
@0 _GetFileInfo  ;no
@1 Beq.SNodeKind ;no error
 Cmp  #fnfErr,D0 ;end of current directory?
 Bne.S  FCExit   ;no,  an unexpected problem
 Move.L (SP)+,DirID(A6)   ;ID of dir to search next
 Bne.S  NextDir  ;go look at first file/dir in new dir
 Bra.S  FCExit   ;no more directories, all done
NodeKind:
 Btst #ioDirFlg,ioFlAttrib(A0)   ;is this a directory or a file?
 Beq.S  CallInspec ;a file
 Move.L ioDirID(A0),-(SP) ;a directory, push on search list
 Bra.S  NextFile ;and loop back
CallInspec:
 Clr  -(SP) ;space for user function result
 Pea  ParmBlk(A6); param block ptr to user func.
 Move.L DirID(A6),-(SP)   ;pass DirID
 Move.L Inspec(A6),A0;address of user function
 Jsr  (A0);call user function
 Tst.B  (SP)+    ;user wants us to quit now?
 Beq.S  NextFile ;no, keep going
FCExit:
 Unlk A6
 Move.L (SP)+,A0 ;return addr
 Lea  ArgsSz(SP),SP;pop arguments
 Jmp  (A0);return

"SetSound" Code Bumming

Some CompuServe MAUG members were asking for a desk accessory that would let them change the Mac's sound volume with less memory overhead than required by the Control Panel. Sysop Bill Steinberg obliged by whipping out a "SetSound" DA. This was Bill's first DA, so he started with Bill Bond's and Chris Allen's DA Shell from the October, 1985 issue of MacUser magazine, and added the SetSound functional guts. When he'd finished, he asked me if I'd like a copy of his source code (Bill has always been generous about sharing source code with me). I said sure, and, knowing that small size was one of the objects of this exercise, asked him if he'd like me to see if I could further reduce its size. He thought it'd be tough to take much code out of it without changing its functionality -- so much so that he bet me a dinner that I couldn't reduce it by 50 bytes. It was originally a little less than 1K, so that was about 5%.

As I watched the code go by at 1200 baud while I was downloading it, I wasn't confident about winning the bet -- until I saw the 256-byte statically-allocated string buffer at the end. I knew then that just by allocating that dynamically, on the stack, I could win a free dinner. But I thought Bill might object to such a simple maneuver as the sole basis for determining who picked up the dinner tab. After all, moving the buffer from the DRVR resource to the stack didn't really reduce the total memory requirements of using the DA. So I got to work and massaged the code, taking out a word here, a few words there. The end result was 414 bytes smaller than the original. Of course it's a little obscure in places -- the inevitable result of optimizing ("bumming") code as much as possible.

The original version is shown in Figure 3a, and the space-optimized version in Figure 3b. Comparison of the two might provide some useful tips to students of assembly language -- especially in light of the fact that Bill's original version was competently coded, rather than a begining programmer's strawman. Thanks to Bill for being a good sport, for his permission to reprint the code, and for his wide-ranging knowledge of good restaurants.

Figure 3a

;-----------------------------------------------------------------------
; SetSound DA (original version)
; Copyright 1985  William P. Steinberg -- reprinted by permission.
;
; SetSound is a small (<1K) DA that sets default sound volume
;-----------------------------------------------------------------------

 Resource 'DRVR' 31 'SetSound'
 
 IncludeMacTraps.D
 IncludeSysEqu.D
 IncludeQuickEqu.D
 IncludeToolEqu.D
 IncludeSysErr.D

 .TRAP  _CntrLi  $A204    ; _Control,Immed

GoodByeKiss EQU  -1

TRUE  EQU 1
FALSE EQU 0

DAStart:
 DC.W $4400 ; Flags/descriptor
 ; (lock in memory, can
 ;  respond Control calls)
 DC.W 0 ; Tick Count
 DC.W 328 ; Event mask
 ; (will handle: keydown,
 ;  update and activate)
 DC.W 0 ; Menu ID
 DC.W DAOpen   -DAStart ; Offset to open routine
 DC.W DAPrime  -DAStart ; Offset to prime routine
 DC.W DAControl-DAStart ; Offset to control rout.
 DC.W DAStatus -DAStart ; Offset to status rout.
 DC.W DAClose  -DAStart ; Offset to close routine
 DC.B 8 ; Desk Accesory title
 DC.B 'SetSound' ; ( Optional -  helps
 .ALIGN 2 ;   identify  DA in  heap.
 ;   DA appears in Apple
 ;  menu using the 
 ; name of DRVR.)
DAOpen:
 MOVEM.LA0-A6/D0-D7,-(SP) ; Save registers
 MOVE.L A1,A4    ; Put DCE pointer in A4
 PEA  SavePort   ; Save Grafport
 _GetPort
 TST.L  dCtlWindow(A4)  ; Does window exist ?
 BNE.S  GoodOpen ;  yes,  DA already open
 LEA  DAStart,A0 ; Get handle to the DA
 _RecoverHandle
 MOVE.L A0,-(SP) ; Get information on DA
 PEA  DriverID   ; DA id
 PEA  DriverType ; DA type = 'DRVR'
 PEA  DriverName ; DA name
 _GetResInfo
 SUB.L  #4,SP    ; Make room for result
 CLR.L  -(SP)    ; WindowRecord on heap
 PEA  WindowRect ; address of  wind rect
 PEA  DriverName ;  address of  wind title
 MOVE.B #FALSE,-(SP) ; Make it invisibler now
 MOVE.W #noGrowDocProc,-(SP)  ; Push window def id
 MOVE.L #-1,-(SP); Window in front
 MOVE.B #TRUE,-(SP); Give it a goaway box
 CLR.L  -(SP)    ; Window ref value
 _NewWindow ; Create the window
 MOVE.L (SP)+,D0 ; Get the window pointer
 LEA  MyWindow,A0; Save  window pointer
 MOVE.L D0,(A0)  ; Was window created ?
 BEQ.S  BadOpen
 MOVE.L MyWindow,A0; Set windowKind field to
 ;   the DA RefNum
 MOVE.W dCtlRefNum(A4),windowKind(A0) ;Put window
 MOVE.L MyWindow,dCtlWindow(A4)  ; ptr in the DCE
GoodOpen:
 MOVE.L SavePort,-(SP)  ; Restore Grafport
 _SetPort
 MOVEM.L(SP)+,A0-A6/D0-D7 ; Restore registers
 CLR.W  D0; Return code
 RTS
BadOpen:
 MOVE.L SavePort,-(SP)  ; Restore Grafport
 _SetPort
 MOVEM.L(SP)+,A0-A6/D0-D7 ; Restore registers
 MOVE.W #-1,D0   ; Return code
 RTS
 
DAClose:
 MOVEM.LA0-A6/D0-D7,-(SP) ; Save registers
 MOVE.L A1,A4    ; Device Ctrl Entry in A4
 PEA  SavePort   ; Save Grafport
 _GetPort
CloseDA:
 CLR.L  -(SP)    ; Get front window ptr
 _FrontWindow
 MOVE.l (SP)+,D0
DAClose1:
 TST.L  D0;  any more windows ?
 BEQ.S  DAClose3
 CMP.L  MyWindow,D0; Is this our window ?
 BEQ.S  DAClose2
 MOVE.L D0,A0
 MOVE.L nextWindow(A0),D0 ; Get next wind in chain
 BRA.S  DAClose1
DAClose2:
 MOVE.L MyWindow,-(SP)  ; Throw away window
 _DisposWindow
 CLR.L  dCtlWindow(A4)  ; Window gone, tell DCE
DAClose3: 
 MOVE.L SavePort,-(SP)  ; Restore Grafport
 _SetPort
 MOVEM.L(SP)+,A0-A6/D0-D7 ; Restore registers
 CLR.W  D0; Return code
 RTS  
DAControl:
 MOVEM.LA0-A6/D0-D7,-(SP) ; Save registers
 MOVE.L A0,A3    ;  ptr to parm block in A3
 MOVE.L A1,A4    ;  pointer to DCE in A4
 PEA  SavePort   ; Save Grafport
 _GetPort
 MOVE.L MyWindow,-(SP)  ; Make mywindow 
 _SetPort ; the Grafport
 
 ; A3 points to the parameter block which tells us what we
 ; need to do and supplies us with the data to carry it out.

 MOVE csCode(A3),D0
 CMP.W  #GoodByeKiss,D0 ; "GoodByeKiss" msg
 BEQ.S  CloseDA
 CMP.W  #accEvent,D0 ; Event msg, Sys. Evt.
 BNE.S  CTLReturn
CTLEvent:
 MOVE.L csParam(A3),A2
 MOVE.W evtNum(A2),D0
 CMP.W  #keyDwnEvt,D0; Keydown event 
 BEQ.S  EVTkeyDown
 CMP.W  #updatEvt,D0 ; Update event
 BEQ  EVTupdateEvt
 CMP.W  #activateEvt,D0 ; Activate event
 BEQ.S  EVTactivateEvt
CTLReturn:
 MOVE.L SavePort,-(SP)  ; Restore Grafport
 _SetPort
 MOVEM.L(SP)+,A0-A6/D0-D7 ; Restore registers
 CLR.W  D0; Return code
 MOVE.L JIODone,-(SP); Goto IODone
 RTS
EVTactivateEvt:
 MOVE.W EvtMeta(A2),D0
 BTST #activeFlag,D0
 BEQ.S  CTLReturn
 LEA  ActivePend,A0
 ST(A0)
 BRA.S  CTLReturn
EVTkeyDown:
 CLR.L  D2
 MOVE.B evtMessage+3(A2),D2
 CMP.B  #'0',D2
 BLT.S  @2
 CMP.B  #'7',D2
 BGT.S  @2
 SUB.B  #'0',D2
 ANDI.B #7,D2
 ANDI.B #$F8,SpVolCtl
 OR.B D2,SpVolCtl
 MOVEQ  #7,D0
@1 CLR.L-(SP)
 DBRA D0,@1
 MOVE.L SP,A0
 MOVE.W #$FFFC,24(A0)
 MOVE.W #2,26(A0)
 MOVE.W D2,28(A0)
 _CntrLi
 ADD  #32,SP
 LEA  SysParam,A0
 MOVEQ  #-1,D0
 _WriteParam
 MOVE.L MyWindow,-(SP)
 _SetPort
 PEA  NumberRect
 _InValRect
 MOVE.W #3,-(SP) ; Beep on update
 _SysBeep ;at current level
@2 BRA  CTLReturn

EVTupdateEvt:
 MOVE.L MyWindow,-(SP)  ; Update MyWindow
 _SetPort
 MOVE.L MyWindow,-(SP)     ; BeginUpdate(MyWindow)
 _BeginUpdate
 MOVE.L MyWindow,A0
 PEA  portRect(A0)
 _EraseRect
 MOVE.W #' ',-(SP)
 _DrawChar
 MOVEQ  #-1,D0
 MOVE D0,-(SP)
 _SetFontLock
 MOVE.L #20<<16!10,-(SP)
 _MoveTo
 MOVE.W #sysFont,-(SP)
 _TextFont
 MOVE.W #'©',-(SP)
 MOVE.W #applFont,-(SP)
 _TextFont
 PEA  String1
 _DrawString
 MOVE.L #35<<16!19,-(SP)
 _MoveTo
 PEA  String2
 _DrawString
 MOVE.L #50<<16!27,-(SP)
 _MoveTo
 PEA  String3
 _DrawString
 CLR.W  D0
 MOVE.B SpVolCtl,D0
 AND.B  #%00000111,D0; Mask all but low 3 bits
 ADD.B  #'0',D0  ; Convert to ASCII
 MOVE.W D0,-(SP)
 _DrawChar
 MOVE.L #65<<16!37,-(SP)
 _MoveTo
 PEA  String4
 _DrawString
 MOVE.L MyWindow,-(SP)  ; EndUpdate(MyWindow)
 _EndUpdate
 CLR  -(SP)
 _SetFontLock
 LEA  ActivePend,A0
 TST.B  (A0)
 BEQ.S  @1
 MOVE.W #3,-(SP)
 _SysBeep
 LEA  ActivePend,A0
 CLR.B  (A0)
@1 BRA  CTLReturn
 
 ; Prime and Status are not used by Desk Accesories.
 ; These are included "just in case".
DAPrime:
DAStatus:
 CLR.W  D0; Return code
 RTS

SavePort: DC.L 0 ; Application's Grafport
MyWindow: DC.L 0 ; DA window pointer
DriverID: DC.W 0 ; DA resource id
DriverType: DC.L 0 ; DA resource type
DriverName: DCB.B256,0  ; DA resource name
WindowRect: DC.W 40,2,115,213  ; DA window rectangle
NumberRect: DC.W 38,175,50,190 ; DA number rect.
 ;for invalrect
ActivePend: DC.B 0
String1:DC.B28,'1985 by William P. Steinberg'
String2:DC.B28,'Vers 1.0 - Free Distribution'
String3:DC.B23,'Current Volume Level = '
String4:DC.B21,'Enter New Level (0-7)'

 END

Product Briefs from Ms. Elaine E.

My trusty (if somewhat disorganized) assistant, Ms. Elaine E., has returned from a trip outside the cave with reports on some products of interest to developers...

MacExpress

MacExpress is a "generic application" which provides many powerful facilities for handling events, windows, and the desktop. Conceptually, it's a core application program that you customize. It handles all the chores of event processing, menu selections, window manipulation, etc. that are not specific to your application; you provide the code that's application-specific. It's supplied as a set of library routines for a variety of development systems (MDS, Mac C, TML Pascal, etc.) Note that these are not merely utility routines that you call for occasional services; an applicatiion built using MacExpress would, by virtue of that fact, necessarily invoke many of its fundamental event- and window-handling routines. Logically (but not physically) speaking, it's as if you begin your work with the MacExpress code already constituting the core of your application. Physically, your code consists of calls to MacExpress routines that are brought in at link time (plus, of course, your application-specific code).

For example, MacExpress automatically handles window movement, resizing, scrolling, splitting into panes; you have to worry only about what gets drawn in the windows. Similarly with menus: MacExpress handles command selection and desk accessories; you worry only about the code that implements the application-specific menu commands.

MacExpress also provides automatic facilities for handling icons on the desktop (Finder-style). You can associate icons with, e.g., windows (documents) and/or desk accessories. MacExpress will take care of handling the icons graphically (dragging them, "shadowing" them, rearranging them with a clean-up command); you specify what happens when a user opens an icon or sets it aside.

I haven't actually developed an application using MacExpress, but I've spent some time examining the documentation, demos, and sample source files that come with it. I'd seriously consider using it for a window-oriented application. (Lately, my nose has been buried in device drivers and such.) MacExpress author Al Whipple appears to have a sincere commitment to supporting the product.

ALSoft, Inc.

P.O. Box 927

Spring, TX 77383-0927 (713) 353-4090

$495 (demo version, $50, applicable to purchase)

$100/yr per application you distribute (unlimited copies)

McAssembly

McAssembly is a new assembly-language development system for the Macintosh. It consists of a two-pass assembler and linker (integrated into one application file), and a separate debugger (Macsbug-style, i.e., TTY line-oriented).

The assembler has some nice features: dummy data sections to facilitate record offset definitions; based variables, so that explicit register references need not be coded; alphanumeric local labels; decent listings (ever looked at an MDS Asm listing? --yuk) with optional cross-reference; built-in resource compiler -- the assembler knows about the formats of the commonly-used resources. Conversion of MDS Asm source files to McAssembly format is pretty straightforward.

The linker can directly include resource files (created, e.g., with ResEdit). McAssembly's .Rel file format is not compatible with anything else, but a utility is provided to convert its .Rel files to MDS format.

Equivalents for the Software Supplement equate and trap definition files are provided, as are .Rel files (in McAssembly format) corresponding to the Supplement Appletalk, Printer, etc., object files.

On paper, I like it better than MDS Asm (I've never been a fan of MDS Asm). Next time I start a new assembly project, I plan to give it a real tryout. It's been used to assemble itself and the TMON User Area (which uses every trick in the book), so I figure it's reasonably well-tested. Author Dave McWherter is responsive to enhancement suggestions.

Signature Software

2151 Brown Ave.

Bensalem, PA 19020 (215) 639-8764

$89.95

QUED

QUED is a programmer's text editor. After I bought it, I stopped using MDS Edit (and arranged to have Software Supply, i.e., me, become a dealer for QUED -- note, therefore, my financial interest in telling you about QUED).

QUED is memory-based -- the file(s) you edit must fit into memory. It will open as many files (windows) as will fit; I've had more than 30 windows open at once. Windows can be automatically arranged in a tile fashion (neat rows and columns) or stacked in the more usual manner. Each window can be horizontally and/or vertically split into independently-scrollable panes. The top two windows can be scrolled synchronously (scroll bar of either one controls both).

QUED can be told to automatically save your work every N keystrokes, and/or to save to two different disks (called the "RAMdisk" option). It will display unclosed parentheses as you're entering code, where "parentheses" are user-defined program structure elements (begin end, { }, etc.) or string or comment delimeters; or it will check the whole file for unbalanced parentheses. It has a user-editable Transfer menu. You can move the cursor and/or delete by characters, words, and lines without using the mouse. Double-click a window's title bar to enlarge it to full-screen; double-click again to restore it to its former size. QUED will print in background (spooled) mode. You can append to as well as replace the contents of the Clipboard, and exchange selected text with the Clipboard. Search/replacement can apply to multiple files, and Undo really undoes. It's compatible with MDS Edit file font, font size and tab-setting resources, and works with MDS Exec.

I like it. I use it. I sell it. The publisher is a good guy and is committed to support and enhancements.

Paragon Courseware

4954 Sun Valley Road

Del Mar, CA 92014 (619) 481-1477

$65 (+CA tax) + $2 shipping, credit cards accepted

or

Software Supply

4618 E. Sixth St.

Long Beach, CA 90814 (213) 434-3723

$65 (+CA tax), no shipping charge, checks only

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

coconutBattery 3.9.14 - Displays info ab...
With coconutBattery you're always aware of your current battery health. It shows you live information about your battery such as how often it was charged and how is the current maximum capacity in... Read more
Keynote 13.2 - Apple's presentation...
Easily create gorgeous presentations with the all-new Keynote, featuring powerful yet easy-to-use tools and dazzling effects that will make you a very hard act to follow. The Theme Chooser lets you... Read more
Apple Pages 13.2 - Apple's word pro...
Apple Pages is a powerful word processor that gives you everything you need to create documents that look beautiful. And read beautifully. It lets you work seamlessly between Mac and iOS devices, and... Read more
Numbers 13.2 - Apple's spreadsheet...
With Apple Numbers, sophisticated spreadsheets are just the start. The whole sheet is your canvas. Just add dramatic interactive charts, tables, and images that paint a revealing picture of your data... Read more
Ableton Live 11.3.11 - Record music usin...
Ableton Live lets you create and record music on your Mac. Use digital instruments, pre-recorded sounds, and sampled loops to arrange, produce, and perform your music like never before. Ableton Live... Read more
Affinity Photo 2.2.0 - Digital editing f...
Affinity Photo - redefines the boundaries for professional photo editing software for the Mac. With a meticulous focus on workflow it offers sophisticated tools for enhancing, editing and retouching... Read more
SpamSieve 3.0 - Robust spam filter for m...
SpamSieve is a robust spam filter for major email clients that uses powerful Bayesian spam filtering. SpamSieve understands what your spam looks like in order to block it all, but also learns what... Read more
WhatsApp 2.2338.12 - Desktop client for...
WhatsApp is the desktop client for WhatsApp Messenger, a cross-platform mobile messaging app which allows you to exchange messages without having to pay for SMS. WhatsApp Messenger is available for... Read more
Fantastical 3.8.2 - Create calendar even...
Fantastical is the Mac calendar you'll actually enjoy using. Creating an event with Fantastical is quick, easy, and fun: Open Fantastical with a single click or keystroke Type in your event details... Read more
iShowU Instant 1.4.14 - Full-featured sc...
iShowU Instant gives you real-time screen recording like you've never seen before! It is the fastest, most feature-filled real-time screen capture tool from shinywhitebox yet. All of the features you... Read more

Latest Forum Discussions

See All

The iPhone 15 Episode – The TouchArcade...
After a 3 week hiatus The TouchArcade Show returns with another action-packed episode! Well, maybe not so much “action-packed" as it is “packed with talk about the iPhone 15 Pro". Eli, being in a time zone 3 hours ahead of me, as well as being smart... | Read more »
TouchArcade Game of the Week: ‘DERE Veng...
Developer Appsir Games have been putting out genre-defying titles on mobile (and other platforms) for a number of years now, and this week marks the release of their magnum opus DERE Vengeance which has been many years in the making. In fact, if the... | Read more »
SwitchArcade Round-Up: Reviews Featuring...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for September 22nd, 2023. I’ve had a good night’s sleep, and though my body aches down to the last bit of sinew and meat, I’m at least thinking straight again. We’ve got a lot to look at... | Read more »
TGS 2023: Level-5 Celebrates 25 Years Wi...
Back when I first started covering the Tokyo Game Show for TouchArcade, prolific RPG producer Level-5 could always be counted on for a fairly big booth with a blend of mobile and console games on offer. At recent shows, the company’s presence has... | Read more »
TGS 2023: ‘Final Fantasy’ & ‘Dragon...
Square Enix usually has one of the bigger, more attention-grabbing booths at the Tokyo Game Show, and this year was no different in that sense. The line-ups to play pretty much anything there were among the lengthiest of the show, and there were... | Read more »
Valve Says To Not Expect a Faster Steam...
With the big 20% off discount for the Steam Deck available to celebrate Steam’s 20th anniversary, Valve had a good presence at TGS 2023 with interviews and more. | Read more »
‘Honkai Impact 3rd Part 2’ Revealed at T...
At TGS 2023, HoYoverse had a big presence with new trailers for the usual suspects, but I didn’t expect a big announcement for Honkai Impact 3rd (Free). | Read more »
‘Junkworld’ Is Out Now As This Week’s Ne...
Epic post-apocalyptic tower-defense experience Junkworld () from Ironhide Games is out now on Apple Arcade worldwide. We’ve been covering it for a while now, and even through its soft launches before, but it has returned as an Apple Arcade... | Read more »
Motorsport legends NASCAR announce an up...
NASCAR often gets a bad reputation outside of America, but there is a certain charm to it with its close side-by-side action and its focus on pure speed, but it never managed to really massively break out internationally. Now, there's a chance... | Read more »
Skullgirls Mobile Version 6.0 Update Rel...
I’ve been covering Marie’s upcoming release from Hidden Variable in Skullgirls Mobile (Free) for a while now across the announcement, gameplay | Read more »

Price Scanner via MacPrices.net

New low price: 13″ M2 MacBook Pro for $1049,...
Amazon has the Space Gray 13″ MacBook Pro with an Apple M2 CPU and 256GB of storage in stock and on sale today for $250 off MSRP. Their price is the lowest we’ve seen for this configuration from any... Read more
Apple AirPods 2 with USB-C now in stock and o...
Amazon has Apple’s 2023 AirPods Pro with USB-C now in stock and on sale for $199.99 including free shipping. Their price is $50 off MSRP, and it’s currently the lowest price available for new AirPods... Read more
New low prices: Apple’s 15″ M2 MacBook Airs w...
Amazon has 15″ MacBook Airs with M2 CPUs and 512GB of storage in stock and on sale for $1249 shipped. That’s $250 off Apple’s MSRP, and it’s the lowest price available for these M2-powered MacBook... Read more
New low price: Clearance 16″ Apple MacBook Pr...
B&H Photo has clearance 16″ M1 Max MacBook Pros, 10-core CPU/32-core GPU/1TB SSD/Space Gray or Silver, in stock today for $2399 including free 1-2 day delivery to most US addresses. Their price... Read more
Switch to Red Pocket Mobile and get a new iPh...
Red Pocket Mobile has new Apple iPhone 15 and 15 Pro models on sale for $300 off MSRP when you switch and open up a new line of service. Red Pocket Mobile is a nationwide service using all the major... Read more
Apple continues to offer a $350 discount on 2...
Apple has Studio Display models available in their Certified Refurbished store for up to $350 off MSRP. Each display comes with Apple’s one-year warranty, with new glass and a case, and ships free.... Read more
Apple’s 16-inch MacBook Pros with M2 Pro CPUs...
Amazon is offering a $250 discount on new Apple 16-inch M2 Pro MacBook Pros for a limited time. Their prices are currently the lowest available for these models from any Apple retailer: – 16″ MacBook... Read more
Closeout Sale: Apple Watch Ultra with Green A...
Adorama haș the Apple Watch Ultra with a Green Alpine Loop on clearance sale for $699 including free shipping. Their price is $100 off original MSRP, and it’s the lowest price we’ve seen for an Apple... Read more
Use this promo code at Verizon to take $150 o...
Verizon is offering a $150 discount on cellular-capable Apple Watch Series 9 and Ultra 2 models for a limited time. Use code WATCH150 at checkout to take advantage of this offer. The fine print: “Up... Read more
New low price: Apple’s 10th generation iPads...
B&H Photo has the 10th generation 64GB WiFi iPad (Blue and Silver colors) in stock and on sale for $379 for a limited time. B&H’s price is $70 off Apple’s MSRP, and it’s the lowest price... Read more

Jobs Board

Optometrist- *Apple* Valley, CA- Target Opt...
Optometrist- Apple Valley, CA- Target Optical Date: Sep 23, 2023 Brand: Target Optical Location: Apple Valley, CA, US, 92308 **Requisition ID:** 796045 At Target Read more
Senior *Apple* iOS CNO Developer (Onsite) -...
…Offense and Defense Experts (CODEX) is in need of smart, motivated and self-driven Apple iOS CNO Developers to join our team to solve real-time cyber challenges. Read more
*Apple* Systems Administrator - JAMF - Activ...
…**Public Trust/Other Required:** None **Job Family:** Systems Administration **Skills:** Apple Platforms,Computer Servers,Jamf Pro **Experience:** 3 + years of Read more
Child Care Teacher - Glenda Drive/ *Apple* V...
Child Care Teacher - Glenda Drive/ Apple ValleyTeacher Share by Email Share on LinkedIn Share on Twitter Share on Facebook Apply Read more
Machine Operator 4 - *Apple* 2nd Shift - Bon...
Machine Operator 4 - Apple 2nd ShiftApply now " Apply now + Start apply with LinkedIn + Apply Now Start + Please wait Date:Sep 22, 2023 Location: Swedesboro, NJ, US, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.