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 />
«