FEDIT sources

Info-Mac discussion from 1984 - 2002.
Locked
User avatar
Info-Mac
Administrator
Posts:13716
Joined:December 21st, 1988, 11:00 am
FEDIT sources

Post by Info-Mac » November 29th, 1984, 12:08 am

Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10 UW 5/3/83; site uw-beaver
Path: utzoo!watmath!clyde!burl!ulysses!mhuxj!houxm!vax135!cornell!uw-beaver!info-mac
From: info-mac@uw-beaver (info-mac)
Newsgroups: fa.info-mac
Subject: FEDIT sources
Message-ID:
Date: Fri, 26-Oct-84 23:37:54 EST
Article-I.D.: uw-beave.2045
Posted: Fri Oct 26 23:37:54 1984
Date-Received: Sun, 28-Oct-84 06:06:38 EST
Sender: daemon@uw-beave
Organization: U of Washington Computer Science
Lines: 3355

From: Ed Pattermann
Here are FEDIT1.ASM, FEDIT2.ASM, FEDITR.ASM, and FEDIT.LINK

26-Oct-84 19:11:49-PDT,69937;000000000001
Return-Path:
Received: from CMU-CS-SPICE.ARPA by SUMEX-AIM.ARPA with TCP; Fri 26 Oct 84 19:05:28-PDT
Date: Friday, 26 October 1984 21:56:28 EDT
From: [email protected]
To: [email protected]
Subject: FEdit1.Asm (TO BE ARCHIVED)
Message-ID:

; Fedit1.Asm
;______________________________________________________________________
;
; This program is designed to provide disk information and to
; edit disk files on the Macintosh.
;
; Copyright (C) John H. Mitchell, September 1984.
;
; All rights reserved.
;
; Permission is granted for non commercial usage. This source
; and its associated code file may be copied and distributed
; freely, provided that you do not attempt to sell it, use it
; as the basis for a commercial program, or otherwise obtain any
; financial gain from it. You may modify it in any way that you
; feel appropriate within these limits.
;
;______________________________________________________________________

Include Mactraps.d

XREF DiskInserted,EjectDisk,FindVCB,GetVolumeName,Menu5

XDEF TempWord,TempHdl,TempRect,Event,What,Message
XDEF Count,DlogHdl,ItemHit,DlogStore,WindFlag
XDEF Outstring,ClearIOPB,FIOPB,WaitAcknowledge
XDEF VCBPtr,WordToHex,CharToHex
XDEF Start

SeparateResFile EQU 0 ; Set non zero if separate
; resource file is being used

MenuCount EQU 5 ; Number of menus in initial bar

AboutCmd EQU 1 ; Menu 1

OpenVolCmd EQU 1 ; Menu 2
OpenFileCmd EQU 2
CloseCmd EQU 3
QuitCmd EQU 4

RNextCmd EQU 1 ; Menu 3
RPrevCmd EQU 2
RBlockCmd EQU 3
WBlockCmd EQU 5
AModCmd EQU 7
HModCmd EQU 8
DiscardCmd EQU 10

ResForkCmd EQU 1 ; Menu 4
DataForkCmd EQU 2
DHexCmd EQU 4
DASCCmd EQU 5

FileInfoCmd EQU 1 ; Menu 5
UnitInfoCmd EQU 2

StartVpos EQU 48
StartHpos EQU 32
Vincrement EQU 20
Hincrement EQU 6
NrRows EQU 8
NrColumns EQU 64
AboveLine EQU 12
InfoLine EQU 230

HexVInc EQU 12
HexHInc EQU 6
HexTopPoint EQU 16
HexLeftPoint EQU 68
HexRightPoint EQU 308
HexNrColumns EQU 16
HexAboveLine EQU 9
HexP2Start EQU 10
HexP2Index EQU 160
Hex2Part EQU 326

srcCopy EQU 0
srcOr EQU 1
srcXor EQU 2
srcBic EQU 3

v EQU 0 ; vertical coordinate [word]
h EQU 2 ; horizontal coordinate [word]

topLeft EQU 0 ; upper left corner [point]
botRight EQU 4 ; lower right corner [point]
top EQU 0 ; top coordinate [word]
left EQU 2 ; left coordinate [word]
bottom EQU 4 ; bottom coordinate [word]
right EQU 6 ; right coordinate [word]

PortRect EQU $10 ; offset to port's rectangle [rect]

TagData EQU $02FA

VCBCrDate EQU 10 ; Creation date.
VCBLsBkUp EQU 14 ; last backup date
VCBAtrb EQU 18 ; volume attributes. bit 15 = vol lock (1=locked)
VCBNmFls EQU 20 ; number files in dir (low byte)
VCBDirSt EQU 22 ; start dir (512-byte) block on diskette
VCBBlLn EQU 24 ; length of dir in (512-byte) blocks
VCBNmBlks EQU 26 ; number of blocks (of alloc size) this device
VCBNmAlBlks EQU 26 ; (alternate label for a while)
VCBAlBlkSiz EQU 28 ; num of bytes in an allocation block
VCBClpSiz EQU 32 ; num of bytes to try to alloc as a clump
VCBAlBlSt EQU 36 ; starting diskette (512-byte) block in block map
VCBNxtFNum EQU 38 ; next free file number
VCBFreeBks EQU 42 ; number of free blocks on this volume
VCBVN EQU 44 ; volume name (including name length byte)

VCBDrvNum EQU 72 ; drive number for this VCB
VCBDRefNum EQU 74 ; driver refnum for this VCB
VCBFSID EQU 76 ; ID of file system handling this volume
VCBVRefNum EQU 78 ; unique refnum for this VCB
VCBMAdr EQU 80 ; volume map address
VCBBufAdr EQU 84 ; volume buffer address
VCBMLen EQU 88 ; length of volume map

VCBDirIndex EQU 90 ; directory index, block number used for
VCBDirBlk EQU 92 ; GetFileInfo searches by index

ioResult EQU $10 ; I/O result code [word]
ioFileName EQU $12 ; file name pointer [pointer]
ioVRefNum EQU $16 ; volume refnum [word]
ioDrvNum EQU $16 ; drive number [word]
ioRefNum EQU $18 ; file reference number [word]

ioFileType EQU $1A ; specified along with FileName [byte]

; specific fields for _Read, _Write

ioBuffer EQU $20 ; data buffer [pointer]
ioByteCount EQU $24 ; requested byte count [long]

ioPosMode EQU $2C ; initial file positioning mode/eol char [word]
ioPosOffset EQU $2E ; file position offset [long]

; specific fields for _GetFileInfo, _SetFileInfo

ioFDirIndex EQU $1C ; directory index of file [word]
ioFlAttrib EQU $1E ; in-use bit=7, lock bit=0 [byte]
ioFFlType EQU $1F ; file type [byte]
ioFlUsrWds EQU $20 ; finder info [16 bytes]
ioFFlNum EQU $30 ; file number [long]

ioFlStBlk EQU $34 ; start file block (0000 if none) [word]
ioFlLgLen EQU $36 ; logical length (EOF) [long]
ioFlPyLen EQU $3A ; physical length in bytes [long]
ioFlRStBlk EQU $3E ; resource fork's start file block [word]
ioFlRLgLen EQU $40 ; resource fork's logical length (EOF) [long]
ioFlRPyLen EQU $44 ; resource fork's physical length [long]

ioFlCrDat EQU $48 ; creation date & time [long]
ioFlMdDat EQU $4C ; last modification date & time [long]

; Specific fields for _GetEOF, _SetEOF

ioLEOF EQU $1C ; logical end-of-file [long]

MonacoFont EQU 4 ; Font definition

IOPBLength EQU 80 ; Length of I/O parameter block

AbsBlkNumber DS.W 1
AlBlkSize DS.W 1
AlBlkOffset DS.W 1
BlockNumber DS.W 1
ChangeMade DS.W 1
Count DS.W 1
DlogHdl DS.L 1
DisplayMode DS.W 1
DriveNumber DS.W 1
DriverRef DS.W 1
FirstAlBlk DS.W 1
Fork DS.W 1
HexColumn DS.W 1
HexlitPosition DS.L 1
HScroll DS.L 1
HexStartLine DS.W 1
InModify DS.W 1
ItemHit DS.W 1
LEOFBlock DS.W 1
LEOFPosition DS.W 1
Marker DS.W 1
MaxBlockNr DS.W 1
ModifyProc DS.L 1
NextTick DS.L 1
Position DS.L 1
PosPosition DS.L 1
TempHdl DS.L 1
TempWord DS.W 1
UnitMode DS.W 1
VCBPtr DS.L 1
VolMapAdr DS.L 1
VP DS.W 1
VScroll DS.L 1
WindFlag DS.W 1

IOPB DS.B IOPBLength
FIOPB DS.B IOPBLength
IOBuff DS.B 512
DispBuffer DS.B 512
SaveBuffer DS.B 512
OutString DS.B 40

DlogStore DS.W 170
WindStore DS.W 156
DataRect DS.W 4
MarkRect DS.W 4
TempRect DS.W 4

CHandle DC.L 0
WWindow DC.L 0

DeskName DCB.B 16,0
MenuHandle DCB.L MenuCount+2,0

DragRect DC.W 24,4,338,508
SizeRect DC.W 40,40,342,512
WindRect DC.W 40,20,328,490

Event
What DC.W 0
Message DC.L 0
When DC.L 0
Point DC.L 0
Modify DC.W 0

SFRecord
rGood DC.B 0
rCopy DC.B 0
rType DC.L 0
rVolume DC.W 0
rVersion DC.W 0
rName DCB.B 66,0

MACRO PushMenu MenuNr =
MOVE.L MenuHandle+{MenuNr}*4,-(SP)|

MACRO PushItem MenuNr,ItemNr =
PushMenu {MenuNr}
MOVE #{ItemNr},-(SP)|

ShowAlert:
CLR -(SP)
MOVE D0,-(SP)
CLR.L -(SP)
_Alert ; Put alert box on screen
MOVE (SP)+,D0
RTS

ExitModify:
TST InModify(A5) ; Are we modifying?
BEQ @1 ; No, exit
MOVE #5,D0 ; Yes, remove the menu bar item
ADD InModify(A5),D0
MOVE D0,-(SP)
_DeleteMenu
_DrawMenuBar

PushMenu 3 ; Push pointer to menu 3
MOVE #AModCmd-1,D0
ADD InModify(A5),D0
MOVE D0,-(SP)
CLR -(SP)
_CheckItem ; Remove the check mark

CLR InModify(A5) ; Clear the modify flag

@1 RTS

WaitAcknowledge: ; Wait for mouse button or key
_SystemTask ; Perform desk access updates
~r CLR -(SP)
MOVE #$000B,-(SP) ; Key & mouse down, null mask
PEA Event
_GetNextEvent ; Get next event
MOVE (SP)+,D0
BEQ WaitAcknowledge ; Ignore null events
RTS

ClearIOPB:
LEA IOPB(A5),A0 ; Zero out the IO parameter block

ClearIOPBLoop:
MOVE.L A0,-(SP)
MOVEQ #IOPBLength/2-1,D0

@1 CLR (A0)+
DBRA D0,@1
MOVE.L (SP)+,A0 ; Leave A0 pointing at param block
RTS

ClearFIOPB:
LEA FIOPB(A5),A0
JMP ClearIOPBLoop

HexConvert:
AND #$0F,D1 ; Convert a hex char to ASCII
CMP #10,D1
BGE @1
ADD #'0',D1
RTS

@1 ADD #'A'-10,D1
RTS

MoveHex:
MOVE D0,D1 ; Convert a hex char to ASCII
LSR D2,D1 ; and put it in Outstring
JSR HexConvert
MOVE.B D1,(A0)+
SUB #4,D2
BPL MoveHex
MOVE.B #' ',(A0)+
RTS

CharToHex:
LEA OutString(A5),A0 ; Convert 8 bit char to hex
MOVE.B #3,(A0)+
MOVE #4,D2
JMP MoveHex

WordToHex:
LEA OutString(A5),A0 ; Convert 16 bit word to hex
MOVE.B #5,(A0)+
MOVE #12,D2
JMP MoveHex

CopyPortRect:
LEA PortRect(A4),A0 ; A4 always holds a pointer
LEA TempRect(A5),A1 ; to the current window
MOVE.L (A0)+,(A1)+
MOVE.L (A0)+,(A1)+
LEA TempRect(A5),A1
RTS

MakeCtlsInvalid:
JSR CopyPortRect ; Mark scroll bar areas
MOVE Bottom(A1),Top(A1) ; for update
SUB #16,Top(A1)
PEA TempRect(A5)
_InvalRect ; Vertical scroll bar

JSR CopyPortRect
MOVE Right(A1),Left(A1)
SUB #16,Left(A1)
SUB #16,Bottom(A1)
PEA TempRect(A5)
_InvalRect ; Horizontal scroll bar

RTS

EraseGrowIcon:
LEA TempRect(A5),A1 ; Not really needed, but it
MOVE.L VScroll(A5),A0 ; makes a screen resize from
MOVE.L (A0),A0 ; small to large look better
MOVE 8+Right(A0),Right(A1)
MOVE 8+Left(A0),Left(A1)
MOVE.L HScroll(A5),A0
MOVE.L (A0),A0
MOVE 8+Top(A0),Top(A1)
MOVE 8+Bottom(A0),Bottom(A1)
MOVE.L A1,-(SP)
_EraseRect
RTS

MoveScrollBars:
MOVE.L HScroll(A5),-(SP) ; Remove the controls
_HideControl

MOVE.L VScroll(A5),-(SP)
_HideControl

JSR EraseGrowIcon

MOVE.L HScroll(A5),-(SP) ; Move HScroll control
MOVE PortRect+Left(A4),D0
SUB #1,D0
MOVE D0,-(SP)
MOVE PortRect+Bottom(A4),D0
SUB #15,D0
MOVE D0,-(SP)
_MoveControl

MOVE.L HScroll(A5),-(SP) ; Redo the thumb position
MOVE PortRect+Right(A4),D0
SUB PortRect+Left(A4),D0
SUB #13,D0
MOVE D0,-(SP)
MOVE #16,-(SP)
_SizeControl

MOVE.L VScroll(A5),-(SP) ; Move VScroll control
MOVE PortRect+Right(A4),D0
SUB #15,D0
MOVE D0,-(SP)
MOVE PortRect+Top(A4),D0
SUB #1,D0
MOVE D0,-(SP)
_MoveControl

MOVE.L VScroll(A5),-(SP) ; Redo the thumb position
MOVE #16,-(SP)
MOVE PortRect+Bottom(A4),D0
SUB PortRect+Top(A4),D0
SUB #13,D0
MOVE D0,-(SP)
_SizeControl

MOVE.L HScroll(A5),-(SP) ; Redraw controls
_ShowControl

MOVE.L VScroll(A5),-(SP)
_ShowControl

MOVE.L A4,-(SP)
_DrawGrowIcon

RTS

CloseWindow:
TST WindFlag(A5) ; Test for open window
BEQ @1 ; Exit if not there

CLR WindFlag(A5) ; Clear flags
CLR.L NextTick(A5)
JSR ExitModify ; Exit modify cmd

MOVE.L A4,-(SP) ; A4 = Current window
_CloseWindow

PushItem 4,ResForkCmd ; Uncheck items
CLR -(SP)
_CheckItem

PushItem 4,DataForkCmd
CLR -(SP)
_CheckItem

PushItem 2,CloseCmd ; Disable menu commands
_DisableItem

PushItem 3,0
_DisableItem

PushItem 4,ResForkCmd
_DisableItem

PushItem 4,DataForkCmd
_DisableItem

PushItem 5,FileInfoCmd
_DisableItem

PushItem 5,UnitInfoCmd
_DisableItem

@1 RTS

OpenWindow:
JSR CloseWindow ; Close any open window
MOVE #-1,WindFlag(A5)

CLR.L -(SP) ; Make a new window
PEA WindStore(A5)
PEA WindRect
PEA rName
MOVE #-1,-(SP)
MOVE #0,-(SP)
MOVE.L #-1,-(SP)
MOVE #-1,-(SP)
CLR.L -(SP)
_NewWindow

MOVE.L (SP),A4 ; Make new window current
_SetPort

MOVE #MonacoFont,-(SP) ; Set Font type
_TextFont

MOVE #9,-(SP) ; Set Font size in points
_TextSize

CLR.L -(SP) ; Setup vertical scroll bar
MOVE.L A4,-(SP)
JSR CopyPortRect
ADD #1,Right(A1)
MOVE Right(A1),D0
SUB #16,D0
MOVE D0,Left(A1)
SUB #14,Bottom(A1)
SUB #1,Top(A1)
PEA TempRect(A5)
CLR.L -(SP)
MOVE #-1,-(SP)
MOVE #0,-(SP)
MOVE #0,-(SP)
MOVE #1,-(SP)
MOVE #16,-(SP)
CLR.L -(SP)
_NewControl
MOVE.L (SP)+,VScroll(A5)


CLR.L -(SP) ; Setup Horizontal scroll bar
MOVE.L A4,-(SP)
JSR CopyPortRect
ADD #1,Bottom(A1)
MOVE Bottom(A1),D0
SUB #16,D0
MOVE D0,Top(A1)
SUB #14,Right(A1)
SUB #1,Left(A1)
PEA TempRect(A5)
CLR.L -(SP)
MOVE #-1,-(SP)
MOVE #0,-(SP)
MOVE #0,-(SP)
MOVE MaxBlockNr(A5),-(SP)
MOVE #16,-(SP)
CLR.L -(SP)
_NewControl
MOVE.L (SP)+,HScroll(A5)

LEA PortRect(A4),A0 ; Copy the port rectangle
LEA DataRect(A5),A1
MOVE.L (A0)+,(A1)+
MOVE.L (A0)+,(A1)+

LEA DataRect(A5),A1 ; Make smaller to put
SUB #15,Right(A1) ; controls outside it
SUB #15,Bottom(A1)

PushItem 3,0 ; Enable menu 3
_EnableItem

PushItem 2,CloseCmd ; Enable close command
_EnableItem

TST UnitMode(A5) ; Test for file or
BNE @1 ; unit mode

PushItem 4,ResForkCmd ; File mode items only
_EnableItem

PushItem 4,DataForkCmd
_EnableItem

PushItem 5,FileInfoCmd
_EnableItem

PushMenu 4
MOVE Fork(A5),-(SP)
MOVE #-1,-(SP)
_CheckItem

@1 PushItem 5,UnitInfoCmd ; Enable unit info cmd
_EnableItem

CLR HexStartLine(A5)
TST DisplayMode(A5) ; Is it Ascii display
BEQ @2 ; No, Hex so exit

MOVE.L VScroll(A5),-(SP) ; Yes, make vertical
MOVE #255,-(SP) ; control inactive
_HiliteControl

@2 RTS

ScnLoctoPos:
LEA Point,A0 ; Take an ASCII screen location
MOVE V(A0),D3 ; and discover which character (if
SUB #StartVpos,D3 ; (if any) it's pointing at
ADD #AboveLine,D3
BMI @1
EXT.L D3
DIVU #Vincrement,D3
CMP #NrRows-1,D3
BHI @1
LSL #6,D3

MOVE H(A0),D1
SUB #StartHpos,D1
BMI @1
EXT.L D1
DIVU #Hincrement,D1
CMP #NrColumns-1,D1
BHI @1
ADD D1,D3
RTS

@1 MOVE #-1,D3
RTS

HScnLoctoPos:
LEA Point,A0 ; Take an Hex screen location
MOVE V(A0),D3 ; and derive the character
SUB #HexTopPoint,D3 ; index into the block
ADD #HexAboveLine,D3
BMI @9
EXT.L D3
DIVU #HexVInc,D3
MULU #HexNrColumns*2,D3
TST HexStartLine(A5)
BEQ @1
ADD #HexP2Index*2,D3
BRA @2

@1 SUB #HexNrColumns*4,D3
BMI @9

@2 MOVE H(A0),D1
CMP #HexRightPoint,D1
BHI @9
SUB #HexLeftPoint,D1
BMI @9
EXT.L D1
DIVU #HexHInc,D1
MOVE D1,D0
ADD #1,D0
EXT.L D0
DIVU #5,D0
SUB D0,D1
ADD D1,D3
CMP #1023,D3
BHI @9
RTS

@9 MOVE #-1,D3
RTS

PostoScnLoc:
MOVE Marker(A5),D0 ; Convert ASCII marker position
EXT.L D0 ; to actual character location
DIVU #NrColumns,D0 ; on the screen
MOVE D0,D1
MULU #Vincrement,D1
ADD #StartVpos,D1

SWAP D0
EXT.L D0
MULU #Hincrement,D0
ADD #StartHpos,D0
RTS

HPostoScnLoc:
MOVE Marker(A5),D0 ; Convert Hex marker position
TST HexStartLine(A5) ; to actual character location
BEQ @1 ; on the screen
SUB #HexP2Index*2,D0
BRA @2

@1 ADD #HexNrColumns*4,D0

@2 EXT.L D0
DIVU #HexNrColumns*2,D0
MOVE D0,D1
MULU #HexVinc,D1
ADD #HexTopPoint,D1

SWAP D0
MOVE D0,HexColumn(A5)
MOVE D0,D2
LSR #2,D2
ADD D2,D0
MULU #HexHInc,D0
ADD #HexLeftPoint,D0
RTS

PutMark:
JSR PostoScnLoc ; Calc char screen location
LEA MarkRect(A5),A2 ; Calc box position under it
ADD #3,D1
MOVE D1,Top(A2)
ADD #3,D1
MOVE D1,Bottom(A2)
MOVE D0,Left(A2)
ADD #Hincrement-1,D0
MOVE D0,Right(A2)

CLR -(SP) ; Get intersection of DataRect
PEA DataRect(A5) ; and MarkRect in case the mark
PEA MarkRect(A5) ; box is at the edge of draw area
PEA MarkRect(A5)
_SectRect
MOVE (SP)+,D0

PEA MarkRect(A5) ; Paint box black
_PaintRect

CLR.L -(SP) ; Set time to invert the box
_TickCount
MOVE.L (SP)+,NextTick(A5)
ADD.L #20,NextTick(A5)
RTS

DeleteMark:
TST.L NextTick(A5) ; Change marker box to white
BEQ @1
PEA MarkRect(A5)
_EraseRect
CLR.L NextTick(A5)

@1 RTS

HexInvert:
JSR HPostoScnLoc ; Calculate hex character box
LEA MarkRect(A5),A2
SUB #9,D1
MOVE D1,Top(A2)
ADD #11,D1
MOVE D1,Bottom(A2)
SUB #1,D0
MOVE D0,Left(A2)
ADD #HexHInc+1,D0
MOVE D0,Right(A2)

MOVE.L A2,-(SP) ; Invert character box on screen
_InverRect

RTS

HexNormal:
PEA MarkRect(A5) ; Remove inverted box
_InverRect

RTS

ModifyBlockA:
MOVE.L Message,D3 ; Character code in bottom byte

ModifyBlock:
LEA IOBuff(A5),A0
ADD Marker(A5),A0
MOVE.B D3,(A0) ; Update I/O buffer

LEA DispBuffer(A5),A0
ADD Marker(A5),A0
CMP.B #$1F,D3
BLS @1
CMP.B #$7E,D3
BLS @2
@1 MOVE.B #'.',D3
@2 MOVE.B D3,(A0) ; Update display buffer

LEA MarkRect(A5),A0
SUB #Vincrement,Top(A0)
ADD #1,Right(A0)
JSR DeleteMark ; Remove mark under character

JSR PostoScnLoc ; Draw char on screen

MOVE D0,-(SP)
MOVE D1,-(SP)
_MoveTo

MOVE D3,-(SP)
_DrawChar

MOVE #1,ChangeMade(A5) ; Mark block as modified

PushItem 3,DiscardCmd ; Enable discard cmd
_EnableItem

PushItem 3,WBlockCmd ; Enable write block cmd
_EnableItem

ADD #1,Marker(A5) ; Increment mark position
MOVE #$01FF,D0
AND D0,Marker(A5)

JSR PutMark ; Put new mark on screen
JMP ShowPosition ; and update info line

GetNextKey:
_SystemTask ; Perform desk access updates
JSR Ticker
CLR -(SP)
MOVE #$0029,-(SP) ; Key down and null mask
PEA Event
_GetNextEvent ; Get next event
MOVE (SP)+,D0
BEQ GetNextkey ; Ignore null events
MOVE Modify,D0
BTST #8,D0 ; Ignore command keys
BNE GetNextKey
RTS

BlankHexArea:
MOVE #srcCopy,-(SP) ; Blank out the place to
_TextMode ; put a hex literal

MOVE.L HexlitPosition(A5),-(SP)
_MoveTo

MOVE #' ',-(SP)
_DrawChar

MOVE #srcOr,-(SP)
_TextMode

MOVE.L HexlitPosition(A5),-(SP)
_MoveTo

RTS

GetHexChar:
MOVE.L Message,D4 ; Get a key press and convert
AND #$00FF,D4 ; to hex (in D3). Leave
MOVE D4,D3 ; original in D4.
CMP.B #'0'-1,D4
BLS @1
CMP.B #'9',D4
BHI @2
SUB.B #'0',D3
RTS

@1 MOVE #-1,D3 ; Return if not hex vhar
RTS

@2 CMP.B #'A'-1,D4
BLS @1
CMP.B #'F',D4
BHI @3
SUB.B #'A'-10,D3
RTS

@3 CMP.B #'a'-1,D4
BLS @1
CMP.B #'f',D4
BHI @1
SUB.B #'a'-10,D3
SUB.B #$20,D4 ; Upcase
RTS

ModifyBlockH:
TST DisplayMode(A5) ; Hex modify - test mode
BEQ ModifyBlockHH ; Branch if not ASCII

JSR GetHexChar ; Get keyboard char
TST D3 ; D3 negative if not hex
BMI ShowPosition

MOVE D3,D5 ; Save for later
LSL #4,D5

JSR BlankHexArea ; Blank hex display area

MOVE D4,-(SP)
_DrawChar ; Draw the character

JSR GetNextKey ; Get next character
MOVE.L Message,D0
CMP.B #8,D0 ; Test for backspace
BEQ @1 ; Yes, remove last char

JSR GetHexChar ; Test for hex char
TST D3 ; Branch if not
BMI ShowPosition

OR D5,D3
JMP ModifyBlock ; Go do the block modify

@1 JSR BlankHexArea ; Handle backspace
JMP ModifyBlockH

ModifyBlockHH:
JSR GetHexChar ; Hex modify, hex display
TST D3 ; Test char for hex
BMI @5 ; exit if not

PEA DataRect(A5) ; Borderline case
_ClipRect

LEA IOBuff(A5),A0 ; Modify the block
MOVE Marker(A5),D0
LSR #1,D0
ADD D0,A0
MOVE.B (A0),D2
MOVE Marker(A5),D1
BTST #0,D1
BNE @1

AND.B #$0F,D2
LSL.B #4,D3
BRA @2

@1 AND.B #$F0,D2
AND.B #$0F,D3

@2 OR.B D3,D2
MOVE.B D2,(A0)

LEA DispBuffer(A5),A0
ADD D0,A0
CMP.B #$1F,D2
BLS @3
CMP.B #$7E,D2
BLS @4
@3 MOVE.B #'.',D2
@4 MOVE.B D2,(A0)
MOVE D2,Tempword(A5)

PEA MarkRect(A5) ; Erase old character
_EraseRect

JSR HPostoScnLoc ; Write the new one

MOVE D0,-(SP)
MOVE D1,-(SP)
_MoveTo

MOVE D4,-(SP)
_DrawChar

LEA MarkRect(A5),A1 ; Calculate position on
MOVE HexColumn(A5),D0 ; ASCII side of screen
LSR #1,D0
MULU #HexHInc,D0
ADD #Hex2Part,D0
MOVE D0,Left(A1)
ADD #HexHInc,D0
MOVE D0,Right(A1)

MOVE.L A1,-(SP) ; Erase old ASCII character
_EraseRect

LEA MarkRect(A5),A1 ; Draw new one
MOVE Left(A1),-(SP)
MOVE Bottom(A1),D0
SUB #2,D0
MOVE D0,-(SP)
_MoveTo

MOVE TempWord(A5),-(SP)
_DrawChar

MOVE #1,ChangeMade(A5) ; Mark block as modified

PushItem 3,DiscardCmd ; Enable discard cmd
_EnableItem

PushItem 3,WBlockCmd ; Enable write block cmd
_EnableItem

ADD #1,Marker(A5) ; Increment mark position
MOVE #$03FF,D0
AND D0,Marker(A5)

JSR HexInvert ; Invert marked character

PEA PortRect(A4)
_ClipRect

@5 RTS

DisplayAscii: ; Display block in ASCII
MOVE BlockNumber(A5),D0 ; Is LEOF in this block?
CMP LEOFBlock(A5),D0
BNE @0 ; No, branch forward

MOVE #StartHpos,-(SP) ; Tell user
MOVE #24,-(SP)
_MoveTo

CLR.L -(SP)
MOVE #260,-(SP) ; Says "Logical EOF..."
_GetString

MOVE.L (SP),A0
MOVE.L (A0),(SP)
_DrawString

MOVE #' ',-(SP)
_DrawChar

LEA OutString(A5),A0
MOVE LEOFPosition(A5),D0
EXT.L D0
CLR -(SP)
_Pack7 ; NumToString

MOVE.L A0,-(SP)
_DrawString

MOVE #' ',-(SP)
_DrawChar

CLR.L -(SP)
MOVE #261,-(SP) ; Says "in this block"
_GetString

MOVE.L (SP),A0
MOVE.L (A0),(SP)
_DrawString

@0 CLR D3 ; Row Counter
MOVE #StartVpos,D4 ; Row baseline
CLR D5 ; Index into block

@1 MOVE #StartHpos,-(SP)
MOVE D4,-(SP)
_MoveTo

PEA DispBuffer(A5)
MOVE D5,-(SP)
MOVE #NrColumns,-(SP)
_DrawText

ADD #NrColumns,D5
ADD #Vincrement,D4
ADD #1,D3
CMP #NrRows,D3
BNE @1

JSR PutMark ; Mark current character

MOVE #srcCopy,-(SP)
_TextMode

MOVE #StartHpos,-(SP)
MOVE #InfoLine,D4
MOVE D4,-(SP)
_MoveTo

CLR.L -(SP)
MOVE #257,-(SP) ; Says "Hex:"
_GetString

MOVE.L (SP),A0
MOVE.L (A0),(SP)
_DrawString

MOVE #' ',-(SP)
_DrawChar

PEA HexlitPosition(A5)
_GetPen

LEA IOBuff(A5),A0
ADD Marker(A5),A0
MOVE.B (A0),D0
JSR CharToHex

PEA OutString(A5)
_DrawString

MOVE #180,-(SP)
MOVE D4,-(SP)
_MoveTo

CLR.L -(SP)
MOVE #258,-(SP) ; Says "Position:"
_GetString

MOVE.L (SP),A0
MOVE.L (A0),(SP)
_DrawString

MOVE #' ',-(SP)
_DrawChar

PEA PosPosition(A5)
_GetPen

LEA OutString(A5),A0
MOVE Marker(A5),D0
EXT.L D0
CLR -(SP)
_Pack7 ; NumToString

MOVE.L A0,-(SP)
_DrawString

MOVE #360,-(SP)
MOVE D4,-(SP)
_MoveTo

CLR.L -(SP)
MOVE #259,-(SP) ; Says "Block:"
_GetString

MOVE.L (SP),A0
MOVE.L (A0),(SP)
_DrawString

MOVE #' ',-(SP)
_DrawChar

LEA OutString(A5),A0
MOVE BlockNumber(A5),D0
EXT.L D0
CLR -(SP)
_Pack7 ; NumToString

MOVE.L A0,-(SP)
_DrawString

MOVE #srcOr,-(SP)
_TextMode

RTS

ShowPosition:
PEA DataRect(A5) ; Update the ASCII display
_ClipRect ; for changed position

MOVE #srcCopy,-(SP)
_TextMode

MOVE.L HexlitPosition(A5),-(SP)
_MoveTo

LEA IOBuff(A5),A0
ADD Marker(A5),A0
MOVE.B (A0),D0
JSR CharToHex

PEA OutString(A5)
_DrawString

MOVE.L PosPosition(A5),-(SP)
_MoveTo

LEA OutString(A5),A0
MOVE Marker(A5),D0
EXT.L D0
CLR -(SP)
_Pack7 ; NumToString

MOVE.L A0,-(SP)
_DrawString

MOVE #srcOr,-(SP)
_TextMode

PEA PortRect(A4)
_ClipRect

RTS

DisplayTags: ; Display tags on hex screen
PEA 'Tags: '
_DrawString

LEA TagData+2,A2
MOVE #5,D6

@1 MOVE (A2)+,D0
JSR WordtoHex
PEA OutString(A5)
_DrawString

DBRA D6,@1
RTS

DisplayHex:
MOVE #HexTopPoint,D4 ; Row baseline

TST HexStartLine(A5)
BNE @2

MOVE #StartHPos,-(SP)
MOVE D4,-(SP)
_MoveTo

PEA 'Blk : '
_DrawString

MOVE BlockNumber(A5),D0
JSR WordToHex
PEA OutString(A5)
_DrawString

MOVE BlockNumber(A5),D0
CMP LEOFBlock(A5),D0
BNE @1

MOVE #30,-(SP)
CLR -(SP)
_Move

CLR.L -(SP)
MOVE #260,-(SP) ; Says "Logical EOF..."
_GetString

MOVE.L (SP),A0
MOVE.L (A0),(SP)
_DrawString

MOVE #' ',-(SP)
_DrawChar

MOVE LEOFPosition(A5),D0
JSR WordToHex
PEA OutString(A5)
_DrawString

CLR.L -(SP)
MOVE #261,-(SP) ; Says "in this block"
_GetString

MOVE.L (SP),A0
MOVE.L (A0),(SP)
_DrawString

@1 MOVE #StartHPos,-(SP)
ADD #HexVInc,D4
MOVE D4,-(SP)
_MoveTo

JSR DisplayTags

ADD #HexVinc,D4

@2 MOVE HexStartLine(A5),D5
LSL #4,D5 ; Index into block
LEA IOBuff(A5),A2
ADD D5,A2

MOVE D4,D3
SWAP D3
MOVE #StartHpos,D3

@3 MOVE.L D3,-(SP)
_MoveTo

MOVE D5,D0
JSR WordToHex
LEA OutString(A5),A0
MOVE.B #4,(A0)
MOVE.L A0,-(SP)
_DrawString

PEA ': '
_DrawString

MOVE #7,D6

@4 MOVE (A2)+,D0
JSR WordtoHex
PEA OutString(A5)
_DrawString

DBRA D6,@4

MOVE #18,-(SP)
CLR -(SP)
_Move

PEA DispBuffer(A5)
MOVE D5,-(SP)
MOVE #HexNrColumns,-(SP)
_DrawText

ADD #HexVInc,D4
ADD #HexNrColumns,D5

CMP #511,D5
BHI @5

MOVE D4,D3
SWAP D3
MOVE #StartHpos,D3

CLR -(SP)
MOVE.L D3,-(SP)
PEA PortRect(A4)
_PtInRect
MOVE (SP)+,D0
BTST #8,D0
BNE @3

@5 JSR HexInvert ; Invert marked character
RTS

DisplayBlock:
PEA DataRect(A5) ; Routine to display one
_ClipRect ; block of data

PEA DataRect(A5)
_EraseRect

TST DisplayMode(A5)
BNE @1

JSR DisplayHex
BRA @2

@1 JSR DisplayAscii

@2 PEA PortRect(A4)
_ClipRect

PEA PortRect(A4)
_ValidRect

RTS

ChangePos:
CLR -(SP) ; Change current character
MOVE.L Point,-(SP) ; pointer by mouse click
PEA DataRect(A5)
_PtInRect
MOVE (SP)+,D0
BTST #8,D0
BEQ @1 ; Exit if not in data area

TST DisplayMode(A5) ; Branch if hex display screen
BEQ HexChangePos

JSR ScnLoctoPos ; Convert screen location
TST D3 ; to position, or -1
BMI @1 ; if cursor not on character

PEA DataRect(A5)
_ClipRect

JSR DeleteMark ; Delete old marker boc
MOVE D3,Marker(A5)
JSR PutMark ; Draw a new one
JMP ShowPosition ; Update information line

@1 RTS

HexChangePos:
JSR HScnLoctoPos ; Convert mouse posn to char
TST D3
BMI @1 ; Exit if not pointing at char

PEA DataRect(A5)
_ClipRect

JSR HexNormal ; Remove invertion on last char
MOVE D3,Marker(A5) ; Set new position
JSR HexInvert ; Invert new marked character

PEA PortRect(A4)
_ClipRect

@1 RTS

FindNextAlBlk:
MOVE.L VolMapAdr(A5),A0 ; Read Volume allocation map
SUB #2,D0 ; to determine next allocation
LSR #1,D0 ; block for the file
BCC @2

MULU #3,D0
BTST.B #0,D0
BEQ @1

ADD #1,D0
ADD D0,A0
MOVE (A0),D0
AND #$0FFF,D0
RTS

@1 ADD D0,A0
MOVE.L (A0),D0
MOVE #8,D1
LSR.L D1,D0
AND #$0FFF,D0
RTS

@2 MULU #3,D0
BTST.B #0,D0
BEQ @3

SUB #1,D0
ADD D0,A0
MOVE.L (A0),D0
MOVE #12,D1
LSR.L D1,D0
AND #$0FFF,D0
RTS

@3 ADD D0,A0
MOVE (A0),D0
LSR #4,D0
RTS

ConvertBlkNr: ; Convert a relative blocknumber
TST UnitMode(A5) ; to an absolute block on disk
BEQ @1
MOVE BlockNumber(A5),AbsBlkNumber(A5)
RTS

@1 MOVE BlockNumber(A5),D2
EXT.L D2
DIVU AlBlkSize(A5),D2

MOVE FirstAlBlk(A5),D0
CLR D3

@2 CMP D2,D3
BEQ @3
CMP #1,D0
BEQ @4
JSR FindNextAlBlk
ADD #1,D3
BRA @2

@3 SUB #2,D0
MULU AlBlkSize(A5),D0
SWAP D2
ADD D2,D0
ADD AlBlkOffset(A5),D0
MOVE D0,AbsBlkNumber(A5)
RTS

@4 MOVE #24,D0
JMP ShowAlert

ConvertBlock: ; Convert a block into printable
LEA IOBuff(A5),A0 ; characters
LEA DispBuffer(A5),A1
LEA SaveBuffer(A5),A2
MOVE #511,D0
@2 MOVE.B (A0)+,D1
MOVE.B D1,(A2)+
CMP.B #$1F,D1
BLS @3
CMP.B #$7E,D1
BLS @4
@3 MOVE.B #'.',D1
@4 MOVE.B D1,(A1)+
DBRA D0,@2
RTS

ReadBlock: ; Read a Block from disk
JSR ExitModify
JSR ConvertBlkNr
JSR ClearIOPB
MOVE DriveNumber(A5),ioDrvNum(A0)
MOVE DriverRef(A5),ioRefNum(A0)
LEA IOBuff(A5),A1
MOVE.L A1,IOBuffer(A0)
MOVE.L #512,ioByteCount(A0)
MOVE #1,ioPosMode(A0)
MOVE AbsBlkNumber(A5),D0
MULU #512,D0
MOVE.L D0,ioPosOffset(A0)
MOVE.L D0,Position(A5)
_Read
MOVE D0,D7 ; Test errorcode
BNE @1 ; There was an error

JSR ConvertBlock
CLR ChangeMade(A5)

PushItem 3,DiscardCmd ; Disable discard cmd
_DisableItem

PushItem 3,WBlockCmd ; Disable write block cmd
_DisableItem

RTS

@1 MOVE #24,D0
TST UnitMode(A5)
BEQ @3
MOVE #27,D0

@3 JMP ShowAlert

Blurb:
CLR.L -(SP) ; Put dialog about Fedit on screen
MOVE #51,-(SP)
PEA DlogStore(A5) ; Space for storing dialog record
MOVE.L #-1,-(SP)
_GetNewDialog

MOVE.L (SP),A3 ; Make Dialog current port
_SetPort

MOVE.L A3,-(SP) ; Draw the dialog info
_DrawDialog

JSR WaitAcknowledge ; Allow user to read the text

MOVE.L A3,-(SP) ; Dump the dialog
_CloseDialog

TST WindFlag(A5) ; Return to normal grafport
BEQ @1 ; if there is one
MOVE.L A4,-(SP)
_SetPort

@1 RTS ; Return to main loop

DeskAcc:
PushMenu 1 ; Get name of menu item chosen
MOVE D4,-(SP)
PEA DeskName
_GetItem

CLR -(SP) ; Let system open the accessory
PEA DeskName
_OpenDeskAcc

MOVE (SP)+,D0
RTS ; Back to main loop

Menu1:
CMP #AboutCmd,D4 ; Is it "About Fedit..." command
BEQ Blurb ; Yes, tell it like it is
JMP DeskAcc ; No, must be desk accessory

GetFile:
MOVE #80,-(SP) ; Call SFGetFile
MOVE #80,-(SP)
CLR.L -(SP)
CLR.L -(SP)
MOVE #-1,-(SP)
CLR.L -(SP)
CLR.L -(SP)
PEA SFRecord
MOVE #2,-(SP)
_Pack3

MOVE.B rGood,D0 ; Was a file selected?
AND #1,D0
BNE @1 ; Yes, go on
RTS ; No, exit

@1 JSR CloseWindow
MOVE #23,D6
CLR Unitmode(A5) ; Mark as file mode

JSR ClearFIOPB ; Get info on file
LEA rName,A1
MOVE.L A1,ioFileName(A0)
MOVE rVolume,ioVRefNum(A0)
MOVE.B rVersion,ioFileType(A0)
_GetFileInfo

MOVE rVolume,D0 ; Get info on unit
JSR FindVCB
MOVE.L A2,VCBPtr(A5)
MOVE VCBDrefNum(A2),DriverRef(A5)
MOVE VCBDrvNum(A2),DriveNumber(A5)
MOVE.L VCBAlBlkSiz(A2),D0
DIVU #512,D0
MOVE D0,AlBlkSize(A5)
MOVE.L VCBMadr(A2),VolMapAdr(A5)
MOVE VCBAlBlSt(A2),AlBlkOffset(A5)

MOVE #DataForkCmd,Fork(A5)
MOVE.L ioFlLgLen(A0),D1
MOVE ioFlStBlk(A0),D0
BNE GetBlockCount

MOVE #ResForkCmd,Fork(A5)
MOVE.L ioFlRLgLen(A0),D1
MOVE ioFlRStBlk(A0),D0
BNE GetBlockCount

MOVE #29,D6 ; Empty file
MOVE D6,D0
JMP ShowAlert

GetBlockCount:
MOVE D0,FirstAlBlk(A5)
SUB.L #1,D1
MOVE.L D1,D7
DIVU #512,D1
MOVE D1,LEOFBlock(A5)
AND #$1FF,D7
MOVE D7,LEOFPosition(A5)

CLR.L D7 ; Calc blocks in fork

@1 JSR FindNextAlBlk
ADD #1,D7
CMP #1,D0
BNE @1

MULU AlBlkSize(A5),D7
SUB #1,D7
MOVE D7,MaxBlockNr(A5)

ReadFirst:
CLR BlockNumber(A5) ; Initialize block number
JSR ReadBlock ; Read the first block
CMP #0,D7 ; Was there an error
BNE @1 ; Yes, do not open window
CLR Marker(A5)
JMP OpenWindow

@1 RTS

GetVolume:
JSR GetVolumeName
CMP #-1,D7
BNE @1
RTS

@1 JSR CloseWindow
JSR ClearFIOPB

MOVE.L A2,VCBPtr(A5)
MOVE VCBDrefNum(A2),DriverRef(A5)
MOVE VCBDrvNum(A2),DriveNumber(A5)

LEA VCBVN(A2),A0
LEA rName,A1
MOVE.L #64,D0
_BlockMove

MOVE.L VCBAlBlkSiz(A2),D0
DIVU #512,D0
MOVE VCBNmBlks(A2),D1
ADD #1,D1
MULU D1,D0
ADD VCBAlBlSt(A2),D0
SUB #1,D0
MOVE D0,MaxBlockNr(A5)
MOVE #-1,LEOFBlock(A5)

MOVE #1,UnitMode(A5)
JMP ReadFirst

Menu2:
CMP #OpenFileCmd,D4 ; Is it "Open File"
BEQ GetFile
CMP #OpenVolCmd,D4 ; Is it "Open Volume"
BEQ GetVolume
CMP #CloseCmd,D4 ; Is it "Close"
BEQ CloseWindow
CMP #QuitCmd,D4 ; Was Quit selected
BEQ @1
RTS

@1 JSR CloseWindow
_ExitToShell

GetNextBlk:
MOVE BlockNumber(A5),D0 ; At end of file/unit?
CMP MaxBlockNr(A5),D0
BCC @2 ; Yes, ignore request
ADD #1,BlockNumber(A5)
JSR ReadBlock
CMP #0,D7
BNE @1
CLR Marker(A5)
JSR DisplayBlock
MOVE.L HScroll(A5),-(SP)
MOVE BlockNumber(A5),-(SP)
_SetCtlValue
RTS

@1 SUB #1,BlockNumber(A5)
@2 RTS

GetPrevBlk:
MOVE BlockNumber(A5),D0
BEQ @2
SUB #1,BlockNumber(A5)
JSR ReadBlock
CMP #0,D7
BNE @1
CLR Marker(A5)
JSR DisplayBlock
MOVE.L HScroll(A5),-(SP)
MOVE BlockNumber(A5),-(SP)
_SetCtlValue
RTS

@1 ADD #1,BlockNumber(A5)
@2 RTS

GetBlockNr:
CLR.L -(SP)
MOVE #53,-(SP)
PEA DlogStore(A5)
MOVE.L #-1,-(SP)
_GetNewDialog

MOVE.L (SP),A3
_SetPort

CLR.L -(SP)
PEA ItemHit(A5)
_ModalDialog

MOVE ItemHit(A5),D0
CMP #1,D0
BEQ @1

MOVE.L A3,-(SP)
_CloseDialog

MOVE.L A4,-(SP)
_SetPort

RTS

@1 MOVE.L A3,-(SP)
MOVE #4,-(SP)
PEA TempWord(A5)
PEA TempHdl(A5)
PEA TempRect(A5)
_GetDItem

MOVE.L TempHdl(A5),-(SP)
PEA OutString(A5)
_GetItext

MOVE.L A3,-(SP)
_CloseDialog

MOVE.L A4,-(SP)
_SetPort

LEA OutString(A5),A0
MOVE #1,-(SP) ; StringToNum
_Pack7

TST D0
BPL GetBlockN
CLR D0

GetBlockN:
CMP MaxBlockNr(A5),D0 ; Outside value range?
BCS @1 ; No, get block
MOVE MaxBlockNr(A5),D0 ; Yes, set to max number

@1 MOVE BlockNumber(A5),-(SP)
MOVE D0,BlockNumber(A5)
JSR ReadBlock
MOVE (SP)+,D0
TST D7
BNE @2

CLR Marker(A5)
JSR DisplayBlock
BRA @3

@2 MOVE D0,BlockNumber(A5)

@3 MOVE.L HScroll(A5),-(SP)
MOVE BlockNumber(A5),-(SP)
_SetCtlValue
RTS

RevertBlock:
MOVE #21,D0 ; Get user to confirm
JSR ShowAlert
CMP #1,D0
BEQ @1

JSR ExitModify
LEA SaveBuffer(A5),A0
LEA IOBuff(A5),A1
MOVE.L #512,D0
_BlockMove
JSR ConvertBlock
CLR Marker(A5)
JSR DisplayBlock
CLR ChangeMade(A5)

PushItem 3,DiscardCmd ; Disable discard cmd
_DisableItem

PushItem 3,WBlockCmd ; Disable write block cmd
_DisableItem

@1 RTS

WriteBlock:
MOVE #26,D0
JSR ShowAlert ; Make user confirm it
CMP #1,D0
BEQ @1

JSR ExitModify
JSR ClearIOPB
MOVE DriveNumber(A5),ioDrvNum(A0)
MOVE DriverRef(A5),ioRefNum(A0)
LEA IOBuff(A5),A1
MOVE.L A1,IOBuffer(A0)
MOVE.L #512,ioByteCount(A0)
MOVE #1,ioPosMode(A0)
MOVE.L Position(A5),ioPosOffset(A0)
_Write

MOVE D0,D7 ; Test errorcode
BNE @2

JSR ClearIOPB ; Flush volume
MOVE.L VCBPtr(A5),A1
MOVE VCBVRefNum(A1),ioVRefNum(A0)
_FlushVol
MOVE D0,D7
BNE @2

CLR ChangeMade(A5)

PushItem 3,DiscardCmd ; Disable discard cmd
_DisableItem

PushItem 3,WBlockCmd ; Disable write block cmd
_DisableItem

MOVE #512,D0 ; Save IO buffer
LEA IOBuff(A5),A0
LEA SaveBuffer(A5),A1
_BlockMove

@1 RTS

@2 MOVE #28,D0 ; Handle write error
JMP ShowAlert

SetupModify:
CLR.L -(SP)
MOVE #6,D0
ADD InModify(A5),D0
MOVE D0,-(SP)
_GetRMenu

CLR -(SP)
_InsertMenu

_DrawMenuBar

PushMenu 3
MOVE #AModCmd,D0
ADD InModify(A5),D0
MOVE D0,-(SP)
MOVE #-1,-(SP)
_CheckItem

ADD #1,InModify(A5)
RTS

AsciiModify:
MOVE InModify(A5),D0
BEQ @1
CMP #1,D0
BEQ ExitModify

JSR ExitModify
MOVE #0,InModify(A5)

@1 LEA ModifyBlockA,A0
MOVE.L A0,ModifyProc(A5)
JMP SetupModify

HexModify:
MOVE InModify(A5),D0
BEQ @1
CMP #2,D0
BEQ ExitModify

JSR ExitModify

@1 MOVE #1,InModify(A5)
LEA ModifyBlockH,A0
MOVE.L A0,ModifyProc(A5)
JMP SetupModify

Menu3:
CMP #RNextCmd,D4
BEQ GetNextBlk
CMP #RPrevCmd,D4
BEQ GetPrevBlk
CMP #RBlockCmd,D4
BEQ GetBlockNr
CMP #DiscardCmd,D4
BEQ RevertBlock
CMP #AModCmd,D4
BEQ AsciiModify
CMP #HModCmd,D4
BEQ HexModify
CMP #WBlockCmd,D4
BEQ WriteBlock
RTS

ChangeMode:
MOVE D4,D5
SUB #DHexCmd,D5
CMP DisplayMode(A5),D5
BEQ @5

PushMenu 4
ADD #DHexCmd,DisplayMode(A5)
MOVE DisplayMode(A5),-(SP)
CLR -(SP)
_CheckItem

MOVE D4,DisplayMode(A5)
SUB #DHexCmd,DisplayMode(A5)

PushMenu 4
MOVE D4,-(SP)
MOVE #-1,-(SP)
_CheckItem

CMP #DHexCmd,D4
BEQ @1

PushItem 3,AModCmd
_EnableItem

BRA @2

@1 PushItem 3,AModCmd
_DisableItem

@2 TST WindFlag(A5)
BEQ @5

CMP #DHexCmd,D4
BNE @3

LSL Marker(A5)
CLR D0

MOVE InModify(A5),D1
BEQ @4
CMP #2,D1
BEQ @4

JSR ExitModify
BRA @4

@3 LSR Marker(A5)
MOVE #255,D0

@4 MOVE.L VScroll(A5),-(SP) ; Set vertical
MOVE D0,-(SP) ; control Status
_HiliteControl
CLR.L NextTick(A5)
JMP DisplayBlock

@5 RTS

ChangeFork:
CMP Fork(A5),D4 ; User selected current fork
BNE @1 ; So exit
RTS

@1 LEA FIOPB(A5),A0 ; Pointer to the File info block
CMP #ResForkCmd,D4
BEQ @2

MOVE.L ioFlLgLen(A0),D1
MOVE ioFlStBlk(A0),D0 ; Is there another fork?
BEQ @3 ; No, error message
MOVE D4,Fork(A5)
JMP GetBlockCount

@2 MOVE.L ioFlRLgLen(A0),D1
MOVE ioFlRStBlk(A0),D0
BEQ @3
MOVE D4,Fork(A5)
JMP GetBlockCount

@3 MOVE #22,D0 ; Cannot open empty fork
JMP ShowAlert

Menu4:
CMP #ResForkCmd,D4
BEQ ChangeFork
CMP #DataForkCmd,D4
BEQ ChangeFork
CMP #DHexCmd,D4
BEQ ChangeMode
CMP #DAscCmd,D4
BEQ ChangeMode

Menu0:
RTS

MenuTable:
DC Menu0-MenuTable
DC Menu1-MenuTable
DC Menu2-MenuTable
DC Menu3-MenuTable
DC Menu4-MenuTable
DC Menu5-MenuTable
DC ExitModify-MenuTable
DC ExitModify-MenuTable

DoMenuItem:
CLR.L -(SP) ; What item was selected
MOVE.L Point,-(SP)
_MenuSelect
MOVE.L (SP)+,D4

DoCommand:
MOVE.L D4,D5 ; Find out which menu is involved
SWAP D5
LSL #1,D5
MOVE MenuTable(D5),D0
JMP MenuTable(D0)

InMenu:
JSR DoMenuItem
CLR -(SP) ; Remove highlighting from menu bar
_HiLiteMenu
JMP GetEvent

SystemStuff:
PEA Event ; Probably a desk accessory...
MOVE.L WWindow,-(SP) ; Let the system do its thing
_SystemClick
JMP GetEvent

TestActive: ; Is this the active windoe
CLR.L -(SP) ; Get pointer to front window
_FrontWindow
MOVE.L (SP)+,A0

CMP.L WWindow,A0 ; Is the event window at front
BEQ TestControl ; Yes, go on

MOVE.L WWindow,-(SP) ; No, select the event window
_SelectWindow
JMP GetEvent ; and return to main loop

TestControl:
PEA Point ; Convert pointer to local
_GlobalToLocal ; coordinates for current window

CLR -(SP)
MOVE.L Point,-(SP)
MOVE.L A4,-(SP)
PEA CHandle
_FindControl ; Is the mouse in a control
MOVE (SP)+,D0
BNE @0 ; Yes, handle as control

JSR ChangePos ; No, handle in text area
JMP GetEvent

@0 MOVE.L CHandle,A1
CMP.L HScroll(A5),A1 ; Is this the HScroll control
BNE VScrollCtl ; No, must be Vscroll

CMP #129,D0 ; Is the mouse in thumb
BNE @2 ; No, branch

CLR -(SP) ; Find starting thumb position
MOVE.L CHandle,-(SP)
_GetCtlValue
MOVE (SP)+,D3

CLR -(SP) ; Redraw the control
MOVE.L CHandle,-(SP)
MOVE.L Point,-(SP)
CLR.L -(SP)
_TrackControl
MOVE (SP)+,D0

CLR -(SP) ; Find new thumb position
MOVE.L CHandle,-(SP)
_GetCtlValue
MOVE (SP)+,D0

CMP D0,D3 ; Did position change?
BEQ GetEvent ; No, exit

@1 JSR GetBlockN ; Read new block from disk
JMP GetEvent

@2 CLR -(SP) ; Repeatedly call procedure that
MOVE.L CHandle,-(SP) ; will read blocks from disk
MOVE.L Point,-(SP) ; until user releases mouse button
PEA GetABlock
_TrackControl
MOVE (SP)+,D0
JMP GetEvent

GetABlock:
MOVE.L D3,-(SP) ; Preserve D3
MOVE 8(SP),D0 ; Get Partcode
CMP #20,D0 ; In up arrow
BEQ @1
CMP #21,D0 ; In down arrow
BEQ @2
CMP #22,D0 ; In page up
BEQ @1
CMP #23,D0 ; In page down
BEQ @2
JMP @3 ; In limbo?

@1 JSR GetPrevBlk ; Read lower numbered block
JMP @3

@2 JSR GetNextBlk ; Read higher numbered block

@3 MOVE.L (SP)+,D3 ; Restore D3
MOVE.L (SP)+,A1 ; Get return address
ADD #6,SP ; Adjust stack pointer
JMP (A1) ; Just like an RTS...

VScrollCtl:
CMP #129,D0 ; Is mouse in thumb
BNE @2

CLR -(SP) ; Find starting thumb position
MOVE.L CHandle,-(SP)
_GetCtlValue
MOVE (SP)+,D3

CLR -(SP) ; Track the control
MOVE.L CHandle,-(SP)
MOVE.L Point,-(SP)
CLR.L -(SP)
_TrackControl
MOVE (SP)+,D0

CLR -(SP) ; Find new thumb position
MOVE.L CHandle,-(SP)
_GetCtlValue
MOVE (SP)+,D0

CMP D0,D3 ; Did position change?
BEQ GetEvent ; No, exit

MULU #HexP2Start,D0 ; No, force it to page 2
MOVE D0,HexStartLine(A5)
JSR DisplayBlock
JMP GetEvent

@2 CLR -(SP) ; Repeatedly call procedure that
MOVE.L CHandle,-(SP) ; will move control until
MOVE.L Point,-(SP) ; user releases mouse button
PEA MoveHexCtl
_TrackControl
MOVE (SP)+,D0
JMP GetEvent

MoveHexCtl:
MOVE.L D3,-(SP) ; Preserve D3
MOVE 8(SP),D0 ; Get Partcode
CMP #20,D0 ; In up arrow
BEQ @1
CMP #21,D0 ; In down arrow
BEQ @2
CMP #22,D0 ; In page up
BEQ @1
CMP #23,D0 ; In page down
BEQ @2
JMP @4 ; In limbo?

@1 TST HexStartLine(A5) ; Move up block
BEQ @4
CLR D7
JMP @3

@2 TST HexStartLine(A5) ; Move down block
BNE @4
MOVE #1,D7

@3 MOVE.L CHandle,-(SP)
MOVE D7,-(SP)
_SetCtlValue

MULU #HexP2Start,D7
MOVE D7,HexStartLine(A5)
JSR DisplayBlock

@4 MOVE.L (SP)+,D3 ; Restore D3
MOVE.L (SP)+,A1 ; Get return address
ADD #6,SP ; Adjust stack pointer
JMP (A1) ; Just like an RTS...

Dragger:
MOVE.L A4,-(SP) ; Drag the window around
MOVE.L Point,-(SP)
PEA DragRect ; Limits of drag area
_DragWindow
JMP GetEvent

Grower:
CLR.L -(SP) ; Follow the mouse until user
MOVE.L A4,-(SP) ; releases the button
MOVE.L Point,-(SP)
PEA SizeRect
_GrowWindow
MOVE.L (SP)+,D3 ; Did the window size change?
BEQ GetEvent ; No, exit

JSR MakeCtlsInvalid

MOVE.L A4,-(SP)
MOVE.L D3,-(SP)
MOVE #-1,-(SP)
_SizeWindow ; Enlarge or shrink window

LEA PortRect(A4),A0 ; Copy port rectangle
LEA DataRect(A5),A1
MOVE.L (A0)+,(A1)+
MOVE.L (A0)+,(A1)+

LEA DataRect(A5),A1 ; Set up new Datarect
SUB #15,Right(A1)
SUB #15,Bottom(A1)

PEA PortRect(A4)
_ClipRect ; Change clip area

CLR.L NextTick(A5)
JSR MoveScrollBars ; Move the scroll bars

TST DisplayMode(A5)
BEQ @1

PEA MarkRect(A5)
_InvalRect

@1 JMP GetEvent

GoAwayArea:
CLR -(SP) ; Follow the mouse until user
MOVE.L WWindow,-(SP) ; releases the button
MOVE.L Point,-(SP)
_TrackGoAway

MOVE (SP)+,D0 ; Still in goaway box?
BEQ GetEvent ; No, exit

JSR CloseWindow ; Yes, close everything

NoAction:
JMP GetEvent

MouseTable:
DC NoAction-MouseTable
DC InMenu-MouseTable
DC SystemStuff-MouseTable
DC TestActive-MouseTable
DC Dragger-MouseTable
DC Grower-MouseTable
DC GoAwayArea-MouseTable

MouseDown:
CLR -(SP) ; Find out where the mouse points
MOVE.L Point,-(SP)
PEA WWindow
_FindWindow
MOVE (SP)+,D0
LSL #1,D0
MOVE MouseTable(D0),D0
JMP MouseTable(D0)

KeyDown:
MOVE Modify,D0 ; Is it a command key
AND #$0100,D0
BEQ HandleKey ; No, handle as standard key
CLR.L -(SP)
MOVE.L Message,D0
MOVE D0,-(SP) ; Yes, find out for what item
_MenuKey
MOVE.L (SP)+,D4 ; Find out which menu is involved
JSR DoCommand
CLR -(SP) ; Remove highlighting from menu bar
_HiLiteMenu
JMP GetEvent

Autokey:
MOVE Modify,D0 ; Is it a command key
AND #$0100,D0
BNE GetEvent ; Yes, ignore for autokey

HandleKey:
TST InModify(A5) ; Are we modifying a block
BEQ @1 ; No, exit
MOVE.L ModifyProc(A5),A0 ; Yes, call appropriate routine
JSR (A0)

@1 JMP GetEvent ; Ignore normal keypresses

UpdateEvt:
CMP.L Message,A4 ; Is this my window?
BNE @1 ; No, exit

MOVE.L A4,-(SP) ; Set update area
_BeginUpdate

MOVE.L A4,-(SP) ; Draw Grow icon
_DrawGrowIcon

MOVE.L A4,-(SP) ; Draw scoll bars
_DrawControls

JSR DisplayBlock ; Draw text window

MOVE.L A4,-(SP) ; Reset proper draw area
_EndUpdate

@1 JMP GetEvent

DiskInsert:
JSR DiskInserted ; Toolbox does most of it
JMP GetEvent

Activate:
CMP.L Message,A4 ; Is this my window?
BNE GetEvent ; No, exit now

MOVE.L A4,-(SP) ; Make it the current port
_SetPort

MOVE Modify,D0 ; Is it an activate
AND #1,D0 ; or deactivate event
BEQ @1

MOVE.L HScroll(A5),-(SP) ; Window is being activated
_ShowControl

MOVE.L VScroll(A5),-(SP) ; So show the scroll bars
_ShowControl

MOVE.L A4,-(SP)
_DrawGrowIcon

JMP GetEvent

@1
MOVE.L HScroll(A5),-(SP) ; Window is being deactivated
_HideControl

MOVE.L VScroll(A5),-(SP) ; So hide the scroll bars
_HideControl

MOVE.L A4,-(SP)
_DrawGrowIcon

JMP GetEvent

Ticker:
TST.L NextTick(A5) ; Is Blinking box on screen?
BEQ @1 ; No, exit

CLR.L -(SP) ; Get current time
_TickCount

MOVE.L (SP)+,D0 ; Is it time to blink box
CMP.L NextTick(A5),D0
BMI @1 ; No, exit

ADD.L #20,D0
MOVE.L D0,NextTick(A5) ; Set new blink time

PEA MarkRect(A5) ; and invert box
_InverRect

@1 RTS

EventTable:
DC GetEvent-EventTable
DC MouseDown-EventTable
DC GetEvent-EventTable
DC KeyDown-EventTable
DC GetEvent-EventTable
DC AutoKey-EventTable
DC UpdateEvt-EventTable
DC DiskInsert-EventTable
DC Activate-EventTable
DC GetEvent-EventTable
DC GetEvent-EventTable

GetEvent:
_SystemTask ; Perform any desk access updates
JSR Ticker
CLR -(SP)
MOVE #-1,-(SP)
PEA Event
_GetNextEvent ; Get next event

MOVE (SP)+,D0
CMP #0,D0 ; Null Event Ignored
BEQ GetEvent
MOVE What,D0
LSL #1,D0 ; Convert to word offset
MOVE EventTable(D0),D0 ; Get offset
JMP EventTable(D0) ; and jump to code

DrawMenu:
LEA MenuHandle,A3 ; Point to menuhandle[1]
CLR.L (A3)+

CLR.L -(SP) ; Set up first menu with
MOVE #1,-(SP) ; desk accessories list
_GetRMenu

MOVE.L (SP),(A3) ; Save Menu handle
CLR -(SP)
_InsertMenu

MOVE.L (A3)+,-(SP) ; Get desk accessories list
MOVE.L #'DRVR',-(SP)
_AddResMenu

MOVE #2,D4
@1 CLR.L -(SP) ; Get menu from resource file
MOVE D4,-(SP)
_GetRMenu

MOVE.L (SP),(A3)+ ; Save menu handle
CLR -(SP)
_InsertMenu

ADD #1,D4 ; Increment Menu Number
CMP #Menucount,D4
BLS @1

_DrawMenuBar ; Display menu bar on screen
RTS

Start:
PEA -4(A5) ; Magic to initialize graphics
_InitGraf
_InitFonts ; Init other handlers
_InitWindows
_InitMenus
CLR.L -(SP)
_InitDialogs
_TEInit

IF SeparateResFile

CLR -(SP) ; Get resources file
PEA 'FeditRes'
_OpenResFile
MOVE (SP)+,D0

ENDIF

JSR DrawMenu ; Draw Menu Bar on Screen

_InitCursor ; Init Cursor to arrow

PushItem 3,0 ; Disable menu 3
_DisableItem

MOVE #21,D7

@1 MOVE D7,-(SP) ; Preload alerts
_CouldAlert
ADD #1,D7
CMP #30,D7
BNE @1

MOVE #51,D7

@2 MOVE D7,-(SP) ; Preload dialogs
_CouldDialog
ADD #1,D7
CMP #54,D7
BNE @2

MOVE #257,D7

@3 CLR.L -(SP) ; Preload strings
MOVE D7,-(SP)
_GetString
MOVE.L (SP)+,D0
ADD #1,D7
CMP #262,D7
BNE @3

MOVE #6,D7

@4 CLR.L -(SP) ; Preload menus
MOVE.L #'MENU',-(SP)
MOVE D7,-(SP)
_GetResource
MOVE.L (SP)+,D0
ADD #1,D7
CMP #8,D7
BNE @4

CLR.L -(SP) ; Load monaco font, 9 point
MOVE.L #'FONT',-(SP)
MOVE #521,-(SP)
_GetResource
MOVE (SP)+,D0

MOVE #2,-(SP) ; Call DILoad in pack 2
_Pack2

CLR -(SP)
MOVE #4,-(SP)
_Pack6
MOVE (SP)+,D0 ; Force load of pack6

LEA OutString(A5),A0
CLR D0
CLR -(SP)
_Pack7 ; Force load of pack7

MOVE #1,DisplayMode(A5) ; Set mode to ASCII
CLR UnitMode(A5) ; Set unitmode to true
CLR WindFlag(A5) ; No window open
CLR ChangeMade(A5) ; Buffer not changed
CLR InModify(A5) ; Clear modify flag
CLR HexStartline(A5) ; Start hex at page top
CLR.L NextTick(A5) ; Ticker not active

MOVE.L #$FFFF,D0 ; Dump any left over events
_FlushEvents

JSR GetFile ; Open a file, and force load
JMP GetEvent ; Enter main loop

END

26-Oct-84 19:13:10-PDT,12154;000000000001
Return-Path:
Received: from CMU-CS-SPICE.ARPA by SUMEX-AIM.ARPA with TCP; Fri 26 Oct 84 19:11:59-PDT
Date: Friday, 26 October 1984 21:58:05 EDT
From: [email protected]
To: [email protected]
Subject: FEdit2.Asm (TO BE ARCHIVED)
Message-ID:

; Fedit2.Asm
;______________________________________________________________________
;
; This program is designed to provide disk information and to
; edit disk files on the Macintosh.
;
; Copyright (C) John H. Mitchell, September 1984.
;
; All rights reserved.
;
; Permission is granted for non commercial usage. This source
; and its associated code file may be copied and distributed
; freely, provided that you do not attempt to sell it, use it
; as the basis for a commercial program, or otherwise obtain any
; financial gain from it. You may modify it in any way that you
; feel appropriate within these limits.
;
;______________________________________________________________________

Include FSEqu.d
Include Mactraps.d

XDEF DiskInserted,EjectDisk,GetVolumeName,FindVCB,Menu5

XREF TempWord,TempHdl,TempRect,Event,What,Message
XREF Count,DlogHdl,ItemHit,DlogStore,WindFlag
XREF Outstring,ClearIOPB,FIOPB,WaitAcknowledge
XREF VCBPtr,WordToHex,CharToHex

FileInfoCmd EQU 1 ; Menu 5
UnitInfoCmd EQU 2

PortRect EQU $10 ; offset to port's rectangle [rect]

MACRO WordOut Index =
MOVE {Index}(A2),D0
JSR WordToHex
PEA OutString(A5)
_DrawString|

MACRO ByteItem Title,Index =
LEA '{Title}:',A3
JSR SetupLine
MOVE.B {Index}(A2),D0
JSR CharToHex
PEA OutString(A5)
_DrawString|

MACRO WordItem Title,Index =
LEA '{Title}:',A3
JSR SetupLine
WordOut {Index}|

MACRO LongItem Title,Index =
LEA '{Title}:',A3
JSR SetupLine
WordOut {Index}
WordOut {Index}+2|

MACRO StrItem Title,Index =
LEA '{Title}:',A3
JSR SetupLine
PEA {Index}(A2)
_DrawString|

MACRO FdrItem Title,Index =
LongItem {Title},{Index}
MOVE.L {Index}(A2),D0
JSR LongPrint|

MACRO DateItem Title,Index =
LongItem {Title},{Index}
MOVE.L {Index}(A2),D0
JSR DatePrint|

MACRO WordDec Index =
MOVE {Index}(A2),D0
JSR WordDecimal|

MACRO LongDec Index =
MOVE.L {Index}(A2),D0
JSR LongDecimal|

FindVCB:
MOVE.L VCBQHdr+2,A2 ; Search volume control block
BRA @2 ; queue for VCB for selected file

@1 MOVE.L (A2),A2

@2 CMP.L #0,A2
BEQ @3
CMP VCBVRefNum(A2),D0
BNE @1

@3 RTS

EjectDisk:
MOVEM.L A0-A2/D0-D2,-(SP) ; Eject disk who's indicated by
JSR ClearIOPB ; VCB pointer in A2
MOVE VCBVRefNum(A2),ioVRefNum(A0)
_Eject
MOVEM.L (SP)+,A0-A2/D0-D2
RTS

NoDrives:
CLR TempWord(A5) ; Volume name routine when all
MOVE.L TempHdl(A5),-(SP) ; disks have been ejected
PEA TempWord(A5)
_SetIText

NoDrvEvent:
_SystemTask
CLR -(SP)
MOVE #-1,-(SP)
PEA Event
_GetNextEvent
MOVE (SP)+,D0

BEQ NoDrvEvent
MOVE What,D0
CMP #1,D0
BEQ NoDrvMouse
CMP #7,D0
BEQ NoDrvDiskEvt
JMP NoDrvEvent

NoDrvDiskEvt:
JSR DiskInserted
MOVE #1,Count(A5)
JMP DriveTest1

NoDrvMouse:
CLR -(SP)
PEA Event
_IsDialogEvent
MOVE (SP)+,D0
BTST #8,D0
BEQ NoDrvEvent

CLR -(SP)
PEA Event
PEA DlogHdl(A5)
PEA ItemHit(A5)
_DialogSelect
MOVE (SP)+,D0
BTST #8,D0
BEQ NoDrvEvent

MOVE ItemHit(A5),D0
CMP #2,D0 ; Cancel Button
BEQ CancelVDlog
JMP NoDrvEvent

GetVolumeName:
CLR.L -(SP)
MOVE #52,-(SP)
PEA DlogStore(A5)
MOVE.L #-1,-(SP)
_GetNewDialog

MOVE.L (SP),A3
_SetPort

MOVE.L A3,-(SP)
MOVE #5,-(SP)
PEA TempWord(A5)
PEA TempHdl(A5)
PEA TempRect(A5)
_GetDItem
MOVE #1,Count(A5)

DriveTest1:
TST Count(A5)
BEQ NoDrives
CLR Count(A5)
MOVE.L VCBQHdr+2,A2
BRA DriveTest3

DriveTest2:
MOVE.L (A2),A2
CMP.L #0,A2
BEQ DriveTest1

DriveTest3:
TST VCBDrefNum(A2)
BPL DriveTest2
ADD #1,Count(A5)

MOVE.L TempHdl(A5),-(SP)
PEA VCBVN(A2)
_SetIText

GetVolEvent:
_SystemTask
CLR -(SP)
MOVE #-1,-(SP)
PEA Event
_GetNextEvent
MOVE (SP)+,D0

BEQ GetVolEvent
MOVE What,D0
CMP #1,D0
BEQ GetVolMouse
CMP #7,D0
BEQ GetVolDiskEvt
JMP GetVolEvent

GetVolDiskEvt:
JSR DiskInserted
JMP GetVolEvent

DiskInserted:
MOVE.L Message,D0 ; Was there an error while
SWAP D0 ; mounting the disk?
CMP #0,D0
BNE @1 ; Yes, call toolbox to fix
RTS

@1 CLR -(SP) ; Wonderful things are in
MOVE #100,-(SP) ; this toolbox
MOVE #100,-(SP)
MOVE.L Message,-(SP)
CLR -(SP) ; Call DIBadMount
_Pack2 ; to initialize the disk
MOVE (SP)+,D0
RTS

GetVolMouse:
CLR -(SP)
PEA Event
_IsDialogEvent
MOVE (SP)+,D0
BTST #8,D0
BEQ GetVolEvent

CLR -(SP)
PEA Event
PEA DlogHdl(A5)
PEA ItemHit(A5)
_DialogSelect
MOVE (SP)+,D0
BTST #8,D0
BEQ GetVolEvent

MOVE ItemHit(A5),D0
CMP #1,D0 ; Open Button
BEQ OpenVol
CMP #2,D0 ; Cancel Button
BEQ CancelVDlog
CMP #4,D0 ; Drive Button
BEQ DriveTest2
JSR EjectDisk ; Eject Button
JMP DriveTest2

CancelVDlog:
MOVE #-1,D7
JMP CloseVolDlog

OpenVol:
CLR D7

CloseVolDlog:
MOVE.L A3,-(SP)
_CloseDialog

TST WindFlag(A5) ; Return to normal grafport
BEQ @1 ; if there is one
MOVE.L A4,-(SP)
_SetPort

@1 RTS

SetupLine:
MOVE #32,-(SP)
MOVE D4,-(SP)
_MoveTo

MOVE.L A3,-(SP)
_DrawString

MOVE #165,-(SP)
MOVE D4,-(SP)
_MoveTo

ADD D7,D4
RTS

WordDecimal:
MOVE D0,D5
BEQ @1

MOVE #48,-(SP)
CLR -(SP)
_Move

MOVE #'(',-(SP)
_DrawChar

LEA OutString(A5),A0
MOVE D5,D0
EXT.L D0
CLR -(SP)
_Pack7

MOVE.L A0,-(SP)
_DrawString

MOVE #')',-(SP)
_DrawChar

@1 RTS

LongDecimal:
MOVE.L D0,D5
BEQ @1

MOVE #18,-(SP)
CLR -(SP)
_Move

MOVE #'(',-(SP)
_DrawChar

LEA OutString(A5),A0
MOVE.L D5,D0
CLR -(SP)
_Pack7

MOVE.L A0,-(SP)
_DrawString

MOVE #')',-(SP)
_DrawChar

@1 RTS

LongPrint:
MOVE.L D0,OutString(A5)
BEQ @1

MOVE #18,-(SP)
CLR -(SP)
_Move

MOVE #'(',-(SP)
_DrawChar

PEA OutString(A5)
CLR -(SP)
MOVE #4,-(SP)
_DrawText

MOVE #')',-(SP)
_DrawChar

@1 RTS

DatePrint:
MOVE.L D0,D5
BEQ @1

MOVE #18,-(SP)
CLR -(SP)
_Move

MOVE #'(',-(SP)
_DrawChar

MOVE.L D5,-(SP)
CLR -(SP)
PEA OutString(A5)
CLR -(SP)
_Pack6

PEA OutString(A5)
_DrawString

MOVE #' ',-(SP)
_DrawChar

MOVE.L D5,-(SP)
CLR -(SP)
PEA OutString(A5)
MOVE #2,-(SP)
_Pack6

PEA OutString(A5)
_DrawString

MOVE #')',-(SP)
_DrawChar

@1 RTS

AnalyzeFile:
LEA FIOPB(A5),A2
PEA PortRect(A4)
_ClipRect

PEA PortRect(A4)
_EraseRect

MOVE #32,D4
MOVE #13,D7

ByteItem Attributes,ioFlAttrib
ByteItem Filetype,ioFFlType

FdrItem Finder File Type,ioFlUsrWds
FdrItem Finder Creator,ioFlUsrWds+4
WordItem Finder Flags,ioFlUsrWds+8
LongItem Finder Location,ioFlUsrWds+10
WordItem Finder Folder,ioFlUsrWds+14

LongItem File Number,ioFFlNum

WordItem Data Start Block,ioFlStBlk
WordDec ioFlStBlk
LongItem Data Logical Length,ioFlLgLen
LongDec ioFlLgLen
LongItem Data Physical Length,ioFlPyLen
LongDec ioFlPyLen

WordItem Res Start Block,ioFlRStBlk
WordDec ioFlRStBlk
LongItem Res Logical Length,ioFlRLgLen
LongDec ioFlRLgLen
LongItem Res Physical Length,ioFlRPyLen
LongDec ioFlRPyLen

DateItem Creation Date,ioFlCrDat
DateItem Last Modification,ioFlMdDat

JSR WaitAcknowledge

PEA PortRect(A4)
_InvalRect

RTS

AnalyzeVol:
MOVE.L VCBPtr(A5),A2
PEA PortRect(A4)
_ClipRect

PEA PortRect(A4)
_EraseRect

MOVE #32,D4
MOVE #15,D7

StrItem Volume Name,VCBVN

DateItem Creation Date,VCBCrDate
DateItem Last Backup Date,VCBLsBkUp

WordItem Attributes,VCBAtrb

WordItem Number of Files,VCBNmFls
WordDec VCBNmFls

WordItem Directory Start,VCBDirSt
WordDec VCBDirSt
WordItem Directory Length,VCBBlLn
WordDec VCBBlLn

WordItem Allocation Blocks,VCBNmBlks
WordDec VCBNmBlks
LongItem Allocation Blksize,VCBAlBlkSiz
LongDec VCBAlBlkSiz
LongItem Allocation Clipsize,VCBClpSiz
LongDec VCBClpSiz
WordItem First Allocation Blk,VCBAlBlSt
WordDec VCBAlBlSt
LongItem Next File Number,VCBNxtFNum
WordItem Unused Blocks,VCBFreeBks
WordDec VCBFreeBks

JSR WaitAcknowledge

PEA PortRect(A4)
_InvalRect

RTS

Menu5:
CMP #1,D4
BEQ AnalyzeFile
CMP #2,D4
BEQ AnalyzeVol
RTS

END

26-Oct-84 19:14:57-PDT,11168;000000000001
Return-Path:
Received: from CMU-CS-SPICE.ARPA by SUMEX-AIM.ARPA with TCP; Fri 26 Oct 84 19:13:55-PDT
Date: Friday, 26 October 1984 22:00:24 EDT
From: [email protected]
To: [email protected]
Subject: FEditR.Asm (TO BE ARCHIVED)
Message-ID:

;______________________________________________________________________
;
; This program is designed to provide disk information and to
; edit disk files on the Macintosh.
;
; Copyright (C) John H. Mitchell, September 1984.
;
; All rights reserved.
;
; Permission is granted for non commercial usage. This source
; and its associated code file may be copied and distributed
; freely, provided that you do not attempt to sell it, use it
; as the basis for a commercial program, or otherwise obtain any
; financial gain from it. You may modify it in any way that you
; feel appropriate within these limits.
;
;______________________________________________________________________

String_Format 2

Visible EQU 1
Invisible EQU 0

GoAway EQU 1
NoGoAway EQU 0

Enabled EQU 0
Disabled EQU 128

MACRO MakeMENU Name,ID,Flags =
RESOURCE 'MENU'{ID} 'z'
DC.B {ID}>>8,{ID}
DC.B 0,0
DC.B 0,0
DC.B 0,0
DC.B 0,0
LongHex {Flags}
DC.B {Name}
|

MACRO MenuItem Text,Mark,Key =
DC.B {Text}
DC.B 0
DC.B {Key}
DC.B {Mark}
DC.B 0
|

MACRO MakeSTR ID,Text =
RESOURCE 'STR ' {ID} 'z'
DC.B {Text}
|

MACRO MakeDLOG ID,RectTop,RectLeft,RectBottom,RectRight,VisibleFlag,GoawayFlag,Procedure,DITL =
RESOURCE 'DLOG' {ID} 'z'
DC.B {RectTop}>>8,{RectTop},{RectLeft}>>8,{RectLeft}
DC.B {RectBottom}>>8,{RectBottom},{RectRight}>>8,{RectRight}
DC.B {Procedure}>>8,{Procedure}
DC.B {VisibleFlag}
DC.B 0
DC.B {GoawayFlag}
DC.B 0
DC.B 0,0,0,0
DC.B {DITL}>>8,{DITL}
DC.B 0,0
|

MACRO MakeALRT ID,RectTop,RectLeft,RectBottom,RectRight,DITL,Stages =
RESOURCE 'ALRT' {ID} 'z'
DC.B {RectTop}>>8,{RectTop},{RectLeft}>>8,{RectLeft}
DC.B {RectBottom}>>8,{RectBottom},{RectRight}>>8,{RectRight}
DC.B {DITL}>>8,{DITL}
DC.B {Stages}>>8,{Stages}
|

MACRO MakeDITL ID,Count =
RESOURCE 'DITL' {ID} 'z'
DC.B 0,{Count}-1
|

MACRO DITLButn EnableFlag,RectTop,RectLeft,RectBottom,RectRight,Text =
DC.B 0,0,0,0
DC.B {RectTop}>>8,{RectTop},{RectLeft}>>8,{RectLeft}
DC.B {RectBottom}>>8,{RectBottom},{RectRight}>>8,{RectRight}
DC.B 4+{EnableFlag}
DC.B {Text}
|

MACRO DITLEdit EnableFlag,RectTop,RectLeft,RectBottom,RectRight =
DC.B 0,0,0,0
DC.B {RectTop}>>8,{RectTop},{RectLeft}>>8,{RectLeft}
DC.B {RectBottom}>>8,{RectBottom},{RectRight}>>8,{RectRight}
DC.B 16+{EnableFlag}
DC.B 0
|

MACRO DITLStat EnableFlag,RectTop,RectLeft,RectBottom,RectRight,Text =
DC.B 0,0,0,0
DC.B {RectTop}>>8,{RectTop},{RectLeft}>>8,{RectLeft}
DC.B {RectBottom}>>8,{RectBottom},{RectRight}>>8,{RectRight}
DC.B 8+{EnableFlag}
DC.B {Text}
|

MACRO DITLIcon EnableFlag,RectTop,RectLeft,RectBottom,RectRight,ID =
DC.B 0,0,0,0
DC.B {RectTop}>>8,{RectTop},{RectLeft}>>8,{RectLeft}
DC.B {RectBottom}>>8,{RectBottom},{RectRight}>>8,{RectRight}
DC.B 32
DC.B 2 ; Always enabled
DC.B {ID}>>8,{ID}
|

MACRO MakeICON ID =
RESOURCE 'ICON' {ID} 'z'|

MACRO LongHex V =
DC.B {V}>>24,{V}>>16,{V}>>8,{V}|

RESOURCE 'MENU' 1 'z'
DC.B 0,1
DC.B 0,0
DC.B 0,0
DC.B 0,0
DC.B 0,0
LongHex $FFFFFFFB
DC.B $01,$14
MenuItem 'About Fedit...',0,0
MenuItem '-',0,0
DC.B 0

MakeMENU 'File',2,$FFFFFFF7
MenuItem 'Open Volume...',0,0
MenuItem 'Open File...',0,0
MenuItem 'Close',0,0
MenuItem 'Quit',0,$51
DC.B 0

MakeMENU 'Edit',3,$FFFFFDAF
MenuItem 'Read Next Block',0,$4E
MenuItem 'Read Previous Block',0,$50
MenuItem 'Read Block...',0,$42
MenuItem '-',0,0
MenuItem 'Write Block',0,$57
MenuItem '-',0,0
MenuItem 'ASCII Modify',0,$41
MenuItem 'Hex Modify',0,$48
MenuItem '-',0,0
MenuItem 'Undo Changes',0,$5A
DC.B 0

MakeMENU 'Options',4,$FFFFFFF1
MenuItem 'Resource Fork',0,0
MenuItem 'Data Fork',0,0
MenuItem '-',0,0
MenuItem 'Display in Hex',0,0
MenuItem 'Display in ASCII',$12,0
DC.B 0

MakeMENU 'Display',5,$FFFFFFF9
MenuItem 'File Information',0,0
MenuItem 'Disk Information',0,0
DC.B 0

MakeMENU '*** ASCII modify command active ***',6,$FFFFFFFD
MenuItem '-',0,0
MenuItem 'End Modifications',0,$43
DC.B 0

MakeMENU '*** Hex modify command active ***',7,$FFFFFFFD
MenuItem '-',0,0
MenuItem 'End Modifications',0,$43
DC.B 0

MakeSTR 257,'Hex:'
MakeSTR 258,'Position:'
MakeSTR 259,'Block:'
MakeSTR 260,'Logical EOF is after position'
MakeSTR 261,'in this block'

MakeDLOG 51,60,120,220,400,Visible,NoGoAway,1,51
MakeDLOG 52,100,152,236,360,Visible,NoGoAway,1,52
MakeDLOG 53,100,55,185,455,Visible,NoGoAway,1,53

MakeALRT 21,100,96,228,416,21,$4444
MakeALRT 22,100,96,228,416,22,$4444
MakeALRT 23,100,96,228,416,23,$4444
MakeALRT 24,100,96,228,416,24,$4444
MakeALRT 25,100,96,228,416,25,$4444
MakeALRT 26,100,96,228,416,26,$4444
MakeALRT 27,100,96,228,416,27,$4444
MakeALRT 28,100,96,228,416,28,$4444
MakeALRT 29,100,96,228,416,29,$4444

MakeDITL 21,4
DITLButn Enabled,90,50,116,150,'No'
DITLButn Enabled,90,180,116,280,'Yes '
DITLIcon Enabled,30,20,62,52,1
DITLStat Enabled,23,70,84,310,'Do you really want to discard the changes that you have made to this block? '

MakeDITL 22,3
DITLButn Enabled,90,180,116,280,'OK'
DITLIcon Enabled,22,20,54,52,0
DITLStat Enabled,25,70,84,310,'Unable to open that fork because it has no disk blocks allocated. '

MakeDITL 23,3
DITLButn Enabled,90,180,116,280,'OK'
DITLIcon Enabled,22,20,54,52,0
DITLStat Enabled,25,70,84,310,'An error occurred while attempting to open the file on disk.'

MakeDITL 24,3
DITLButn Enabled,90,180,116,280,'OK'
DITLIcon Enabled,22,20,54,52,0
DITLStat Enabled,25,70,84,310,'An error occurred while attempting to read a block from the disk file.'

MakeDITL 25,3
DITLButn Enabled,90,180,116,280,'OK'
DITLIcon Enabled,22,20,54,52,0
DITLStat Enabled,25,70,84,310,'An error occurred while attempting to rewrite this block in the disk file.'

MakeDITL 26,4
DITLButn Enabled,90,50,116,150,'Cancel'
DITLButn Enabled,90,180,116,280,'OK'
DITLIcon Enabled,22,20,54,52,1
DITLStat Enabled,25,70,84,310,'Are you sure you want to write this block to disk?'

MakeDITL 27,3
DITLButn Enabled,90,180,116,280,'OK'
DITLIcon Enabled,22,20,54,52,0
DITLStat Enabled,25,70,84,310,'An error occurred while attempting to read a block from the disk volume.'

MakeDITL 28,3
DITLButn Enabled,90,180,116,280,'OK'
DITLIcon Enabled,22,20,54,52,0
DITLStat Enabled,25,70,84,310,'An error occurred while attempting to write this block to disk. '

MakeDITL 29,3
DITLButn Enabled,90,180,116,280,'OK'
DITLIcon Enabled,22,20,54,52,0
DITLStat Enabled,25,70,84,310,'This file cannot be displayed because it contains no data or resource blocks. '

MakeDITL 51,4
DITLStat Enabled,30,70,50,270,'File and Volume Edit Program'
DITLStat Enabled,100,25,116,260,'This program was written for the'
DITLStat Enabled,120,35,136,260,'Macintosh by John H. Mitchell '
DITLIcon Enabled,24,20,56,52,511

MakeDITL 52,5
DITLButn Enabled,59,12,77,92,'Open'
DITLButn Enabled,100,12,118,92,'Cancel'
DITLButn Enabled,59,116,77,196,'Eject '
DITLButn Enabled,100,116,118,196,'Drive '
DITLStat Disabled,20,70,38,196,' '

MakeDITL 53,4
DITLButn Enabled,50,250,72,325,'OK'
DITLButn Enabled,50,80,72,155,'Cancel'
DITLStat Disabled,20,20,36,300,'Enter number of block to read from disk '
DITLEdit Disabled,20,320,36,380

MakeICON 511
LongHex $0007FF80
LongHex $00080000
LongHex $00087E20
LongHex $00080120
LongHex $00080120
LongHex $04080120
LongHex $0C080120
LongHex $08080120
LongHex $66080120
LongHex $99080120
LongHex $8108FE20
LongHex $80080020
LongHex $80080020
LongHex $4A001F20
LongHex $34000020
LongHex $00FC0020
LongHex $03000000
LongHex $0401FFF0
LongHex $04000008
LongHex $03E01FE4
LongHex $00100552
LongHex $001000A9
LongHex $00200001
LongHex $002001FE
LongHex $00180000
LongHex $00040000
LongHex $0000C000
LongHex $00012000
LongHex $00025000
LongHex $00008800
LongHex $00000800
LongHex $00001000

END

26-Oct-84 19:15:10-PDT,394;000000000001
Return-Path:
Received: from CMU-CS-SPICE.ARPA by SUMEX-AIM.ARPA with TCP; Fri 26 Oct 84 19:15:05-PDT
Date: Friday, 26 October 1984 22:01:52 EDT
From: [email protected]
To: [email protected]
Subject: FEdit.Link
Message-ID:

!START
]
/OUTPUT Fedit
FEDIT1
FEDIT2

/RESOURCES
FEDITR
$
-------
Locked