TweetFollow Us on Twitter

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

Readers Technical Questions

By Steve Brecher, Software Supply, MacTutor Contributing Editor

SCSI

Q. It's widely rumored that Apple is going to offer an upgrade that includes a "SCSI port." What's that?

A. At this writing Apple has made no announcements about such an upgrade, but assuming that the rumors are true let's talk about SCSI. This is just a background briefing -- if the Mac does get a SCSI connection, the only programmers who will need to be concerned with its details are those who write device driver and other low-level software to talk to the SCSI devices that attach to the Mac.

SCSI stands for Small Computer Systems Interface and is usually pronounced as "scuzzy." It is a standard 8-bit-wide data bus that is increasingly popular in the industry for connecting peripheral devices to each other and to host computers.

SCSI is an enhancement and standardization of SASI (Shugart Associates Systems Interface), a disk controller interface which was originated by Shugart, the disk drive manufacturer, in the late '70s and widely used. SASI was submitted to ANSI (American National Standards Institute) for official standardization. In the process its name was changed to drop the association with a particular vendor, and protocols were added to enable multiple hosts to coexist on the bus, to allow peripherals to release the bus during their execution of long processes and then reconnect with the host which issued the command, and to add commands oriented to devices other than disks (e.g., tape drives).

The basic purpose of SCSI, like that of other buses (S100, VME, Qbus, Multibus, etc.) is to connect devices whose manufacturers may never have heard of one another so that the devices can send data back and forth in a coordinated way. SCSI specifies both the electrical aspects of the connection and a communication protocol. Up to 8 devices (peripheral controllers and/or computers) can be connected to a SCSI bus.

The bus consists of 8 data lines ("wires"), one data parity line, and 9 control signal lines. (For reasons best known to the hardware folks, a 50-line cable is usually used for SCSI interconnections.) Data transfer is asynchronous -- that means that an explicit control signal handshake protocol is used to coordinate the transfer of each byte (as opposed to synchronous, which means that the communicating devices use a common clock signal to pace data transfers).

The maximum SCSI data transfer rate is more than 1MByte/sec -- thus fast peripherals will have to wait for the Mac rather than vice-versa. The Mac, lacking DMA (Direct Memory Access), cannot transfer more than about 0.5Mbyte/sec into and out of RAM, because each byte transferred (recall that SCSI is an 8-bit-wide data bus) requires at least one CPU instruction and two 68000 bus accessess -- data source and destination -- in addition to the access for the instruction fetch. That's not counting any additional instructions such as for loop control.

A typical SCSI bus system is shown in Figure 1. This is a single-host system -- only one computer -- which allows the computer to drive the peripherals connected to the bus. The illustration shows only two peripherals, but there could be up to 7 (the host is one of the up to 8 devices that can attach to the bus).

The host adapter in the computer interfaces between the SCSI bus and the CPU. CPUs like the 68000 which use memory-mapped I/O would communicate with the host adapter by writing to or reading from fixed addresses -- just as the Mac communicates with its serial and diskette hardware at fixed addresses.

The bus allows any one pair of devices connected to it to be in communication at a given time. One of the devices (usually the computer) is the Initiator and the other (usually a peripheral) is the Target. The Initiator obtains use of the bus, and selects a Target; the Target responds to indicate it is selected, and then the two devices have exclusive use of the bus until they release it The Initiator sends commands to the Target, and the Target executes them. The set of possible commands includes Read (send data to me), Write (take the following data), Format (a disk), Rewind (a tape drive), etc.

SCSI peripheral controllers are fairly intelligent. For example, to read from a disk device, the Initiator (computer) need specify only a logical block address (a relative data block offset) and the number of blocks. The target controller then translates this into a low-level disk location (cylinder, head, sector). Historically, driver software in the computer has been responsible for such translation to low-level terms, because that's all that "dumb" disk controllers were able to understand. In addition to making things simpler for the host computer device driver software, this kind of controller intelligence allows a higher degree of device-independence -- the same way that a high-level programming language allows CPU-independence.

Soft Coding

Q. "ELL" on Delphi notes that Apple often warns against "hard-coding" constants such as screen and memory sizes into programs, but some example programs from Apple seem to include such constants nonetheless.

A. Do as they say, not as they do. Any program that's going to be used more than once (or farther into the future than five minutes) should be defensively programmed to assume that anything about its environment that might change, will change. Even today a program might be run on machines varying in memory size from 128K to 2MB, and varying in screen size from the Mac's screen to the XL's.

Handling an arbitrary screen size can be difficult with respect to multiple windows which contain many elements and which have been designed to look pretty. But that's no excuse for avaoiding simple measures, such as calculating at run time instead of hard-coding the positions of a window which should be centered.

To get the lazy started, I've provided in Figure 2 a couple of routines to vertically and horizontally center a rectangle. The code is trivial, but it illustrates the use of a couple of macros discussed in the next question.

In those cases in which constants must be used, they should be defined mnemonically (e.g., using EQU in assembler or Const in Pascal). That makes them easy to identify and change.

Macros

Q. I haven't seen many macros used in the assembly programs I've looked at. Could you give some examples of macro usage?

A. I have a file of macro definitions that I incorporate into most programs using the MDS Asm Include facility. The file is shown in Figure 3.

The first set of macros compensates for an MDS bug which generates incorrect results for some comparison operators. For example, instead of

If A<B

which doesn't work properly, I use the macro .LT.:

If A .LT. B

(I stole the substance of these comparison macros from the TMON user area source code.)

The second and most elaborate set of macros is used to avoid errors in stack addressing for a routine's arguments, result, and temporaries. Figure 4 shows an example of how this set of macros is used.

The Assume macro is useful for explicitly stating assumptions made by the code (usually relating to the value of an offset which is defined in an Equ file, or to the adjacency of values accessed with autoincrement or autodecrement addressing). For example, the code in Figure 2 contains:

  Assume   top=0
 Add        (A0),D0

Coding top(A0) wastes a word if top=0; including the Assume macro in this case makes clear what is going on (as well as protecting the program from undetected error should the offset of "top" ever change).

The various Push and Pop macros reduce the amount of typing required to code pushes and pops of the A7 stack as well as making the program easier to read (at least to my eye).

The BitDefinitions and Bit macros make it easy to define mnemonic values for bit numbers and masks which are used with flag bytes and hardware registers. Coding

 BitDefinitions   InterruptFlags
 Bit                  OneSec
 Bit                  VertBlank
 Bit                  KbdRdy
 ;etc.

is the equivalent of coding

 OneSecBit      Equ 0
 OneSecMask      Equ 1
 VertBlankBit   Equ 1
 VertBlankMask   Equ 2
 KbdRdyBit      Equ 2
 KbdRdyMask      Equ 4
 ;etc.

spExtra

Q. Bill Bynum of Williamsburg, VA noticed that both Inside Macintosh and the June '85 issue of MacTutor (p. 45) indicate that the spExtra field of a grafPort record is a word, while in the MDS file QuickEqu.Txt, it's shown as a long (Pascal data type "fixed"). There is a corresponding discrepancy in the total size of a grafPort.

A. When in doubt, always go by the Equ files -- they're used by the folks at Apple who write systems software.

SpExtra is 4 bytes long, and a grafPort is 108 bytes long. Theoretically spExtra is of "fixed" data type, i.e., a 32-bit value with an implicit binary point in the middle. This implies that that spaces can be extended by a fractional number of pixels. However, in the current ROM QuickDraw effectively uses only the high-order word of spExtra. That's why the SpaceExtra trap works with an integer argument as it's documented in IM . QuickDraw moves a long argument from the stack to the field in the grafPort. Since the caller pushed only a word argument, the low-order word of the spExtra field in the grafPort will be whatever word happened to be above the caller's word argument on the stack. But since the low-order word doesn't really affect QuickDraw's calculations, all is well.

Figure 2 Source Code
 IncludeQuickEqu.D
 IncludeMacros ;see Figure 3

MBarHt  Equ 20 ;vertical size of menu bar
;
; procedure VertCenterRect(VAR myRect: rect)
;
; Adjust the top and bottom of the rect so that the rect is
; vertically centered in the desktop area for current
; screen size.
;
 StackFrame NotLinked
 Arg    myRect,Long
;
VertCenterRect:
 Move.L (A5),A0  ;addr of QuickDraw globals
 Move screenBits+bounds+bottom(A0),D0 
 ;vertical size of screen
 Move.L myRect(SP),A0;addr of caller's rect
 Move bottom(A0),D1;D1 = bottom of caller's rect
 Sub  D1,D0 ;D0 = old bottom margin
 Assume top=0  ;(macro)
 Add  (A0),D0  ;+ old top margin, D0 = total 
 ;vertical margin
 Lsr  #1,D0 ;D0 = 1/2 of the vert space 
 ;not used by rect
 Add  #MbarHt/2,D0 ;adjust for menubar, D0 = 
 ;new top of rect
 Sub  (A0),D1  ;D1 = vertical size of rect
 Move D0,(A0)  ;set new top
 Add  D1,D0 ;new bottom = top + size
 Move D0,bottom(A0);set new bottom
 Return ;(macro)
;
; procedure HorzCenterRect(VAR myRect: rect)
;
; Adjust the left and right of the rect so that the rect is
; horizontally centered for current screen size.
;
 StackFrame NotLinked
 Arg    myRect,Long
;
HorzCenterRect:
 Move.L (A5),A0  ;addr of QuickDraw globals
 Move screenBits+bounds+right(A0),D0 
 ;D0 = horz size of screen
 Move.L myRect(SP),A0;addr of caller's rect
 Move right(A0),D1 ;D1 = right of caller's rect
 Lea  left(A0),A0;point to left coordinate 
 ;of rect
 Sub  D1,D0 ;D0 = old right margin
 Add  (A0),D0  ;+ old left margin, D0 = 
 ;total horz margin
 Lsr  #1,D0 ;D0 = 1/2 of the horz space 
 ;not used by rect
 Sub  (A0),D1  ;D1 = horizontal size of rect
 Move D0,(A0)  ;set new left
 Add  D1,D0 ;new right = left + size
 Move D0,right-left(A0)   ;set new right
 Return ;(macro)
Figure 3
; Macros.Asm -- General purpose MDS macros

;
; Macros to work around MDS Asm comparison reversal bug
;
If 1<0  ;if bug is present
 Macro  .LT. = > |
 Macro  .LE. = >=  |
 Macro  .GT. = < |
 Macro  .GE. = <=  |
Else    ;if bug is not present
 Macro  .LT. = < |
 Macro  .LE. = <=  |
 Macro  .GT. = > |
 Macro  .GE. = >=  |
Endif

; Subroutine stack frame definition macros
;
; Usage:
;
;StackFrame Linked ;if A6 link to be used
;<or>
;StackFrame <anything else> ;if no A6 link to be used
;
;Arg    ArgN,ArgNLen ;last arg pushed by caller
;...
;Arg    Arg1,Arg1Len ;first arg pushed by caller
;Result ResultName,ResultLen
;Local  Local1,Local1Len
;...
;Local  LocalN,LocalNLen
;
;Routine:
;Link   A6,#-LocalsSize ;if StackFrame Linked
;...
;Return
;
; Notes:
;
; StackFrame is required.  Each of the other types of 
; macro invocations is optional, but if present their 
;relative ordering must be as shown.
;
; Arguments (Arg macro invocations) must appear in 
; the reverse of the order in which the caller pushes 
; the arguments.
;
; ResultLen is ignored, but provided for documentary 
; purposes.

Macro StackFrame Type =
 If'{Type}' = 'Linked'
 ..RtnAddr..Set  4
 ..ArgOffs..Set  8
 Else
 ..RtnAddr..Set  0
 ..ArgOffs..Set  4
 Endif
 ..ArgsSz.. Set  0
 LocalsSize Set  0
 |

Macro Arg Name,Len =
 {Name} Set ..ArgOffs..
 ..ArgOffs..Set  {Name}+{Len}+({Len}&1)
 ..ArgsSz.. Set  ..ArgOffs..-..RtnAddr..-4
 |

Macro ResultName,Len =
 {Name} Set ..ArgOffs..
 |

Macro Local Name,Len =
 {Name} Set 0-LocalsSize-{Len}-({Len}&1)
 LocalsSize Set  0-{Name}
 |

Macro Return =
 If..RtnAddr.. =4
 Unlk   A6
 Endif
 If..ArgsSz..  <>0
 Move.L (SP)+,A0 ;return addr
 If..ArgsSz..  .LE. 8
 AddQ   #..ArgsSz..,SP
 Else
 Lea    ..ArgsSz..(SP),SP
 Endif
 Jmp    (A0)
 Else
 Rts
 Endif
 |

;
; Define standard lengths
;
Byte  Equ 1      ;same affect as Word
 ; use for declarative purpose
Word  Equ 2
Long  Equ 4

;
; Macros to push and pop stack
;
Macro Pop.B Dest =
 If   '{Dest}'   <> ''
 Move.B (SP)+,{Dest}
 Else
 Tst.B  (SP)+  ;pop and set condition codes 
 ;per Boolean
 Endif
 |

Macro Pop Dest =
 If   '{Dest}'   <> ''
 Move.W (SP)+,{Dest}
 Else
 AddQ #2,SP
 Endif
 |

Macro Pop.L Dest =
 If   '{Dest}'   <> ''
 Move.L (SP)+,{Dest}
 Else
 AddQ #4,SP
 Endif
 |

Macro Push.BSrc =
 Move.B {Src},-(SP)
 |

Macro PushSrc =
 Move.W {Src},-(SP)
 |

Macro Push.LSrc =
 Move.L {Src},-(SP)
 |

Macro PushM Regs =
 MoveM.W{Regs},-(SP)
 |
 
Macro PushM.L  Regs =
 MoveM.L{Regs},-(SP)
 |

Macro PopMRegs =
 MoveM.W(SP)+,{Regs}
 |

Macro PopM.LRegs =
 MoveM.L(SP)+,{Regs}
 |

; Macro to make an assertion about an assumed condition
;
Macro Assume Cond =
 If   {Cond}
 Else
 Assumption error -- {Cond}
 Endif
 |
; Macros to decare bits and masks
; Usage
;BitDefinitions ID ;setup -- ID is documentary only 
;Bit  Name1 ;Defines Name1bit=0, Name1mask=1
;...
;Bit  NameN ;Defines NameNbit=N, NameNmask=1<<N
;
Macro BitDefinitions ID
 .BitNbr. Set  0
 |
Macro Bit Name =
 {Name}bitEqu  .BitNbr.
 {Name}mask Equ  1<<{Name}bit
 .BitNbr. Set  {Name}bit+1
 |
Figure 4
 IncludeSysEqu.D
 IncludeMacTraps.D
 IncludeMacros
;
; Function CanGetInfo(vRefNum, DirID: integer; FileNamePtr: 
 Ptr): boolean
; Calls _HGetFileInfo (HFS version) if DirID<>0, 
; otherwise _GetFileInfo.
; Returns true if the trap result is noErr.
;
ioHFQElSize Equ  $6C         ;size of HFS parameter block
ioDirID Equ $30          ;offset of DirID
; 
 StackFrame Linked
 Arg    FileNamePtr,long
 Arg    DirID,word
 Arg    vRefNum,word
 Result Flag,byte
 Local  ioPB,ioHFQElSize
;
CanGetInfo:
 Link A6,#-LocalsSize
 Lea  ioPB(A6),A0;addr of parameter block
 Move.L FileNamePtr(A6),ioFileName(A0)
 Move vRefNum(A6),ioVRefNum(A0)
 Clr.B  ioFVersNum(A0)  ;version number always 0
 Clr  ioFDirIndex(A0);not an indexed call
 Move DirID(A6),D0 ;HFS?
 Bne.S  @0;yes
 _GetFileInfo    ;no
 Bra.S  @1
@0 Move D0,ioDirID(A0)
 _HGetFileInfo
@1 Assume noErr=0
 Seq  Flag(A6)   ;set result
 Return
 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Latest Forum Discussions

See All

Tokkun Studio unveils alpha trailer for...
We are back on the MMORPG news train, and this time it comes from the sort of international developers Tokkun Studio. They are based in France and Japan, so it counts. Anyway, semantics aside, they have released an alpha trailer for the upcoming... | Read more »
Win a host of exclusive in-game Honor of...
To celebrate its latest Jujutsu Kaisen crossover event, Honor of Kings is offering a bounty of login and achievement rewards kicking off the holiday season early. [Read more] | Read more »
Miraibo GO comes out swinging hard as it...
Having just launched what feels like yesterday, Dreamcube Studio is wasting no time adding events to their open-world survival Miraibo GO. Abyssal Souls arrives relatively in time for the spooky season and brings with it horrifying new partners to... | Read more »
Ditch the heavy binders and high price t...
As fun as the real-world equivalent and the very old Game Boy version are, the Pokemon Trading Card games have historically been received poorly on mobile. It is a very strange and confusing trend, but one that The Pokemon Company is determined to... | Read more »
Peace amongst mobile gamers is now shatt...
Some of the crazy folk tales from gaming have undoubtedly come from the EVE universe. Stories of spying, betrayal, and epic battles have entered history, and now the franchise expands as CCP Games launches EVE Galaxy Conquest, a free-to-play 4x... | Read more »
Lord of Nazarick, the turn-based RPG bas...
Crunchyroll and A PLUS JAPAN have just confirmed that Lord of Nazarick, their turn-based RPG based on the popular OVERLORD anime, is now available for iOS and Android. Starting today at 2PM CET, fans can download the game from Google Play and the... | Read more »
Digital Extremes' recent Devstream...
If you are anything like me you are impatiently waiting for Warframe: 1999 whilst simultaneously cursing the fact Excalibur Prime is permanently Vault locked. To keep us fed during our wait, Digital Extremes hosted a Double Devstream to dish out a... | Read more »
The Frozen Canvas adds a splash of colou...
It is time to grab your gloves and layer up, as Torchlight: Infinite is diving into the frozen tundra in its sixth season. The Frozen Canvas is a colourful new update that brings a stylish flair to the Netherrealm and puts creativity in the... | Read more »
Back When AOL WAS the Internet – The Tou...
In Episode 606 of The TouchArcade Show we kick things off talking about my plans for this weekend, which has resulted in this week’s show being a bit shorter than normal. We also go over some more updates on our Patreon situation, which has been... | Read more »
Creative Assembly's latest mobile p...
The Total War series has been slowly trickling onto mobile, which is a fantastic thing because most, if not all, of them are incredibly great fun. Creative Assembly's latest to get the Feral Interactive treatment into portable form is Total War:... | Read more »

Price Scanner via MacPrices.net

Early Black Friday Deal: Apple’s newly upgrad...
Amazon has Apple 13″ MacBook Airs with M2 CPUs and 16GB of RAM on early Black Friday sale for $200 off MSRP, only $799. Their prices are the lowest currently available for these newly upgraded 13″ M2... Read more
13-inch 8GB M2 MacBook Airs for $749, $250 of...
Best Buy has Apple 13″ MacBook Airs with M2 CPUs and 8GB of RAM in stock and on sale on their online store for $250 off MSRP. Prices start at $749. Their prices are the lowest currently available for... Read more
Amazon is offering an early Black Friday $100...
Amazon is offering early Black Friday discounts on Apple’s new 2024 WiFi iPad minis ranging up to $100 off MSRP, each with free shipping. These are the lowest prices available for new minis anywhere... Read more
Price Drop! Clearance 14-inch M3 MacBook Pros...
Best Buy is offering a $500 discount on clearance 14″ M3 MacBook Pros on their online store this week with prices available starting at only $1099. Prices valid for online orders only, in-store... Read more
Apple AirPods Pro with USB-C on early Black F...
A couple of Apple retailers are offering $70 (28%) discounts on Apple’s AirPods Pro with USB-C (and hearing aid capabilities) this weekend. These are early AirPods Black Friday discounts if you’re... Read more
Price drop! 13-inch M3 MacBook Airs now avail...
With yesterday’s across-the-board MacBook Air upgrade to 16GB of RAM standard, Apple has dropped prices on clearance 13″ 8GB M3 MacBook Airs, Certified Refurbished, to a new low starting at only $829... Read more
Price drop! Apple 15-inch M3 MacBook Airs now...
With yesterday’s release of 15-inch M3 MacBook Airs with 16GB of RAM standard, Apple has dropped prices on clearance Certified Refurbished 15″ 8GB M3 MacBook Airs to a new low starting at only $999.... Read more
Apple has clearance 15-inch M2 MacBook Airs a...
Apple has clearance, Certified Refurbished, 15″ M2 MacBook Airs now available starting at $929 and ranging up to $410 off original MSRP. These are the cheapest 15″ MacBook Airs for sale today at... Read more
Apple drops prices on 13-inch M2 MacBook Airs...
Apple has dropped prices on 13″ M2 MacBook Airs to a new low of only $749 in their Certified Refurbished store. These are the cheapest M2-powered MacBooks for sale at Apple. Apple’s one-year warranty... Read more
Clearance 13-inch M1 MacBook Airs available a...
Apple has clearance 13″ M1 MacBook Airs, Certified Refurbished, now available for $679 for 8-Core CPU/7-Core GPU/256GB models. Apple’s one-year warranty is included, shipping is free, and each... Read more

Jobs Board

Seasonal Cashier - *Apple* Blossom Mall - J...
Seasonal Cashier - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Read more
Seasonal Fine Jewelry Commission Associate -...
…Fine Jewelry Commission Associate - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) Read more
Seasonal Operations Associate - *Apple* Blo...
Seasonal Operations Associate - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Read more
Hair Stylist - *Apple* Blossom Mall - JCPen...
Hair Stylist - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Blossom Read more
Cashier - *Apple* Blossom Mall - JCPenney (...
Cashier - Apple Blossom Mall Location:Winchester, VA, United States (https://jobs.jcp.com/jobs/location/191170/winchester-va-united-states) - Apple Blossom Mall Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.