wok annotate memtest/stuff/unpack.S @ rev 19391

memtest: tiny shrink
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Aug 27 12:07:37 2016 +0200 (2016-08-27)
parents b6771e9696d7
children ebf8313df61f
rev   line source
pascal@15188 1 #define TOP (0x90000+_start-end)
pascal@13288 2 #define SYSTEM 0x10000
pascal@13288 3 #define SETUP 4
pascal@15188 4 #define SYSSIZE 0x1F4
pascal@15188 5 #define SETUPSIZE 0x1F1
pascal@13288 6
pascal@15188 7 #define CHANGE_STACK 0
pascal@15188 8 #define LINUX_HEADER 0
pascal@15188 9 #define UPDATE_SYSSIZE 1
pascal@15188 10 #define HARDCODED_SYSSIZE 1
pascal@15188 11 #define HARDCODED_SETUPSIZE 1
pascal@15188 12 #define HARDCODED_IP 1
pascal@19391 13 #define SHUTDOWNDOS 0
pascal@19391 14 #define FLAT16 1
pascal@19391 15 //#define FLAT16OUT 0
pascal@13269 16
pascal@13269 17 .text
pascal@13269 18 .code16
pascal@13269 19 .org 0
pascal@13269 20
pascal@13269 21 .globl _start
pascal@13269 22 _start:
pascal@13289 23 #if LINUX_HEADER
pascal@13289 24 jmp start2
pascal@13289 25 .ascii "HdrS" // 202 magic
pascal@13289 26 .word 0x200 // 206 version 2.00
pascal@13289 27 .long 0 // 208 realmode_swtch
pascal@13289 28 .word SYSTEM/16 // 20C start_sys_seg
pascal@13289 29 .word 0 // 20E kernel_version
pascal@13289 30 .byte 0 // 210 type_of_loader
pascal@13289 31 .byte 0 // 211 loadflags
pascal@13289 32 .word 0 // 212 setup_move_size
pascal@13289 33 .long SYSTEM // 214 code32_start
pascal@13289 34 .long 0 // 218 ramdisk_image
pascal@13289 35 .long 0 // 21C ramdisk_size
pascal@13289 36 .long 0 // 220 bootsect_kludge
pascal@13289 37 start2:
pascal@13289 38 #endif
pascal@13269 39 pushf
pascal@13269 40 pushw %cs
pascal@15188 41 #if HARDCODED_IP
pascal@15188 42 pushw $0
pascal@15188 43 #else
pascal@13269 44 call getip
pascal@13269 45 getip:
pascal@15188 46 #endif
pascal@13269 47 pushal
pascal@19391 48 #if SHUTDOWNDOS
pascal@19391 49 xorw %si, %si
pascal@19391 50 movw %si, %ds # %ds = 0
pascal@19391 51 pushl 4(%si)
pascal@19391 52 movw %sp, %cs:loadsp19+1(%si)
pascal@19391 53 cmpb $0xF0, 7(%si)
pascal@19391 54 jnb notdos
pascal@19391 55 movw $step19, 4(%si)
pascal@19391 56 movw %cs, 6(%si)
pascal@19391 57 pushfw
pascal@19391 58 popw %ax
pascal@19391 59 incb %ah # set TF
pascal@19391 60 pushw %ax
pascal@19391 61 popfw
pascal@19391 62 ljmp *4*0x19(%si)
pascal@19391 63 step19:
pascal@19391 64 pushw %si
pascal@19391 65 pushw %ds
pascal@19391 66 movw %sp, %si
pascal@19391 67 ldsw %ss:4(%si), %si
pascal@19391 68 cmpw $0x19CD, (%si)
pascal@19391 69 popw %ds
pascal@19391 70 popw %si
pascal@19391 71 jne doiret
pascal@19391 72 xorw %si, %si
pascal@19391 73 mov %si, %ds
pascal@19391 74 popl 4*0x19(%si)
pascal@19391 75 notdos:
pascal@19391 76 loadsp19:
pascal@19391 77 movw $0, %sp
pascal@19391 78 popl 4(%si)
pascal@19391 79 pushw %ss
pascal@19391 80 popw %ds
pascal@19391 81 #endif
pascal@19391 82 #if !FLAT16
pascal@19391 83 #undef FLAT16
pascal@15188 84 #if HARDCODED_SYSSIZE
pascal@15188 85 packed_syssize:
pascal@15188 86 movw $0, %bx // system size
pascal@15188 87 #else
pascal@15188 88 movw SYSSIZE, %bx
pascal@15188 89 #endif
pascal@19391 90 #endif
pascal@15188 91 #if HARDCODED_SETUPSIZE == 0
pascal@15188 92 xorw %dx, %dx
pascal@15188 93 movb SETUPSIZE, %dh
pascal@15188 94 #endif
pascal@15188 95 #if HARDCODED_IP
pascal@15188 96 xorw %si, %si
pascal@15188 97 #else
pascal@13269 98 movw %sp, %bp
pascal@13269 99 #define START_IP 32(%bp)
pascal@15188 100 subw $getip-_start, START_IP
pascal@15188 101 movw START_IP, %si
pascal@15188 102 #endif
pascal@13269 103 pushw %ds
pascal@13269 104 pushw %es
pascal@13269 105
pascal@13269 106 cld
pascal@19391 107
pascal@19391 108 #if FLAT16
pascal@19391 109 flat16mv:
pascal@19391 110 #if CHANGE_STACK
pascal@19391 111 STKSZ=0x9000-0x0990
pascal@19391 112 pushw $(TOP-STKSZ)/16-0x1000
pascal@19391 113 #else
pascal@19391 114 pushw $TOP/16-0x1000
pascal@19391 115 #endif
pascal@19391 116 popw %es
pascal@19391 117 pushw %es // moved
pascal@19391 118 .byte 0x6A, moved-_start // unpack code
pascal@19391 119 pushw %cs
pascal@19391 120 popw %ds
pascal@19391 121 xorw %di, %di
pascal@19391 122 #if HARDCODED_SETUPSIZE
pascal@19391 123 movw $SETUP*256, %cx
pascal@19391 124 #else
pascal@19391 125 xorw %cx, %cx
pascal@19391 126 movw SETUPSIZE, %ch
pascal@19391 127 #endif
pascal@19391 128 pushw %si
pascal@19391 129 rep
pascal@19391 130 movsw // move header part
pascal@19391 131 movw $0x1000, %bp
pascal@19391 132 movw %bp, %ds
pascal@19391 133 xorw %si, %si
pascal@19391 134 subw %di, %cx
pascal@19391 135 rep
pascal@19391 136 movsb // move system part
pascal@19391 137 popw %di
pascal@19391 138 movw $end-_start, %si
pascal@19391 139 #else
pascal@15188 140 #if CHANGE_STACK
pascal@15188 141 STKSZ=0x9000-0x0990
pascal@15188 142 movw $(TOP-STKSZ)/16, %ax
pascal@15188 143 #else
pascal@15188 144 movw $TOP/16, %ax
pascal@15188 145 #endif
pascal@15188 146 movw %ax, %es
pascal@15188 147 pushw %es // moved
pascal@15188 148 .byte 0x6A, moved-_start // unpack code
pascal@13269 149 pushw %cs
pascal@13269 150 popw %ds
pascal@15188 151 xorw %di, %di
pascal@13269 152 movw $end-_start, %cx
pascal@19391 153 pushw %cx
pascal@15188 154 pushw %si
pascal@13269 155 rep
pascal@13269 156 movsb // move upack code to $TOP
pascal@15188 157
pascal@15188 158 leaw SYSTEM/16(%bx), %bp
pascal@15188 159 movlp:
pascal@15188 160 decw %bp
pascal@15188 161 movw %bp, %ds
pascal@15188 162 decw %ax
pascal@13269 163 movw %ax, %es
pascal@13269 164 xorw %si, %si
pascal@13269 165 xorw %di, %di
pascal@15188 166 movb $8, %cl
pascal@13269 167 rep
pascal@13269 168 movsw // move system part
pascal@13269 169 decw %bx
pascal@15188 170 jnz movlp
pascal@15188 171
pascal@15188 172 pushw %cs
pascal@15188 173 popw %ds
pascal@15188 174 popw %si
pascal@15188 175 xorw %di, %di
pascal@15188 176 #if HARDCODED_SETUPSIZE
pascal@15188 177 movb $SETUP, %ch
pascal@15188 178 subw $SETUP*32, %ax
pascal@15188 179 #else
pascal@15188 180 movb %dh, %ch
pascal@15188 181 shrw $3, %dx
pascal@15188 182 subw %dx, %ax
pascal@15188 183 #endif
pascal@15188 184 movw %ax, %es
pascal@15188 185 pushw %si
pascal@15188 186 rep
pascal@15188 187 movsw // move header part
pascal@19391 188 popw %di
pascal@19391 189 popw %si
pascal@19391 190 #endif
pascal@15188 191 pushw %es
pascal@15188 192 popw %ds
pascal@15188 193 pushw %cs
pascal@15188 194 popw %es // restore setup seg
pascal@13269 195 retf
pascal@13269 196
pascal@13269 197 moved:
pascal@13288 198 #if CHANGE_STACK
pascal@15188 199 movw $STKSZ, %ax // trick: %ss = %sp
pascal@13288 200 movw %ss, %bx
pascal@15188 201 pushw %ax
pascal@13288 202 popw %ss
pascal@13288 203 xchgw %ax, %sp
pascal@13288 204 pushw %bx // %ss
pascal@13288 205 pushw %ax // %sp
pascal@13288 206 #endif
pascal@15188 207 pushw %bp // SYSTEM/16
pascal@13269 208 call unpack // unpack setup
pascal@13269 209 popw %es
pascal@13269 210 xorw %di,%di
pascal@13269 211 call unpack // unpack system
pascal@13288 212 #if CHANGE_STACK
pascal@13288 213 popw %ax // %sp
pascal@13288 214 popw %ss
pascal@13288 215 xchgw %ax, %sp
pascal@13288 216 #endif
pascal@15188 217 #if UPDATE_SYSSIZE
pascal@15188 218 # if HARDCODED_SYSSIZE
pascal@15188 219 original_syssize:
pascal@15188 220 movw $0, %ax
pascal@15188 221 # else
pascal@15188 222 addw $15, %di
pascal@15188 223 shrw $4, %di
pascal@15188 224 movw %es, %ax
pascal@15188 225 addw %di, %ax
pascal@15188 226 subw $SYSTEM/16, %ax
pascal@15188 227 # endif
pascal@15188 228 #endif
pascal@13269 229 popw %es
pascal@13269 230 popw %ds
pascal@15188 231 #if UPDATE_SYSSIZE
pascal@15188 232 movw %ax, SYSSIZE
pascal@15193 233 # if HARDCODED_SETUPSIZE
pascal@15193 234 original_setupsize:
pascal@15193 235 movb $4, SETUPSIZE
pascal@15193 236 # endif
pascal@15188 237 #endif
pascal@13269 238 popal
pascal@13269 239 iret
pascal@13269 240
pascal@13269 241 unpack:
pascal@13288 242 #include "unlzma.S"
pascal@13269 243
pascal@13269 244 end: