PC-1500收集整理记

时间:2022-04-13 01:30:46

目录

第1章计算器    1

1.1 存储卡    2

1.2 取出"牛皮糖"    4

1.3 打磨键盘按钮    6

1.4 通电    7

第2章底座    10

2.1 去除充电电池    10

2.2 更换打印机    13

2.3 更换打印头    14

2.4 装纸    15

2.5 按键、开关    16

2.6 MIC和EAR    17

第3章串行通讯    18

3.1 改动电路    19

3.2 USB供电    21

3.3 串行通讯线    23

3.4 串行通讯    23

3.4.1 超级终端    24

3.4.2 PC-1500给PC传输程序(文本格式)    27

3.4.3 PC给PC-1500传输程序(文本格式)    29

3.4.4 传输二进制代码    31

第1章计算器

大概是1990年,还在上初中的我第一次接触到SHARP计算器。那是一款比PC-1500辈分还要高的计算器,它令我印象深刻的功能:编写一个函数到计算器里,输入自变量的数值即可得到因变量的数值。再加上它精巧的外观,当时我就对它着了迷。

可惜的是,当时在市面上买不到这种计算器。因此,拥有一台SHARP计算器只能是一个梦想。现在好了,借助淘宝网终于实现了这个梦想。

因为年代过于久远,从淘宝网上购买的PC-1500应该都是从垃圾堆里捡出来的,能不能用起来根本搞不清楚。因此我总共购买了6台PC-1500计算器,4个底座,1个串行通讯模块。经过一番折腾,竟然还能凑好两套。下面是整理好的整体图:

PC-1500收集整理记

能有这样的结果,需要感谢"78621维修车间"和"比夫"的几篇博文。

"78621维修车间"的四篇博文网址如下:

http://cbps99.blog.163.com/blog/static/93048910201142491412918/

http://cbps99.blog.163.com/blog/static/930489102011543824806/

http://cbps99.blog.163.com/blog/static/93048910201162617846/

http://cbps99.blog.163.com/blog/static/93048910201212042542715/

"比夫"的一篇博文网址如下:

http://www.zmdz.com/bbs/forum_read.asp?id=43530

1.1 存储卡

收集到的6台PC-1500,只有1台没配存储卡,其余的都配上了16KB的存储卡(CE-161)。

存储卡安装在PC-1500的背面,如下图所示:

PC-1500收集整理记

首先把上图红色框内的盖子抠开,然后用手指勾住盖子上方的凹槽向下拉。这样,存储卡就可以被取出来了。

下图中,存储卡的左下角有个小白点,它的上方是白色的写保护开关。应该把这个开关拨到上方,否则就无法对存储卡进行写操作。

PC-1500收集整理记

如果PC-1500没有配存储卡,那么就不会有小白点。写保护开关有,但它是黑色的,如下图所示:

PC-1500收集整理记

把存储卡取出来,有什么用呢?"78621维修车间"写的博文是更换了存储卡内部的CR2032纽扣电池。这样,存储在卡里的数据,能够维持两年不丢失。我感觉换上新电池难度比较大,并且用了几年后又得换。关键是这么一通麻烦后实际的意义并不是很大。因此,采取了比较极端的做法——直接把旧电池取出来了。

打开存储卡稍微容易些,使用螺丝刀撬开就行。装起来有些麻烦:需要把卡装入盒子,并且V形弹簧要顶住上方的伸缩盖。

1.2 取出"牛皮糖"

使用十字螺丝刀拧开PC-1500背后的8颗螺丝,如下图所示:

PC-1500收集整理记

打开PC-1500就可以看到"牛皮糖"了(在下图红色框内。实在不知道它叫什么,只是觉得它特别像牛皮糖)。

PC-1500收集整理记

上图下端侧面有4个小螺丝,如下图所示。拧开后就可把上图牛皮糖及其所在金属片整个取下来。然后把牛皮糖从金属片上剥离开来。

PC-1500收集整理记

1.3 打磨键盘按钮

有两台PC-1500的ENTER按钮按下去之后无法弹起来,主要原因是按钮长期受到挤压,侧面变形了,导致有时会卡住。解决方法就是把按钮取出来,然后用锉刀将按钮侧面打磨平整。

使用螺丝刀拧开下图所示的11个螺丝(有两个在黄色带子的下面)。

PC-1500收集整理记

将板子移开,即可看到键盘按钮。如下图所示。

PC-1500收集整理记

注意:千万别把按钮弄乱了,否则重新排放一遍是比较费时的。

取出需要打磨的按钮,将其侧面打磨平滑,再放回原位。

1.4 通电

给PC-1500装上四节1.5V的5号电池(1.2V的充电电池也是可以的),如下图所示:

PC-1500收集整理记

盖上电池盒盖,此时PC-1500的显示如下:

PC-1500收集整理记

它的含义是——是否清除内存?请按红色的CL键,然后输入命令NEW0,如下图所示:

PC-1500收集整理记

按下Enter键,即可清除PC-1500的内存。

同样的方法执行NEW256将清除存储卡上的内存。如果PC-1500未安装存储卡或存储卡被写保护,则会出现错误提示ERROR 25。

在PC-1500上输入STATUS0,再按下Enter键,即可查询PC-1500的剩余内存。如下图所示:

PC-1500收集整理记

下表是机型及可用内存表

机型

无存储卡

16K存储卡

PC-1500

1850

18175

PC-1500A

5946

22271

第2章底座

PC-1500配上底座(CE-150)就有了非常拉风的功能:可以打印、绘图,可以通过并口外接打印机,还可以连接磁带机存储数据……

2.1 去除充电电池

下图是底座的外观:

PC-1500收集整理记

我买了4个底座,坏了2个。损坏率50%。为什么会这么高呢?原因在于底座内部有5节充电电池,即使不使用底座,它们也会处于放电状态,时间一长就会漏液。碱性溶液就会腐蚀底座。

因此,拿到底座后,需要把5节充电电池取出来。可使用一字螺丝刀撬开底座,如下图所示:

PC-1500收集整理记

撬开后的样子

PC-1500收集整理记

现在,就可以打开底座了。如下图所示:

PC-1500收集整理记

上图红色框的部分就是安装充电电池的位置。电池已经被我取出,已经被腐蚀成这个样子了:

PC-1500收集整理记

电池上的文字:

PC-1500收集整理记

"78621维修车间"为底座更换了充电电池,我没这么做——再次漏液怎么办?我是这么做的——直接借用底座的外接电源,如下图所示:红色的为正极、蓝色的为负极。

PC-1500收集整理记

底座接通外接电源(9V)后,即可充当充电电池的角色。5节充电电池是6V,这里的9V电压会不会太大?经过我的实际测试没有发现任何问题。

最后,来一张底座电源适配器的图片。买了4个底座才搜集到一个电源适配器,不容易啊。根据该电源适配器的规格(9V、500mA、12W、直流插头外径5.5mm,电压是内负外正)可以网购一款电源适配器代替它。注意:一定不要购买质量差的电源适配器,它会导致PC-1500无法与底座正常通讯。

PC-1500收集整理记

2.2 更换打印机

我在4个底座之间相互替换了打印机,其操作比较容易,需要动三个地方:

PC-1500收集整理记

2.3 更换打印头

购买的4个底座,打印头里的墨水都干了。导致打印不出东西。为此,网购了几个打印笔,将其换上。

首先是打开打印机盖子。方法是:将右边红色框内的开关推到最左边,然后使用手指扣住左边红色框内侧面的凹槽,将其向上打开。

PC-1500收集整理记

更换打印头的方法如下图所示:使用手指拨开打印笔后端的塑料弹片,然后使用针形物将打印笔挑出来。新的打印笔,先安装头部,然后向下按压即可装入。装好一只笔后,向左拨动打印头(绝对不要向右拨动),旋转90度后,更换另一支打印笔。直至所有的打印笔更换完毕。请注意黑、蓝、绿、红四支打印笔的安装顺序。

PC-1500收集整理记

2.4 装纸

打开打印机的盒盖,右手拿着纸卷将其插入打印滚轮后方的进纸孔

PC-1500收集整理记

左手向上滚动打印滚轮(黑色的橡胶滚轮),这样打印纸就被带出来了。然后把纸卷连带滚轴放入纸槽内。注意滚轴要放到滚轴槽内,如下图所示。

PC-1500收集整理记

纸卷滚轴也是个稀罕物,4个底座只收集到一个,其直径大概为8mm。如下图所示

PC-1500收集整理记

注意:打印纸可以使用收银机、POS机的热敏打印纸代替。其规格为57×30mm,即纸的宽度是57mm,纸卷的外径是30mm,内径要大于8mm。

2.5 按键、开关

因为没有底座的说明书,以下都是我的猜测,希望是正确的。请参考下图

PC-1500收集整理记

按钮1是用来进纸的。打印完毕,按下它即可进纸。到合适位置后,即可把打印部分撕切下来(打印纸出口处有锯齿状的切纸器)。

开关2用来打开打印机顶盖。

开关3是REMOTE开关,可用来控制磁带机。连上磁带机,需要把它拨到ON的位置,即可与磁带机交换数据。不连磁带机时,请把它拨到OFF的位置。

开关4是PRINT开关。连接外接打印机时需要拨到P的位置,否则就拨到黑点的位置。

2.6 MIC和EAR

通过底座的MIC和EAR插孔,即可将程序保存到磁带上,也可以从磁带上读取程序。

"78621维修车间"和www.pc1500.com网站介绍了另一种方法:把程序保存成PC的WAV文件,也可以播放WAV文件载入程序。这种方法我测试了,CSAVE似乎没有问题,但是CLOAD一直不成功。

使用磁带、WAV文件保存、载入程序效率太慢。因此,不再做深入研究。

第3章串行通讯

网购了一个PC-1500通讯模块(CE-158)。下面是它的图片:

PC-1500收集整理记

它与PC-1500的接口

PC-1500收集整理记

数据通讯口有两个:上方是并行口,它被一个红色的盖子盖住了;下方是25孔的串口。

PC-1500收集整理记

3.1 改动电路

CE-158内部需要4节1.2V的5号充电电池。充电电池存在漏液问题,因此需要改动电路。拧开底部的四个螺丝

PC-1500收集整理记

继续拧开四周的4个螺丝

PC-1500收集整理记

卸下顶壳后,继续拧开下图所示的两个螺丝。

PC-1500收集整理记

下图红、黑两条线本来是连接充电电池组的正、负极的,现在把它们焊接到下图所示的红、蓝圈内。红圈为正极,蓝圈为负极,千万不要焊错了。

PC-1500收集整理记

重新安装好,自此CE-158电路改动完毕。它的原理就是借用外部供电设备提供的电力。外部供电电压最好是4.8V(4节1.2V充电电池串联电压),不过根据我的实测:5V~9V都是可以的。也就是说:底座(CE-150)的电源适配器可以给通讯模块(CE-158)供电。

3.2 USB供电

上节说到:可以使用底座的电源适配器给通讯模块供电。不过这不是很方便。"比夫"的博文里提到:使用USB给通讯模块供电,这是个非常好的想法。

下图就是我自做的USB供电线:

PC-1500收集整理记

说明:

1、直流插头的外径为5.5mm,电压是内负外正;

2、网上可以购买这样的线,其名称为"USB转DC5.5"。但一定要注意它的DC插头是否为内负外正。

PC-1500收集整理记

3.3 串行通讯线

PC的串口一般都是9针的,CE-158的接口是25孔的,需要一根"9孔转25针"的串口线。获得这根串口线的方法:

1、网购时要求店家定制。因为我网购了一根线,结果连接方法不正确,最后自己改接了线;

2、自己购买9针头、25孔头、数据线,自己焊接。

不管什么方法,哪根线与哪根线连接是关键。具体的连接如下图所示

PC-1500收集整理记

还有更为简单的连接方法:

PC-1500收集整理记

3.4 串行通讯

串行通讯前,需要注意的事项:

1、把通讯模块的开关拨到ON的位置,通电后需要等待40秒以上再打开PC-1500。PC-1500过早开机就会显示:CHECK 8,提示通讯模块供电不足;

2、PC给PC-1500发送数据时,因为PC-1500的反应比较慢,所以每发送一个字符都要等待一段时间;

3、Windows 文本文件的行结束符是回车(CR,十六进制的0D)和换行(LF,十六进制的0A),而PC-1500的行结束符是回车。两者相互传输数据时,需要对行结束符进行相互转换。

3.4.1 超级终端

Windows上的串口通讯软件很多,但是这里只介绍超级终端。因为它有一些特有的功能,如:自动转换行结束符,每发送一个字符后可以等待一段时间。

在Windows7操作系统上,不再自带超级终端程序。可以上网下载这个程序,或者从WindowsXP操作系统上复制过来。具体的,需要复制两个文件:

C:\Program Files\Windows NT\hypertrm.exe

C:\WINDOWS\system32\hypertrm.dll

把这两个文件放在同一个文件夹内,即可通过鼠标双击hypertrm.exe运行超级终端程序。

超级终端首先会要求输入连接的名称,这个名称可以任意输入。这里输入pc-1500,然后单击"确定"按钮,如下图所示:

PC-1500收集整理记

进入如下界面。请选择串口号,单击"确定"按钮

PC-1500收集整理记

接下来的界面需要注意两个参数:"位/秒"就是波特率。PC-1500只支持110、300、600、1200、2400这五种波特率。经过试验,波特率110通讯失败,所以这里我选择了2400。数据流控制里,请选择"无"。原因在于:通讯模块(CE-158)的25针串口的DTR、RTS始终为低电平,所以给PC-1500发送数据时,硬件握手一定失败;PC-1500给PC发送数据时,要求PC端串口的RTS为高电平,即便选择"无"数据流控制,超级终端也会设置RTS为高电平的。

PC-1500收集整理记

单击上图的"确定"按钮,现在超级终端就可以和PC-1500通讯了。

不过因为要转换行结束符,还需要一些设置工作。其操作如下:

单击超级终端的【文件】【属性】菜单项

PC-1500收集整理记

进入"设置"页面,单击"ASCII码设置"按钮

PC-1500收集整理记

显示如下界面。红色框内的4项设置比较重要

PC-1500收集整理记

"以换行符作为发送行末尾"勾中此项,超级终端会将 0D ?? 替换为0D 0A ??(要求??不是0A),也就是将行结束符由0D更换为0D 0A;不勾中此项,超级终端会将0D 0A替换为0D。

"字符延迟"与"行延迟":超级终端每发送一个字符就会等待一段时间,只要这个字符不是行结束符,等待时间就采用"字符延迟",否则等待时间就采用"行延迟"。上图的含义:每发送一个字符等待0.025秒,发送一行后等待1秒。注意:Windows不是一个实时操作系统,等待的时间基本上都是0.015秒的整数倍。也就是说设置延迟为1、5、14,则实际延迟可能都是0.015秒;而设置延迟为16,则实际延迟可能是0.03秒。

3.4.2 PC-1500给PC传输程序(文本格式)

PC-1500上按MODE按钮,进入PRO状态,输入如下代码:

10 PRINT 10

20 PRINT 20

然后在PC-1500上执行如下命令

OUTSTAT0

SETCOM2400,8,N,1

SETDEVCO

CSAVEa

在PC端将接收到如下信息(<CR>就是回车,即0D)

10 PRINT 10<CR>

PC-1500发完此行后等待2秒

20 PRINT 10<CR>

PC-1500发完此行后等待2秒

<CR>

程序发完,PC-1500会再发送一个回车符

可见:

1、PC-1500发送的程序以回车为行结束符;

2、PC-1500每发送完一行,都会等待2秒;

3、PC-1500把程序发送完毕后,会额外发送一个回车符。PC端程序如果发现两个相邻的回车符,就可以认为PC-1500的程序发送完毕了;

4、如果PC-1500没有BASIC代码,那么CSAVEa不会发送任何字符。

因为Windows文本文件的行结束符是回车加换行,因此需要将PC-1500发送来的数据做处理:把回车替换为回车加换行。还记得超级终端的如下设置吗?它就是专门做这个转换工作的。

PC-1500收集整理记

所以,对于超级终端而言,重要的是如何把PC-1500发送来的数据保存到文件里去。其操作步骤如下:

单击【传送】【捕获文字】菜单项

PC-1500收集整理记

单击"浏览"按钮,选择一个文件。然后单击"启动"按钮。

PC-1500收集整理记

现在,超级终端做好了接收数据并把数据写入上图选中文件的准备了。

PC-1500上执行如下命令

OUTSTAT0

SETCOM2400,8,N,1

SETDEVCO

CSAVEa

CSAVEa执行完毕后,单击超级终端【传送】【捕获文字】【停止】菜单项。

PC-1500收集整理记

至此,超级终端就完成了接收PC-1500数据,转换行结束符,保存至文件的工作。

3.4.3 PC给PC-1500传输程序(文本格式)

记事本编辑的如下代码并不能直接传给PC-1500。因为Windows文本文件的行结束符为回车加换行,直接发给PC-1500会因为不识别换行符而导致传输失败。

PC-1500收集整理记

因此,把文本格式的BASIC代码由PC传给PC-1500,首要的工作就是把回车加换行符替换为回车符。所幸的是超级终端的如下设置自动完成此项工作。

PC-1500收集整理记

与PC-1500一样,PC端发送完代码后,也应该发送一个回车符给PC-1500,"告诉"PC-1500整个程序传输完毕了。为此,记事本编辑BASIC代码时,需要在最后有两个行结束符。检验方法就是在记事本里按下Ctrl+End,插入符与最后一行代码之间要有一个空行,这个空行里请不要输入任何字符,包括空格。

PC-1500收集整理记

最后就是延迟时间。PC-1500反应比较慢,PC把整个代码一股脑的发给它,则会导致通讯失败。为此,需要设置延迟时间。下图是超级终端里的延迟设置:

PC-1500收集整理记

"字符延迟"用来保障PC-1500来得及接收数据;"行延迟"用来保障PC-1500来得及将文本格式的代码行翻译成机器内部的二进制格式。

注意上图的数值都是经验值,如果在传输时出现错误,请适当增大延迟时间。

具体操作如下:

PC-1500上执行如下命令

OUTSTAT0

SETCOM2400,8,N,1

SETDEVCI

CLOADa

超级终端上单击【传送】【发送文本文件】菜单项,如下图所示:

PC-1500收集整理记

选择要发送的代码文件,超级终端就开始传输代码给PC-1500了。这里顺便提一下:超级终端发送文件的功能缺少进度显示,你搞不清楚文件已经传了多少了?大概还要传多久……

3.4.4 传输二进制代码

将CSAVEa、CLOADa分别替换为CSAVE、CLOAD即可传输二进制的BASIC代码。

传输二进制代码的优势:效率高。CSAVEa每发送完一行就会等待2秒;CSAVE不存在这个问题。CLOADa时,PC每发送完一行就要等大概1秒,CLOAD就不存在这个问题了。

传输二进制代码的缺点:首先是可读性差,传给PC的二进制代码人工无法阅读(当然,做个程序把二进制代码转换为文本格式也是可行的,就是不知难度有多大);其次,超级终端无法用来传输二进制代码,因为它过于聪明了。下图的设置,不管勾与不勾,超级终端都会对行结束符做相应的转换。这是传输二进制代码所不希望的。

PC-1500收集整理记

所以,要在PC与PC-1500之间传输二进制代码,需要单独编写一个串行通讯程序。笔者在PC-E500与PC通讯程序的基础上,增加了与PC-1500通讯的功能。程序下载地址:浏览http://pan.baidu.com/s/1gd7XDkf 再进入 public/Tools/E500Comm。

最后,大致说一下二进制代码的格式。使用CSAVE将得到如下数据(十六进制)。

地址

字节

数据

说明

0

5

01 40 43 4F 4D

固定。经测试这五个字节不可能是二进制代码的头五个字节

5

16

31 32 33 34 35 36 37 38 39 30 41 42 43 44 45 46

CSAVE的参数,这里就是

CSAVE"1234567890ABCDEF"

最多16字节,不足的补00H

21

2

01 00

随机数。0x0100或0x00C5,还有可能是其它数值。

23

2

00 07

总字节数 - 28

25

2

01 08

随机数 + 总字节数 - 27

27

n

00 0A 05 F0 97 31 30 0D

二进制代码,字节数n=总字节数-27

最后一个字节一定是0DH

PC-1500收集整理记的更多相关文章

  1. javascript收集整理

    //特殊字符去掉 function check(obj){ var test=obj.value.match(/[^A-Za-z0-9]/g);//这条语句表示在输入文本中是否包含不符合要求的字符,如 ...

  2. php &colon; 收集整理的非常有用的函数

    项目中经常会需要一些让人头疼的函数,作为开发者应该整理一个自己的函数库,在需要之时复制过来即可.以下是收集整理数十个PHP项目中常用的函数 1.PHP加密解密 PHP加密和解密函数可以用来加密一些有用 ...

  3. 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发

    [原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http: ...

  4. 最常用的PHP正则表达式收集整理

    最常用的PHP正则表达式收集整理 提交 我的评论 加载中 已评论 最常用的PHP正则表达式收集整理 2015-03-20 PHP100中文网 PHP100中文网 PHP100中文网 微信号 功能介绍 ...

  5. 【Android源代码下载】收集整理android界面UI效果源码

    在Android开发中,Android界面UI效果设计一直都是很多童鞋关注的问题,今天给大家分享下大神收集整理的多个android界面UI效果,都是源码,都是干货,贡献给各位网友! 话不多说,直接上效 ...

  6. 超常用的PHP正则表达式收集整理

    以下就是对超常用的PHP正则表达式进行的收集整理,为了方便大家更快更好的掌握php正则表达式. 一.表单验证匹配验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-z ...

  7. amoeba-mysql配置安装&lpar;收集整理&rpar;

    本文收集整理自: Amoeba搞定mysql主从读写分离 http://blog.chinaunix.net/uid-20639775-id-154600.html Amoeba非常好用的mysql集 ...

  8. 原生JS研究:学习jquery源码,收集整理常用JS函数

    原生JS研究:学习jquery源码,收集整理常用JS函数: 1. JS获取原生class(getElementsByClass) 转自:http://blog.csdn.net/kongjiea/ar ...

  9. 收集整理的非常有用的PHP函数

    原文:收集整理的非常有用的PHP函数 项目中经常会需要一些让人头疼的函数,作为开发者应该整理一个自己的函数库,在需要之时复制过来即可.本文作者收集整理数十个PHP项目中常用的函数,保证能正常运行,你只 ...

随机推荐

  1. php部分,一个用递归无限分类的方法

    <?php $data[]=array('id'=>1,'parentid'=>0,'name'=>'中国'); $data[]=array('id'=>2,'paren ...

  2. day10-rabbitmq

    安装python rabbitMQ module pip instal pika 发布者: #!/usr/bin/env python #coding:utf8 import pika connect ...

  3. WeX5之xid相关API

    WeX5针对xid提供了以下js api: 1.根据xid获取id:this.getIDByXID(xid): 2.根据xid获取HTML节点:this.getElementByXid(xid),此a ...

  4. c&num;快捷键大全

    转发:http://zhidao.baidu.com/question/444655283 直接贴出来吧(关于VS的): 快捷键 功能 CTRL + SHIFT + B生成解决方案 CTRL + F7 ...

  5. Objective-C Runtime 运行时之三:方法与消息

    基础数据类型 SEL SEL又叫选择器,是表示一个方法的selector的指针,其定义如下: typedef struct objc_selector *SEL; objc_selector结构体的详 ...

  6. 用CSS画小猪佩奇,你就是下一个社会人!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯,这是我的爸爸,嚯~ 背景 小猪佩奇已经火了好 ...

  7. vue实现筛选功能,文字选中变色

    <template> <Poptip trigger="hover" title="Title" content="content& ...

  8. 如何重置mate的面板到初始化时的默认设置?

    在你的任何终端中敲入如下命令: gsettings reset-recursively org.mate.panel

  9. DevExpress&period;XtraCharts曲线上的点所对应的坐标值

    private void chartControl_ObjectSelected(object sender, HotTrackEventArgs e) { e.Cancel = false; XYD ...

  10. Hadoop&lpar;HA&rpar;分布式集群部署

    Hadoop(HA)分布式集群部署和单节点namenode部署其实一样,只是配置文件的不同罢了. 这篇就讲解hadoop双namenode的部署,实现高可用. 系统环境: OS: CentOS 6.8 ...