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

linld: add quick boot switch
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Feb 18 08:56:43 2021 +0000 (2021-02-18)
parents a946c1651082
children 61df94a0fa43
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@23983 15 group DGROUP _TEXT
pascal@19515 16 assume cs:DGROUP,ds:DGROUP
pascal@19515 17
pascal@19515 18 segment _TEXT byte public use16 'CODE'
pascal@19515 19
pascal@19905 20 ;***************************************************************
pascal@20473 21 ;void dos_shutdown()
pascal@20473 22 ;***************************************************************
pascal@20473 23
pascal@20473 24 macro dos_shutdown
pascal@21342 25 xor si,si
pascal@24013 26 ifdef QUICK_BOOT
pascal@24013 27 extrn _cmdnum:dword
pascal@24013 28 quickboot = (word _cmdnum+20)
pascal@24013 29 cmp si,[quickboot]
pascal@21342 30 mov ds,si
pascal@24013 31 jne skip_shutdown
pascal@24013 32 else
pascal@24013 33 mov ds,si
pascal@24013 34 endif
pascal@20473 35 ifndef NO386
pascal@21342 36 push [dword si+4] ; save step
pascal@21342 37 mov [word si+4],offset step19
pascal@20473 38 else
pascal@20473 39 mov ax,offset step19
pascal@21342 40 xchg ax,[word si+4]
pascal@21342 41 push [word si+6]
pascal@20473 42 push ax ; save step
pascal@20473 43 endif
pascal@20473 44 mov [word cs:sssp],sp
pascal@21342 45 ;cmp [byte si+7],0F0h
pascal@20473 46 ;jnc notdos
pascal@21342 47 mov [si+6],cs
pascal@20473 48 pushf
pascal@20473 49 pushf
pascal@20473 50 pop ax
pascal@20473 51 inc ah ; set TF
pascal@20473 52 push ax
pascal@20473 53 popf
pascal@21342 54 call [dword si+4*19h]
pascal@20473 55 notdos:
pascal@20473 56 ifndef NO386
pascal@20473 57 lss sp,[dword cs:sssp]
pascal@20473 58 else
pascal@20473 59 lds ax,[dword cs:sssp]
pascal@20473 60 push ds
pascal@20473 61 pop ss
pascal@20473 62 xchg ax,sp
pascal@20473 63 endif
pascal@21342 64 xor si,si
pascal@21342 65 mov ds,si
pascal@21342 66 pop [dword si+4] ; restore step
pascal@24013 67 skip_shutdown:
pascal@20473 68 endm
pascal@20473 69 macro step19code
pascal@20473 70 step19:
pascal@21342 71 push si
pascal@20473 72 push ds
pascal@21342 73 mov si,sp
pascal@21342 74 lds si,[dword ss:si+4] ; read cs:ip
pascal@21342 75 cmp [word si],19CDh ; int 19h ?
pascal@20473 76 pop ds
pascal@21342 77 pop si
pascal@20473 78 je notdos
pascal@20473 79 iret
pascal@20473 80 endm
pascal@20473 81
pascal@20473 82
pascal@20473 83 ;***************************************************************
pascal@19905 84 ;void boot_kernel();
pascal@19905 85 ;****** Never returns
pascal@19905 86 ;***************************************************************
pascal@19903 87 global _boot_kernel:near
pascal@19905 88 proc _boot_kernel near
pascal@19905 89
pascal@21757 90 ifdef NO386
pascal@20142 91 p8086
pascal@19903 92 else
pascal@20142 93 p386
pascal@19903 94 endif
pascal@20473 95 ;cli ; we start doing destructive things to DOS
pascal@21757 96 extrn sssp:word
pascal@22288 97 mov ax,[sssp+2]
pascal@22288 98 mov es,ax
pascal@23996 99 extrn _cmdstr:word
pascal@23996 100 _cmdline = _cmdstr+0
pascal@19571 101 mov si,[_cmdline]
pascal@19571 102 mov di,8000h
pascal@22288 103 mov cx,2000h ; 4k for cmdline + 4k up to sp
pascal@19571 104 rep
pascal@19571 105 movsb
pascal@22288 106 push es
pascal@22288 107 pop ss
pascal@22288 108 mov sp,di
pascal@22019 109
pascal@22288 110 mov dx,2000h
pascal@22288 111 global _csip_hilo:word
pascal@22288 112 org $-2
pascal@22288 113 _csip_hilo dw ?
pascal@22288 114 xchg al,dh ; 9020 / 9000
pascal@22288 115 push ax
pascal@22288 116 push dx ; 0000 / 0042
pascal@22288 117
pascal@22288 118 mov cl,1 ; load high ?
pascal@22179 119 org $-1
pascal@22288 120 global _pm_low:byte
pascal@22288 121 _pm_low db ?
pascal@22019 122 push cx
pascal@22019 123 mov ax,[word ss:024Ch]
pascal@22019 124 xor ax,2b30h ; ipxe ?
pascal@22019 125 loopne @@notipxe
pascal@22019 126
pascal@22019 127 ; finish loading
pascal@22019 128 extrn @last_ditch$qv:near
pascal@22008 129 push cs
pascal@22008 130 call @last_ditch$qv
pascal@22152 131 dos_shutdown ; clear si; ds=0; kill VCPI
pascal@22152 132 push cs
pascal@22152 133 pop ds
pascal@22019 134
pascal@22019 135 @@notipxe:
pascal@22019 136 pop cx
pascal@22019 137 loop @@isbzimage
pascal@22019 138
pascal@20477 139 ; prepare memcpy32 size & srcofs param to move zImage pm
pascal@21781 140 ifndef NO386
pascal@21781 141 push 8 ; size hi
pascal@21781 142 else
pascal@20477 143 mov dx,8
pascal@20477 144 push dx ; size hi
pascal@21781 145 endif
pascal@22288 146 push si ; size lo=up to 512k
pascal@23984 147
pascal@23984 148 include "himem.inc"
pascal@23984 149
pascal@23984 150 extrn _imgs:image_himem
pascal@23984 151 push [_imgs.fallback] ; src ofs = pm.fallback
pascal@20477 152
pascal@19538 153 ;in al,70h
pascal@19538 154 ;or al,80h ; disable NMI
pascal@19538 155 ;out 70h,al
pascal@20477 156
pascal@22288 157 push si ; src seg=0
pascal@21628 158 inc cx
pascal@21628 159 push cx ; dst ofs hi
pascal@24013 160 push si ; dst ofs lo : 64k = 0x10000
pascal@22288 161
pascal@22288 162 ; self move
pascal@22288 163 extrn gdt_data
pascal@22288 164 mov cx,offset gdt_data+8
pascal@22288 165 ;xor di,di ; A000 -9000 -0800(>movedend)
pascal@22288 166
pascal@22288 167 ifdef NO386
pascal@22288 168 mov ax,ss
pascal@22288 169 add ax,900h
pascal@22288 170 push ax ; topseg()+0x0900
pascal@22288 171 else
pascal@22288 172 push 9800h+(4096/16) ; 4096 bytes for cmdline
pascal@22288 173 endif
pascal@22288 174 pop es
pascal@22288 175 push es
pascal@22288 176
pascal@22288 177 call near @@movsb@jmp ; movsb; pop cs ; ds=es=ss
pascal@22288 178
pascal@20528 179 extrn memcpy32:near
pascal@20528 180 call memcpy32
pascal@19515 181
pascal@22176 182 ifdef MOVE_SETUP
pascal@22288 183 mov si,0
pascal@22288 184 global _rm_offset:word
pascal@22288 185 org $-2
pascal@22288 186 _rm_offset dw ?
pascal@22176 187 ;xor di,di
pascal@22288 188 ;mov cx,8000h
pascal@22176 189 ;sub cx,si
pascal@22288 190 ;rep
pascal@22288 191 ; movsb
pascal@22176 192 endif
pascal@22176 193
pascal@19515 194 ifndef noelks
pascal@22288 195 ifdef MOVE_SETUP
pascal@19515 196 ifndef NO386
pascal@22288 197 mov eax,[dword si+1E6h]
pascal@22288 198 xor eax,'SKLE'
pascal@22288 199 else
pascal@22288 200 mov ax,[si+1E6h]
pascal@22288 201 xor ax,'LE'
pascal@20473 202 jne @@notelks
pascal@22288 203 mov ax,[si+1E8h]
pascal@22288 204 xor ax,'SK'
pascal@22288 205 endif
pascal@19515 206 else
pascal@22288 207 ifndef NO386
pascal@22288 208 mov eax,[dword 1E6h]
pascal@22288 209 xor eax,'SKLE'
pascal@22288 210 else
pascal@22288 211 mov ax,[1E6h]
pascal@22288 212 xor ax,'LE'
pascal@19905 213 jne @@notelks
pascal@22288 214 mov ax,[1E8h]
pascal@20481 215 xor ax,'SK'
pascal@22288 216 endif
pascal@22288 217 endif
pascal@20473 218 jne @@notelks
pascal@22288 219 mov cx,100h ; DS=ES=SS=0100
pascal@22288 220 mov ss,cx
pascal@22288 221 push ss
pascal@22288 222 pop es
pascal@22288 223 mov cl,20h ; CS=0120
pascal@22288 224 push cx
pascal@22288 225 push ax ; IP=0000
pascal@19515 226 endif
pascal@22179 227 ifdef MOVE_SETUP
pascal@22288 228 @@notelks:
pascal@22288 229 mov ch,7Eh
pascal@22288 230 @@movsb@jmp:
pascal@22288 231 xor di,di
pascal@22288 232 rep
pascal@22288 233 movsb
pascal@22179 234 else
pascal@22288 235 ifndef noelks
pascal@22288 236 xchg ax,si
pascal@22288 237 mov ch,7Eh ; 0Ah min, 7Eh max
pascal@22288 238 @@movsb@jmp:
pascal@22288 239 xor di,di
pascal@19515 240 rep
pascal@22288 241 movsb
pascal@19905 242 @@notelks:
pascal@22288 243 endif
pascal@19515 244 endif
pascal@19905 245 @@isbzimage:
pascal@19515 246 push ss
pascal@19515 247 pop ds
pascal@20475 248 push ss
pascal@20475 249 pop es
pascal@19636 250 ifndef NO386
pascal@19515 251 push ss
pascal@19515 252 pop fs
pascal@19515 253 push ss
pascal@19515 254 pop gs
pascal@19636 255 endif
pascal@19515 256 assume nothing
pascal@19515 257 assume cs:DGROUP
pascal@19515 258 retf
pascal@19515 259
pascal@20473 260 step19code
pascal@20477 261
pascal@20477 262 endp _boot_kernel
pascal@20477 263
pascal@19515 264 movedend:
pascal@19515 265
pascal@19515 266 ends _TEXT
pascal@19515 267
pascal@19515 268 end
pascal@19515 269
pascal@19515 270 ;###### END OF FILE ############################################