wok-current annotate memtest/stuff/unpack.S @ rev 19942

memtest: shrink unpack.S
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat May 06 08:25:09 2017 +0200 (2017-05-06)
parents 9e463ebef079
children 1421f93cc28a
rev   line source
pascal@15188 1 #define TOP (0x90000+_start-end)
pascal@13288 2 #define SYSTEM 0x10000
pascal@19404 3 #define SETUP 14
pascal@15188 4 #define SYSSIZE 0x1F4
pascal@15188 5 #define SETUPSIZE 0x1F1
pascal@13288 6
pascal@15188 7 #define LINUX_HEADER 0
pascal@15188 8 #define UPDATE_SYSSIZE 1
pascal@15188 9 #define HARDCODED_SYSSIZE 1
pascal@15188 10 #define HARDCODED_SETUPSIZE 1
pascal@19391 11 #define FLAT16 1
pascal@19391 12 //#define FLAT16OUT 0
pascal@19404 13 #define SAVEREGS 0
pascal@13269 14
pascal@13269 15 .text
pascal@13269 16 .code16
pascal@13269 17 .org 0
pascal@13269 18
pascal@13269 19 .globl _start
pascal@13269 20 _start:
pascal@13289 21 #if LINUX_HEADER
pascal@13289 22 jmp start2
pascal@13289 23 .ascii "HdrS" // 202 magic
pascal@13289 24 .word 0x200 // 206 version 2.00
pascal@13289 25 .long 0 // 208 realmode_swtch
pascal@13289 26 .word SYSTEM/16 // 20C start_sys_seg
pascal@13289 27 .word 0 // 20E kernel_version
pascal@13289 28 .byte 0 // 210 type_of_loader
pascal@13289 29 .byte 0 // 211 loadflags
pascal@13289 30 .word 0 // 212 setup_move_size
pascal@13289 31 .long SYSTEM // 214 code32_start
pascal@13289 32 .long 0 // 218 ramdisk_image
pascal@13289 33 .long 0 // 21C ramdisk_size
pascal@13289 34 .long 0 // 220 bootsect_kludge
pascal@13289 35 start2:
pascal@13289 36 #endif
pascal@19404 37 #if SAVEREGS
pascal@19404 38 pushfw
pascal@13269 39 pushw %cs
pascal@15188 40 pushw $0
pascal@19404 41 pushal
pascal@19404 42 pushw %ds
pascal@19942 43 cld
pascal@15188 44 #else
pascal@19404 45 pushw %cs
pascal@19942 46 # if FLAT16
pascal@19942 47 xorw %di, %di
pascal@19942 48 pushw %di
pascal@19942 49 # else
pascal@19404 50 pushw $0
pascal@19942 51 # endif
pascal@15188 52 #endif
pascal@19404 53 #if UPDATE_SYSSIZE
pascal@19942 54 pushw %ds // <A>
pascal@15188 55 #else
pascal@19942 56 pushw %cs // <A>
pascal@15188 57 #endif
pascal@19404 58 #if FLAT16
pascal@19404 59 # 1- move 9020..9020+stp -> 8000
pascal@19942 60 pushw $0x8000
pascal@19942 61 popw %es
pascal@19942 62 movw $0x200, %si
pascal@19942 63 #if SAVEREGS == 0
pascal@19942 64 pushw %es
pascal@19942 65 // pushw $cont
pascal@19942 66 .byte 0x6A, cont
pascal@19942 67 jmp jumpinto
pascal@19942 68 #else
pascal@19404 69 # if HARDCODED_SETUPSIZE
pascal@19404 70 setup_word:
pascal@19404 71 movw $SETUP*256, %cx
pascal@19404 72 # else
pascal@19404 73 xorw %cx, %cx
pascal@19404 74 movb SETUPSIZE, %ch
pascal@19404 75 movw %cx, %dx
pascal@19404 76 # endif
pascal@19942 77 pushw %cx // <B>
pascal@19942 78 pushw %es
pascal@19942 79 pushw %di
pascal@19404 80 rep
pascal@19942 81 movsw
pascal@19404 82 lret
pascal@19942 83 #endif
pascal@19404 84 cont:
pascal@19404 85 # 2- move 1000..1000+sys -> 8000+stp
pascal@19404 86 pushw $0x1000
pascal@19404 87 popw %ds
pascal@19391 88 xorw %si, %si
pascal@19391 89 subw %di, %cx
pascal@19391 90 rep
pascal@19404 91 movsb
pascal@19404 92 # 3- unlz(8000+stp:end, 1000-stp:0)
pascal@19942 93 pushw %es // <C>
pascal@19404 94 # if HARDCODED_SETUPSIZE
pascal@19404 95 setup_seg:
pascal@19404 96 # if UPDATE_SYSSIZE
pascal@19404 97 pushw $0x1000-(SETUP*32)-32
pascal@19404 98 # else
pascal@19404 99 pushw $0x1000-(SETUP*32)
pascal@19404 100 # endif
pascal@19404 101 popw %es
pascal@19404 102 # else
pascal@19404 103 # if UPDATE_SYSSIZE
pascal@19404 104 incb %dh
pascal@19404 105 # endif
pascal@19404 106 shrw $3, %dx
pascal@19404 107 movw %ds, %ax
pascal@19404 108 subw %dx, %ax
pascal@19404 109 movw %ax, %es
pascal@19404 110 # endif
pascal@19942 111 #else // FLAT16
pascal@19404 112 # 1- move 1000..1000+sys -> 9000-sys
pascal@19404 113 # if HARDCODED_SYSSIZE
pascal@19404 114 packed_syssize:
pascal@19404 115 movw $0x1000+0, %ax
pascal@19404 116 # else
pascal@19404 117 movw SYSSIZE, %ax
pascal@19404 118 addw $0x1000, %ax
pascal@19404 119 # endif
pascal@19404 120 movw %ds, %dx
pascal@19404 121 mvsys:
pascal@19404 122 decw %ax
pascal@19404 123 decw %dx
pascal@19404 124 movw %ax, %ds
pascal@19404 125 movw %dx, %es
pascal@19404 126 xorw %si, %si
pascal@19404 127 xorw %di, %di
pascal@19404 128 movw $8, %cx
pascal@19404 129 rep
pascal@19404 130 movsw
pascal@19404 131 cmpw $0x1000, %ax
pascal@19404 132 jne mvsys
pascal@19404 133 # 2- move 9020..9020+stp -> 9000-sys-stp
pascal@19404 134
pascal@19404 135 # if HARDCODED_SETUPSIZE
pascal@19404 136 setup_byte:
pascal@19404 137 movb $SETUP, %ch
pascal@19404 138 setup_para:
pascal@19404 139 subw $SETUP*32, %dx
pascal@19404 140 # else
pascal@19404 141 movb %ss:SETUPSIZE, %ch
pascal@19404 142 movw %cx, %ax
pascal@19404 143 shrw $3, %ax
pascal@19404 144 subw %ax, %dx
pascal@19404 145 # endif
pascal@19942 146 pushw %cx // <B>
pascal@19404 147 movw %dx, %es
pascal@19404 148 xorw %si, %si
pascal@19404 149 xorw %di, %di
pascal@19404 150 rep
pascal@19404 151 movsw %cs:(%si),%es:(%di)
pascal@19404 152 pushw %es
pascal@19404 153 # 3- reloc itself in 0x7C00
pascal@19404 154 pushw $0x07C0
pascal@19404 155 popw %es
pascal@19942 156 movw $cont, %si
pascal@19942 157 movw %si, %di
pascal@13269 158 movw $end-_start, %cx
pascal@19942 159 pushw %es
pascal@19942 160 pushw %di
pascal@13269 161 rep
pascal@19404 162 movsb %cs:(%si),%es:(%di)
pascal@19404 163 lret
pascal@19404 164 cont:
pascal@19404 165 # 4- unlz(9000-sys-stp:end, 1000-stp:0)
pascal@19404 166 # if HARDCODED_SETUPSIZE
pascal@19404 167 setup_seg:
pascal@19404 168 # if UPDATE_SYSSIZE
pascal@19404 169 pushw $0x1000-(SETUP*32)-32
pascal@19404 170 # else
pascal@19404 171 pushw $0x1000-(SETUP*32)
pascal@19404 172 # endif
pascal@19404 173 popw %es
pascal@19404 174 # else
pascal@19404 175 negw %ax
pascal@19404 176 # if UPDATE_SYSSIZE
pascal@19404 177 addw $0x1000-32, %ax
pascal@19404 178 # else
pascal@19404 179 addw $0x1000, %ax
pascal@19404 180 # endif
pascal@13269 181 movw %ax, %es
pascal@19404 182 # endif
pascal@19942 183 #endif // FLAT16
pascal@19942 184 popw %ds // <C>
pascal@19404 185 movw $end-_start, %si
pascal@19404 186 #if UPDATE_SYSSIZE
pascal@19404 187 movw $SYSSIZE, %di
pascal@19404 188 #else
pascal@13269 189 xorw %di, %di
pascal@19404 190 #endif
pascal@19404 191 pushw %di
pascal@19404 192 pushw %es
pascal@19404 193 call unpack
pascal@15188 194 popw %ds
pascal@15188 195 popw %si
pascal@19404 196 movw %si, %di
pascal@19942 197 # if SAVEREGS != 0
pascal@19942 198 popw %cx // <B>
pascal@15188 199 #if UPDATE_SYSSIZE
pascal@19404 200 // not need with memtest movb $(512-SYSSIZE)/2, %cl
pascal@15188 201 #endif
pascal@19942 202 popw %es // <A>
pascal@19404 203 # 5- move 1000-stp..1000 -> 9020
pascal@19942 204 # else
pascal@19942 205 popw %es // <A>
pascal@19942 206 jumpinto:
pascal@19942 207 # if HARDCODED_SETUPSIZE
pascal@19942 208 setup_word:
pascal@19942 209 movw $SETUP*256, %cx
pascal@19942 210 # else
pascal@19942 211 xorw %cx, %cx
pascal@19942 212 movb %ss:SETUPSIZE, %ch
pascal@19942 213 movw %cx, %dx
pascal@19942 214 # endif
pascal@19942 215 # endif
pascal@19404 216 rep
pascal@19404 217 movsw
pascal@19404 218 #if SAVEREGS
pascal@13269 219 popw %ds
pascal@13269 220 popal
pascal@13269 221 iret
pascal@19404 222 #else
pascal@19404 223 lret
pascal@19404 224 #endif
pascal@13269 225
pascal@13269 226 unpack:
pascal@19403 227 #define NO_LZMA_HEADER
pascal@13288 228 #include "unlzma.S"
pascal@13269 229
pascal@13269 230 end: