Hard_Disk_Install_Feb86 Hard Disk Install Feb86

User Manual: Hard_Disk_Install_Feb86

Open the PDF directly: View PDF PDF.
Page Count: 142

DownloadHard_Disk_Install_Feb86 Hard Disk Install Feb86
Open PDF In BrowserView PDF
-\'\.:;>/ ba.r~'lC:v..Q
-

Wa~~~\)(

'D~\,IR

w o'AP'ov..~Ji

o/rnC7\Af\\-T~
~ I\l)..mt.

~.~ I~t>i()!;.t~\\

v O~~'N

~<;,o~~t"('

I !?~'~~~\\t~

BEGIN
Mainlnitj
In i tBuffer;
InitMyDialogsj

)t ('$\(,

SetCursor(watch}j
AppRefIO := CurResFilej
result := HOOpen;

C

~v..et.e.

{ set up the COPY buffer }
{ set up all the dialog pointers}

{ save ptr to app s resourcef i 1e }
{ Open the dr i vel', add °dr i ves to dr i ve queue, try mount }
I

{check for fatal errors}
SetCursor(arrow);
CheckErr(result);
IF (result = MWorksFnd) THEN
BEGIN
{ if direct-start disk, ask how to proceed}
LDilog := GetNewDialog(MWOilog, NIL, POINTER(-l»j
ModalDialog(NIl, itemhit)j
DisposDialog(LOilog)j
{ remove dialog}
CASE j temh i t OF

{19Apr8S)
{i 9AprSS}

BEGIN
Dolnstal1(ErasDilog, result, BlankDisk)j
IF (result = Us@rCancel) THEN
ByeByej
END;

{erase entire drive}

09AprBS}

{19Apr8S}
':19AprBSJ

{ Replace MacWorks button pressed}

2:

BEGIN
DotitIlnshl1 ;

{19Apr8S}
{19AprBS}
{19AprBS}

{19Apr8S}

END;

{19Apr8S}

{ Cancel button pressed}

3:
ByeByej
END; {of CASE)

~i9Apr85}

{19AprBS}
':19Apr85)

END {of IF THEN}
ELSE IF (result = LisaFnd) THEN
BEGIN
LD i i og := Be tNeIAID i a1og( Li saD i 109 f NI L,
ModalDialogisk = OJ

TYPE
Tdi skMode
"iffisgType

~

=(FirstHalf,

= (WaitMsg,

**** MacWorks

bi gGu"
DDotBlkPtr
bootDiskOut
ntnCancel
btnOK
(opyBuffer
~!rstDiai09

:temHit
DlyBtnHdl
ffiytllgPtr

::\yHDPBlk
myHDPBptr
ITl}'MDPBl k
mYMDPBptr'

:
:
:
:
:
:
:
:
:
:
:
:
:
:

LastHalf, BothHalf, TwoBlks); {data readl~rite modes}
StopMsg, DiskMsg);
{ different flavors of my dia10gs }

Install Variables

***' }

{ TRUE =) IMeg Lisa, 400K COPy buffer, do it in one pass}
{ Pointer to boot block code}
{ TRUE =) Boot sony ejected }
BOOL~~;
StringHandle; { Handle to 'Cancel' button text}
StringHandlei { Handle to 'OK' button text}
Ptr;
{ Pointer to coPY buffer}
{ TRUE =) show the dialog window and draw it in OisplarMs9 }
BOOLEAN;
{ generic dialog response}
INTEGER;
CClOtrolHandlej { 'cancel' button control handle)
{ generic dialog pointer}
DialogPtri
ParamBlockRec; { hard disk I/O parameter block}
{ ptr to hard disk I/O parameter block}
Pa.rmBl KPtr ;
PararnBl ockRec; { micro disk I/O parameter block)
{ ptr to micro disk I/O parameter block}
ParmBlkPtr;
BOOLEAN f
Pir;

[Date 5/Mar.lS5; File -#2tt2-hd/source.TEXTl

Page 4

m;ITex tHdl

: Ha.ndle;
statusPBptr : ParmBlkPtrj
ternpDigPtr : DialogPtr;
watch
: Cursor;
{ Ilfl

Hard Disk Install Variables

appR~fID

r-esult
~Di

{ handle to statText in dialog box}
{ for status calls)
{ Hello dialog ptr }

log

r-ess'trng

:
:
:
:

***' }

INTEGER;
INTEGER;
DialogPtr;
Str255;

{*******~t**********************************************************************}

PROCEDURE MacsBug,
PROCEDURE MacsBugPrint (theMsg! str255);
~

**** MacWorks

INLINE iA9FF;
INLINE $ABFF;

Install External Procedures

f**ll

PROCEDURE ProfileBoot;
PROCEDURE wldgetBootj

{ ****

EXTERNAL;
EXTERNAL;

Hard Disk Install External Procedures

HDOpen : INTEGER;
H[}fount : INTEGER:
!=l~CT I (}I HDF orrna t (. diskT yp e: INTEGER)
Ft~~CT!!JII H[J4anle : INTEGER j
F!J.lC1I!}l WrtBootBns : INTEGER;

{s tar t of Prof i 1e boot code ::
{start of Widget boot code}

f***}

~~iCTION

Fl~4CT!!l'~

INTEGER;

EXTERNAL;
EXTERNAL;
EXTERNAL;
EXTERNAL;

EXTERNAL;

{******************************************************************************}
~forward

declarations of all procedures}

{ *'** HacWorks

Install Procedures

**** }

ClickedBtn (VAR theEvent: EventRecord) : BOOLEANj
FORWARD;
PROCEDURE DisplayMsg (theMsg= INTEGERj theType: TmsgTypej doExit: BOOLEAN);
FORWARD;
PROCEDURE DdiAlnstallj
fORWARD;
jROCEOURE EjectDiskette;
FORWARD;
oqOCEDURE ForceOffl ine;
FORWARD;
PROCEDURE Forc@Rernount;
FORWARD;
PROCEDURE Gettt4Dis~j
FORWARD;
PROCEDURE HOCootrol (theCode: INTEGER; theValue: Ptrj abort: BOOLEAN); FORWARD;
PROCEDURE HDStatus (VAR tbeStatus: ParrnBlkPtr}j
FORWARD;
PROCEDURE InitBuffer;
FORWARD;
PROCEDURE InitMyDialogsj
FORWARD;
°ROCEDURE Mainlnit;
FORWARD;
~UNCT! ON ft4D i sk : BOOL~;
FORWARD;
PROCEDURE ReadBootBlks;
FORWARD;
PROCEDURE ReadDiskette (reactlode: TdiskMode);
FORWARD;
~ROCEDURE Terminate (why: INTEGER);
FORWARD;
PROCEDURE WriteBootBlocks;
FORWARD;
PROCEDURE WriteToDisk (writ@Mode: TdiskMode);
FORWARD;
Fu~CTlm4

{ **** Hard Disk Install Procedures

**** }

[Date S/MarJ85; Fiie -#2tt2-hdlsource.TEXTl

Page 5

PROCEDURE ByeBye;
FORWARD;
PROCEDURE CheckErr (error: INTEGER);
FORWARD;
PROCEDURE CvtNum (nurn: INTEGER; VAR str: str255)j
FORWARD;
PROCEDURE Dolnstali  <> 0) THEN {user selected canceD
Ci ickedBtn := TRUEj

=Wind!»lPtr(myDlgPtr»

~tempWindow

i

END

ELSE
SysBeep(10) j
SetPort(savePort);
8~D;

{of

F~iC

{ and restore the state of thePort }

ClickedBtn}

~*~*************************4*4***4********************f*ff********************}

PROCEDURE DispiayMsg (theMsg: INTEGER; theiype: TmsgTypej doExit: BOOLEAN);
{display the dialog in my string list specified by {theMsg)}
lJAR

al100ne
dummy
0;yEver! t

ternpStr-

:
:
:
:

BOOLEAN;
BOOLEltij
EuentRecor-d;
Str255j

BEGIN
{get

the

string

specified by  0) THEN

{of PROC EjectDiskette}

f*****************************************************f************************)

PROCEDURE ForceOfflinej
{Force sony off-line}
~r'r

:

OSErr;

BEGIN
er~ := PBOffLine(myMDPBptr f FALSE);
EjectDiskettej
a~Df

{of PROC ForceOffl ine}

<*f****************************************************************************}

PROCEDURE ForceRemount;

[Date 5;Mar/B5; File -M212-hd/source.TEXTJ

Page 8

{Force the user to insert the boot sony}
err

takeHdl

: OSErrj
: Handl e;

8EGIN
{asking for the resource from an off-line disk forces it on-line}

EjectDiskette:
taKeHdi := GetResource(~RlCH/, 0);

{ get rid of MacWorks diskette

boo to i skOu t := FALSE;

{ Boot sony back in }

END; {of PROC ForceRemount}

<******************************************************f**ff********f***f*f*f**}

PROCEDURE Get~Disk;
{~sk the user for the original (source) MacWorks diskette}
I·JAR

goodDisk : BOOLEAN;

BEGIN
goodDisK

:=

FALSE;

REPEAT
Di SI) 1atMsg( Be tOl cH4, 0i skMsg, TRUE);

IF (NOT MWDisk) THEN
BEGIN {not a macworks diskette, so eject and let user bailout}
EjectDi sK@ttej
DisolaYHsg(NotMWDisk, StopMsg, FALSE);
END

ELSE
goodDiSK := TRUE;
lJ411 L go odD i sl<;

94D: {of PROC GetMWDisk}

{******************************************************************************}

PROCEDURE HDControl

(th@Code~

ItfTEGERj theValue: Ptr; abort: BOOLEAN);

cDntroi calls to the hard disk}

~do

-;-yPE

;takePBrec = RECORD
: Ptr;

temp 1
ternp2
temo3

: INTEGER;

; OeDITID 1et i on

: INTEGER;
: Ptr;
: ProcPtr;

temp 6

: INTEGER;

ioNamePtr
i cMRefNum

: Ptr;
: INTEGER;

temp4

ioRefNum
: INTEGER;
csCode
INTEGER;
csParam
Ptr;
END; {of RECORD}
(Date

~'Mar/B5;

File

-~2*2-hd/source.TEXT]

Page 9

~f'r-

ffivCCPBlk
rnyCCPBptr

: iNTEGER;
: TfakePBrec;
: ParrnBlkPtr;

BEGIN
ITl)'CCPBptr" := ParmBlkPtr(i!lyCCPBlk);

wlTH myCCPBlk DO
BEGIN
; l)COOl~1i eti on := n i i ;
,oNamE'Ptr" := ni 1;

;ot)ReH4um
~DRefNurn

:= HDVRefnurn;
:= HDdrvrRefnum;

csCode := theCode;
csParam := theValue;

END;
~rr := PBControl(rnyCCPBptr, FALSE);
IF (err 0 0) THEN
IF (abor t) THEN

BEGIN

CutNurn(err, resStrng);
paramtexHresStrng,'"'

,n

{ set error id for dialog dispiayj

Ill);

Terminate(CantControl);
EN[);

SiD;

{of

PROC HDControl}

******************************************************************************)

PROCEDURE HOStatus (VAR theStatus: parrnBlkPtr);
{do status (ail to hard disk driver)
err

INTEGER;

BEG!N
WITH theStatus· 00
BEGIN
ioCornpletion := nil;
:QRef~urn := HDdrvrRefnurn;
;oVReinurn := HDVrefnum;
(sCDd~ := StatusCode;

{ hard disk driver refnum }
{ hard disk default volume number}

END;

PBStatus(theStatus, FALSE);
IF {er~ <> 0) 1HEN
~rr

:=

BEGIN

CutNurn(err, resStrngl;
,'"' ,'-');

Pa.ramle~t(resStrng/i

T~rminate(CantControl);

END;

[Date

~lMar/85;

File -#212-hdlsQurce.TEXTl

Page 10

~~D; {of

PROt HDStatus}

{flllllii*llllf!***!*****!*******'********"*f"**'****************************}

°ROCEDURE InitBuffer:
{ajlocat~ 200KJ400K buffer, set bigGuy flag if lMeg Lisa}
'')AR
hOlJ.!f1uch

Si ze;

BEGIN
t! ; gGu y :=

FALSE;
:= 409600;
cDpyBuffep := NewPtr(h~1uch);
iF (copyBuHer () NIU THEN
~ry~,uch

{try

for 400K}

BEGIN
bi gGU:f := TRUE;

EXIT(lnitBuffer);

END;
{try for 200K}

howMuch := 204800;
COptBuffe!' := NewPtr(ho~uch);
iF {copyBuffer =NIL> THEN
Terminate(Cantlnit);

END;

{of

PROt InitBuffer)

{******************************************************************************}

PROCEDURE InitMyDialogs;
:·)AR

: INTEGER;
tempRect : Rect;

myType

: INTEGER;

BEGIN

myDlgPtr := GetNewDialog(MyOlgIO, NIL, Pointer(-l»j
IF ;rnyDlgPtr = NIL) THEN
Terminate(Cantlnit);
GetDltem(myOlgPtr, 1, myType, Handle(myBtnHdl), tempRect)j

=NIL) THEN
Terminate(Cantlnit);

IF (myBtnHdl

GetDltern(myDlgPtr, 2, myType, myTextHdl, ternpRect)j

IF (myTextHdl = NIl) THEN
;erm!nate(Cantlnit);
btnOK := GetString(OKbtnIO);
btnCancel := GetString(CancelbtnIO);
firstOialog := TRUEi
2ouidDiaiog(MyDlgIO);

{ for DisplayMsg stuff}
{ guaranhe the dialog is in memor-y, since we eject the diskette

[Date 5/Mar/85; Fi 1e -tt2tt2-hd/sQurce .TEXTl

Page 11

EN!); {OF PROC Initr1yDiaJogs}

{******************************************************************************}

PROCEDURE Mainlnit;
{set up ~arious mac managers}

BEGIN
!nitGraf(athePort)~

!pitCursor;
Ird tFonts;
iriti,;iindOlAsj
!nitMenus;
lElnit;
InitDialogs(NIl);
watch

:=

GetCursor(WatchID)~A;

F1ushEvents(eueryEuent, 0);

rnyDlgPtr := NIL;
ffiyBtnHdl

:=

{get the busy cursor}
{clear out event queue}
{in case we bomb out in initialization}

NJ L;

bootDiskOut := FALSE;

{set up hard disk &: sony disk parameter blocks}
mnmPBp tr := imyHDPBl k;

WITH myHDPBlk DO
BEGIN

NIL;

\oNarn~Ptr

:=

toRefNum
i QiJRefNurn
,DPosNode
;DPerrnssn

:= HDdrvrRefnurn;
:= HDVRefnum;
:= 1;
:= 0;

{ hard disk driver refnum }
{ default volume for hard disk
{ absolute positioning}
{ read/I",r ih perm iss i on )

END;
!'!!yMDPBp tr := irnyMDPB11<;
fAITH myMDPBl k DO

BEGIN
''jNam~Ptr

:=

NIL;

ioRefNum := SonyDrvrRefnum;
i cMRefNum := SonylJRefnum;
ioPosMode := 1;
ioPerrnssn := OJ

{ Sony driver refnum }
{ default drive number for internal sony}
{ absolute positioning}
{ read/write permission}

END;
END; {of PROC Mainlnitl

{******************************************************************************}

MWDisk : BOOLEAN;
{returns TRUE if the first two blocKs on the diskette look 1iKe Monitor format}

FL~CTION

.. i l'S t~lol'd

l€rnpPtr-

ltHEGER;
4INTEGERi

BEGIN

(Date 5/Mar/B5; File -M2.2-hdlsource.TEXTl

Page 12

ReadDiskettenl..l/oBH:s) ;

{now check out t'he lK in CopyBuffer to decide if it's monitor format}

tempPtr := Pointer(ORD(copyBuffer»;
f!rstWard := tempPtrA;
~F

{ get the first word}

d j rstWord =$46Fc) THEN
Ml,4D i sk := TRUE

{ Monitor disk first

~ord

}

ELSE
t'AD i sk := FALSE;

END; {of

Flt~C

ti4D i sK}

{******************************************************************************}

PROCEDURE ReadDiskette  NIL) THEN
Dj sp i it/!'1sg(\Jihy 1

StopMsg, TRUE)

ELSE
ByeByej
b~D;

{of PROC Terminate}

{******************************************************************************}

PROCEDURE WriteBootBlocks;
{1}Jrite out the 8 blocks of boot code/volume map info}
TYPE
TByte

{ one byte of storage }

= -128 •. 127;

TI ntPtr'

= INTEGER;

;DisKType

= (ProfileDisk, WidgetDisk);

A

rstattslnfo = RECORD
ioStuff : ARRAY [0 •• 27] OF TByte;
error
lnfol

: INTEGERj
: INTEGER;

info2
DGEl

: INTEGER;
: ARRAY [0 .. 13] OF Tbyte;

{ all the ioCompletion, etc

Par~Block

realSize : INTEGER;
HJDDRB : TByte;
diskType : TByte;

restoiit : ARRAY (0 •• 20J OF TByte;
&iD; {of RECORD}

codeP1r
fakePtr

{ pointpr to block of code}

: TlntPtr i
: Longlnt;
: INTEGER;

hDiskinfo
tagBui

: TStatuslnfo;
: ARRAY [0 •• 265) OF INTEGER;
tagBufPtr: Ptr j
thpDiskType : TDiskType;

{ 532 bytes of header + data

= 266 ~ords

BEGIN

{find out

~hat

type of disk is attached}
[Date

5/Mar/8S; File -tt212-hdlsource.TEXTJ

Page 14

}

stuff

siatusPBptr := ihDisklnfo;
HDStatus(statusPBptr);
IF

{} (I) THEN
theDiskType := WidgetDisk

 nil) THEN

BEGIN
Hi deW j; ndow(myOl gPtr) j

DisposDialog(myDlgPtr)
END;

IF (bootDiskOut) THEN

BEGIN
EjectDiskette;
ForceRemount;

{ in case any MacWorks diskette is in the drive}

ENDj

{ Jump to end of program }

GOTO 99;
END,

{****************f**************ff*f**********f**f****fffff*f*fffff*f*fff**ff!f}
~rocedure

CvtNum (num: INTEGERj VAR str: str25S);

BEGIN
num < 0 then begin
cutnum(-num,str);
str := concat(!-',str):
end
else if num )= iO then begin
cutnum(num div lO,str);
str := concat(str J I I);
str[length(str)] := chr«nurn mod 10)
if

f

ord('O'»j

I!od

else begin
s tr := .: ";

str(l] := chr: H ress trng,
,1I) ;
itemhit := StopAlert(InitAlert, NIL)
!! , "

{ convert error to string}
{ set error id for alert display}
{ Signal error for debug purposes}

END;
NoDrvErr:
iternhit := StopAlert(NoDskAlert, nil);

{ No disk found}
{ Display error}

NoSpace:

{ No blocks available
{ Display error}

iternhit := StopAlert(SpcAlert, nil);
OTHERWISE
EXIHCheckErr) ;
END; {of CASE}

END; {of PROC CheckErr}

{1*lfff*lf****.**'****'*****'***"*****"****"********************************1

PROCEDURE Dolnstall (dilog1D: INTEGERj VAR error: INTEGER; drivetype: INTEGER);

{ Assum@s dialog presented has two buttons, first is Cancel type, second is OK type}

theDi10g

: DiaiogPtr;

begin

theDilog := GetNewOialog(dilogID, NIL, POINTER(-l);
r1ooalDialog(NIL, i hrnhi t);
nisposDialog(theDilog);
~:; ;
CheckErr(error)

{ name the hard disk &write out the directory}
{ check for fatal error }

END

error := UserCancel;

{ user hit Cancel button}

END; {of PROC Dolnshll }

{******************************************************************************}

PROCEDURE IsIeonlnSysResj
~

ChecK If

icon already in system resource file; if not, install }

!",IAR

theNarne3
theName4
:neTyoe3

· Str255;
·: St.r255;
REtslype;

thei~'pe4

:
:
:

m~/Attr3

ffiyAttr'4

RpsType;
nfrEGER i
INTEGER;

ItffEGER;
·: INTEGER;
· Handle;
: Handle;

thelD3
theID4
:1'I:rHand13

fllyHand14
BEGIN

UseResFi)e(O);
{ switch to system resource file }
GetResource('ICNI' ,Proleon); { check if icon installed}
IF (myhandi3 = NIL) THEN

rnyhand13 :=

BEGIN

{ First get Profile icon
UseResFile(AppRefIO)j
SetCursor(watch);
~'thand13 := GetResQurce('ICN#' ,ProJcan);
GetResInfo(rnyhand13,theID3,thetype3,thename3);
~yattr3 := GetResAttrs(rnyhand13);
DetachResource(myhand13);

{ restore ptr to app's resource file}
{ set busy cursor }
{ get the ICN# handle}

{ Do same for internai disk icon}
GetResource(,ICNtt !IntrnlIcon); {get the ICN# handle}
GptReslnfo(rnyhand14,theID4,thetype4,thename4)j
ITI/aHr·4 := GetResAttrs(myhand14);
DetachResource(myhand14)j
IT!yhand14

;=

J

{ switch to system resource file}

VseR~sFile(O)j

AddResour-ce(rnyhandI3,'ICN#' ,theID3,thename3)j { add Pr·ofile icon}
~yattr3 := myattr3 + resChangedj
{ set resChanged bit
SetResAttrs(myhand13,rnyattr3);
{ write new attribute flags}

:Date 5/Mar/85j File

-tt21t2-hdJsource.TEXTl

Page 19

AddResource(myhand14, leNtI' ,theID4, thename4); { add Internal di sk icon }
myattr4 := rnyattr4 + resChanged;
{ set resChanged bit}
3e tResAttrs(myhand14,myattr4) ;
{ ~rite ne~ attribute flags}
I

JpdateResFile(O);
ReleaseResource(myhand13);
ReleaseResourcetmYhand14)

{ ~rite out the resources to system resource file}
{ release resources}

END
ELSE
ReleaseResource(myhand13);

{ just release resource}
{ restore cur res map as mine

UseResFl eCAppRefID);

IIII

}

END; {of PROC IsIconlnSysRes}

i*************************I****************************************************}

~ROCEDURE

{read

th~

ReadBootBlks;
MDnitor bootblocks 1 (hopefully) Just

~rote

to the hard disk}

'JAR
~r!'

INTEGER;:

BEGIN
i,fJTH myHDPBl k 00

BEGIN
;oBufter := copyBuffer;
:oRefNum := HOdrvrRefnum;
;oVRefNum := H~IRefnurn;
ioReqCount := 512;
ioPosOffset := 0;

{ hard disk driver refnum }
{ default volume for hard disk}
{ read one block}
{ from the beginning)

8~D;

err := PBRead(myHDPBptr, FALSE);

e4D; {of PROC ReadBootBlks}

{******************************************************************************}

{start of main body of HOI (Hard Disk Install)}

SEGIN

?~.

t'1ainlnitj
In i tBuHH";

{ set up the coPY buffer }
{ set up all the dialog pointers}

InitNyOialogs;
SetCursor(watch);
AppRefID ;= CurResFile;
result := HDOpen;

~o

{ save ptr to app's resource file}
{ Open the driver, add drives to drive Queue, try mount}

:check for fatal errors}
SetCursor(arrow)j
Ch~cKErr(result)j

IF (result
BEGIN

'0..\

=MWorksFnd)

LDi109 :=

THEN

6etNe~Oialog(t140ilog,

{ if direct-start diSK, ask how to proceed}
NIL, POINTER(-1»;

!:Date 5/Mar/85; Fi ie -M2M2-hdlsource .TEXT]

rz.

f6' "

Page 20

{19AprBS)
:19AprBS}

1\

o\>~~

ModaIDialog(NIL, itemhit);
DisDDsDia)og(LDilog);

{19AprBS}

{ remove dialog}

{19Apr85}

CASE temhit OF

{19AorBS}

{ Initialize button pressed}

{19Apr85)

{19AorBS;

BEGIN

Dolnstal1(ErasDilo9, result, 81ankDisk);

{erase entire drive}

iF (result = UserCancel) THEN

B;'e8ye;
END;

{ Replace MacWorks button pressed}

2:

{19Apr8S}
{19Ap!'8S}
[19Aor85l
{! 9Ap!'85}

{19AorSS}
{19AorBS}

BEGIN
Dotll.41n~.h 11

i

{19ADr8S}

END;

{i 9Apr8S}

{19Apr8S}

{ Cancel button pressed}

{19Anr8S}
{19Aor8S}

ByeB:/e;
ENn"; {of CASE}

END {of IF THEN)

{19A~r85i

= LisaFnd) THEN
BEGIN
{ Lisa OS format, ask about sharing}
LDilog := GetNewDialog(LisaDilog, NIL, POINTER(-l»;
ModalDialog(NIL, itemhit);
DisposDialog(LOilog);
{ remove dialog}

ELSE IF (result

CASE i temh i t OF
{ Share button pressed }

1:

BEGIN
~esult := HOMount;
{ Try to do mount of drive}
CheckErr(result);
{ CheCK for fatal errors}
iF  ,A?
t1Q1')EM .L (SP)+ ,AO/A2

jsave other regs
;Stack space for dummy 1/0 request
;clear buffer space area for block data

;save buffer address
ido read
; of page 0 block for Lisa OS
; with no offset
;set 01 =512
jread single block
;translate block # to byte offset
jsave as read position
;from start of disk
;60 do it, result in DO
jcheck for error
;skip if yes
jget buffer address
;check block size/data size parms
iS~ip if not correct
iget last block used value
;add I of unused blocks
;length of drive Queue element
jblocks used same as drive size?
;skip if no blocks available
;else save as first block for Mac area
;and set correct value for Mac disk total blocks
;set Lisa disk found return code

jPOP space for sector and 1/0 request
;restore regs

riOVEM.L (SP)+ ,A3-A6

BRA.S

DONE

;and exit with result

;HERASE 0ISK
18

SUBIW
BNE.S

HOVE,IA
BNE.S

(#EraseCode-InitDCode>,Dl j Erase (format) disk?
NoCmd
Eraselyp(AO) ,DO
; erase entire disk?
,9
; skip if not

tiOVEM.L A3/A6,-(SP)

BSR,S
MOVE
t11J1JEQ

GETLCLS
SIRTBlK(A3) ,DO
ttDQEL,Dl
ADD.W oO,DGDRVSIZE(A3,Dl)
STRTBLK(A3)
CLR
NQlJEM .L (SP)+,A3lA6
[Dah

i else save regs
; get ptr to locals
; get start block
; get offset to drive queue element
i update disk size
; and set starting block as block 0
; restore regs

5/Mar.l85; Fi le -#2M2-hdldrvr .TEXTl

Page 9

setup dummy request block to do format
AO,-(SP)
ttIOGELS12E,A7
A7,AO

isave regs
;Stack space for dummy 1/0 request

#127,DO
-(SP)
DO,atO

,clear buffer space area for block data

CLR.L
OSF
MOVE.L

A7, 1OBUFFER(AO)

MO'JE.B
MOIJE.W

11,INITRGST(A2)
MWRITCMD, I OTRAP(AO)
IDGEL,DO
ttDRIVE4,OO
DGDrvSize(A2!DO),DO

jsave buffer address
;request zero operation
;via write command
;get drive size in blocks
jptr to drive locals (assume drivel

r1I1JE.L
SUBA

HO'JE.L
~1OIJEQ

dlu

t10VEQ

ADO.L
MOiJE.W
M(IIJEQ
ASL.L
MUlU

jset 01

#2,01

=4)

=512

IS,Dt
Dl,DO
DO,IOBYTECOUNT(AO)

MOIJE.L
NOIJEIl

#0,00

OO,IOPOSOFFSET(AO)
#l,IOPOSMOOE(AO)
CALLORIVER
INITRGST4GCrnd

M~E

IControlErr,DO

Done

BRA

DiskDone

; unsupported command

j-----------------_._-----------------------------------------Subroutine to compute ptrs to drive locals
Returns: A3 - ptr to drive specific locals
A6 - ptr to driver locals
Destroys: Dl,D2
GETLCLS
NOVE.L Hds,kVars,A3
f10VE •L A3,A6

ADD.L
CLR.L
CLR.L
MOVE.W
E:UBIi
MOVE

#DRIVE4,A3
01
D2
Drive(A6),Dl

r1ULU

D2~Dl

ADD.L

DlrA3

#Drv4~Dl

IDrvlcllth,D2

;get ptr to locals
;save as global ptr
;set ptr to start of drive locals
;c1ear for use
;9@t drive I currently active
;convert to multiplier
;get length of drive locals
;cornpute offset to drive's locals
;and set ptr to specific drive's locals

n'TS

[Date 5/Nar/BS; File -1212-hdldrvf.TEXTJ

Page 10

;------------------------------------------------------------------------------;

; CHK4DISK - check for disk. attached to designated port
i

Arguments: AO (input) -- pointer to caller's parameter block
Al (input) -- pointer to device control entry
A3 (input) -- pointer to drive specific locals
A4 (input) -- pointer to port base address data lines
AS (input) -- pointer to port base address reset lines
A6 (input) -- pointer to driver locals
DO (output) -- result code
01 (input) -- drive I

,------------------------------------------------------------------------------CHK4DISK
i

MOVE.L

AO,-(SP)

;save reg

check to see if there really is a drive attached

.4

A4,tLJBASE(A3)

MOIJE .L

MO'JE.L A5, tlaJRESE/(A3)
t1IJ1JE. B IDDR82,HWDDRB(A3)

ttVIABASE ,A4

CMP.l

BEQ.S

.0

MOVE.B

IDDRB3,HWDDRB(A3)

MOVE.W

01,DRIVE 0 IFF CALL ANOTHER STATE
LPI
;DAll At~OTHER ROUTINE IF DO (> 0

;Exit the driver's state machine
E;
lRA(A4) ,2(A1>

MO'JE.B lRA(A4),3(Al)

;---------------------------------------------------------eTST

#3,lFR(A4)

Et4E.S

~1

; PAR 1TY

ERROR?

;-------_._------------------------------------------------[Date 51Mar/B5; File

-#2#2-h~/drvr.TEXT]

Page 20

'olOVEQ

#0 , DO

BRA.S

,2

iVal id status
jlnval id status
jrestore reg

!~~OlJEQ
Itl,DO
MOVEM.L (SP)+,Al

R1S

l
~--------------------------------------------------------------

;RE4D DISK

STATUS

; return: continue at next state, or return with parity err or hard err

BSR
TST

RD__STATUS
DO

BNE.S

.10

;Read status
;Status val id?

GNPI.8 H09,STATUS(A3)
BEQ.S ,3
;JUST

C~ffINUE

IF GOT eRe ERROR

~~

READ

NOVE.L HC140COOO,DO
~4D.L

BEQ.S
r'1DVE
t10VEQ
RTS

110

MOVE
NOIJEIl

STATUS(A3) ,DO

,3

;SEE IF FATAL ERROR PRESENT

ttHD_ERR,ERROR(A3) ; YES
#O!DO
ItPRTY_ERR,ERROR(A3) ;status not valid
10,00

RTS

ADDIl

M2,STATE(A3)

; advance to next state

M(IIJEQ
RTS

#1 !DO

; do it now

lRDHDR

READ HEADER FROM PROFILE

=I/O address
= File tag ADDRESS
00,02 =SCRATCH

AO

Al

D1

RDHDR

NOVElL
NOVEll

AO,-(SP)

LEA

IRA(A4) ,AO
(AO) ,DO
00,01
DO, (A1)+

HOVE.B

EDR.S
MOVE.S

#2,D2

NOVE.S

(AO),DO

EOR.S

00,01

MO'JE.B

DO, (A1)+
(AO) ,DO
00,01
DO ,(A1)+

NOllE.S
EOR.S
NOVE.S

i2

= CHECKSUM, UPDATED WITH THIS DATA

~1OVE .B

(AO),DO

EOR.S

00,01

"IO'JE .B

on, (AU+

OBF

D2 ~'1

NOVEQ
MOVE.B

Itl,02

EOR.S

00,D1

jsave reg
;read 12 bytes of file tags into buffer
isetup read address
j ge t 1s t by te
;add to checksum
jmove to buffer
;get 2nd byte
jget 3rd byte
;get 4th byte

iget remaining 8 bytes of header

(AiO) ,DO

(Date

~lMar/85j

File -12.2-hdldrvr.T[XTJ

Page 21

NOP

jneeded

l"!QiJE.B

(AO) ,DO

EOR.B

00,01

for timing

NOP

NO'JE.B
EOR.B
NOP
N!JIJE.B
EOR.B
DBF
NOVE.L
PTS
jRODATA

(AO) ,DO
00.01
(AO) ,DO
DO ~01
D2,'2
(SP)+ ,AO

;restore reg and exit

READ DATA FRll1 PROFILElWIOGEI, AND UPDATE CHECKSlt1
AO =110 ADDRESS,
A2 =DATA ADDRESS(CLOBBERED ON RElURN)
DO,D2 =SCRATCH
01 =CHECKSUM, UPDATED WITH THIS DATA

NOTE: OPTIMAL READ RATE HAS 14-21 CPU CYCLES BETWEEN BYTES 
;00 = SCRATCH
SEQUENTIAL WRITES MUST OPTIMALLY TAKE 14-21 CPU
CYCLES, INCLUDING THE WRITE INSTRUCTION ITSELF
I,JRDATA

[Date S/Mar/8S; File -1212-hd/drvr.TEXTl

Page 5

NOVE.L AO,-(SP)

jsave reg
;WRITE 4 BYTES, 128 TIMES (512 BYTES TOTAL)
jsetup port address
jWRITE 1ST BYTE OUT

#127,00
ORA(A4) ,AO
LEA
MOVE.B (A2)+, (AD)
NOP
MOVE.S (A2)+, (AO)
MO'JEn

il

;WRITE 2ND BYTE OUT

NOP

f10VE ,S (A2)+ ,(AO)
NOP
' '{OVErB (A2)+, (AO)
DBF
DO,il
MOVE,L (SP)+ ,AO

jWRITE 3RD BYTE OUT
;WRITE 4TH BYTE OUT
;REPEAT
;restore reg and exit

RTS

;wR_W DATA
;Input -

WRITE DATA BUFFER TO WIDGET - COMPUTE

AO = DATA BUFFER (CLOBBERED
A2

=HARDWARE OUTPUT ADDRESS

~

CHECKSl~

ON FLY

RETURN)

DO :: SCRATCH

j

;Output D1

=Computed checksum

SEQUeffIAL WRITES MUST OPTIMALLY TAKE 14-21 CPU
CYCLES, INCLUDING THE WRITE INSTRUCTI~ ITSELF
!.JRJJDATA

i1

MOVE.L
LEA
r10VEQ
NDVEQ
MOVE.S
EOR.B
NOVE,S
NOVLB
EOR.S
t~OIJE .B

AO l'-(SP)
ORA(A4) ,AO

;SilJe reg
;setup write address
;Start of checksum
;WRITE 4 SYTES, 128 TIMES (512 BYTES TOTAL)
jGet 1s t byte
;Include in checksum
;Wrih 1st byte
jGet 2nd byte
;Include in checksum
;Wr i te 2nd byte
;Get 3rd byte
jlnclude in checksum
;Wr i te 3rd byte
;Get 4th byte
;Include in checksum
;Wr i te 4th byte
jREPEAT
;restore

ttO~Dl

1127,DO
(A2); ,02
D2,D1
02, (AO)
(A2,)+ ,D2
D2,D1
02, (AO)
(A2)+ ,02
02,01
02, (AO)
(A2)+ ,02

NOVE,B
EDR,B
MO'JE.B
MOVE.B
EDR,S 02,01
MOVE,B D2 J (AO)
00,,1

DBF

MCNE.l (SP)+,AO
RTS

;WRHDR

WRITE HEADER TO PROFILE

;Al = FILE 'TAG BUFFER (A1 CLOBBERED
;AO

= HARDWARE

OUTPUT

ADDRESS J

01

I}J

RETURN),

= CHECKSlJ1

BYTE J

02

= SCRAlCH

i~RHDR

MOVE.L

MQ\)EQ

,1

LEA

t1OVE.B

AO,-(SP)
#2,D2
ORA(A4) ,AO
(At)+, (AO)
[Date

jsalJe reg
;first write file tags
jsetup read address
;wr i te 1st byte

5/Mar/85j File -1t2tt2-hdldrvr.TEXll

Page 6

f~OP

(AI)+, (AO)

;for t imi n9
;wr i te 2nd byte

i'1!JJE ,B

(A1)+ ,(AO)

jwr i te 3rd byte

NOP
!"'(NE.B

(Al)+~(AO)

jwr i te 4th byte

r1OVE,B

NOP

NOP

~2

DBF

D2,'1

CLR

DO

MO'JE .B

DO ,(AO)

;write 7 bytes bf 0
,wr i te it
;need for tim i n9

NOP
HOVE ,B

DO, (AO)

NOP
i~OVE.B

DO,(AO)

NOP
t10VE ,B

DO, (AO)

NOP

t1OVE.B
NOP
NOVE .B
NOP
t10VE .B
NOP

OO,(AO)
DO, (AO)
DO,(AO)

finaHy write out the checksum
r10VE .B
NOIJE .L

CHECKSUM(A3),(AO) jwrite checksum as 20th header byte
(SP)+ ,AO
;restore reg and exit

HTS

WRITE HEADER TO WI DGET - CIJ1PUTE CHECKSIJ1

:I..JRJ~HDR

Input AO
Al
DO
01
D2

= HARDWARE

IJ~

FLY

OUTPUT ADDRESS
(At CLOBBERED ON RETURN),

=FILE TAG BUFFER
= SCRATCH
=CHECKSUM BYTE
= SCRATCH

l4RJ,IHDR

~i

NOVE.l

AO,-(SP)

M()iJEG

tt2~D2

LEA

ORA(A4) ,AO
(Ai)+ ,DO
DO ,01
DO f (AO)

\'i)OVE,B

EDR.S
M[II.JE.B
MOVE.B
EOR.S
M,OVE.B
MIJI.JE.B
EDR.B
MOVE,B

MOVE.B
EOR.B
NOVE,S
DBF

(A1H,00

DO!Dl
DO ,.(AO)
(A1)+ ,DO
00,01

DO I (AO)
(A1)+ ,DO
OO,DI
DO,(AO)
D2,il

jsave reg
;first write file tags
;setup read address
jget 1st byte
jadd to checksum
;write it
jget 2nd byte
jadd to checksum
jwr i te it
;get 3rd byte
jadd to checksum
;write it
;get 4th byte
jadd to checksum
;wr i te it

(Date 5IMar/85j File -8282-hdldrvr.TEXTl

Page 7

'~,.:,

Ji,;,

CLR

00

t101JE. B

OO,(AO)

jwrite 7 bytes of 0
jwrite it
;need for t imi n9

NOP
r10VE .B

DO ,(AO)

NOP
t10VE .S

DO,(AO)

NOP
~~Q!JE .S

DO,(AO)

NOP
HO'JE .8

DO,(AO)

NOP
~'IIJJE .B

DO, (AO)

NOP
NIJJE ,B

DO, (AO)

NOP
finally write out the checksum
!'IOVE.S

MOVE .l
RTS

;write checksum as 20th header byte
;restore reg and exit

Dl,(AO)
(SP)+ ,AO

,--------------------------------------------------------------!

;WRITE SUCCEEDED, SEE IF NEED TO VERIFY

j Used only by devices that do not support multi-block commands
; return: continue at next state (read) or at HS state, or return successful

jVERIFY NOT CURREtffLY SUPPORTED

;-----------------------------------------------------------------------1'ST .8

V_FLAG (A6)

BEQ.S

i20

;SKIP IF NO VERIFY NEEDED

ADDQ
CLR.B
NOVEll

*2,STATE(A3)
CMD_BUFFER(A3)
Itl,DO

j

advance to next state

; CHANGE C~~D TO READ
; CONTINUE

RTS

j-----------------------------------------------------------------------jIssue new command to continue request (sect_left) 0)
;Exit (sect_left

no

= 0)

ADJ_HDR

jcatl routine for header adjustment

1ST.B

INITRQS1(A6)

BElLS
t11J.}E .l
MOVE.L
MOVE.L
MOVE.l

i25

;doing initialize?
jsk ip if not

AO,-(SP)
D4,AO
IOBUFFER(AO),A2
(SP)+ ,AO

BRA.S

330

;save reset ptr
jget param blk ptr
;~lse restore buffer ptr
;restore reset ptr
;and continue

BSR.S

ADJ-.NEXTBLK

;and setup for next block

BSR.S

[Date

~'Har/85;

File -B2B2-hd/drvr.TEXTl

Page 8

~30

ADDQ,L 11 ,SECiOR(A3)
TST.L SECi_LEFT(A3)

jupdate logical block ptr
;more to transfer?
BEQ.S .40
;Skip if no more sectors
'10iJE-W ttNEltCHO-SiATE_TABLE,STATE(A3) jIssue new command
M~JEQ
Ml,OO
jAdvance to next state now
RiS

~40

jTest sparing on last sector
BTST 1t2,STATUS+l(A3)
jSparing occur?
~iE.S
.41
;skip if yes
11()l.)EQ ItO ,DO
jreturn immediately
RTS

i4i

MWE
t10VEQ
RTS

ttHS-STATE_TABLE ,STATHA3) ;00 ONE MORE tJANDSHAKE IF SPARING
ttl ~ DO
; Do i t now

;---------------------------------------------------------------

jREAD DATA TO CfI1PUTE CHECKSlti ~LY
; return: continue in HS state, or return without error or with parity
or checksum error

S20

,':..I

-

·~10

,11

~20
!~ER2

t10VEQ
"1;5T ,8

ItO,01
DRIVETYPE(A3)

BNE.S

,10

;Profile/Seagate
BSR.S RHDR
NOVE
8511 ,02
MWE.B (AO) ,DO
EOR.S 00,01
OBF
02,.3
BRA.S .20
;Widget
NOVE
#511,02
MOVE.B (AO) ,DO
EOR,S 00,01
DBF
02,.11
SSR.S RHOR
lST.B 01
BElLS CS_OK2
M!Jv'E
ItCS_ERR fERROR(A3)
tJ!OVEI1 10, DO
RTS

;INIT CHECKSUM VALUE
jWIDGET?
jSKIP IF YES
;READ HEADER FIRST
jREAO DATA
jEXCLUSIVE-OR
;REPEAT

;READ DATA FIRST
jEXCLUSIVE-OR
jREPEAT
; READ HEADER
;NOW SEE IF CHECKSUM IS ZERO
;NON-ZERO CHECKSUM OR PARITY ERROR IN DATA

eS_DK2 8TST

13,IFR(A4)
BNE,S CER2
jPARITY ERROR?
CHPI,B I$09,STATUS(A3)
BEQ.S CER2
;now RETURN WITH CHECKSUM ERROR IF CRC READ ERR

120

;Issue new command to continue request (sect_left> 0)
;Exit (sect_left =0)
BSR,S ADJ._HOR
;call routine for header adjustment
BSR.S ADJ_NEXTBLK
;and setup for next block
AODQ,L *1,SECTOR(A3)
jupdate logical block ptr
SUBQ.L 11,SECT_LEFT(A3)
jdecr sector count
[Date 5/Marl85j Fi le -*21t2-hdldrvr .TEXTl

Page 9

BEG.S

jSkip if no more sectors

.30

'1Q1JE.S 11,CMD_BUFFER(A3)
; Change command back to wr i h
j'1OVE.W MNEltCND-STATE_TABLE,STATE(A3) jlssue new command
"1 0',) EI1 #1,00
jAdvance to next state now
RTS
~30

8TST
!3NE.S
l10VEQ

12 ,STATUS+l (A3)
.40
10,00

;TEST ·SPARING OCCURRED- BIT
;skip if set SET

IUS
.40

t10VE
y10VEQ

; EX 11

ItHS-STATE_TABLE,STATE(A3) iSET TO DO

~E

MORE HANDSHAKE IF SPARING

#1,00

RiS

jRHDR

RHDR
J2

READ HEADER FROM PROFILE
AO =HARDWARE READ ADDRESS
DO,D2= SCRATCH, 01 =CHECKSUM, UPDATED WITH THIS DATA
03 = CHECKSUM-PRESENT FLAG BYTE (7TH BYTE OF HEADER) RETURNED

NOVE,L AO l'-(SP)
lRA(A4) ,AO
LEA

NOVEQ tt19,02
NOVEIB (AU),DO
EOR.B 00,01
[lSF
D2,'2
NO'JE.L (SP)+ ,AO

jSilJe reg
jset read address
;GET 20 BYTES
;GET BYTE FRIJ1 0ISK
jINCLUOE IN RUNNING CHECKSUM
jREPEAT OOIL DIJ.IE
;restore

RTS

j--------------------------------------------------------------;00 EXiRA HANDSHAKE WHEN SPARING OCCURRED, BY
i return: continue at next state

S30

SENDING ILLEGAL CIlt1ANO

MOVE.B
ORl.B
CLR.B
MOVE.B

HFF,ORA(A4)
H18,ORB(A4)
ODRA(A4)
tt$FF,ER_HS(A3)

; send

ADDI1

tt2~STATE(A3)

; advance to next state

MOOEG
RTS

11,00

; CONTINUE

ILLEGAL command byte
; reset dir=in
; and set port A bits to input
; HATCH ANYTHING ON NEXT HANDSHAKE

;--------------------------------------------------------------n AFTER EXTRA ~DSHAKE

j EX

; return: return successful
531

ORI.B
CLR.B

t51B,ORB(A4)
DDRA(A4)

MOVEI}
HTS

10,DO

; reset dir=in
; and set port A bits to input
;E.XlT

,

a _______________________________________________________________ _

j

BAD RESPONSE FRett HANDSHAKE

; return: return with bad-response error
S40

TST.8

DRIVETYPE(A3)

; Profile or Seagate device?

£Date 5/Mar/85; Fi 1e -#212-hdldrvr .TEXTl

Page 10

BEQ.S

ilO

;1,t,I i dget dev i ce
-rST .B NESTED_BDR(A3)
nNE.S 310
t1OVE.B ~1~NESTED_BDR(A3)

41

r1OVE.L ttRDT mE , DO
#1,IRB(A4)
8TST
BNE.S

DBF
BRA.S
ADDQ
MINEQ

il0

; Bad response

~hile

handling bad response?

; Start processing bad response
j Wait for controller not busy

.2

DO ".1

i10

12, STATE(A3)
Itl !,DO

; Give up if timeout
; Go to next state
; Do it now

;Profile/Seagate or nested error
CLR.B NESTED_BDR(A3)
;
M~JE
ttRESP_ERR,ERROR(A3)
CLR. B DDRA(A4)
;
ORI.B H18,ORB(A4)
j
~'!OVEQ
#0,00
;

Nested error or not Widget - give up
IN
dir = in, cmd false
return

RTS

r---------------------------------------------------------------

jSEND uREAD CONTROLLER ABORT STATUS· COMMAND
341

1 ______ - - - - - - - - - - - - , - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - __________________ _

~

tsDF,ORB(AO)
ORI.B tl20,ORB(AO)
MOVE.B tsOB,IFR(A4)
H~DI.B

jCLEAR PARITY

;-----------------_._---------------------------------------------------ts13,ORA(A4)
NOP
MO'JE.B tsOl,ORA(A4)

r1O'JE .B

;Diagnostic command
;Read status instruction

NOP

MOVE.B li05,ORA(A4)

jRead state registers

NOP

M.OVE.B liE6,ORA(A4)
ORI.B H18,ORB(A4)
CLR.B DDRA(A4)

;Check byte
jreset dir=in ; cmd=false
;set port A bits to input

._---------------------------------------------------------------------!
BTST

13,IFR(A4)

jPARITY ERROR?

BNLS

i1

;Skip if yes

;----------------------------------------------------------------------ADDQ

12,STATE(A3)

MOVE}
RTS

11,DO

;Go to next state
jExpected response
jAdvance to next state now

MIJJE

#PRTY_ERR,ERROR(A3)
10,DO

j RETURN

i10VE .B ts3,ER_HS(A3)

~i

HOVEU

NIlJ

RTS

[Date 5,11ar/B5j File -tt212-hdldrvr.TEXT]

Page 11

a ______________________________________________________________ _

!

jREAD CONTROLLER'S STATUS
542

MIJJE .L Al,-(SP)
cutS OORA(A4)
ORI.B #$18 r OR8(A4)
STATUS(A3) ,Al
LEA
r~QlJEIl

J1

#3,00

MINE.S lRA(A4) J (Al)+
DBF
DO ,al
!'1OVE.L STATlIS(A3) ,DO
!)R.L
DO ,ACCSTAHA3)

;save header address

jSET PORT ATO
;SET OIR =IN

INPUT

(=0)

;Address of error status field
;Read 4 status bytes
;Read a byte
;accumulate state register status

jreset controller
t~NDI.B

"F7,ORB(A4)

fiNOLB H7F,RESETC(A4)
t10VEll #39,00

J3

flO

OBF

DO~a2

ORI.B
NOVEll

fU27,OO

112

.14

;(~ait

100 mic sec)

HBO,RESETC(A4)
;(~ai

t IMS)

OSF

DO r i3
~~DDI.W ttl,CNTRESETS(A3)
MIJJE.B #O,NESTEltBDR(A3)
~1OVE.L "180000,00
BTST Itl! IRB(A4)
~E.S

.11

jOir = out
;Toggle reset line

;Increment reset counter
jWait for not busy - about 16 seconds

.11

SUBll.L #1,00
tlNE.S il0
CMPI.W #10,CNTRESETS(A3)
BGT .S .12
NOVE .W ttMULTI J::t10-STATE_TABLE ,STATE(A3)
MIJJEQ ttl ,DO

8RA.S

.14

MIJJE

ttRESP_ERR,ERROR(A3)

CLR.B
GRI.B

DDRA(A4)

;IN

#i18,ORB(A4)

NOVEll

10 JDO

; dir = in, cmd false
; return

MOVE.L (SP)+fA1

;restore header address

RTS

SEND_CMD ;Send Widget command
jlnput
; CMitBUF :: command type, command, and any parmeters
;Output
; DO = result of issue = 0 OK ; =1 Parity error during send
; D1 = scratch

MOVE.L At ,-(SP)
I~NDI.B

"DF ,ORB(AO)

;CLEAR PARITY

ORI.B

#i20,ORB(AO)
l'1O'JE,B HOB! IFR(A4)

IDate S/Mar/85j File -#212-hd/drvr.TEXTl

Page 12

LEA
:~[iVE .13

CMltBUF(A3) tAl
CMO_BUF(A3) ,DO

EXT

DO

#$OOOF,DO
1t1 ,DO
i~OVEG
ItO ,01
!1OVE,B (Al) ,ORA(A4)
i~DD,B
(Ai)of ,D1
DBF
00,.1
EORI.B It$FF,Dl
r10'JE.B Dl f ORA(A4)
1~'iDI

;Cornmand type and length
;Extract length

SUBI1

8TST
BNE.S

13,IFR(A4)
.2

t10VEG

#O~DO

BRA,S

.3

;Start of checkbyte
jSend byte
jAdd to checkbyte
jCheck byte
jPARITY ERROR?
;Skip if yes
;Flag as OK

MOVE I} 1t1,DO
MOVE,L (SP)+ ,Al

jFlag as bad
jrestore reg

RTS
~---------------------------------------------------------------

; FOR DEV ICES THAT SUPPORT NULTI-BLOCK CIH1ANDS
; SEND CottlAND BYTES OUT AND INITIALIZE VARIABLES FOR NOO HANDSHAKE
return: continue at next state (rd_next or wrt_next),
or return with parity error
SSG

CMPI,B 12,CMD_BUFFER(A3)
BGE
S50N~IO

;Non-I/O request?

j5end Multi-block 1/0 transfer request
;Transfer count
MOVE.L SECT_LEFT(A3) ,DO
CNPI.W IMAXCNT,DO
jMax multi-block count

BLE.S
Jl

MCtJE .W
MOVE ,S

MOVE.S
~~QVE .B

MOVE.L
MOOE.B
9SR

1ST

BNE,S

TST IB
BNE.S
MOVE.W
MOVE.S

uRI.B
CLR.B
BRA,S
jl0

~20

.1

ttMAXCNT ,DO
DO,CXFERCNT(A3)
jCurrent sector count
1t$20,CMD_BUF(A3)
;command and length
CMD_BUFFER(A3),CMD_BUF+l(A3) ; Command
CMD_BUFFER(A3),CMD_BUF+2(A3) j Command and sector
DO,CMD_BUF+2(A3)
;block count over command
SEND_CMD
jIssue Widget command
DO
jParity error during issue?
,30
CMD_BUFFER(A3)
jWrite command?
310
jSkip if yes
ttRD_NEXT -STATE_TABLE,STATE(A3) iCont i nue wi th read state next
#S22,ER_HS(A3)
jExpected response
MSiB,ORB(A4)
;reset dir=in ; cmd=false
DDRA(A4)
;set port A bi ts to input
.20
;Go finish state

MOVE.W IWRT_NEXT-STATE_TABLE,STATE1
~E.S

r10VEG

.1

11,00

jOK to continue
;Busy?

jTIMEOUT

[Date 5/Mar/85; Fi le -12tt2-hd/drvr •TEXT 1

Page 18

12

RTB

;--------------------------------------------------------------;POLl UNTIL DEVICE IS BUSY FOR 32 CHECKS IN A ROW
jR~gisters used = DO, 01
;Output - DO =0 OK to continu~
= 1 Timeout
!,VAIT_BUSY
~1

!~Ot)EG

1t0rDO

;OK to continue

t1OVE.L

DROTIME,Dl
ttl J IR8(A4)
32

;Not Busy?

8TST
BEG.S
SUBQ.L
BNE.S
t10VEIl

it'

tt1~01

.1

Dl,DO

;TIMEOlfT

RTS
~----------------------------------------------------- ------------

~

; Do read operation

; Registers used = DO, D2
STRTRD MOVE!}
BSR.S
ENE.S

#1,02
DOSHAKE
STRTXIT

jExpected response
;Do hand shake
;skip if error

jGet Device Charact'ristics
NOVEll

ttO,DO

t~OVEI8

DO,ORA(A4)

jiSSUme no error
;Command=Read

NOP
HFF,ORA(A4)
HFF,ORA(A4)
MOVLB HFF,ORA(A4)
t1Qt)E .B HOtA ,ORA(A4)
r10VE .8 OO,ORA(A4)

f'lO'JE.B
MOVE.B

GlTYP

NOVEll

BSR
BNE.S

CLR.8
OR1.B

#2,02
DOSHAKE
STRTXIT
DDRA(A4)
H18,OR8(A4)

MOVE.B lRA(A4),STATUS(A3)

jRead sector = $FFFFFF
;Retry count
jSparing threshold
;Expected response
;00 hand shake
;skip if error
;Set Port A bits to input
jset dir=inj cmd=false
jRead 4 bytes of status

MfNE.B lRA(A4) ,STATUS+HA3)

MOVE.8 lRA(A4),STATUS+Z(A3)
MOVE.B lRA(A4),STATUS+3(A3)
MOVE.L ltiCl40COOO,DO
ANO.L STATUS (A3) ,DO
BEl}, S STRTXIT
tHO_ERR ,00
t10VE
STRTXIT RTS

jcheck for fatal error
jsetup exit result
;n i t if OK

;else set error code
;and return

-! .. ----------------------------------------------------i HandShake routine

[Date 5Jq1ar/B5; File

-1212-h~/drvr.TEXTJ

Page 19

=

i Input - 02 Expected response
- 1~4 = Hardware Base Address
j
; Output- DO = error # (=0 if OK)

; Exits with dir=out, Port A to output, cmd=fals

DOSHAKE AND I . B
DRI.B
CLR.B
BSR
TST
BEIl.S

t10VE

tfEF,ORB(A4)
tf08,ORB(A4)
DDRA(A4)
!.;JAlT_BUSY

DO
GTRSP
ITIME_ERR, DO

IUS
GTRSP

MOVE.B PORTA(A4) ,01
~iNDI .B HE7,ORB(A4)
NOVE.B HFF,DDRA(A4)

;Cmd=true
jSet dir = in
iSet Port A bits to input
jWait for device to go busy
iTirneout?
jSkip if OK
;Timeout error
;Exit early
;Ge t response

jDir=out; cmd=true
;Port A to output
CMP.B D2,Dl
;Compare response
;Skip jf bad response
BNE.S RS_BAD
MO',JE.B tt$S5,PORTA(A4) jSend OK reply
ORLB tflO,ORB(A4)
;Cmd=false
BSR
;Wait for not busy
WA IT~OTBUSY
1ST
DO
;Timeout?
Ji

BEQ.S

il

MOVE
RTS

tlTIME_ERR ,DO

; t imeou terror

RS_BAD jbad response
MOVE.B HAA,PORTA(A4) iSend negative reply
GRI.B tflO,ORB(A4)
;Cmd=false
;Wait for not busy
BSR
WAIT-1~OTBUSY
MOVE
tlRESP_ERR,DO
jBad response error code
RTS

,

s ___________________________________________________ _

; Routine to do controller reset
; Assumes AO = base address for reset port
;

DORESET AND I •B tf7F,ORB(AO)
t10'JEQ tf7F,DO
i1
SUBQ
til ,00
BNE.S .1
ORI.B tfSO,ORB(AO)
R"rS

;set reset signal
jdelay for about .1 sec
jremove reset signal
jand exit

•END

[Date 5/Mar/B5; File -tl212-hd/drvr.TEXTl

Page 20

; File: HDMount.Text
j

Hard Disk Driver Mount Routine
written by Rich Castro
This program attempts to mount a disk.
Modification History:
3 Mat 84 ROC Write initial version
16 May 84 ROC Add disK size check before trying mount
13 Nov 84 KWK Check for volume already mounted error
.NOLlST
.INCLUDE
. INCLUDE
.INCLUDE
.INCLUDE
•INCLUDE
.LIST

NoDrvErr .EGU
ND5pace .EQU
i~inSize

TlASM-SYSEGU.1m
TLASM-SYSMACS. TEXT
TlASM-SYSERR.TEXT
TLASM-TOOLMACS.TEXT
lLASM-TOOLEQU. TEXT

4
6

ino drive found
ino space available on drive

.EGU

400

jminimum

•FlING

HDMount ,0

*of blocks for

creating Mac disk

on entry 4(SP)=result
to moun t hard disk if one was found

now hy

first search drive Queue for default drive
MOIJE9

MOVE.L
BEG
MQlJE .L

CMP.W
BEG.S
MOIJE .L
BRA.S

.4

CMPI.W
BlT.S

IHDDrive,Dl
DrvGHdr+GHead,DO
NoDrvFnd
DO,Al
DGDrive(Al),Dl

.4

; drive we're looking for
; find the drive queue element
j exit if drive not found in drive Queue (last 01ink = 0)
; this entry?
; br if so

QLi nk (AU, DO

,2
#HinSize,DGOrvSize(Al) ;enough space availabl. on disk?
SpaceErr
jex i t if not

found it - create parameter block and try to mount it
';13

MO'JEG

#
A7,00
A4,,-(A7>
OO,-(A7>
11,-(A7>
01,-(A7>
D3,-(A7>
A3,-(A7>
PDSKRD

(A7)+
33
AOO.W WSt2,A3
ADDD.L WI,D3
TST .L (An
~E.S
a1

1'ST .W

; COlM := 8
; RC := 0
BASEADDRESS
aRC
DRIVE
aCOlM
BLKNlt1BER
aBUFFER
; RC = O?

~E.S

33

JMP

-7*S12(A3)

LEA
SUB.L
MOVED
Jt1P

ERRMSG,A3
A2,A2
123,00
ROMEPT

FINDD2 MOVE.B "08,ORB(AO)
MOVE.B HOO,DDRA(AO)
BTST Wl,ORB(AO)
WFB1
~E.S
WFBl
MOVE.B lRA(AO),Dl
MOVED 10,00
CMP.B 02,Dl
~E.S
SNDR1
MOVED "55,00
SNDR1 CLR.B ORB(AO)
DORA(AO)
5T
MOVE.B DO,ORA(AO)
MOVE.B "10,ORB(AO)
WFNBl BTST 11,ORB(AO)
BED.S WFNBl
CLR.B DDRA(AO)

; bump abuffer by block size
; bump blocknumber by 1
; COlm = 0 ?
; jump to first byte of block 1

; en=true, dir=in, cmd=tru,
; set port A bits to input
; ",a it of or bu sy
; get port A in 01
; did pippin return state requested?
; "00 =) en=true, dir=out, cmd=true
; HFF =} set port A bits to output
; send reply 00 or 5S
; en=true, dir=out, cmd=false
; ",ait for not busy
j

1$00 =} set port A bits to input

[Date 3/Apr/86; Fi 1e -1212-hd/wdgtbootdrl,lr .TEXTl

Page 2

HOVEIB KlS,ORB(AO)
1ST .B DO
RTS

; en=true, dir=in, cmd=false
; SET CC HERE TO SHARE CODE

MOVEQ
BSR.S

tU,D2
FINDD2
COPY6
FINDD2
PDSKERR

; try to find state 01
; if state 01 was found then
; go send command bytes else
j try again, if state 01 not found then
; return disk error

KI0,ORB(AO)
DDRA(AO)
-6(A6) ,AI
tt5 t D2
(AI) ,NHS(AO)
(At.)+ ,ORA(AO)
D2,COPYSIX

; en=true, dir=out, cmd=false
; MiFF =) set port A bits to output

STATOl
~E.S

BSRIS
BEQ
COPY6
MOVE.B
ST
LEA
MOVEQ
COPYSIX MOVE.B
MOVEIB
DBRA
RTS

; loop six time s

; Note: Widget controller does auto-mapping to 5:1 interleave, so block
i numbers map directly to sector numbers.
STRTRD MOVEIL
CLR.W
MOVEIL
CLRIB
MOVE.B
MOVE.B
MOVEIB
MOVE.B
MOVE.B
BSR.S
MOVEQ
BSR.S
BEQ
MOVE.B
MOVE.B
MOVE.B
MOVE.B
RTS

22(A6) ,AO
(AO)
26(A6) ,AO
PCtflD(A6)
13(A6) ,BlKH(A6)
14(A6),BLKM(A6)
15(A6) ,BlKUA6)
ttIO,RETRY(A6)
tt4,THRESH(A6)
STATO!
12,D2
FINDD2
PDSKERR
lRA(AO),-4(A6)
lRA(AO),-3(A6)
lRA(AO),-2(A6)
lRA(AO),-I(A6)

; set RC to zero
; get base address
; set command to read
; set block number
i

;
;
;
;

set retry count
set threshhold
get 01 byte and send read command
get 02 byte
disk error if not in read state

; get pippin status

PROCEDURE PDSKRD (BASEADDR:LONGINT;
VAR RC: INTEGER;
DRIVE: INTEGER;
VAR COlM':LONGINT;
BLKNUMBER:lONGINT;
VAR BUFFER);
Stack:
26
base address
22
aRC
20.,21 dr ive
[Date 3/Apr/S6j File

ptr to word 0.,255
word
-.2tt2-hdl~dgtbootdrvr.TEXT]

Page 3

16
iCount
ptr to long
12 •.• 15 Block Number
long
8
iBuHer
4
Return Address
0
Old A6
-6
COIMIand Buffer
-8
Header flag
-28
Header Buffer
POSKRO MIJJEG
BRA.S

11,DO
LOSKRD

; headers := true

NOSKRO MIJJEG
LOSKRD LINK

10,00
A6,1-2B

; headers := false

Mt1JE.L
ROL.L
BPl.S
Mt1JEG

12(A6),D2
18,02
il
tiD ,DO

i cheap check for Block Number = fFFFFFF

Mt1JE.W
Mt1JE.l
SUBGoL
BSR.S
TST.W
8PL.S
BSR.S

OO,-B(A6)
16(A6) ,AD
11,(AO)
STRTRO
-2(A6)
RDNRES
STRTRO

Mt1JEG
TST.L
~E.S

13,02
-4(A6)
PDSKERR

Mt1JEG
LEA
Mt1JE.L
MOVE.W

10,01
lRA(AO) ,AD
B(A6),A1
IBlKSIZE,D2

il

; headers := false
; get icount
; decrement count
i try read first time
; try read second time

RDNRES
JSET ERROR VALUE
;WAS ERROR, EXIT
; INlT CHKSIJ1
iGET PTR TO DISK IN PORT
jget address of BUFFER

j nlJ.lJ read in the data bytes
REAOlP
MOVE.B
EORIB
MOOE.B
MOVE.B
EOR.B
MOVE.B
OBRA

(AO),DO
00,01
DO, (A1)+
(AO),OO
00,01
DO, (Al)+
D2,REAOLP

jGET BYTE FR(J1 0ISK
jINCLUOE IN RUNNING CHECKSUM
jAND STORE IT IN BUFFER
jGET BYTE FRIJ1 DISK
jINCLUDE IN RUNNING CHECKSUM
jANO STORE IT IN BUFFER
jREPEAT lNTIL DcttE

i nlJ.lJ read in the header
TST.W
BEG.S

-B(A6)
FINISH

; no headers, don't do chksum verification

LEA

-2B(A6) ,Al
10,02

i set ptr to header buffer
; clear out count

MOVEG

[Date 3/Apr/B6; File -1212-hdlwdgtbootdrvr.TEXTl

Page 4

MOVEQ

IPHDRSIZ,D2

j set header

NOVE.B
EOR.B
MOVE.B
HOVE.B
EOR.B
HOVE.B
DBRA

(AO),DO
DO,Dl
DO,(AIH
(AO),DO
DO,Dl
DO, (AI)+
D2,READHDR

;GET BYTE FRtJ1 DISK
jINCLUDE IN R~ING CHECKSUM
jAND STORE IT IN BUFFER
;GET BYTE FRCt1 DISK
;INClUDE IN RUNNING CHECKSUM
jAND STORE IT IN BUFFER
jREPEAT IMIl D~E

TST.B
BEQ.S
TST.B
BPl.S

D1
FINISH
-22(A6)
FINISH

;CHECKSUM

MOVEQ

14,D2

jREAD ERROR, SET ERROR NUMBER

~ords

-I

READHDR

=0,

GOOD READ

jSPECIAl HEADER FLAG, IGNORE CHKSUM

PDSKERR MOVE.l 22(A6),AO
NEG.B D2
MOVE.W D2,(AO)

i get return code ptr
j error is 128 •• 255
j set return code

FINISH lIiLK
MOVE.L
ADD.W
Jt1P

jGET RETURN ADDRESS
iSTRIP PAIW1S
jAND RETURN

;
;
;
;
;

A6
(A7)+ ,AO
122,A7
(AO)

j

Pad it out to 512 bytes. The last eight bytes are set by the Widget
driver 
tt4,-(A7>
READBlKS

DIR(AS) ,AO
M42,2(AO)
a2
DNlI1FLS(AO) ,DO
Ml r DO
MOELENG,DO
MDIRSZ,DO
a2
IS1.1,DO
IS,DO
11,DO
136,DO
al
136,DO
DIRSZ(AO)
a1
tt6,-(A7>
DO,-(A7>
READBLKS
-(A7>
a2
C(J\IFIGF
PEA
HOVE.W 11,-(A7>
DIR(AS)
PEA
BSR
DIRSRCH
1ST .W (An
EriE.S FC~FIG
PEA
C~FIGF
BRA
ERROR
FC(NFIG LEA
DIR(AS) ,AO
ADD.W (A7)+ ,AD
BU:(AS)
PEA
NOVE.W (AO) ,-(A7>
NOVE.W 11,-(A7>
BSR
READBLKS
BLK(AS) ,AO
LEA
ADO.W 16,AO
al
NOVE.IA (AO)+ ,DO
BEQ.S DATAEND
ROR.W IS,DO
NOVE.L (AO)+,Dl
ROR.W IS,Dl
SWAP 01
ROR.W IS,Dl
SWAP Dl
MOVE.L DI,A1
.2
MOVE.B (AO)+ , (AD +
SUB.W 11,DO
I.t4E. S a2
LEA
(:tiP .1,.1
!liE.S
MOVE.W
ADD.W
HUlS
SUB.W
1I11.S
ADD.W
LSR.W
LSR.W
(liP .W
BLT .S
MOVE.W
PEA
MOVE.W
NOVE.W
BSR
CLR.W

; Read the directory

; Read the directory

; Read the CONFIG.DATA filr
; Get next count word
; Get next address word

; Copy each data byte

[Date 3/Apr/S6; File -12tt2-hdlwidgetbootblks.TEXTl

Page S

BRA.S
DATAENO 1ST.W
BEQ.S
NOVE .L
HOVE.L
SUB.L
HOVE.L
SUB.l
MOVE.L
SUB.L
NOVE.l
NOVE.L
SUB.L
NOVE.l
NOVE.L
ASR.L
NOVE.L
at
BSR
CLR.L
MOVE.L
PEA

BSR
SUB.l
PEA
BSR
CLR.W
PEA
NOVE.W
PEA
BSR
lST.W
~E.S

i2

NEXTF

il

PEA
BRA
LEA
ADD.W
PEA
MOVE.W
NOVE.W
BSR
PEA
NOVEll
TST.B
BEQ.S
ClRIW
SUBIB
NOVElL
MOVEIW
PEA
BSR
TST.W
ENE.S
MOVE.W
TST.W
BRA
LEA

al
BLK(AS)
al
HIMEM,OO
UttEM,Dl
01,DO
DO,D2
11,00
DO ,$114
tl$7FFF,DO
DO,$160
DO,$174
"8000,00
00,$110
00,$170
11,02
02 J.$13C
SETVIDP
$118
$110,ttOC
SCREENB
PRlNAHE
"iOOO,$10C
DBGDATA
PRTNAME
-(A7)
BOOTFLS
ttl ,-(A7>
DIR(AS)
DIRSRCH
(A7)
a2
BOOTFLS
ERROR
DIR(AS),AO
(A7)+,AO
BLK(AS)
(AO) ,-(A7>
11,-(A7>
READBLKS
BLK(AS)
(An ,AD
(AO)
LOADMIJ.I
-(A7>
"20,(AO)
AO ,-(A7>
11,-(A7>
DIR(AS)
DIRSRCH
(A7>
al
14,DO
(A7)+
ERROR
DIR(AS) ,AO

; memory size
; memory top
; upper screen base
;

l~er

screen base

; default stack ptr
; APPLE not available

; code buffer

; Read the BOOTFllES.DATA file

; to expose address of filename

[Date 3/Apr/86; File -1212-hdlwidgetbootblks.TEXTl

Page 6

LOADM~

il

ADD.W
MOVE.L
BSR
MOVE.L
MOVE.L
MOVE.L
JSR
MOVE.L
MOVE.l
MOVE.W
MOVE.L
BSR
ADD.l
BRA
ClR.W
PEA
MOVE.W
PEA
BSR
TST.W
EtJE .S
PEA
BRA
L.EA
ADD.W
NOVE.L
BSR
PEA
BSR
TST.W
BEQ.S
CLR.W
PEA
NOVE.W
PEA
BSR
TST.W
BEQ.S
LEA
ADD.W
MOVE.L
BSR
PEA
BSR.S

(A7>+ ,AD
AD ,-(A7>
l~DIT

; load the next object file

A5,-(An
A7,STKBASE
t10C,AO
(AO)
STKBASE~A7

(A7H ,A5
81,LOAIWf(A5)
(An ,-(A7>
PRTtW1E
816, (A7>
NEXTF
-(A7)
Mll1IITOR
H1 t-(A7>
DIR(A5)
DIRSRCH
(A7>
i1
MI1HTOR
ERROR
DIR(A5) ,AD
(A7H ,AD
AD ,-(An
lOAD IT

; Load the Monitor object

M~ITOR

PRTNAME
LOADSYM(A5)
JMP2M~

-(An
SYMBOLS
til ,-(An
DIR(A5)
DIRSRCH
(An
JMP2M~

DIR(A5) ,AD
(A7)+,AO
AO,-(A7)
LM~SYM

; Load the Monitor symbols

MSG6
WRTSTR

Jt1P2M~

MOVE
MOVE
MOVE.L
MOVE.B
MOVE.B
OR.B
BClR
MOVE.B
MOVE.L
WAIT4RS DBF

SR,-(A7>
H2700,SR
COPSVIA(A5),AO
COPSDRB(AO),DO
DO,D1
81,DO
10,(AO)
DO,COPSDRB(AO)
15200,D2
D2,WAIT4RS

; Reset the Keyboard
; lnts off
; Cops Base Address
; Get Dir B reg
; save it
; make bit 0 output
; set reset signal
; make sure of Dir B
; delay 12ms

[Date 3/Apr/86; File -1282-hdlwidgetbootblks.TEXTl

Page 7

BSET
HOVE.B
MOVE
MOVE.L
.lMP
WRTSTR MOVE.L
NOVE.L
CLR.W
NOVE.B
BRA

; remove reset signal
; restore Dir B reg
; Ints on

11, (AO)

Dl,COPSDRB(AO)
(A7)+ ,SR
il0C,AO
(AO)

; Go For It !

4(A7) ,A2
(A7)+ ,(A7>
D2
(A2)+ ,D2
WRITE

j

ERROR

PEA
MSG2
MOVE.W 1i111E,HSBASE(A5)
BSR.S WRTSTR
ERROR2 BSR.S WRTSTR
~G
BRA
~G

; row=17, co1=30

j

SCREENB •BYTE 10
.ASCI I 'SCREENBASE '
;

DBGDATA .BYTE 13
.ASCII 'DEBUGGER.DATA'
;

COOFIGF . BYTE 11
.ASCII 'C~FIG.DATA'
;

BOOTFLS .BYTE 14
. ASCII 'BOOTFILES.DATA

I

;

HOOITOR .BYTE 11
.ASCII 'M~ITOR.OBJ'
;

SYMBOLS . BYTE 15
.ASCI I 'M~ITOR.SYMBOLS'
j

HSGt

.BYTE 15
.ASCII 'Disk Read Error'

j

HSG2

. BYTE 15
.ASCI I 'Failed to find'

;

HSG3

. BYTE 14
.ASCI I lis loaded at

I

;

HSG4

. BYTE 45
.ASCII 'About to boot, press House Button to continue'

;

HSG5

. BYTE 13,13,13
.ASCII 'Booting ••• '

j

HSG6

.BYTE 24,13
.ASCII 'Loaded Monitor symbols'
.BYTE 13,0

[Date 3/Apr/86; File -B212-hdlwidgetbootblks.TEXTl

Page 8

PRTSTR LINK
TST.W
BEQ.S
TST .W
BEQ.S
LEA
t1OVE.W
BEQ.S
BSR
t10'JE.W
ao
MOVE.L
BSR.S
BRA.S
a1
LEA
MOVEIL
HOVE.W
ADDIW
CLR.W
HOVE.L
HOVE.S
ADD.W
HOVE.W
a2
MOVE.B
SUB.W
a3

A6f~O

LMOANY(A5)
a1
PRTINFO(A5)
a1
MSGS(A5) ,A2
(A2H ,D2
ao
WRITE
~0,MSGS(A5)

8(A6) ,-(A7>

WRTSTR
a3
MSGS(A5) ,AD
AO,Al
(Al)+ ,DO
DOlrAl
D1
8(A6) ,A2
(A2)+,D1
Dl,DO
DO,(AO)
(A2H,(AD+
11,D1
~E.S
a2
~LK
A6
MOVE.L (A7)+ ,(A7>
RTS

PRTtW1E MOVE. L (SP)+, (SP)
RTS
SETVIDP CLR.L

MSBASE(A5)

TST.W
BEQ.S

PAINTW(A5)
a3

BSR.S
•BYTE
BSR

al
2,27,$2A,0
WRTSTR

TST.B
ItIE .S
MOVE.L
ADD.L
LSR.L
LSR.L
MOVE.B

$14C
a3
$160,DO
LCt181,DO
18,DO
17,DO
DO,VIDLATCH

a1

a3

; get screen start
; bias this by start of memory
; and convert to 32k page

; set the video page latch

RTS

;

FILLBUF PEA
MOVE.W
MOVE.L
MOVE.W
SUB.W

BUF(A5)
-2(A6) ,-(A7>
8(A6) ,AD
2(AO),DO
-2(A6),DO
[Date 3/Apr/86j File

-.2.2-hdl~idgetbootblks.TEXT]

Page 9

il
i2

O1PllA
BHI.S
HOVEllA
BRAIS
HOVEIW
BSR
ADDIW
l.EA

'BUFBK-l,DO
al
DO ,-(A7>
.2
IBUFBK,-(A7>
READBLKS
IBUFBK,-2(A6)
BUF(AS),AO

RTS
PROCEDURE LMONSYM(VAR DIRENTRY)
Stack
B
4

o

-2

-6
-14
-18
-20

Pointer to directory entry for symbols file
Return address
Old A6
Nextblock
4 BYTE VALUE
8

C~R

tWiE

Address for monitor symbols
Counter

;

LMONSYM LINK
MOVEIL
MOVEllA
BSR
MOVEIL
MOVEIL
i1
MOVEIW
LEA
i4
CMPIL
~EIS

is

,2

.3

MOVE.L
BSR
MOVE.L
MOVE.IA
SUB.W
ENE.S
TST.L
ENE.S
TSTIL
ENE.S
TST .L
BEQ.S
HOVE.L
MOVE.L
MOVE.L
ADD.L
MOVEIL
BRA.S
MOVE.L
MOVE.L
lNLK
MOVEIL
RTS

A6 ,'-18
B(A6) ,AD
(AO),-2(A6)
FILLBUF
IADDRSYM,A1
Al,-IB(A6)
H6,-20(A6)
-14(A6) ,A2
AO,AS
is
At ,-(An
FIlLBUF
(A7H ,AI
(AOH,(A2)+
Il,-20(A6)
a4
-14(A6)
.2
-10(A6)
a2
-6(A6)
a3
-14(A6) ,(AU+
-10(A6) ,(A1)+
-6(A6) ,DO
$10C,DO
DO, (At H
a1
-18(A6) ,$406
A1,t40A
A6
(A7H,(A7>

; fill -14(A6) thru -4(A6)

; coPy name
; coPy value

[Date 3/Apr/86; File

-1212-hd/~idgetbootblks.TEXT]

Page 10

PROCEDURE LOADIT(VAR DIRENTRY)
Stack
8
4

o
-2

Pointer to directory entry for this file
Return address
Old A6
Nextblock

;

LOADIT LINK
MOVE.L
NOVE.W
BSR
.1
OMP.B
BEQ.S
CLR.8
ADD.L
BRA.S
.2
eLR.B
MOVE.L
1ST.L
SUB.L
MOVE.L
SUB.L
MOVE.L
.3
CMP.L
EriE.S
MOVEH.L
BSR
MOVEH.L
.4
~IOVE.W
SUB.L

A6,H-2
8(A6),AO
(AO),-2(A6)
FILLBUF
Mi8S,(AO)
.2
(AO)
(AO) ,AO

.1

(AO)
(AO)+,DO
(AO)+
H8,DO
$lOC,A1
DO,AI
At ,$lOe
AO,AS

.4

DO/Al,-(A7)
FILLBUF
(A7)+,DO/Al
(AO)+,(AD+
B2,DO
~E.S
.3
LNLK A6
MOVE.L (A7)+, (An
RTS

DIRSRCH
18
14
12
8
4

o

func result
iFTID
FINDPERM
.FDIR
Return address
Old A6

;

DIRSRCH LINK
HOVE.L
MOVE.W
MOVE.L
MOVE.L
MOVE.W
BEQ.S
ADD.W
DIRSRLP HOVEN.L

A6,HO
8(A6) ,AI
BO,18(A6)
BDELe~G,D3

14(A6),AO
DNlJ1FLS(Al),Dl
DIRSRCX
BDELe~G+DTID,Al

A3JA4,-(A7)

; get ptr to dirbuf
; return 0 as default
; initialize offset
; point AD at the filename
; get number of files
; number of files = 0 ?
; point Al at first entry
; save A3 and A4

[Date 3/Apr/86; File -B2B2-hd/widgetbootblks.TEXTJ

Page 11

31

t1OVE.L
MOVE.L
CLR.W
MOVE.B
CHPM.B
~E.S

i2
i3

i4

SUB.W
BCC.S
SUB.W
MOVEM.L
BRA.S
HOVEM.L
ADD.W
ADD.W
SUB.W
ft.!E.S
BRA.S
HOVE.W
MOVE.W
AND.W
OMP.W
~E

AND.W
DiP.W
BEQ.S
ADD.W
BRA.S
MOVE.W
i5
DIRSRCX UNLK
MOVE.L
ADD.W
.lMP

At ,A4
AO,A3
D2
(AO) ,02
(A3)+,100 then

dirsearch:=offset
; pop return address
; delete parameters

PROCEDURE READBLKS(VAR BUFFER; BLOCK,COI.tlT:INTEGER);
Stack
1.2
1.0
8
4
0

Address of buffer
block
count
return address
old A6

;

READBLKS
LINK
A6,HO
MOVE.W BLKOFS(AS),DO
ADD.W DO,10(A6)
31

TST.W
BEQ.S

S(A6)
i3

MOVE
MOVE
MOVE.L
MOVE.L
CLR.W

SR,-(A7>
ts2700,SR
Hl,-(A7)
A7,Dl
-(An

; COlNT := 1
; RC := 0

[Date 31Apr/86; Fi 1e -tt212-hd/widgetbootblks.TEXTl

Page 12

H(}JE.L
H(}JE.L
t1OVE.L
MOVE.W
NOVE.L
CLR.L
MOVE.W
NOVE.L
NOVE.L
BSR
TST.W
SEQ.S

A7,DO
BASEADR(AS),-(A7)
DO ,-(A7)
11,-(A7)
D1,-(A7>
DO
10('A6) ,DO
DO ,-(A7>
12(A6) , -(A7>
PDSKRD
(A7)+
i2

PEA

BRA

MS61
ERROR2

TST.L
MOVE
SUB.W
ADD.W
ADD.L
BRA.S

(A7)+
(A7H ,SR
11,8(A6)
11,10(A6)
1512 , 12 (A6)
i1

~lK

A6
(A7)+ ,AD
18,A7
(AU)

; flush locals
; get return address
; flush params
; and return

COPSVIA(AS),AO
COPSIFR(AO),DO
GElCOPS
11,00
GET COPS
PORTA(AO),DO

; Get via base address
; Load interrupt flag register

;
;
;
;

BASE ADDRESS
iRC
DRIVE
aCOlNT

; BLKNltIBER
; aBUFFER

i2

i3

~IOVE,L

ADD.W
JMP

;

GETCOPS MOVE. L
MOVE.B
BPL.S
BTST
BED.S
M(JJE.B
RTS

; Test for COPS interrupt
; Get byte from COPS

STATE 3 -- GET RESET CODE
;

WAITR

BSR
BRA.S
STATE

GET COPS
NOKEY
1 --

GET DELTA

; discard reset code
X

;

WAITX

BSR

GETCOPS

; discard delta x

STATE 2 -- GET DELTA Y
;

WAITY

8SR

GET COPS

; discard delta y

NO KEY STROKE EXIT
;

NOKEY

CLR.W

D1
[Date 3/Apr/86; File -1212-hdlwidgetbootblks.TEXTl

Page 13

RTS
STATE 0 -- GET AMOUSE CODE, RESET CODE, OR KEY STROKE
j

GETKEY aSR
BED.S
Il'1P .B
BED.S
MOVE.W
RTS

GETCOPS

; Get byte, Mouse?

WAITX
"80,00
WAlTR
81,01

; Reset code ?

;

WRITE
LEA

1ST
BlE.S
aSR.S
WRITEl MOVE.B
O1P.B
BEQ.S
O1P.B
BEQ.S
BSR
WRNEXT SUBD
BGT.S
WREXIT BSR.S
BRA.S
CRlF BSR
MOVE.B
BSR
BRA.S
WRDLE NOVE.B
BRA.S
EXIT RTS

MSBASE(AS),A3
02
EXIT
CLRCUR
(A2)+,OO
"00,00
CRLF
"10,00
WRDlE
PUTC
11,02
WRITEl
SETCUR

; any at all?
; no, just leave

; remove cursor once per call
; and loop thru buffer

; is this a CR ?
; yes, simulate extra stuff

; how about a OLE?
; yes, it's special too

; then, set it on again

EXIT
PUTC
"OA,DO
PUTC
WRNEXT
114,CRTSTAT
13 r DI

is

D1,D3
(A7> ,-(A7)
Il,D1
i4
Hl,D3
.3
Hl,DO

a1

; delete bytes from last loop
; get 7 more bytes
next byte
mask off repeat bits
extract repeat count
account for repeat count
push for each repeat count
decr counter for next byte
; decr character counter

-(An

SETAl
RW8BTS(AS) ,AI
18,DO
ROWBYTS(AS) ,AI
(A7)+, (AI)
11,DO
.6
PUTFF

; share code to advance cursor

"3D,DO

; ESC was just seen
ESC-= (cursor addressing)

; get screen ptr to At

;

PUTCI

.1

CMP.B
ENE.S
MOVE.B
RTS
CLR,B
CMP.B
BEQ.S
CMP.B
BEQ,S
CMP.B
BEQ.S
RTS

al

12,CRTSTAHA3)
CRTSTAT(A3)
"54,DO
ESCT
"59,DO
ESCY
H2A,DO
ESCSTAR

and wait for Y value
; reset state for the rest
; ESC-T, erase to end of line
; ESC-Y, erase to end of screen
; ESC-f, erase screen
; none of the above
; ESC-= seen, expect row value

PUTC2
SUB.B HIF,DO
MIJJE,B DO ,CRTROW(A3)
MOVE.B 1t3,CRTSTAT(A3)
RTS
PUTC3

al

; ESC-=, Y, expect column value
SUB.B
MOVE.B
CLR.B
O1P.B
BlS.S
MOVE.B
MOVE.W
SUB,W
CMP.B
BHl.S

"IF,DO
DO ,CRTCOL(A3)
CRTSTAT (A3)
tt32,CRTRW(A3)

al

; make limit checks now

1t32' ,CRTRW(A3)
RWBYTS(AS) ,DO
1t2,DO
CRTCOUA3) ,DO
.2
[Date 3/Apr/86; File -1t212-hdlwidgetbootblks.TEXTl

Page 18

.2
PUTC4

HOVE.B 00, CRTCOL (A3)
RTS

CRTSTAT(A3)
1$7F,00
SUB
"20,00
SLE.S .2
DO,-(SP)
MOVE
MOVE .B "20,00
BSR
PUTC
ttl ,(SP)
SUBD
BGT .S .1
AOOD
tt2,SP
RTS
CLR.B

; handles dle expansion

~OI

,I

.2
;

FONTTBL
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
.BYTE
•BYTE
•BYTE

$00+3,$00+2
$10+3,$00'*'1,$10
i48+2,$00+3
i48+1,iFC,'48,$FC,$48+1
$10,,3C,$SO,,38,,14,$78,$10
,OO,$C4"C8,$10,$20,$4C,,8C
$60,$90+1,$60,$94,$88,$74
$08,'10,'20,,00+3
$08,'10,$20+2,$10,$08
'40,$20,$10+2,'20,'40
,10,$S4,$38,'7C,$38,$54,'10
$00,'10+1,$7C,$10+1,$00
$00+3,$30+1,$60
'OO+2,$FC,$00+2
$00+3,$00,$30+1
$00,$04,,08,$10,$20,'40,$80
$78,$84,$8C,$B4,$C4,$84,$78
$10,$30,'50,'10+2,$7C
$78,$84,'04,'18,$60,i80,$FC
,78,$84,'04,'38,'04,'84,$78
,08,'18,'28,'48,$FC,$08+1
$FC,'80 "FO ,'08,$04,$88,$70
$38,,40,iBO,$F8,$84+1,'78
'FC,,84,$08,il0,'20+2
'78,'84+1,'78,$84+1,$78
'78,$84+1,$7C,'04,'08,'70
'00+1,$30+1,$00,'30+1
iOO,'30+1,'OO,'30+1,'60
$08,,10,$20,$40,$20,il0,$08
$OO+1,$F8,$00,$F8,iOO+l
i40,$20,$10,i08,$10,$20,$40
$78,$84,i04,$18,i20,iOO,i20
$38,$44,$94, $AC, $98, $40, $3C
'30,'48,$84,iFC,$84+2
$F8,i44+1,i78,$44+1,$F8
$78,i84,$80+2,,84,'78
$F8,'44+3,'44,$F8
'FC,'80+1,'FO,'80+1,'FC
$FC,$80+1,$FO,$80+2
$78,'84,'80,i9C,$84+1,i78
$84+ 2, iFC ,i84+ 2
[Date 3/Apr/86; File

; font table origin here folks
(space)
!

,
tt

i.
&
(
)

*+
/

,

0
1
2
3
4
5
6
7
8
9

=
}

?

a

A
B
C
0
E
F
G
H

-tt2tt2-hd/~idgetbootblks.TEXT]

Page 19

•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE
•BYTE

$3S,$10+3,$10,$38
$lC,$OS+3,$8S,t70
$S4,tSS,$90,$EO,$90,$S8,$84
$80+3,$S0+1 ,tFC
$84,$CC,$B4+1,$84+2
$84,$C4,SA4,t94,$8C,$84,$84
$7S,$84+3,$84,$78
$F8,$84+1,tF8,$80+2
$78,$84+2,$94,$88,$74
$F8,$84+1,SF8,$90,$88,$84
$78,$84,$80,$78,$04,$84,$78
$7C,$10+3,$10+1
$84+3,$84+1,$78
$84+2,$48+1,$30+1
$84+2,$B4+1,$CC,$84
$84+1,$48,$30,$48,$84+1
$44+2,$38,$10+2
$FC,$04,$OS,$30,$40,$80,$FC
$7S,$40+3,$40,$78
$00,$SO,$40,$20,$10,$OS,$04
$7S,$08+3,$OS,$78
$10,$28,$44,$00+3
$00+3,$00+1,$FC
0

I

J

K
l
M
N

0
P
Q

R

S
T
U
V
W

X
Y
Z
[

\
]

;

-

MUST COME OUT TO 7 BLOCKS!!!!!
.IF
FIXCIMRAST
.;BLOCK 424,0
.ELSE
.BLOCK 474,0
.ENDC
;

N~ foll~s

the 1 block of mount table/volume entry information

•INCLUDE

MWD-HDlMountTable.text

; dummy mount table/volume entries

•END

[Date 3/Apr/86; File -M2B2-hdlwidgetbootblks.TEXTl

Page 20

FI LENAt1E: MWI nsta ll-MWI/ProBootDrvr
Block 0 boot code for t10n i tor system boot i ng from a Prof i 1e
Changes:
;

;2-21-85

ROC

Change setting of VIA DDRB register so DIAG 1 ine (bit 6) is input

; PIA REGISTERS for profile disk interface
;

ORB
ORA
IRA
IRB
DDRB
DORA
ACR
PCR
IFR
IER
NHS
Ct1DSI ZE
DSKBLK
PCMNDSZ
BLKSIZE
PHDRSIZ

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

0
8
ORA
ORB
$10
$18
$58
$60
$68
$70
$78
4
512
5
255
9

output regs
input regs
data direction regs
aux control
peripheral control
int flags
int enable
reg A no hand shake
number of bytes in cmd string
number of bytes in a block
bytes-l in prof i 1 e cmd string
words-l in prof i 1e block
words-l in prof i 1e header

;

; OFFSET EQUS for dskread and dskwrt routines
;

IOCMD
IODRV
BLOCKL
BLOCKH

EQU
EQU
EQU
EQU

-4
-3

-2
-1

;

; OFFSET equates for profile read and write routines
;

PCMND
BLKH
BLKM
BLKL
RETRY
THRESH

EQU
EQU
EQU
EQU
EQU
EQU

-6
-5
-4
-3

-2
-1

BOOT BLOCK ZERO STUFF
MOVE
LEA
t10VEQ
MOVE.L
t10VE. L
MOVEQ

tt'$2700 ,SR
Prof i 1eBoot ,A?
tt8,Dl
Dl,A2
tt'*FCD90 1 ,A4
ttO,DO

= $46FC2700,

first long on disK

Both block count & address of exception
Lisa base address

[Date 3/Apr/86; File -#2tt2-hd/probootdrvr.TEXT]

Page 1

BUSERR

MOVE. L
LEA
t10VE. L
TST.L
MOVE.L
t10VEQ
t10'JE. L
MOVE.B

(A2) ,Al
BUSERR,AO
AO , (A2)
.400000
$198,A4
#l,DO
Al,(A2)
DO,$14C

Read ROM on GLM, Bus Error on Lisa
Get GLM base address

MOVE.B
MOVE.B
MOVE.B

#$OA,PCR(A4)
#$00,DDRA(A4)
#$18,ORB(A4)

set ctrl CA2 pulse mode strobe
set port A bits to input
en=true, dir=in, cmd=false

;RDC
t10VE. B #$3C, DDRB(A4)

Set up exception handler

Set GLM Flag (O=LISA,l=GLM)

set port B bits 0,1,6,7=in, 2,3,4,5=out

;RDC

~l

~3

t10VE. L
CLR.L
t10VE. L
t10VE. L
CLR.W
MOVE.L
t10VE. L
MOVE.L
t10VE .W
MOVE.L
MOVE. L
MOVE.L
BSR
TST.W
BNE.S
ADO.W
ADO.L
TST.L
BNE.S
JMP
LEA
SUB.L
t10VEQ
JMP

#LORLOC,A3
D3
Dl,-(A7)
A7,01
-(A7)
A7,00
A4,-(A7)
DO,-(A7)
#1,-(A7)
D1,-(A7)
D3,-(A7)
A3,-(A7)
PDSKRD
(A7)+

,3

#512,A3
#1,03
(A7)

COUNT := 8
RC := 0
BASEAOORESS
~RC

DRIVE
iCOUNT
BLKNUMBER
~BUFFER

RC

= O?

bump ~buffer by blocK size
bump blocKnumber by 1
COUNT = 0 ?

~H

-7*512(A3)
ERRt1SG ,A3
A2,A2
#23,00
Rot1EPT

;

FINDD2
WFBl

SNDR1

WFNB1

MOVE.S
MOVE.S
BTST
BNE.S
t10'JE. B

#$08,ORB(AO)
#$OO,OORA(AO)
#1,ORB(AO)
WFB1
IRA(AO),Ol
MO~}EQ
#0,00
CMP.B
02,01
BNE.S
SNOR1
t10VEQ
#$55,00
t10VE. B #$OO,ORB(AO)
MOVE.S #$FF,DDRA(AO)
MO'JE. B DO,ORA(AO)
t10VE. B #$10,ORB(AO)
#1,ORB(AO)
BTST

en=true, dir=in, cmd=true
set port A bits to input
wait for busy
get port A in D1

did pippin return state requested?
en=true, dir=out, cmd=true
set port A bits to output
send reply 00 or 55
en=true, dir=out, cmd=false
wait for not busy

[Date 3/Apr/86; File -#2#2-hd/probootdrvr.TEXT]

Page 2

BEQ.S
t10VE. B
MOVE.B
TST.B
RTS

WFNB1
#$OO,DDRA(AO)
#$l8,ORB(AO)
DO

MOIJE. L
BSR.S
BNE.S
BSR.S
BEQ
COPY6
MOVE.S
MOVE.B
LEA
t10VEG
COPYSIX ti0VE. B
MO'vIE. B
SUB.W
BNE .S
RTS

#1,D2
FINDD2
COPY6
FINDD2
PDSKERR
#$10,ORB(AO)
#·tFF ,DDRA(AO)
-6(A6),A1
#6,02
(A1) ,NHS(AO)
(A1)+,ORA(AO)

set port A bits to input
en=true, dir=in, cmd=false
SET CC HERE TO SHARE CODE

;

STATOl

STRTRO

MOVE.L
CLR.W
t10VE. L
MOVE.S
MOVE .B
HOVEIB
t10lJE 18
t10VE. B
TSTIW
BEGIS

try to find state 01
if state 01 was found then
go send command bytes else
try again, if state 01 not found then
return disK error
en=true, dir=out, cmd=false
set port A bits to output

iii f iJ2

COPYSIX

22(A6),AO
(AO)
26(A6) ,AO
#0 , PCtiNO': A6)
13(A6),BLKH(A6)
14(A6),BLKM(A6)
15(A6),DO
00,D1
-8(A6)
i1

set RC to zero

#-$10,D1
DO,D1
#$OF,DO
INTRLV(DO),D1
D1,8LKL(A6)
#10,RETRY(A6)
#4,THRESH(A6)
STATOl
#2,D2
FINDD2
PDSKERR
IRA(AO),-4(A6)
IRA(AO),-3(A6)
I RA(AO) , -2(A6)
IRA(AO),-1(A6)

= $FO

get base address
set command to read
set blocK number
1sb of blocK number

REMAP

dll

t10VEG
AND.B
AND.W
ADDIB
MOVE.8
HOIJE .B
t10VE.8
8SRIS
t10VE. L
BSR.S
BEG
MOVE.S
t10VE I B
MOVE.B
MOVE IB
RTS

masK high 4 bi ts
masK low 4 bi ts
add in remapped low 4 bi ts
replace blocK number
set retry count
set threshhold
get 01 byte and send read command
get 02 byte
disK error if not in read state
get pippin status

[Date 3/Apr/86; File -#2#2-hd/probootdrur.TEXTl

Page 3

I NT RLV

•BYT EO, 5 , 10 , 15 , 4 , 9 , 14 , 3 , 8 , 13 , 2 , 7 , 12 , 1 ,6 , 11
PROCEDURE PDSKRD

9:1 INTERLEAVE

(BASEADDR:LONGINT;
VAR RC: INTEGER;
ORIVE: INTEGER;
VAR COUNT:LONGINTj
BLKNUt1BER: LONGINT;
VAR BUFFER);

Stack:
26
22
20 .. 21
16
12 •• 15
8
4

o
-6
-8

-28
MOVEQ
BRA.S
NOSKRD MOVEQ
LDSKRD LINK

RDNRES

ptr to word 0 •. 255
word
ptr to long
long

M1,00
LOSKRO
MO,OO
A6,M-28

headers := true

t10VE .l
ROL.L
BPL.S
MOVEQ

12(A6),D2
M8,D2
'sil
MO,DO

cheap check for Block Number

MOVE .W
MOVE.L
SUB.L
BSR.S
TST.W
BPL.S
BSR.S
t10VE. L
TST.L
BNE.S
CLR.B
LEA
TST.W
BEQ.S
LEA
MOVE .W

00,-8(A6)
16(A6) ,AO
M1,(AO)
STRTRD
-2(A6)
RDNRES
STRTRO
M3,02
-4(A6)
POSKERR
01
I RA(AO) ,AO
-8(A6)
RSKPHOR
-28(A6),Al
MPHDRSIZ,02

PDSKRD

i1

base address
.RC
drive
.Count
Block Number
.Buffer
Return Address
Old A6
Command Buffer
Header flag
Header Buffer

headers := false

= $FFFFFF

headers := false
ge t

dlcoun t
decrement count
try read first time
try read second time

; IN IT CSUt1

READHDR
(AO),OO
00,01
DO,(A1)+
t10VE. B (AO),OO
EOR.B
00,01
t10VE. B DO,(Al)+

MO'JE .8
EOR.B
t10'JE.8

; GET BYTE FRot1 0 I SK
; INCLUOE IN RUNNING CHECKSUt1
JANO STORE IT IN BUFFER
; GET BYTE FROt1 01 SK
;INCLUOE IN RUNNING CHECKSUM
;ANO STORE IT IN BUFFER

[Date 3.lApr/86; File -M2M2-hd/probootdrvr.TEXTl

Page 4

DBF

D2,READHDR

MOVE.L
MOVE .1.,.1

8(A6) ,Al
ttBLKSIZE,D2

t10VE. B
EOR.B
t10VE. B
t10VE. B
EOR.B
t10VE. B
DBF
TST.B
BEQ.S
TST.W
BEQ.S
TST.B
BPL.S
MOVE.L

(AO),DO
00,01
DO,(Al)+
(AO),OO
00,01
DO,(Al)+
D2,READLP
01
FINISH
-8(A6)
FINISH
-22(A6)
FINISH
tt4,02

POSKERR MOVEIL
NEGIB
t10VE II.. J

22(A6) ,AO
02
02, (AO)

jREPEAT UNTIL DONE

RSKPHDR
READLP

;

get address of BUFFER
; read the data bytes
; GET BYTE FROt1 01 SK
; INCLUDE IN RUNNING CHECKSUM
jAND STORE IT IN BUFFER
;GET BYTE FROM DISK
; INCLUDE IN RUNNING CHECKSUt1
;ANO STORE IT IN BUFFER
;REPEAT UNTIL DONE

set RC
error is 128 I .255

;

FINISH

UNLK
A6
MOVE .L (A7)+,AO
ADO.W
tt22,A7
(AO)
JMP

[Date 3/Apr/86; File -tt2tt2-hd/probootdrvr.TEXTJ

Page 5

FILENAME: HWINSTALL1MWI/ProfileBootBlks.text
Monitor Profile bootblocks for MacWorks
Modified:
10-29-84
5-Nov-84
(23Apr85)

RDC

by Ken Krugler (removed print/mouse stuff)
NOTE: boot code part of must be 7 block (SEOO) long,
so if anything changes, adjust .BLOCK at end
Cleanup, name changing.
Add support for square pixel screen
Remove initialization of screen to ~hite (leave boot ROM desktop)

Memory Map:
high mem

+-----------------------+
+
+
+ Upper Screen Memory +

+
+
+-----------------------+ ($160)

+
+
+ Lower Screen Memory +
+
+
+-----------------------+ (S110)
+
+ Monitor Load Area
+

+

= ($174)

= ($170)

+

+

+-----------------------+ (SIOC)

+
+
+

Free

+
+
+

+-----------------------+

+
+
+ Loader read by BlkO +
+
+

+-----------------------+ S20800

+
+
+ Initial Screen Memory +
+

+

+-----------------------+ S10000

+
+
+

stack base

Directory Buffer

+
+

+

+-----------------------+ $10000

+
+
+

+

Stack and Globals

+
+

+-----------------------+

+
+
+

10J.rl mem

+
+
+

+-----------------------+

[Date 3/Apr/86; File -1212-hdlprofilebootblks.TEXTl

Page 1

.PROC
Rrt1EPT EGU
CpuROMid EGU
lDRLOC EGU
LOMEH EGU
HIMEM EGU
lMSBASE EGU
SlKBASE EGU
ADDRSYM EGU
VIDLATCH EQU
COPSDRB EGU
FDIR EGU
COPSIFR EGU
PORTA EGU

ProfileBoot,O
$FEOOB4
$FE3FFC
$20800
t02A4
$0294
tDOO-40
$10000
t2000
$FCEBOO
4
4
tlA
2

entry point for ROM monitor
Lisa CPU ROM version id (3 =square pixels)
load pt for full loader at $20800
l~ memory address
high memory address
the MSBASE for the system
, Address of base of stack
; Address for monitor symbols
; address of the video latch
; Dir Reg B
j Bit number for Floppy Disk Int Request
; Interrupt flag register
; Offset to Port A

EGU
EGU
EGU
EGU

0
CRTROW+l
CRTCOL+l
CRTSTAT+l

;BYTE ,
iBYTE,
iBYTE,
;BYTE,

BUFSZ
BUFBK
BLKSZ
MSGSZ
DIRS2
DIR
BUF
riSGS
BlK
lOADfW
LOADSYM
PRlINFO
MSBASE

EGU
EGU
EGU
EGU
EGU
EGU
EGU
EGU
EGU
EGU
EGU
EGU
EGU

24576
BUFSZl512
512
2048
2048
0
-BUFSZ
BUF-MSGSZ
MSGS-BlKSZ
BLK-2
LOADfW-2
lOADSYM-2
PRTINFO-4

; A5+ (gr~ing directory upwards)
; object file buffer, MUST be first!
; message buffer for prtname
; single block for CONFIG and BOOTFIlES
; indicates a file was loaded
; load monitor symbols flag
; print info flag
; globals for character printing

RWBYlS
ROW8BTS
RBYlES
RLONGS
COPSVIA
BASEADR
BLKOFS
PAINlW
LASlGlB

EGU
EGU
EGU
EGU
EGU
EGU
EGU
EGU
EGU

MSBASE-2
RWBYTS-2
RW8BTS-2
RBYTES-2

j

CRTRtl4
CRTCOL
CRT STAT
CTLSFlG

ROW FOR SIMULATED CRT
COLUMN FOR SIMULATED CRT
STATE OF CRT SIMULATOR
(.NUSED

;

RL~GS-4

COPSVIA-4
BASEADR-2
BLKOFS-2
PAINlW

;
;
;
;
;
;
;
;

bytes for each scan line
bytes to offset to 8th scan line
bytes for each chr row
long-words for each chr row
address of via for the COPS
address of pia for the PROFILE
offset of root volume
paint screen white flag

;

; directory entry equates
;

FSTBLK EGU
LSTBLK EGU
FKIND EGU
; case fkind
OVID EGU
DEOVBlK EGU
DNUMFLS EGU

0
; dir entry for DFIRSTBLK
2
; dir entry for DLSTBLK
4
; dir entry for file kind, status
=securdir or untypedfile
6
; dir entry for title field
14
; dir entry for end of volume field
16
; dir entry for number files
[Date 3/Apr/86; File -1212-hdJprofilebootblks.TEXll

Page 2

(23Apr85)

DUlADTM EgU
DLASTBT EgU
; case fkind
DTID EgU
LSTBYTE EgU
DACCESS EgU
DELENG EgU

18

20
=normal files
6
22
24
26

; most recent date setting
;
;
;
;

dir entry
dir entry
dir entry
length in

for title field
for lastbyte
for date
bytes of dir entry

; BOOT BLOCK ZERO CODE
.INCLUDE MWD-HD/PROBOOTDRVR.TEXT

; Block 0 boot code

;

ERRMSG .ASCI I 'ERROR '
.WORD 0,0
; START OF

SEC~~DARY

TPLUSS12
MOVE
MOVE.L
LINK
MOVE.W
MOVE.W
MOVE.W
MOVE.W
MOVE.W

'S

.3
.4

; pad out block 0 code to S12 bytes long

LOADER
; Profi1eBoot + S12 bytes !! (Must be)

"2700,SR
ASl'KBASE ,A7
AS,ALASTGLB
AO,PAINTW(AS)
AO ,MSGS(AS)

; don't change screen

(23Apr8S)

AO,L~(AS)

IO,LOADS'{t1(AS)
AO,PRTINFO(AS)

TST.B
BEg.S
MOVE.L
MOVE.L
MOVE.L
MOVE.L
MOVE.L
MOVE.L
MOVEg
MOVE.L
MOVE.L
BRA.S

t14C
'S
"18000,00
DO,t110
DO,t160
"CCOOOO,DO
DO,t170
DO,t174
174,DO
tlfDOOOOl,COPSVIA(AS)
t198,BASEADR(AS)
.6

MOVE.L
MOVE.L
MOVE.L
MOVE.L
MOVE.L

"18000,00
DO ,tl10
DO,t160
DO,t170
DO ,t174

; LISA default screen locations

CMP.B
BNE.S
MOVEg
BRA.S

#3,CpuRctlid
.3

; check for square pixel Lisa
; skip if not
; square pixel row bytes

#7~"DO

.4

MOVED #90,DO
MOVE.L "FCDD81,COPSVIA(AS)
MOVE.L "FCD901,BASEADR(AS)

; GLM default screen locations

; GLM rCM bytes
; VIA address for Keyboard and Timers
; Get base address for boot PROFILE

(23Apr8S)
(23Apr8S)
(23Apr8S)
(23Apr8S)

; LISA rCM bytes
; Via 2 base for NEW &OLD I/O boards
; Base address for PROFILE (built-in)

[Date 3/Apr/86; Fi 1e -1212-hdlprof i1ebootbl ks.TEXTl

Page 3

36

MOVE.W
t1OVE.W
LSL.W
MOVE.W
MULU
MOVE.W
lSR.W
MOVE.W
aSR

DO ,RWBYTS(AS)
00,D1
13,01
D1,RWBBTS(AS)
110,00
DO,RBYTES(AS)
82,DO
DO ,RL~GS(AS)
SElVIDP

NOVE.L
MOVE.W
LSL.W
M()JE.W

ILDRLOC+$E54,AO
(AO) ,DO
13,DO
DO,BLKOFS(AS)

PEA
MOVE.W
H()JE.W
BSR

DIR(AS)
12,-(A7>
14,-(A7>
READBLKS

LEA
CMP.W

DIR(AS) ,AD
842,2(AO)
a2
DNlI1FLS(AO),DO
81,DO
IDELENG,DO
IDIRSZ,DO
a2
1511,DO
IB,DO
11,DO
tl36,DO
a1
136,DO
DIRSZ(AO)
16,-(A7>
DO ,-(A7>
READBLKS
-(A7>
CONFIGF
11,-(A7>
DIR(AS)
DIRSRCH
(A7>

~E.S

HOVE.W
ADD.W
HULS
SUB.W
BiI.S

il

.2

FC~FIG

31

ADD.W
LSR.W
LSR.W
CMP.W
BLT .5
M()JE.W
PEA
MOVE.W
M()JE.W
BSR
CLR.W
PEA
MOVE.W
PEA
BSR
TS1.W
Et4E.S
PEA
BRA
LEA
ADD.W
PEA
MOVE.W
M()JE.W
BSR
LEA
ADD.W
NOVE.W

; Read the directory,

; Read the directory

FC~FIG

CONFIGF
ERROR
DIR(AS) ,AO
(A7)+ ,AO
BLK(AS)
(AO) ,-(A7>
11,-(A7>
READBLKS
BLK(A5) ,AD
86,AO
(AO)+ ,DO

; Read the

C~FIG.DATA fil~

; Get next count word

[Date 3/Apr/86; File -1282-hdlprofilebootblks.TEXTl

Page 4

BEQ.S
ROR.W
MIJJE.L
ROR.W

i2

DATAEND
IB,OO
(AO)+ ,01
IB,OI
SWAP
01
ROR.W IB,OI
SWAP
01
MIJJE.L Ol,Al
MIJJE.B (AO)+ ,(AU+
SUB.W 11,00
~E.S

BRA.S
DATAENO TST.W
BEQ.S
MIJJE.l
MIJJE.L
SUB.L
MIJJE.l
SUS.l
MIJJE.l
SUS.L
MIJJE.L
MOVE.L
SUB.L
MOVE.L
MIJJE.L
ASR.L
MIJJE.L
i1
BSR
CLR.L
MIJJE.L
PEA
SSR
SUB.L
PEA
BSR
CLR.W
PEA
MIJJE .W
PEA
BSR
TST .W
ItIE.S
PEA
BRA
i2
lEA
ADD.W
PEA
MOVE.W
MIJJE .W
BSR
PEA
NEXTF MIJJE.L
TST.S
BEQ.S
CLR.W

; Get next address word

; Copy each data byte

32

il
BlK(AS)
il
HIMB1,OO
UJ1B1,01
01,00
00,02
11,00
00,;114
H7FFF,00
00,;160
00,;174
"8000,00
00,;110
00,;170
M1,02
02,;13C
SETVIDP
;U8
;110,$IOC
SCREENS
PRTNft1E
"IOOO,;IOC
DBGDATA
PRTtME
-(An
BOOTFLS
ttt ,-(An
DIR(AS)
OIRSRCH
(An

; memory size
; memory top
; upper screen base
; lower screen base
; default stack ptr
; APPLE not available

; code buffer

32

BOOTFLS
ERROR
OIR(AS),AO
(A7)+ ,AO
BLK(AS)
(AO) ,-(An
Ml,-(A7>
REAOBLKS
SLK(AS)
(An ,AO
(AO)
LOADMON
-(A7>

; Read the BOOTFILES.DATA file

[Date 31Apr/B6; File -M212-hdlprofilebootblks.TEXTl

Page 5

SUBIB
NOVElL
t10VEIW
PEA
BSR
1ST.W
~EIS

ttOVEIW
TSTIW
BRA
il
LEA
ADDIW
NOVElL
BSR
NOVElL
NOVElL
MOVEIL
JSR
MOVEIL
NOVElL
NOVEIW
NOVElL
BSR
ADDIL
BRA
LOADMlJi CLR IW
PEA
HOVEIW
PEA
BSR
TSTIW
~E.S

a1

PEA
BRA
LEA
ADD.W
NOVE.L
BSR
PEA
BSR
TST.W
BEQ.S
CLRIW
PEA
MOVE.W
PEA
BSR
TST.W
BEQ.S
LEA
ADD.W
MOVE.L
BSR
PEA
BSR.S

H20, (AO)
AO ,-(A7)
H1,-(A7)
DIR(AS)
DIRSRCH
(A7)
a1
14,DO
(A7)+
ERROR
DIR(AS) ,AD
(A7)+ ,AD
AD ,-(A7>
LOADIT
AS ,,-(A7>
A7,STKBASE
$10C,AO
(AO)
STKBASE,A7
(A7)+ ,AS
1I1,LOAIWfY(AS)
(A7> ,-(A7>
PRTNft1E
H16,(A7>
NooF
-(A7>
H(liITOR
Hl,-(A7)
DIR(AS)
DIRSRCH
(A7)
a1

; to expose address of filename

; Load the next object file

M~ITOR

ERROR
DIR(AS) ,AD
(A7)+ ,AO
AD ,-(A7>
LOAD IT
HlJiITOR
PRltWiE
LOADSYH(AS)
JHP2HlJi
-(An
SYMBOLS
1I1,-(A7>
DIR(AS)
DIRSRCH
(A7>

; Load the Monitor object

JHP2HOO

DIR(AS) ,AD
(A7>+ ,AD
AD ,-(A7>
LMONSYM
MSG6
WRTSTR

; Load the Monitor symbols

[Date 3/Apr/86; File -12112-hdlprofilebootblks.TEXTJ

Page 6

JHP2H1Ji BRA. S .2

a2

MI1JE
MI1JE
MI1JE .L
MI1JE.B
MI1JE.B
OR.B
BCLR
MI1JE.B
MI1JE .L
WAIT4RS DBF
BSET
MI1JE .B

SR I, -(A7>
ttS2700,SR
COPSVIA(A5),AO
COPSDRB(AO),DO
DO,Dl
11 1,DO
itO r (AD)
DOICOPSDRB(AO)
15200,D2
D2,WAIT4RS
II, (AD)
Dl,COPSDRB(AO)
(A7)+ ,SR
MWE
MI1JE.L $10C,AO
(AO)
.IMP

WRTSTR MI1JE.L
MI1JE IL
CLR.W
MI1JE.B
BRA

Reset the Keyboard
Ints off
Cops Base Address
Get Dir B reg
save it
Rake bit 0 output
set reset signal
, Rake sure of Dir B
; delay 12Rs
; reRove reset signal
; restore Dir B reg
; Ints on
; Go For It!

4(A7) ,A2
(A7)+ ,(An
D2
(A2)+ ,D2
WRITE

;

ERROR

PEA
MI1JE.W
BSR.S
ERROR2 BSR.S
WiNG BRA

MSG2
ttSl11E,MSBASE(A5)
WRTSTR
WR1'SiR

; row=l7, co1=30

Htti6

j

SCREENB •BYTE 10
.ASCI I 'SCREENBASE

I

;

DBGDATA .BYTE 13
.ASCI I 'DEBUGGER.DATA'
i
C~F

IGF •BYTE 11
.ASCII 'CONFIG.DATA'

j

BOOTFLS .BYTE 14
.ASCI I 'BOOTFILES.DATA '
;

MtJiITOR IBYTE 11
IASCI I 'MONITOR.OBJ'
;

SYMBOLS IBYTE 15
.ASCI I 'MONITOR.SYHBOLS'
j

MSGI

•BYTE 15
.ASCII 'Disk Read Error'

;

MS62

IBYTE 15
.ASCI I 'Failed to find'

;

MSG3

•BYTE 14
is loaded at
.ASCII
I

I

[Date 3/Apr/86; File -1212-hdlprofilebootblks.TEXTl

Page 7

;

MSG4

•BYTE 4S
.ASCI I 'About to boot, press Mouse Button to continue'

;

MSGS

•BYTE 13,,13,13
.ASCI I 'Booting ••• '

;

MSG6

•BYTE 24,,13
.ASCI I 'Loaded Monitor symbols'
•BYTE 13,0

;

PRTSTR l.INK
TST .W
BEQ.S
TST.W
BEQ.S
LEA

~O

.1

~2

.3

MOVE.W
BEQ.S
BSR
MOVE.W
MOVE.L
BSR.S
BRA.S
LEA

MOVE.L
MOVE.W
ADD.W
CLR.W
MOVE.L
MOVE.B
ADD.W
MOVE.W
MOVE.B
SUB.W
£t~E .S
~LK

MOVE.L
RTS

A6,I0
LOAlWfY(AS)

.1

PRTINFO(AS)

.1

MSGS(AS) ,A2
(A2)+ ,02
.0
WRITE
10,MSGS(AS)
8(A6) ,-(An
WRTSTR
.3
MSGS(AS) ,AD
AO,A1
(Al)+ ,DO
DO,Al
01
8(A6) ,A2
(A2)+,D1
01,00
DO, (AD)
(A2)+ ,(A1 )+
11,01
.2
A6
(A7)+ ,(An

PRTtW1E MOVE. L (SP)+,(SP)
RTS
SETVIDP CLR.L

MSBASE(AS)

TST.W
BEQ.S

PAINTW(AS)
.3

BSR.S
•BYTE
BSR

.1
2,27,t2A,o
WRTSTR

TST.B

tHe

.1

~E.S

.3

[Date 3/Apr/86; File -1212-hdlprofilebootblks.TEXTl

Page 8

MOVE.L
ADO.L
LSR.L
LSR.L
riOVE.B
.3
;

O1P .W

.2

; get screen start
; bias this by start of memory
; and convert to 32k page
; set the video page latch

RTS

FILLBUF PEA
HOVE.W
HOVE.L
MOVE.W
SUB.W

.1

$160,DO
LOHEM,DO
B8,DO
B7,00
DO ,VIDLATCH

BHI.S
MOVE.W
BRA.S
HOVE.W
BSR
ADD.W
LEA

BUF(AS)
-2(A6) ,-(A7>
8(A6) ,AD
2(AO) ,DO
-2(A6) ,DO
BBUFBK-l,DO

a1

DO,-(A7>

.2

MBUFBK ,-(A 7>
READBLKS
BBUFBK,-2(A6)
BUF(AS),AO

RTS

PROCEDURE LMONSYM(VAR OIRafrRY)
Stack
8
4

o
-2
-6
-14
-18
-20

Pointer to directory entry for symbols file
Return address
Old A6
Nextblock
4 BYTE VALUE
8 CHAR NAME
Address for monitor symbols
Counter

;

LMONSYM LINK
MOVE.L
MOVE.W
BSR

,1
,4

A6,B-18
8(A6) ,AD
(AD) ,-2(A6)
FILLBUF
M(J.JE .L BADDRSYM,A1
MOVE.L AI,-18(A6)
MOVE.W B6,-20(A6)
-14(A6) ,A2
LEA
O1P.L AO,AS
~E.S

as

M(J.JE.L AI,-(An

BSR

as

FILLBUF

M(J.JE .L (A7)+ ,Al
M(J.JE.W (AO)+ , (A2)+

SUB.W
~E.S

a4

TST.L

-14(A6)

~E.S

a2

TST.L

-10(A6)

ENE.S

; fill -14(A6) thru -4(A6)

Ml,-20(A6)

.2

[Date 31Apr/86; File -B2B2-hdiprofilebootblks.TEXTl

Page 9

a2

;3

TST.L
BEQ.S
HOVE.L
HOVE.L
NOVE.L
ADD.L
NOVE.L
BRA.S
HOVE.L
MOVE.L

-6(A6)

a3

-14(A6), (AD+
-IO(A6) ,(AD+
-6(A6),DO
ilOC,DO
DO I (AI)+
a1
-1S(A6),i406
Al,i40A
~LK
A6
MOVE.L (A7)+ ,(An
RTS

; coPY name
; coPY value

PROCEDURE LOADIT(VAR DIRENTRY)
Stack
8
4

Pointer to directory entry for this file
Return address
Old A6
Nextblock

o
-2

;

LOADIT LINK
MOVE.L
MOVE.W
BSR
;1
aMP.B
BEG.S
CLR.B
ADD.L
BRA.S
i2
CLR.B
MOVE.L
TST.L
SUB.L
HOVE.L
SUB.l
HOVE.L
;3
CHP.l
BNE.S
HOVEH.l
BSR
NOVEH.L
i4
MOVE.W
SUB.L
BNE.S
lNLK
NOVElL

A6,1-2
8(A6),AO
(AO),-2(A6)
FILLBUF
ts85,(AO)
a2
(AO)
(AO) ,AD
al
(AD)
(AO)+,DO
(AO)+
18,DO
ilOC,Al
DO,Al
Al,ilOC
AO,A5
i4
DO/A1,-(A7)
FILLBUF
(A7)+,DO/Al
(AO)+,(Al)+
M2,DO
a3

A6
(A7)+,(A7)

RTS

DIRSRCH
18
14
12

func result
iFTID
FINDPERM

[Date 3/Apr/86; File -1212-hdiprofilebootblks.TEXTl

Page 10

8
4

o

~FOIR

Return address
Old A6

j

DIRSRCH LINK
MOVE.L
HOVE.W
MOVE.L
HOVE.L
HOVE.W
HEQ.S
ADD.W
OIRSRLP HOVEM.L
HOVE.L
MOVE. L
CLR.W
MOVE.B
i1
CHAM.B

32
a3

a4

A6,IO
8(A6),Al
10,18(A6)
IDELENG,03
14(A6),AO
DNUMFLS(Al),Dl
01 RSRCX
IDELENG+DTID,A1
A3/A4,-(A7)
AI,A4
AO ,A3
02
(AO) ,02
(A3)+,(A4)+
~E.S
i2
SUB,W 11,02
BCC.S il
SUB,W IOTIO,A1
MOVEM,L (A7)+,A3/A4
BRA.S i~
HOVEM,L (A7)+ ,A3IA4
AOO,W IDELENG,A1
AOD,W IOELENG,03
SUB.W 11,01
~E.S
DIRSRLP
BRA,S DIRSRCX
HOVE.W 12(A6),OO
MOVE,W DACCESS(A1),D2
ANO.W ISFEOO,02
OHP,W ISC800,02
~E
D2
~O,W
11,02
CMP,W 00,D2
BEQ.S as
AOO.W IOTIO,A1

BRA,S

;
;
;
;

get ptr to dirbuf
return 0 as default
initialize offset
point AO at the filename
j get number of files
; number of files =0 ?
j point A1 at first entry
j save A3 and A4
; A4 is used for title compare
; A3 is title to look for
; length of name in bytes
; check each byte for equal
; compare length+l bytes
; found it leave At at start of entry
; restore A3 and A4
;
;
;
;

restore A3 and A4
skip to next dir entry
also update offset
any files left?

; file not found
; if findperm =daccess,year(>100 then

.3

as
MOVE,W 03,18(A6)
DIRSRCX UNLK A6
MOVE.L (A7)+,AO
ADD ,W 110,A7
..tMP
(AO)

dirsearch:=offset
; pop return address
; delete parameters

PROCEDURE READBLKS(VAR BUFFER; BLOCK,COUNT:INTEGER)j
Stack
12
10
8
4
0

Address of buffer
block
count
return address
old A6

[Oate 3/Apr/86; File -1212-hdlprofilebootblks.TEXTl

Page 11

;

WAITY

BSR

GETCOPS

; discard delta y

NO KEY STROKE EXIT
;

NOKEY

ClR.W
RTS

01

STATE 0 -- GET AMOUSE COOE, RESET COOE, OR KEY STROKE
;

GETKEY BSR
BED.S
DiP.B
BED.S
MIJJE.W
RTS

GETCOPS
WAITX
"80,00
WAITR
11,01

; Get byte, Mouse?
; Reset code ?

;

WRITE
LEA
TST
BlE.S
BSR.S
WRITE1 MIJJE.B
CHP.B
BEQ.S
CHP.B
BEQ.S
BSR
WRNEXT SUBD
BGT .S
WREXIT BSR.S
BRAIS
CRLF BSR
MIJJE.B
BSR
BRA.S
WROLE MIJJE .B
BRA.S
EXIT RTS

MSBASE(AS) ,A3
02
EXIT
CLRCUR
(A2)+ ,00
"00,00
CRLF
"10,00
WRDLE
PUTC
11,02
WRITE1
SETCUR
EXIT
PUTC
"OA,OO
PUTC
WRNEXT
14, CRTSTAHA3)
WRNEXT

; any at all?
; no, just leave
; remove cursor once per call
j and loop thru buffer
; is this a CR ?
; yes, simulate extra stuff
; how about a OLE?
; yes, it/s special too

; then, set it on again
j put out the explicit CR
; then, the implicit IF

Cursor routines.
;

ClRCUR
SETCUR

a1

; code is the same folks
BSR.S
AOO.W
HIJJE IW
SUB.W
NOT .B
SUB.W
BNE.S
RTS

SETAl
RW8BTS(AS) ,AI
18,00
RWBYTS(AS) ,At
(AD
11,00

; set At with proper byte address

j then complement it

at

; and thats all there is •••

SETAl
Sets At to proper address based upon
j
; current values of CRT ROW and CRTCOL.

[Oate 3/Apr/86j File -1212-hdlprofi1ebootblks.TEXTl

Page 13

SETAl
CLR
HOVEIB
HUlU
ADD
AODIL
HOVEIL
ClR
HOVEIB
ADM
RTS

D3

CRTRW(A3) ,03
RBYTES(AS),03
RBYTES(AS) ,03
$174,03
03,Al
03
CRTCOL+,(Al)
11,00
36
PUlFF

j state 0, normal stuff
; check it for graphic s~bol
; if special then go do it

; make upper case
; delete bytes from last loop
; get 7 more bytes
next byte
mask off repeat bits
extract repeat count
account for repeat count
push for each repeat count
decr counter for next byte
; decr character counter
; get screen ptr to At

; share code to advance cursor

;

PUTC1

31

CMP.B
IiE.S
MOVE.B
RTS
ClR.B
O1P.B
BEQ.S
CMP.B
BEG.S
CMP.B
BEQ.S
RTS

"3D,DO
31
12,CRTSTAHA3)
CRTSTAT(A3)
H54,00
ESCT
1$5'9,00
ESCY
H2A,OO
ESCSTAR

; ESC ~as just seen
ESC-= (cursor addressing)
and wait for Y value
; reset state for the rest
; ESC-T, erase to end of line
; ESC-Y, erase to end of screen
; ESC-I, erase screen
; none of the above
; ESC-= seen, expect

PUTC2

r~

value

SUB.B H1F,00
MOVE.B 00, CRTRW(A3)
MaJE.B M3,CRTSTAHA3)
RTS
PUTC3

; ESC-=, Y, expect column value
SUB.B
MOVE.B
elR.B
CMP.B

ttf1F,OO
DO ,CRTCOL
Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.3
Linearized                      : No
XMP Toolkit                     : Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:56:37
Create Date                     : 2011:07:09 20:05:45-08:00
Modify Date                     : 2011:07:09 20:09:06-07:00
Metadata Date                   : 2011:07:09 20:09:06-07:00
Producer                        : Adobe Acrobat 9.45 Paper Capture Plug-in
Format                          : application/pdf
Document ID                     : uuid:f82e7e35-fb86-41d7-be29-ddcccb06b272
Instance ID                     : uuid:c949b771-648d-43d0-9d0c-d81b2cbc8ed3
Page Layout                     : SinglePage
Page Mode                       : UseOutlines
Page Count                      : 142
EXIF Metadata provided by EXIF.tools

Navigation menu