Sep 85 Mousehole
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.