![](/file/12652/www.mactech.com.tar/www.mactech.com/sites/all/themes/custom_front/images/you_are_here_red.gif)
![](/file/12652/www.mactech.com.tar/www.mactech.com/sites/default/files/beta-site.gif)
|
Volume Number: | 1 | |
Issue Number: | 10 | |
Column Tag: | Mousehole Letters |
Mousehole Report, Letters
By Rusty Hodge, Sys Op & Contributing Editor, Mousehole BBS
Program bombs Lisp
MICRO GHOUL
I have been having a problem with a consistent bomb in ExperLisp that I was wondering whether anyone else was having. The following, though a terrible little routine is a perfect way to get to the bomb (which I was finally able to isolate trying to make a nice routine, that a later version of this piece of trash was working towards). Well, enough about that, here it is:
(SETQ MYWIND (NEWGRAFWINDOW '(100 100 300 350))) (MYWIND 'SETWTITLE "GONNA BOMB!!") (DEFUN COORDINATES () (GETMOUSE)) (WHILE (NOT (BUTTON)) (MYWIND 'SELECTWINDOW) (APPLY FILLOVAL '(50 50 (CAR (COORDINATES)) (CADR (COORDINATES)) MYWIND)))
Please excuse any typos or forgotten "(" or ")" or "'", if I forgot them here does not mean that I forgot them in the actual code, more important is the fact that though Lisp tries to give me an error it bombs with the ID #2 everytime. In fact the first time rather than just a bomb it added the desire to have a disk swap (though both disks where in their respective drives!)
Contest Winner
THE CATCHER
The Catcher (alias Steve Yaeger) wins the Mousehole printing contest sponsored by MacTutor, with this assembly entry to mimic the BASIC statement: PRINT "HELLO":END on the Macintosh. Steve wins a check for $50 and a MacTutor thank you. DON L also submitted an excellent answer that we will print next month.
; Print "hello" on the printer. ; Written by Steve Yaeger ; If the printer is off-line, this will hang the Mac ; until it is put back on line ; If there is no Printdriver file it just Beeps and exits ; ; The Linker file looks like this ; ; HELLO.REL ; ] ; ; These are the Equates Notice that the iPrReset, iPrLineFeed, ; and iPrPageEnd are Longwords and not words as in ; PREQU.TXT from Counsulair. XREF START ; These are the PrDrvr constants. iPrDrvrRef EQU $FFFD ; Driver's RefNum = NOT ResID iPrIOCtl EQU 5 ; The Raw Byte IO Proc's ctl # PrDevCtl EQU 7 ; The PrDevCtl Proc's ctl # iPrReset EQU $00010000 ; The CParam for res iPrPageEndEQU $00020000 ; The CParam for end iPrLineFeed EQU $00030000 ; The CParam for pap lParam1 EQU 0 ; the three printer parameters lParam2 EQU 4 lParam3 EQU 8 ; These are the standard call parameters csCode EQU $1A ;control dependent command csParam EQU $1C ;control dependent param. ioCompletion EQU $C ;pointer to async notifier routine ioResult EQU $10 ;returns operation results ioFileNameEQU $12 ;pointer to name of driver ioRefNum EQU $18 ;driver reference # ioPermssn EQU $1B ;read/write permission ; Traps used in this program .TRAP _InitGraf $A86E .TRAP _InitFonts $A8FE .TRAP _FlushEvents $A050 .TRAP _InitWindows $A912 .TRAP _InitMenus $A930 .TRAP _InitDialogs $A97B .TRAP _InitCursor $A850 .TRAP _TEInit $A9CC .TRAP _Open $A000 .TRAP _Control $A004 .TRAP _SysBeep $A9C8 START ;Initialize Managers PEA -4(A5) ;Space Created For Quickdraw's Use _InitGraf ;Init Quickdraw _InitFonts ;Init the Font Manager MOVE.L #$0000FFFF,D0 ;This Mask Is For All Events _FlushEvents ;Flush All Of These Events _InitWindows ;Init the Window Manager _InitMenus ;Init the Menu Manager CLR.L -(SP) ;restart procedure _InitDialogs ;Init the Dialog Manager _InitCursor ;Init to arrow cursor _TEInit ;Init Text Edit ;------- OPEN THE PRINT DRIVER ------- LEA '.Print',A1 ;Get a Pointer to the Drivers Name LEA IOPARMS,A0 ;Get the Parameter base addres MOVE.L A1,ioFileName(A0) ;Store the Drivers Name addr CLR.B ioPermssn(A0) ;fsCurPerm (whatever we got) _OPEN LEA IOPARMS,A0 ;Get the Parameter base address MOVE.W ioResult(A0),D0 ;Check for an error CMP.W #0,D0 ;is result ok? BEQ @0 ;Yes skip the error bell MOVE.W #30,-(SP) ;beep length _SYSBEEP ;beep to indicate error BRA @4 @0 ;------ RESET THE PRINTER TO DEFAULTS ------- LEA IOPARMS,A0 ;Get the Parameter base addr MOVE.W #iPrDevCtl,csCode(A0) ;Set up a control type call MOVE.L #iPrReset,csParam+lParam1(A0) ;only 1 (Reset) CLR.L csParam+lParam2(A0) CLR.L csParam+lParam3(A0) _CONTROL LEA IOPARMS,A0 ;Get the Parameter base address MOVE.W ioResult(A0),D0 ;Check for an error CMP.W #0,D0 ;is result ok? BEQ @1 ;Yes skip the error bell MOVE.W #30,-(SP) ;beep length _SYSBEEP ;beep to indicate error BRA @4 @1 ;------ ACTUALLY PRINT THE WORD HELLO ------- LEATEXT_STRING,A1;Get address of string to pr LEA IOPARMS,A0 ;Get the Parameter base addres MOVE.W #iPrIOCtl,csCode(A0) ;Set up a text streaming call MOVE.L A1,csParam+lParam1(A0) ;Parameter one is a ;pointer to the text MOVE.L #(TEXT_STRING_END-TEXT_STRING), csParam+lParam2(A0) ;Parameter two is the length of the text CLR.L csParam+lParam3(A0) ;No third Parameter _CONTROL LEA IOPARMS,A0 ;Get the Parameter base address MOVE.W ioResult(A0),D0 ;Check for an error CMP.W #0,D0 ;is result ok? BEQ @2 ;Yes skip the error bell MOVE.W #30,-(SP) ;beep length _SYSBEEP ;beep to indicate error BRA @4 @2 ;------ PRINT A CR+LF JUST FOR THE FUN OF IT -------- LEA IOPARMS,A0 ;Get the Parameter base addres MOVE.W #iPrDevCtl,csCode(A0) ;Set up a control type call MOVE.L #iPrLineFeed,csParam+lParam1(A0) ;only 1? parameter (CR+LF) CLR.L csParam+lParam2(A0) ;Parameter 2 undetermined CLR.L csParam+lParam3(A0) _CONTROL LEA IOPARMS,A0 ;Get the Parameter base address MOVE.W ioResult(A0),D0 ;Check for an error CMP.W #0,D0 ;is result ok? BEQ @3 ;Yes skip the error bell MOVE.W #30,-(SP) ;beep length _SYSBEEP ;beep to indicate error BRA @4 @3 ;---- EJECT A PAGE SO THAT WE CAN SEE WHAT HAPPENS LEA IOPARMS,A0 ;Get the Parameter base address MOVE.W #iPrDevCtl,csCode(A0) ;Set up a control type call MOVE.L #iPrPageEnd,csParam+lParam1(A0) ;only 1 parameter (eject) CLR.L csParam+lParam2(A0) CLR.L csParam+lParam3(A0) _CONTROL LEA IOPARMS,A0 ;Get the Parameter base address MOVE.W ioResult(A0),D0 ;Check for an error CMP.W #0,D0 ;is result ok? BEQ.S @4 ;Yes skip the error bell MOVE.W #30,-(SP) ;beep length _SYSBEEP ;beep to indicate error @4 RTS ; Data Structures TEXT_STRING DC.B 'HELLO' TEXT_STRING_END .ALIGN 2 IOPARMS DCB.L 20,0 ; ------------------ end of program -------------------------------
Letters
First off, I want you to know that I really enjoy reading MacTutor, especially the articles on assembly language. Second I want to report a slight error on page 37 of the June issue. In figure 1 of that issue, a Pascal string is shown as 'fName: String[63]' with it's assembly equivalent as 'DCB.B 63,0'. This could be very misleading. A pascal string is always preceded by a one byte length byte. Thus STR[63] is rendered by DCB.B 64,0. Since using this structure as it was shown could cause an odd alignment of the next data structure, watch out for the 'ole length byte. It could be a difficult bug to track down! Thanks again for an interesting and informative publication.
Made my Day with Modula-2
Terri Wiles, President
Compu-Craft
Thank you for "making my day". We have just recieved the back issues we ordered. It is utterly exciting to see so many articles of substance, especially after months of searching through the pages and pages of the fluff of which certain other Mac magazines are comprised. It is particularly encouraging to me to see articles about Modula-2. I certainly want to express my most sincere hope that this will become a regular column, with particular emphasess on the task of interfacing with the Macintosh.
![](/file/12652/www.mactech.com.tar/www.mactech.com/sites/all/themes/custom_front/img/search_text.gif)
- SPREAD THE WORD:
- Slashdot
- Digg
- Del.icio.us
- Newsvine