Skip to main content
© Red Sector

                            PART III
            THE ULTIMATE VIRUS KILLER BOOK APPENDICES

              I - ATARI TOS COMPUTER BOOT FLOWCHART


 During  a power-up of your system,  or after pressing its  reset
button,  the Operating System takes over and does a whole lot  of
things that will eventually result in your being able to work  on
a GEM desktop.
 This appendix covers more or less exactly what happens.  It will
also  indicate  the spots where viruses usually perform  some  of
their  potentially dangerous perpetrations.  This flowchart  will
have  slightly differing specs in the cases of MEGA  STE,  TT  or
Falcon,  but will largely be the same.  Do note that this summary
is  of a rather technical nature and that only some of  the  more
difficult  phrases/words may be found in the  glossary  (appendix
J).

 STEP 1 - RESET

 The system is reset.

 STEP 2 - DIAGNOSTIC CARTRIDGE TEST

 The program counter (PC) gets a value of $FC0000 (or $E00000  in
the case of an STE,  TT, Falcon or ST Book); the Supervisor Stack
Pointer (SSP) gets a value of $FC0004 (or,  indeed, $E00004). All
interrupts are disabled and the RESET command is performed  (this
is  an 68000 mnemonic command for the hardware registers  of  the
peripherals).
 Should  a  diagnostic  cartridge be  present  in  the  cartridge
expansion  port of your computer the program will load a  'return
address'  in register A6 and execute the diagnostic  software.  A
diagnostic  cartridge  is  recognised  as  such  when  the  first
longword in memory space allocated to cartridges (which starts at
$FA0000  and  runs up to $FBFFFF) contains the  value  $FA52255F.
This  is the trick that many 'freeze frame' hardware and  hacking
cartridges  use.  The  Operating  System  has  not  yet  bothered
clearing  memory  and  all is still like it was  when  the  reset
button was pressed.
 When  your computer is equipped with a 68030 or 68040  CPU,  the
CACR,  VBR,  TC,  TT0  and TT1 registers are  initialised.  If  a
Floating  Point  Coprocessor  (FPC)  is  installed,  it  is  also
initialised.

 STEP 3 - INITIALISATION OF THE MEMORY CONTROLLER

 Here,  the  Operating System checks whether a 'warm  reset'  has
occurred. It establishes this by checking if two system variables
(memvalid  on  $420  and memval2 on $43A)  have  specific  'magic
longwords'  in them ($752019F3 and $237698AA  respectively). When
these  are  found,  it  assumes  that  memory  has  already  been
installed  properly  (before  a reset  was  done),  and  it  will
transfer the value contained in the memcntrl system variable  (at
$424) to the memory configuration registers at address $FC8001.
 This does not happen if a 'cold reset' (power off/on,  or [CTRL-
ALT-RIGHT  SHIFT-DELETE]  on  TOS  1.04  and  higher)  has   been
performed.

 STEP 4 - EXECUTE RESET HANDLER

 Next thing,  the Operating System checks if the system  variable
resvalid contains the 'magic longword' $31415926.  If this is the
case, it will execute the routine at the address contained in the
system variable resvector,  located at $42A. The 'return address'
will be in A6.  You may thus notice that programs that manipulate
the  reset vector are left by means of a JMP (A6) instead of  the
usual RTS or even RTE.

 This  possibility  is often used by viruses to  enable  them  to
'survive' a reset.


 STEP 5 - FURTHER INITIALISATION

 Of course,  the machine will have to initialise some its  chips.
This happens during this step.
 First the Programmable Sound Generator (PSG,  Atari's  miserable
excuse for a sound chip) will be initialised.  Oddly enough, this
is  also  required to deselect the floppy disk  drives,  as  some
sound chip ports are reserved for that purpose.
 Second, the screen frequency is set to 50 Hz (meaning the screen
will be rebuilt 50 times per minute). This is done by setting the
syncmode  register,  located  at  $FF820A,  to  50  Hz.  In  some
alternative  TOS versions this may be 60 Hz - which gives a  more
stable screen but which makes the screen unreadable (it seems  to
'run' up and/or down) when using certain TV's and modulators.  On
a  Falcon  the hertz rate is set in a different way  and  may  be
quite different from 50, 60 or 71 Hz.
 Third, the colour registers (addresses $FF8240 and further) will
be set to their default values.  These default values are located
somewhere in ROM. On the STE, TT and Falcon, colour registers are
(at least partly) located elsewhere.
 Fourth,  screen memory is installed.  This is the bit of  memory
that  is scanned and sortof digitally displayed on your  monitor.
This is done by loading the video base registers (at $FF8201  and
$FF8203)  with  the value $10000.  Ergo:  Screen memory  is  then
located  at address $10000.  It will later be changed to  another
address  (i.e.  $8000 below the physical top of RAM in ST  mode).
This  is different on Falcon and TT (and enhanced graphic  cards)
unless they're using ST-compatibility screen modes during  start-
up.

 STEP 6 - 'COLD RESET' INITIALISATION

 This step is only executed when no 'warm reset' is found to have
been  executed (which is usually after power-up).  Memory is  now
cleared and installed.
 First,  it actually checks the amount of memory present in  your
system. Second,  it clears all of this. Third, it sets the 'magic
longwords'  for memvalid and memval2,  so as to enable  a  future
'warm reset' (see step 3).

 STEP 7 - OPERATING SYSTEM INITIALISATION

 This bit is always executed,  unlike step 6,  even after a  warm
reset.  That's  why it seems to do  something  superfluous,  i.e.
clearing RAM addresses $93A to $FFFF. After that,  all  Operating
System variables are initialised, and screen memory is set to the
location contained in the system variable phystop minus $8000 (32
Kb - this is different on TT and Falcon,  as usual).  This  makes
sure  it  is  located at the end of  available  RAM  memory.  All
interrupt  vectors  are  set,   even  though  they  are  not  yet
functioning as they are disabled on CPU level. The Cookie Jar (if
any, according to TOS version 1.06 or higher) is also set.
 The last bit of this step is the initialisation of the Operating
System's BIOS.

 STEP 8 - FURTHER CARTRIDGE START POSSIBILITIES

 Above,   during  step  2,   we  already  encountered  diagnostic
cartridges  that  could be plugged in your  computer's  expansion
port.  Well,  the other cartridges, 'standard' ones, get executed
during this eighth step.  For them to be properly recognised, the
first longword at $FA0000 will have to have a value of $ABCDEF42.
The third longword (thus,  the one at offset 8) is called c_init,
and is very important here:  It determines at which moment during
this step the cartridge software should be run.
 The three different times of execution are:
 1) Before anything more happens.
 2) After   the  screen  resolution  has  been   determined   and
installed.
 3) After  the interrupts are enabled and the  screen  resolution
has been determined and installed.
 4) After GEMDOS is initialised,  the interrupts are enabled  and
the  screen  resolution has been determined  and  installed  (but
before step 9, the floppy booting procedure).
 The starting moment is determined by specific values of  c_init.
In  all,  step  8 entails the functions mentioned in  the  points
above.

 STEP 9 - BOOTING FROM FLOPPY

 If running TOS 2.06, 3.06 or 4.0x, the Fuji logo is displayed, a
memory  test  is  executed and a hard disk  spin-up  sequence  it
initiated.
 When the value at the system variable _bootdev is smaller than 2
(i.e.   when  booting  has  to  be  done  from  device  0  or  1,
corresponding  with floppy drives A or B),  the Operating  System
will  load  the bootsector off that particular  floppy  disk  and
execute it when the checksum is $1234 (i.e.  when the  bootsector
is executable). This will be done by jumping through the hdv_init
and hdv_boot system variables.

 This  is  how most bootsector viruses get into  the  system  and
install  themselves.  As  the bootsector is  always  executed  in
supervisor  mode,  the  programmer  can  easily  gain  access  to
privileged addresses.


 When  the  _bootdev  value is bigger than  2,  the  ACSI  (Atari
Computer  System  Interface)  bus  is  checked  to  see  if   any
executable bootsector can be fetched from other media (i.e.  from
hard disk). When found, this will be loaded and executed.
 This is how auto-booting hard disks work (i.e.  ones that do not
require software on floppy to install themselves and their driver
software).

 Principally bootsector viruses can also be active here, but this
is  generally  quickly seen,  as the hard disk will  cease  auto-
booting if it did before.  Also, most partition size data will be
trashed by it.


 STEP 10 - UNDOCUMENTED STUFF

 The following step is not official,  not documented,  illegal to
use - yet it is often used for reset-proof RAM disks to remain in
memory or,  indeed,  for the non-executable bootsector viruses to
get themselves activated (see 'The Book' 2.2.2).
 All memory is checked by the Operating System for the occurrence
of  a  512-byte block from the physical top of RAM down  to  $600
(i.e.  ending at $A00, $800, $600, etc.) that answers to specific
criteria.  First,  it  has  to  start  with  the  magic  longword
$1212345.  Second, the second longword should contain the address
where that magic longword is contained.  Third, it should contain
a longword checksum of that 512-byte bit of memory.
 If  this happens to be true,  the routine at the address plus  8
bytes (i.e.  $A08, $808, $608, etc.) will be executed by means of
a JSR.

 This  is how non-executable bootsector viruses get  executed  in
memory,  as  they are already loaded in memory and just wait  for
this particular Operating System to get to work.


 STEP 11 - THE LAST BITS

 All "\AUTO\*.PRG" files on the boot drive are loaded and run.
 Somewhere in a disk's bootsector is a word value, at offset $1E,
that is copied to the system variable cmdload,  which is  located
at address $482.
 When  this address gets the value $0000,  it will try to load  a
file  called "COMMAND.PRG" from the boot device after  trying  to
find an execute any .PRG files in the "AUTO" folder on that  same
device.  Such a file "COMMAND.PRG" could for example be a Command
Line  Interpreter  - for people who prefer  typing  MS-DOS  style
commands above the ease of GEM and the mouse.
 If  the cmdload value is unequal to $0000,  it will only try  to
find and execute these "AUTO" folder programs. Instead of loading
"COMMAND.PRG" after that, it will start the AES part of ROM.
 It  used  to  be  a  very commonly  known  fact  that  files  or
contiguous sectors can be fairly easily loaded from a  bootsector
using  the  extended information located at offsets  $20  to  $39
which  were incorporated in the old Atari booter.  This was  e.g.
used to load Operating Systems from disk in the time when  nobody
has their TOS on ROM. It's obsolete now.