wok annotate plop/stuff/unpack.S @ rev 25037

Up glza (0.11.4)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat May 21 21:38:29 2022 +0000 (2022-05-21)
parents
children 7f7bd3c9775e
rev   line source
pascal@23919 1 #define SYSTEM 0x10000
pascal@23919 2 #define SETUP 14
pascal@23919 3 #define SYSSIZE 0x1F4
pascal@23919 4 #define SETUPSIZE 0x1F1
pascal@23919 5
pascal@23919 6 #define KEEP_BOOTSECTOR 1
pascal@23919 7 #define LINUX_HEADER 0
pascal@23919 8 #define UPDATE_SYSSIZE 1
pascal@23919 9 #define HARDCODED_SYSSIZE 1
pascal@23919 10 #define HARDCODED_SETUPSIZE 1
pascal@23919 11 #define FLAT16 1
pascal@23919 12 #define FLAT16OUT 1
pascal@23919 13 #define SAVEREGS 0
pascal@23919 14 #define ELKS 0
pascal@23919 15
pascal@23919 16 .text
pascal@23919 17 .code16
pascal@23919 18 .org 0
pascal@23919 19
pascal@23919 20 #if KEEP_BOOTSECTOR
pascal@23919 21 #undef UPDATE_SYSSIZE
pascal@23919 22 #define UPDATE_SYSSIZE 0
pascal@23919 23 #endif
pascal@23919 24 #if defined(FLAT16OUT) && FLAT16OUT == 0
pascal@23919 25 #undef FLAT16OUT
pascal@23919 26 #endif
pascal@23919 27 #if ELKS
pascal@23919 28 .arch i8086
pascal@23919 29 #define FLAT16 1
pascal@23919 30 #define LINUX_HEADER 0
pascal@23919 31 #define SAVEREGS 0
pascal@23919 32 #define TOPSEG 0x2000
pascal@23919 33 #else
pascal@23919 34 #define TOPSEG 0x8000
pascal@23919 35 #endif
pascal@23919 36
pascal@23919 37 .globl _start
pascal@23919 38 _start:
pascal@23919 39 #if LINUX_HEADER
pascal@23919 40 jmp start2
pascal@23919 41 .ascii "HdrS" // 202 magic
pascal@23919 42 .word 0x200 // 206 version 2.00
pascal@23919 43 .long 0 // 208 realmode_swtch
pascal@23919 44 .word SYSTEM/16 // 20C start_sys_seg
pascal@23919 45 .word 0 // 20E kernel_version
pascal@23919 46 .byte 0 // 210 type_of_loader
pascal@23919 47 .byte 0 // 211 loadflags
pascal@23919 48 .word 0 // 212 setup_move_size
pascal@23919 49 .long SYSTEM // 214 code32_start
pascal@23919 50 .long 0 // 218 ramdisk_image
pascal@23919 51 .long 0 // 21C ramdisk_size
pascal@23919 52 .long 0 // 220 bootsect_kludge
pascal@23919 53 start2:
pascal@23919 54 #endif
pascal@23919 55 #if SAVEREGS
pascal@23919 56 pushfw
pascal@23919 57 pushw %cs
pascal@23919 58 pushw $0
pascal@23919 59 pushal
pascal@23919 60 pushw %ds
pascal@23919 61 cld
pascal@23919 62 #else
pascal@23919 63 pushw %cs
pascal@23919 64 # if FLAT16
pascal@23919 65 xorw %di, %di
pascal@23919 66 pushw %di
pascal@23919 67 # else
pascal@23919 68 pushw $0
pascal@23919 69 # endif
pascal@23919 70 #endif
pascal@23919 71 #if ELKS
pascal@23919 72 movw $0x100, %ax
pascal@23919 73 pushw %ax
pascal@23919 74 #else
pascal@23919 75 # if UPDATE_SYSSIZE || KEEP_BOOTSECTOR
pascal@23919 76 pushw %ds // <A>
pascal@23919 77 # else
pascal@23919 78 pushw %cs // <A>
pascal@23919 79 # endif
pascal@23919 80 #endif
pascal@23919 81 #if FLAT16
pascal@23919 82 # 1- move 9000/9020..9020+stp -> TOPSEG
pascal@23919 83 #if ELKS
pascal@23919 84 movb $TOPSEG/256, %ah
pascal@23919 85 movw %ax, %es
pascal@23919 86 #else
pascal@23919 87 pushw $TOPSEG
pascal@23919 88 popw %es
pascal@23919 89 #endif
pascal@23919 90 #if KEEP_BOOTSECTOR
pascal@23919 91 xorw %si, %si
pascal@23919 92 #else
pascal@23919 93 movw $0x200, %si
pascal@23919 94 #endif
pascal@23919 95 #if SAVEREGS == 0
pascal@23919 96 pushw %es
pascal@23919 97 #if ELKS
pascal@23919 98 # if KEEP_BOOTSECTOR
pascal@23919 99 movw $cont+0x200, %ax
pascal@23919 100 # else
pascal@23919 101 movw $cont, %ax
pascal@23919 102 # endif
pascal@23919 103 pushw %ax
pascal@23919 104 #else
pascal@23919 105 # if KEEP_BOOTSECTOR
pascal@23919 106 pushw $cont+0x200
pascal@23919 107 # else
pascal@23919 108 // pushw $cont
pascal@23919 109 .byte 0x6A, cont
pascal@23919 110 # endif
pascal@23919 111 #endif
pascal@23919 112 jmp jumpinto
pascal@23919 113 #else
pascal@23919 114 # if HARDCODED_SETUPSIZE
pascal@23919 115 setup_word:
pascal@23919 116 # if KEEP_BOOTSECTOR
pascal@23919 117 # else
pascal@23919 118 movw $SETUP*256, %cx
pascal@23919 119 # endif
pascal@23919 120 # else
pascal@23919 121 # if KEEP_BOOTSECTOR
pascal@23919 122 movw $0x100, %cx
pascal@23919 123 addb SETUPSIZE, %ch
pascal@23919 124 # else
pascal@23919 125 xorw %cx, %cx
pascal@23919 126 movb SETUPSIZE, %ch
pascal@23919 127 # endif
pascal@23919 128 movw %cx, %dx
pascal@23919 129 # endif
pascal@23919 130 pushw %cx // <B>
pascal@23919 131 pushw %es
pascal@23919 132 pushw %di
pascal@23919 133 rep
pascal@23919 134 movsw
pascal@23919 135 lret
pascal@23919 136 #endif
pascal@23919 137 cont:
pascal@23919 138 # 2- move 1000..1000+sys -> TOPSEG+stp
pascal@23919 139 #if ELKS
pascal@23919 140 movw $0x1000, %ax
pascal@23919 141 movw %ax, %ds
pascal@23919 142 #else
pascal@23919 143 pushw $0x1000
pascal@23919 144 popw %ds
pascal@23919 145 #endif
pascal@23919 146 xorw %si, %si
pascal@23919 147 subw %di, %cx
pascal@23919 148 rep
pascal@23919 149 movsb
pascal@23919 150 # 3- unlz(TOPSEG+stp:end, 1000-stp:0)
pascal@23919 151 pushw %es // <C>
pascal@23919 152 # if HARDCODED_SETUPSIZE
pascal@23919 153 setup_seg:
pascal@23919 154 #if ELKS
pascal@23919 155 # if KEEP_BOOTSECTOR
pascal@23919 156 # if UPDATE_SYSSIZE
pascal@23919 157 movw $0x1000-(SETUP*32)-32-32, %ax
pascal@23919 158 # else
pascal@23919 159 movw $0x1000-(SETUP*32)-32, %ax
pascal@23919 160 # endif
pascal@23919 161 # else
pascal@23919 162 # if UPDATE_SYSSIZE
pascal@23919 163 movw $0x1000-(SETUP*32)-32, %ax
pascal@23919 164 # else
pascal@23919 165 movw $0x1000-(SETUP*32), %ax
pascal@23919 166 # endif
pascal@23919 167 # endif
pascal@23919 168 movw %ax, %es
pascal@23919 169 #else
pascal@23919 170 # if KEEP_BOOTSECTOR
pascal@23919 171 # if UPDATE_SYSSIZE
pascal@23919 172 pushw $0x1000-(SETUP*32)-32-32
pascal@23919 173 # else
pascal@23919 174 pushw $0x1000-(SETUP*32)-32
pascal@23919 175 # endif
pascal@23919 176 # else
pascal@23919 177 # if UPDATE_SYSSIZE
pascal@23919 178 pushw $0x1000-(SETUP*32)-32
pascal@23919 179 # else
pascal@23919 180 pushw $0x1000-(SETUP*32)
pascal@23919 181 # endif
pascal@23919 182 # endif
pascal@23919 183 popw %es
pascal@23919 184 #endif
pascal@23919 185 # else
pascal@23919 186 # if UPDATE_SYSSIZE
pascal@23919 187 incb %dh
pascal@23919 188 # endif
pascal@23919 189 #if ELKS
pascal@23919 190 shrw $1, %dx
pascal@23919 191 shrw $1, %dx
pascal@23919 192 shrw $1, %dx
pascal@23919 193 #else
pascal@23919 194 shrw $3, %dx
pascal@23919 195 #endif
pascal@23919 196 movw %ds, %ax
pascal@23919 197 subw %dx, %ax
pascal@23919 198 movw %ax, %es
pascal@23919 199 # endif
pascal@23919 200 #else // FLAT16
pascal@23919 201 # 1- move 1000..1000+sys -> 9000-sys
pascal@23919 202 # if HARDCODED_SYSSIZE
pascal@23919 203 packed_syssize:
pascal@23919 204 movw $0x1000+0, %ax
pascal@23919 205 # else
pascal@23919 206 movw SYSSIZE, %ax
pascal@23919 207 addw $0x1000, %ax
pascal@23919 208 # endif
pascal@23919 209 movw %ds, %dx
pascal@23919 210 mvsys:
pascal@23919 211 decw %ax
pascal@23919 212 decw %dx
pascal@23919 213 movw %ax, %ds
pascal@23919 214 movw %dx, %es
pascal@23919 215 xorw %si, %si
pascal@23919 216 xorw %di, %di
pascal@23919 217 movw $8, %cx
pascal@23919 218 rep
pascal@23919 219 movsw
pascal@23919 220 cmpw $0x1000, %ax
pascal@23919 221 jne mvsys
pascal@23919 222 # 2- move 9000/9020..9020+stp -> 9000-sys-stp
pascal@23919 223
pascal@23919 224 # if HARDCODED_SETUPSIZE
pascal@23919 225 # if KEEP_BOOTSECTOR
pascal@23919 226 setup_byte:
pascal@23919 227 movb $SETUP+1, %ch
pascal@23919 228 setup_para:
pascal@23919 229 subw $SETUP*32+32, %dx
pascal@23919 230 # else
pascal@23919 231 setup_byte:
pascal@23919 232 movb $SETUP, %ch
pascal@23919 233 setup_para:
pascal@23919 234 subw $SETUP*32, %dx
pascal@23919 235 # endif
pascal@23919 236 # else
pascal@23919 237 movb %ss:SETUPSIZE, %ch
pascal@23919 238 # if KEEP_BOOTSECTOR
pascal@23919 239 incb $ch
pascal@23919 240 # endif
pascal@23919 241 movw %cx, %ax
pascal@23919 242 #if ELKS
pascal@23919 243 shrw $1, %ax
pascal@23919 244 shrw $1, %ax
pascal@23919 245 shrw $1, %ax
pascal@23919 246 #else
pascal@23919 247 shrw $3, %ax
pascal@23919 248 #endif
pascal@23919 249 subw %ax, %dx
pascal@23919 250 # endif
pascal@23919 251 pushw %cx // <B>
pascal@23919 252 movw %dx, %es
pascal@23919 253 xorw %si, %si
pascal@23919 254 xorw %di, %di
pascal@23919 255 rep
pascal@23919 256 movsw %cs:(%si),%es:(%di)
pascal@23919 257 pushw %es
pascal@23919 258 # 3- reloc itself in 0x7C00
pascal@23919 259 pushw $0x07C0
pascal@23919 260 popw %es
pascal@23919 261 movw $cont, %si
pascal@23919 262 movw %si, %di
pascal@23919 263 movw $end-_start, %cx
pascal@23919 264 pushw %es
pascal@23919 265 pushw %di
pascal@23919 266 rep
pascal@23919 267 movsb %cs:(%si),%es:(%di)
pascal@23919 268 lret
pascal@23919 269 cont:
pascal@23919 270 # 4- unlz(9000-sys-stp:end, 1000-stp:0)
pascal@23919 271 # if HARDCODED_SETUPSIZE
pascal@23919 272 setup_seg:
pascal@23919 273 # if KEEP_BOOTSECTOR
pascal@23919 274 # if UPDATE_SYSSIZE
pascal@23919 275 pushw $0x1000-(SETUP*32)-32-32
pascal@23919 276 # else
pascal@23919 277 pushw $0x1000-(SETUP*32)-32
pascal@23919 278 # endif
pascal@23919 279 # else
pascal@23919 280 # if UPDATE_SYSSIZE
pascal@23919 281 pushw $0x1000-(SETUP*32)-32
pascal@23919 282 # else
pascal@23919 283 pushw $0x1000-(SETUP*32)
pascal@23919 284 # endif
pascal@23919 285 # endif
pascal@23919 286 popw %es
pascal@23919 287 # else
pascal@23919 288 negw %ax
pascal@23919 289 # if UPDATE_SYSSIZE
pascal@23919 290 addw $0x1000-32, %ax
pascal@23919 291 # else
pascal@23919 292 addw $0x1000, %ax
pascal@23919 293 # endif
pascal@23919 294 movw %ax, %es
pascal@23919 295 # endif
pascal@23919 296 #endif // FLAT16
pascal@23919 297 popw %ds // <C>
pascal@23919 298 #if KEEP_BOOTSECTOR
pascal@23919 299 movw $0x200+end-_start, %si
pascal@23919 300 #else
pascal@23919 301 movw $end-_start, %si
pascal@23919 302 #endif
pascal@23919 303 #if UPDATE_SYSSIZE
pascal@23919 304 movw $SYSSIZE, %di
pascal@23919 305 #else
pascal@23919 306 xorw %di, %di
pascal@23919 307 #endif
pascal@23919 308 pushw %di
pascal@23919 309 pushw %es
pascal@23919 310 call unpack
pascal@23919 311 popw %ds
pascal@23919 312 popw %si
pascal@23919 313 # if KEEP_BOOTSECTOR
pascal@23919 314 setup_keep:
pascal@23919 315 xorw %di, %di
pascal@23919 316 # else
pascal@23919 317 movw %si, %di
pascal@23919 318 # endif
pascal@23919 319 # if SAVEREGS != 0
pascal@23919 320 popw %cx // <B>
pascal@23919 321 #if UPDATE_SYSSIZE
pascal@23919 322 // not need with memtest movb $(512-SYSSIZE)/2, %cl
pascal@23919 323 #endif
pascal@23919 324 popw %es // <A>
pascal@23919 325 # 5- move 1000-stp..1000 -> 9020
pascal@23919 326 # else
pascal@23919 327 popw %es // <A>
pascal@23919 328 jumpinto:
pascal@23919 329 # if HARDCODED_SETUPSIZE
pascal@23919 330 setup_word:
pascal@23919 331 # if KEEP_BOOTSECTOR
pascal@23919 332 movw $SETUP*256+256, %cx
pascal@23919 333 # else
pascal@23919 334 movw $SETUP*256, %cx
pascal@23919 335 # endif
pascal@23919 336 # else
pascal@23919 337 # if KEEP_BOOTSECTOR
pascal@23919 338 movw $0x100, %cx
pascal@23919 339 addb %ss:SETUPSIZE, %ch
pascal@23919 340 # else
pascal@23919 341 xorw %cx, %cx
pascal@23919 342 movb %ss:SETUPSIZE, %ch
pascal@23919 343 # endif
pascal@23919 344 movw %cx, %dx
pascal@23919 345 # endif
pascal@23919 346 # endif
pascal@23919 347 rep
pascal@23919 348 movsw
pascal@23919 349 #if SAVEREGS
pascal@23919 350 popw %ds
pascal@23919 351 popal
pascal@23919 352 iret
pascal@23919 353 #else
pascal@23919 354 lret
pascal@23919 355 #endif
pascal@23919 356
pascal@23919 357 unpack:
pascal@23919 358 #define NO_LZMA_HEADER
pascal@23919 359 #if ELKS
pascal@23919 360 #define ONLY8086 1
pascal@23919 361 #endif
pascal@23919 362 #include "unlzma.S"
pascal@23919 363
pascal@23919 364 end: