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

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