24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

368 volume VI os16<br />

Sorgenti della libreria generale 369<br />

«<br />

3330462 |//----------------------------------------------------------------------<br />

3330463 |<br />

3330464 |#endif<br />

105.12.1 lib/sys/os16/_bp.s<br />

Si veda la sezione 98.12.<br />

3340001 |.global __bp<br />

3340002 |.text<br />

3340003 |;-----------------------------------------------------------------------<br />

3340004 |; Read the base pointer, as it is before this call.<br />

3340005 |;-----------------------------------------------------------------------<br />

3340006 |.align 2<br />

3340007 |__bp:<br />

3340008 | enter #2, #0 ; 1 local variable.<br />

3340009 | pushf<br />

3340010 | cli<br />

3340011 | pusha<br />

3340012 | mov ax, [bp] ; The previous BP value is saved at *BP.<br />

3340013 | mov -2[bp], ax ; Save the calculated old SP value.<br />

3340014 | popa<br />

3340015 | popf<br />

3340016 | mov ax, -2[bp] ; AX is the function return value.<br />

3340017 | leave<br />

3340018 | ret<br />

3400007 |__sp:<br />

3400008 | enter #2, #0 ; 1 local variable.<br />

3400009 | pushf<br />

3400010 | cli<br />

3400011 | pusha<br />

3400012 | mov ax, bp ; The previous SP is equal to BP + 2 + 2.<br />

3400013 | add ax, #4 ;<br />

3400014 | mov -2[bp], ax ; Save the calculated old SP value.<br />

3400015 | popa<br />

3400016 | popf<br />

3400017 | mov ax, -2[bp] ; AX is the function return value.<br />

3400018 | leave<br />

3400019 | ret<br />

105.12.8 lib/sys/os16/_ss.s<br />

Si veda la sezione 98.12.<br />

3410001 |.global __ss<br />

3410002 |.text<br />

3410003 |;-----------------------------------------------------------------------<br />

3410004 |; Read the stack segment value.<br />

3410005 |;-----------------------------------------------------------------------<br />

3410006 |.align 2<br />

3410007 |__ss:<br />

3410008 | mov ax, ss<br />

3410009 | ret<br />

«<br />

«<br />

«<br />

«<br />

«<br />

«<br />

«<br />

105.12.2 lib/sys/os16/_cs.s<br />

Si veda la sezione 98.12.<br />

3350001 |.global __cs<br />

3350002 |.text<br />

3350003 |;-----------------------------------------------------------------------<br />

3350004 |; Read the code segment value.<br />

3350005 |;-----------------------------------------------------------------------<br />

3350006 |.align 2<br />

3350007 |__cs:<br />

3350008 | mov ax, cs<br />

3350009 | ret<br />

105.12.3 lib/sys/os16/_ds.s<br />

Si veda la sezione 98.12.<br />

3360001 |.global __ds<br />

3360002 |.text<br />

3360003 |;-----------------------------------------------------------------------<br />

3360004 |; Read the data segment value.<br />

3360005 |;-----------------------------------------------------------------------<br />

3360006 |.align 2<br />

3360007 |__ds:<br />

3360008 | mov ax, ds<br />

3360009 | ret<br />

105.12.4 lib/sys/os16/_es.s<br />

Si veda la sezione 98.12.<br />

3370001 |.global __es<br />

3370002 |.text<br />

3370003 |;-----------------------------------------------------------------------<br />

3370004 |; Read the extra segment value.<br />

3370005 |;-----------------------------------------------------------------------<br />

3370006 |.align 2<br />

3370007 |__es:<br />

3370008 | mov ax, es<br />

3370009 | ret<br />

105.12.5 lib/sys/os16/_seg_d.s<br />

Si veda la sezione 98.91.<br />

3380001 |.global __seg_d<br />

3380002 |.text<br />

3380003 |;-----------------------------------------------------------------------<br />

3380004 |; Read the data segment value.<br />

3380005 |;-----------------------------------------------------------------------<br />

3380006 |.align 2<br />

3380007 |__seg_d:<br />

3380008 | mov ax, ds<br />

3380009 | ret<br />

105.12.6 lib/sys/os16/_seg_i.s<br />

Si veda la sezione 98.91.<br />

3390001 |.global __seg_i<br />

3390002 |.text<br />

3390003 |;-----------------------------------------------------------------------<br />

3390004 |; Read the instruction segment value.<br />

3390005 |;-----------------------------------------------------------------------<br />

3390006 |.align 2<br />

3390007 |__seg_i:<br />

3390008 | mov ax, cs<br />

3390009 | ret<br />

105.12.7 lib/sys/os16/_sp.s<br />

Si veda la sezione 98.12.<br />

3400001 |.global __sp<br />

3400002 |.text<br />

3400003 |;-----------------------------------------------------------------------<br />

3400004 |; Read the stack pointer, as it is before this call.<br />

3400005 |;-----------------------------------------------------------------------<br />

3400006 |.align 2<br />

105.12.9 lib/sys/os16/heap_clear.c<br />

Si veda la sezione 98.57.<br />

3420001 |#include <br />

3420002 |//----------------------------------------------------------------------<br />

3420003 |extern uint16_t _end;<br />

3420004 |//----------------------------------------------------------------------<br />

3420005 |void heap_clear (void)<br />

3420006 |{<br />

3420007 | uint16_t *a = &_end;<br />

3420008 | uint16_t *z = (void *) (sp () - 2);<br />

3420009 | for (; a < z; a++)<br />

3420010 | {<br />

3420011 | *a = 0xFFFF;<br />

3420012 | }<br />

3420013 |}<br />

105.12.10 lib/sys/os16/heap_min.c<br />

Si veda la sezione 98.57.<br />

3430001 |#include <br />

3430002 |//----------------------------------------------------------------------<br />

3430003 |extern uint16_t _end;<br />

3430004 |//----------------------------------------------------------------------<br />

3430005 |int heap_min (void)<br />

3430006 |{<br />

3430007 | uint16_t *a = &_end;<br />

3430008 | uint16_t *z = (void *) (sp () - 2);<br />

3430009 | int count;<br />

3430010 | for (count = 0; a < z && *a == 0xFFFF; a++, count++);<br />

3430011 | return (count * 2);<br />

3430012 |}<br />

105.12.11 lib/sys/os16/input_line.c<br />

Si veda la sezione 98.60.<br />

3440001 |#include <br />

3440002 |#include <br />

3440003 |#include <br />

3440004 |//----------------------------------------------------------------------<br />

3440005 |void<br />

3440006 |input_line (char *line, char *prompt, size_t size, int type)<br />

3440007 |{<br />

3440008 | int i; // Index inside the ‘line[]’ array.<br />

3440009 | int c; // Character received from keyboard.<br />

3440010 |<br />

3440011 | if (prompt != NULL || strlen (prompt) > 0)<br />

3440012 | {<br />

3440013 | printf ("%s ", prompt);<br />

3440014 | }<br />

3440015 | //<br />

3440016 | // Loop for character input. Please note that the loop<br />

3440017 | // will exit only through ‘break’, where the input line<br />

3440018 | // will also be correctly terminated with ’\0’.<br />

3440019 | //<br />

3440020 | for (i = 0;; i++)<br />

3440021 | {<br />

3440022 | c = getchar ();<br />

3440023 | //<br />

3440024 | // Control codes.<br />

3440025 | //<br />

3440026 | if (c == EOF)<br />

3440027 | {<br />

3440028 | line[i] = 0;<br />

3440029 | break;<br />

3440030 | }<br />

3440031 | else if (c == 4) // [Ctrl D]<br />

3440032 | {<br />

3440033 | line[i] = 0;<br />

3440034 | break;<br />

3440035 | }<br />

3440036 | else if (c == 10) // [Enter]<br />

3440037 | {<br />

3440038 | line[i] = 0;<br />

3440039 | break;<br />

3440040 | }<br />

3440041 | else if (c == 8) // [Backspace]<br />

3440042 | {<br />

3440043 | if (i == 0)<br />

3440044 | {<br />

«<br />

«<br />

«

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!