Received: from PURCCVM.BITNET by FINTUVM.UTU.FI (Mailer X1.25) with BSMTP id
 7910; Sat, 30 Jul 88 05:15:54 EET
Received: from PURCCVM by PURCCVM.BITNET (Mailer X1.25) with BSMTP id 4803;
 Fri, 29 Jul 88 09:07:11 EST
Received: from j.cc.purdue.edu by VM.CC.PURDUE.EDU ; Fri, 29 Jul 88 09:07:06 EST
Received: by j.cc.purdue.edu (5.54/1.14)
    id AA03645; Fri, 29 Jul 88 09:06:02 EST
Date: Fri, 29 Jul 88 09:06:02 EST
From: ain@j.cc.purdue.edu (Patrick White)
Message-Id: <8807291406.AA03645@j.cc.purdue.edu>
To: fys-ma@fintuvm.BITNET
Subject: comp.sources.amiga:   sources/amiga/volume5/install2.s.sh
 
Newsgroups: comp.sources.amiga
Subject: install2 (sources 1 of 1)
Keywords: install, bootblock, ignore drives and fast mem
Approved: ain@j.cc.purdue.edu    (Patrick White)
 
Program Name:    install2  (sources)
Submitted by:    "Klaus Kaempf" <unido!rmi!kkaempf@uunet.uu.net>
Summary:    Installs a boot block that ignores fast mem and external drives.
Poster Boy:    Patrick White    (ain@j.cc.purdue.edu)
Archive Name:    sources/amiga/volume5/install2.s.sh.Z
tested.. kinda
 
NOTES:
   I tried to test this, but since I only have a 512K Amiga with internal
drive, I couldn't tell if it worked... it didn't crash though.
   I didn't compile it since it is assembly.
 
 
-- Pat White   (co-moderator comp.sources/binaries.amiga)
ARPA/UUCP: j.cc.purdue.edu!ain  BITNET: PATWHITE@PURCCVM  PHONE: (317) 743-8421
U.S.  Mail:  320 Brown St. apt. 406,    West Lafayette, IN 47906
[archives at: j.cc.purdue.edu.ARPA]
 
========================================
 
#    This is a shell archive.
#    Remove everything above and including the cut line.
#    Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:    Shell Archiver
#    Run the following text with /bin/sh to create:
#    README
#    Install2.bat
#    Install2.c
#    BootCode2.asm
# This archive created: Fri Jul 22 18:50:04 1988
# By:    Patrick White (PUCC Land, USA)
cat << \SHAR_EOF > README
 
==================================
Install2 - a useful (?) boot block
==================================
 
Summary:
--------
 
Installing a disk this way will cause ...
 
 a) preference being given to MEMF_CHIP for poorly written
    software, e. g. games from Germany :-) :-) :-)
 b) all external drives to be ignored by the system (and
    therefore eat up less memory for internal disk buffers).
 
 
Description:
------------
 
It would be even better if programs like this one would not
be necessary at all, but several developers asked me to
write something like this, so here you are!
 
Background information: In Germany *lots* of programmers use
the SEKA assembler (a pirated copy, of course) and some of
them even do not know about include files, ATOM, FixHunk
etc. (Teut Weidemann and Hans-Joachim Deeg, you're the
exceptions, of course).
 
Just INSTALL2 a disk (make sure it does not have a custom
boot block!) and reboot. If it still does not work ... curse
the manufacturer and buy someone else's software next time.
 
As always: If you want to include this boot block with any
commercial product, contact me before doing so! Permission
granted for non-commercial use if distributed unchanged from
the original version and free of charge!
 
A similar boot block can be used to MOUNT a normal trackdisk
drive with the new Fast Filing System (hey Steve, thanks a
lot). But Andy Finkel said that the automatic detection of a
DISKCHANGE was not yet implemented ...
 
"requires no more than 512 KB and internal drive", aaarrggghh!
 
!ralph
 
Ralph Babel, Falkenweg 3, D-6204 Taunusstein, FRGermany
 
SHAR_EOF
cat << \SHAR_EOF > Install2.bat
;
;Install2.bat
;
FailAt 1
LC1 -b0 -ceft -oT: Install2
LC2 -r1 -s -v T:Install2
BLink LIB:Astartup.obj+T:Install2.o TO Install2 LIB LIB:amiga.lib+LIB:lcnb.lib
 SC SD ND NOALVS BATCH
Delete T:Install2.o
FailAt 10
SHAR_EOF
cat << \SHAR_EOF > Install2.c
/*
** Install2.c - give preference to MEMF_CHIP and deactivate external drives
** Copyright (C) 1987 Ralph Babel, Falkenweg 3, D-6204 Taunusstein
** all rights reserved - alle Rechte vorbehalten
**
** 23-May-1987 created Install1.c
** 07-Aug-1987 changed for new boot code
** 30-Mar-1988 cleanup
*/
 
/*** included files ***/
 
#include <exec/types.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <devices/bootblock.h>
#include <devices/trackdisk.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
 
/*** external function references ***/
 
APTR AllocMem(ULONG, ULONG);
VOID FreeMem(APTR, ULONG);
struct IOStdReq *CreateStdIO(struct MsgPort *);
VOID DeleteStdIO(struct IOStdReq *);
BYTE OpenDevice(char *, LONG, struct IORequest *, ULONG);
VOID CloseDevice(struct IORequest *);
BYTE DoIO(struct IORequest *);
struct Task *FindTask(char *);
VOID CopyMem(APTR, APTR, ULONG);
 
VOID printf(char *, );
 
LONG toupper(LONG);
 
/*** constants ***/
 
#define ROOT 880 /* default AmigaDOS root block (3.5 inch) */
 
/*** structures ***/
 
struct BootSectors
 {
 struct BootBlock bs_BootBlock;
 UBYTE bs_Data[BOOTSECTS * TD_SECTOR - sizeof(struct BootBlock)];
 };
 
/*** the boot code ***/
 
UWORD BootCode[] =
 {
 0x2F02, 0x4EAE, 0xFF7C, 0x226E, 0x0142, 0x6020,
 0x0829, 0x0001, 0x000F, 0x6716, 0x2F09, 0x4EAE,
 0xFF04, 0x225F, 0x137C, 0x000A, 0x0009, 0x41EE,
 0x0142, 0x4EAE, 0xFEF2, 0x2242, 0x2411, 0x66DC,
 0x4EAE, 0xFF76, 0x241F, 0x43FA, 0x0032, 0x4EAE,
 0xFE0E, 0x4A80, 0x6724, 0x2040, 0x41E8, 0x0034,
 0x70FF, 0x20C0, 0x20C0, 0x2080, 0x43FA, 0x0026,
 0x4EAE, 0xFFA0, 0x4A80, 0x670A, 0x2040, 0x2068,
 0x0016, 0x7000, 0x4E75, 0x70FF, 0x4E75, 0x6469,
 0x736B, 0x2E72, 0x6573, 0x6F75, 0x7263, 0x6500,
 0x646F, 0x732E, 0x6C69, 0x6272, 0x6172, 0x7900
 };
 
/*** entry point ***/
 
LONG main(argc, argv)
LONG argc;
char *argv[];
 {
 struct BootSectors *bs;
 struct IOStdReq *iosr;
 struct Process *pr;
 ULONG checksum, precsum;
 UWORD i;
 LONG result;
 
 result = RETURN_WARN; /* user error */
 
 if(argc == 2
 && toupper(argv[1][0]) == 'D'
 && toupper(argv[1][1]) == 'F'
 && argv[1][2] >= '0' && argv[1][2] <= '3'
 && argv[1][3] == ':'
 && argv[1][4] == '\0')
  {
  result = RETURN_FAIL; /* no resources */
 
  if((bs = (struct BootSectors *)
   AllocMem(sizeof(struct BootSectors), MEMF_CHIP | MEMF_CLEAR)) != NULL)
   {
   pr = (struct Process *)FindTask(NULL);
   if((iosr = CreateStdIO(&pr->pr_MsgPort)) != NULL)
    {
    result = RETURN_ERROR; /* disk error */
 
    if(OpenDevice(TD_NAME, argv[1][2] - '0', (struct IORequest *)iosr, 0) == 0)
     {
     *(ULONG *)bs->bs_BootBlock.bb_id = BBNAME_DOS;
     bs->bs_BootBlock.bb_dosblock = ROOT;
     CopyMem((APTR)BootCode, (APTR)bs->bs_Data, sizeof(BootCode));
 
     checksum = 0;
     for(i = 0; i < 256; ++i)
      {
      precsum = checksum;
      if((checksum += ((ULONG *)bs)[i]) < precsum)
       ++checksum;
      }
 
     bs->bs_BootBlock.bb_chksum = 0xffffffff - checksum;
 
     iosr->io_Command = CMD_WRITE;
     iosr->io_Length  = sizeof(struct BootSectors);
     iosr->io_Data    = (APTR)bs;
     iosr->io_Offset  = 0;
     if(DoIO((struct IORequest *)iosr) == 0)
      {
      iosr->io_Command = CMD_UPDATE;
      (void)DoIO((struct IORequest *)iosr);
      }
     if(iosr->io_Error != 0)
      {
      printf("%s failed, trackdisk error %ld\n", argv[0], iosr->io_Error);
      }
     else
      {
      result = RETURN_OK; /* everything fine */
      }
     iosr->io_Command = TD_MOTOR;
     iosr->io_Length  = 0;
     (void)DoIO((struct IORequest *)iosr);
     CloseDevice((struct IORequest *)iosr);
     }
    else
     {
     printf("Unable to open trackdisk device, error %ld\n", iosr->io_Error);
     }
    DeleteStdIO(iosr);
    }
   else
    {
    printf("Unable to create IO request\n");
    }
   }
  else
   {
   printf("Insufficient free store\n");
   }
  }
 else
  {
  printf("Usage: %s {DF0:|DF1:|DF2:|DF3:}\n", argv[0]);
  }
 
 return result;
 }
SHAR_EOF
cat << \SHAR_EOF > BootCode2.asm
*
* BootCode2.asm - give preference to MEMF_CHIP and deactivate external drives
* Copyright (C) 1987 Ralph Babel, Falkenweg 3, D-6204 Taunusstein
* all rights reserved - alle Rechte vorbehalten
*
* 07-Aug-1987 created
* 30-Mar-1988 cleanup
*
 
    nolist
 
    include    "exec/types.i"
    include    "exec/execbase.i"
    include    "exec/memory.i"
    include    "exec/resident.i"
    include    "devices/bootblock.i"
    include    "resources/disk.i"
 
    list
 
*
* registers
*
 
REG_SysBase    equr    a6
 
*
* macros
*
 
xlib    macro
    xref    _LVO\1
    endm
 
callsys    macro
    jsr    _LVO\1(REG_SysBase)
    endm
 
*
* IMPORT, external symbol references
*
 
    xlib    Forbid
    xlib    Permit
    xlib    Remove
    xlib    Enqueue
    xlib    OpenResource
    xlib    FindResident
 
*
* constants
*
 
ROOT    equ    880    ;default AmigaDOS root block (3.5 inch)
NEW_PRI    equ    10    ;priority for MEMF_CHIP regions
 
*
* code section
*
 
    section    "text",code
 
*
* magic constants
*
 
    BBID_DOS
    dc.l    0    ;checksum
    dc.l    ROOT
 
*
* boot code, called on system start-up
*
* In:
*
* A1: IOStdReq for TD_NAME, UNIT_0
* A6: SysBase
*
* Out:
*
* A0: start address to jump to (D0 == zero)
* D0: failure code, null if successful
*
 
    move.l    d2,-(sp)
 
    callsys    Forbid
 
    movea.l    LH_HEAD+MemList(REG_SysBase),a1
    bra.s    3$
 
1$    btst.b    #MEMB_CHIP,MH_ATTRIBUTES+1(a1)    ;hi .. lo
    beq.s    2$
 
    move.l    a1,-(sp)
    callsys    Remove
    movea.l    (sp)+,a1
 
    move.b    #NEW_PRI,LN_PRI(a1)
    lea    MemList(REG_SysBase),a0
    callsys    Enqueue
 
2$    movea.l    d2,a1
 
3$    move.l    (a1),d2    ;move.l LN_SUCC(a1),d2
    bne.s    1$
 
    callsys    Permit
 
    move.l    (sp)+,d2
 
    lea    diskName(pc),a1
    callsys    OpenResource
    tst.l    d0
    beq.s    error
 
    movea.l    d0,a0
 
    lea    DR_UNITID+4(a0),a0
    moveq    #DRT_EMPTY,d0
 
    move.l    d0,(a0)+    ;unit 1
    move.l    d0,(a0)+    ;unit 2
    move.l    d0,(a0)        ;unit 3
 
    lea    dosName(pc),a1
    callsys    FindResident
    tst.l    d0
    beq.s    error
    movea.l    d0,a0
    movea.l    RT_INIT(a0),a0
    moveq    #0,d0
    rts
 
error    moveq    #-1,d0
    rts
 
diskName:
    dc.b    'disk.resource',0
 
dosName:
    dc.b    'dos.library',0
 
    end
SHAR_EOF
#    End of shell archive
exit 0
