wok annotate linld/stuff/src/JUMP.ASM @ rev 22008

linld: ipxe support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Oct 19 11:12:33 2019 +0200 (2019-10-19)
parents fcb1de9af8f7
children db46d017dfe4
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@21984 5 %PAGESIZE 1000
pascal@19515 6 %crefref
pascal@19515 7 %noincl
pascal@19515 8 %nomacs
pascal@19636 9 ifdef NO386
pascal@19636 10 p8086
pascal@19636 11 else
pascal@19515 12 p386
pascal@19636 13 endif
pascal@19515 14
pascal@21757 15 group DGROUP _TEXT,_BSS
pascal@19515 16 assume cs:DGROUP,ds:DGROUP
pascal@19515 17
pascal@19515 18 segment _BSS byte public use16 'BSS'
pascal@19515 19
pascal@19899 20 global _imgs:dword
pascal@19515 21
pascal@19515 22 ends _BSS
pascal@19515 23
pascal@19515 24
pascal@19515 25 segment _TEXT byte public use16 'CODE'
pascal@19515 26
pascal@19905 27 ;***************************************************************
pascal@20473 28 ;void dos_shutdown()
pascal@20473 29 ;***************************************************************
pascal@20473 30
pascal@20473 31 macro dos_shutdown
pascal@21342 32 xor si,si
pascal@21342 33 mov ds,si
pascal@20473 34 ifndef NO386
pascal@21342 35 push [dword si+4] ; save step
pascal@21342 36 mov [word si+4],offset step19
pascal@20473 37 else
pascal@20473 38 mov ax,offset step19
pascal@21342 39 xchg ax,[word si+4]
pascal@21342 40 push [word si+6]
pascal@20473 41 push ax ; save step
pascal@20473 42 endif
pascal@20473 43 mov [word cs:sssp],sp
pascal@21342 44 ;cmp [byte si+7],0F0h
pascal@20473 45 ;jnc notdos
pascal@21342 46 mov [si+6],cs
pascal@20473 47 pushf
pascal@20473 48 pushf
pascal@20473 49 pop ax
pascal@20473 50 inc ah ; set TF
pascal@20473 51 push ax
pascal@20473 52 popf
pascal@21342 53 call [dword si+4*19h]
pascal@20473 54 notdos:
pascal@20473 55 ifndef NO386
pascal@20473 56 lss sp,[dword cs:sssp]
pascal@20473 57 else
pascal@20473 58 lds ax,[dword cs:sssp]
pascal@20473 59 push ds
pascal@20473 60 pop ss
pascal@20473 61 xchg ax,sp
pascal@20473 62 endif
pascal@21342 63 xor si,si
pascal@21342 64 mov ds,si
pascal@21342 65 pop [dword si+4] ; restore step
pascal@20473 66 endm
pascal@20473 67 macro step19code
pascal@20473 68 step19:
pascal@21342 69 push si
pascal@20473 70 push ds
pascal@21342 71 mov si,sp
pascal@21342 72 lds si,[dword ss:si+4] ; read cs:ip
pascal@21342 73 cmp [word si],19CDh ; int 19h ?
pascal@20473 74 pop ds
pascal@21342 75 pop si
pascal@20473 76 je notdos
pascal@20473 77 iret
pascal@20473 78 endm
pascal@20473 79
pascal@20473 80
pascal@20473 81 ;***************************************************************
pascal@19905 82 ;void boot_kernel();
pascal@19905 83 ;****** Never returns
pascal@19905 84 ;***************************************************************
pascal@19903 85 global _boot_kernel:near
pascal@19905 86 proc _boot_kernel near
pascal@19905 87
pascal@21757 88 ifdef NO386
pascal@20142 89 p8086
pascal@19903 90 else
pascal@20142 91 p386
pascal@19903 92 endif
pascal@20473 93 ;cli ; we start doing destructive things to DOS
pascal@21757 94 extrn sssp:word
pascal@21757 95 mov es,[sssp+2]
pascal@19571 96 push es
pascal@19571 97 pop ss
pascal@19571 98 mov sp,0A000h
pascal@19636 99 extrn _rm_size:word
pascal@20745 100 ifdef NO386
pascal@20745 101 mov si,offset _rm_size-2 ; _rm_size, _pm_high, _rm_buf
pascal@20745 102 lodsw
pascal@20745 103 push ax ; _csip high
pascal@20745 104 push [word si-4] ; _csip low
pascal@21757 105 lodsw
pascal@20745 106 else
pascal@21757 107 mov si,offset _rm_size+2 ; _rm_size, _pm_high, _rm_buf
pascal@21757 108 push [dword si-6] ; _csip
pascal@20745 109 endif
pascal@19636 110 lodsb ; _pm_high
pascal@19571 111 extrn _cmdline:word
pascal@19571 112 mov si,[_cmdline]
pascal@19571 113 mov di,8000h
pascal@19571 114 mov ch,10h ; 4k
pascal@19571 115 rep
pascal@19571 116 movsb
pascal@20481 117 ifdef NO386
pascal@21984 118 mov bx,ss
pascal@20481 119 add bh,9
pascal@19637 120 push bx ; topseg()+0x0900
pascal@19637 121 else
pascal@19905 122 push 9800h+(4096/16) ; 4096 bytes for cmdline
pascal@19637 123 endif
pascal@20485 124 cmp al,cl ; load high ?
pascal@20485 125 pushf
pascal@19515 126 ; finish loading
pascal@19515 127 extrn @last_ditch$qv:near
pascal@21332 128 mov ax,[ss:024Ch]
pascal@21332 129 jne @@notzimage
pascal@21332 130 @@isipxe:
pascal@21342 131 dos_shutdown ; clear si; ds=0
pascal@20485 132 push cs
pascal@20485 133 pop ds
pascal@22008 134 push cs
pascal@22008 135 call @last_ditch$qv
pascal@21332 136 @@notzimage:
pascal@21332 137 xor ax,2b30h
pascal@21332 138 je @@isipxe
pascal@20485 139 popf
pascal@19515 140 ; self move
pascal@19571 141 ;cld
pascal@19538 142 pop es ; min 2048 bytes for stack
pascal@20485 143 jne @@isbzimage
pascal@20534 144 extrn gdt_data
pascal@20534 145 mov cx,offset gdt_data+8
pascal@21342 146 xor di,di ; A000 -9000 -0800(>movedend)
pascal@19515 147 rep
pascal@19515 148 movsb
pascal@21628 149 mov si,offset _imgs+2
pascal@21628 150 lodsw
pascal@21628 151 xchg ax,bx ; get pm->fallback low word
pascal@21628 152 lodsw ; get pm->fallback high word
pascal@20484 153 push es
pascal@20484 154 call near @@isbzimage ; pop cs ; ds=es=ss
pascal@20477 155
pascal@20477 156 ; prepare memcpy32 size & srcofs param to move zImage pm
pascal@21781 157 ifndef NO386
pascal@21781 158 push 8 ; size hi
pascal@21781 159 else
pascal@20477 160 mov dx,8
pascal@20477 161 push dx ; size hi
pascal@21781 162 endif
pascal@20477 163 push cx ; size lo=up to 512k
pascal@21628 164 push ax ; src ofs hi = pm.fallback
pascal@20477 165
pascal@19538 166 ;in al,70h
pascal@19538 167 ;or al,80h ; disable NMI
pascal@19538 168 ;out 70h,al
pascal@20477 169
pascal@21628 170 push bx ; src ofs lo
pascal@20485 171 xor di,di
pascal@20481 172 push di ; src seg=0
pascal@21628 173 inc cx
pascal@21628 174 push cx ; dst ofs hi
pascal@20481 175 push di ; dst ofs lo : 64k
pascal@20528 176 extrn memcpy32:near
pascal@20528 177 call memcpy32
pascal@19515 178
pascal@19515 179 ifndef noelks
pascal@19515 180 ifndef NO386
pascal@19515 181 cmp [dword 1E6h],'SKLE'
pascal@20473 182 jne @@notelks
pascal@20481 183 xor si,si
pascal@19515 184 else
pascal@20481 185 mov si,1E6h
pascal@20481 186 lodsw
pascal@20481 187 cmp ax,'LE'
pascal@19905 188 jne @@notelks
pascal@20481 189 lodsw
pascal@20481 190 xor ax,'SK'
pascal@20473 191 jne @@notelks
pascal@20481 192 xchg ax,si
pascal@19515 193 endif
pascal@21988 194 mov cx,100h ; DS=ES=SS=0100
pascal@21988 195 mov ss,cx
pascal@21988 196 mov es,cx
pascal@21998 197 mov cl,20h ; CS=0120
pascal@21998 198 push cx
pascal@20481 199 push si ; IP=0000
pascal@21998 200 mov ch,3Fh ; 05h min, 3Fh max
pascal@19515 201 rep
pascal@19515 202 movsw
pascal@19905 203 @@notelks:
pascal@19515 204 endif
pascal@19905 205 @@isbzimage:
pascal@19515 206 push ss
pascal@19515 207 pop ds
pascal@20475 208 push ss
pascal@20475 209 pop es
pascal@19636 210 ifndef NO386
pascal@19515 211 push ss
pascal@19515 212 pop fs
pascal@19515 213 push ss
pascal@19515 214 pop gs
pascal@19636 215 endif
pascal@19515 216 assume nothing
pascal@19515 217 assume cs:DGROUP
pascal@19515 218 retf
pascal@19515 219
pascal@20473 220 step19code
pascal@20477 221
pascal@20477 222 endp _boot_kernel
pascal@20477 223
pascal@19515 224 movedend:
pascal@19515 225
pascal@19515 226 ends _TEXT
pascal@19515 227
pascal@19515 228 end
pascal@19515 229
pascal@19515 230 ;###### END OF FILE ############################################