wok annotate memtest64/stuff/unpack.S @ rev 25514

Add memtest64
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Feb 16 14:18:05 2023 +0000 (16 months ago)
parents
children
rev   line source
pascal@25514 1 #define SYSTEM 0x10000
pascal@25514 2 #define SETUP 14
pascal@25514 3 #define SYSSIZE 0x1F4
pascal@25514 4 #define SETUPSIZE 0x1F1
pascal@25514 5
pascal@25514 6 #define KEEP_BOOTSECTOR 0
pascal@25514 7 #define LINUX_HEADER 0
pascal@25514 8 #define UPDATE_SYSSIZE 0
pascal@25514 9 #define FLAT16 1 // lzma case
pascal@25514 10 #define FLAT16OUT 0
pascal@25514 11 #define COPYTOHIGHMEM 0
pascal@25514 12 #define UPDATE_CODE32_START 1
pascal@25514 13 #define DOUBLE_PACKED 0
pascal@25514 14 #define SAVEREGS 0
pascal@25514 15 #define ELKS 0
pascal@25514 16
pascal@25514 17 .text
pascal@25514 18 .code16
pascal@25514 19 .org 0
pascal@25514 20
pascal@25514 21 #if KEEP_BOOTSECTOR
pascal@25514 22 #undef UPDATE_SYSSIZE
pascal@25514 23 #define UPDATE_SYSSIZE 0
pascal@25514 24 #endif
pascal@25514 25 #if ELKS
pascal@25514 26 .arch i8086
pascal@25514 27 #define FLAT16 1
pascal@25514 28 #define KEEP_BOOTSECTOR 1
pascal@25514 29 #define LINUX_HEADER 0
pascal@25514 30 #define SAVEREGS 0
pascal@25514 31 #define TOPSEG 0x2000
pascal@25514 32 #else
pascal@25514 33 #define TOPSEG 0x8000
pascal@25514 34 #endif
pascal@25514 35
pascal@25514 36 .macro pusham
pascal@25514 37 #if ELKS
pascal@25514 38 pushw %ax
pascal@25514 39 // movw %sp, %ax
pascal@25514 40 // incw %ax // emulate popa behaviour
pascal@25514 41 // incw %ax
pascal@25514 42 pushw %cx
pascal@25514 43 pushw %dx
pascal@25514 44 pushw %bx
pascal@25514 45 // pushw %ax // %sp
pascal@25514 46 pushw %bp
pascal@25514 47 pushw %si
pascal@25514 48 pushw %di
pascal@25514 49 #else
pascal@25514 50 pushaw
pascal@25514 51 #endif
pascal@25514 52 .endm
pascal@25514 53
pascal@25514 54 .macro popam
pascal@25514 55 #if ELKS
pascal@25514 56 popw %di
pascal@25514 57 popw %si
pascal@25514 58 popw %bp
pascal@25514 59 // popw %ax
pascal@25514 60 popw %bx
pascal@25514 61 popw %dx
pascal@25514 62 popw %cx
pascal@25514 63 popw %ax
pascal@25514 64 #else
pascal@25514 65 popaw
pascal@25514 66 #endif
pascal@25514 67 .endm
pascal@25514 68
pascal@25514 69 .macro pushm val
pascal@25514 70 #if ELKS
pascal@25514 71 movw \val, %ax
pascal@25514 72 pushw %ax
pascal@25514 73 #else
pascal@25514 74 pushw \val
pascal@25514 75 #endif
pascal@25514 76 .endm
pascal@25514 77
pascal@25514 78 .macro shrwm cnt, reg
pascal@25514 79 #if ELKS
pascal@25514 80 .rept \cnt
pascal@25514 81 shrw $1, \reg
pascal@25514 82 .endr
pascal@25514 83 #else
pascal@25514 84 shrw $\cnt, \reg
pascal@25514 85 #endif
pascal@25514 86 .endm
pascal@25514 87
pascal@25514 88 .globl _start
pascal@25514 89 _start:
pascal@25514 90 #if LINUX_HEADER
pascal@25514 91 jmp start2
pascal@25514 92 .ascii "HdrS" // 202 magic
pascal@25514 93 .word 0x200 // 206 version 2.00
pascal@25514 94 .long 0 // 208 realmode_swtch
pascal@25514 95 .word SYSTEM/16 // 20C start_sys_seg
pascal@25514 96 .word 0 // 20E kernel_version
pascal@25514 97 .byte 0 // 210 type_of_loader
pascal@25514 98 .byte 0 // 211 loadflags
pascal@25514 99 .word 0 // 212 setup_move_size
pascal@25514 100 .long SYSTEM // 214 code32_start
pascal@25514 101 .long 0 // 218 ramdisk_image
pascal@25514 102 .long 0 // 21C ramdisk_size
pascal@25514 103 .long 0 // 220 bootsect_kludge
pascal@25514 104 start2:
pascal@25514 105 #endif
pascal@25514 106 #if SAVEREGS
pascal@25514 107 pushfw
pascal@25514 108 pushw %cs
pascal@25514 109 pushw $0
pascal@25514 110 pusham
pascal@25514 111 xorw %si, %si
pascal@25514 112 pushw %ds
pascal@25514 113 pushw %es
pascal@25514 114 cld
pascal@25514 115 #else
pascal@25514 116 pushw %cs // return adress is %cs:0
pascal@25514 117 xorw %si, %si
pascal@25514 118 pushw %si
pascal@25514 119 #endif // SAVEREGS
pascal@25514 120 pushw %ds // <A> bootsector+setup segment
pascal@25514 121 #if FLAT16
pascal@25514 122 # 1- move 9000..9020+stp -> TOPSEG
pascal@25514 123 pushm $TOPSEG
pascal@25514 124 popw %es
pascal@25514 125 # if SAVEREGS
pascal@25514 126 setup_word:
pascal@25514 127 movw $SETUP*256+256, %cx
pascal@25514 128 pushw %cx // <B> bootsector+setup words
pascal@25514 129 # endif
pascal@25514 130 pushw %es // <C> TOPSEG
pascal@25514 131 pushw %es
pascal@25514 132 # if SAVEREGS
pascal@25514 133 xorw %di, %di // %ds:%si = 9000:0000 %es:%di = TOPSEG:0
pascal@25514 134 pushm $0x200+cont
pascal@25514 135 rep
pascal@25514 136 movsw
pascal@25514 137 lret
pascal@25514 138 cont:
pascal@25514 139 # else
pascal@25514 140 movw $-0x200, %di
pascal@25514 141 call jumpinto
pascal@25514 142 # endif
pascal@25514 143 # 2- move 1000..1000+sys -> TOPSEG+stp
pascal@25514 144 pushm $0x1000
pascal@25514 145 popw %ds
pascal@25514 146 xorw %si, %si // %ds:%si = 1000:0
pascal@25514 147 subw %di, %cx // %cx = 64K - setupsz
pascal@25514 148 rep
pascal@25514 149 movsb
pascal@25514 150 # 3- unlz(TOPSEG+stp:end, 1000-stp:0)
pascal@25514 151 setup_seg:
pascal@25514 152 pushm $0x1000-(SETUP*32)-32
pascal@25514 153 popw %es
pascal@25514 154 #else // FLAT16
pascal@25514 155 # 1- move 9020..9020+unpack -> 0700 and jump into
pascal@25514 156 movw $0x700, %cx // Up to 3.5KB for unpacker (unlzma is << 1KB)
pascal@25514 157 movw %cx, %es // Use 7000 .. 7E00, keep up to 23 elks setup sectors
pascal@25514 158 pushw %es
pascal@25514 159 xorw %di, %di // %ds:%si = 9000:0000 %es:%di = 0700:0000
pascal@25514 160 pushm $0x200+cont
pascal@25514 161 # if SAVEREGS
pascal@25514 162 rep
pascal@25514 163 movsw
pascal@25514 164 lret
pascal@25514 165 # else
pascal@25514 166 jmp jumpinto
pascal@25514 167 # endif
pascal@25514 168 cont:
pascal@25514 169 # 2- move 9020..9020+stp -> 9000-sys-stp
pascal@25514 170 movw %ds, %dx
pascal@25514 171 setup_byte:
pascal@25514 172 movb $SETUP+1, %ch
pascal@25514 173 setup_para:
pascal@25514 174 subw $SETUP*32+32+0xF000, %dx
pascal@25514 175 packed_syssize:
pascal@25514 176 movw $0+0x1000, %ax
pascal@25514 177 pushw %cx // <B> bootsector+setup words
pascal@25514 178 subw %ax, %dx
pascal@25514 179 movw %dx, %es
pascal@25514 180 pushw %es // <C> 9000-sys-stp
pascal@25514 181 xorw %si, %si
pascal@25514 182 xorw %di, %di // %ds:%si = 9000:0 %es:%di = 9000-sys-stp:0
pascal@25514 183 rep
pascal@25514 184 movsw
pascal@25514 185 # 3- move 1000..1000+sys -> 9000-sys
pascal@25514 186 movw %ds, %dx
pascal@25514 187 mvsys:
pascal@25514 188 decw %ax
pascal@25514 189 decw %dx
pascal@25514 190 movw %ax, %ds
pascal@25514 191 movw %dx, %es
pascal@25514 192 xorw %si, %si
pascal@25514 193 xorw %di, %di
pascal@25514 194 movw $8, %cx
pascal@25514 195 rep
pascal@25514 196 movsw
pascal@25514 197 cmpw $0x1000, %ax
pascal@25514 198 jne mvsys
pascal@25514 199 # 4- unlz(9000-sys-stp:end, 1000-stp:0)
pascal@25514 200 setup_seg:
pascal@25514 201 pushm $0x1000-(SETUP*32)-32
pascal@25514 202 popw %es
pascal@25514 203 #endif // FLAT16
pascal@25514 204 popw %ds // <C>
pascal@25514 205 #if FLAT16 && SAVEREGS == 0
pascal@25514 206 movw $end-_start, %si // %ds:%si = TOPSSEG:compressed
pascal@25514 207 #else
pascal@25514 208 movw $0x200+end-_start, %si // %ds:%si = 9000-sys-stp:compressed
pascal@25514 209 #endif
pascal@25514 210 #if KEEP_BOOTSECTOR
pascal@25514 211 setup_keep:
pascal@25514 212 xorw %di, %di
pascal@25514 213 #else
pascal@25514 214 # if UPDATE_SYSSIZE
pascal@25514 215 setup_syssize:
pascal@25514 216 movw $0x1F4, %di // %es:%di = 1000-setup-bootsector:SYSSIZE
pascal@25514 217 # else
pascal@25514 218 movw $0x200, %di
pascal@25514 219 # endif
pascal@25514 220 #endif
pascal@25514 221 pushw %di
pascal@25514 222 pushw %es
pascal@25514 223 #if DOUBLE_PACKED
pascal@25514 224 double_packed:
pascal@25514 225 pushm $0x4000
pascal@25514 226 popw %es
pascal@25514 227 pushw %di
pascal@25514 228 pushw %es
pascal@25514 229 call unpack
pascal@25514 230 popw %ds
pascal@25514 231 popw %si
pascal@25514 232 popw %es
pascal@25514 233 popw %di
pascal@25514 234 pushw %di
pascal@25514 235 pushw %es
pascal@25514 236 #endif
pascal@25514 237 call unpack
pascal@25514 238 #if COPYTOHIGHMEM
pascal@25514 239 # if FLAT16OUT
pascal@25514 240 movw $0x9310+1, %ax // from 1000:FFFF
pascal@25514 241 # else
pascal@25514 242 # if 0
pascal@25514 243 movw %es, %ax
pascal@25514 244 shrw $12, %ax
pascal@25514 245 orw $0x9310, %ax
pascal@25514 246 # else
pascal@25514 247 movw $0x9310+7, %ax // from 7000:FFFF
pascal@25514 248 # endif
pascal@25514 249 # endif
pascal@25514 250 pushw %ss
pascal@25514 251 popw %es
pascal@25514 252 movw $8, %cx
pascal@25514 253 zero1:
pascal@25514 254 pushw $0 // 2E..20
pascal@25514 255 loop zero1
pascal@25514 256 src:
pascal@25514 257 pushw %cx // 1E, 16
pascal@25514 258 pushw %ax // 1A: dst %ax:%cx, 12: src %ax:%cx
pascal@25514 259 pushw %cx
pascal@25514 260 pushw $-1 // 18, 10: full 64K segment
pascal@25514 261 subb $0x10, %al
pascal@25514 262 jnc src
pascal@25514 263 movb $8, %cl
pascal@25514 264 zero2:
pascal@25514 265 pushw $0 // 0E..00
pascal@25514 266 loop zero2
pascal@25514 267 movw %sp, %si
pascal@25514 268 syslp:
pascal@25514 269 movb $0x80, %ch
pascal@25514 270 movb $0x87, %ah
pascal@25514 271 int $0x15
pascal@25514 272 # if FLAT16OUT == 0
pascal@25514 273 decb %es:0x1C(%si)
pascal@25514 274 decb %es:0x14(%si)
pascal@25514 275 jne syslp // down to 1000:0000
pascal@25514 276 # endif
pascal@25514 277 addw $0x30, %sp
pascal@25514 278 #endif // COPYTOHIGHMEM
pascal@25514 279 popw %ds
pascal@25514 280 popw %si // %ds:%si = 1000-setup-bootsector:SYSSIZE / 0
pascal@25514 281 #if UPDATE_CODE32_START
pascal@25514 282 update_code32_start:
pascal@25514 283 // movb $1, 0x216
pascal@25514 284 #endif
pascal@25514 285 #if FLAT16 == 0 || SAVEREGS
pascal@25514 286 popw %cx // <B> bootsector+setup words
pascal@25514 287 #endif
pascal@25514 288 popw %es // <A> bootsector+setup segment
pascal@25514 289 movw %si, %di
pascal@25514 290 jumpinto:
pascal@25514 291 #if FLAT16 && SAVEREGS == 0
pascal@25514 292 setup_word:
pascal@25514 293 movw $SETUP*256+256, %cx
pascal@25514 294 #endif
pascal@25514 295 # 5- move 1000-stp..1000 -> 9000
pascal@25514 296 rep
pascal@25514 297 movsw
pascal@25514 298 #if SAVEREGS
pascal@25514 299 popw %es
pascal@25514 300 popw %ds
pascal@25514 301 popam
pascal@25514 302 iret
pascal@25514 303 #else
pascal@25514 304 lret
pascal@25514 305 #endif
pascal@25514 306
pascal@25514 307 unpack:
pascal@25514 308 #define NO_LZMA_HEADER
pascal@25514 309 #define NO_LZSA2_HEADER
pascal@25514 310 #define NO_LZSA1_HEADER
pascal@25514 311 #define NO_LZ4_HEADER
pascal@25514 312 #if ELKS
pascal@25514 313 #define ONLY8086 1
pascal@25514 314 #endif
pascal@25514 315 #if defined(FLAT16OUT) && FLAT16OUT == 0
pascal@25514 316 #undef FLAT16OUT
pascal@25514 317 #endif
pascal@25514 318 #if defined(FLAT16) && FLAT16 == 0
pascal@25514 319 #undef FLAT16
pascal@25514 320 #endif
pascal@25514 321 #include "uncompress.S"
pascal@25514 322
pascal@25514 323 end: