HE Bios v1.1 - v1.2
The Boot Process
First it disables interupts and set the SP to $ff and clears the SR.
Then it gets the CPU type and the avaiable non ROM memory.
After this it looks for hardware installed on the computer like blockdevices.
Then it looks to all avaiable blockdevices and try to load a master boot record at block zero
that contains code at start adress $0200. A master boot record has to start with a valid byte <> $00 (BRK).
If one is found it loads it and jumps to them otherwise it trys to load a HeOS, the code here has to start at $0800.
Now the bios is done.
The BIOS do not enable interupts or reset the SP or SR after it is done.
Also it does not initialising any vectors or memory.
Other Informations about the BIOS
The bios saves its data to the ZP address for later use or to
make a backup copy to other memory adresses.
This ZP adresses are this:
$ff 1 byte : the blockdevice with the MBR on it
$fb-$fe 4 bytes: the free memory in hex format
$f7-$fa 4 bytes: the extended memory in hex format (not in use yet)
$f6 1 byte : the CPU type
0: 65xx (including 6502, 6509, 6510, 7501, 850x and 65DTV02 etc.)
1: 65CE02 (or 4510 in the C65 and MEGA65)
2: 65C02 (or 65C102 in the LCD)
3: 65816 (on SuperCPU and other accelerator cards)
$f2-$f5 4 bytes: the CPU speed in Hz in hex format (not in use yet)
$f0-$f1 2 bytes: a bitset that represents the installed devices
if bit is set the device is present else it is not
$f0: bit 0: BLKDEV0
bit 1: BLKDEV1
bit 2: BLKDEV2
bit 3: BLKDEV3
bit 4: BLKDEV4
bit 5: unused
bit 6: CFFA1 card
bit 7: unused
$f1: not in use yet
The BIOS uses some other ZP addresses for
temporary use in the internal routines.
This are the following ones.
The ZP adresses are this.
$02-$09 1 bytes each: this are temproarly variables called VAR0-7
$0a-$0c 1 bytes each: here the BIOS saves the register temporarly
$10-$17 2 bytes each: used as adresses called ADDR0-3
$1a-$1d 2 bytes each: used as pointers called POINTER0-3
$20-$2d 4 bytes each: 32bit accumulators for calculations called IACC0-3
$030 10 bytes : the dezimal representation of an 32bit value called BCDBUF
The BIOS has also usefull routines you can use.
All this routiness are called by an JSR.
This routines are this:
$f800 * bios_start usefull for a warmstart it clears nothing but the SP and SR
also it disables interupts
$f803 * get_cpu_type gets the CPU type A and $f6 holds result
$f81f * get_main_mem mesures the main memory result is in $fb-$fe
$f857 $f848 get_block_dev get the avaiable blockdevices result bits 0-4 in $f0
$f893 $f875 CFFA1Present get the pressence of an CFFA1 card result is the bit 6 in $f0
$f8a7 $f889 Imprint print a ZSTRING followed immedate by the caller.
example: JSR $f8a7 ;for v1.1
DCS a wonderfull text\0
WARNING: do not call this absolut indirect if your prozessor can this!
$f8c7 $f8a9 get_key get a key, result is in A and $07
$f8e1 $f8b7 cout prints an charater stored in A to the terminal
$f8e5 $f8cd set_cursor_xy sets the cursor to position X and Y stored in register X and Y if CARRY is not set
else it get the values from $08 for x and $09 for y.
$f8f2 $f8e0 get_cursor_xy gets the x and y position of the cursor and save it to $08 and $09
$f8fd $f8eb clrscr clears the screen
$f90b $f8f6 save_regs saves the A,X,Y register to $0a-$0c
$f912 $f8fd load_regs load the registers A,X,Y with values from $0a-$0c
$f94e $f933 print_zstr prints an ZSTRING, address of the string has stored in $18-$19
$f964 $f949 print_dez converts and prints a value store at $20-$23 to a dezimal number is stored at $30-$39
$f97a $f95f print_hex prints A as 2byte hex number. if CARRY is set it skips the highnibble
$f996 $f97b bin2bcd converts a number stored in $20-$23 result is in $30-$39
$f9a3 $f988 div10 divides the number sored at $20-$23 by ten the remainder is in A
$f9bb $f99a copy_zp2zp_bw copys values from ZP address in A to ZP address in X backwards. Lenght is given by Y.
example: lda #$f0 ;copy 4 bytes from $f0 to $a0
jsr $f9bb ;for v1.1
NOTE: choose the locations wisely otherwise the copy overwrites
the values at the source addresses.
* means the same address as v1.1
and here ends the jorney in the BIOS.
Thanks for reading.