Magellan Linux

Annotation of /tags/mkinitrd-6_3_1/isolinux/conio.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1143 - (hide annotations) (download)
Thu Aug 19 12:44:27 2010 UTC (13 years, 9 months ago) by niro
File size: 11028 byte(s)
tagged 'mkinitrd-6_3_1'
1 niro 532 ;; -----------------------------------------------------------------------
2     ;;
3 niro 1133 ;; Copyright 1994-2008 H. Peter Anvin - All Rights Reserved
4     ;; Copyright 2009 Intel Corporation; author: H. Peter Anvin
5     ;;
6 niro 532 ;; 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     ;; Boston MA 02111-1307, USA; either version 2 of the License, or
10     ;; (at your option) any later version; incorporated herein by reference.
11     ;;
12     ;; -----------------------------------------------------------------------
13    
14     ;;
15     ;; conio.inc
16     ;;
17     ;; Console I/O code, except:
18 niro 1133 ;; writechr, writestr_early - module-dependent
19     ;; writestr, crlf - writestr.inc
20 niro 532 ;; writehex* - writehex.inc
21     ;;
22    
23     ;
24 niro 1133 ; loadkeys: Load a LILO-style keymap; file is open on the top of the
25     ; getc stack.
26 niro 532 ;
27     section .text
28    
29     loadkeys:
30 niro 1133 mov cx,256
31     mov di,trackbuf
32     call readc
33     jc .done ; EOF already?
34 niro 532
35 niro 1133 ; Make sure we are at EOF now...
36     call getc
37     jnc .done ; We should be at EOF now!
38 niro 532
39 niro 1133 ; It was okay, we can now move it into the KbdMap
40 niro 532 mov si,trackbuf
41     mov di,KbdMap
42     mov cx,256 >> 2
43     rep movsd
44    
45 niro 1133 .done:
46     call close
47     ret
48    
49 niro 532 ;
50     ; get_msg_file: Load a text file and write its contents to the screen,
51 niro 1133 ; interpreting color codes. Call with the file already
52     ; on the top of the open/getc stack.
53 niro 532 ;
54 niro 1133 ; Assumes CS == DS == ES.
55     ;
56 niro 532 get_msg_file:
57     mov byte [TextAttribute],07h ; Default grey on white
58     mov byte [DisplayMask],07h ; Display text in all modes
59     call msg_initvars
60    
61     print_msg_file:
62 niro 1133 .getc:
63     call getc
64     jc .done
65 niro 532 cmp al,1Ah ; DOS EOF?
66 niro 1133 je .done
67     movzx cx,byte [UsingVGA]
68     and cl,01h
69     inc cx ; CL <- 01h = text mode,
70     ; 02h = graphics mode
71 niro 532 call [NextCharJump] ; Do what shall be done
72 niro 1133 jmp .getc
73     .done:
74     jmp close ; Tailcall!
75    
76 niro 532 msg_putchar: ; Normal character
77     cmp al,0Fh ; ^O = color code follows
78     je msg_ctrl_o
79     cmp al,0Dh ; Ignore <CR>
80     je msg_ignore
81     cmp al,0Ah ; <LF> = newline
82     je msg_newline
83     cmp al,0Ch ; <FF> = clear screen
84     je msg_formfeed
85     cmp al,07h ; <BEL> = beep
86     je msg_beep
87     cmp al,19h ; <EM> = return to text mode
88     je msg_novga
89     cmp al,18h ; <CAN> = VGA filename follows
90     je msg_vga
91     jnb .not_modectl
92     cmp al,10h ; 10h to 17h are mode controls
93     jae msg_modectl
94     .not_modectl:
95    
96     msg_normal: call write_serial_displaymask ; Write to serial port
97     test [DisplayMask],cl
98     jz msg_ignore ; Not screen
99     test byte [DisplayCon],01h
100     jz msg_ignore
101     mov bl,[TextAttribute]
102     mov bh,[BIOS_page]
103     mov ah,09h ; Write character/attribute
104     mov cx,1 ; One character only
105     int 10h ; Write to screen
106     mov al,[CursorCol]
107     inc ax
108     cmp al,[VidCols]
109     ja msg_line_wrap ; Screen wraparound
110     mov [CursorCol],al
111    
112     msg_gotoxy: mov bh,[BIOS_page]
113     mov dx,[CursorDX]
114     mov ah,02h ; Set cursor position
115     int 10h
116     msg_ignore: ret
117    
118     msg_beep: mov ax,0E07h ; Beep
119     xor bx,bx
120     int 10h
121     ret
122    
123     msg_ctrl_o: ; ^O = color code follows
124     mov word [NextCharJump],msg_setbg
125     ret
126     msg_newline: ; Newline char or end of line
127     mov si,crlf_msg
128     call write_serial_str_displaymask
129     msg_line_wrap: ; Screen wraparound
130     test [DisplayMask],cl
131     jz msg_ignore
132     mov byte [CursorCol],0
133     mov al,[CursorRow]
134     inc ax
135     cmp al,[VidRows]
136     ja msg_scroll
137     mov [CursorRow],al
138     jmp short msg_gotoxy
139     msg_scroll: xor cx,cx ; Upper left hand corner
140     mov dx,[ScreenSize]
141     mov [CursorRow],dh ; New cursor at the bottom
142     mov bh,[ScrollAttribute]
143     mov ax,0601h ; Scroll up one line
144     int 10h
145     jmp short msg_gotoxy
146     msg_formfeed: ; Form feed character
147     mov si,crff_msg
148     call write_serial_str_displaymask
149     test [DisplayMask],cl
150     jz msg_ignore
151     xor cx,cx
152     mov [CursorDX],cx ; Upper lefthand corner
153     mov dx,[ScreenSize]
154     mov bh,[TextAttribute]
155     mov ax,0600h ; Clear screen region
156     int 10h
157     jmp msg_gotoxy
158     msg_setbg: ; Color background character
159     call unhexchar
160     jc msg_color_bad
161     shl al,4
162     test [DisplayMask],cl
163     jz .dontset
164     mov [TextAttribute],al
165     .dontset:
166     mov word [NextCharJump],msg_setfg
167     ret
168     msg_setfg: ; Color foreground character
169     call unhexchar
170     jc msg_color_bad
171     test [DisplayMask],cl
172     jz .dontset
173     or [TextAttribute],al ; setbg set foreground to 0
174     .dontset:
175     jmp short msg_putcharnext
176     msg_vga:
177     mov word [NextCharJump],msg_filename
178     mov di, VGAFileBuf
179     jmp short msg_setvgafileptr
180    
181     msg_color_bad:
182     mov byte [TextAttribute],07h ; Default attribute
183     msg_putcharnext:
184     mov word [NextCharJump],msg_putchar
185     ret
186    
187     msg_filename: ; Getting VGA filename
188     cmp al,0Ah ; <LF> = end of filename
189     je msg_viewimage
190     cmp al,' '
191     jbe msg_ret ; Ignore space/control char
192     mov di,[VGAFilePtr]
193     cmp di,VGAFileBufEnd
194     jnb msg_ret
195     mov [di],al ; Can't use stosb (DS:)
196     inc di
197     msg_setvgafileptr:
198     mov [VGAFilePtr],di
199     msg_ret: ret
200    
201     msg_novga:
202     call vgaclearmode
203     jmp short msg_initvars
204    
205     msg_viewimage:
206     mov si,[VGAFilePtr]
207     mov byte [si],0 ; Zero-terminate filename
208     mov si,VGAFileBuf
209     mov di,VGAFileMBuf
210     call mangle_name
211 niro 1133 call open
212 niro 532 jz msg_putcharnext ; Not there
213     call vgadisplayfile
214     ; Fall through
215    
216     ; Subroutine to initialize variables, also needed
217     ; after loading a graphics file
218     msg_initvars:
219     pusha
220     mov bh,[BIOS_page]
221     mov ah,03h ; Read cursor position
222     int 10h
223     mov [CursorDX],dx
224     popa
225     jmp short msg_putcharnext ; Initialize state machine
226    
227     msg_modectl:
228     and al,07h
229     mov [DisplayMask],al
230     jmp short msg_putcharnext
231    
232     ;
233     ; write_serial: If serial output is enabled, write character on serial port
234     ; write_serial_displaymask: d:o, but ignore if DisplayMask & 04h == 0
235     ;
236     write_serial_displaymask:
237     test byte [DisplayMask], 04h
238     jz write_serial.end
239     write_serial:
240     pushfd
241     pushad
242     mov bx,[SerialPort]
243     and bx,bx
244     je .noserial
245     push ax
246     mov ah,[FlowInput]
247     .waitspace:
248     ; Wait for space in transmit register
249     lea dx,[bx+5] ; DX -> LSR
250     in al,dx
251     test al,20h
252     jz .waitspace
253    
254     ; Wait for input flow control
255     inc dx ; DX -> MSR
256     in al,dx
257     and al,ah
258     cmp al,ah
259 niro 1133 jne .waitspace
260     .no_flow:
261 niro 532
262     xchg dx,bx ; DX -> THR
263     pop ax
264 niro 1133 slow_out dx,al ; Send data
265 niro 532 .noserial: popad
266     popfd
267     .end: ret
268    
269     ;
270     ; write_serial_str: write_serial for strings
271     ; write_serial_str_displaymask: d:o, but ignore if DisplayMask & 04h == 0
272     ;
273     write_serial_str_displaymask:
274     test byte [DisplayMask], 04h
275     jz write_serial_str.end
276    
277     write_serial_str:
278     .loop lodsb
279     and al,al
280     jz .end
281     call write_serial
282     jmp short .loop
283     .end: ret
284    
285     ;
286     ; pollchar: check if we have an input character pending (ZF = 0)
287     ;
288     pollchar:
289     pushad
290     mov ah,11h ; Poll keyboard
291     int 16h
292     jnz .done ; Keyboard response
293     mov dx,[SerialPort]
294     and dx,dx
295     jz .done ; No serial port -> no input
296 niro 1133 mov ax,[SerialTail] ; Already-queued input?
297     cli
298     cmp ax,[SerialHead]
299     jne .done_sti ; If so, return ZF = 0
300     add dx,5 ; DX -> LSR
301 niro 532 in al,dx
302     test al,1 ; ZF = 0 if data pending
303 niro 1133 jz .done_sti
304 niro 532 inc dx ; DX -> MSR
305     mov ah,[FlowIgnore] ; Required status bits
306     in al,dx
307     and al,ah
308     cmp al,ah
309     setne al
310     dec al ; Set ZF = 0 if equal
311 niro 1133 .done_sti: sti
312 niro 532 .done: popad
313     ret
314    
315     ;
316     ; getchar: Read a character from keyboard or serial port
317     ;
318 niro 1133 getchar.sti_again:
319     sti
320 niro 532 getchar:
321     .again:
322 niro 1133 call do_idle
323 niro 532 mov ah,11h ; Poll keyboard
324     int 16h
325     jnz .kbd ; Keyboard input?
326     mov bx,[SerialPort]
327     and bx,bx
328     jz .again
329 niro 1133 mov ax,[SerialTail]
330     cli
331     cmp ax,[SerialHead]
332     jne .serial_queued
333 niro 532 lea dx,[bx+5] ; DX -> LSR
334     in al,dx
335     test al,1
336 niro 1133 jz .sti_again
337 niro 532 inc dx ; DX -> MSR
338     mov ah,[FlowIgnore]
339     in al,dx
340     and al,ah
341     cmp al,ah
342 niro 1133 jne .sti_again
343 niro 532 .serial: xor ah,ah ; Avoid confusion
344 niro 1133 mov dx,bx ; Data port
345     in al,dx ; Read data
346     sti
347     jmp .done
348     .serial_queued:
349     sti ; We already know we'll consume data
350     xchg bx,ax
351     push ds
352     mov ax,aux_seg + (aux.serial >> 4)
353     mov ds,ax
354     mov al,[bx]
355     pop ds
356     inc bx
357     and bx,serial_buf_size-1
358     mov [SerialTail],bx
359     jmp .done
360    
361 niro 532 .kbd: mov ah,10h ; Get keyboard input
362     int 16h
363     cmp al,0E0h
364     jnz .not_ext
365     xor al,al
366     .not_ext:
367     and al,al
368     jz .func_key
369     mov bx,KbdMap ; Convert character sets
370     xlatb
371 niro 1133 .func_key:
372     .done:
373     jmp reset_idle ; Character received
374 niro 532
375     %ifdef DEBUG_TRACERS
376     ;
377     ; debug hack to print a character with minimal code impact
378     ;
379     debug_tracer: pushad
380     pushfd
381     mov bp,sp
382     mov bx,[bp+9*4] ; Get return address
383     mov al,[cs:bx] ; Get data byte
384     inc word [bp+9*4] ; Return to after data byte
385     call writechr
386     popfd
387     popad
388     ret
389     %endif ; DEBUG_TRACERS
390    
391     section .data
392 niro 1133 %if IS_ISOLINUX == 0 ; Defined elsewhere for ISOLINUX
393     crlf_msg db CR, LF
394     null_msg db 0
395     %endif
396     crff_msg db CR, FF, 0
397    
398     section .config
399 niro 532 ; This is a word to pc_setint16 can set it
400     DisplayCon dw 01h ; Console display enabled
401    
402     ScrollAttribute db 07h ; Grey on white (normal text color)
403    
404     section .bss
405     alignb 2
406     NextCharJump resw 1 ; Routine to interpret next print char
407     CursorDX equ $
408     CursorCol resb 1 ; Cursor column for message file
409     CursorRow resb 1 ; Cursor row for message file
410     ScreenSize equ $
411     VidCols resb 1 ; Columns on screen-1
412     VidRows resb 1 ; Rows on screen-1
413    
414 niro 1133 ; Serial console stuff; don't put this in .config becasue we don't want
415     ; loading a new config file to undo this setting.
416     section .data
417     alignz 4
418     SerialPort dw 0 ; Serial port base (or 0 for no serial port)
419     BaudDivisor dw 115200/9600 ; Baud rate divisor
420 niro 532 FlowControl equ $
421 niro 1133 FlowOutput db 0 ; Outputs to assert for serial flow
422     FlowInput db 0 ; Input bits for serial flow
423     FlowIgnore db 0 ; Ignore input unless these bits set
424     FlowDummy db 0 ; Unused
425 niro 532
426 niro 1133 section .bss
427 niro 532 TextAttribute resb 1 ; Text attribute for message file
428     DisplayMask resb 1 ; Display modes mask
429 niro 1133
430     %include "serirq.inc"