816 lines
19 KiB
ArmAsm
816 lines
19 KiB
ArmAsm
|
| file: boot.s
|
|||
|
| author: chapuni(GBA02750@niftyserve.or.jp)
|
|||
|
| Yasha
|
|||
|
|
|
|||
|
| $NetBSD: xxboot.S,v 1.1 1998/09/01 20:02:35 itohy Exp $
|
|||
|
|
|||
|
#include "iocscall.h"
|
|||
|
|
|||
|
#define BASEOFF 0x8000
|
|||
|
#define BASEPTR_A (TEXTADDR+BASEOFF)
|
|||
|
#define BASEPTR_R pc@(top+BASEOFF:W)
|
|||
|
|
|||
|
#define SRAM 0x00ED0000 /* SRAM stat addr */
|
|||
|
#define SRAM_MEMSZ (SRAM + 8) /* (L) size of main memory */
|
|||
|
#define MINMEM 0x00400000 /* at least 4MB required */
|
|||
|
|
|||
|
#define BOOT_ERROR(s) jbsr boot_error; .asciz s; .even
|
|||
|
|
|||
|
.globl _header
|
|||
|
.globl _image
|
|||
|
|
|||
|
_header=0x100000 | <EFBFBD>ޤ<EFBFBD><EFBFBD>ϡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Υ<EFBFBD><EFBFBD>ɥ쥹<EFBFBD><EFBFBD>
|
|||
|
_image=_header+(8*4) | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɤ<EFBFBD><EFBFBD>ޤ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
#ifdef BOOT_DEBUG
|
|||
|
.globl _startregs
|
|||
|
_startregs=0xb000 | chosen arbitrarily...
|
|||
|
#endif
|
|||
|
|
|||
|
.globl _bootufs
|
|||
|
.text
|
|||
|
top:
|
|||
|
bras entry0
|
|||
|
.ascii "SHARP/"
|
|||
|
.ascii "X680x0"
|
|||
|
.word 0x8199,0x94e6,0x82ea,0x82bd
|
|||
|
.word 0x8e9e,0x82c9,0x82cd,0x8cbb
|
|||
|
.word 0x8ec0,0x93a6,0x94f0,0x8149
|
|||
|
| 0x2000 (FD), 0x2400 (SASI/SCSI) (<EFBFBD>⤷<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x3F0000)
|
|||
|
| d4 <EFBFBD>ˤϤ<EFBFBD><EFBFBD>Ǥ<EFBFBD> SCSI ID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>äƤ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
| <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> jmp <EFBFBD>ޤǤϥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֥<EFBFBD><EFBFBD>˽ͤФʤ<EFBFBD><EFBFBD>ʤ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
entry0:
|
|||
|
#ifdef BOOT_DEBUG
|
|||
|
moveml d0-d7/a0-a7,_startregs
|
|||
|
#endif
|
|||
|
lea BASEPTR_A:l,a5 | set base ptr
|
|||
|
#define RELOC(adr) a5@(((adr)-(BASEPTR_A&0xffff)):W)
|
|||
|
|
|||
|
lea RELOC(_edata),a1 | BSS start
|
|||
|
movew #_end-1,d0 | BSS end (low word only)
|
|||
|
|
|||
|
#ifndef BOOT_DEBUG /* not enough space -- moved below */
|
|||
|
| check memory size (high word)
|
|||
|
cmpiw #MINMEM/0x10000,SRAM_MEMSZ
|
|||
|
#endif
|
|||
|
bra entry
|
|||
|
|
|||
|
| 0x40 (= LABELOFFSET in <machine/disklabel.h>)
|
|||
|
| Here disklabel exists for floppy disk (276 bytes)
|
|||
|
disklabel:
|
|||
|
.space 300
|
|||
|
|
|||
|
#ifdef TITLE_IMAGE
|
|||
|
.word img_title-top
|
|||
|
#else
|
|||
|
.word 0
|
|||
|
#endif
|
|||
|
entry:
|
|||
|
#ifdef BOOT_DEBUG
|
|||
|
| check memory size (high word)
|
|||
|
cmpiw #MINMEM/0x10000,SRAM_MEMSZ
|
|||
|
#endif
|
|||
|
jcc memok | (continued from above) RAM >= 4MB
|
|||
|
BOOT_ERROR("4MB RAM required")
|
|||
|
memok:
|
|||
|
| clear out BSS (must be <= 64KB)
|
|||
|
subw a1,d0
|
|||
|
clrbss: clrb a1@+
|
|||
|
dbra d0,clrbss
|
|||
|
|
|||
|
| set system stack
|
|||
|
lea RELOC(top),a1 | set stack pointer to 0x003F0000
|
|||
|
lea a1@,sp | a1 will be used later for IOCS calls
|
|||
|
|
|||
|
| we use 68020 instructions, and check MPU beforehand
|
|||
|
|
|
|||
|
| here d1.w = -1, and the above "subw a1,d0" = 0x9049, and
|
|||
|
| if MPU <= 010 loads 0x49,
|
|||
|
| if MPU >= 020 loads 0x90.
|
|||
|
| This is a move, not a tst instruction
|
|||
|
| because pc-relative tsts are not availble on 000/010.
|
|||
|
chkmpu: moveb pc@(clrbss-chkmpu-2:B,d0:W:2),d0 | 103B 02xx
|
|||
|
jmi mpuok | MC68020 or later
|
|||
|
BOOT_ERROR("MPU 68000?")
|
|||
|
mpuok: | XXX check for MMU?
|
|||
|
|
|||
|
movel d4,RELOC(_ID) | SCSI ID (if booted from SCSI)
|
|||
|
IOCS(__BOOTINF)
|
|||
|
movel d0,RELOC(_BOOT_INFO)
|
|||
|
lsll #8,d0 | clear MSByte
|
|||
|
lsrl #8,d0 |
|
|||
|
|
|||
|
|
|
|||
|
| 0x80...0x8F SASI
|
|||
|
| 0x90...0x93 Floppy
|
|||
|
| 0xED0000...0xED3FFE SRAM
|
|||
|
| others ROM (SCSI?)
|
|||
|
|
|
|||
|
movel d0,d1
|
|||
|
clrb d1
|
|||
|
tstl d1
|
|||
|
jne boot_ram_rom
|
|||
|
|
|
|||
|
| SASI or Floppy
|
|||
|
|
|
|||
|
movel d0,d2
|
|||
|
andib #0xFC,d0
|
|||
|
cmpib #0x90,d0
|
|||
|
jne boot_dev_unsupported | boot from SASI?
|
|||
|
|
|
|||
|
| Floppy
|
|||
|
|
|
|||
|
moveb d2,d0
|
|||
|
andib #0x03,d0 | drive # (head=0)
|
|||
|
jbsr check_fd_format
|
|||
|
moveml d0-d1,RELOC(_FDSECMINMAX) | min and max sec #
|
|||
|
lslw #8,d2
|
|||
|
moveq #0x70,d1
|
|||
|
orw d2,d1 | PDA*256 + MODE
|
|||
|
movel d1,RELOC(_FDMODE)
|
|||
|
movel d0,d2 | read position (first sector)
|
|||
|
movel #8192,d3 | read bytes
|
|||
|
IOCS(__B_READ)
|
|||
|
jra boot_read_done
|
|||
|
|
|||
|
#include "chkfmt.s"
|
|||
|
|
|||
|
boot_ram_rom:
|
|||
|
movel d0,d1
|
|||
|
swap d1
|
|||
|
cmpiw #0x00ED,d1
|
|||
|
jne boot_SCSI
|
|||
|
| boot from SRAM?
|
|||
|
|
|||
|
boot_dev_unsupported:
|
|||
|
BOOT_ERROR("unsupported boot device")
|
|||
|
|
|||
|
|
|
|||
|
| volatile void BOOT_ERROR(const char *msg);
|
|||
|
| print error message, wait for key press and reboot
|
|||
|
|
|
|||
|
booterr_msg: .ascii "\r\n\n"
|
|||
|
.ascii BOOT
|
|||
|
.asciz ": "
|
|||
|
reboot_msg: .asciz "\r\n[Hit key to reboot]"
|
|||
|
.even
|
|||
|
|
|||
|
.globl _BOOT_ERROR
|
|||
|
_BOOT_ERROR: addql #4,sp
|
|||
|
|
|||
|
boot_error: lea pc@(booterr_msg),a1
|
|||
|
IOCS(__B_PRINT)
|
|||
|
moveal sp@+,a1
|
|||
|
IOCS(__B_PRINT)
|
|||
|
lea pc@(reboot_msg),a1
|
|||
|
IOCS(__B_PRINT)
|
|||
|
|
|||
|
| wait for a key press (or release of a modifier)
|
|||
|
IOCS(__B_KEYINP)
|
|||
|
|
|||
|
| issue software reset
|
|||
|
trap #10
|
|||
|
| NOTREACHED
|
|||
|
|
|||
|
|
|||
|
|
|
|||
|
| ROM boot ... probably from SCSI
|
|||
|
|
|
|||
|
boot_SCSI:
|
|||
|
#ifdef SCSI_ADHOC_BOOTPART
|
|||
|
|
|
|||
|
| Find out boot partition in an ad hoc manner.
|
|||
|
|
|
|||
|
|
|||
|
| get block length of the SCSI disk
|
|||
|
SCSIIOCS(__S_READCAP) | using buffer at a1
|
|||
|
tstl d0
|
|||
|
jeq 1f
|
|||
|
BOOT_ERROR("READCAP failed")
|
|||
|
1: moveq #0,d5
|
|||
|
moveb a1@(6),d5 | 1: 256, 2: 512, 4: 1024
|
|||
|
lsrb #1,d5 | 0: 256, 1: 512, 2: 1024
|
|||
|
movel d5,RELOC(_SCSI_BLKLEN)
|
|||
|
|
|||
|
| find out the start position of the boot partition
|
|||
|
| XXX VERY AD HOC
|
|||
|
|
|
|||
|
| SCSI IPLs (genuine and SxSI):
|
|||
|
| pass read pos (in kilobytes) in d2
|
|||
|
| partition table on the memory is destroyed
|
|||
|
| BOOT MENU Ver.2.22:
|
|||
|
| passes partition table entry address in a0
|
|||
|
| d2 is cleared to zero
|
|||
|
| No other IPL is supported. XXX FIXME
|
|||
|
tstl d2
|
|||
|
jne 1f
|
|||
|
| no information in d2 -- probably from BOOT MENU
|
|||
|
| a0 points the partiion table entry
|
|||
|
movel a0@(0x0008),d2 | in KByte
|
|||
|
1: lsll #8,d2 | clear MSByte
|
|||
|
lsrl #6,d2 |
|
|||
|
lsrl d5,d2 | in sector
|
|||
|
movel d2,RELOC(_SCSI_PARTTOP)
|
|||
|
|
|||
|
| read entire boot
|
|||
|
moveq #8192/256,d3 | size is 8KB
|
|||
|
lsrl d5,d3 | in sector
|
|||
|
jbsr scsiread | read at a1
|
|||
|
#else
|
|||
|
moveq #1,d5 | 512bytes/sec
|
|||
|
moveq #8192/512,d3 | <EFBFBD>ɤ߹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>祵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
moveq #0x40,d2 | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǥ<EFBFBD>(sd*a <EFBFBD>Τ<EFBFBD>)
|
|||
|
SCSIIOCS(__S_READ)
|
|||
|
#endif
|
|||
|
|
|||
|
boot_read_done:
|
|||
|
|
|||
|
| <EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥѥ<EFBFBD><EFBFBD>åȤν<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
moveq #15,d1
|
|||
|
initpalet:
|
|||
|
moveq #0,d2
|
|||
|
subqw #1,d2 | movel #0xFFFF,d2
|
|||
|
IOCS(__TPALET2)
|
|||
|
subqw #1,d1
|
|||
|
moveq #0,d2
|
|||
|
IOCS(__TPALET2)
|
|||
|
dbra d1,initpalet
|
|||
|
|
|||
|
jsr RELOC(_printtitle)
|
|||
|
jmp RELOC(_bootufs) | 0x3Fxxxx <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǥ椯
|
|||
|
|
|||
|
read_error: BOOT_ERROR("read error")
|
|||
|
|
|||
|
#undef RELOC /* base register a5 is no longer available */
|
|||
|
|
|||
|
|
|
|||
|
| read SCSI
|
|||
|
|
|
|||
|
| input: d2.l: pos in sector
|
|||
|
| d3.l: len in sector
|
|||
|
| d4: target SCSI ID
|
|||
|
| d5: sector length (0: 256, 1: 512, 2: 1024)
|
|||
|
| a1: buffer address
|
|||
|
| destroy:
|
|||
|
| d0, d1, a1
|
|||
|
|
|
|||
|
scsiread:
|
|||
|
moveml d2-d3/d6-d7/a2,sp@-
|
|||
|
| if (pos >= 0x200000 || (len > 255 && pos + len >= 0x200000))
|
|||
|
| use READEXT
|
|||
|
| else
|
|||
|
| use READ
|
|||
|
moveq #0x20,d0
|
|||
|
swap d0 | d0.l = 0x00200000
|
|||
|
moveq #0,d6
|
|||
|
subqb #1,d6 | d6.l = 255
|
|||
|
moveq #8,d7
|
|||
|
addb d5,d7 | d7.b = (sector length: 0-2) + 8
|
|||
|
cmpl d0,d2
|
|||
|
jcc scsiread_ext
|
|||
|
moveq #__S_READ,d1
|
|||
|
cmpl d3,d6
|
|||
|
jcc scsiread_noext
|
|||
|
subl d2,d0 | d0.0 = 0x200000 - pos
|
|||
|
cmpl d0,d3 | <= len
|
|||
|
jcs scsiread_noext | no
|
|||
|
|
|||
|
scsiread_ext: | use READEXT
|
|||
|
extw d6 | d6.l = 65535
|
|||
|
moveq #__S_READEXT,d1
|
|||
|
|
|||
|
scsiread_noext: | use READ
|
|||
|
loop_scsiread:
|
|||
|
| d1: SCSI IOCS call #
|
|||
|
| d6: max sector count at a time
|
|||
|
movel d3,a2 | save original len in a2
|
|||
|
cmpl d3,d6
|
|||
|
jcc 1f
|
|||
|
movel d6,d3
|
|||
|
1: IOCS(__SCSIDRV) | SCSIIOCS(d1)
|
|||
|
tstl d0
|
|||
|
jne read_error
|
|||
|
movel d3,d0 | addr += read count << (8 + sec len)
|
|||
|
asll d7,d0
|
|||
|
addl d0,a1
|
|||
|
exg d3,a2 | restore original len to d3
|
|||
|
addl a2,d2 | pos += read count
|
|||
|
subl a2,d3 | len -= read count
|
|||
|
jne loop_scsiread
|
|||
|
moveml sp@+,d2-d3/d6-d7/a2
|
|||
|
rts
|
|||
|
|
|||
|
|
|
|||
|
| The former part must reside in the first 1KB.
|
|||
|
|
|
|||
|
.globl first_kbyte
|
|||
|
first_kbyte:
|
|||
|
|--------------------------------------------------------------------------
|
|||
|
|
|
|||
|
| The latter text+data part is not accessible at the first boot time.
|
|||
|
| PC-relative can be used from here.
|
|||
|
|
|
|||
|
|
|||
|
| int badbaddr __P((caddr_t adr));
|
|||
|
| check if the given address is valid for byte read
|
|||
|
| return: 0: valid, 1: not valid
|
|||
|
|
|||
|
.globl _badbaddr
|
|||
|
_badbaddr:
|
|||
|
lea 0x0008:W,a1 | MPU Bus Error vector
|
|||
|
moveq #1,d0
|
|||
|
lea pc@(badr1),a0
|
|||
|
movew sr,sp@-
|
|||
|
oriw #0x0700,sr | keep out interrupts
|
|||
|
movel a1@,sp@-
|
|||
|
movel a0,a1@ | set bus error vector
|
|||
|
movel sp,d1 | save sp
|
|||
|
moveal sp@(10),a0
|
|||
|
tstb a0@ | try read...
|
|||
|
moveq #0,d0 | this is skipped on bus error
|
|||
|
badr1: moveal d1,sp | restore sp
|
|||
|
movel sp@+,a1@
|
|||
|
movew sp@+,sr
|
|||
|
rts
|
|||
|
|
|||
|
| void RAW_READ __P((void *buf, u_int32_t blkpos, size_t bytelen));
|
|||
|
| inputs:
|
|||
|
| buf: input buffer address
|
|||
|
| blkpos: read start position in the partition in 512byte-blocks
|
|||
|
| bytelen: read length in bytes
|
|||
|
|
|||
|
Lraw_read_buf=4+(4*11)
|
|||
|
Lraw_read_pos_=Lraw_read_buf+4
|
|||
|
Lraw_read_len=Lraw_read_buf+8
|
|||
|
|
|||
|
.globl _RAW_READ
|
|||
|
#ifdef SCSI_ADHOC_BOOTPART
|
|||
|
.globl _RAW_READ0
|
|||
|
| RAW_READ of physical disk
|
|||
|
_RAW_READ0:
|
|||
|
moveq #0,d0
|
|||
|
jra raw_read1
|
|||
|
#endif
|
|||
|
_RAW_READ:
|
|||
|
#ifdef SCSI_ADHOC_BOOTPART
|
|||
|
movel _SCSI_PARTTOP,d0
|
|||
|
raw_read1:
|
|||
|
#endif
|
|||
|
moveml d2-d7/a2-a6,sp@-
|
|||
|
moveml sp@(Lraw_read_buf),d1-d3
|
|||
|
movel d1,a1
|
|||
|
| d2.l: pos in 512byte-blocks
|
|||
|
| d3.l: length in bytes
|
|||
|
| a1 (=d1): buffer address
|
|||
|
|
|||
|
lea BASEPTR_R,a5 | set base ptr
|
|||
|
#define RELOC(adr) a5@(((adr)-(BASEPTR_A&0xffff)):W)
|
|||
|
|
|||
|
tstb RELOC(_BOOT_INFO+1) | simple check. may be incorrect!
|
|||
|
beqs raw_read_floppy
|
|||
|
|
|||
|
raw_read_scsi:
|
|||
|
movel RELOC(_ID),d4 | SCSI ID
|
|||
|
#ifdef SCSI_ADHOC_BOOTPART
|
|||
|
movel RELOC(_SCSI_BLKLEN),d5 | sector size: 0-2
|
|||
|
| XXX length must be sector aligned
|
|||
|
lsrl #8,d3 | size in 256byte-blocks
|
|||
|
lsrl d5,d3 | size in sector
|
|||
|
bcss read_half | minimal error check
|
|||
|
lsll #1,d2 | X flag and d2: pos in 256byte-blocks
|
|||
|
roxrl d5,d2 | pos in sector
|
|||
|
addl d0,d2 | physical pos in sector
|
|||
|
#else
|
|||
|
moveq #1,d5 | 512bytes/sec
|
|||
|
moveq #9,d0 | shift count
|
|||
|
addl #511,d3
|
|||
|
lsrl d0,d3
|
|||
|
bcss read_half | minimal error check
|
|||
|
|
|||
|
addl #0x40,d2 | 'a' partition starts here
|
|||
|
#endif
|
|||
|
| jcc 1f
|
|||
|
| BOOT_ERROR("out of seek") | pos exceeds 32bit
|
|||
|
|1:
|
|||
|
jbsr scsiread
|
|||
|
bras raw_read_end
|
|||
|
|
|||
|
raw_read_floppy:
|
|||
|
|
|
|||
|
| Floppy read routine
|
|||
|
|
|
|||
|
|
|||
|
| convert to seek position
|
|||
|
|
|||
|
asll #2,d2 | size in 128byte-blocks
|
|||
|
|
|||
|
| sec = raw_read_pos (d2)
|
|||
|
| sec >>= 7 + (sector length: 0-3)
|
|||
|
|
|||
|
lea RELOC(_FDSECMINMAX),a0
|
|||
|
moveq #0,d1
|
|||
|
moveb a0@,d1 | d1: sector length (0-3)
|
|||
|
lsrl d1,d2 | d2: pos in sector
|
|||
|
bcss read_half | error check
|
|||
|
|
|||
|
| trk = sec / (# sectors)
|
|||
|
| sec = sec % (# sectors)
|
|||
|
|
|||
|
moveb a0@(7),d1 | d1: max sector #
|
|||
|
subb a0@(3),d1 | - min sector #
|
|||
|
addqb #1,d1 | d1: # sectors
|
|||
|
divu d1,d2 | d2: (sec << 16) | track
|
|||
|
|
|||
|
| position = (sec length << 24) | (track/2 << 16)
|
|||
|
| | (track%2 << 8) | (min sec # + sec)
|
|||
|
|
|||
|
movel a0@,d0 | d0: (sec len << 24) | min sec #
|
|||
|
lsrw #1,d2 | d2: (sec << 16) | (track / 2)
|
|||
|
jcc 1f
|
|||
|
bset #8,d0 | |= (track % 2) << 8
|
|||
|
1: swap d2 | d2: ((track / 2) << 16) | sec
|
|||
|
addl d0,d2 | d2: position
|
|||
|
|
|||
|
| read
|
|||
|
movel RELOC(_FDMODE),d1 | PDA*256 + MODE
|
|||
|
|
|||
|
| B_READ (for floppy)
|
|||
|
| d1.w: PDA x 256 + MODE
|
|||
|
| PDA: 0x90 (drive 0) ... 0x93 (drive 3)
|
|||
|
| MODE: bit6: MFM
|
|||
|
| bit5: retry
|
|||
|
| bit4: seek
|
|||
|
| d2.l: position
|
|||
|
| bit31-24: sector length (0: 128, 1: 256, 2: 512, 3: 1K)
|
|||
|
| bit23-16: track # (0-79)
|
|||
|
| bit15-08: side (0 or 1)
|
|||
|
| bit07-00: sector # (1-)
|
|||
|
| d3.l: read bytes
|
|||
|
| a1: read address
|
|||
|
| return:
|
|||
|
| d0: bit 31-24 ST0
|
|||
|
| bit 23-16 ST1
|
|||
|
| bit 15- 8 ST2
|
|||
|
| bit 7- 0 C
|
|||
|
| -1 on parameter error
|
|||
|
| destroy: d0, d2, d3, a1
|
|||
|
IOCS(__B_READ)
|
|||
|
andil #0xf8ffff00,d0 | check status (must be zero)
|
|||
|
jne read_error
|
|||
|
|
|||
|
raw_read_end:
|
|||
|
moveml sp@+,a2-a6/d2-d7
|
|||
|
rts
|
|||
|
#undef RELOC /* base register a5 is no longer available */
|
|||
|
|
|||
|
read_half: BOOT_ERROR("read half of block")
|
|||
|
|
|||
|
#if 0
|
|||
|
.globl _JISSFT
|
|||
|
_JISSFT:
|
|||
|
movel sp@(4),d1
|
|||
|
IOCS(__JISSFT)
|
|||
|
rts
|
|||
|
#endif
|
|||
|
|
|||
|
.globl _B_SFTSNS
|
|||
|
_B_SFTSNS:
|
|||
|
IOCS(__B_SFTSNS)
|
|||
|
rts
|
|||
|
|
|||
|
.globl _B_KEYINP
|
|||
|
_B_KEYINP:
|
|||
|
IOCS(__B_KEYINP)
|
|||
|
rts
|
|||
|
|
|||
|
.globl _B_PUTC
|
|||
|
_B_PUTC:
|
|||
|
movel sp@(4),d1
|
|||
|
IOCS(__B_PUTC)
|
|||
|
rts
|
|||
|
|
|||
|
.globl _B_PRINT
|
|||
|
_B_PRINT:
|
|||
|
movel sp@(4),a1
|
|||
|
IOCS(__B_PRINT)
|
|||
|
rts
|
|||
|
|
|||
|
.globl _B_COLOR
|
|||
|
_B_COLOR:
|
|||
|
movel sp@(4),d1
|
|||
|
IOCS(__B_COLOR)
|
|||
|
rts
|
|||
|
|
|||
|
.globl _B_LOCATE
|
|||
|
_B_LOCATE:
|
|||
|
movel d2,sp@-
|
|||
|
movel sp@(8),d1
|
|||
|
movel sp@(12),d2
|
|||
|
IOCS(__B_LOCATE)
|
|||
|
movel sp@+,d2
|
|||
|
rts
|
|||
|
|
|||
|
.globl _B_CLR_ST
|
|||
|
_B_CLR_ST:
|
|||
|
movel sp@(4),d1
|
|||
|
IOCS(__B_CLR_ST)
|
|||
|
rts
|
|||
|
|
|||
|
.globl _printtitle
|
|||
|
_printtitle:
|
|||
|
lea pc@(msg_title),a1
|
|||
|
IOCS(__B_PRINT)
|
|||
|
#ifndef TITLE_IMAGE
|
|||
|
rts
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef TITLE_IMAGE
|
|||
|
# define IMGXPOS 17
|
|||
|
# define IMGYPOS 1
|
|||
|
# define IMGWIDTH 56
|
|||
|
# define IMGHEIGHT 52
|
|||
|
|
|
|||
|
| display title image
|
|||
|
|
|
|||
|
put_image: link a6,#-(IMGWIDTH*IMGHEIGHT/8*2+8) | make local buffer
|
|||
|
moveal sp,a1 | buffer (plane #0) top
|
|||
|
moveml d2-d7/a2-a4,sp@-
|
|||
|
|
|||
|
lea a1@(IMGWIDTH*IMGHEIGHT/8+4),a4 | buffer (plane #1) top
|
|||
|
movel #IMGWIDTH*0x10000+IMGHEIGHT,a1@ | image size
|
|||
|
movel a1@+,a4@+
|
|||
|
|
|||
|
lea pc@(img_title),a2
|
|||
|
moveaw a2@+,a3 | only the lower word is valid
|
|||
|
|
|||
|
1: tstb a2@+ | skip human readable comment
|
|||
|
jne 1b
|
|||
|
lea a2@(4),a0 | image data here
|
|||
|
|
|||
|
moveq #0,d2 | (b) now have 0bit
|
|||
|
moveq #0,d3 | (w) input bit buffer
|
|||
|
|
|||
|
moveq #16,d4 | (b) output bit count
|
|||
|
moveq #IMGWIDTH*IMGHEIGHT/16+0xffffff00,d7
|
|||
|
|
|||
|
| d2.b: # bits in input buffer
|
|||
|
| d3.w: input buffer
|
|||
|
| d4.b: # bits in output buffer
|
|||
|
| d5.w: output buffer for plane 0
|
|||
|
| d6.w: output buffer for plane 1
|
|||
|
| d7.b: size count
|
|||
|
| a0: input data pointer
|
|||
|
|
|||
|
Lrunlen: | a run entry:
|
|||
|
| value (2bit)
|
|||
|
| length-1 (3bit)
|
|||
|
subqb #5,d2 | have enough bits?
|
|||
|
jcc Lhave5b | yes
|
|||
|
| fill byte
|
|||
|
cmpaw a0,a3 | the register order is significant
|
|||
|
| for word comparison
|
|||
|
jne 1f
|
|||
|
lea pc@(disklabel),a0 | continue to disklabel area?
|
|||
|
cmpiw #0x696d,a0@+ | check magic number
|
|||
|
jne Lrxabort | no, abort (no image)
|
|||
|
1: moveb a0@+,d0
|
|||
|
addqb #8,d2 | d2: 3: have 0bit, ..., 7: have 4bit
|
|||
|
lslw #8,d0 | clear unused bits
|
|||
|
lsrw d2,d0
|
|||
|
orw d0,d3
|
|||
|
|
|||
|
Lhave5b: | field# 19 20 21 22 23 24 25 26 27 28 29 30 31
|
|||
|
| d3: ... v v l l l ? ? ? ? ? ? ? 0
|
|||
|
bfexts d3{#19,#2},d0 | value
|
|||
|
bfextu d3{#21,#3},d1 | length - 1
|
|||
|
lslw #5,d3
|
|||
|
|
|||
|
Lrxloop: lslw #2,d6
|
|||
|
bfins d0,d6{#30,#2}
|
|||
|
roxrw #1,d6
|
|||
|
roxlw #1,d5
|
|||
|
subqb #1,d4
|
|||
|
jne 1f
|
|||
|
moveq #16,d4
|
|||
|
movew d5,a1@+
|
|||
|
movew d6,a4@+
|
|||
|
subqb #1,d7 | end?
|
|||
|
1: dbeq d1,Lrxloop | fall down if end
|
|||
|
jne Lrunlen | fall down if end
|
|||
|
|
|||
|
moveq #1,d1
|
|||
|
movew a2@+,d2
|
|||
|
IOCS(__TPALET2)
|
|||
|
moveq #2,d1
|
|||
|
movew a2@,d2
|
|||
|
IOCS(__TPALET2)
|
|||
|
|
|||
|
| moveq #0x02,d1 | plane 1 (already have it)
|
|||
|
IOCS(__TCOLOR)
|
|||
|
moveq #IMGXPOS,d1
|
|||
|
moveq #IMGYPOS,d2
|
|||
|
IOCS(__TEXTPUT)
|
|||
|
moveq #0x01,d1 | plane 0
|
|||
|
IOCS(__TCOLOR)
|
|||
|
moveq #IMGXPOS,d1
|
|||
|
lea a6@(-(IMGWIDTH*IMGHEIGHT/8*2+8)),a1
|
|||
|
IOCS(__TEXTPUT)
|
|||
|
|
|||
|
Lrxabort: moveml sp@+,d2-d7/a2-a4
|
|||
|
unlk a6
|
|||
|
rts
|
|||
|
#endif
|
|||
|
|
|||
|
#if 0
|
|||
|
|IOCS SYS_STAT $AC
|
|||
|
|
|
|||
|
|<EFBFBD><EFBFBD><EFBFBD><EFBFBD> d1.l=0 <EFBFBD>ΤȤ<EFBFBD> d0.l <EFBFBD>˰ʲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
| bit0<EFBFBD><EFBFBD>7 0:68000, 1:68010, 2:68020, 3:68030
|
|||
|
| bit14 0:MMU<EFBFBD>ʤ<EFBFBD>, 1:MMU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
| bit15 0:FPCP<EFBFBD>ʤ<EFBFBD>, 1:FPCP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
| bit16<EFBFBD><EFBFBD>31 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>å<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
| X68000 <EFBFBD><EFBFBD> IOCS <EFBFBD>ˤ<EFBFBD> $AC <EFBFBD>Ϥʤ<EFBFBD><EFBFBD>Τǥ<EFBFBD><EFBFBD>顼<EFBFBD>ˤʤ<EFBFBD><EFBFBD>ޤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Xellent30 <EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|<EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> SRAM <EFBFBD><EFBFBD><EFBFBD>Ȥ߹<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ޤ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
.globl _SYS_STAT
|
|||
|
_SYS_STAT:
|
|||
|
movel sp@(4),d1
|
|||
|
IOCS(__SYS_STAT)
|
|||
|
rts
|
|||
|
|
|||
|
.globl _getcpu
|
|||
|
_getcpu:
|
|||
|
movl #0x200,d0 | data freeze bit
|
|||
|
movc d0,cacr | only exists on 68030
|
|||
|
movc cacr,d0 | read it back
|
|||
|
tstl d0 | zero?
|
|||
|
jeq Lnot68030 | yes, we have 68020/68040
|
|||
|
movq #3,d0 | 68030
|
|||
|
rts
|
|||
|
Lnot68030:
|
|||
|
bset #31,d0 | data cache enable bit
|
|||
|
movc d0,cacr | only exists on 68040
|
|||
|
movc cacr,d0 | read it back
|
|||
|
tstl d0 | zero?
|
|||
|
jeq Lis68020 | yes, we have 68020
|
|||
|
moveq #0,d0 | now turn it back off
|
|||
|
movec d0,cacr | before we access any data
|
|||
|
movq #4,d0 | 68040
|
|||
|
rts
|
|||
|
Lis68020:
|
|||
|
movq #2,d0 | 68020
|
|||
|
rts
|
|||
|
#endif
|
|||
|
|
|||
|
|
|
|||
|
| void memcpy(void *dst, const void *src, size_t count);
|
|||
|
| void memmove(void *dst, const void *src, size_t count);
|
|||
|
|
|
|||
|
| small and slow memcpy...
|
|||
|
| THIS FUNCTION DOES NOT CONFORM THE ANSI STANDARD
|
|||
|
|
|
|||
|
.globl _memcpy, _memmove
|
|||
|
_memcpy:
|
|||
|
_memmove:
|
|||
|
lea sp@(12),a1
|
|||
|
movel a1@,d1 | count
|
|||
|
jeq Lmcpret
|
|||
|
moveal a1@-,a0 | src
|
|||
|
moveal a1@-,a1 | dest
|
|||
|
cmpl a1,a0
|
|||
|
jcc Lmcpfw
|
|||
|
| copy backward
|
|||
|
addal d1,a0
|
|||
|
addal d1,a1
|
|||
|
1: moveb a0@-,a1@-
|
|||
|
subql #1,d1
|
|||
|
jne 1b
|
|||
|
jra Lmcpret
|
|||
|
Lmcpfw: | copy forward
|
|||
|
1: moveb a0@+,a1@+
|
|||
|
subql #1,d1
|
|||
|
jne 1b
|
|||
|
Lmcpret:
|
|||
|
| movel sp@(8),d0 | uncomment this to conform ANSI
|
|||
|
rts
|
|||
|
|
|||
|
|
|
|||
|
| Copy and exec kernel
|
|||
|
|
|
|||
|
#include "../common/execkern.S"
|
|||
|
|
|||
|
|
|
|||
|
| Title message
|
|||
|
|
|
|||
|
msg_title:
|
|||
|
.byte 0x1a | clear screen and cursor home
|
|||
|
.ascii "\033[3;4H" | move cursor to 4, 3
|
|||
|
.ascii "\033[37m" | bold
|
|||
|
.ascii "NetBSD boot"
|
|||
|
.ascii "\033[m" | normal
|
|||
|
.ascii " ("
|
|||
|
.ascii BOOT
|
|||
|
.ascii " "
|
|||
|
.ascii BOOT_VERS
|
|||
|
#ifdef BOOT_DEBUG
|
|||
|
.ascii "/DEBUG"
|
|||
|
#endif
|
|||
|
#ifndef TITLE_IMAGE
|
|||
|
.ascii "/no title image"
|
|||
|
#endif
|
|||
|
.ascii ")"
|
|||
|
.asciz "\r\n\n"
|
|||
|
.even
|
|||
|
|
|||
|
#ifdef TITLE_IMAGE
|
|||
|
|
|
|||
|
| Title Image
|
|||
|
|
|
|||
|
img_title:
|
|||
|
.word imgend1
|
|||
|
#ifdef BOOT_DEBUG
|
|||
|
.space 200 | no space for BSD Daemon...
|
|||
|
#else
|
|||
|
| compressed image data
|
|||
|
|
|||
|
| BSD Daemon Image, used for NetBSD boot by permission.
|
|||
|
| (Thanks for permission!)
|
|||
|
|
|||
|
| BSD Daemon Copyright 1988 by Marshall Kirk McKusick.
|
|||
|
| All Rights Reserved.
|
|||
|
|
|
|||
|
| Permission to use the daemon may be obtained from:
|
|||
|
| Marshall Kirk McKusick
|
|||
|
| 1614 Oxford St
|
|||
|
| Berkeley, CA 94709-1608
|
|||
|
| USA
|
|||
|
| or via email at mckusick@mckusick.com
|
|||
|
|
|||
|
| Human readable copyright notice to be found with strings(1).
|
|||
|
| Terminate with a nul character.
|
|||
|
|
|||
|
.asciz "\nBSD Daemon Copyright 1988 by Marshall Kirk McKusick."
|
|||
|
|
|||
|
.word 0x5295,0xAD6A | palet1, palet2
|
|||
|
.word 0x39c3,0x0c1c,0xd039,0xce71,0xa327,0x3830,0x739c,0xe146
|
|||
|
.word 0x6073,0x8227,0x39ce,0x0865,0x0738,0x2184,0x1ce7,0x3233
|
|||
|
.word 0x049c,0xe88a,0x0e73,0x9618,0x8271,0x0486,0x6646,0x2093
|
|||
|
.word 0x9ce4,0xcc12,0x1461,0x1622,0x3104,0x9ce7,0x2653,0x10e2
|
|||
|
.word 0x4158,0x91a8,0x24e7,0x38d1,0x9807,0x00c8,0x7216,0x6a29
|
|||
|
.word 0x39ce,0x4440,0x1906,0x4190,0xe031,0xe452,0x739c,0x9006
|
|||
|
.word 0x8180,0xec18,0x0221,0xc8a0,0xe739,0xb60c,0x0380,0xdc35
|
|||
|
.word 0x149c,0xe724,0x01b0,0x601d,0x062c,0x939c,0xe6c8,0x700c
|
|||
|
.word 0x0b60,0xcc58,0x739c,0xf81e,0x09a0,0x6a49,0x39ce,0x6803
|
|||
|
.word 0x00c0,0x701c,0x0740,0xd4d0,0x739c,0xd806,0x0100,0xe038
|
|||
|
.word 0x0e81,0xb924,0xe726,0x0d0c,0x20e2,0xc839,0x249c,0xe4c4
|
|||
|
.word 0x0ba4,0x0b42,0xc811,0xc920,0xe73c,0x070e,0x0383,0x44b5
|
|||
|
.word 0x241c,0xe3c8,0x6228,0x701b,0x023f,0x8924,0xe726,0x0501
|
|||
|
.word 0xc301,0xc8d3,0xfc49,0x0739,0xa01c,0x1219,0x0fc9,0x8924
|
|||
|
.word 0xe716,0x2028,0x64a8,0xc441,0xc147,0x3249,0xce4c,0x0e38
|
|||
|
.word 0x2a24,0x58ea,0x4939,0xcd00,0xe208,0x860a,0x8bea,0x0c39
|
|||
|
.word 0xce09,0x0608,0x8e10,0x3449,0x1aa2,0x4e73,0x9d3a,0x4111
|
|||
|
.word 0xfc45,0x2739,0xcb0c,0xa308,0x0205,0x0fea,0x2939,0xce4d
|
|||
|
.word 0x2030,0x4823,0xfdc1,0x4739,0xc68c,0x4100,0x4490,0x0c8f
|
|||
|
.word 0x70cc,0x5473,0x9ce0,0x8a22,0x1866,0x078a,0x4e72,0x6c7b
|
|||
|
.word 0x0260,0x9e03,0xc148,0x780f,0xc090,0xc970,0x04c5,0x5c06
|
|||
|
.word 0x45a1,0x641a,0x0e47,0xa1ec,0x7903,0xd03c,0x8310,0x0643
|
|||
|
.word 0x91e0,0x3926,0x47b1,0xe408,0x3e05,0x9044,0x190e,0x4780
|
|||
|
.word 0xe49a,0x0c38,0x2c1c,0x390e,0x8100,0x683a,0x2689,0xa0c3
|
|||
|
.word 0x00d0,0x722d,0x0780,0xc8b4,0x2d8f,0x25d0,0x721c,0x8720
|
|||
|
.word 0xc872,0x1c8b,0xa5d8,0xb25d,0x0721,0xd032,0x0c87,0x21c8
|
|||
|
.word 0xb22c,0x8141,0xd872,0x5c86,0x1916,0xc190,0xe43a,0x0e81
|
|||
|
.word 0x0403,0x2188,0x740d,0x1341,0xc8f6,0x0d8f,0x22d0,0x220c
|
|||
|
.word 0x8300,0x9032,0x0c97,0x300e,0x49a0,0x6478,0x0645,0x91e8
|
|||
|
.word 0x1816,0x0190,0x647b,0x1649,0x90e8,0x380e,0x4180,0x645a
|
|||
|
.word 0x0e83,0x90e4,0x3b1e,0xc981,0x6c79,0x07c5,0xd0f8,0x2939
|
|||
|
.word 0xc523,0x8946,0x820d,0x0c45,0x070f,0x6192,0xde08,0x3832
|
|||
|
.word 0x0572,0x083c,0x3920,0x721a,0x9ac8,0x8868,0xf889,0xc160
|
|||
|
.word 0x4377,0x8a84,0x88ee,0xd891,0xc2b0,0x2200,0xb2a2,0xa1c3
|
|||
|
.word 0x10dc,0x1564,0x1ce3,0x79c6,0x9022,0x2258,0x1073,0x9ce7
|
|||
|
.word 0x2a20,0x701c
|
|||
|
.even
|
|||
|
.space IMAGE_EXTRA | allow larger image
|
|||
|
.even
|
|||
|
#endif
|
|||
|
imgend1:
|
|||
|
#endif /* TITLE_IMAGE */
|
|||
|
|
|||
|
|
|
|||
|
| global variables
|
|||
|
|
|
|||
|
.comm _ID,4 | SCSI ID
|
|||
|
.comm _BOOT_INFO,4 | result of IOCS(__BOOTINF)
|
|||
|
.comm _FDMODE,4 | Floppy access mode: PDA x 256 + MODE
|
|||
|
.comm _FDSECMINMAX,8 | +0: (min sector) sector length
|
|||
|
| +1: (min sector) track #
|
|||
|
| +2: (min sector) side
|
|||
|
| +3: (min sector) sector #
|
|||
|
| +4: (max sector) sector length
|
|||
|
| +5: (max sector) track #
|
|||
|
| +6: (max sector) side
|
|||
|
| +7: (max sector) sector #
|
|||
|
#ifdef SCSI_ADHOC_BOOTPART
|
|||
|
.comm _SCSI_PARTTOP,4 | top position of boot partition in sector
|
|||
|
.comm _SCSI_BLKLEN,4 | sector len 0: 256, 1: 512, 2: 1024
|
|||
|
#endif
|