2 ;; -----------------------------------------------------------------------
4 ;; Copyright 1994-2003 H. Peter Anvin - All Rights Reserved
6 ;; This program is free software; you can redistribute it and/or modify
7 ;; it under the terms of the GNU General Public License as published by
8 ;; the Free Software Foundation, Inc., 53 Temple Place Ste 330,
9 ;; Bostom MA 02111-1307, USA; either version 2 of the License, or
10 ;; (at your option) any later version; incorporated herein by reference.
12 ;; -----------------------------------------------------------------------
17 ;; Common code for running a COMBOOT image
20 ; Parameter registers definition; this is the definition
21 ; of the stack frame used by INT 21h and INT 22h.
22 %define P_FLAGS word [bp+44]
23 %define P_FLAGSL byte [bp+44]
24 %define P_FLAGSH byte [bp+45]
25 %define P_CS word [bp+42]
26 %define P_IP word [bp+40]
27 %define P_DS word [bp+38]
28 %define P_ES word [bp+36]
29 %define P_FS word [bp+34]
30 %define P_GS word [bp+32]
31 %define P_EAX dword [bp+28]
32 %define P_AX word [bp+28]
33 %define P_HAX word [bp+30]
34 %define P_AL byte [bp+28]
35 %define P_AH byte [bp+29]
36 %define P_ECX dword [bp+24]
37 %define P_CX word [bp+24]
38 %define P_HCX word [bp+26]
39 %define P_CL byte [bp+24]
40 %define P_CH byte [bp+25]
41 %define P_EDX dword [bp+20]
42 %define P_DX word [bp+20]
43 %define P_HDX word [bp+22]
44 %define P_DL byte [bp+20]
45 %define P_DH byte [bp+21]
46 %define P_EBX dword [bp+16]
47 %define P_BX word [bp+16]
48 %define P_HBX word [bp+18]
49 %define P_BL byte [bp+16]
50 %define P_BH byte [bp+17]
51 %define P_EBP dword [bp+8]
52 %define P_BP word [bp+8]
53 %define P_HBP word [bp+10]
54 %define P_ESI dword [bp+4]
55 %define P_SI word [bp+4]
56 %define P_HSI word [bp+6]
57 %define P_EDI dword [bp]
58 %define P_DI word [bp]
59 %define P_HDI word [bp+2]
61 ; Looks like a COMBOOT image but too large
68 ; Load a COMBOOT image. A COMBOOT image is basically a DOS .COM file,
69 ; except that it may, of course, not contain any DOS system calls. We
70 ; do, however, allow the execution of INT 20h to return to SYSLINUX.
75 cmp ax,0ff00h ; Max size in bytes
78 call comboot_setup_api
83 mov bx,100h ; Load at <seg>:0100h
85 mov cx,[ClustPerMoby] ; Absolute maximum # of clusters
89 mov cx,64 ; 256 bytes (size of PSP)
90 xor eax,eax ; Clear PSP
93 mov word [es:0], 020CDh ; INT 20h instruction
94 ; First non-free paragraph
95 ; This is valid because comboot_seg == real_mode_seg
96 ; == the highest segment used by all derivatives
97 int 12h ; Get DOS memory size
98 shl ax,6 ; Kilobytes -> paragraphs
102 %if real_mode_seg != comboot_seg
103 %error "This code assumes real_mode_seg == comboot_seg"
106 ; Copy the command line from high memory
107 mov cx,125 ; Max cmdline len (minus space and CR)
109 mov di,081h ; Offset in PSP for command line
110 mov al,' ' ; DOS command lines begin with a space
113 comboot_cmd_cp: es lodsb
118 comboot_end_cmd: mov al,0Dh ; CR after last character
120 mov al,126 ; Include space but not CR
122 mov [es:80h], al ; Store command line length
125 mov [SavedSSSP+2],ss ; Save away SS:SP
131 push word 0 ; Return to address 0 -> exit
133 jmp comboot_seg:100h ; Run it
135 ; Proper return vector
136 comboot_return: cli ; Don't trust anyone
141 ; Set up the COMBOOT API interrupt vectors. This is also used
145 mov di,4*0x20 ; DOS interrupt vectors
146 mov eax,comboot_return ; INT 20h = exit
148 mov ax,comboot_int21 ; INT 21h = DOS-compatible syscalls
150 mov ax,comboot_int22 ; INT 22h = proprietary syscalls
153 mov cx,29 ; All remaining DOS vectors
157 ; INT 21h: generic DOS system call
168 mov bp,sp ; Set up stack frame
176 ; The last function in the list is the
177 ; "no such function" function
179 call ax ; Call the invoked function
181 setc P_FLAGSL ; Propagate CF->error
189 ; Attempted to execute non-21h DOS system call
190 comboot_bogus: cli ; Don't trust anyone
193 ; Generic COMBOOT return to command line code
194 ; AX -> message (if any)
195 ; BX -> where to go next
198 mov bx,enter_command ; Normal return to command prompt
199 comboot_exit_special:
215 ; INT 21h system calls
217 comboot_getkey: ; 01 = get key with echo
225 comboot_writechr: ; 02 = writechr
231 comboot_writeserial: ; 04 = write serial port
237 comboot_getkeynoecho: ; 08 = get key w/o echo
242 comboot_writestr: ; 09 = write string
246 cmp al,'$' ; End string with $ - bizarre
253 comboot_checkkey: ; 0B = check keyboard status
254 cmp byte [APIKeyFlag],00h
258 dec al ; AL = 0FFh if present, 0 if not
263 comboot_checkver: ; 30 = check DOS version
264 ; We return 0 in all DOS-compatible version registers,
265 ; but the high part of eax-ebx-ecx-edx spell "SYSLINUX"
274 cmp byte [APIKeyFlag],00h
276 call getchar ; If not queued get input
277 and al,al ; Function key?
279 mov [APIKeyWait],ah ; High part of key
280 inc byte [APIKeyFlag] ; Set flag
283 .queued: mov al,[APIKeyWait]
284 dec byte [APIKeyFlag]
288 ; INT 22h - SYSLINUX-specific system calls
289 ; System call number in ax
302 mov bp,sp ; Set up stack frame
306 xor ax,ax ; Function 0 -> unimplemented
310 call [bx+int22_table]
311 jmp comboot_resume ; On return
314 ; INT 22h AX=0000h Unimplemented call
321 ; INT 22h AX=0001h Get SYSLINUX version
324 ; Number of API functions supported
327 mov P_CX,(VER_MAJOR << 8)+VER_MINOR
328 ; SYSLINUX derivative ID byte
331 mov P_BX,cs ; cs == 0
334 ; ES:SI -> version banner
335 mov P_SI,syslinux_banner
336 ; ES:DI -> copyright string
337 mov P_DI,copyright_str
344 ; INT 22h AX=0002h Write string
346 ; Write null-terminated string in ES:BX
356 ; INT 22h AX=0003h Run command
358 ; Terminates the COMBOOT program and executes the command line in
359 ; ES:BX as if it had been entered by the user.
371 mov bx,load_kernel ; Run a new kernel
372 jmp comboot_exit_special ; Terminate task, clean up
375 ; INT 22h AX=0004h Run default command
377 ; Terminates the COMBOOT program and executes the default command line
378 ; as if a timeout had happened or the user pressed <Enter>.
382 jmp comboot_exit_special
385 ; INT 22h AX=0005h Force text mode
387 ; Puts the video in standard text mode
395 ; INT 22h AX=0006h Open file
420 ; INT 22h AX=0007h Read file
427 xor si,si ; SI <- 0 on EOF, CF <- 0
432 ; INT 22h AX=0008h Close file
435 ; Do nothing for now. Eventually implement
436 ; an internal API for this.
441 ; INT 22h AX=0009h Call PXE stack
453 comapi_pxecall equ comapi_err ; Not available
457 ; INT 22h AX=000Ah Get Derivative-Specific Info
461 %if IS_SYSLINUX || IS_MDSLINUX
462 mov al,[bsDriveNumber]
487 ; INT 22h AX=000Bh Get Serial Console Configuration
503 ; INT 22h AX=000Ch Perform final cleanup
507 ; Unload PXE if requested
511 %elif IS_SYSLINUX || IS_MDSLINUX
512 ; Restore original FDC table
513 mov eax,[OrigFDCTabPtr]
516 ; Reset the floppy disk subsystem
524 ; This stuff should really be in the data section...
532 int21 00h, comboot_return
533 int21 01h, comboot_getkey
534 int21 02h, comboot_writechr
535 int21 04h, comboot_writeserial
536 int21 08h, comboot_getkey
537 int21 09h, comboot_writestr
538 int21 0Bh, comboot_checkkey
539 int21 30h, comboot_checkver
540 int21 4Ch, comboot_return
541 int21 -1, comboot_bogus
542 int21_count equ ($-int21_table)/3
546 dw comapi_err ; 0000 unimplemented syscall
547 dw comapi_get_version ; 0001 get SYSLINUX version
548 dw comapi_writestr ; 0002 write string
549 dw comapi_run ; 0003 run specified command
550 dw comapi_run_default ; 0004 run default command
551 dw comapi_textmode ; 0005 force text mode
552 dw comapi_open ; 0006 open file
553 dw comapi_read ; 0007 read file
554 dw comapi_close ; 0008 close file
555 dw comapi_pxecall ; 0009 call PXE stack
556 dw comapi_derinfo ; 000A derivative-specific info
557 dw comapi_serialcfg ; 000B get serial port config
558 dw comapi_cleanup ; 000C perform final cleanup
559 int22_count equ ($-int22_table)/2