diff options
author | hpa <hpa> | 2003-11-13 21:57:23 +0000 |
---|---|---|
committer | hpa <hpa> | 2003-11-13 21:57:23 +0000 |
commit | 7aabe805b949c456fde27dee0c020e66c23d7777 (patch) | |
tree | 14245958032aadb5de74fb70c7fbbd8fe7eaa020 /sample | |
parent | d5e75bb5c1edd17e54761d0b534ef3a75bc26710 (diff) | |
download | syslinux-7aabe805b949c456fde27dee0c020e66c23d7777.tar.gz |
opentest.c -> filetest.c
Diffstat (limited to 'sample')
-rw-r--r-- | sample/Makefile | 2 | ||||
-rw-r--r-- | sample/filetest.c | 60 | ||||
-rw-r--r-- | sample/opentest.c | 120 |
3 files changed, 61 insertions, 121 deletions
diff --git a/sample/Makefile b/sample/Makefile index ad8626ec..35ee3788 100644 --- a/sample/Makefile +++ b/sample/Makefile @@ -25,7 +25,7 @@ PPMTOLSS16 = ../ppmtolss16 .SUFFIXES: .lss .c .o .elf .c32 -all: syslogo.lss hello.c32 hello2.c32 opentest.c32 +all: syslogo.lss hello.c32 hello2.c32 filetest.c32 %.o: %.S $(CC) $(SFLAGS) -c -o $@ $< diff --git a/sample/filetest.c b/sample/filetest.c new file mode 100644 index 00000000..52c5ea21 --- /dev/null +++ b/sample/filetest.c @@ -0,0 +1,60 @@ +#include <com32.h> + +#define NULL ((void *)0) + +static inline void memset(void *buf, int ch, unsigned int len) +{ + asm volatile("cld; rep; stosb" + : "+D" (buf), "+c" (len) : "a" (ch) : "memory"); +} + +static void strcpy(char *dst, const char *src) +{ + while ( *src ) + *dst++ = *src++; + + *dst = '\0'; +} + +int __start(void) +{ + unsigned int ax,cx,dx,es,si,di,t; + com32sys_t inreg,outreg; + + memset(&inreg, 0, sizeof inreg); + memset(&outreg, 0, sizeof outreg); + strcpy(__com32.cs_bounce, "test.txt"); + inreg.eax.w[0] = 0x0006; // Open file + inreg.esi.w[0] = OFFS(__com32.cs_bounce); + inreg.es = SEG(__com32.cs_bounce); + __com32.cs_intcall(0x22, &inreg, &outreg); + + si = outreg.esi.w[0]; + cx = outreg.ecx.w[0]; + ax = outreg.eax.l; + + if ( ax > 65536 ) + ax = 65536; /* Max in one call */ + + while ( si ) { + t = (ax+cx-1)/cx; + + memset(&inreg, 0, sizeof inreg); + inreg.esi.w[0] = si; + inreg.ecx.w[0] = t; + inreg.eax.w[0] = 0x0007; // Read file + inreg.ebx.w[0] = OFFS(__com32.cs_bounce); + inreg.es = SEG(__com32.cs_bounce); + __com32.cs_intcall(0x22, &inreg, &inreg); + si = inreg.esi.w[0]; + + // This is broken if we hit null, but works for (DOS) text files + memset(&inreg, 0, sizeof inreg); + inreg.eax.w[0] = 0x0002; + inreg.ebx.w[0] = OFFS(__com32.cs_bounce); + inreg.es = SEG(__com32.cs_bounce); + __com32.cs_intcall(0x22, &inreg, NULL); + } + + return 0; +} diff --git a/sample/opentest.c b/sample/opentest.c deleted file mode 100644 index 4ffb7a0e..00000000 --- a/sample/opentest.c +++ /dev/null @@ -1,120 +0,0 @@ -#ident "$Id$" -/* ----------------------------------------------------------------------- * - * - * Copyright 2002 H. Peter Anvin - All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, Inc., 53 Temple Place Ste 330, - * Bostom MA 02111-1307, USA; either version 2 of the License, or - * (at your option) any later version; incorporated herein by reference. - * - * ----------------------------------------------------------------------- -*/ - -/* - * startup.c - * - * Simple COM32 image - * - * This program shows how to open and read a file by SYSLINUX API call - */ - -#include <com32.h> - -#define NULL ((void *)0) - -static inline void memset(void *buf, int ch, unsigned int len) -{ - asm volatile("cld; rep; stosb" - : "+D" (buf), "+c" (len) : "a" (ch) : "memory"); -} - -static void strcpy(char *dst, const char *src) -{ - while ( *src ) - *dst++ = *src++; - - *dst = '\0'; -} - -static void getversion(void) -{ - com32sys_t inreg; - - memset(&inreg, 0, sizeof inreg); - - inreg.eax.w[0] = 0x0001; // Get version - __com32.cs_intcall(0x22, &inreg, NULL); -}; - - -static void writemsg(const char *msg) -{ - com32sys_t inreg; - - memset(&inreg, 0, sizeof inreg); - - strcpy(__com32.cs_bounce, msg); - inreg.eax.w[0] = 0x0002; /* Write string */ - inreg.ebx.w[0] = OFFS(__com32.cs_bounce); - inreg.es = SEG(__com32.cs_bounce); - __com32.cs_intcall(0x22, &inreg, NULL); -}; - -static void runcmd(const char *msg) -{ - com32sys_t inreg; - - memset(&inreg, 0, sizeof inreg); - - strcpy(__com32.cs_bounce, msg); - inreg.eax.w[0] = 0x0003; /* Run command */ - inreg.ebx.w[0] = OFFS(__com32.cs_bounce); - inreg.es = SEG(__com32.cs_bounce); - __com32.cs_intcall(0x22, &inreg, NULL); -}; - - -int __start(void) -{ - char data[512]; - int cx,ax,es,si,di,dx,t; - - com32sys_t inreg,outreg; - memset(&inreg, 0, sizeof inreg); - memset(&outreg, 0, sizeof outreg); - strcpy(__com32.cs_bounce, "test.txt"); - inreg.eax.w[0] = 0x0006; // Open file - inreg.esi.w[0] = OFFS(__com32.cs_bounce); - inreg.es = SEG(__com32.cs_bounce); - __com32.cs_intcall(0x22, &inreg, &outreg); - - si = outreg.esi.w[0]; - cx = outreg.ecx.b[0]; - ax = outreg.eax.b[0]; - if ((ax % cx) == 0) - t = ax / cx; - else - t = (ax / cx) + 1; - - memset(&inreg, 0, sizeof inreg); - memset(&outreg, 0, sizeof outreg); - inreg.esi.w[0] = si; - inreg.ecx.w[0] = t; - inreg.eax.w[0] = 0x0007; //Read file - inreg.ebx.w[0] = OFFS(__com32.cs_bounce); - inreg.es = SEG(__com32.cs_bounce); - __com32.cs_intcall(0x22, &inreg, NULL); -/* - inreg.eax.w[0] = 0x0002; // Write string - inreg.ebx.w[0] = OFFS(__com32.cs_bounce); - inreg.es = SEG(__com32.cs_bounce); - __com32.cs_intcall(0x22, &inreg, NULL); -*/ - - writemsg("\r\n"); - runcmd("bzImage initrd=root.gz"); - writemsg("\r\n"); - return 0; -} |