📄 console.c
字号:
<a name=L81 href="source/kernel/chr_drv/console.c#L81">81</a> <b><i>/*</i></b> <a name=L82 href="source/kernel/chr_drv/console.c#L82">82</a> <b><i> * this is what the terminal answers to a ESC-Z or csi0c</i></b> <a name=L83 href="source/kernel/chr_drv/console.c#L83">83</a> <b><i> * query (= vt100 response).</i></b> <a name=L84 href="source/kernel/chr_drv/console.c#L84">84</a> <b><i> */</i></b> <a name=L85 href="source/kernel/chr_drv/console.c#L85">85</a> #define <a href="ident?i=RESPONSE">RESPONSE</a> <i>"\033[?1;2c"</i> <a name=L86 href="source/kernel/chr_drv/console.c#L86">86</a> <a name=L87 href="source/kernel/chr_drv/console.c#L87">87</a> <b><i>/* NOTE! gotoxy thinks x==video_num_columns is ok */</i></b> <a name=L88 href="source/kernel/chr_drv/console.c#L88">88</a> static inline void <a href="ident?i=gotoxy">gotoxy</a>(unsigned int new_x,unsigned int new_y) <a name=L89 href="source/kernel/chr_drv/console.c#L89">89</a> { <a name=L90 href="source/kernel/chr_drv/console.c#L90">90</a> if (new_x > <a href="ident?i=video_num_columns">video_num_columns</a> || new_y >= <a href="ident?i=video_num_lines">video_num_lines</a>) <a name=L91 href="source/kernel/chr_drv/console.c#L91">91</a> return; <a name=L92 href="source/kernel/chr_drv/console.c#L92">92</a> <a href="ident?i=x">x</a>=new_x; <a name=L93 href="source/kernel/chr_drv/console.c#L93">93</a> <a href="ident?i=y">y</a>=new_y; <a name=L94 href="source/kernel/chr_drv/console.c#L94">94</a> <a href="ident?i=pos">pos</a>=<a href="ident?i=origin">origin</a> + <a href="ident?i=y">y</a>*<a href="ident?i=video_size_row">video_size_row</a> + (<a href="ident?i=x">x</a><<1); <a name=L95 href="source/kernel/chr_drv/console.c#L95">95</a> } <a name=L96 href="source/kernel/chr_drv/console.c#L96">96</a> <a name=L97 href="source/kernel/chr_drv/console.c#L97">97</a> static inline void <a href="ident?i=set_origin">set_origin</a>(void) <a name=L98 href="source/kernel/chr_drv/console.c#L98">98</a> { <a name=L99 href="source/kernel/chr_drv/console.c#L99">99</a> <a href="ident?i=cli">cli</a>();<a name=L100 href="source/kernel/chr_drv/console.c#L100">100</a> <a href="ident?i=outb_p">outb_p</a>(12, <a href="ident?i=video_port_reg">video_port_reg</a>);<a name=L101 href="source/kernel/chr_drv/console.c#L101">101</a> <a href="ident?i=outb_p">outb_p</a>(0xff&((<a href="ident?i=origin">origin</a>-<a href="ident?i=video_mem_start">video_mem_start</a>)>>9), <a href="ident?i=video_port_val">video_port_val</a>);<a name=L102 href="source/kernel/chr_drv/console.c#L102">102</a> <a href="ident?i=outb_p">outb_p</a>(13, <a href="ident?i=video_port_reg">video_port_reg</a>);<a name=L103 href="source/kernel/chr_drv/console.c#L103">103</a> <a href="ident?i=outb_p">outb_p</a>(0xff&((<a href="ident?i=origin">origin</a>-<a href="ident?i=video_mem_start">video_mem_start</a>)>>1), <a href="ident?i=video_port_val">video_port_val</a>);<a name=L104 href="source/kernel/chr_drv/console.c#L104">104</a> <a href="ident?i=sti">sti</a>();<a name=L105 href="source/kernel/chr_drv/console.c#L105">105</a> }<a name=L106 href="source/kernel/chr_drv/console.c#L106">106</a> <a name=L107 href="source/kernel/chr_drv/console.c#L107">107</a> static void <a href="ident?i=scrup">scrup</a>(void)<a name=L108 href="source/kernel/chr_drv/console.c#L108">108</a> {<a name=L109 href="source/kernel/chr_drv/console.c#L109">109</a> if (<a href="ident?i=video_type">video_type</a> == <a href="ident?i=VIDEO_TYPE_EGAC">VIDEO_TYPE_EGAC</a> || <a href="ident?i=video_type">video_type</a> == <a href="ident?i=VIDEO_TYPE_EGAM">VIDEO_TYPE_EGAM</a>)<a name=L110 href="source/kernel/chr_drv/console.c#L110">110</a> {<a name=L111 href="source/kernel/chr_drv/console.c#L111">111</a> if (!<a href="ident?i=top">top</a> && <a href="ident?i=bottom">bottom</a> == <a href="ident?i=video_num_lines">video_num_lines</a>) {<a name=L112 href="source/kernel/chr_drv/console.c#L112">112</a> <a href="ident?i=origin">origin</a> += <a href="ident?i=video_size_row">video_size_row</a>;<a name=L113 href="source/kernel/chr_drv/console.c#L113">113</a> <a href="ident?i=pos">pos</a> += <a href="ident?i=video_size_row">video_size_row</a>;<a name=L114 href="source/kernel/chr_drv/console.c#L114">114</a> <a href="ident?i=scr_end">scr_end</a> += <a href="ident?i=video_size_row">video_size_row</a>;<a name=L115 href="source/kernel/chr_drv/console.c#L115">115</a> if (<a href="ident?i=scr_end">scr_end</a> > <a href="ident?i=video_mem_end">video_mem_end</a>) {<a name=L116 href="source/kernel/chr_drv/console.c#L116">116</a> __asm__(<i>"cld\n\t"</i><a name=L117 href="source/kernel/chr_drv/console.c#L117">117</a> <i>"rep\n\t"</i><a name=L118 href="source/kernel/chr_drv/console.c#L118">118</a> <i>"movsl\n\t"</i><a name=L119 href="source/kernel/chr_drv/console.c#L119">119</a> <i>"movl _video_num_columns,%1\n\t"</i><a name=L120 href="source/kernel/chr_drv/console.c#L120">120</a> <i>"rep\n\t"</i><a name=L121 href="source/kernel/chr_drv/console.c#L121">121</a> <i>"stosw"</i><a name=L122 href="source/kernel/chr_drv/console.c#L122">122</a> ::<i>"a"</i> (<a href="ident?i=video_erase_char">video_erase_char</a>),<a name=L123 href="source/kernel/chr_drv/console.c#L123">123</a> <i>"c"</i> ((<a href="ident?i=video_num_lines">video_num_lines</a>-1)*<a href="ident?i=video_num_columns">video_num_columns</a>>>1),<a name=L124 href="source/kernel/chr_drv/console.c#L124">124</a> <i>"D"</i> (<a href="ident?i=video_mem_start">video_mem_start</a>),<a name=L125 href="source/kernel/chr_drv/console.c#L125">125</a> <i>"S"</i> (<a href="ident?i=origin">origin</a>)<a name=L126 href="source/kernel/chr_drv/console.c#L126">126</a> :<i>"cx"</i>,<i>"di"</i>,<i>"si"</i>);<a name=L127 href="source/kernel/chr_drv/console.c#L127">127</a> <a href="ident?i=scr_end">scr_end</a> -= <a href="ident?i=origin">origin</a>-<a href="ident?i=video_mem_start">video_mem_start</a>;<a name=L128 href="source/kernel/chr_drv/console.c#L128">128</a> <a href="ident?i=pos">pos</a> -= <a href="ident?i=origin">origin</a>-<a href="ident?i=video_mem_start">video_mem_start</a>;<a name=L129 href="source/kernel/chr_drv/console.c#L129">129</a> <a href="ident?i=origin">origin</a> = <a href="ident?i=video_mem_start">video_mem_start</a>;<a name=L130 href="source/kernel/chr_drv/console.c#L130">130</a> } else {<a name=L131 href="source/kernel/chr_drv/console.c#L131">131</a> __asm__(<i>"cld\n\t"</i><a name=L132 href="source/kernel/chr_drv/console.c#L132">132</a> <i>"rep\n\t"</i><a name=L133 href="source/kernel/chr_drv/console.c#L133">133</a> <i>"stosw"</i><a name=L134 href="source/kernel/chr_drv/console.c#L134">134</a> ::<i>"a"</i> (<a href="ident?i=video_erase_char">video_erase_char</a>),<a name=L135 href="source/kernel/chr_drv/console.c#L135">135</a> <i>"c"</i> (<a href="ident?i=video_num_columns">video_num_columns</a>),<a name=L136 href="source/kernel/chr_drv/console.c#L136">136</a> <i>"D"</i> (<a href="ident?i=scr_end">scr_end</a>-<a href="ident?i=video_size_row">video_size_row</a>)<a name=L137 href="source/kernel/chr_drv/console.c#L137">137</a> :<i>"cx"</i>,<i>"di"</i>);<a name=L138 href="source/kernel/chr_drv/console.c#L138">138</a> }<a name=L139 href="source/kernel/chr_drv/console.c#L139">139</a> <a href="ident?i=set_origin">set_origin</a>();<a name=L140 href="source/kernel/chr_drv/console.c#L140">140</a> } else {<a name=L141 href="source/kernel/chr_drv/console.c#L141">141</a> __asm__(<i>"cld\n\t"</i><a name=L142 href="source/kernel/chr_drv/console.c#L142">142</a> <i>"rep\n\t"</i><a name=L143 href="source/kernel/chr_drv/console.c#L143">143</a> <i>"movsl\n\t"</i><a name=L144 href="source/kernel/chr_drv/console.c#L144">144</a> <i>"movl _video_num_columns,%%ecx\n\t"</i><a name=L145 href="source/kernel/chr_drv/console.c#L145">145</a> <i>"rep\n\t"</i><a name=L146 href="source/kernel/chr_drv/console.c#L146">146</a> <i>"stosw"</i><a name=L147 href="source/kernel/chr_drv/console.c#L147">147</a> ::<i>"a"</i> (<a href="ident?i=video_erase_char">video_erase_char</a>),<a name=L148 href="source/kernel/chr_drv/console.c#L148">148</a> <i>"c"</i> ((<a href="ident?i=bottom">bottom</a>-<a href="ident?i=top">top</a>-1)*<a href="ident?i=video_num_columns">video_num_columns</a>>>1),<a name=L149 href="source/kernel/chr_drv/console.c#L149">149</a> <i>"D"</i> (<a href="ident?i=origin">origin</a>+<a href="ident?i=video_size_row">video_size_row</a>*<a href="ident?i=top">top</a>),<a name=L150 href="source/kernel/chr_drv/console.c#L150">150</a> <i>"S"</i> (<a href="ident?i=origin">origin</a>+<a href="ident?i=video_size_row">video_size_row</a>*(<a href="ident?i=top">top</a>+1))<a name=L151 href="source/kernel/chr_drv/console.c#L151">151</a> :<i>"cx"</i>,<i>"di"</i>,<i>"si"</i>);<a name=L152 href="source/kernel/chr_drv/console.c#L152">152</a> }<a name=L153 href="source/kernel/chr_drv/console.c#L153">153</a> }<a name=L154 href="source/kernel/chr_drv/console.c#L154">154</a> else <b><i>/* Not EGA/VGA */</i></b><a name=L155 href="source/kernel/chr_drv/console.c#L155">155</a> {<a name=L156 href="source/kernel/chr_drv/console.c#L156">156</a> __asm__(<i>"cld\n\t"</i><a name=L157 href="source/kernel/chr_drv/console.c#L157">157</a> <i>"rep\n\t"</i><a name=L158 href="source/kernel/chr_drv/console.c#L158">158</a> <i>"movsl\n\t"</i><a name=L159 href="source/kernel/chr_drv/console.c#L159">159</a> <i>"movl _video_num_columns,%%ecx\n\t"</i><a name=L160 href="source/kernel/chr_drv/console.c#L160">160</a> <i>"rep\n\t"</i><a name=L161 href="source/kernel/chr_drv/console.c#L161">161</a> <i>"stosw"</i><a name=L162 href="source/kernel/chr_drv/console.c#L162">162</a> ::<i>"a"</i> (<a href="ident?i=video_erase_char">video_erase_char</a>),<a name=L163 href="source/kernel/chr_drv/console.c#L163">163</a> <i>"c"</i> ((<a href="ident?i=bottom">bottom</a>-<a href="ident?i=top">top</a>-1)*<a href="ident?i=video_num_columns">video_num_columns</a>>>1),<a name=L164 href="source/kernel/chr_drv/console.c#L164">164</a> <i>"D"</i> (<a href="ident?i=origin">origin</a>+<a href="ident?i=video_size_row">video_size_row</a>*<a href="ident?i=top">top</a>),<a name=L165 href="source/kernel/chr_drv/console.c#L165">165</a> <i>"S"</i> (<a href="ident?i=origin">origin</a>+<a href="ident?i=video_size_row">video_size_row</a>*(<a href="ident?i=top">top</a>+1))<a name=L166 href="source/kernel/chr_drv/console.c#L166">166</a> :<i>"cx"</i>,<i>"di"</i>,<i>"si"</i>);<a name=L167 href="source/kernel/chr_drv/console.c#L167">167</a> }<a name=L168 href="source/kernel/chr_drv/console.c#L168">168</a> }<a name=L169 href="source/kernel/chr_drv/console.c#L169">169</a> <a name=L170 href="source/kernel/chr_drv/console.c#L170">170</a> static void <a href="ident?i=scrdown">scrdown</a>(void)<a name=L171 href="source/kernel/chr_drv/console.c#L171">171</a> {<a name=L172 href="source/kernel/chr_drv/console.c#L172">172</a> if (<a href="ident?i=video_type">video_type</a> == <a href="ident?i=VIDEO_TYPE_EGAC">VIDEO_TYPE_EGAC</a> || <a href="ident?i=video_type">video_type</a> == <a href="ident?i=VIDEO_TYPE_EGAM">VIDEO_TYPE_EGAM</a>)<a name=L173 href="source/kernel/chr_drv/console.c#L173">173</a> {<a name=L174 href="source/kernel/chr_drv/console.c#L174">174</a> __asm__(<i>"std\n\t"</i><a name=L175 href="source/kernel/chr_drv/console.c#L175">175</a> <i>"rep\n\t"</i><a name=L176 href="source/kernel/chr_drv/console.c#L176">176</a> <i>"movsl\n\t"</i><a name=L177 href="source/kernel/chr_drv/console.c#L177">177</a> <i>"addl $2,%%edi\n\t"</i> <b><i>/* %edi has been decremented by 4 */</i></b><a name=L178 href="source/kernel/chr_drv/console.c#L178">178</a> <i>"movl _video_num_columns,%%ecx\n\t"</i><a name=L179 href="source/kernel/chr_drv/console.c#L179">179</a> <i>"rep\n\t"</i><a name=L180 href="source/kernel/chr_drv/console.c#L180">180</a> <i>"stosw"</i><a name=L181 href="source/kernel/chr_drv/console.c#L181">181</a> ::<i>"a"</i> (<a href="ident?i=video_erase_char">video_erase_char</a>),<a name=L182 href="source/kernel/chr_drv/console.c#L182">182</a> <i>"c"</i> ((<a href="ident?i=bottom">bottom</a>-<a href="ident?i=top">top</a>-1)*<a href="ident?i=video_num_columns">video_num_columns</a>>>1),<a name=L183 href="source/kernel/chr_drv/console.c#L183">183</a> <i>"D"</i> (<a href="ident?i=origin">origin</a>+<a href="ident?i=video_size_row">video_size_row</a>*<a href="ident?i=bottom">bottom</a>-4),<a name=L184 href="source/kernel/chr_drv/console.c#L184">184</a> <i>"S"</i> (<a href="ident?i=origin">origin</a>+<a href="ident?i=video_size_row">video_size_row</a>*(<a href="ident?i=bottom">bottom</a>-1)-4)<a name=L185 href="source/kernel/chr_drv/console.c#L185">185</a> :<i>"ax"</i>,<i>"cx"</i>,<i>"di"</i>,<i>"si"</i>);<a name=L186 href="source/kernel/chr_drv/console.c#L186">186</a> }<a name=L187 href="source/kernel/chr_drv/console.c#L187">187</a> else <b><i>/* Not EGA/VGA */</i></b><a name=L188 href="source/kernel/chr_drv/console.c#L188">188</a> {<a name=L189 href="source/kernel/chr_drv/console.c#L189">189</a> __asm__(<i>"std\n\t"</i><a name=L190 href="source/kernel/chr_drv/console.c#L190">190</a> <i>"rep\n\t"</i><a name=L191 href="source/kernel/chr_drv/console.c#L191">191</a> <i>"movsl\n\t"</i>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -