summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux-4.02/sample/filetest.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux-4.02/sample/filetest.c')
-rw-r--r--contrib/syslinux-4.02/sample/filetest.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/sample/filetest.c b/contrib/syslinux-4.02/sample/filetest.c
new file mode 100644
index 0000000..2ef772a
--- /dev/null
+++ b/contrib/syslinux-4.02/sample/filetest.c
@@ -0,0 +1,97 @@
+#include <com32.h>
+#include <stdarg.h>
+
+#define NULL ((void *)0)
+int printf(const char *, ...);
+int putchar(int);
+
+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 printregs(const com32sys_t * r)
+{
+ printf("eflags = %08x ds = %04x es = %04x fs = %04x gs = %04x\n"
+ "eax = %08x ebx = %08x ecx = %08x edx = %08x\n"
+ "ebp = %08x esi = %08x edi = %08x esp = %08x\n",
+ r->eflags.l, r->ds, r->es, r->fs, r->gs,
+ r->eax.l, r->ebx.l, r->ecx.l, r->edx.l,
+ r->ebp.l, r->esi.l, r->edi.l, r->_unused_esp.l);
+}
+
+int __start(void)
+{
+ unsigned int ax, cx, si, t;
+ com32sys_t inreg, outreg;
+ char *p;
+
+ /* Test null system call */
+ inreg.eflags.l = 0xffffffff;
+ inreg.eax.l = 0x11110000;
+ inreg.ecx.l = 0x22222222;
+ inreg.edx.l = 0x33333333;
+ inreg.ebx.l = 0x44444444;
+ inreg.ebp.l = 0x55555555;
+ inreg.esi.l = 0x66666666;
+ inreg.edi.l = 0x77777777;
+ inreg.ds = 0xaaaa;
+ inreg.es = 0xbbbb;
+ inreg.fs = 0xcccc;
+ inreg.gs = 0xdddd;
+ printregs(&inreg);
+ __com32.cs_intcall(0x22, &inreg, &outreg);
+ printregs(&outreg);
+ printf("----\n");
+
+ 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);
+ printregs(&inreg);
+ __com32.cs_intcall(0x22, &inreg, &outreg);
+ printregs(&outreg);
+ printf("----\n");
+
+ si = outreg.esi.w[0]; /* File handle */
+ cx = outreg.ecx.w[0]; /* Block size */
+ ax = outreg.eax.l; /* File length */
+
+ while (si) {
+ /* We can only read 64K per call */
+ t = (ax > 65536) ? 65536 / cx : (ax + cx - 1) / cx;
+
+ memset(&inreg, 0, sizeof inreg);
+ inreg.esi.w[0] = si;
+ inreg.ecx.w[0] = t; /* Block count */
+ inreg.eax.w[0] = 0x0007; // Read file
+ inreg.ebx.w[0] = OFFS(__com32.cs_bounce);
+ inreg.es = SEG(__com32.cs_bounce);
+ printregs(&inreg);
+ __com32.cs_intcall(0x22, &inreg, &outreg);
+ printregs(&outreg);
+ printf("----\n");
+ si = outreg.esi.w[0];
+
+ /* Print the buffer */
+ t = (ax < 65536) ? ax : 65536;
+ p = __com32.cs_bounce;
+ while (t) {
+ putchar(*p++);
+ t--;
+ ax--;
+ }
+ }
+
+ return 0;
+}