info-mac@uw-beaver (info-mac) (10/27/84)
From: Ed Pattermann <PATTERMANN@SUMEX-AIM.ARPA> Here are FEDIT1.ASM, FEDIT2.ASM, FEDITR.ASM, and FEDIT.LINK 26-Oct-84 19:11:49-PDT,69937;000000000001 Return-Path: <tdn@cmu-cs-spice.arpa> 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: Thomas.Newton@cmu-cs-spice.arpa To: info-mac@sumex-aim.arpa Subject: FEdit1.Asm (TO BE ARCHIVED) Message-ID: <1984.10.27.1.53.14.Thomas.Newton@cmu-cs-spice.arpa> ; 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: <tdn@cmu-cs-spice.arpa> 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: Thomas.Newton@cmu-cs-spice.arpa To: info-mac@sumex-aim.arpa Subject: FEdit2.Asm (TO BE ARCHIVED) Message-ID: <1984.10.27.1.56.54.Thomas.Newton@cmu-cs-spice.arpa> ; 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: <tdn@cmu-cs-spice.arpa> 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: Thomas.Newton@cmu-cs-spice.arpa To: info-mac@sumex-aim.arpa Subject: FEditR.Asm (TO BE ARCHIVED) Message-ID: <1984.10.27.1.58.20.Thomas.Newton@cmu-cs-spice.arpa> ;______________________________________________________________________ ; ; 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: <tdn@cmu-cs-spice.arpa> 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: Thomas.Newton@cmu-cs-spice.arpa To: info-mac@sumex-aim.arpa Subject: FEdit.Link Message-ID: <1984.10.27.2.0.41.Thomas.Newton@cmu-cs-spice.arpa> !START ] /OUTPUT Fedit FEDIT1 FEDIT2 /RESOURCES FEDITR $ -------
info-mac@uw-beaver (info-mac) (10/29/84)
From: Thomas.Newton@cmu-cs-spice.arpa The other day, I downloaded the FEdit sources from Compuserve. At first glance, they seem to be for the earlier version of FEdit (the one without the File Finder Attributes menu item). My next four messages contain the FEdit sources, which I assume will be intercepted and archived on sumex. The files are named FEdit1.Asm, FEdit2.Asm, FEdit.Link, and FEditR.Asm. [Ed. Files are on {SUMEX}<INFO-MAC>. They will also be sent to FA.INFO-MAC]