wok annotate syslinux/stuff/iso2exe/a20.c @ rev 17160

syslinux/iso2exe: full zImage support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Sep 17 11:38:34 2014 +0200 (2014-09-17)
parents 3865e09ec026
children c15bb3c9e12d
rev   line source
pascal@16069 1 #ifndef __A20
pascal@16069 2 #define __A20
pascal@16069 3
pascal@16069 4 #define A20HOLDBUFFER 0x80000
pascal@16069 5 static int a20buffer = 0;
pascal@16069 6 static void movehia20(void)
pascal@16069 7 {
pascal@16069 8 if ((mem.base - 0x100000UL) >= 0x10000UL) {
pascal@16069 9 movehi();
pascal@16069 10 return;
pascal@16069 11 }
pascal@16069 12 a20buffer = 1;
pascal@16069 13 #asm
pascal@17160 14 pusha // more than 1Mb => 286+
pascal@16069 15 push #A20HOLDBUFFER/16
pascal@16069 16 pop es
pascal@16069 17 mov di, _mem // mem.base & 0xFFFF
pascal@16069 18 mov si, #_buffer
pascal@16069 19 mov cx, #BUFFERSZ/2
pascal@16069 20 cld
pascal@16069 21 rep
pascal@16069 22 movsw
pascal@16069 23 popa
pascal@16069 24 #endasm
pascal@16069 25 }
pascal@16069 26 #define movehi movehia20
pascal@16069 27
pascal@16069 28 #define REALMODE_SWITCH _realmode_switch_a20
pascal@16069 29 static void realmode_switch_a20(void)
pascal@16069 30 {
pascal@16069 31 if (!a20buffer) return;
pascal@16069 32 #asm
pascal@17160 33 pusha // more than 1Mb => 286+
pascal@16069 34 xor di, di // 30
pascal@16069 35 mov cx, #9 // 2E..1E
pascal@16069 36 a20z1:
pascal@16069 37 push di
pascal@16069 38 loop a20z1
pascal@16069 39 push #0x10
pascal@16069 40 push di // 1A 0x100000
pascal@16069 41 push #-1 // 18
pascal@16069 42 push di // 16
pascal@16069 43 push #A20HOLDBUFFER/0x10000
pascal@16069 44 push di // 12 A20HOLDBUFFER
pascal@16069 45 push #-1 // 10
pascal@16069 46 mov cl, #8 // 0E..00
pascal@16069 47 a20z2:
pascal@16069 48 push di
pascal@16069 49 loop a20z2
pascal@16069 50 mov ch, #0x10000/512
pascal@16069 51 push ss
pascal@16069 52 pop es
pascal@16069 53 mov si, sp
pascal@16069 54 mov ax, #0x8793
pascal@16069 55 mov [si+0x15], al
pascal@16069 56 xchg [si+0x1D], al
pascal@16069 57 xchg [si+0x1F], al // bits 24..31
pascal@16069 58 int 0x15
pascal@16069 59 add sp, #0x30
pascal@16069 60 popa
pascal@16069 61 #endasm
pascal@16069 62 }
pascal@16069 63
pascal@16069 64 #endif