summaryrefslogtreecommitdiff
path: root/bootblocks/minix_elks.c
blob: 8cce8e515b46a71f08aded44fbe71b2cde8aac8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152

#define __ASSEMBLY__

#asm
#include "minix.v"

! Must match minix.c ...
#define LOADSEG   (0x1000)

! Must match ELKS
#define ELKS_INITSEG	(0x0100)
#define ELKS_SYSSEG	(0x1000)

org minix_helper

  push	cs
  pop	ds
  xor	ax,ax
  mov	es,ax
  mov	ss,ax
  mov	sp,ax

  mov	cx,#$200		! Move 512 words
  mov	si,ax			! Current load address.
  mov	di,#minix_helper	! To the correct address.
  rep
   movsw

  mov	ds,ax
  jmpi	code,0

msg_p2:
  .asciz	"\r\nLoading ELKS kernel\r\n"

msg_p3:
  .asciz	"Starting ...\r\n"

aint_elks:
  .asciz	"Not an ELKS image!"

elks_name:
  .asciz	"linux"
  .byte		0,0,0,0,0,0,0,0,0

dispmsg:		! SI now has pointer to a message
  lodsb
  cmp	al,#0
  jz	EOS
  mov	bx,#7
  mov	ah,#$E		! Can't use $13 cause that's AT+ only!
  int	$10
  jmp	dispmsg
EOS:
  ret

code:
  mov	si,#msg_p2
  call	dispmsg

  mov	ax,minix_dinode		! In the same directory.
  mov	minix_inode,ax

  mov	cx,#14
  mov	si,#elks_name
  mov	di,#minix_bootfile
  rep
   movsb

  call	minix__loadprog
  				! Ok, now loaded "boot/linux" (or so)
  mov	si,#msg_p3
  call	dispmsg

  call	kill_motor		! For kernels without a floppy driver.
!
  mov	ax,#LOADSEG
  mov	ds,ax

  mov	ax,$1E6			! Check for ELKS magic number
  cmp	ax,#$4C45
  jnz	not_elks
  mov	ax,$1E8
  cmp	ax,#$534B
  jz	boot_it
not_elks:
  xor	ax,ax
  mov	ds,ax
  mov	si,#aint_elks
  call	dispmsg
  xor	ax,ax
  int	$16
  jmpi	$0,$FFFF

boot_it:
  mov	ax,#ELKS_INITSEG
  mov	es,ax

  mov	bl,497			! Fetch number of setup sects.
  xor	bh,bh
  inc	bx
  mov	ax,500			! Fetch system size
  mov	cl,#5
  add	ax,#31
  shr	ax,cl
  mov	dx,ax

looping:			! Put the setup where it belongs
  call	copy_sect
  dec	bx
  jnz	looping

  mov	ax,#ELKS_SYSSEG
  mov	es,ax

looping2:			! Put the body code in the right place.
  call	copy_sect
  dec	dx
  jnz	looping2
  
  ! Ok, everything should be where it belongs call it.
  mov	ax,#ELKS_INITSEG
  mov	ds,ax
  mov	es,ax
  mov	ss,ax
  mov	sp,#0x4000-12
  jmpi	0,ELKS_INITSEG+$20

copy_sect:
  mov	cx,#256
  xor	si,si
  xor	di,di
  rep
   movsw

  mov	ax,ds
  add	ax,#32
  mov	ds,ax
  mov	ax,es
  add	ax,#32
  mov	es,ax
  ret
  
kill_motor:
  push	dx
  mov	dx,#0x3f2
  xor	al, al
  outb
  pop	dx
  ret

#endasm