⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt-8259_5.htm

📁 编写自己的操作系统
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0059)http://www.huihoo.com/gnu_linux/own_os/interrupt-8259_5.htm -->
<HTML><HEAD><TITLE></TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT 
face="Times New Roman" size=6><SPAN style="mso-tab-count: 1"><STRONG>2.5 PIC - 
8259A</STRONG></SPAN></FONT></SPAN></P><SPAN lang=EN-US><FONT 
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1">
<P>
<P><FONT size=3>[</FONT><A 
href="index.htm" 
tppabs="http://pagoda-ooos.51.net/os_book/index.htm"><FONT 
size=3>Home</FONT></A><FONT size=3>]&nbsp; [</FONT><A 
href="interrupt_and_exception.htm" 
tppabs="http://pagoda-ooos.51.net/os_book/interrupt_and_exception.htm"><FONT 
size=3>Top</FONT></A><FONT size=3>]&nbsp; [</FONT><A 
href="interrupt-handling_4.htm" 
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/interrupt-handling_4.htm"><FONT 
size=3>Previous</FONT></A><FONT size=3>]&nbsp; [</FONT><FONT size=3><A 
href="interrupt-sys_call_6.htm" 
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/interrupt-sys_call_6.htm">Next</A>]</FONT></P>
<P><STRONG>
<HR width="100%" SIZE=2>
</STRONG>
<P></P>
<P></P></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman" 
size=5><SPAN style="mso-tab-count: 1">
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT 
face="Times New Roman TUR" size=5><STRONG>2.5.1 Overview</STRONG></FONT></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><FONT face="Times New Roman" size=5><SPAN 
style="mso-tab-count: 1"><FONT face=宋体><FONT size=3><FONT 
face="Times New Roman TUR"></FONT></FONT></FONT></SPAN></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" 
size=2>在本章的第一节我们已经提到,中断的来源除了来自于硬件自身的NMI中断和来自于软件的INT 
n指令造成的软件中断之外,还有来自于外部硬件设备的中断,这些中断是可屏蔽的。这些中断也都通过PIC(Programmable Interrupt 
Controller)进行控制,并传递给CPU。在IBM PC极其兼容机上所使用的PIC是Intel 8259A芯片。8259A芯片的功能非常强大,但在IBM 
PC上,我们只用到比较简单的功能。我们本节也只讨论其在PC上的使用。</FONT></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><FONT face="Courier New" size=2><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><FONT face="Courier New" size=2><SPAN 
style="mso-tab-count: 1">一个8259A芯片的可以接最多8个中断源,但由于可以将2个或多个8259A芯片级连(cascade),并且最多可以级连到9个,所以最多可以接64个中断源。早期,IBM 
PC/XT只有1个8259A,. 但设计师们马上意识到这是不够的,于是到了IBM 
PC/AT,8259A被增加到2个以适应更多外部设备的需要,其中一个被称作Master,另外一个被称作Slave,Slave以级连的方式连接在Master上。如今绝大多数的PC都拥有两个8259A,这样 
最多可以接收15个中断源。</SPAN></FONT></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><FONT face="Courier New" size=2><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><FONT face="Courier New" size=2><SPAN 
style="mso-tab-count: 1">通过8259A可以对单个中断源进行屏蔽。</SPAN></FONT></SPAN><SPAN 
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1"><STRONG><FONT face="Times New Roman" size=5>&nbsp;</P>
<P>
<HR width="100%" SIZE=2>
</FONT></STRONG>
<P></P>
<P></P>
<P><STRONG><FONT face="Times New Roman" size=5></FONT></STRONG></P><SPAN 
lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT 
face="Times New Roman TUR" size=5><STRONG>2.5.2 Principle</STRONG></FONT></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT 
face="Times New Roman TUR" size=5><SPAN lang=EN-US><FONT face="Times New Roman" 
size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT size=+0><FONT 
size=3><FONT 
face="Times New Roman TUR"></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></FONT>&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" 
size=2>在一个8259A芯片有如下几个内部寄存器:</FONT></SPAN></SPAN></P>
<UL>
  <LI><FONT face="Courier New"><FONT size=2><SPAN lang=EN-US><SPAN 
  style="mso-tab-count: 1">Interrupt Mask Register (IMR)</SPAN></SPAN> 
  </FONT></FONT>
  <LI><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"></SPAN></SPAN><FONT 
  face="Courier New"><FONT size=2><SPAN lang=EN-US><SPAN 
  style="mso-tab-count: 1">Interrupt Request Register (IRR)</SPAN></SPAN> 
  </FONT></FONT>
  <LI><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"></SPAN></SPAN><SPAN 
  lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" size=2>In 
  Sevice Register (ISR)</FONT></SPAN></SPAN></LI></UL>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" 
size=2>IMR被用作过滤被屏蔽的中断;IRR被用作暂时放置未被进一步处理的Interrupt;当一个Interrupt正在被CPU处理时,此中断被放置在ISR中。</FONT></SPAN></SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" 
size=2>除了这几个寄存器之外,8259A还有一个单元叫做Priority Resolver,当多个中断同时发生时,Priority 
Resolver根据它们的优先级,将高优先级者优先传递给CPU。</FONT></SPAN></SPAN></P>
<P align=center><SPAN lang=EN-US><FONT face="Times New Roman TUR"><SPAN 
style="mso-tab-count: 1"><IMG src="interrupt-8259_5.files/piclogic.gif" 
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/8259/piclogic.gif"></SPAN></FONT></SPAN></P>
<P align=center><SPAN lang=EN-US><FONT face="Times New Roman TUR"><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT 
face="Courier New" 
size=2>当一个中断请求从IR0到IR7中的某根线到达IMR时,IMR首先判断此IR是否被屏蔽,如果被屏蔽,则此中断请求被丢弃;否则,则将其放入IRR中。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT 
face="Courier New" size=2>在此中断请求不能进行下一步处理之前,它一直被放在IRR中。一旦发现处理中断的时机已到,Priority 
Resolver将从所有被放置于IRR中的中断中挑选出一个优先级最高的中断,将其传递给CPU去处理。IR号越低的中断优先级别越高,比如IR0的优先级别是最高的。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT 
face="Courier New" size=2>8259A通过发送一个INTR(Interrupt 
Request)信号给CPU,通知CPU有一个中断到达。CPU收到这个信号后,会暂停执行下一条指令,然后发送一个INTA(Interrupt 
Acknowledge)信号给8259A。8259A收到这个信号之后,马上将ISR中对应此中断请求的Bit设置,同时IRR中相应的bit会被reset。比如,如果当前的中断请求是IR3的话,那么ISR中的bit-3就会被设置,IRR中IR3对应的bit就会被reset。这表示此中断请求正在被CPU处理,而不是正在等待CPU处理。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT 
face="Courier New" 
size=2>随后,CPU会再次发送一个INTA信号给8259A,要求它告诉CPU此中断请求的中断向量是什么,这是一个从0到255的一个数。8259A根据被设置的起始向量号(起始向量号通过中断控制字ICW2被初始化)加上中断请求号计算出中断向量号,并将其放置在Data 
Bus上。比如被初始化的起始向量号为8,当前的中断请求为IR3,则计算出的中断向量为8+3=11。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN 
style="mso-tab-count: 1"></SPAN></SPAN><SPAN lang=EN-US><SPAN 
style="mso-tab-count: 1"><FONT face="Courier New" size=2>CPU从Data 
Bus上得到这个中断向量之后,就去IDT中找到相应的中断服务程序ISR,并调用它。如果8259A的End of Interrupt 
(EOI)通知被设定位人工模式,那么当ISR处理完该处理的事情之后,应该发送一个EOI给8259A。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT 
face="Courier New" 
size=2>8259A得到EOI通知之后,ISR寄存器中对应于此中断请求的Bit会被Reset。</FONT></SPAN></SPAN></P><SPAN 
lang=EN-US><FONT face="Times New Roman TUR"><SPAN style="mso-tab-count: 1">
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT 
face="Courier New" size=2>如果8259A的End of Interrupt 
(EOI)通知被设定位自动模式,那么在第2个INTA信号收到后,8259A 
ISR寄存器中对应于此中断请求的Bit就会被Reset。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT 
face="Courier New" 
size=2>在此期间,如果又有新的中断请求到达,并被放置于IRR中,如果这些新的中断请求中有比在ISR寄存中放置的所有中断优先级别还高的话,那么这些高优先级别的中断请求将会被马上按照上述过程进行处理;否则,这些中断将会被放在IRR中,直到ISR中高优先级别的中断被处理结束,也就是说知道ISR寄存器中高优先级别的bit被Reset为止。</FONT></SPAN></SPAN></P><SPAN 
lang=EN-US><FONT face="Times New Roman TUR"><SPAN style="mso-tab-count: 1">
<HR width="100%" SIZE=2>

<P align=left><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN 
style="mso-tab-count: 1"><FONT face="Times New Roman TUR" size=5><STRONG>2.5.3 
IRQ2/IRQ9 Redirection</STRONG></FONT></SPAN></FONT></SPAN></P><SPAN 
lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" 
size=2>为什么要将IRQ2重定向到IRQ9上?这仍然是由于兼容性问题造成的。</FONT></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" 
size=2></FONT></SPAN></SPAN>&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" size=2>早期的IBM 
PC/XT只有一个8259A,这样就只能处理8种IRQ。但很快就发现这根本不能满足需求。所以到了IBM 
PC/AT,又以级连的方式增加了一个8259A,这样就可以多处理7种IRQ。原来的8259A被称作Master PIC,新增的被称作Slave 
PIC。但由于CPU只有1根中断线,Slave PIC不得不级连在Master PIC上,占用了IRQ2,那么在IBM 
PC/XT上使用IRQ2的设备将无法再使用它;但新的系统又必须和原有系统保持兼容,怎么办?</FONT></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" 
size=2></FONT></SPAN></SPAN>&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" 
size=2>由于新增加的Slave PIC在原有系统中不存在,所以,设计者从Slave 
PIC的IRQ中挑出IRQ9,要求软件设计者将原来的IRQ2重定向到IRQ9上,也就是说IRQ9的中断服务程序需要去掉用IRQ2的中断服务程序。这样,将原来接在IRQ2上的设备现在接在IRQ9上,在软件上只需要增加IRQ9的中断服务程序,由它调用IRQ2的中断服务程序,就可以和原有系统保持兼容。而在当时,增加的IRQ9中断服务程序是由PC开发商开发的BIOS提供的,所以就从根本上保证了兼容。</FONT></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3" 
align=center><FONT face="Times New Roman TUR"><SPAN lang=EN-US><FONT 
face="Times New Roman"><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3" 
align=center><FONT face="Times New Roman TUR"><SPAN lang=EN-US><FONT 
face="Times New Roman"><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT 
face="Times New Roman TUR"><SPAN style="mso-tab-count: 1"><IMG 
src="interrupt-8259_5.files/irq_cascade.gif" 
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/8259/irq_cascade.gif"></P>
<HR width="100%" SIZE=2>

<P align=left><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN 
style="mso-tab-count: 1"><FONT face="Times New Roman TUR" 
size=5><STRONG>2.5.4&nbsp;Programming 
the&nbsp;8259As&nbsp;</STRONG></FONT></SPAN></FONT></SPAN></P><SPAN 
lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" 
size=2>每一个8259A芯片都有两个I/O ports,程序员可以通过它们对8259A进行编程。</FONT></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><FONT face="Courier New" size=2><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><FONT face="Courier New" size=2><SPAN style="mso-tab-count: 1">Master 
8259A的端口地址是0x20,0x21;Slave 8259A的端口地址是0xA0,0xA1。</SPAN></FONT></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><FONT face="Courier New" size=2><SPAN 
style="mso-tab-count: 1"></SPAN></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN 
lang=EN-US><FONT face="Courier New" size=2><SPAN 
style="mso-tab-count: 1">程序员可以向8259A写两种命令字:</SPAN></FONT></SPAN></P>
<OL type=1>
  <LI><FONT face="Courier New"><FONT size=2><SPAN lang=EN-US><SPAN 
  style="mso-tab-count: 1"><EM><STRONG>Initialization Command Word 
  (ICW);</STRONG></EM>这种命令字被用作对8259A芯片的初始化。</SPAN></SPAN> </FONT></FONT>
  <LI><FONT face="Courier New"><FONT size=2><SPAN lang=EN-US><SPAN 
  style="mso-tab-count: 1"><EM><STRONG>Operation Command Word 
  (OCW):</STRONG></EM>这种命令被用来向8259A发布命令,以对其进行控制。O</SPAN></SPAN><SPAN 
  lang=EN-US><SPAN 
  style="mso-tab-count: 1">CW可以在8259A被初始化之后的任何时候被使用。</SPAN></SPAN></FONT></FONT></LI></OL>
<P><SPAN lang=EN-US><FONT face="Courier New" size=2><SPAN 
style="mso-tab-count: 1">下表的内容是Master 
8259A的I/O端口地址,以及通过它们所能操作的寄存器。</SPAN></FONT></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT 
face="Courier New" size=2></FONT><FONT face="Times New Roman TUR" size=5><SPAN 
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN 
style="mso-tab-count: 1">&nbsp;</P>
<CENTER>
<TABLE width="80%" border=1>
  <TBODY>
  <TR>
    <TD><B>
      <CENTER><FONT face="Courier New" size=2>Address</FONT></CENTER></B></TD>
    <TD><B>
      <CENTER><FONT face="Courier New" size=2>Read/Write</FONT></CENTER></B></TD>
    <TD><B><FONT face="Courier New" size=2>Function</FONT></B></TD></TR>
  <TR>
    <TD rowSpan=5>
      <CENTER><FONT face="Courier New" size=2>0x20</FONT></CENTER></TD>
    <TD>
      <CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
    <TD><FONT face="Courier New" size=2>Initialization Command Word 1 
      (ICW1)</FONT></TD></TR>
  <TR>
    <TD>
      <CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
    <TD><FONT face="Courier New" size=2>Operation Command Word 2 
    (OCW2)</FONT></TD></TR>
  <TR>
    <TD>
      <CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
    <TD><FONT face="Courier New" size=2>Operation Command Word 3 
    (OCW3)</FONT></TD></TR>
  <TR>
    <TD>
      <CENTER><FONT face="Courier New" size=2>Read</FONT></CENTER></TD>
    <TD><FONT face="Courier New" size=2>Interrupt Request Register 
    (IRR)</FONT></TD></TR>
  <TR>
    <TD>
      <CENTER><FONT face="Courier New" size=2>Read</FONT></CENTER></TD>
    <TD><FONT face="Courier New" size=2>In-Service Register (ISR)</FONT></TD></TR>
  <TR>
    <TD rowSpan=4>
      <CENTER><FONT face="Courier New" size=2>0x21</FONT></CENTER></TD>
    <TD>
      <CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
    <TD><FONT face="Courier New" size=2>Initialization Command Word 2 
      (ICW2)</FONT></TD></TR>
  <TR>
    <TD>
      <CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -