CN1232913C - 最优控制计算机网络程序存储传递的计算机化系统及方法 - Google Patents

最优控制计算机网络程序存储传递的计算机化系统及方法 Download PDF

Info

Publication number
CN1232913C
CN1232913C CNB988094150A CN98809415A CN1232913C CN 1232913 C CN1232913 C CN 1232913C CN B988094150 A CNB988094150 A CN B988094150A CN 98809415 A CN98809415 A CN 98809415A CN 1232913 C CN1232913 C CN 1232913C
Authority
CN
China
Prior art keywords
computing machine
code module
request
server
machine
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CNB988094150A
Other languages
English (en)
Other versions
CN1315018A (zh
Inventor
迈克尔·A·范伯格
马修·A·范伯格
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Catharon Productions Inc
Original Assignee
Catharon Productions Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Family has litigation
First worldwide family litigation filed litigation Critical https://patents.darts-ip.com/?family=25416079&utm_source=google_patent&utm_medium=platform_link&utm_campaign=public_patent_search&patent=CN1232913(C) "Global patent litigation dataset” by Darts-ip is licensed under a Creative Commons Attribution 4.0 International License.
Application filed by Catharon Productions Inc filed Critical Catharon Productions Inc
Publication of CN1315018A publication Critical patent/CN1315018A/zh
Application granted granted Critical
Publication of CN1232913C publication Critical patent/CN1232913C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • H04L67/10Protocols in which an application is distributed across nodes in the network
    • H04L67/1097Protocols in which an application is distributed across nodes in the network for distributed storage of data in networks, e.g. transport arrangements for network file system [NFS], storage area networks [SAN] or network attached storage [NAS]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L63/00Network architectures or network communication protocols for network security
    • H04L63/08Network architectures or network communication protocols for network security for authentication of entities
    • H04L63/0823Network architectures or network communication protocols for network security for authentication of entities using certificates

Abstract

一计算机化系统和方法,用于优化控制在网络上的计算机之间的计算机程序的存储和传送以方便交互程序使用。根据该方法,应用程序被存储在第一计算机(14)的非易失存储器(20)中,作为多个单个和独立的机器可执行代码模块。响应于来自第二计算机(12)的在网络上发送的请求,第一计算机(14)提取机器可执行代码模块的所选择之一和来自存储器的所选择的代码模块,和在网络链路上发送所选择的代码模块到第二计算机(12)。

Description

最优控制计算机网络程序存储传递 的计算机化系统及方法
发明背景
本发明涉及计算机网络上的计算和通信。具体来说,该发明涉及用于最优控制网络上计算机之间的计算机程序的存储和传递的计算机化系统及其方法,以便利交互程序使用。
在过去几年,越来越多的个人、公司和其它法人进入计算机的全球网络,即互联网。更准确地说,互联网是分散在整个世界的区域计算机网络的网络。在任何一天,互联网连接了50个以上国家的大约4亿使用者。在可预期的将来,该数字还将继续每年增长。
互联网提供了一种途径,使得个人能够以包括文本、视频、图形和声音的几种形式访问极其大量的消息。该多媒体集合(agglomeration)或信息的抽象空间通常被称为“万维网”,技术上来说,是“广域超媒体信息检索,其目的是为了实现对大全球文档的全球访问。”为了访问万维网,计算机操作员使用称为浏览器的软件。在美国最普遍的浏览器是Netscape Navigator和Microsoft公司的Internet Explorer。
Web的操作依赖所谓的超文本,使得用户能够交互。超文本基本上与普通文本相同,即它可以被存储、读取、搜索和编辑,但有一点重要的不同:超文本文档包含了到其它文档的链接。例如,在第一个文档中选择词“超文本”可以将第二文本调入用户的计算机屏幕,例如包括“超文本”的词典定义或超文本的历史记录。这些第二文本又包括到其它文本的连接,这样在一个接一个文本中连续选择选项(terms),可以在自由关联的信息游览中引导用户。以这种方式,超文本链接或“超链接”可以生成复杂的虚拟Web连接。
超媒体包括超文本文档,该超文本文档不仅包括到其它文本的链接,也包括到其它媒体诸如声音、图像和视频的链接。图像本身可以被选择链接到声音或文档。
Web用来生成和识别超媒体文档的标准语言是超文本标记语言(“HTML”)。该语言与标准通用标记语言(“SGML”)有松散的联接,但在技术上不是它的子集,SGML是一种文档格式语言,广泛用于一些计算小组(circles)中。Web文档通常用HTML书写,它不过是标准文本文件,带有包含有关布局(文本风格、文档题目、段落、列表)和超链接的信息的格式代码。
HTML限于显示功能(文本、动画、图形和音频)和表格提交(submission),在基本HTML协议(管理在计算机之间交换的消息的格式的一系列软件编码规则)中的设计局限是内在的,即阻止了在今天的桌面计算机中普遍使用的程序功能的类型的实现。因为该局限,不可能用支持企业和消费者当前寻求的互联网应用所必须的某些特性来增强HTML文档。
Sun Microsystems公司和Netscape Communication公司尝试通过实现Sun的Java编程语言作为浏览器插件程序(plug-in),引入附加的程序功能。除了支持Java,Microsoft公司引入了Active-X作为浏览器插件程序。当前,在两年的研发后,Java和Active-X都还未能传送工作组件。这些语言被软件错误所纠缠,致使不能提供更新的操作系统。即使这些语言的开发商Sun和Microsoft也在他们所写的证明这些语言的能力的Java和Active-X应用程序中碰到大的麻烦。
Java、Active-X和几乎所有的其它编程语言都使用基于AT&T在20世纪70年代所引入的为了发展UNIX操作系统的“C”编程语言的编程范例(paradigm)。尽管“C”适合于操作系统的发展,对于互联网内容发送,“C”有两个主要弱点。第一个弱点是,在使用该程序执行任何事情之前,必须装载整个程序。因为互联网内容是无止境的,大多数应用程序可以变得很大,从而由于大多数互联网连接的有限带宽使得下载是不现实的。通常的Java和Active-X应用程序在它们开始运行前需要几分钟来下载。使用基于“C”的程序的第二个弱点是,内容发展是很低效的。“C”和基于“C”范例的编程语言当前被用于生成软件工具和功能,诸如用作字处理器、电子表格(spreadsheets)和操作系统。软件发展商可以给一个长期项目安排大量的程序员,因为他们知道将产品反复地销售给现存的用户可以收回大量的投资耗费。然而,互联网内容的发展商不能支付这类方法的费用,退而采用非常简单的HTML协议,以使该发展项目经济化。
然而,即使HTML也不足以能够或便于在互联网上进行交互编程。尽管HTML很适于被动地提供多媒体信息,HTML在主动和交互软件使用和开发上是很受限的。因而,寻求在互联网上进行商业活动的公司正在寻求一种程序工具或信息交换方法,以取代HTML或者对该语言提供大的改进。与基于“C”范例的应用程序相比,互联网应用程序编程通常不必多次使用。相反互联网程序是被消耗性的:该程序仅由典型用户使用一次。为单个计算机使用而发展的应用类软件,诸如字处理器、电子表格、电子邮件等可以以更高的价格售出,因为该软件被任何个人一次又一次地使用。
基于“C”编程范例的编程语言用于涉及计算机的显示屏幕的编程交互时是笨拙的。例如,用于“小人形图形”(sprite)(可以在背景上移动的图画,或者其它非破坏方式的图形对象)的操纵的Microsoft程序需要800多行“C”代码和超过290行的汇编代码。以TenCORE语言所写的相同程序仅需要6行。
TenCORE是一种在80年代早期设计的模块化编程语言,为了便于在磁盘驱动器和RAM(随机存取存储器)之间的信息的传送,特别是交互指令的传递(“基于计算机的训练”)。那时,磁盘驱动器都很慢,RAM不可避免地很小。为了适应硬件的限制,TenCORE引入了小的单个代码模块的使用,用于执行各自的功能,从而在每个代码模块从慢的磁盘驱动器装载单个交互作用时,能有高效的性能。以实质上独立的代码模块的形式来编程是开放的,这是教育软件的必要特征,教育软件需要传递单个学生所需要的任何改错指令。TenCORE采用称为“解释器”的程序,来有效地完成所有基本的需要的功能。解释器本身没有内容。内容来自无限数目的小伪代码模块,这些小伪代码模块被装载到系统存储器,对解释器发布命令。在写程序时,程序员的工作减少到仅发布命令,将所有的实施的困难留给了解释器。
与TenCORE相比,“C”类型编程包括了一系列预写的代码库,在它们被编译时被链接到一起。理论上说,当设计新微处理器时,仅有代码库需要被重写,然后所有的程序可以使用新库被重新编译。然而,在过去20年,这些代码库的数量已经增长到了最初的为不同微处理器重写的概念不再实际的地步,因为补偿不同微处理器之间的微妙差别是很困难的。剩下的是复杂而困难的编程句法,需要经年去掌握,很难调试。
发明的目的
本发明的总目的是提供一种方法,用于在计算机网络上通信。
本发明的更具体目的是提供一种方法,用于能够或便于在计算机网络诸如互联网上进行交互编程(programming)。
本发明的相关目的是提供一种方法,用于在计算机网络上相互传送软件,以便能够增加经网络的交互计算机使用的程度。
本发明的另一个目的是提供一种计算系统,用于能够或便于在计算机网络诸如互联网上进行交互编程。
本发明的另一个目的是提供一种计算系统,用于在计算机网络上相互传送软件,以便能够增加经网络的交互计算机使用的程度。
本发明的这些和其它目的将通过附图及其描述变得清楚。
发明的综述
本发明目的在于一种计算机化系统和相关的方法,用于优化控制在网络上的计算机之间的计算机程序的存储和传送以方便交互程序使用。根据该方法,应用程序被存储在第一计算机的非易失存储器中,作为多个单独和独立的机器可执行代码模块。响应于来自第二计算机的在网络上发送的请求,第一计算机从该存储器中提取机器可执行代码模块的所选择之一并只提取所选择的代码模块,和在网络链路上发送所选择的代码模块到第二计算机。
在本发明的应用的一重要领域内,第一计算机是在网络上的服务器计算机。第二计算机可以是用户计算机或副服务器。或者,两个计算机可以是网络上的两个单独的用户计算机。
当第二计算机是用户计算机时,因为用户需要代码模块以执行应用程序中的所需功能时,产生对可执行代码模块的请求。用户的计算机不具有应用程序的所有代码模块,仅当需要新代码模块时获得这些代码模块。因为应用程序的可执行代码被分为单独可执行的模块,当单个模块由程序的用户执行所需要时,该程序可以一个模块一个模块地零碎地下载。相应地,用户在可以开始使用该程序之前,不必等待整个程序被下载。
当第一计算机和第二计算机分别是主服务器是副服务器时,本发明允许主服务器在太忙以至于不能处理用户的请求或任务时,将该请求或任务移交给副服务器。当主服务器接收到其由于负荷而不能处理的用户请求或任务时,该请求或任务最好递交给可用的最不忙的副服务器。然后副服务器处理该用户请求,并直接响应于客户/用户。如果该副服务器没有代码模块、数据文件或其它处理该用户请求所需要的资源,所需要的代码模块、数据文件或其它资源可以从第一服务器传送到副服务器。该用户请求的分流(shunting)考虑了位于不同互联网连接上的多个副服务器的利用。从而本发明解决了在互联网和其它计算机网络上的大多数带宽和服务器负荷的问题。
当然,服务器计算机必须在其到达满负荷之前卸去其负载,从而留下足够的空闲系统资源(处理器、存储器等),用于满足来自副服务器的对资源的请求,该资源对于副服务器满足分流过来的用户请求或任务是必须的。
如果副服务器不能联接客户机器,则副服务器可以递交该用户请求到另一副服务器进行处理,由于该其它副服务器可能能够直接到达该客户机器。
副服务器也可以用作后备服务器。在该情况下,副服务器立即从主服务器请求所有代码模块、数据文件和其它资源,而不是等待需要这些资源之一的客户请求。当客户或副服务器请求主服务器,且发现它不可访问时,则该请求可以由后备服务器进行。在该情况下,如果主服务器故障,在主服务器的信息仍可以通过后备服务器访问。为了便于在后备服务器上维持最新资源,任何时间只要资源产生或更新,主服务器就将通知信息包送到每个后备服务器。然后后备服务器可以从主服务器请求该新的更新的资源的拷贝,从而在任何时间保持与主服务器的同步更新。
为了最优化用户请求的处理,主服务器在其存储器中存储在网络上的副服务器的列表,该列表包括各个副服务器的响应时间和负荷统计(处理器使用率等)。主服务器通过将回声(echo)信息包送到副服务器和测量在回声信息包的发送和来自各个副服务器的对回声信息包的响应的接收之间的延迟,周期性地更新这些响应时间。该服务器也通过从副服务器请求当前的负荷统计,周期性地更新负荷统计。为了处理新近接收用户请求,主服务器扫描在存储器中的列表,选择具有最轻负荷和最短响应时间的副服务器。
为了安全目的,代码模块以及诸如数据文件的其它资源以加密形式发送。加密通过将代码模块、文件、文档或其它可发送的资源放在加密信息包的数据区域中来实现。当接收到加密信息包时,它被解密,代码模块、文件、文档或其它可发送的资源随后以正常过程处理。加密/解密处理可以由插入代码模块来处理。根据本发明在任何时候,任何数量的插入加密代码模块可以存在于数据和代码发送系统中。加密信息包的首标包含哪个插入加密代码模块必须被用于解密目的指示。加密/解密代码模块可以由代码模块交换协议实时传送。
为了进一步增强系统的安全性,主服务器在其存储器中存储用户验证代码的列表。在从另一个计算机接收到一请求之后,例如用于机器可执行代码模块的请求,主服务器比较在请求中的用户验证代码与用户验证代码的所存储的列表。只有在请求中的用户验证代码与所存储的列表中的用户验证代码相匹配时,才进行所选择的机器可执行代码模块的提取和发送。当进入的对机器可执行代码模块的请求包含在加密信息包中时,该服务器解密该加密信息包,然后比较在请求中的用户验证代码与存储器中的用户验证代码的列表。加密信息包的加密和解密,以及用户验证代码的核查,可以由副服务器执行。根据本发明任何实现这些安全措施所需要的程序和数据可以从主服务器发送。
本发明提供了在用户的机器中的应用程序的更新。当用户将对一代码模块的请求送到一服务器时,该请求包括所寻求的程序代码的版本的说明。处理该请求的服务器核查是否所请求的版本是可用的最新版本。当所请求的代码模块的更新版本可用时,服务器通知用户,询问是否用户可以使用所请求的模块的更新版本。用户然后可以将对所需的代码模块的更新的版本的请求送出。
如果所需的代码模块的更新版本是与其它代码模块的较早版本不兼容的,则所需的代码模块的较早版本将从服务器传送到用户。如果较早版本不可用,则用户可能不得不请求几个附加模块的较新版本的发送。
通常,考虑机器可执行代码模块是以用户友好程序代码诸如TenCORE来书写的。在该情况下,用户计算机的软件实现的解释器(interpreter)单元将来自程序代码的代码模块翻译为可直接由用户计算机利用的机器代码。当使用该解释器时,解释器本身可以被以与应用程序或代码模块相同的方式被更新。为了更新该解释器,该解释器被看作单个大代码模块。
在根据本发明的用于优化控制在网络上的计算机之间的计算机程序的存储和传送以方便交互程序使用的相关方法中,一部分应用程序被存储在第一计算机中。应用程序包括多个单独和独立的机器可执行代码模块,仅有一些机器可执行代码模块存储在第一计算机中。该方法包括至少在第一计算机上执行机器可执行代码模块之一;将对应用程序的其它机器可执行代码模块的请求经网络链路发送到第二计算机;经网络链路在第一计算机接收来自第二计算机的其它机器可执行代码模块;并且,在第一计算机上执行其它的机器可执行代码模块。
为了进一步方便在网络上的程序传送,第一计算机可以进行对服务器可用性的调查。根据本发明的该特征,一对所述网络上的服务器列表(例如副服务器)的请求被从第一计算机(例如一用户)发送到其它计算机(例如,主服务器)。在发送服务器列表到第一计算机之后,服务器的响应时间由以下步骤确定(a)从第一计算机将回声信息包送到服务器,(b)在第一计算机测量在发送和接收该回声信息包之间的延迟,(c)询问服务器关于当前服务器负荷(处理器利用率等)。对其它机器可执行代码模块的请求被送到具有最轻负荷和最短所测响应时间的服务器。服务器列表可以由第一计算机缓存在存储器中,以便于在列表被请求的服务器变得不可用或太忙以至于不能处理该请求时,对信息的进一步访问。
若在所请求的代码模块中已经有更新,来自第一计算机对代码模块的特定版本的请求可能引起对是否第一计算机可以使用代码模块的更新版本的询问。如果是这样,第一计算机发送第二请求,这次是对所需代码模块的更新版本。
当两个计算机都是用户计算机时,本发明的方法方便了交互处理。每个计算机响应于由其它计算机执行的代码模块,执行一个或多个所选择的代码模块。这样,两个计算机至少存储了应用程序的一些机器可执行代码模块。有时一个计算机将需要在其当前存储器中没有的代码模块。则该计算机可以从另一个计算机获得所需的代码模块。如果另一个计算机没有所需的模块,可以请求其中存有该应用程序的服务器。
当机器可执行代码模块是用用户友好编程代码书写的,每个用户计算机包括一解释器模块,它用软件修改通用数字处理电路实现,其将来自编程代码的代码模块翻译为可以由各个计算机利用的机器代码。
根据本发明的特征,机器可执行代码模块每个包含用户标识。然后该方法还包含响应于由用户计算机在网络上接收的指令,在用户计算机上执行机器可执行代码模块之一之前,确定是否包含在机器可执行代码模块之一中的特定的作者标识是一被允许的标识。仅当特定作者标识是一被允许的标识时用户计算机继续执行代码模块。通常,确定是否代码模块是由一被允许的作者书写的指令是一黑名单作者的列表。
本发明的作者标识特征是为了防止一作者产生病毒或其它有害程序,和使用本发明的代码模块交换协议散布它们。根据本发明所有支持单个机器可执行代码模块的编码的编译器将各个作者标识代码装入每个机器可执行代码模块。作者标识对每个作者是唯一的。当发现有害程序时,该作者的标识可以通过网络而散发以便将该作者列入黑名单,以防止包含在黑名单中的作者的标识的代码模块的执行。其它的优点是,该特征可阻止用户散布所创作信息包的非法拷贝,由于各个用户将对以他们的作者标识所写的任何有害程序负责。
在用户计算机中的应用程序模块的存储可能包括在用户计算机的非易失存储器中缓存代码模块。
应该注意本发明允许在用户计算机空闲时间发送代码模块,若其使用是被预期的话。在用户计算机的空闲时间,来自用户计算机的对机器可执行代码模块的请求被发送到一服务器或其它计算机。
根据本发明,一种计算系统,包括数字处理电路和存储通用操作程序和应用程序的非易失存储器。该应用程序包括多个单独和独立的机器可执行代码模块。所述存储器被连接到所述处理电路以使得能够由所述处理电路访问所述存储器。一通信链路用于在网络上传送数据和程序到远程计算机。一代码模块交换装置,可操作地连接到所述存储器和所述通信链路,用于从所述机器可执行代码模块中提取单个代码模块,和响应于来自所述远程计算机的对所述单个代码模块的请求将所述单个代码模块发送到所述远程计算机。
如上所述,本发明的计算系统可以是在所述网络上的服务器计算机。所述服务器的存储器可以包含在所述网络上的副服务器的列表,该列表包括各个副服务器的响应时间。该计算系统还包括检测电路,通常由软件修改的通用数字处理电路实现,用于检测所述计算系统的过载状态。一服务器选择器,也通常由软件修改的通用数字处理电路实现,可操作地连接到所述检测电路、所述存储器和所述通信链路用于确定哪个所述副服务器具有最短的响应时间,和用于当所述过载状态在所述用户请求到达时存在时,将进入的用户请求分流到具有最短响应时间的副服务器。
因此,将代码模块请求发送到计算系统的远程计算机可以是一副服务器,用户请求已经被分流到该副服务器。对所请求的单个代码模块的要求是:使所述远程计算机能够代表该计算系统处理所述用户请求。
根据本发明的另一个特征,所述的计算系统,还包括更新单元,最好由软件修改的通用数字处理电路实现,可操作地连接到所述存储器和所述通信链路,用于(1)周期性地送出回声信息包到所述副服务器,(2)测量在所述回声信息包的送出和从各个副服务器接收到对所述回声信息包的响应之间的延迟,和(3)根据所测量的延迟,更新在所述列表中的响应时间。
为了安全目的,计算系统的存储器可以包含一用户验证代码的存储的列表。该计算系统还包括一比较单元,最好由软件修改的通用(generic)数字处理电路实现,用于将在进入的请求中的用户验证代码与在所述存储器中的用户验证代码的所述列表相比较,和用于在所述请求中的用户验证代码和在所述列表中的任何用户验证代码都不对应时,阻止代码模块提取和发送。
当对代码模块的进入的请求被包含在加密信息包中时,该计算系统还包括一软件实现的解密电路,连接到所述通信链路和所述比较单元,用于在比较在所述请求中的所述用户验证代码和在所述存储器中的用户验证代码的所述列表之前,解密所述加密信息包。
根据本发明的另一个特征,计算系统包括装置,用于确定是否所请求的代码模块具有更新的版本,并采用到所述远程计算机的邀请来响应所述请求,以接受所请求的代码模块的更新版本。
应该考虑所述机器可执行代码模块是写在用户友好编程代码中的。当计算系统使用应用程序代码本身时,该计算系统还包括一解释器,用于将所述编程代码翻译为可以由所述处理电路用的机器代码。该解释器可以采用通用数字处理电路的形式,由编程来修改,以执行翻译功能。
根据本发明的一种计算系统(例如,在网络上的用户计算机)也包括一存储器,存储一应用程序的一部分,所述应用程序包括多个单独和独立的机器可执行代码模块,仅有一些机器可执行代码模块存储在所述存储器中。一数字处理电路,可操作地连接到所述存储器,用于执行至少所述机器可执行代码模块之一。一通信链路用于在网络上通信传送数据和程序到远程计算机。一代码模块交换单元,可操作地连接到所述存储器和所述通信链路,用于经网络链路和远程计算机通信,以从所述远程计算机获得所述应用程序的其它机器可执行代码模块。所述数字处理电路可操作地连接到所述代码模块交换装置,用于在接收到来自所述远程计算机的所述其它机器可执行代码模块后执行所述其它的机器可执行代码模块。
当客户或用户机器没有满负荷运行时(处理器空闲时间超过给定阈值和网络业务量在给定阈值之下),该机器可以寻找在同一虚拟网络上可能正处于处理器密集任务中的其它客户机器,并分担一些负荷。如果必要,处理该任务的代码模块可以被发送到空闲客户机器。对于对同一项目协同工作的客户来说,使用定制子协议彼此通信是可能的。该客户侧分布式处理显著提高了处理器密集任务的性能。
本发明提供了编程范例,以满足互联网内容开发者的特殊需要。根据本发明的软件系统和计算机通信方法在互联网上快速地传递,提供了实用的编程范例,支持内容的快速经济开发,方便了在互联网软件中提供新能力和系统管理。
TenCORE,一种模块化编程语言,设计成使用小的有效代码模块,用于方便在盘驱动器和桌面计算机的中央处理单元之间的的程序传送,可以容易地修改以实现本发明。最小的修改需要发送能力适应于工作在网络链路上。
本发明部分是因为发明者认识到,在1980年TenCORE的开发者所面临的问题同样是今天的软件设计者当处理互联网和其有限带宽及慢的连接时所面临的问题。人们认识到,互联网应用必须是端开放的,不管带宽限制如何,程序必须被快速地传送。因此,由TenCORE提供的解决方案在解决今天互联网上交互软件的问题时是有用的。TenCORE的模块化编程使得能够加快互联网操作,因为单个TenCORE Net编程程序模块可以在互联网上快速下载。TenCORE NET编程模块是TenCORE编程模块,它们被修改以便能够从互联网服务器而不是从微计算机的盘驱动器下载。
TenCORE和TenCORE NET是解释的语言,即它们用于翻译为机器语言伪代码程序,以便在他们被翻译时执行指明的操作。“伪代码”与特定的计算机的硬件无关,需要在可以使用该程序之前转换为由计算机使用的代码。一旦TenCORE NET解释器被安装在配有互联网连接的计算机上,用鼠标点击传统的万维网超链接,该超链接指向TenCORE NET应用程序,就自动绕过了互联网浏览器软件和启动了该应用程序。因为只将所需的模块在互联网上传送,且TenCORENET模块非常小,互联网操作就很快。
附图的简要描述
图1是根据本发明的带各种服务器和用户计算机的计算机网络的方框图,它们彼此发送可执行程序。
图2是根据本发明的主服务器的方框图。
图3是根据本发明的用户计算机的方框图。
图4是说明在图2的主服务器和图3的用户计算机中的所选择的程序修改的处理电路的操作的维护循环(loop)的流程图。
图5是说明在图2的主服务器和图3的用户计算机中的所选择的程序修改的处理电路的操作中用于处理进入的数据信息包的循环的流程图;
图6A和6B是根据本发明说明关于对进入的对代码模块的请求的处理的其它操作的流程图;
图7是说明在图2的主服务器中的所选择的程序修改的处理电路的操作中处理进入的资源请求信息包的子例程的流程图;
图8是说明在图2的主服务器或副服务器中的所选择的程序修改的处理电路的操作中的维护循环的流程图;
图9是说明在图2的主服务器中的所选择的程序修改的处理电路的操作中处理进入的资源请求信息包的子例程的流程图;
图10是说明在图2的主服务器或副服务器中的所选择的程序修改的处理电路的操作中的维护循环的流程图。
优选实施例的描述
如图1所示,计算机网络包括多个用户计算机12,通过复杂的网络链路16,可操作地连接到主服务器14。在图2中,在非易失存储器20的区域18中,主服务器14存储一应用程序,该应用程序可以被设计为在一个或多个用户计算机12上使用。这里所用的术语“应用程序”指除了操作系统外的任何可执行计算机代码集合和其它控制基本机器功能的支持程序。
如图1所示,网络包括多个副服务器22,在响应来自用户计算机12的请求时可以帮助主服务器14。具体说,如图2所示,主服务器14包括过载检测器24,它连续地监测主服务器14必须执行的工作或任务的队列。过载检测器24确定是否在该队列中的任务的数目和大小超过了预定阈值。一旦到达该阈值,过载检测器24给副服务器选择器26发信号,副服务器选择器26访问存储器20的区域28,以确认副服务器22哪个最不忙。为此,存储器区域28包含了副服务器22的列表和各个服务器的所测响应时间。
通过将回声信息包分发(dispatch)给每个副服务器22和测量在从主服务器14发送各个回声信息包与来自副服务器22的响应的接收之间的延迟,在存储器区域28中副服务器列表中的响应时间被周期性测量。为了完成该测量,主服务器14,更准确的说,其处理单元30包含回声信息包分发器32和响应时间监视器34。在经主服务器14的网络通信接口36发送回声信息包到副服务器22后,分发器32通知响应时间监视器34关于信息包的发送和进行此发送的副服务器22。监视器34计算出回声信息包的发送和来自各个副服务器22经网络链路16和通信接口36的响应的到达之间的时间。响应时间更新单元38被连接到响应时间监视器34和存储器区域28,用于在存储在存储器区域28中的副服务器列表中写入更新的响应时间。
在存储器20中的应用程序存储器18包含多个单个的和独立的机器可执行代码模块。相应地,用应用程序工作的用户计算机12不需要装载整个程序以开始处理操作。若用户执行应用程序需要没有包含在用户的计算机存储器中的代码模块,一请求被从用户计算机12经网络链路16发送到主服务器14。如果主服务器14没有过载,它从程序存储器18提取所请求的代码模块,将其经通信接口36和网络链路16发送到作该请求的用户计算机。
主服务器14的处理单元30包括代码模块交换器40,该代码模块交换器40处理对应用程序的代码模块或存储在存储区域18中的程序的进入请求。代码模块交换器40与版本检测器42协同工作,版本检测器42咨询应用程序存储器18以确定是否特定代码模块的所请求版本是存储器18中的最新的版本。如果不是,版本检测器42和代码模块交换器40发送一查询到正休整的计算机,查询是否所希望的代码模块的最新版本是由请求者可利用的。如果所希望的代码模块的较新版本可以用来取代旧版本,新版本被通过通信接口36和网络链路16而发送。
代码模块,以及诸如数据文件的其它资源,为了安全的目的,可以以加密形式被发送。通过将代码模块、文件、文档或其它可发送的资源放在加密信息包的数据区域中,可以完成加密。当加密的信息包被处理单元30经通信接口36接收时,该信息包经通用处理电路50递交给加密/解密单元44用于解码。加密/解密单元44咨询包含多个可能的加密密钥的存储器区域46,选择由包含用户请求的加密信息包中的首标信息识别的加密密钥。在解密进入的加密信息包后,包含在其中的用户请求或代码模块交换信息包递交给代码模块交换器40用于处理。加密/解密处理可以由一执行加密/解密单元44和存储器区域46的功能的插入代码模块来处理。任何时刻都可以有任何数目的插入加密代码模块存在于数据和代码传送系统中。加密信息包的首标包含哪个插入加密代码模块必须被用于解密目的的指示。
为了进一步增加具有可执行代码模块的交换协议的计算机网络的安全性,主服务器14在存储器区域48存储用户验证代码的列表。响应于来自另一计算机的例如针对机器可执行代码模块的请求,处理单元30中的比较器52将请求中的用户验证代码与存储在存储器区域48中的用户验证代码的列表相比较。只有当在请求中用户验证代码和所存储的列表中的用户验证代码匹配时,代码模块交换器40才提取和发送所选择的机器可执行代码模块。进入的机器可执行代码模块的请求包含在加密信息包中时,在由比较器52比较请求中的用户验证代码与在存储器区域48中的用户验证代码列表之前,加密/解密单元44解码加密信息包。用户请求被转发到由选择器26选择的副服务器22时,该副服务器包括加密/解密单元和验证代码比较器,用于加密和解密加密信息包,检查用户验证代码,该操作可以由副服务器执行。任何完成这些安全措施所需要的程序或数据可以从主服务器14传送到副服务器22。
如图3所示,用户计算机12的处理单元54包括代码模块交换器56,代码模块交换器56在应用程序执行过程中由用户要求代码模块时,产生应用程序的所需代码模块的请求。代码模块请求在用户计算机12经网络通信接口58、网络链路16(图1)和主服务器14的通信接口36被发送到主服务器14的代码模块交换器40。
在安全增强系统中,用户计算机12的处理单元54包括加密/解密单元60,加密/解密单元60将代码模块请求分组以及其它信息传送分组插入各个加密分组的数据区域,这些加密分组的加密密钥从存储在用户计算机12的非易失存储器64的区域62中的多个密钥中选择。另外,用户计算机12的加密/解密处理可以由执行存储器区域62和加密/解密单元60的功能的嵌入代码模块来处理。由加密/解密单元60产生的加密分组的首标包含一指示,主服务器14的嵌入加密代码模块必须用于解密目的。
在用于保护图1的总的计算系统或具体说用户计算机12不受计算机病毒和其它有害程序的侵扰的其它安全增强系统中,处理单元54带有作者识别比较器66,作者识别比较器66访问存储器64中的作者识别列表68。作者识别列表68由作者识别比较器66和通用处理电路70中的其它转换功能块响应于来自主服务器14的进入指令而周期性地更新。作者识别列表68包括所允许的作者的列表,或者可能更有效地,包括由于其将病毒或其它有害程序带入网络而被列入黑名单的作者的列表。在使用进入的机器可执行代码模块之前,在分组首标的作者识别由比较器66检查以确定是否特定代码模块的作者已经被列入黑名单。如果该作者被允许为用户计算机12产生可执行代码模块,进入的代码模块的处理正常地进行。另一方面,如果进入的代码模块的作者已经被列入黑名单,那么该代码模块永不执行,可以在存储在存储器64中的应用程序存储器72中之前被丢弃。
如上所参照图1和图2的描述,主服务器14根据主服务器和副服务器的负载条件,可以偶而切换进入的用户请求到副服务器22。通常,该负责响应于用户的请求的切换对用户是透明的,即,用户的请求的处理的进行不用通知用户或由用户干涉。对于用户计算机12也可以从主服务器14接手副服务器22的选择。为此,用户计算机12的处理单元54带有副服务器选择器74,副服务器选择器74访问存储器64中的副服务器列表76。通常,选择器74用相对各个用户计算机12的最小响应时间选择副服务器22。为此,处理单元54还包括回声信息包分发器78、响应时间监视器80和响应时间更新单元82。回声信息包分发器78将回声信息包经通信接口58和网络链路16(图1)送到副服务器22,而监视器80确定来自各种副服务器的响应的延迟。更新单元82根据由分发器78和监视器80执行的测量修正在列表76中的响应时间数据。应指出,仅当用户计算机12需要来自主服务器14的用户模块或其它资源且该服务器太忙无法处理用户请求时,更新在列表76中的副服务器响应时间。
用户计算机12的处理单元54具有分布式处理电路84,该分布式处理电路84使得处理单元54能够与网络中的其它用户计算机分享大任务的处理。这样,当用户计算机没有以满容量运行时(处理单元54有多于50%空闲,没有网络业务量),该分布式处理电路84寻找其它正处于处理器密集的任务中的用户计算机12,使得一些负荷能够传送到各个用户计算机12的处理单元54。如果必要,处理该任务的代码模块可以被传送到空闲用户计算机12。该客户侧分布式处理大大地提高了处理器密集型任务的性能。
用户计算机12的处理单元54还包含一计量送达(metered delivery)和记帐电路86,计量的送达和记帐电路86控制对必须付钱的内容的访问。可以由电路86访问的存储器64中的金额(credit)登记器88存储特定用户在各个帐户的金额。当由主服务器14维护或监视的一个帐户中的金额低时,电路86可以安排更多金额从主服务器14到特定用户的传送。计量送达和记帐电路86包括一记帐方法以支付该金额。通常,其金额请求和响应应该被加密。
用户计算机12的处理单元54还包括一单向数据提交和收集电路90,为了上载存储器64中的数据文件92到主服务器14或所选择的副服务器22,访问这些数据文件。当用户计算机不需要从服务器读回该数据时,数据提交和收集电路90工作。该电路对在线下单、表格提交和数据收集(包括统计数据)特别有用。
通常,包含要写入的数据的分组必须直接送到主服务器14,不能被分流。本发明在被写入的资源的不同版本之间有冲突。写回到服务器的数据应该需要用户验证。即使仅由在作者控制下的一程序进行回写,也应该使用用户验证。在这种情况下,用户验证代码和口令可以被内置在程序中。其原因是防止另一作者写入一程序,它可能写回到同一数据和可能破坏它。
存储在存储器区域18(图2)和模块存储器72(图3)中的应用程序代码模块用TenCORE写,TenCORE是一种模块化编程语言,起初设计为使用小的高效的代码模块用于方便在桌面计算机的磁盘驱动器和中央处理单元之间的程序传送。TenCORE容易被修改,例如为了适用在网络链路上工作的代码传送能力。这样修改以用于用户计算机12、主服务器14和副服务器22上的程序被称为“TenCORE Net”。
TenCORE Net使用小的个人代码模块,用于执行各个功能,由于从主服务器14或所选择的副服务器22以单个交互动作下载每个代码模块,能够有高效的性能。TenCORE Net的程序是开放的,这样当应用程序仅部分地存储在存储器64中的程序存储器72中时,用户计算机12可以执行该应用程序的指令。
保存在存储器72中的代码模块是用户友好的伪代码语言,必须被翻译或解释,以便机器直接使用。为此,处理单元54包括一程序或编程的解释器电路94,高效地实现所有的基本需要的功能。该解释器本身没有内容。内容是从可以无限多小伪代码模块中提取,这些伪代码模块被载入存储器72中,有效地发布命令到解释器94。在写程序时,程序员或作者的介入被减少到仅仅发布命令,而把所有实施的困难留给解释器。
TenCORE可以用两种方式修改以适于网络使用。首先,在用于检查是否在应用程序存储器区域72中存在用于执行的代码的每个计算机代码的调用行之前,可以插入子例程或一组指令。如果不这样,代码模块交换器56被指令从主服务器14获得所需要的代码模块。一旦所需要的代码模块已经被下载到存储器区域72,其在由处理电路70执行之前被解释器电路94调用和翻译。
通过模块化应用程序和代码模块交换器40和56的使用,在网络上的计算机12、14、22之间的计算机程序存储和传送的控制被最优化,从而方便了交互式的程序使用。存储在主服务器14的非易失存储器区域18中的应用程序可以以模块形式被传送到各种用户计算机12。响应于来自用户计算机12或所选择的副服务器22在网络链路16上传送的请求,主服务器14从存储器区域18提取所选择的机器可执行代码模块并只提取该选择的代码模块,在网络链路16上传送所选择的代码模块到用户计算机或副服务器。
例如,当应用程序是绘图或绘画程序时,用户计算机12可以被指令画一三维几何图形,诸如截断的棱锥。如果处理电路70发现程序存储器72中的应用程序没有执行该任务所需的代码模块,代码模块交换器56请求必要的模块从主服务器14被传送。响应于该请求,版本检测器42可能发现希望的模块的较新版本存在,代码模块交换器56查询是否较新版本对各个用户计算机是可接受的。
这样,用户计算机12不具有应用程序的所有代码模块,仅当新代码模块需要时才获得这些模块。因为应用程序的可执行代码被分为单个可执行的模块,所以当用户执行程序需要单个模块时,该程序可以一个模块一个模块地被下载。相应地,在用户可以开始使用该程序之前,用户不必等待整个程序被下载。
类似地,所选择的副服务器22可以开始处理所传送或分流的用户请求,直接响应于客户/用户,而不需要由主服务器14具有整个应用程序和其它有关程序的分布的处理的资源。如果所选择的副服务器没有处理用户请求所需要的代码模块、数据文件、或者其它资源,则所需要的代码模块、数据文件、或者其它资源可以从主服务器传送到副服务器。因而,副服务器22配有类似于交换器40和56的代码模块交换器。
当然,主服务器14必须在服务器达到其满容量前卸掉其负载,从而留下足够的可用系统资源(处理器、存储器等),来执行来自副服务器的对该副服务器履行分流的用户请求或任务必要的资源的请求。
在安全敏感网络中,副服务器22配有象单元44的加密/解密单元,以及验证比较器52。当进入的对机器可执行代码模块的请求包含在加密分组中时,在比较请求中的用户验证代码和在存储器中的用户验证代码列表之前,副服务器解密加密分组。无论何种执行这些安全措施需要的程序或数据都可以从主服务器14传送。
如果副服务器不能连接客户机器,副服务器可以将用户请求送到另一个副服务器用于处理,因为该另一个副服务器可能可以直接连接客户机器。
处理单元54的代码模块交换器56方便了在网络上的交互处理。每个用户计算机12响应于该另一个计算机的代码模块的执行,执行一个或更多的所选择的代码模块。这样,两个计算机都至少存储应用程序的一些机器可执行代码模块。有时,一个计算机将需要在当前存储器中没有的代码模块。那么该计算机可以从其它计算机获得所需的代码模块。如果其它计算机没有所需的代码模块,可以请求其上存在整个应用程序的服务器。
这样,在网络上的客户或用户能够彼此交换代码模块。如果第一用户和第二用户处于一交互白板会议(whiteboarding session)中,第一用户使用一工具开始画图,而第二用户在其自己白板程序版本中没有该工具,则该工具的代码模块可以从第一用户的计算机自动传送到第二用户的计算机。
应该注意,在预期使用的代码模块的用户计算机的空闲时间,代码模块交换器56可以被指令启动该发送。在用户计算机上的空闲时间期间,来自用户计算机12的对机器可执行代码模块的一请求被传送到主服务器14或其它计算机。为空闲时间下载所产生的资源请求应该被如下标记,使得代码模块交换器56可以从标准请求中为负载平衡和分布指定不同的优先级。若用户试图访问应用程序的相关部分,则资源请求的状态可以从空闲时间升级为实时。
应该注意,处理单元30和54的各种专门的功能块通常也最好是以软件修改的通用数字处理电路来实现。相应地,代码模块交换器40和56可以称为服务器14或22与用户计算机12之间的代码模块的交换的协议。该代码模块交换协议被认为是模块化代码主协议(“MCMP”)的子协议,MCMP处理负载分配、用户验证和加密。更具体说,负载分配由主服务器14中处理器过载检测器24和副服务器选择器26来处理,而用户验证和加密由主服务器和副服务器22中的比较器52和加密/解密单元44来处理。
MCMP由四个子协议,即,代码模块交换协议(“CMXP”)、单向数据提交和收集协议(“UDSCP”)、计量送达和记帐协议(“MDBP”)、和分布处理协议(“DPP”)。代码模块交换协议由主服务器14和副服务器22的处理单元30中的代码模块交换器40和用户计算机12的处理单元54中的代码模块交换器56来实现。单向数据提交和收集协议由用户计算机12中的电路90和主服务器14中的对应的未图示的程序修改处理电路来完成。计量送达和记帐协议由用户计算机12中的电路86和主服务器14中的对应的未图示的程序修改处理电路来完成。分布处理协议采用用户计算机12的处理单元54中的电路84的形式。
图4示出为了维护副服务器22的可用性的更新列表28的回声信息包分发器32、响应时间监视器34和更新单元38的操作,以及主服务器14的处理单元30的其它处理电路的操作。同样的步骤可以由回声信息包分发器78、响应时间监视器80和更新单元82以及用户计算机12的处理单元54的其它处理电路来执行,以获得副服务器响应时间的更新列表。在询问步骤100中,回声分发器32或78或通用处理电路50或70征询是否自上次回应测试以来的时间大于预定最大周期TMR。如果最大周期已经被超过,回声信息包分发器32或78在步骤102发送一回声信息包到刚刚被检测的副服务器22。响应时间监视器34或80在询问步骤104中确定是否已经从目标副服务器22接收到响应。如果没有接收到响应且在判断步骤106判定预定次数的测量尝试还没有超过,则在步骤102,分发另一个回声信息包。如果从目标副服务器22接收到响应,则更新单元38或82在列表28或76记录由分发器32或78的初始信息包发送和由监视器34或80接收回声信息包之间的时间。该记录在步骤108执行。如果在判断步骤106确定在副服务器响应时间测量的尝试次数超过预定数目,则服务器在列表28或76中被标注为当前不可用(步骤110)。且可以产生一消息或告警信号以通知服务器管理人。如果在询问步骤100,确定自上次回声测试以来的时间小于预定最大周期TMR,处理单元30或54在步骤112检查是否在MCMP进入信息包队列中有一信息包。如果没有,图4的维护循环重新进入。如果是这样,信息包处理操作114被执行。应该注意MCMP进入信息包队列包括从网络接收的信息包和由MCMP协议放入该队列的信息包。
图6A和6B示出在MCMP协议下由所选择用于溢出处理的主服务器14或副服务器22的处理单元30完成的操作114。在初始查询步骤124,过载检测器24确定是否处理单元30太忙以至于不能处理进入的信息包(例如,这可能是对代码模块的用户请求)。如果是这样,处理电路50在步骤126检查MCMP信息包首标以确定是否该信息包可以被分流到副服务器22。如果是这样,进行进一步的检查128以确定是否进入的信息包已经被分流。如果该信息包由初始计算机(即,没有分流)直接送到该服务器,副服务器选择器26在步骤130访问列表28以找到带最小负载的副服务器22。在子查询步骤132,处理单元30,具体的说,副服务器选择器26确定是否所选择的副服务器适于负责进入的信息包的传送。如果所选择的副服务器是适合的,该信息包被标记(flagged)为服务移交的结果,并发送给所选择的副服务器(步骤134)。
如果在步骤130所选择的副服务器不适于移交,例如,如果查询步骤132确定副服务器的响应时间大于预定的最大值,进行询问步骤136,询问是否进入的信息包是服务移交(hand-off)的结果。如果该信息包不被分流,如判断步骤126所确定的,也进行该询问步骤136。
如果进入的MCMP信息包是服务移交的结果,如询问步骤136所确定,处理电路50进行关于是否所请求的资源可用的检查步骤138。如果该资源是可用的,在140中处理电路50询问是否该资源已经过了预先指定的有效期。如果是这样,在步骤142,一信号被发送到该资源的来源以确定是否该资源的较新版本是可用的。如果一新版本是可用的,如判断步骤144所确定的,则对该资源的较新版本的请求在步骤146被发送到该来源。该请求被标记为不可分流且应该被另外标记为优先请求。
在对进入的信息包(例如,代码模块的用户请求)的处理之前,处理单元30在查询步骤150检查在进入的信息包中的首标信息,以确定是否该信息包包含用户验证信息。当找到用户验证信息时,在步骤152确定信息包的先前加密状态。如果该信息包没有被加密,在步骤154产生一消息以报告用户验证失败。如果该进入的信息包被加密了,在步骤156检查MCMP首标信息,以确定是否该来源服务器被指明。如果没有指明来源服务器,在步骤154报告用户验证失败。如果在MCMP首标信息中指明了来源服务器且该来源服务器不是主服务器,如判断步骤158所确定的,在步骤160(由验证代码比较器52)进行检查,看是否存储器区域48有一未失效的、用户验证数据的高速缓存拷贝。如果在存储器区域48中没有未失效的、用户验证数据的高速缓存拷贝,则比较器52促使处理电路50从源服务器获得用户的验证数据且存储该数据在存储器区域48中(步骤162)。如果包含在MCMP信息包首标信息中的用户的口令不匹配于所缓存的口令,如比较器52在评估步骤164所确定的,或者用户没有列在源服务器中,如由处理电路50在检查步骤166所确定的,则在步骤168报告用户验证失败。如果源服务器是主服务器(判断步骤158)或者如果比较器52在调查步骤170发现在信息包首标中的用户验证数据不对应于存储器区域48中的任何用户验证数据,则也作出关于用户验证失败的报告(步骤154)。
一旦比较器52发现在进入的信息包中的验证代码和在存储器区域48中的用户的验证代码之间匹配,如检查步骤170或评估步骤164所确定的,或者如果进入的信息包不包含用户验证代码,则评估步骤171确定是否信息包应该直接由MCMP协议处理,还是由另一个协议处理。如果评估步骤171确定信息包应该直接由MCMP协议处理,则该信息包相应地在步骤173被处理,如图5所示。如果评估步骤171确定信息包应该由特定的协议处理,则在步骤172处理电路50确定哪个协议(例如,CMXD、UDSCP、MDBP、DPP)适于处理信息包的内容。如果由处理单元30在所选择的协议下或由主MCMP协议产生一响应,如查询步骤174所确定的,该响应在步骤176被发送到初始进行该请求的客户。如果有一服务移交,即,如果该信息包被分流到主服务器,则该响应将被发送到除了主计算机从其中接收信息包的计算机以外的一计算机。在步骤178,处理单元30开始处理在队列中的下一信息包,或者等待新信息包的到来。
如图5所示,处理操作173包括对信息包类型的初始查询步骤116。如果该信息包是加密信息包,在步骤118,加密/解密单元38或60被激活以使用合适的解密模块或密钥解密该信息包。在后续步骤120,在所加密的信息包的数据区域中所包的信息包被标记为不可分流,且放回MCMP进入信息包队列。如果在查询步骤116确定该信息包不是加密信息包,则在步骤122MCMP状态报告指明,一未知信息包类型被发出,该信息包被丢弃。通过增强在图5中所示的处理以包括另外种类的信息包的条件,可以在以后增强MCMP协议的功能。
代码模块交换协议(CMXP)处理可执行代码的动态下载、程序版本控制、客户到客户模块交换、病毒和坏程序保护、数据上载、空闲时间下载和代码模块缓存。这些功能分别在服务器14和22中由代码模块交换器40和版本检测器42和在用户计算机12中由代码模块交换器56、作者识别比较器66和单向数据提交和收集电路86以及由各种非指定的通用处理电路50或70来执行。CMXP协议的服务器侧部分,由于部分由代码模块交换器40实施,处理代码模块和诸如图形图像和字体的支持资源的传递。到CMXP服务器和代码模块交换器40的请求可以参考文件、部分文件(诸如代码模块)、或者部分代码模块或其它支持模块。因为程序被分解为独立的代码模块,这些代码模块可以依需要来传送,不需要在其执行可以开始之前下载整个程序。
有几种方式,采用或结合一种升级,其中程序被一个模块接一个模块传送。如果旧和新版本是完全兼容的(例如,新版本的产生是对对话框中的印刷错误的修补的结果),新模块可以与旧模块合并。版本信息基于每个文件以及每个代码模块而存储。这意味着在版本升级中没有改变的代码模块不需要被再次下载。如果旧版本和新版本不兼容,不能被合并,并且整个程序被本地缓存或者仍从服务器可用,则程序的旧版本可以继续执行直到下次程序被重新启动。如果旧版本和新版本不兼容,不能被合并,且程序的旧版本不再整个可用,则程序应该被立即终止并使用新版本代码模块来重新启动。程序的作者可以通过包括在程序的新版本中的定制更新模块而优先于任何这些更新程序。在产生版本冲突的任何时候,该代码模块被下载(如果必要)和执行。然后,可以进行一选择以执行任何上述的过程或定制过程,诸如重新分配程序的存储器区域的内容的映射关系,以便它们可以由新版本使用。
代码模块和相关的资源由用户计算机12和副服务器22缓存。缓存规则被并入CMXP协议和/或应用程序本身。这允许定制缓存规则被并入一应用程序,从而提供特殊的缓存方案和混合应用程序。在一代码模块下载过程中,所完成的字节的数目和下载的实际数据一道被存储在缓存中。如果下载被中断,可以在以后在它断开的地方恢复。
图7示出了由处理单元30的数字处理电路执行的操作,该处理单元30根据CMXP协议在功能上被修正。这些操作包括对作者识别的检查。通常,在用户计算机12的存储器区域68中的作者黑名单被从服务器传送到用户计算机,该服务器经历维护操作以保持该列表更新(图8)。
如图7所示,处理电路50在步骤180查询是否进入的信息包包括一对资源的请求。对该查询的肯定回答导致进一步的查询步骤182,关于是否请求的资源对匿名访问是可用的。如果该资源是受限的,进行确定步骤184,关于请求用户是否有权访问该所请求的资源。如果该用户没有这样的权利,在步骤186,“禁止访问”消息被返回请求者。如果该所请求的来源对请求方是可用的,处理电路50在判断步骤188确定是否所请求的来源包含可执行代码。肯定的判断引起关于作者的指纹的有效性的询问步骤190。如果指纹或作者识别是无效的,则在步骤192为责任方产生一消息。该资源的本地拷贝在后续步骤194被删除,消息“资源分发禁止”在步骤196被发送到请求方。
如果响应于询问步骤190发现所请求的资源的作者的指纹是有效的,则进行检查步骤198,关于是否该作者在黑名单中。黑名单导致在步骤194删除资源的本地拷贝,并在步骤196发出消息“资源分发禁止”。如果作者不在黑名单中,或者如果所请求的资源不包含可执行代码,如判断步骤188所确定的,则处理单元30在步骤200询问是否该客户已经有该资源的最新拷贝。如果该客户或用户已经有该资源的最新版本,则在步骤202该结果的消息被发送。如果该客户或用户的该资源的拷贝是旧版本,则在步骤204所请求的资源被发送到该客户。
如果进入的信息包不包含对一资源的请求,如在查询步骤180所确定的,则进行调查步骤206,看是否该信息包包含一修改资源的请求,如果是这样,且如果该资源不可以匿名修改,如决定步骤208所确定的,则在步骤210处理单元30询问是否该用户有权修改该资源。如果该用户没有该权利,则在步骤212一消息“访问禁止”被返回到请求者。如果该资源可以被任何人修改(判断步骤208)或者可被特定用户(征询步骤210)修改,则处理单元30在步骤214进行对该资源的所请求的修改,并在步骤216通知密钥副服务器该资源的改变。
如果进入的信息包不包含对一资源的请求,如查询步骤180所确定的,也没有修改一资源的请求,如调查步骤206所确定的,则在步骤218处理单元30检查是否该信息包是对禁止列表的更新,例如禁止用户或黑名单作者的更新。如果该信息包是这样的更新,且被加密,如判断步骤220所确定的,则处理单元30在查询步骤222确定是否该信息包在系统用户帐户下被发送。如果是这样,则在步骤224所缓存的禁止列表的拷贝被更新,在步骤226通知所有的副服务器该更新。如果进入的更新请求没有加密(判断步骤220)或者没有在系统用户帐户下被发送(查询步骤222),则在步骤228一告警消息被发送到合适的一方。在步骤230,如果未知的信息包类型被收到,则特定的状态报告被发布。
在CMXP维护循环中,如图8所示,为了更新黑名单作者的列表,处理单元30在初始询问步骤232询问是否自从上次列表更新以来的时间多于预定的小时数。如果经过了这么多时间,则进行尝试234以联接进行该查询的服务器上游的下一个服务器。如果该服务器不能联接上,如扫描步骤236所确定的,则进行检查步骤238,看是否有其它可用服务器。如果另一个服务器可用,则进行尝试步骤240,以联接该服务器。如果没有服务器可以联接上,则在步骤242再次检查时间。如果自从上次更新以来已经经过了预定的间隔,则在步骤244一告警消息被提供给合适的一方。
如果一服务器可以联接上,如在扫描步骤236所确定的,则在步骤246从该服务器获得禁止的最后修改的日期。在比较步骤248,处理单元30则确定该禁止列表自从该列表由处理单元缓存以来是否已经被修改。所获得的列表的加密状态在步骤252被调查。如果禁止列表的拷贝。找到非加密的禁止列表的拷贝导致在步骤254的告警状态,而在步骤256调查所加密的信息包以确定是否该信息包在系统用户帐户下被送出。适当送出的信息包导致了在步骤258的禁止列表的缓存拷贝的更新,和在步骤260将该更新通知所有服务器。
主要有两种方法,用于经单向数据递交和收集协议(“UDSCP”)递交或收集数据。根据第一种方法,递交可以被指向主服务器14或副服务器22。所有递交然后在中央服务器被收集,在中央服务器中,该递交由应用程序专用的服务器侧模块来处理。该方法对于收集所有在一服务器上的表格递交特别有用,其中在该服务器中,它们可以被并入基于LAN(局域网)的邮件系统。在第二种方法中,递交可以被再次指向主服务器14或副服务器22。该递交被收集在它们被起先递交到的服务器上(或者使用标准负载收集规则被分流)。该递交然后由应用程序专用服务器侧模块来处理。例如,该模块能够将所有递交发电子邮件到互联网电子邮件地址。
图9示出由处理单元30的数字处理电路进行的程序步骤,该处理单元30根据UDSCP协议被功能性修改。这些电路处理由用户计算机12,特别是由处理单元54的单向数据递交和收集电路90和由其它服务器发送的数据提交。在第一查询步骤262中,处理单元30查询是否进入的信息包是数据递交。如果是这样,进行另一个查询步骤264,看是否数据必须被立即收集。如果要求立即收集,由处理单元30进行的下一询问266为是否该数据必须在源服务器收集。如果不是这样,该信息包在步骤268被传送到处理最终数据集合的模块。该模块处理的操作包括:以电子邮件发送该递交,在数据库中记录它,将它写入一文件,或者用该数据执行任何其它必要的服务器侧任务。随后,在调查步骤270,检查是否该请求已经由数据收集模块处理。如果是这样,该信息包在步骤272被从UDSCP递交处理队列中除去,假定该UDSCP递交处理队列是获得该信息包的地方。然后,在步骤274发送指明成功数据信息包传送的状态报告。如果调查步骤270发现该请求还没有由数据收集模块处理,则处理单元30在步骤276询问是否该处理失败是因为可能的暂时状态。如果对该询问276的回答是否定的,则发布描述该错误情况的状态报告278。如果对该询问276的回答是肯定的,则发布描述该情况和指明处理数据中的延迟的可能性的状态报告280。然后该信息包在步骤282被加到UDSCP处理队列。
如果进入的信息包是数据递交,该数据递交不必被立即收集,如查询步骤262和264所确定的,则指明成功的状态报告284被发布,然后该信息包在步骤286被加到UDSCP处理队列。如果进入的数据信息包是一数据递交,该数据递交必须在源服务器被立即收集,如查询步骤262和264并响应于询问步骤266所确定的,进行检查步骤288,看是否主服务器是源服务器。如果是这样,该信息包在步骤268被传送到处理最终数据收集的模块。如果不是这样,处理单元30进行调查步骤290看是否源服务器可以被联接上。如果不可能联接上,则产生一状态报告292,指明在处理该数据中将有一延迟,然后在步骤286该信息包被加到UDSCP处理队列。如果该源服务器可以联接上,则在步骤294该数据被发送到该服务器。如果处理单元30的UDSCP功能修改通用处理电路带有非数据递交的信息包,则在步骤296产生一报告,指明该信息包是未知类型。
图10示出由处理单元30中的通用数字处理电路进行的维护循环的步骤,该处理单元30根据UDSCP协议在功能上被修改。首先,进行查询步骤298,看是否在UDSCP递交处理队列中有入口。如果是这样,在步骤300读取第一入口(entry)。随后,在步骤302处理单元30确定是否自从在入口的日期和时戳以来已经经过了多于X秒。如果不是这样,UDSCP递交处理队列在步骤304被调查以确定是否有进一步的入口在该队列中。如果是这样,在步骤306读取下一个入口和再次在步骤302处理单元30确定是否自从在入口的日期和时戳以来已经经过了多于X秒。如果经过的时间大于预定的限制,则进行征询步骤308,看是否该服务器太忙不能处理该数据递交。如果该服务器实际上太忙,在步骤310处理单元30询问是否该数据必须被立即收集。如果该数据收集不急迫,在步骤312处理单元30确定是否在入口上的日期和时戳早于特定时间。如果该日期和时戳是近期的,处理单元30返回调查步骤304以检查在UDSCP递交列表中的任何剩余数据递交。
如果服务器不太忙,能够处理数据递交(查询步骤308),如果数据必须立即被收集(询问步骤310),或者如果日期和时戳指明某数据递交的时间(确定步骤312),处理单元30在确定步骤314确定是否该数据必须由源服务器收集。如果不是这样,在步骤316该信息包被传送到处理该最终数据收集的模块。该模块处理的操作包括:以电子邮件发送递交,在数据库中记录它,将它写入一文件,或者用该数据执行任何其它必要的服务器侧任务。随后,在步骤318,处理单元30检查是否该数据递交已经由数据收集模块处理。如果该处理确实发生,该信息包在步骤320被从UDSCP递交处理队列中除去,处理单元30返回调查步骤304以确定是否任何进一步的入口在该队列中。如果数据递交信息包没有被处理,如在步骤318所确定的,则进行查询步骤322,看是否该处理失败是因为可能的暂时状态。如果不是这样,则产生一通知324,用于告警合适的人失败。如果是这样,则在步骤326更新在数据递交上的日期和时戳。
如果处理单元30在判断步骤314确定该数据必须由源服务器收集,且进一步在后续判断步骤328确定主机(本身)是源服务器,则该信息包被处理(步骤316)。或者,如果该源服务器必须做数据收集且是另一个计算机,如判断步骤328所确定的,则进行尝试330,以联接该源服务器。如果该源服务器不能被联接,则在步骤326更新在数据递交上的日期和时戳。如果该源服务器可用,则在步骤332数据递交被传送到源服务器,信息包在步骤334被从UDSCP处理队列除去。
如上所述,MCMP协议处理负载分布、用户验证、和加密。所有其它功能由子协议处理。MCMP协议有四个子协议。它们是代码模块交换协议(CMXP)、单向数据提交和收集协议(UDSCP)、计量送达和记帐协议(MDBP)、和分布式处理协议(DPP)。这一系列协议可以在将来被扩展以添加附加的功能到MCMP协议。
基本MCMP信息包结构
所有MCMP信息包包括一MCMP首标,其后任选地跟着一个或多个资源识别符,和一数据区域,称为信息包主体(图1)。MCMP信息包的整个大小可以计算为128+RsrcIDLen+PacketSize,其中RsrcIDLen和PacketSize(包大小)是MCMP首标的元素(见下面)。
MCMP首标识别该信息包所属的子协议,以及信息包的类型。另外,MCMP首标包含负载分布、用户验证和加密信息。资源识别符识别在信息包中的任何资源(ResourceReq旗标被设定)。MCMP信息包主体包含随信息包类型而定的信息,该MCMP信息包主体常常被子协议处理(handle)所解释。该信息包主体是任选的,可以通过设定MCMP首标的Packetsize元素为0而省略。
MCMP首标的结构定义如下:
MCMPHeader,128                 $$MCMP首标结构
◆MPVersion,4                  $$主协议版本
◆ProtoVendor,8                $$协议发售者(vendor)
◆ProtoID,8                    $$协议ID
◆ProtoVer,4                   $$协议版本
◆TransID,2                    $$客户指定交易ID
◆PacketType,2                 $$协议专用信息包类型
◆PacketVersion,4              $$信息包版本号
◆PacketSize,4                 $$信息包主体的大小,以字节为单位
◆OrigIP,4                     $$始发主IP地址
◆OrigPort,2                   $$始发主端口号
◆UserID,10                    $$客户验证的用户ID
◆Password,10                  $$客户验证的口令
◆RsrcIDLen,2                  $$资源识别符长度
◆RsrcIDs,2                    $$资源识别符的数量
◆RsrcSrcIP,4                  $$资源来源IP
◆Flags,2                      $$旗标;见下面的功能
◆,64                          $$保留
*Flags(旗标,标志):
Shunted=bit(Flags,1)          $信息包已经被分流
Shuntable=bit(Flags,2)            $信息包可以被分流
Encrypted=bit(Flags,3)            $在加密信息包中所包容的信息包
ResourceReq=bit(Flags,4)          $信息包构成对一资源的请求
该结构的要素详细描述如下:
MPVersion:这是一4字符的主协议版本识别符。如果MCMP首标的结构或主协议结构的任何其它主要部分被修改,该版本号将增加。
ProtoVendor:这是一8字节文本文字,描述最初负责维护该信息包所属的子协议的子协议说明书的软件发售者。
ProtoID:这是一8字节文本文字,由ProtoVendor要素指定的软件发售者所指定。其识别信息包所属的子协议。该ProtoVendor和ProtoID相结合唯一地识别一子协议。
ProtoVer:这是一4字节文本串,指明在ProtoVendor和ProtoID中指定的子协议的版本。前两个字符是主版本,后两个是副版本。所有字符必须都使用,这样如果主版本是一个字符长,它必须被写为01,而不是1。该值不包含小数点。例如,版本2.4将是0240。
Packet-Type Identifier(PacketType):一2字节整数,由发售者分配,唯一地识别在特定子协议中的信息包类型。
PacketVersion:这是一4字符识别符,用于信息包版本。当信息包的结构改变时,该版本号增加。这使得如果信息包结构需要改变时,在MCMP服务器上运行的子协议处理器能够处理旧的和新的信息包结构。该字符串格式与MCMP首标的ProtoVer要素的格式相同。
Shunted旗标(Shuuted,已分流):一旗标指明是否因服务移交信息包已经被分流。
Shuntable旗标(Shuntable,可分流):一旗标指明是否该信息包可以被分流。该旗标和Shunted旗标是互斥的。
Encrypted旗标(Encrypted,加密):一旗标指明是否该信息包被加密。当一信息包处于MCMP服务器进入信息包队列中时,该旗标被清零,除非该信息包由解密系统放置在那里,其中该旗标被设定。
Request-Resource(请求资源)旗标(ResourceReq):一旗标指明是否该信息包构成对一资源的请求。
资源识别符的号码(RsrcIDs):指明跟着MCMP首标结构的资源识别符的号码。
资源识别符长度(RsrcIDLen):指明所有跟着MCMP首标结构的资源识别符的总长度。
始发主机地址(OrigIP,OrigPort):这是始发请求的主机的IP地址。如果该信息包被旁路,则这是初始发送该请求的主机的IP地址,而不是递交该请求的服务器的地址。
资源来源(Resource-source)IP(RsrcSrcIP):这是主机的IP地址,如果Request-Resource旗标为真的话,所请求的资源的初始拷贝驻留在该主机上。
缓存的拷贝日期/时戳(CacheDate,CacheTime):这是资源的所缓存的拷贝的日期和时戳,如果没有缓存的拷贝存在的话就是0。如果资源的日期和时戳与该日期和时戳匹配,该资源内容将不返回。
Size of packet body(包主体大小)(PacketSize):跟着MCMP首标和(如果存在的话)资源识别符的信息包主体的大小(以字节为单位)。
客户验证的用户ID和口令(UserID,Password):用于验证客户的用户ID和口令。用户ID和口令的验证是资源来源IP服务器。如果对副服务器进行口令保护的资源的请求,则副服务器必须跟主服务器检查口令验证。该信息可以在会诒(session)过程中被缓存。
交易ID(TransID):由发起该交易的主机所指定的唯一的ID。它用于在一个或多个服务移交时跟踪交易。对于加密信息包,其应该被设置为0(尽管在打包的信息包中它可以被设置为非0值)。
MCMP资源识别符
如果信息包指一个或多个资源(RescourceReq旗标被设定),资源识别符识别该信息包所指的资源或多个资源。资源识别符是零终止的文本串。资源识别符的基本格式是:
-type:[locator/s;]length[;date[,time]]
其中:
type(类型)          识别资源类型;该变量的可能值是随子协议而定的
locator/s(位置符)   一个或多个用于定位该资源的值(如果它们包含逗
                    号,处在双引号中,当它们在值中使用时,对折该
                    双引号)。
length(长度)      要读取的资源的量(其单位由子协议指定)。这常常是
                  资源识别符的最后一项。它可以是格式“n”,以
                  指明在资源的开头开始的n个单位;格式“n/n”表
                  示单位的范围(包含),格式“n/n”以指明开始的单
                  位和单位的数目(包含);或者“*”,以指明整个资
                  源。
date(日期)        格式mm/dd/yyyy,资源的缓存拷贝被最后一次修改
                  的日期。该格式接受一位或两位的月份和日期,尽
                  管年份必须由完全的4字符串来指定。前向斜杠必
                  须被用作分隔符。
Time(时间)        24小时的格式hh:mm:ss,资源的缓存拷贝被最后一
                  次修改的时间。hh可以是一位或两位的数字,mm
                  和ss必须是两位的数字(如果需要前面加0)。
Resource ID是任选的,只要ResourceReq旗标未设定,不需要包含在MCMP信息包中。
一些Resource ID的例子是:
     data:“\catharon\demos\media.”,“video.bin”,“play30”;*
     prohibitedlist:*
     dir:“\”;*
     data:“\catharon\demos\”,“mag2.dat”;0/256
     data:“\training”,“air.bin.”,“Rudder”;*;10/03/1995,4:03:30
MCMP信息包类型
下面的子协议不是随子协议而定的,而是相应地为MCMP协议定义的:
MCMP_Encrypt            =h0002             $$加密
MCMP_Status             =h0003             $$状态报告
MCMP_PerfStatReq        =h0006             $$性能统计请求
MCMP_PerfStatReq        =h0007             $$性能统计响应
MCMP_UserIReq           =h0008             $$用户信息请求
MCMP_UserIResp          =h0009             $$用户信息响应
MCMP_EchoReq            =h000a             $$回声请求
MCMP_EchoResp           =h000b             $$回声响应
下面将详细描述这些信息包。
ENCRYPTION(MCMP_Encrypt):该加密信息包当数据必须加密时使用。要加密的信息包被打包(encased)在MCMP系统加密信息包的数据区域中。加密信息包的MCMP首标是:
      PacketType         MCMP_Encrypt(h0002)
      PacketSize         加密形式打包的信息包的大小加32字节
      ResourceID’s:    无
      Shuntable:        承继于打包的信息包
      ResourceReq:      False(错)
加密信息包的信息包主体是:
      Bytes 0-31         加密首标
      Bytes 32-末尾      加密信息包
加密信息包的首标是:
      PT_Encrypt_Header,32
    ●      DecryptLess,8           $$处理解密的代码模块
    ●      DecryptUnit,8
    ●      EncodingMethod,2        $$编码方法
    ●      ,14                     $$保留
STATUS REPORT(状态报告)(MCMP_Status):该状态报告信息包被用于返回操作的状态。当使用时,它常常是一个对先前发送的请求的响应。状态信息包包含详细的错误信息,包括错误或状态值的英语描述,如果它不能解释该错误代码,可以由应用程序来显示。
状态报告信息包包括一个或多个信息字段,其长度可变。第一个信息字段常常是状态报告首标,每个信息字段包括8字节首标,其指明了信息字段的长度和类型,后面是字段本身。
状态报告信息包的MCMP首标是:
      PacketType         MCMP_Status(h0002)
      PacketSize         可变
      ResourceID’s:    无
      Shuntable:        否
      ResourceReq:      否
状态报告信息包的信息字段首标是:
      MCMP_StRprt IFldHdr,8
      ●   IfldSize,2        $$信息字段的大小
      ●   IfldClass,1       $$字段类型(1=标准,2=随协议而定)
      ●   IfldType,2        $$字段类型
      ●   ,3                $$保留
以下是标准信息字段类型(其中IFldClass=1):
      MSR_Header          =1           $$首标
      MSR_ShortDesc       =2           $$短描述
      MSR_LongDesc        =3           $$长描述
      MSR_DetailDesc      =4           $$详细描述(技术)
      MSR_XErr70          =102         $$LAS 7.0执行错误数据
      MSR_Xerr70do        =103         $$LAS 7.0执行错误做堆栈
这些信息字段类型在下面详细描述:
通用状态报告首标(MSR_Header)常常出现在所有状态报告信息包中,常常是该信息包中的第一个信息段。它具有下面的结构:
MSR Header_Struc,32
●   ProtoVendor,8        $$报告该错误的协议的供货商
●   ProtoID,8            $$报告该错误的协议的ID
●   ProtoVer,4           $$报告该错误的协议的版本
●   Severity,1           $$错误的严重性
                           -1=通知成功
                           0=警告(操作尽管会继续,但可能有问题)
                           1=错误(操作不能继续)
                           2=未预料的错误
     ProtoSpecific,1      $$依赖于协议的错误旗标
     ErrorType,2          $$依赖于子协议的错误类型
     ErrorCode,2          $$依赖于子协议的错误代码
     ,6                   $$保留
如果ProtoSpecific旗标被设定,则ErrorType和ErrorCode是依赖于协议的。否则,ErrorType是如下之一:
ERRT_Zreturn          =1         $$*zreturn错误
ERRT_XErr             =2         $$TenCORE执行错误
ERRT_CErr             =3         $TenCORE压缩错误
ERRT_Dosdata          =4         $Catharon dosdata风格的错误
对于在是依赖于协议的MCMP_Status信息包中的任何东西,来自状态报告首标的ProtoVendor和ProtoID被用于识别协议。
短描述信息字段类型(MSR_ShortDesc)是一错误的短描述,40个字符长或更短,其可以用于列表中或者任何需要短的、友好的错误描述的场合。该信息包是40字节长,结构如下:
MSR_ShortDesc strtlc,40
     ShortErrDesc,40      $$错误的短描述
长描述信息字段类型(MSR_LongDesc)是错误的较长描述,可以在直到2048个字符的长度范围变化。该描述可以跨越多行,每行以回车(h0d)结束。该描述的长度由信息字段的长度决定,信息字段的整个内容是一包含作为文本的描述的长缓存变量。没有一行的最大长度,当该描述被显示时,各行可以在任何位置被字移行。
详细描述信息字段类型(MSR_DetailDesc)是错误的详细技术描述,包括所有诊断错误信息。例如,这可能是一标准TenCORE执行错误,它可以被Catharon错误处理器写入Catharon.err登录文件。这可以在长度上变化,直至4096个字符。该描述可以跨越多行,每行以回车(h0d)结束。各行必须不长于80个字符。长于80个字符的行可以在显示时被截短。该描述不能字移行,常常以固定间距字体来显示,允许独立行上的项被排列和使用空格格式化(用该方法可以产生表格)。该描述的长度由信息字段的长度来确定,该信息字段的整个内容是一包含作为文本的描述的长缓存变量。
TenCORE 7.0执行错误数据(MSR_XErr70)是由TenCORE执行错误所产生的数据的精确瞬象,由在执行错误存储块中的TenCORE返回。它是256字节长。如果报告的错误是TenCORE执行错误,该信息字段类型通常只是包括的。
TenCORE 7.0执行错误到堆栈(MSR_Xerr70do)是TenCORE执行错误做堆栈的精确瞬象。数据的大小基于在错误时刻的TenCORE做堆栈的大小而变化。
性能统计请求(MCMP_PerfStatReq):性能统计请求信息包请求服务器的当前性能和负载统计。
性能统计请求的MCMP首标是:
     PacketType              MCMP_PerfStatReq(h0005)
     PacketSize              0
     ResourceID’s:         无
     Shuntable:             否(因为这是一个对其寻址的服务器的统计
                             的请求,分流信息包将引起无意义的结果)
对该信息包的响应或者是MCMP_PerfStatResp或MCMP_Status信息包。
性能统计报告(MCMP_PerfStatRep):该信息包是对MCMP_PerfStatReq信息包的响应,包含对其寻址的服务器的性能统计报告。
性能统计报告的MCMP首标是:
     PacketType              MCMP_PerfStatReq(h0006)
     PacketSize              32
     ResourceID’s:         无
     Shuntable:             否
     ResourceReq:           否
性能统计报告的信息包主体是
PerStats,32
●     Pusage,1              $$处理器使用(百分比)
●     CurReqs,2             $$当前正处理的请求的数目
●     TotalReqs,2           $$可以处理的请求的总数目
●     ShuntReqs,2           $$在请求中,分流开始的阈值
●     PmemTotal,4           $$在系统中的总物理存储器
●     PmemUsed,4            $$在系统中的所用存储器
●     VmemTotal,4           $$在系统中的总虚拟存储器
●     VmemUsed,4            $$在系统中的所用虚拟存储器
●     AreqPMethod,1         $$处理附加请求的当前方法
●     ,8                    $$保留
信息包主体结构的详细要素是:
Pusage:当前处理器使用百分比(0%至100%),如果处理器使用百分
         比不可用,则设定为-1。
CurReqs:当前正处理的请求的大致数目。
TotalReqs:一次可以处理的请求的总数目。
ShuntReqs:在分流发生前请求的最大数目。这通常小于TotalReqs,以
           允许一些额外系统资源用于分流请求的目的。
PmemTotal:在服务器上的物理存储器的字节数目,如果不知道则为-1。
PmemUsed:已经使用的物理存储器的字节数目,如果不知道数量则为
          -1。
VmemTotal:在服务器上可用的虚拟存储器的字节数目,如果不知道则
           为-1。
VmemUsed:在使用的虚拟存储器的字节数目,如果不知道则为-1。
AreqPMethod:将由服务器使用的方法,基于在该信息包中的其它统计
             数字处理新进入的请求。其可以具有数字值1,2或3。
             1表明新请求将正常处理;2表明新请求将被分流;3
             表明新请求将被拒绝。
用户验证信息请求(MCMP_UserIReq):该信息包请求对特定用户的用户验证信息。该信息包必须被加密,且仅从副服务器送到主服务器。接收的服务器在响应该请求之前必须检查该发送方是否列为副服务器。
可能的响应是MCMP_Status信息包或者MCMP_UserIResp信息包。
该信息包使用特别类型的资源识别符,其定义如下:
      type:user[,uadbitem];length[;date,time]
其中
      type               识别资源类型,通常是“useradb”
      user               相关中的用户的名字
      uadbitem           到用户验证数据库项的路径以检索。如果省略,为
                         特定用户恢复一包含整个用户验证数据树的树文
                         件。所恢复的树文件的根等效于在用户数据库文件
                         中的\LocalUsers\username。
      length             要恢复的项的部分
例子:
      useradb:JohnS.\Catharon\Radmin\Rights:*:03/13/1995,12:20:48
      useradb:HugoC;*
      useradb:JDouglas,\XYZWidSt\WDBP\GroupMembership;256;S/12/1996,01:00:30
用户验证数据库(UADB)存储在树文件中。用户信息存储在\LocalUsers。在\LocalUsers文件夹中是每个用户的文件夹,基于用户的ID来命名。在每个用户的文件夹中是每个供货商(即,“Catharon”,“CTC”等)的文件夹,在供货商文件夹中是由该售主定义的每个协议的文件夹。该协议文件夹的内容随协议而定的。在资源ID中指定的路径是根目录在\LocalUser\username。
基本用户验证信息存储在\Catharon\MCMP\BaseAuthData中。
其结构如下:
UserAuthData,32
       UserID,10           $$用户的名字/ID
       UserPass,10         $$用户的口令
       ExpTime,3           $$在数据过期之前的时间,以秒计(10至
       864000)
       BinUID,4            $$二进制用户ID
       ,5                  $$保留
如果副服务器以下面的形式送出一请求:
       useradb:usez,2ame;*[;date,time]
针对特定用户搜索整个用户验证树。从用户验证树读取特定项的能力是为将来的使用和可扩展性而提供的。
在提取用户验证数据后,该数据可以缓存一段时间,该段时间在UserAuthData结构的ExpTime要素中规定。用户验证数据可以不缓存超过所规定的时间。
用户验证信息请求的MCMP首标是:
      PacketType             MCMP_UserIReq(h0008)
      PacketSize             0
      ResourceID’s:        一个;指明要搜索信息的用户和所搜索的信
                             息
      Shuntable:            否(必须由主服务器处理,因为主服务器是
                             唯一的关于用户的信息的验证来源)
      ResourceReq:        是
用户验证信息响应(MCMP_UserIResp):对MCMP_UserIReq信息包的响应,该信息包包含在其数据区域的请求信息。该数据是从在用户数据库中的所请求的数据块读取的原始数据,或者是(如果uadbitem省略)针对特定用户的包含整个用户信息树的树文件,文件的根目录等效于在UADB中的\LocalUsers\username。
用户验证信息响应的MCMP首标是:
      PacketType              MCMP_UserIResp(h0009)
      PacketSize              可变
      ResourceID’s:         无
      Shuntable:             否
      ResourceReq:           否
回声请求(MCMP_EchoReq):该信息包用于对到特定MCMP主机的连接计时。当该信息包由MCMP主机收到时,MCMP_EchoReq信息包被立即送回。数据区域可以包含任何数据,最大至2048个字节的大小。返回信息包的数据区域将包含相同的数据。
回声请求的MCMP首标是
      PacketType              MCMP_EchoReq(h000a)
      PacketSize              任何
      ResourceID’s:         无
      Shuntable:             否
      ResourceReq:           否
回声响应(MCMP_EchoResp):该信息包响应于MCMP_EchoReq信息包送出。
回声响应的MCMP首标是:
      PacketType              MCMP_EchoResq(h000b)
      PacketSize              与MCMP_EchoReq信息包相同
      ResourceID’s:         无
      Shuntable:             否
      ResourceReq:           否
在目录中的一些文件可以支持附加的访问许可信息。例如,一树文件可以包含在该树文件内的单个单元的访问许可的信息。
CMXP资源识别符
CMXP信息包的资源识别符定义如下
    Type:patht,file[,unit]];length[;date,time]
其中:
    type      识别资源类型。可以是“Data”以便从特定资源读取
              数据,或者是“Dir”以便读取包含的资源的目录。
    path      到目录的路径,必须至少是斜杠“\”。如果文件和单元
              不是特定的,则认为目录为要读取的资源;否则,参考
              的文件或单元被假定位于特定的目录。如果文件和单元
              未指定,则类型必须是“Dir”。
    file      一文件名。如果单元未指定,该文件被认为是资源;否
              则,该单元被假定为位于特定文件。文件资源可以用
    “Dir”和“Data”资源类型访问;“Dir”将参考包含的单元的列表,而“Data”将参考包含在文件中的实际数据。
    unit      单元名。如果指定,该单元被认为是资源。其可以用
    “Dir”和“Data”资源类型访问;“Dir”将参考子单元的列表,而“Data”将访问包含在单元中的数据。
    length    要读取的资源的部分。如果类型是“Data”,该值以
              字节计。如果类型是“Dir”,该值以目录条目计。
    date/time 只可以在请求信息包中被指定。除非由于日期/时间指定
              而已经修改了资源,使接收方处理忽视该请求。这可以
              与CMXP_ReadReq信息包一起使用,以便只在资源已
               经改变时才请求该资源被送出,因为它在客户端有缓
    存。
CMXP信息包类型
下面是由CMXP协议在此时使用的信息包类型的列表。CMXP协议的功能在将来可以通过增加该信息包列表的类型而扩充。
      CMXP_ReadRsrcReq =h0002
      CMXP_ReadRsrcResp=h0003
      CMXP_WriteRsrc   =h0004
      CMXP_CreateRsrc    =h0005
      CMXP_DestroyRsrc   =h0006
      CMXP_RenameRsrc    =h0007
      CMXP_CopyRsrc      =h0008
      CMXP_MoveRsrc      =h0009
      CMXP_AltSlistReq   =h000a
      CMXP_AltSlistResp  =h000b
下面详细描述这些信息包类型。
读取资源请求(CMXP_ReadRsrcReq):该信息包是一请求,以读取一个或多个资源。其从客户送到服务器以下载资源,从客户送到客户以请求用于插入模块的代码模块传递,从服务器送到服务器以请求合适的资源传递以服务于一客户请求。CMXP_ReadRsrcReq信息包可以请求资源内容、资源信息或者两者都请求。因为资源的定义包括文件目录和代码模块目录,该信息包也可以被用于请求在目录中的文件列表或在文件中的代码模块。
该信息包用一系列信息包来响应(每个对应于一个请求资源)。这些信息包或者是CMXP_ReadRsrcResp(如果该资源被成功地读取)或者MCMP_Status(如果读取资源有错误)。
读取资源请求信息包的MCMP首标是:
      PacketType            CMXP_ReadRsrcReq(honey)
      PacketSize            32
      ResourceID’s:       一个或多个,识别要读取的资源
      Shuntable:           是
      ResourceReq:         是
读取资源请求信息包的信息包主体是:
      ReadRsrcReqHeader,32
      RHFlags,2            $$旗标
      ,30                  $$保留
      *旗标:
      IncludeInfo=bit(RHFlags,1)        $$包括资源信息
      IncludeData=bit(RHFlags,2)        $$包括资源内容
      IdlePreCache=bit(RHFlags,2)       $$请求是空闲时间预缓存操作
                                         的结果
详细地说,信息包主体的要素是:
IncludeInfo:如果设定,该旗标使关于资源的信息被返回。
IncludeData:如果设定,该旗标使资源内容被返回。
IdlePreCache:如果设定,指明该请求是空闲时间预缓存操作的结果,该操作由客户启动,没有用户的介入。在设定该旗标的信息包被处理之前,CMXP服务器处理该旗标清零的信息包。当在CMXP服务器上的负载变得太高,不能处理所有请求时,它不能分流该请求,设定该旗标的请求将在该旗标清零的请求之前被丢掉(dropped)。
IncludeInfo和IncludeData都可以被设定在同样的请求中。在这种情况下,该响应是资源信息,后面是资源内容。这是最普通的请求类型。请求信息包中必须设置至少一个这些旗标。
读取资源响应(CMXP_ReadRsrcResp):响应于CMXP_ReadRsrcResp信息包送出,该信息包包含所请求的信息。注意,如果存在错误条件,该信息包决不响应于CMXP_ReadRsrcResp送出;而是送出MCMP_Status信息包。
根据在CMXP_ReadRsrcReq信息包中的IncludeInfo和IncludeData旗标的状态,信息包主体可包含资源信息和/或资源内容。资源信息,如果出现的话,总是在信息包主体中先出现,后面跟着资源内容,如果有的话。资源信息的大小可以通过读取ResourceInfoSize要素来确定,一程序的版本可以成功地与来自该程序的旧版本的代码模块结合。
RsMaxSubs:资源可包含的附属品的最大数目。
RaSizeAInfo:资源的相关信息(RsAInfo)的大小,以字节计(1到8)。
RsSizeSubName:资源的附属品的名字的最大长度,以字符计。
RsHeight,RsWidth:资源的边界矩形框的高度和宽度的缺省值,如果可用的话。其用于基于对象的图画、图像等。
RsPTime:资源以缺省播放速度的播放时间(如果可用的话),以秒计;用于视频夹、wav文件、midi文件、动画等。
写资源(CMXP_WriteRsrc):该信息包将数据写入特定资源。这要求将一信息包送到不能分流的主服务器,这样可以增加服务器负荷。对于表格递交和其它单向递交,UDSC协议被推荐,优先于CMXP协议的写功能。
在其它情况中,CMXP_WriteRsrc请求可能失败,比如由于不允许用户写入该特定资源。这种情况可以通过用特定的用户ID和口令重复该请求来弥补(在这种情况下,该请求必须被打包在MCMP_Encrypt信息包中)。
当访问由于失败的用户验证而被拒绝时,有两种状态代码返回。一种情况指明了客户应该提交用户名和口令。这暗示客户,该资源可以经用户名和口令而访问。它不是决定性的。换言之,这种访问拒绝代码的情况不表明是否访问对任何人真的可用。它仅指明是否该客户应该询问。例如,可能有一资源被设计为在程序的控制下访问,而不是在用户的控制下,这需要“自动用户”的用户验证,并且它在其余时间拒绝访问,甚至不提示要用户ID/口令。
该信息包主体包含要写入资源的数据。
写资源信息包的MCMP首标是:
      PacketType            CMXP_WriteRsrc(h0004)
      PacketSize            可变
      ResourceID’s:       一个,要写入的资源的ID
      Shuntable:           否
      ResourceReq:         是
产生资源(CMXP_CreateRsrc):该信息包在特定资源中产生附属品。其包括文件、目录和单元。应用于CMXP_WriteRsrc信息包的关于用户验证的同样规则应用于该信息包。
产生资源信息包的MCMP首标是:
      PacketType            CMXP_CreateRsrc(h0005)
      PacketSize            可变
      ResourceID’s:       一个;产生新附属品的资源的ID
      Shuntable:           否
      ResourceReq:         是
产生资源信息包的信息包主体是:
      NewRsrc,300
      ●       RsSize,4            $$资源的大小,以字节计
      ●       RsAInfo,8           $$相关信息(如果可用)
      ●       RsMaxSubs,2         $$附属品的最大数目
      ●       RsSizeAInfo,1       $$相关信息的大小,以字节计
      ●       RsSizeSubName,2     $$附属品的名字的最大长度
     ●      RsName,256        $$资源名
     ●      RsName2,8         $$副资源名
     ●      RsType,8          $$资源类型
     ●      ,11               $$保留
下面详细描述信息包主体的要素:
RsSize:新资源的大小,以字节计。如果产生TenCORE名字组或数据组,其必须是256字节的整数倍,其等于产生(-createn-)命令的记录变量由256相乘(以便将记录转换为字节)。当产生新目录时,其被忽略。
RsAInfo:资源的相关信息,如果可用的话(见上面的CMXP_CreateRsrc)
RsMaxSubs:在资源中允许的附属品的数目,如果可用的话。其为TenCORE名字组请求,等于产生命令的名字变量。在大多数情况下,当不处理TenCORE名字组时,其被忽略。
RSizeAInfo:资源的相关信息的大小。对于名字组,其等于产生命令的infolength变量。
RsSizeSubName:附属品的名字的最大长度。对于TenCORE名字组,其等于产生命令的namelength变量。在大多数情况下,当不处理TenCORE名字组时,其被忽略。
RsName:产生的资源名。该名字的长度和允许的字符的规则依赖于正产生的资源的类型。
RsName2,8:资源的副名。其当前不用,而是为以后的使用而提供的。例如,其可以用于指明一短文件名,作为在Windows95/NT中的长文件名的别名。
RsType:其指明了产生的资源的类型。注意对于可以产生的所有可能的资源,不是所有资源类型一定有效(例如,不能在一单元中产生一文件)。若对于特定包含资源,仅一个资源类型是可能的,则使用值“缺省”(例如,在TenCORE名字组内可以产生的资源的唯一类型是块)。该值是8字节文本文字。
以下资源类型是当前为CMXP协议而定义的:
      course    课程文件(TenCORE名字组具有.CRS的扩展名)
      group     群(group)文件(TenCORE名字组具有.GRP的扩展名)
      nameset   通用名字组文件(TenCORE名字组具有.NAM的扩展名)
      roster      花名册文件(TenCORE名字组具有.RTR的扩展名)
      source      源文件(TenCORE名字组具有.SRC的扩展名)
      studata     学生数据文件(TenCORE名字组具有.SDF的扩展名)
      tpr         生产商文件(TenCORE名字组具有.TPR的扩展名)
      binary      二进制文件(TenCORE名字组具有.BIN的扩展名)
      file        操作系统文件
      dir         操作系统文件夹或目录
      dataset     TenCORE数据组
      tree        Catharon树文件
      default     包容器(container)的缺省类型
      block       数据块(在名字组或树文件中)
      folder      文件夹(在时间文件中)
毁坏资源(CMXP_DestroyRsrc):该信息包毁坏特定的文件。应用于CMXP_WriteRsrc信息包的关于用户验证的同样规则应用于该信息包。
该信息包的MCMP首标是:
      PacketType         CMXP_DestroyRsrc(h0006)
      PacketSize         0
      ResourceID’s:    一个;毁坏的资源的ID
      Shuntable:        否
      ResourceReq:      是
重命名资源(CMXP_RenameRsrc):该信息包重命名特定的资源。应用于CMXP_WriteRsrc信息包的关于用户验证的同样规则应用于该信息包。信息包主体包含该资源的新名字。该信息包的MCMP首标是:
      PacketType         CMXP_RenameRsrc(h0007)
      PacketSize         272
      ResourceID’s:    一个;重命名的资源的ID
      Shuntable:        否
      ResourceReq:      是
重命名资源信息包的信息包主体是:
      RenameRsrc,272
      ●      ResourceName,256           $$资源的新名字
           ●     ResourceSecondaryName,8     $$资源的副名字(如
                                               果可用的话)
                  ,9                          $$保留
拷贝资源(CMXP_CopyRsrc):该信息包拷贝特定的资源。应用于CMXP_WriteRsrc信息包的关于用户验证的同样规则应用于该信息包。拷贝资源信息包的MCMP首标是:
      PacketType           CMXP_CopyRsrc(h0008)
      PacketSize           0
      ResourceID’s:      两个;第一个是要拷贝的资源的位置,第二
                           个是产生资源的新拷贝的位置
      Shuntable:          否
      ResourceReq:        是
移动资源(CMXP_MoveRsrc):该信息包移动特定的资源。应用于CMXP_WriteRsrc信息包的关于用户验证的同样规则应用于该信息包。移动资源信息包的MCMP首标是:
      PacketTyPe           CMXP_MoveRsrc(h0009)
      PacketSize           0
      ResourceID’s:      两个;第一个是资源的旧位置,第二个是资
                           源的新位置
      Shuntable:          否
      ResourceReq:        是
交替服务器列表请求(CMXP_AltSListReq):该信息包请求可用于特定资源的副服务器的列表。该服务器应该用CMXP_AltSListResp信息包响应,除了在错误的情况下,在该情况下,MCMP_Status信息包应该被返回。该信息包的MCMP首标是:
      PacketType           CMXP_AltSUstReq(h000a)
      PacketSize           0
      ResourceID’s:      一个;列表副服务器的资源
      Shuntable:          是
      ResourceReq:        是
交替服务器列表响应(CMXP_AltSListResp):该信息包响应于CMXP_AltSListReq信息包被送出,并包含交替服务器的列表。MCMP首标是:
    PacketType              CMXP_AltSUstResp(h000b)
    PacketSize              可变
    ResourceID’s:         无
    Shuntable:             否
    ResourceReq:           否
CMXP_AltSListResp信息包的信息包主体是:
    AltSList(nn),16
    ●       IP,4          $$服务器的IP地址
    ●       Port,2        $$在服务器上访问的端口
    ●       Load,1        $$在服务器上最后知道的负载
    ●       Ping,4        $$到服务器的最后知道的声纳(ping)时间
    ●       ,4            $$保留
UDSCP信息包类型
下面是由UDSCP协议此时使用的信息包类型的列表。UDSCP协议的功能可以通过将来增加该信息包列表的类型而扩充。
UDSCP_Submission        =h0002
UDSCP_QueueStatusReq    =h0003
UDSCP_QueueStatusResp   =h0004
下面详细描述这些信息包类型。
数据提交(UDSCP_Submission):这是UDSCP协议的基本信息包类型。它由客户产生,然后从服务器递交到服务器直到它到达收集点。信息包主体包括UDSCP首标,后面跟着提交的内容。
数据提交信息包的MCMP首标是:
      PacketType            UDSCP_Submission(h0002)
      PacketSize            32+提交的数据的大小
      ResourceID’s:       无
      Shuntable:           是
      ResourceReq:         否
UDSCP首标是:
UDSCPSubmitHeader,32
●   HeaderSize           $$UDSCPSubmitHeader的大小
●   DataSize,4          $$提交的数据的大小
●   Cmethod,1           $$收集方法(1=中夹,2=副)
●   CpointIP,4          $$收集点IP地址
●   Priority,1          $$优先级(0=低,1=正常,2=紧急)
●   Lesson,8            $$TenCORE课/单元,以处理提交
●   Unit,8
●   Flags,2             $$旗标
●   ,2
*旗标
Forwarded=bit(旗标,1)   $$提交已经由服务器递交
下面详细描述UDSCP首标的要素:
HeaderSize:UDSCPSubmitHeader结构的大小,以字节计。该值应该被读取以确定整个结构的大小,这允许结构在将来扩展而不影响现有代码。
DataSize:跟着UDSCP首标的提交的内容的大小,以字节计。
Cmethod:使用的收集方法,这是一个整数值。设定为1使数据在中央服务器被收集和处理,设定为2使数据在副服务器上被处理。
CpointIP:收集点(中央服务器)的IP地址。如果Cmethod=2其被忽略。
Priority:提交的优先级。这是一个整数值,可以是0(低)、1(正常)或者2(高优先级)。UDSCP服务器试图立即处理高优先级提交,而正常和低优先级提交留在UDSCP提交队列中,当服务器空闲时处理。如果正常或低优先级保留在UDSCP队列的时间长于用户可配置的时间限制,服务器将试图立即处理它,不管负载如何,或者未能这样做,则通知负责的人。对正常和低优先级提交的时间限制是可分别配置的,低优先级提交通常配置为较长时间期限。
Lesson,Unit:TenCORE课和单元的名字,以处理提交。
Forwarded:如果提交已经由UDSCP服务器递交则该旗标被设定,或者如果这是第一UDSCP服务器处理该提交(即,提交来自一客户机)则被清空。
队列状态请求(UDSCP_QueueStatusReq):该信息包请求UDSCP队列的状态。期待的响应是MCMP_Status信息包或UDSCP_QueueStatusResp信息包。
队列状态请求信息包的MCMP首标是:
    PacketType         UDSCP_Queue Status Req(h0003)
    PacketSize         0
    ResourceID’s:    无
    Shuntable:        否
    ResourceReq:      否
队列状态响应(UDSCP_QueueStatusResp):该信息包是对UDSCP_QueueStatusReq信息包的响应。它包含关于UDSCP服务器的当前UDSCP队列状态的信息。
MCMP首标是:
    PacketType          UDSCPQueueStatusResp(h0004)
    PacketSize          0
    ResourceID’s:     无
    Shuntable:         否
    ResourceReq:       否
该状态响应信息包的信息包主体是:
QueueStatus,64
●    Entries,4        $在队列中的条目的总数目
●    LowEntAge,4      $在队列中的最新条目的年龄,以秒计
●    HighEntAge,4     $在队列中的最老条目的年龄
●    AvgEntAge,4      $平均队列条目的年龄
●    HighPriEnt,4     $队列中的高优先级条目的数目
●    LowPriEnt,4      $队列中的低优先级条目的数目
●    FwdEnt,4         $已经递交的条目的数目
●    ToFwdEnt,4       $必须被递交的条目的数目
●    ,32              $保留
计量送达和记帐协议(MDBP)控制对付费内容的访问,包括送达信用金额以为该内容付费,在内容被购买后收集版税信息。
MDBP信息包类型
MDBP协议与CMXP协议结合使用。CMXP协议用于以加密形式送达内容。然后当该内容被客户机器上的MDBP库开锁时,该内容被解密。当该内容在本地机器上用信用付费时,它被开锁。信用金额可以通过MDBP协议被再补足。
当信用金额在本地机器上被再补足时,版税信息被报告给信用信用服务器,然后它处理利润的适当分配。
在一标准的信用购买交易中,有三个信息包被交换:
●    一MDBP_CreditReq被从客户机送到服务器
●    服务器用MDBP_CreditTransfer来响应
●    客户机将MDBP_PurchaseReport送到服务器
在信用可以由一用户购买之前,该用户必须用信用服务器登记。
下面是此时由MDBP协议使用的信息包类型的列表。MDBP协议的功能可以通过将来增加该信息包列表的类型而扩充。
      MDBP_CreditReq          =2    $$对附加信用的请求
      MDBP_CreditTransfer     =3    $$响应于MDBP_CreditReq
      MDBP_RegisterUser       =4    $$登记一用户
      MDBP_RegisterUserResp   =5    $$响应于MDBP_RegisterUser
      MDBP_WriteUserData      =6    $$写用户数据
      MDBP_ReadUserData       =7    $$读用户数据
      MDBP_ReadUserDataResp   =8    $$响应于MDBP_WriteUserData
      MDBP_PurchaseReport     =9    $$购买/版税报告
下面详细描述MDBP信息包类型。
对附加信用的请求(MDBP_CreditReq):该信息包从服务器请求附加信用。该信息包主体包含用户的ID代码,其用于访问在用户数据库中的用户的数据,以及要购买信用的量。用户的数据包括付费(billing)方法,以用于付费该信用。该信息包必须被加密。期待的响应是MDBP_CreditResp或MCMP_Status信息包。
信用请求信息包的MCMP首标是:
      PacketType        MDBP_CreditReq(h0002)
      PacketSize        22
      ResourceID’s:   无
      Shuntable:       否
      ResourceReq:     否
信用卡请求信息包的信息包主体是:
      UserID,8         $$用户ID,8字节整数值
      Password,10      $$用户的口令
      Credit,4,r      $$要购买的信用的数额(以美元计)
信用转送(MDBP_CreditTransfer):该信息包是对MDBP_CreditReq的响应。它实际上执行从服务器到客户机的信用的传送。信息包主体包括关于信用传送的信息。该信息包必须被加密。
信用传送信息包的MCMP首标是:
      PacketTyPe         MDBP_CreditReq(h0003)
      PacketSize         20
      ResourceID’s:    无
      Shuntable:        否
      ResourceReq:      否
信用传送信息包的信息包主体是:
      UserID,8          $$应该接收该信用的用户的ID
      Credit,4,r       $$要购买的信用的量(以美元计)
      Tserial,8         $$用于跟踪该交易的序列号
用户登记(MDBP_RegisterUser):该信息包用于用户在信用服务器的初始登记。它使一新条目在用户登记数据库中产生。信息包主体包括关于用户的信息,它将被写入在用户新记录中的标准字段。该信息可以被读取和在以后的时间通过使用MDBP_WriteUserData和MDBP_ReadUserData信息包来修改。该信息包必须被加密。对该信息包的期待的响应是MDBP_RegisterUserResp或MCMP_Status信息包。
用户登记信息包的MCMP首标是:
      PacketType         MDBP_RegisterUser(h0004)
      PacketSize
      ResourceID’s:    无
      Shuntable:        否
      ResourceReq:      否
用户登记信息包的信息包主体是:
      RegisterUser,512
      ●       Name,54        $$全名
    ●      Company,54         $$公司名
    ●      Address1,45        $$街道地址的第一行
    ●      Address2,45        $$街道地址的第二行
    ●      City,20            $$城市名
    ●      State,2            $$2字母州简写
    ●      Pcode,16           $$邮政编码(zip代码)
    ●      Country,30         $$国家名
    ●      Telephone,16       $$电话号码
    ●      AX,16              $$FAX号码
    ●      Email,100          $$电子邮件地址
    ●      CardNo,20          $$信用卡号码(‘nnnn nnnn nnnn
            nnnn’)
    ●      CardExpDate,5      $$信用卡过期日期(‘mm/yy’或者
                               ‘mm-yy’)
    ●      Password,10        $$口令
    ●      ,79                $$保留
用户登记响应(MDBP_RegisterUserResp):该信息包是对MDBP_RegisterUser信息包的响应。它确认用户已经被登记,返回用户的分配的ID代码。该信息包的MCMP首标是:
      PacketType                MDBP_RegisterUserResp(h0005)
      PacketSize                8
      ResourceID’s:           无
      Shuntable:               否
      ResourceReq:             否
信息包主体是:
      userID,8                 $$用户ID;8字节整数值
写用户数据(MDBP_WriteUserData):该信息包将数据写入用户数据库。这使用资源识别符以识别在用户登记数据库中的要素以写入。信息包主体是要写入的数据。该信息包使用特定类型的资源识别符,定义如下:
      type userid[,dbitem];length[;date,time]
其中:
      type    识别资源类型,总是“mdbpuser”
      userid  相关用户的ID(以十六进制表示)
      dbitem  到用户数据库的路径,以便提取。如果省略,则树文件被恢复,它包含特定用户的整个用户数据树。
      length  要返回的项的部分
例子:
      mdbpuser:00000000000003e4,\Catharon\RAdmin\Rights;*;03/13/19
                95,12:20:48
      mdbpuser:0000000000000014;*
      mdbpuser:0000000000002aff\XYZWidgt\WDBP\GroupMembership:
                256;5/12/1996,01:00:30
用户数据库包含系统文件夹和出版商文件夹。该系统文件夹包含在初始用户登记信息包中指定的数据,可以被扩展以包含附加的数据。出版商文件夹包含每个出版商的子文件夹,基于出版商的名字而命名,出版商的文件夹又包含出版物文件夹,基于出版物命名。在出版物文件夹内的数据的组织是随出版物而定的。
写用户数据信息包的MCMP首标是:
      PacketType            MDBP_WriteUserData(h0006)
      PacketSize            可变
      ResourceID’s:       1(写入的资源)
      Shuntable:           否
      ResourceReq:         是
读用户数据(MDBP_ReadUserData):该信息包从用户数据库读取数据。这使用资源识别符以确认在用户登记数据库中的要素以从中读取。资源识别符的格式与用于MDBP_WriteUserData信息包中的资源识别符的格式相同。
多个资源识别符可以被指定,使在用户登记数据库中每个指定的要素被返回。
该信息包用一系列信息包(对于每个请求资源各一个)作响应。这些信息包是MDBP_ReadUserDataResp(如果该资源被成功地读取)或MCMP_Status信息包(如果读取资源时有错误)。
读取用户数据信息包的MCMP首标是:
      PacketType          MDBP_ReadUserData(h0007)
      PacketSize          0
      ResourceID’s:     1或更多
      Shuntable:         否
      ResourceReq:       是
读取用户数据响应(MDBP_ReadUserDataResp):该信息包是对MDBP_ReadUserData信息包的响应。它包含所请求的用户登记数据库的要素的内容。该主体是读取的数据。MCMP首标是:
      PacketType          MDBP_ReadUserDataResp(h0008)
      PacketSize          可变
      ResourceID’s:     无
      Shuntable:         否
      ResourceReq:       否
购买/版税报告(MDBP_PurchaseReport):在客户已经收到一对于MDBP_CreditReq信息包的响应后,如果该客户机具有购买或版税信息要报告,这些信息包的一个或多个被从客户机送到服务器。
数据区域包含总的版税报告首标,后面依赖于出版物的版税报告数据区域。在一些情况下,版税报告首标足以报告所需要版税信息。这样数据区域是任选的,它不一定被包括。任何在版税报告首标之后的数据被假定为依赖于出版物的数据。
版税报告信息包的MCMP首标是:
      PacketType          MDBP_PurchaseReport(h0009)
      PacketSize          可变
      ResourceID’s:     无
      Shuntable:         否
      ResourceReq:       否
版税报告首标是:
      RoyaltyReport,128
      ●       HeaderSize,2        $$版税报告首标的大小,以字节计
      ●       Publisher,45        $$出版商的名字
      ●       Publication,45      $$出版物的名字
      ●       VolIssue,20         $$出版物的卷和/或期号,如果有的话
      ●       Version,4           $$出版物的版本,如果有的话
      ●       UserID,8            $$读该出版物的用户的ID
      ●       CreditSpent,4,r    $$该出版物上的信用花费,以美元计
                                    DPP信息包类型
分布式处理协议(DPP)通过将特定任务在多个计算机上分布,用于降低由特定任务产生的处理负荷。该协议被用于搜索和定位空闲系统和(与CMXP协议结合)发送适合的代码模块到这些系统以便它们能够帮助该任务。当该任务完成时,该协议是用于获取来自所有“帮助”机器的结果,并收集它们且在发起该任务的机器上编译它们。
由该协议提供的功能不应该与由主MCMP协议提供的负载分布功能相混淆。MCMP协议的负载分布通过将客户请求在不同位置的各个机器上分布来工作。DPP协议使用几个机器一起工作来完成单个任务,更适合于局域网,和处理器密集的任务,诸如3D(三维)图像的实现。
在分布处理过程中涉及的每个系统必须用这些系统的列表来配置,这些系统包括能够帮助该系统的该任务的系统,以及该系统能够帮助其任务的各系统。该列表可以包括带通配符的条目,以指明整个网络,诸如192.168.123.*指明整个192.168.123.C-级网络。
该系统配置的目的是控制谁能利用系统的处理器。例如,一个公司想要将共享处理限制在其内部网络中的系统,为了安全的原因。
系统也可以为到计算机的处理器的访问分配优先级。例如,一公司可能想要其所有的计算机保证来自其网络上的其它计算机的分布处理请求应优先于其它请求。然而,如果该公司与另一公司关系密切,它可能想要保证该另一公司到其计算机用于分布处理目的的访问,只要其本身的计算机都不需要处理帮助。
下面是此时由DDP协议使用的信息包类型的列表。DDP协议的功能可以通过将来增加该信息包列表的类型而扩充。
DPP_AssistReq           =2        $$处理帮助的请求
DPP_AssistResp          =3        $$对DPP_AssistReq的响应
DPP_EndTaskReq          =4        $$请求终止处理帮助
DPP_EndTaskNotify       =5        $$通知帮助的终止
DPP_UpdateReq         =6       $$请求任务状态的更新
DPP_UpdateResp        =7       $$响应于DPP_UpdateReq
下面详细描述这些信息包类型。
处理帮助的请求(DPP_AssistReq):该信息包由需要处理帮助的系统送到另一个系统,以从该系统请求处理帮助。该信息包包含发起分布处理所需要的所有信息,包括处理该过程的发起代码模块的资源识别符,这样如果需要的话代码模块可以经CMXP取回。对该信息包的响应是DPP_AssistResp信息包(如果接受方系统可以帮助)或者MCMP_Status信息包(如果接受方系统不可以帮助)。
MCMP_Status信息包可能的原因包括:
*     访问被拒绝
      信息包被送到的系统不允许帮助该请求。其原因是产生该请求的
      系统没有列在接收系统上的合适配置文件中。
*     空余系统资源不够
      在接收该请求的系统上没有足够的空余系统资源,以致该系统不能帮助分布处理。在一些情况下,一系统可能太忙甚至于不能返回该状态值。
*     请求被加塞(superceded)
      这表明系统有足够的空余处理器时间,但选择为优先于送出该请求的系统,而帮助另一个系统。“请求被加塞”是独立于“访问被拒绝”的状态代码的原因是如果被搜索帮助它的系统的程序碰到(通知用户可能的误配置),“访问被拒绝”可能产生错误,而“请求被加塞”仅指明在给定时间系统不能用于帮助该任务,因此将不会产生错误。
*     任务相关的错误
      这是由将处理该任务的代码模块来恢复。MCMP_Status信息包将包括附加的任务相关的错误代码,指明发生的特定错误。任务相关的错误可包括指明由于硬件限制该系统不能帮助该任务的错误。
帮助请求信息包的信息包主体包括32字节首标,后面跟着任务相关数据区域,其包含在Resource ID中参考的代码模块需要的任何信息,以帮助任务的处理。例如,这可以包括一图像(如果一图像必须被处理)或者要显现的3D环境的描述。
任务相关的数据区域还包含了信息,该信息指明了该系统要对任务的哪部分工作(例如,在图像中的开始和结束行),以及帮助系统用来以处理的数据更新初始系统的频率。
帮助请求信息包的MCMP首标是:
      PacketType          DPP_AssistReq(h0002)
      PacketSize          32+任务相关数据的大小
      ResourceID’s:     一个(处理分布的过程的代码模块的ID)
      Shuntable:         否
      ResourceReq:       否
DPP_AssistReq首标是:
      DPP_AssistReq Hdr,32
      ●      ProcessID,2           $$处理识别符
      ●      ,30                   $$保留
下面详细描述DPP_AssistReq首标的要素:
ProcessID:这是识别该过程的一2字节整数值。它由发起该过程的系统指定,当与该系统的IP地址结合时是唯一的识别符。
DPP_AssistResp:该信息包响应于DPP_AssistReq而送出以确认该系统已经开始帮助该任务。因为这仅仅是一确认消息,没有Resource ID和信息包主体。MCMP首标是:
    PacketType          DPP_AssistResp(h0003)
    PacketSize          0
    ResourceID’s:     无
    Shuntable:         否
    ResourceReq:       否
DPP_EndTaskReq:该信息包被送到帮助系统以指令该系统提早(在任务完成之前)中止帮助该任务。例如,这将被用于在发起系统上的用户点击“取消”键并放弃该任务的情况。MCMP首标是:
    PacketType         DPP_EndTaskReq(h0004)
    PacketSize         16
    ResourceID’s:    一个(处理分布的过程的代码模块的ID)
    Shuntable:        否
    ResourceReq:      否
结束任务请求首标的信息包主体是:
      DPP_EndTaskReq,16
      ●     ProcessID,2        $$终止的处理的ID
      ●     ,14                $$保留
DPP_EndTaskNotify:该信息包由帮助系统送出,以通知发起系统,它将不再帮助任务。其由帮助系统本身使用,也作为一到DPP_EndTaskReq的确认。例如,如果帮助系统要变得太忙不能继续帮助该任务,或者如果帮助系统由发起系统指令放弃该任务,则其被送出。该信息包也可以用于通知发起系统一完成了的任务。MCMP首标是:
      PacketType            DPP_EndTaskNotify(h0005)
      PacketSize            16
      ResourceID’s:       一个(处理分布的过程的代码模块的ID)
      Shuntable:           否
      ResourceReq:         否
结束任务通知信息包的信息包主体是:
      DPP_EndTaskResp,16
      ●     ProcessID,2      $$终止的处理的ID
      ●     Tstatus,1        $$任务状态;1=完成,0=未完
                               成(放弃)
      ●     ,13              $$保留
DPP_UpdateReq:该信息包由发起系统送出以指令帮助系统发送所处理的数据(DPP_UpdateResp信息包)。例如,如果一图像被处理,这将使帮助系统用组成它迄今已经处理的图像的部分的数据来响应。该信息包类型的使用依赖于任务。一些任务将根本不使用该信息包,而是自动在各种间隔和任务完成时产生DPP_UpdateResp信息包。MCMP首标是:
      PacketType         DPP_UpdateReq(h0006)
      PacketSize         6
      ResourceID’s:    一个(处理分布的过程的代码模块的ID)
      Shuntable:        否
      ResourceReq:      否
更新请求信息包的信息包主体是:
     DPP_EndTaskResp,16
     ProcessID,2               $$返回所处理的数据的过程的ID
     ●       ,14              $$保留
DPP_UpdateResp:该信息包从帮助系统送到发起系统。它包含迄今已经处理的相关的任务的部分的数据。例如,如果一图像正在处理,该信息包将包含已经处理的图像的部分。注意在这些信息包中送出的数据不是累积的。即,如果两个信息包顺序送出,第二个信息包仅包含在第一个中不包含的数据。
这些信息包常常响应于DPP_UpdateReq送出,尽管它们也可以由处理该任务帮助的程序在任务过程中和任务完成后自动送出。
该信息包主体包含首标,后面跟着任务相关数据。所有不是首标部分的数据被假定为任务相关数据。
更新响应信息包的MCMP首标是:
      PacketType         DPP_UpdateResp(h0007)
      PacketSize         16+任务相关数据的大小
      ResourceID’s:    一个(处理分布的过程的代码模块的ID)
      Shuntable:        否
      ResourceReq:      否
DPP_UpdateResp首标是:
      DPP_UpdateResp,16
      ●     HeaderSize,2       $$DPP_UpdateResp首标的大小,
                                 以字节计
      ●     ProcessID,2        $$返回所处理的数据的过程的ID
      ●     ,12                $$保留
术语“代码模块”这里用于表示应用程序的独立部分,专用于应用程序的特定操作的执行。例如,在绘图程序中,一代码模块可以控制画一条直线,而另一个代码模块完成上色,而另一个代码模块用于产生几何图形例如圆圈。这些代码模块是独立的,至少它们中的一些对于执行特定操作不是必须的。有时,需要两个或多个模块产生特定结果。然而,不会需要所有模块。
术语“机器可执行”这里用于指作为程序模块的代码模块能够控制计算机操作和改变通用数字计算机的算术逻辑电路的状态,从而改变通用数字计算机的功能。因此,“机器可执行代码模块”不包括数据文件和其它被动的电子编码的信息。
术语“应用程序”这里用于指任何除了操作系统以外的可执行计算机代码集,和其它用于控制基本机器功能的底层(underlying)程序。因此,模块化代码主协议(Modularized Code Master Protocal),包括其子协议,是一个应用程序,它本身是模块化的并可以以代码模块方式在网络上传送。例如,至少一些子协议在一些副服务器上不存在。如果这一子协议对副服务器完成一任务或处理一用户的请求是必要的,则所需要的子协议可以在网络上从主服务器传送到副服务器。
通过将子协议识别符包含在附着到每个MCMP信息包的MCMP首标中,可以处理子协议。在MCMP服务器上,处理子协议的电路可以是插入(plug-in)模块,这些模块由CMXP协议实时处理。当收到进入的信息包时,适合的子协议处理器(handler)被调用。子协议处理器介入了负载分布处理,因为MCMP服务器没有办法知道资源是什么格式,如何在服务器之间传送它们或者缓存规则是什么。子协议处理器必须处理访问、传送和协议相关资源的缓存。子协议处理器在MCMP服务器的主处理循环(Loop)过程中被周期性地调用,允许它执行各种维护任务。或者,子协议处理器可以从另外的线程中运行的循环被调用。
特定子协议的处理器可以请求MCMP服务器将一标记在专有对话模式(PDM)中的插口(socket)。在PDM插口上,所有进入的数据直接被通过到子协议处理器而不由MCMP服务器处理。当一插口从PDM操作返回正常操作时,子协议处理器必须通过任何“额外”的未处理数据到MCMP服务器,由于它可能已经读取一个或多个MCMP信息包的一部分。
术语“主服务器”或“源服务器”这里用于指涉及特定应用程序的资源的权威来源。例如,TenCORE Net Demo的主服务器就是demo的最新版本常常发布的服务器。
术语“副服务器”这里用于指从主服务器接收业务移交的服务器。副服务器常常镜象提供主服务器的内容,对主服务器来说,它是附属的。例如,TenCORE Net Demo的副服务器就是如果主服务器太忙时可以接替服务客户的服务器。副服务器不一定包含其作为副服务器从属的资源的镜象,只要在需要时该副服务器可以从主服务器请求这些资源。
单个机器可以既是主服务器也是副服务器。例如,一机器可以是TenCORE Net Demo的主服务器和Country Closet Clothing Catalog的副服务器。
单个机器的可以用作多个应用程序的主服务器,也可用作多个应用程序的副服务器。
词“资源”这里用于指任何可以由服务器或客户机使用的数据块。一个资源可以是一文件、一代码模块、一文件的部分、一代码模块、一代码模块的部分、一文件目录、一代码模块目录、或者任何相关的信息,包括CMXP禁止列表。术语“资源”也用于指硬件和系统资源,诸如处理器时间和存储器。
术语“树文件”指Catharon树结构名字组文件。一个树文件包含一系列命名的记录组,其被分组并组织到树形结构中(类似于操作系统的文件系统)。在树文件中,以百分号“%”开始的名字为内部使用而保留。任何其它名字可以由任何保有树文件的应用程序使用。当前,仅一个百分号名字已经被指定。它是“\%System”,它包含关于该文件的一般信息,包括(任选)产生该文件应用程序的名字、在其网络帐户下该文件被最后编辑的用户、该文件被最后编辑的日期和时间、在文件中各种资源的位置、缺省文件夹(如果未指定)的位置、和文件的相关信息。
如上所述,TenCORE是利用伪代码的解释语言。适合于与根据上述描述修正的TenCORE编程语言使用的解释器程序现在是通用的。
下面给出TenCORE编程语言的描述。该语言的基本特征首先被讨论,然后是对变量的处理。最后,列出了在该语言中使用的所有的重要命令。通过这些信息,以及前面的描述,本领域的普通技术人员可以产生适合使用的模块化编程语言。
TenCORE语言基础
TenCORE语言编辑系统是完全编程环境,特别为实现基于计算机的训练而增强。其编辑器帮助原代码、图像、字体、屏幕显示和数据操作的产生。该语言具有完整的工具,用于在结构的编程环境内显示生成、响应输入和分析、以及数据操作。
命令语法
该语言的主要构成块是命令。TenCORE包含大约175个命令,用它们执行的功能助记性命名。大多数命令后面有一标识符(tag),常常带有关键字,进一步定义所希望的特定功能。一命令和一标识符统称为语句(statement)。正如任何语言中一样,有规则确定标识符的语法和语句序列如何互相作用以执行特定任务。
TenCORE语言是固定字段语言。在最简单的形式中,语法具有形式:
command tag
command(命令)字段包含命令的名字,可以有直到8字符长。Tag(标识符)字段在字符位置9开始(在源编辑器中这里有一制表(tab)停止),在该行的剩余部分可以有直到119个字符长。对于许多命令,通过在后面的行作制表键跨过(tabbing)(留空)命令字段,标识符可以继续几行。一些典型的代码行看起来如下:
at          5:10
color       yellow
write       Welcome to Basic Sign Language
            Today’s lesson consist of...
每个语句由命令开始,跟着是标识符。在第一行,at命令使光标位于显示的第五行和第十个字符位置。第二个color命令选择黄色用于后面的图形和文本。最后一个write命令将文本以前面指定的位置和颜色显示。通过跨越后面的命令字段,write语句的标识符继续了几行。
选择性的形式
许多命令具有选择性的形式:
command SELECTOR;negTAG;zeroTAG;oneTAG;...nTAG
SELECTOR是包含变量、常量或计算的表达式,被估计和用于从列表中选择具体的标识符。这些标识符通常用分号分隔,尽管其它分隔符也可以。当SELECTOR估计到n或更大时,选择nTAG情况。在列表(;;)的空白条目可以用于跳过对特定情况的命令的执行。如果day被定义为整数变量,编程为保持星期中的特定一天,则下面的语句将在屏幕上显示那天:
at          5:10
write       Today is
writec      day;;;Monday;Tuesday;Wednesday;Thursday;
            Friday;Saturday;Sunday;
由于TenCORE定义逻辑真为值-1(或任何负值),假为值0(或任何正值),任何两个标识符选择性作为真或假判决:
command SELECTOR;trueTAG;falseTAG
附条件的形式
一些命令(特别是判断命令)仅有CONDITION作为其标识符,用于确定是否该命令执行。该条件是任何逻辑上估计被真(-1)或假(0)的表达式。
command CONDITION
例如,如果在一学生第三次尝试匹配一响应之后,你想要接受误拼写,则你可以使用基于系统变量ztries的附条件的表达式,其限定了前面判断尝试的数目:
okspell    ztries>3
answer Mississippi
嵌入
许多文本处理命令允许在文本主体中嵌入进一步的命令:
command TEXT《command,tag》TEXT
符号《和》是由[ALT][,]和[ALT][.]键访问的嵌入符号。通常,嵌入的命令名字可以被缩写为第一字母或两个字母以节省空间:例如,嵌入的show命令的缩写形式仅是s。嵌入被频繁地使用,以显示变量和控制文本语句内的绘图特性,从而有效地编码整个显示:
write    《color,red》Your score《color,white》is《show,score》%
         The《c,green》class average《c,white》is《s,average》%
注释、空格和继续的命令
在行开始的星号(*)标记了整行作为由编译器除去的注释,在执行时没有任何效果。通过将其放在双美元符$$之后,注释可以放在代码的任何行:编译器去除该注释,不影响代码的执行。calc
Figure C9880941500681
$$摄氏变华氏
一般情况下,在标识符的尾端空格由编译器除去,不影响执行。当双美元注释符使用时也是这样:编译器除去该注释和任何空格,回到真标识符。对于一些文本命令,你可能实际想要尾端空格,可以通过使用带三美元符$$$的在线注释让编译器保持它们。下面的例子将显示Welcome Bob之类:
write    Welcome $$$ 保持单个尾端空格
showa    name
大多数带有非选择性标识符的命令可以再次重复而无需在命令字段再次打印。“空格”也可以被加入大多数代码行之间,以使代码好读:
*     这部分代码初始化参数。
calc $$开始帧号
     $$使用激增(explosion)库
     $$使用大激增
    
Figure C9880941500694
$$这些是名字组文件
attach    file;type            $$附上文件
单元
TenCORE语句序列构成一功能实体,称为单元,类似于其它程序中的过程或子例程。
多个命令可以以任何有意义的方式分组成单元。单单“翻页”课程包括多帧材料,每个可以是一个单元。在一课程中的几个地方使用的复杂的图形可以一次放入单个单元,然后在每当需要的时候调用。在其自己的单元中,模拟可以具有每个功能部分。
每个单元必须具有独特的名字,多至8个字符长,以字母开始。标点符号、特殊符号和两个系统保留名字x和q不允许使用。
参考单元
如果你想要在同一课程中参考一单元,你只要给出单元的名字:
do    clock      $$调用单元时钟以开始计时
如果你想要在不同于当前执行的课程中访问一单元,则你必须给出课程和单元名:
do    maps,illinois    $$示出Illinois的地图
最后,你可能不想明白地指出单元或课程名,而宁可用已经计算为变量的名字。这是通过嵌入变量来实现,显含名字通常出现在变量中。嵌入包括将变量用《和》符号括住。例如,在一项目中所有课程和单元名字已经被放入8字节数组lessons和units,然后任何单元可以由设定索引来访问,以指向该所需单元:
do     《lessons(i)》,《units(j)》
通用(gerenic)单元名字
存在系统关键字名字,以提供通用(generic)转移(branch)目的地到当前课程中的主单元或回到系统。例如,=next和=back可以用于当跳到当前课程中的下一个或前一个主单元时的单元名,=exit可以用于退出当前课程,返回到DOS、编辑器或系统活动管理器(Activity Manager)。用jump上写(write-up)来找列九个通用单元名字和它们使用的例子的描述列表。
单元术语
根据它们如何使用,单元在执行过程中可以有很多不同作用。单元可以响应主显示和用户经历的交互动作:课程的“页”。另一方面,一单元可能仅是一子例程,由这些主单元之一调用以执行子任务。下面的术语被用于描述各种功能单元。
主单元
主单元是在课程中执行的第一个单元和由jump类型转移到达的任何其它单元。它通常响应于一“页”或在该课程中的用户状态。它是所有用户交互动作的起点。当在执行中到达主单元的结束时,系统等待键按下或其它交互动作以将用户转移到另一主单元。
转移到新的主单元通常:
◆  擦除屏幕
◆  重新初始化所有绘图参数
◆  重置转移到它们的课程缺省值
◆  清除所有指针区域
◆  建立在课程中的新的主参考点
当前单元
当前单元是当前执行的单元。它可以是主单元或从主单元由do或flow命令调用的子例程单元
完成(done)单元
完成或被调用单元用于描述作为子例程执行的单元。当完成单元的结束点到达时,控制返回到跟着在唤醒单元中的调用命令的命令或者到flow转移被触发处的等待状态。
基单元
基单元是转移发生时用base关键字修改的主单元。它可以用于建立一公共帮助序列,该序列可以自动返回到任何调用它的主单元。通过使用=base类属名字的分支,发生到基单元的返回。
启动(startup)单元
启动单元是在你的课程在中或者从DOS或者从诸如系统ActivityManager的路由器执行的第一单元。它通常是在课程文件中的第一物理单元,如果该单元要直接从DOS进入,应该包含启动命令。
重启(restart)单元
重启单元放在课程流中从学习会话中的中断的返回处。其中通常有一restart命令,应该有一显示,可以在中断后重新定位该学生。系统ActivityManager应该转移一用户到这些单元之一,如果学生选择了“继续上一课”选项。
控制块(control Blocks)
控制块提供一种方法,以扩展主要事件的控制,诸如开始或退出一课程或者从一主单元到另一主单元。对这些主要事件,在一课程的控制块中的编码是自动执行的,与特定的开始、结束或涉及的主单元无关。这是一种便利的方法以保证必要的初始化或清除。控制块在编辑器中在块目录页上产生。除了以下的以外,一些附加的控制块在Updates(更新)章讨论。
+initial(开始)
每次使外部jump类型转移到课程:例如从DOS开始课程、从编辑器执行课程、从另一个课程或从Activity Manager跳到该课程时,在+initial控制块中的代码被执行。它可以被用于装载字体、设定绘图条件、初始化数据保持等,而不管到课程的入口在哪里。
+main(主块)
每次进入新的主单元时,+main控制块被执行:它被用于执行在一课程中对所有主单元的开始都相同的操作。例如,它可以用于:显示课程范围的背景图像和流动条、节约重启资源、或在编辑诸如当前主单元名字的课程过程中显示查错(debugging)信息。
+exit(退出)
任何控制离开当前课程的时候,比如jump到不同课程或当退出到DOS或启动当前课程运行的调用程序,+exit控制块被执行。例如,它可以被用于收集课终总结信息或关掉为该课程而打开的任何装置。
+editor(编辑器)
每次你去编辑文件时,+editor控制块被执行。例如,它可以被用于装载文本编辑的字体。
屏幕分辨率
从最初的CGA、EGA适配器到MCGA、VGA和增强VGA适配器,广范围的PC显示硬件被支持。它们每个都包括了增加的图形和文本屏幕分辨率和色彩能力。TenCORE课件(courseware)通常用特定屏幕分辨率和颜色范围来产生,其被你的课件的运行时间机器的目标数目(population)所支持:常常使用最低的共同特性(denominator)。screen命令选择这些参数且常常放在课程的+initial控制块中。
图形坐标
特定屏幕象素由x和y图形坐标来寻址,0,0被指定为屏幕的左下角。
dot          100        200        $$写象素在X=100,Y=200
at           320        240        $$在vga屏幕的中央
circle,     75,fill              $$画一半径75的填充圆
大多数显示命令更新系统变量zx和zy作为其部分操作,从而定义当前屏幕位置。
字符坐标
文本可以更方便地由字符坐标来寻址,该字符坐标指明了行号和字符位置,由一冒号分隔,以区别于图形坐标。
at          5:15          $$行5字符15
write       Text on line 5...
缺省值
图形和文本命令使用各种属性的当前设置来显示,诸如:前景和背景颜色、绘图模式、文本大小和拖带阴影等。这些属性可以在使用它们之前设定:
color       yellow                    $$下面是黄色
mode        write                     $$重印绘图模式
text        shadow;on                $$文本上拖带阴影
text        size;2                   $$大小2号字体
at          5:10                      $$在行5,字符1
write       A cross section of the sun...
属性具有初始缺省值,由系统在课程开始时当执行initial命令或screen命令时设定:例如,系统缺省前景颜色是白,文本大小是1。在每个主单元开始时属性自动返回其缺省值,或者在任何时候通过使用语句status restore;default它们可以成组地变成它们的缺省值。在执行上述举例的代码后jump到新的主单元时,大小1的文本和颜色白可以在操作中被放回。见initial命令,用于显示属性的列表和它们的标准缺省值。
为了对课程有一普通的“感觉”,在课程中的所有单元的开始将属性值设定为你的缺省值是很方便的。这样,如果你以后改变主意,例如整个课程中使用gothic字体,你可以仅改变字体缺省值到另一个值,将其应用到整个课程。Status save;default语句被用于重置属性缺省值到它们的当前值:
color         yellow
text          spacing;variable
text          shadow,on
text          margin;wordwrap
status        save;default          $$上述是当前课程缺省值
课程缺省值常常在课程的+initial控制块中设定。
变量
作者定义变量
TenCORE支持本地和全局变量。
本地变量在特定单元中定义,仅对该定义可用。当通过达到单元的结尾或转移到一新主单元而使一单元退出时,其本地变量的值丢失。
全局变量是在整个课程中可用的;其中它们被定义和为整个程序保留其值。借助TenCORE Activity Manager或类似程序的帮助,全局变量甚至可以跨TenCORE会话中保留其值。
本地变量
本地变量通过在源单元内在define local和define end语句之间定义它们来产生。
define       local
height,2    $$定义2字节整数变量高度
length,4    $$定义4字节实数变量长度
define       end
以这种方式定义的变量仅对定义发生的单元为已知,当该单元经给到新主单元的任何命令而退出时,指定给这些变量的值丢失。
本地变量常常用于暂时信息,其在当前单元外无用,诸如循环索引。
全局变量
特定块,称为defines(定义)块,常常用于保持全局变量定义。在该defines块中,变量的定义通过插入该形式的行:
name,size[,type]
如:
defines
height,2    $$定义2字节整数变量高度
length,4    $$定义4字节实数变量长度
在defines块内定义的变量是全局变量。它们在文件内的每个单元内可用,通常用于存储在几个地方都需要的信息,诸如用户的名字或在程序内的状态。
每个课程的全局变量存储在为全局变量存储器保留的从单个存储器区域开始的地方。这意味着,如果程序在两个或多个源文件上扩展,则所有源文件使用相同定义和/或协调它们共享该区域的使用是很重要的。该主题在变量的物理分配一章详细讨论。
全局变量的本地定义
类似于本地变量,全局变量可在define global和define end语句之间定义。
define          global
height,2
length,4,r
define          end
在define global和define end之间定义的变量使用全局变量存储器区域,但仅在定义发生的单元内为已知。
define global命令仅为独立测试单元和少数特殊目的用途使用。如不理解如何为全局变量分配空间而使用,define global命令可能导致变量的矛盾定义和不可预期的程序行为。更详细的信息,见变量的物理分配一章。
变量名的优先规则
本地变量可用与现有全局变量相同的名字:在这种情况下,本地变量优先于全局变量。
globals(define block)
user,20
screen,5
define         local
user,4,r
define         end
这里“user”已经被定义为全局变量和本地变量。在单元screen5内,全局变量“user”不能被访问。任何时候“user”出现在单元screen5中,它指本地变量。
变量名
变量名可以是一个到八个字符长,下面这些可以在变量名中使用:
◆  字母(包括在扩展字符组中的那些,如和)
◆  数字
◆  句点(.)、下划线(_)、插入符(^)代字号(~)
◆  扩展的ASCII字符
变量名的第一个字符不能是数字或句点。有效变量名的一些例子是:
username
Lesson
xLOCAT
x.loc
last_x
■list
root
无效的变量名包括:
2student    不能以数字开始
useraddress 名字长过8个字符
unit’n     不允许的标点符号
大小写是重要的:变量“a”与变量“A”不同,变量“alpha”不同于变量“Alpha”和“ALPHA”。
在变量定义要素周围的空格是不重要的。大多数作者采用定义变量的两种不同风格之一:
define           local
width,2
height,2
area,2
length,2
mass,4,r
define           end
在上述风格中,每个变量的长度和类型被紧接着写在变量名之后。另一种常用风格如下:
define           local
width            ,2
height           ,2
area             ,2
length           ,2
mass             ,4,r
define           end
以这种方式,所有定义的长度以制表格式被排列。
这些方式在功能上是等价的。
变量类型
三种类型的任何一种可以被定义为本地或全局的。在TenCORE中的变量不是“强类型”的,即定义为一个类型的变量常常可以在操作中被主要用作另一种类型的变量。
整数变量
整数变量存储正的或负的整数。整数变量定义如下:
a,1
x,2
line,3
temp,4
total,8
通常形式是name,size(名字,大小)。整数变量的大小可以是1,2,3,4,或8字节。大小决定变量可存储的值的范围。
  大小   范围
  1   -128到127
  2   -32768到32767
  3   -8,388,608到8,338,607
  4   -2,147,483,648到2,147,483,647
  8   -9*1018到+9*1018
整数变量对其范围内的所有值是有效的:整数值的加、减或积不发生舍入误差。然而,当实数值不赋值给整数变量和当整数除执行时,进行舍入。
整数类型变量可选地采用类型(type)修正符integer,其可缩写为i:
x,2,i
line,3,integer
TenCORE以自然顺序(高字节到低字节)存储整数值。(许多MS-DOS程序以低字节到高字节的顺序存储整数值。)
实数变量
为了存储非整数数值,TenCORE提供了实数变量,其定义如下:
force,8,real
area,4,r
正常形式是名字(name),大小(size),real,实数变量可以是4字节或8字节长,在变量定义时,标识符real或其缩写形式r必须跟着大小说明。
实数变量的大小决定变量可以存储的值的范围和精度,以有效数字来测量,变量可以以该精度存储值。
  大小   范围   有效数字
  4   10±38   6
  8   10±308   15
八字节实数变量应该用在任何存储空间不是非常宝贵的场合。如果必须使用4字节实数变量,它们应该仅与其它4字节实数变量相比较。由于4字节实数变量的精度有限,if length=1.1的比较形式可能给出不确定的结果。
实数变量以IEEE格式存储。如同整数变量的情况,字节以自然顺序(高字节到低字节)存储,而不象一些程序所用的逆序。
没有声明大小和类型的变量以4字节实数变量存储。
非数字缓存变量
为了保存文本和其它信息,非数字变量可以用从1字节到32767字节的任意大小来定义(假定有足够的变量空间可用),如:
username,20
unitname,8
italics,2052
通用形式是name,size(名字,大小)。非数字变量常常用于存储文本,但它们也可以用于存储任何需要缓冲区(buffer)的其它信息。
1、2、3、4或8字节长度的非数字变量的定义和同样大小的整数变量的定义没什么不同。只有变量使用的上下文指明是否该变量是保存整数或非数字数据。
在TenCORE命令语法中,非数字变量指“缓存”。
数组
迄今为止所描述的变量类型都是标量的,即每个变量仅保存一个值。TenCORE也支持数组变量。一数组是同样大小和类型的一系列变量,全部由相同名来引用,使用索引(index)指明该数组的单个元素。数组索引只是括号里的一个数,其出现在紧跟数组名字的后面。
average(100),4,real    $$一百个4字节实数的数组
count(5),2,I           $$五个2字节整数的数组
bignum(20),8            $$二十个8字节整数的数组
table(10),256           $$十个256字节的非数字变量的数组
数组变量的定义看起来象标量变量的定义,不同是变量名后面跟着一括号内的数字,其指明了数组应该保存的元素(值)的数目。定义数组的通常形式是:
name(elements),size,type
那么在TenCORE代码中数组可以被引用,如:
calc            
Figure C9880941500781
datain           1,table(index),1
方括号同义于圆括号,允许下面的替换标法:
calc            
Figure C9880941500782
datain    1,table[index],1
TenCORE仅支持一维数组,两维或多维数组可以用函数来模拟。
系统定义变量
TenCORE提供许多系统定义变量,存储关于程序的当前状态的信息。这些系统定义变量(通常缩短为系统变量)只是TenCORE确认为代表数字或其它变量信息的名字。
系统变量提供频繁需要的信息,或者对作者来说在作者定义变量中维护是很繁重或不可能的信息。
例如,系统变量ztries可以被用于指用户已经键入的对当前活动的箭头结构的响应的次数。
if       ztries>3
●       write    The correct answer is:green
endif
如果用户已经试图回答了多于3次,该例子显示问题的正确答案。
系统变量都以字母“z”开头。这使得它们更容易辨识。实际上对好的编程风格来说,作者定义的变量应该避免以“z”开头的名字。作者定义的变量有可能产生与系统变量同名。在这种情况下,作者定义变量优先,系统变量的值变得不可用。
以下是一些其它系统变量的例子:
●zreturn由许多命令设定,以指明命令的成功或失败。zreturn的负值表示成功,其各种非负值表示命令失败的不同原因。zreturn是一个字节的整数,反映命令状态
●  zcolor被设定为当前背景绘图颜色的值。它是一个2字节整数,关
    于显示控制的值
●  zmainu包含当前主单元的名字。它是关于转移的8字节变量。
不能直接给系统变量赋值。然而,一些系统变量由相关的命令所影响,例如,zcolor指明当前所选择的前景颜色,因而由color命令所影响。执行colorwhite+设定zcolor为15,该值对应于亮白色。
根据目录组织的系统变量的详细列表在下面。另外,许多命令描述指导读者知道由命令所影响的系统变量。
系统变量
zareacnt   2(int)        当前定义的区域数
zareahl    2(int)        当前加亮区域的区域ID(如果没有加亮区域则为0)
zargs      1(int)        由-receive-或由-do的返回变元(argument)列表实际接收
                         的非空变元数目
zargsin    1(int)        由-do-、jump-、或-jumpop送出的变元数目
zargsout   1(int)        唤醒单元期待返回的变元数目
zaspectx   2(int)        x长宽比校正因子
zaspecty   2(int)        y长宽比校正因子
zauthsys   1(int)        指明TenCORE执行器类型
           -1=LAS作者执行器(TCAUTHOR.EXE)
           0=学生执行器(TCRUN.EXE)
           1=生产商执行器(TPR.EXR)
zbinary    1(int)        从其装载“zlesson”的文件的类型
           -1=二进制;0=LAS源;1=生产商源
zcharb     2(int)        标准大小1字体基线的偏移
zcharh     2(int)        高度,以标准字体或字符组的点数计
zcharw     2(int)        宽度,以标准字体或字符组的点数计,注意:所有文本
           定位是基于标准字体(zcharw,zcharh,zcharb),而不是当前字体
zclipx1    2(int)        裁剪(clipping)区域的左下角的X坐标
zclipx2    2(int)        裁剪区域的右上角的X坐标
zcliPy1    2(int)        裁剪区域的左下角的Y坐标
zclipy2    2(int)        裁剪区域的右上角的Y坐标
zclock     4(int)        系统时钟的值,精确到约55ms
zcolor     2(int)        用-color设定的前景颜色
zcolore    2(int)        用-colore设定的擦除颜色
zcolorg    2(int)        用-colorg设定的背景颜色
zddisk     1(int)        DOS缺省驱动器:1=A:,2=B:,3=C:
zdisk      1(int)        搜索数据文件的方法:值与zddisk相同
zdisks     4(int)        TenCORE可访问的驱动位图,在DOS中由SET CDISKS
                         =设定
zdisplay   1(int)        当前活动的显示数目(仅双屏幕驱动)
zdispx    2(int)    当前窗的X大小
zdispy    2(int)    当前窗的Y大小
zdolevel  2(int)    做(do)类型命令堆栈的当前级(do,library,flow do,
                    flow libray)
zdomcnt   2(int)    现存域的数目
zdomname  8(alpha)  当前域的名字
zdompar   8(alpha)  母域的名字
zdoserr   1(int)    DOS盘错误代码。仅当”zreturn=0”时设定,指明盘错误
          0         盘写保护
          2         驱动器未准备好(门未关或坏驱)
          4         CRC错误(在数据中检测的错误)
          6         寻找错误(坏驱或盘)
          7         未知媒体类型(不认识的盘)
          8         扇区找不到(坏驱或盘)
          12        一般错误(坏驱或盘)
zdosver   4(alpha)  DOS版本号,格式“X.XX”
zedisk    1(int)    搜索源/二进制文件的方法:
          -1=搜索所有驱动器;0=仅搜索“zddisk”
          -2=仅搜索系统伪驱动器
          1,2,3,...=仅搜索驱动器A:,B:,C:
zedoserr  8(int)    DOS扩展的错误代码,当”zreturn”=0时设定。仅当
          运行在DOS3.0或更高版本时有效。格式是:
          2字节错误代码
          1字节错误类
          1字节动作
          1字节位置
          剩下的三字节被保留
zenable   4(int)    -enable-(使能)标识符
          该变量是一系列位,数目从1到32。某些对应于-enable-命令
          如下
          1    使能绝对    9    保留
           2         使能指针10         保留
           3         使能模式11         保留
           4         使能光标12         使能中断
           5         使能指针上13       使能箭头
           6         使能字体14         保留
           7         使能区域15         使能填充中断(fill break)
           8         保留(16到32位保留)
           使用位函数bit()以测试”zenable”。例如,如果指针使能,则
           bit(zenable,2)为-1,否则为0。
zenvlen    4(int)    DOS环境缓冲区的字节长度
zenvloc    4(int)    DOS环境缓冲区的绝对存储位置
zerrcode   2(int)    “zedoserr”的“错误代码”值
zerrlevl   2(int)    从最后的exec文件返回的DOS变量“errorlevel”;
           -command
zerrorl    8(alpha)  如果执行错误发生,要执行的单元的课程名,由-error
           设定
zerroru    8(alpha)  如果执行错误发生,要执行的单元的单元名
zexitbin   1(int)    从其装载=exit转移的文件的类型:
           -1=二进制;0=源;1=tpr
zexitl     8(alpha)  -jump=exit转移到的课程名
zexitu     8(alpha)  -jump=exit转移到的单元名
zfcrecs    4(int)    在所附的名字组类型文件中的邻接的自由记录的数目
zfdisk     1(int)    所附的文件所在的盘
           1=驱动器A:,2=驱动器B:,等
           -2=系统路径
zflowcnt   2(int)    当前定义的流转移的数目
zfname     8(alpha)  所附的文件的名字;如果没有就为0
zfnames    2(int)    在所附的文件中的名字的总数目;对于数据组文件
           无意义
zfontb     2(int)    当前字体基线的偏移
zfontf     4(int)    对于字符组,指明哪些属性是合适的,哪些是合成的,
          位定义如下:
          6=黑体属性匹配请求
          7=斜体属性匹配请求
          8=大小属性匹配请求
          16=窄属性匹配请求
          22=黑体合成
          23=斜体合成
          24=大小合成
          对于上述可合成的位,属性可能不仅不匹配该请求,也不是综合
          的;例如,如果字体组仅有黑体项,当前属性指明非黑体,则位
          6和22将都关
zfonth    2(int)    高度,以当前有效字体的点数计
zfontret  1(int)    关于所选择的字体如何紧密地配合所请求的参数的
          信息。所有值对字体组可用,对于字体,值-1、2、3是可以的。
          由-font-,-text,status restore-设定
          -2=部分匹配,一些需要合成
          -1=精确匹配
          0=部分匹配,一些不可合成的属性不能匹配
          1=未找到合适的匹配;基字体有效
          2=基字体不可用;标准字体有效
          3=标准字体不可用;字符组有效
zfontw    2(int)    宽度,以当前有效字体的点数计
zforce    2(int)    强制旗标
          该变量是一系列位,数目从1到16。某些对应于-enable-命令
          如下
          1         强制光标锁-zinfo    8(int)    所附文件中所选择
          的名字的相关信息字节;对数据组文件没有意义
          2         强制数字lock-
          3         强制扩展extended-
          4         强制字符组
          (位5-16未用)
          使用位函数bit()以测试”zforce”。例如,如果强制光标锁有效,
          则bit(zforce,1)为-1,否则为0。
zfrecs    4(int)    在所附文件中的数据记录的总数目
zfrombin  1(int)    从其装载”zfroml”的文件的类型
          -1=二进制;0=源;1=tpr
zfromd    1(int)    从其装载”zfroml”的驱动器。与zldisk相同值
zfrom     8(alpha)  经-do-、-library-、或者main-unit转移唤醒当前单元的
          单元的课程名
zfromlin  2(int)    在“zfromu”中唤醒当前单元命令的行号
zfromu    8(alpha)  唤醒当前单元的单元的单元名
zfrecs    4(int)    在所附的文件中的数据记录的总数
zftype    8(alpha)  所附的文件的类型;如果没有就是0;文件类型:源、
          tpr,数据组、名字组、二进制、花名册、课、学生数据和组
zfunames  2(int)    在所附的文件中使用的名字数
zfurecs   4(int)    在所附的文件中使用的记录数;对于数据组文件无意义
zfver     4(alpha)  产生所附的名字组的TenCORE版本,为“X.XX”
zhcolor   2(int)    用-color设定的硬件颜色
zhcolore  2(int)    用-colore设定的硬件擦除颜色
zhcolorg  2(int)    用-coloreg设定的硬件背景颜色
zhdispx   2(int)    当前屏幕类型的物理x大小
zinfo     8(int)    在所附的文件中的所选择的名字的相关信息字节,对
          数据组文件没有意义
zinput    2(int)    最后处理的键的按键值
          0         无输入
          1-255     标准或扩展字符
          >255     非字符按键
          “zinput”包含2字节按键值。为了确定是否“zinput”包含特定值,需要下面形式之一:
          zinput=%“character”       zinput=%alt”character”
          zinput=%ctl“character”    zinput=%altctl“character”
          zinput=%keyname
             %alt、%ctl、%altctl修正符作用于单标准ASCII字符(h20-h7f)。
             %修正符作用于双引号中的标准或扩展的字符和命名键
zinputa      2(int)  使当前zinput值的区域的区域ID(如果没有由一区域
             产生zinput则为0);当zinput更新时设定
zinputainfo  8(int)  引起该转移的区域的信息标识符的值
zinputf      4比特   最后输入的键盘和指针值
             该变量是一系列位,数目从1到32。某些对应于-enable-命令
             如下
             1    Insert接通
             2    CapsLock接通
             3    NumLock接通
             4    ScrollLock接通
             5    或者Alt键按下
             6    或者Ctrl键按下
             7    左Shift键按下
             8    右Shift键按下
             9    SysReq键按下
             10   CapsLock键按下
             11   NumLock键按下
             12   ScrollLock键按下
             13   右Alt键按下
             14   右Ctrl键按下
             15   左Alt键按下
             16   左Ctrl键按下
             17   增强键盘“extra”键
             18   键来自Alt+数字
             19   键来自指针动作
             20   键来自“指针上”动作
             21   键来自触装置
             (位22-29保留)
             30   中间鼠标键按下(一些鼠标对中间鼠标键产生位
           31&32,而不是30)
           31      右鼠标键按下
           32      左鼠标键按下
           使用位函数bit()以测试“zinputf”。例如,如果在“zinput”中
           的输入过程中CapsLock接通则bit(zinputf,2)是1,否则是0。
zinputx    2(int)  当“zinput”被最后一次更新时,指针的图形x位置
zinputy    2(int)  当“zinput”被最后一次更新时,指针的图形y位置
zintincr   2(int)  在-palette中的I值的最小有效增加值
zintnum    1(int)  TenCORE器件驱动器所使用的中断号
zkeyset    2(int)  最后一个处理的键的变换旗标(shift flag)字节和扫描代
码。
           高字节=变换旗标
           低字节=扫描代码
           高字节是一系列位,号码从1到8,复制了”zinputf”中的
           第一个八位
           低字节是识别物理键的“扫描代码”
zldisk     1(int)    从其装载当前执行的课程的驱动器。1,2,3...=A:,B:,C:;
           -2=系统驱动器
zlength    2(int)    在-put后判断缓存的长度
zlesson    8(alpha)  当前单元的文件名
zlident    8(alpha)  在当前二进制文件中存储的标识
zline      2(int)    当前字符行
zlinfo     2(int)    所附文件的相关信息的字节数;对于数据组文件
           无意义
zlname     2(int)    所附文件的字符中的名字的最大长度;对于数据组文件
           无意义
zmainl     8(alpha)  主单元的文件名
zmainu     8(alpha)  主单元的单元名
zmargin    2(int)    左文本边的x坐标
zmaxzarea  2(int)    区域的最大数,缺省值=1000
zmaxcol    2(int)    当前显示上可用的颜色的最大数
zmaxdom     2(int)   所允许的域的最大数
zmaxflow    2(int)   可以被定义的流转移的最大数
zmaxpage    2(int)   可用的硬件显示页数
zmlength    4(int)   最后引用的存储器块的大小,以字节计
            由于Windows存储器管理和盘交换文件(swapfile),有效的存储器
            组(pool)大小通常大于在典型Windows系统上大多数TenCORE
            所需。然而,你应该常常检查zreturn,因为对于涉及存储器的命
            令来说失败是可能的,尤其是低存储器的Windows系统。因为兼
            容的原因,系统变量zmem、zrmem和zfmem从不返回大于
            512K(524,228)的值。然而,如果有足够的存储器,就可以产生
            1,048,560字节(hexFFFF0)的存储器块。同样因为兼容的原因,
            zxmem常常返回0值。
zrmen       4(int)   存储器的当前大小,以字节计
zfmem       4(int)   可以位于存储器组中的最大块
zrmem       4(int)   可以位于存储器组中的最大块
zxmem       4(int)   设为0
zmode       2(int)   当前屏幕显示模式
            0=逆    3=写      6=加
            1=重写  4=非绘图  7=减
            2=擦除  5=xor
zmouse      1(int)   指明是否装载了鼠标装置驱动器
            -1=装载了鼠标驱动器
            0=未装载
zmstart     4(int)   最后参考的存储器块的绝对地址
            顶部两个字节是段而底部两个字节是0,符合在memloc中可用
            的标准absloc地址(a,zmstart)
zmxname     4(int)   在所附的名字组类型文件中允许的名字的最大数
zname       8(alpha) 在所附的文件中的所选名字的首八个字符;对于数据组
            文件无意义
zndisks     1(int)   由LASTDRIVE=在CONFIG.SYS中设定的在DOS内
            定义的驱动器的数目
znindex     2(int)      在所附的名字组类型文件中的所选择的名字的位置
znumber     2(int)      用-put进行的取代的数目
zoriginx    2(int)      用-origin设定的原点的相对x坐标
zoriginy    2(int)      用-origin设定的原点的相对y坐标
zpalincr    2(int)      在-palette(调色板)中R、G和B的最小有效增加
zpcolo      2(int)      最后指针的输入位置的点的颜色;在文本模式中,字符
            的前景颜色
zplotxh     2(int)      上x文本范围(见文本测量
zplotxl     2(int)      下x文本范围(见文本测量
zplotyh     2(int)      上y文本范围(见文本测量
zplotyl     2(int)      下y文本范围(见文本测量
zrec        4(int)      在所附的文件中与所选择的名字相关的记录的数目;
            对于数据组等于“zfrecs”
zreturn     1(int)指明设定该系统变量的命令的成功或失败。“zreturn”
            通常由访问盘或TenCORE存储器组的命令设定。“zreturn”的
            可能值是:
            -2      冗余操作
                    不动作
            -1      操作成功
            0       盘错误,见“zdoserr”
            1       没有附加的文件
            2       块超范围
            3       存储器或值超范围
            4       不存在
            5       所选择装置无效
            6       重复名字
            7       目录满
            8       盘记录不足
            9       没有有效的名字
            10      名字或块未找到
            11      无效类型
            12        效名字长度
            13        无效信息长度
            14        在名字组中太多名字/记录
            15        名字组目录错误
            16        无效的名字
            17        无效图像或数据
            18        不能满足存储器请求
            19        在上下文(context)操作无效
            20        在锁住的数据上的datain
            21        与另一个用户的锁矛盾
            22        在一个名字上太多锁
            23        屏幕坐标超范围
            24        所请求的名字/记录锁未找到
zrmargin    2(int)    右文本边的x坐标
zrotate     2(int)    旋转的度数
zrotatex    2(int)    旋转原点的x坐标
zrotatey    2(int)    旋转原点的y坐标
zrpage      1(int)    由-page设定的显示读取页
zrstartl    8(alpha)  由-restart设定的重启单元的课程名
zrstartu    8(alpha)  由-restart设定的重启单元的单元名
zscaleox    2(int)    定标原点的x坐标
zscaleoy    2(int)    定标原点的y坐标
zscalex     8(real)   x比例因子
zscaley     8(real)   y比例因子
zscreen     1(int)    当前硬件(BIOS)屏幕:
            0,1      40×25文本                 cga,文本,中
            4,5      320×200图4色   cga,图形,中
            6         640×200图2色   cga,图形,高
            7         80×25单色文本  mda
            13        320×200图16色  ega,图形,低
            14        640×200图16色  ega,图形,中
          16        640×350图16色    ega,图形,高
          17        640×480图2色     mcga,图形,高
          18        640×480图16色    vga,图形,中
          19        320×200图256色   mcga,图形,中
zscreenc  1(int)    当前屏幕颜色类型,用-screen-命令选择:0=彩色;
          1=单色
zscreenh  1(int)    屏幕硬件驱动器(*DIS file文件);为实际检测的显示硬
          件而调节:
          0         cga       10       vga
          2         hercules  11       mcga
          3         ega       4        evga
          9         att
zscreenm  1(int)    当前屏幕模式,用-screen-命令选择:0=图形;1=文本
zscreenr  1(int)    当前屏幕分辨率,用-screen-命令选择:
          0         低        2        高
          1         中        3        alt1
          4         alt2      5        alt3
zscreent  1(int)    当前屏幕类型,用-screen-命令选择:
          0        cga        5        ncr       10    vga
          1        tecmar     6        保留      11    mcga
          2        hercules   7        保留      12    online
          3        ega        8        nokia     13    保留
          4        保留       9        att       14    evga
zsdisks   4(bit)   包括在自动搜索中的驱动的位图,由SET TCSEARCH
          =在DOS中设定
zserial   8(alpha) TenCORE执行器的8字符序列号
zsrtret   1(int)   当-setname-被执行时找到的匹配种类;可能的值为:
          N        独特的部分匹配(N-1字符)
          -1       精确匹配;一名字被选择
          0        不匹配;选择被清除,没有选择的名字
          +N       非独特的部分匹配(N字符);首先部分匹配名字被选择
zspace     2(int)    当前字符栏
zsysver    4(alpha)  TenCORE版本,格式“X.XX”
ztelmain   4(int)    在先前主单元中花费的经历时间
ztmmain    4(int)    在主单元开始时的系统时钟
ztmunit    4(int)    在当前单元开始时的系统时钟
zuncover   2(int)    由uncover命令设定的当前公开键
zunit      8(alpha)  当前单元的单元名
zvarsl     4(int)    全局变量的总大小,以字节计
zwidth     1(int)    由-width-设定的图形行的宽度;影响draw,circle,ellipse,
           polygon,和dot
zwindows   2(int)    打开的窗口的数目(除了初始窗口)
zwindowx   2(int)    窗口的左下角的绝对x坐标
zwindowy   2(int)    窗口的左下角的绝对y坐标
zwpage     1(int)    由-page设定的显示写页
zx         2(int)    当前图形水平位置
zxmax      2(int)    当前窗口中的最大x坐标
zxycolor   2(int)    当前屏幕位置的点的颜色
           在文本模式,字符的前景颜色
zy         2(int)    当前图形垂直位置
zymax      2(int)    当前窗口中的最大y坐标
显示变量的内容
显示数值变量
包含数字信息的变量可以用show命令来显示
at         17:21
show       ztriea
通常形式是show varname,其中varname是要显示的变量的名字。
对于整数,show在当前屏幕位置显示第一个非零数字,显示直到20个数字。对于实数,其在当前屏幕位置开始,显示直到24个位置,包括小数点和三位小数位。这可以通过增加field和right标识符来改变,如:
show       rea18,2,6
其显示直到总的12个位置(包括小数点):包括后面的零的六位被显示在小数点的右边,在这种情况下,如果“rea18”的值是1.2345,则它显示:1.234500(
Figure C9880941500921
starting screen location)
表格显示
显示数字信息的第二种形式,即showt,当其显示变量时,右对齐和填空该字段。这对于对齐数字列是有用的。例如:
define        local
var1          ,8,r
var2          ,8,r
var3          ,8,r
var4          ,8,r
define        end
set           var1 1.1,20.02,300.003,4000.0004
at            5:5
showt         var1,12,4
at            6:5
showt         var2,12,4
at            7:5
showt         var3,12,4
at            8:5
showt         var4,12,4
上面的代码输出如下:
1.1000
20.0200
300.0030
4000.0004
十六进制显示
showh命令对变量的每个字节使用两个十六进制基16的数字,显示变量的内容。例如:
calc        
showh        int4
显示:
     00007ffe
除非选择的长度标识符是特定的,showh显示的数字足以显示整个变量(一字节变量2个数字,两字节变量4个数字;等)。
字母数字显示
文本信息通常用showa(即“show alphanumeric”)命令来显示。
packz    textbuf;;Good morning!
at       5:5
showa    textbuf    $$显示“good morning”
showa命令用变量的长度或可选的特定长度显示字符。
showa    textbuf,6$$显示“good m”
嵌入显示
在实际中,show命令和其变量常常嵌入在write命令中,如:
at        5:5
write    《show,reall》《s,reall》     $’s’用于(s)how
         《showt,reall》《t,reall》    $’t’用于show(t)
         《showh,reall》《h,reall》    $’h’用于show(h)
         《showa,text》《a,text》      $’a’用于show(a)
注意缩写s、t、h和a也可使用。
字符≤和≥被称为嵌入符。左嵌入符通过按下[ALT][<]产生,右嵌入符通过按下[ALT][>]产生。
在write中嵌入show命令的通常形式是:
《command,expression》
command(命令)是show命令或其缩写之一;expression(表达式)可以是数字、变量或涉及它们的计算式,如:
write  The Fahrenheit temperature is《s,9*celsius/5+32》
给变量赋值
给变量赋值是以各种方式执行的,根据变量的类型和要存储在变量中的信息的类型而定。
数值
可以使用calc命令将值赋给数值变量:
define     local
ratio,4   real
define     end
calc
Figure C9880941500941
calc的通常形式是:
calc
Figure C9880941500942
     variable任何作者定义的数值变量
Figure C9880941500943
         赋值箭头(通过按下[ALT][A]产生)是赋值给变量的
             运算符
    expression有效的算术和/或逻辑表达式
在上面的例子中,TenCORE计算1由3除的值,将其存入变量‘radio’。
calc命令可以从一行继续到下一行,如:
calc
Figure C9880941500944
    
Figure C9880941500945
    
    
上面的calc命令将值赋给四个不同的变量,而无需在每行重复命令名字。
当实数值被指定给整数变量时,该值被舍入为最近的整数。
calc命令仅用于有效的数值变量(即,1、2、3、4和8字节整数和4和8字节实数)。它不用于5、6、或7字节变量或任何大于8字节的变量。
可以和calc一起使用的算术和逻辑操作符的完整范围,以及表示数值的其它方式将在本章的“表示文字数据的方式”部分中说明。
可选的形式
calc命令有两种可选的形式,calcc和calcs。想要更多的信息,见相应的命令描述。
文本值
因为calc命令仅用于数值变量,即,1、2、3、4和8字节定义长度的变量,它不适合赋值文本给变量。
使用packz命令来赋值文本给变量。其通常形式是:
    packz buffer;[length];text
          buffer      缓冲区用以接收该文本
          length      可选的标识符,一变量以接收赋值给变量的字符的数目
                      (packz命令设定长度,非作者)
          text        赋值给变量的文本信息
packz中的z指明了未用于存储文本的缓冲区的任何字节用零填满。不用零的话,将“rose”填入一已经包含“geranium”的缓冲区将变成“rosenium”。如果不想填零,就用pack命令。
define       local
sublen,2
subject,40
define       end
*
packz        subject,sublen;Geography 101
*
at           5:5
write        The heading《a,subject》is《s,sublen》bytes long.
length标识符可以被省略,在变量和要赋值的文本之间留两个相邻的分号:
packz        subject;;Geography 101
*
at           5:5
write        The Heading is≤a,subject≥.
象write命令一样,packz可以在几行连续:
packz        text2;;This is line one.
             This is line two.
             This is line three.
任何show命令可以被嵌入packz命令的文本标识符中,就象它们可以被嵌入write命令中一样。
packz        text;textlen;atomic weight of《a,element》is《s,weight》.
at           5:5
show        text
showa被嵌入packz命令中时,在被嵌入的变量中的空字符(0值的字节)被跳过而不拷贝。如果特定的应用程序需要甚至拷贝空字符,可以使用showv命令,而不用showa。showv命令除了在packz命令中拷贝甚至空字符或在write命令中显示甚至空字符以外和showa命令一样。
showv命令既具有嵌入的形式(缩写为《v,》),也有非嵌入的形式,但主要是嵌入在packz命令中。
选择的形式
packz命令有选择的形式,称为packz。更多的信息,见相应的命令描述。
拷贝非数值数据
从一个变量到另一个变量拷贝非数值数据的最容易的方法是使用move(移动)命令,其通常形式是:
move         source,destination,length
             source             任何定义的变量或文字
             destination        任何定义的变量
             length             指明要移动的字节的数目的表达式
下面的例子将40字节变量“newname”的内容拷贝到变量“oldname”
move    newname,oldname,40
转换文本为数字
compute命令将一串数值字符翻译为数值。
pack         text;text1;-12345
compute      text,text1,result
at           1:1
show         result
通常形式是:
compute      buffer,length,result
             buffer            字符串
             length            要转换的字符的数目
             result            存储结果的变量
要转换的字符可以包含:
◆  数字0到9
◆  一元的+和-字符(正负符号)
◆  一小数点(句点)
任何在字符串中的其它字符会引起compute失败,由大于-1的zreturn值来表明。如果失败,compute不对存储在“result”的值进行改变。
为了在arrow的输入中提取数值信息,见store和storen命令描述。变量的初始化
作者定义的全局变量通常应该在使用前初始化。这常常是在程序的启动单元中使用zero命令来完成的。
zero(置零)
zero的最简单形式设定单个变量为零,不管其定义的长度:
zero    username
zero的另一个形式清空在命名的变量的开始的特定数目的字节。
zero    scores,22
这里,它在“score”开始置零22个字节。清空一定数目字节的通常形式是:
zero variable,length
     variable     开始处的变量的名字
     length       置零的字节的数目
启动单元常常在赋予任何值到变量之前清空所有全局变量。这保证了该课程有干净状态以工作。
为了清空全局变量空间,系统变量zvarsl给出为全局变量的存储而保留的字节的总数目(包括还没有定义的空间)。如果“firstvar”是定义的第一个全局变量,下面的命令置零所有全局变量:
zero  firstvar,zvarsl
如果“firsvar”不是定义的第一个全局变量,zvarsl字节长度的区域将扩展到超出全局变量空间的末端。在这种情况下,上述的zero命令导致执行错误。
本地变量不需要明显地设定为零。一单元的所有本地变量当单元开始执行时自动被置零。
set(设定)
另一种初始化变量的方法是用set命令。除了清零变量外,set指定一系
列值到连续的变量:
defien local
jan,1
jan,1
.       $所有12个月
.
nov,1
dec,1
define end
Figure C9880941500981
该例子赋值31到“jan”,指定28到“feb”,等等。它和十二个calc命令有相同的效果。
标识符的通常形式是:
set
    variable被赋予第一个值的变量
    value list赋值到跟着variable的位置的后续值
set命令不执行任何边界检验:赋值是基于在标识符中命名的变量的定义长度进行的,不考虑后续变量是如何定义的。在上面的例子中,“jan”被单元为1字节整数,这样在set的标识符中的值被指定为以“jan”开始的十二个字节。如果紧跟“jan”定义的十一个变量不都是1字节长,它们将不包含期望的值。
set命令有选择的形式setc。更多的信息,见相应的命令描述。比较和搜索
两个变量可以使用compare命令来比较。该命令返回在两个比较串中匹配的前导字符的数目。
define        local
string1,26
string2,26
result,1
define        end
pack     string1;;abcdefghijklmnopqrstuvwxyz
pack     string2;;ABCDEFGHIJKLMNOPQRSTUVWXYZ
compare  string1,string2,26,result
该例子比较“string1”和“string2”,设定“result”为匹配的主要字符的数目;在该情况下为3,即‘abc’。
compare命令的通常形式是:
compare      var1,var2,length,result
             var1                要比较的一个变量
             var2                要比较的另一个变量
             length              要比较的字节的数目
             result              设定为最后匹配字节的位置。如果var1
                                 和var2一致设定为-1,如果它们根本
                                 不匹配,设定为0
find(寻找)
使用find命令,变量可以搜索特定的内容。
define     local
alphabet, 26
alphalen, 2
location, 2
packz      alphabet;alphalen;abcdefghijklmnopqrstuvwxyz
find      ‘er’2,alphabet,alphalen,1,location
该例子搜索变量‘alphabet’,找字符串‘ef’,它找到并设定变量‘location’为5,因为‘ef’在搜索区域中的第五个字节开始。
find命令的通常形式是:
find  object,object-length,start-var,list-len,incr,location
      object             要搜索的值,可以是文字、变量或缓存
      object-length      要搜索的对象的长度,以字节计
      start-var          对其开始搜索的变量
      list-len           搜索的条目的数目。条目可以多于一字节长,由
                    incr指定
      incr          每个条目的长度
      location      object被找到的条目数目,如果object没有被
                    找到,被设定为-1。
例子
下面的例子假定定义了下面的变量:
define    local
name      ,15      $$要搜索的名字
found     ,2       $$“name”找到的列表的位置
list(5)   ,15      $$名字的列表
define    end
变量“list”包含5个名字的列表,每个占据15个字符。“list”的内容如下:
john miller...ark ho........sarah johnston.james heflin lisa berger
Figure C9880941501001
       
Figure C9880941501002
                    
Figure C9880941501004
     
Figure C9880941501005
空字符已经被示出以提高它们的可视性,数字被加入以帮助计数字节。
文字对象
下面的find语句搜索名字mark ho:
find    ‘mark ho’,7,list(1),5,15,found    $found将是2
因为该名字小于9个字符,它可以作为文本文字‘mark ho’被提供。接着是要搜索的对象的长度,7个字符。列表的开始作为list(1)给定,其长度作为每个15字节的条目。
在搜索之后,变量“found”包含值2,因为mark ho在列表中的第二个位置(不是第二个字节)被找到。
变量对象
由于多于8字节的名字不能作为文本文字,它们必须被装入变量。下面的例子定位了james heflin。
packz    name;;james heflin
find     name,15,list(1),5,15,found
变量“found”接收值4,因为james heflin在第四个位置被找到。
逐个字节
为了找到最后的名字,可以象下面一样执行find:
packz    name;;miller
find     name,6,list(1),75,1,found
当该例子被执行时,“found”接收值6。
名字的长度给定为6,因为其定位了条目的部分,而非一整个条目。
类似地,列表被指定为75个一字节条目,而不是5个15字节条目。这使得find寻找在每个字符开始的miller,而不是在每个15字节的名字段的开始寻找它。这表示搜索的对象可以长于提供给搜索的标称条目长度。
依条目逆向
为了逆向搜索,对增量给出一负值。下面的例子从列表的末端逆向搜索john,仅看每个15字节条目的开头:
find    ‘john’,4,list(1),5,-15,found
这里,“found”接收值1。尽管搜索从列表的末端逆向前进,位置总是从列表的开头计数。
依字节逆向
逆向搜索的另一个例子是:
find    ‘john’,4,list(1),75,-1,found
在这种情况下,使用-1的增加值,使得find从列表的末端开始看每个字符。
在这种情况下,“found”接收值37,因为当按字节逆向搜索时找到的第一个john在sarah johnston中。如果正向搜索,john miller就会第一个被找到,“found”就会接收值1。
表示文字数据的方式
在calc命令中使用的数据和其它数值上下文可以以几种文字形式来表这。
为了讨论的目的,术语“文字”用于指明1、2、3、4或8字节值,其直接表示,而不是一变量或表达式。5、6、7字节的值可以被用于文字,但内部表示为8字节值。
整数文字
写作一序列数字的没有小数点的任何有效的数字是整数文字。整数文字可以有前导的加或减符号。
实数文字
实数文字区别于整数文字的是小数点的出现。即使小数点后没有数字,小数点的出现也使该值被表示为实数值。
文本文字
文本文字是包含在单引号标记中的1到8字符的字符串。一些命令允许文件名字、单元名字或写作文本文字的其它块名字。
image    plot;‘pictures’,‘bird’
上面的image命令显示了存储在文件图片中的屏幕图像,块bird。
文本文字常常内部存储为8字节;在文本的右端的未用字节为零。或者说,其表示方法是,文本文字被存储为左对齐的8字节。
因为文本文字是8字节长,calc命令可以被用于分配文本文字到8字节变量。
calc
Figure C9880941501021
变量必须已经被定义为8字节长。如果使用更短的变量,字符一定从文本文字的开始就丢失了。
字符文字
字符文字通常包括包含在双引号中的单个字符:
if    name(2)=“a”
这一字符文字被内部存储为单个字节。
用calc,字符文字可以被直接赋值给整数可兼容变量:
calc
Figure C9880941501022
尽管不常用,但也可以通过在双引号中包含2到8字符的字符串,产生多字节字符文字:
calc
Figure C9880941501023
这一文字常常存储在1、2、3、4、或8字节的尽可能最小的一个中。如果文字包含5、6、或7字符,零值字节被加入该文字的左端,以使其长度取整为8字节。或者说,字符文字以其最小的可能大小被右调整存储为1、2、3、4、或8字节。
多字节字符文字(包含在双引号中)不是替代文本文字(包含在单引号中)。正确的用法是,对于所有文本文字诸如文件名和单元名使用单引号,对于单个字符保留双引号。
按键文字
当检查系统定义变量zinput(该变量报告最后处理的键)时,常常使用按键文字。
按键文字常常是1字节字符文字带百分号前缀如下:%“a”。百分号改变1字节字符文字为与zinput一致的2字节内部表示。
也有一些其它前缀:%alt,%ctl,%altctl和%ctlalt(最后两个是等价的)。这样,为了确定是否最后处理的键是[CTRL][A],可以写
if    zinput=%ctl“a”
所有按键文字被内部表示为两字节正值。详细的格式可以在zinput的描述中找到。
十六进制文字
十六进制(基16)文字的讨论应该被认为是可选的高级材料。如果你以前没有用过十六进制数,你可能不需要该信息,你可以跳到“常数”。
十六进制文字被写作字母h,跟着数字0-9,跟着零或更多十六进制数字0-9和a-f(在十六进制表示法中,值10到15由字母a到f表示)。
这样下面是有效的十六进制文字:
h4       (等于十进制4)
h10      (等于十进制16)
h0f      (等于十进制15)
hlec4    (等于十进制7876)
hffff    (等于十进制-1)
注意hf不是一有效的十六进制文字,因为在h后的第一个数字必须是在范围的0到9。任何时候十六进制值的第一个数字是a到f之一时,额外的0必须出现在h后面,如:h0f。
可以将十六进制文字认为是被逆向评价的,从右到左。文字的位是按对读取的,从右开始,每对位对应于在值的内部表示中的一字节。每对新位使一新字节被加入文字的内部表示。在文字的左端留下的一个单个、不成对的位使另一个字节被加入,除非留下的位是零。在文字的左端的一个单个、不成对的位常常被舍弃。如果得出的内部表示是5、6、或7字节长,零值字节被加入值的左边,以补成8字节。
十六进制文字作为整数值
在计算中,十六进制文字常常被考虑为整数值。当指定十六进制文字到一变量时,区别变量的长度和文字的长度是很重要的。考虑下面的例子:
define    local
temp,4
define    end
*
calc
Figure C9880941501041
这里1字节文字的值被赋值到4字节整数变量。在考虑变量的长度之前,文字的整数值被估计。由于文字是一字节长,其值是h91,对应于二进制值10010001。因为最左位是‘1’,该值被解释为负数:111。这是赋予变量“temp”的值。注意两字节文字h0091或四字节文字h00000091将给出不同结果,即正数145。这就是为什么注意十六进制文字的长度很重要。
十六进制文字作为比特模式
有时想要使用十六进制文字来分配一特定的比特模式到实数变量。这不能用calc来做,因为计算将解释十六进制文字为整数,然后转换整数值为IEEE格式,用于在TenCORE中存储实数。数值将被保存,但比特模式不保存。
move命令可以被用于拷贝十六进制文字为作为比特模式的变量,而没有任何数字的解释。
define       local
height,4,  real
define       end
*
move         h7f800000,height,4
该例子拷贝无限值1/0的4字节比特模式为4字节实数变量“height”。因为没有执行计算,比特模式的转换没有发生。
常数
常数是文字数据的命名项。用=符号常数可以定义为全局或本地。
a=1
greet=‘hello’
常数定义的通常语法是name=literal。常数可以被给定任何对变量有效的名字。常数定义可以发生在变量定义可以发生的任何时候。一旦定义,常数可以用在它表示的文字数据可以使用的任何时候:
define       local
picfile=‘pictures’
picblock=‘fish’
px=140
py=100
define      end
*
image       plot;block,Picfile,Picblock;Px,Py
上面的image命令等价于:
image       plot;block,‘pictures’,‘fish’;140,100
常数常常被定义为用于其它变量的定义:
MAXNAMES=20
name(MAXNAMES),20
age(MAXNAMES),2
address(MAXNAMES),40
该例子定义了长度20的三个数组。通过改变MAXNAMES的定义,所有三个数组的长度可以被改变。
许多程序员习惯使用大写字符用于常数的名字,这样它们不容易与变量名混淆。
应用到在常数定义中使用的文字的规则与其它地方使用的文字的规则相同。一个常数有值、类型(整数或实数)、长度(在内部表示的字节的数目)。对于其它文字数据,当在计算中使用常数时,有时必须考虑所有这三个特征。
运算符
TenCORE支持很多的运算符,可以用于结合文字、常数和变量为数值表达式。另外,TenCORE支持许多数学函数,为作者提供定义其它函数的机制。
算术运算符
+      加
赋值(例如,
Figure C9880941501052
意味着将b值赋值给a)[CTRL][C][A]或
       [ALT][A]
-         减
*或×     乘,实数算术[CTRL][C][+]
$imul$    乘,整数算术
或÷      除,实数算术[CTRL][C][/]
$idiv$    除,整数算术
**        幂(例如,a**b意味着a的b次幂)
°        将前面的值从度数转换为弧度[CTRL][C][°]
逻辑运算符
逻辑运算符比较表达式,将对应真或假等的值返回。例如,命令序列:
if    2<      3
.     write    True
endif
因为2小于3得真。这类似于提出问题:
真还是假:2小于3。
逻辑运算符比较表达式中的操作数,然后如果表达式为真就返回值-1,如果假就返回0。用于键入非标准字符的键序列被示出。
=      等于(操作数相同为真)
≠      不等于(操作数不相同为真)
<      小于(如果左操作对象小于右操作对象为真)
>      大于(如果左操作对象大于右操作对象为真)
≤      小于或等于(如果左操作对象小于或等于右操作对象为真)
≥      大于或等于(如果左操作对象大于或等于右操作对象为真)
$and$   逻辑“与”(如果两个操作对象都是真为真)
$or$    逻辑“或”(如果两个操作对象一个是真为真)
除了上述运算符,如果在括号中的操作数为假,则not()函数返回真,反之亦然。
逻辑运算符的操作数不一定有数值。例如,ASCII字符可以彼此比较。
在TenCORE中,真由-1值表示,而假由0值表示。例如,一些表达式和它们的数值为:
2    <3    $返回-1,真
2    =3    $返回0,假
2          >3      $返回0,假
not(2>3)           $返回-1,真(真等价于非假)
更一般地,TenCORE视任何负值为真,而视任何非负值为假。
因为真和假已经联接了数值,逻辑表达式常常以命令的选择形式用作选择器:
writec     2<3;True;False
该例子打印True,因为2小于3,这样表达式的结果是-1,假如表达式为假,数值就是0,该例子就打印False。
尽管逻辑运算符常常彼此结合使用,它们有时与算术运算符一起使用,如:
calc
*     increments“score”by 1 if answer=correct
如果“answer”和“correct”的值不同,则效果是让“score”不改变。这是因为answer=correct的值将为False(0),指定给“score”的值是score-(0)。但如果“answer”和“correct”的值相同,则answer=correct的值将为True(-1),指定给“score”的值是score-(-1),等于score+1。
比特态(Bitwise)运算符
比特态运算符视每个操作数为比特模式,而不是数值。
比特态运算符和它们执行的操作是:
$mask$     逻辑“与”。如果对应比特在两个操作数中都设定则
           在结果中设定每个比特。
$union$    逻辑“或”。如果对应比特在两个操作数中任一个设定
           则在结果中设定每个比特。
$diff$     逻辑“异或”。如果对应比特在两个操作数中一个中
           设定在另一个中没设定,则在结果中设定每个比特。
$ars$      算术右移。在第一操作数中的比特模式右移在第二操
           作数中给定的位置数。最左(符号)比特右移,“超出”
           右端的比特被舍弃。
$cls1$     循环左移1字节。在第一个操作数中比特模式被循环
           左移在第二操作数中给定的位置数。移出字节的左端
           的比特重新出现在右端。
$cls2$        循环左移2字节。
$cls3$        循环左移3字节。
$cls4$        循环左移4字节。
$cls8$        循环左移5字节。
例如,$mask$、$union$、和$diff$产生下面的结果:
      $mask$         $union$        $diff$
45    00101101       00101101       00101101
84    01010100       01010100       01010100
      --------       --------       --------
121   00000100       01111101       01111001
这样45$mask$84等于4,45$union$84等于125,45$difff$85等于121。
比特态运算符想要仅对整数值和带有效整数大小(1、2、3、4或8字节)的非数值进行操作。它们不适于实数值使用。
系统定义函数
TenCORE支持许多系统定义函数,其后面的括号里有一参数。它们包括三角、对数、逻辑、算术和寻址函数。
对数
alog(x)x的以10为底的反对数(10的x次方)
exp(x)        数学常数C的x次方
ln(x)         x的自然对数
log(x)        x以10为底的对数
logx(n,x)    x以n为底的对数
comp(x)       比特态补码。在操作数x中的所有比特被颠倒(包含
              ‘1’的比特被重置为‘0’,反之亦然。
not(x)        逻辑非。如果操作对象x为假则返回真(-1),反之亦然。
三角
acos(x)       反余弦(x为弧度)
asin(x)       反正弦(x为弧度)
atan(x)       反正切(x为弧度)
cos(x)        余弦(x为弧度)
sin(x)           正弦(x为弧度)
tan(x)           正切(x为弧度)
寻址
absloc(v)        在变量v的存储器中的4字节绝对地址
sysloc(global)   全局变量空间的段地址
sysloc(local)    当前单元的本地变量空间的段地址
varloc(v)        变量v从本地或全局变量空间的开始的偏移
算术
abs(x)           x的绝对值
bit(v,x)        在变量v中的比特x的逻辑值(如果比特为1则为-1)
bitcnt(v,n)     在变量或缓冲区v中设定的比特数,范围是n比特
frac(x)          x的小数部分
imod(x,y)       x对y求模(modulo)
int(x)           变量x的整数部分
mod(x,y)        x对y求模(modulo)
randi(x)z        从1到x的随机整数
randi(x,y)      从x到y的随机整数
randr(x)         从0.0到x的随机实数
randr(x,y)      从x到y的随机实数
round(x)         x取整到最接近的偶整数
sign(x)          如果x为负数则为-1
                 如果x为正数则为0
sqrt(x)          x的平方根
π               派(3.14159265358979312)[CTRL][C][P]
表达式的求值
这部分讨论TenCORE如何求值表达式的细节。第一部分,即运算符的优先级,对所有作者都是有用的。对于需要以最大可能执行效率来优化计算的作者来说,该材料的其余部分可以被视为是可选的信息。
运算符和函数的优先级
TenCORE在评价表达式中遵守某些运算符的优先级。这样,表达式5+4×3等于而不是27,因为乘运算符×比加运算符+有更高的优先级,就先执行。这使得表达式等于5+12而不是9×3。
括号优于正常的次序,在括号内的运算先执行(以正常次序)。得出的值然后被用于表达式中的相关的运算中。下表以其执行的次序示出了TenCORE运算符和功能。1类在2类之前执行,2类在3类之前执行,依此类推。
1                    指数(**)和函数
2                    一元加和一元减
3                    乘和除(*,/,÷,$imul$,$idiv$)
4                    加和减(+,-)
5                    比特态运算符
($union$,$mask$,$diff$,$ars$,$cls1$,$cls2$,$cls3$,$cls4$,$cls8$)
6                    比较运算符(=,≠,<,>,≤,≥)
7                    逻辑运算符($and$,$or$)
8                    角度到弧度转换(如45°中的°)
9                    赋值
取整(Rounding)
带精确等于.5的小数部分的值的取整总产生一偶数,或者说,对于小数部分是.5的值:
◆  如果整数部分是奇数,就入
◆  如果整数部分是偶数,就舍。
例子:
calc
Figure C9880941501102
$**“intvar”赋值8
    
Figure C9880941501103
$**“intvar”赋值8
子表达式的压缩
一些子表达式在一单元被翻译为二进制形式时而不是其执行时被求值和压缩:
calc
Figure C9880941501104
因为子表达式(4+5)仅包含整数,其值在程序运行之前就已知了,该命令就会内部表示为:
calc
Figure C9880941501105
为了在翻译时就求值和压缩,一子表达式必须仅包含:
◆  4字节或更少的整数文字
◆  4字节或更少的整数常数
◆  运算符+-$imul$ $idiv$
包含其它元素的子表达式在压缩时不被求值,也不压缩。
运算符类型
某些运算符和功能只对特定类型的值工作,或者是实数或者是整数。在执行任何运算之前,不符合的值被内部转换为运算符需要的类型。
对实数值工作的运算符是:
*       实数乘
/       实数除
**      指数
°      度到弧度的转换
另外,三角函数、指数和对数函数、int()、frac()和round()总是对实数值工作。
当这些运算符和函数被用于整数操作对象时,该操作对象首先被转换为实数值。如果该结果被赋予一整数变量或用于需要整数值的命令中,该结果被转换回整数。
仅对整数值工作的运算符是:
$imul$    整数乘
$idiv$    整数除
另外,逻辑和比特态运算符、和函数imod()、not()和comp()总是对整数值工作。
当这些运算符和函数被用于实数操作对象时,该操作对象首先被转换为整数值。如果该结果被赋予一实数变量,在赋值之前该结果被转换为实数。
其它运算符和函数可以对整数或实数值工作,不执行任何内部转换。
运算符类型通常仅影响程序的执行速度。然而,如果不考虑暗含的转换,应用到实数值的某些整数运算符可能得出不希望的结果。特别是比特态运算符,以及comp()函数,应用于实数值时,确实不能给出有意义的结果。
中间值和速度优化
TenCORE作者常常不需要知道,在评价表达式中使用的中间值是如何内部表示的,由于内部表示不影响结果的正确性。然而,该信息对优化计算速度是有用的。
中间值常常表示为4字节整数或扩充精度的10字节实数。如果满足下面的三个条件,就使用4字节整数:
◆  操作数都不是实数
◆  运算符都不需要实数
◆  操作数都不长于4字节
如果上面的任何条件不满足,就使用10字节实数。由于10字节实数计算需要的时间是4字节整数计算的几倍,在其它(4字节)整数表达式中的单个实数操作数会极大地减慢其求值。实际中,特别是在速度苛刻的应用程序中,这通常才是显著的,尤其是如果没有数学协处理器时。
作者定义功能
作者定义功能是命名的表达式。象常数一样,用=符号定义函数:
pressure=weight/area
功能定义的最简单的语法是name=expression。函数可以具有对变量有效的任何名字。函数定义可以发生在变量定义可以发生的任何场合。一旦定义,函数可以被用于它表示的表达式可以使用的任何场合。
自变量
函数可以定义为带自变量(argument):
fahr(xx)=9*xx/5+32
inrange(aa,bb,cc)=aa≤bb $and$ bb≤cc
上面定义的函数“fahr()”给出摄氏温度的华氏等价值。它可以使用如下:
write    15°celsius is《s,fahr(15)》Fahrenheit
华氏“inrang()”确定是否一值在两个其它值之间,返回真或假。它可以使用如下:
if       inrange(100,zinputx,200)$and$ inrange(140,zinputy,180)
.        write Good!You pointed inside the box
endif
该例子检查是否最后输入的指针(由系统变量zinputx,zinputy给出)在对角是100,140和200,180的矩形区域内。
定义一带自变量的函数的一般语法是:
name(arg1,arg2,...,argn)=expression
自变量可以具有任何对变量有效的名字,但是不能重复用已经定义的变量的名字。许多作者使用双字母诸如aa、bb等来最小化使用与变量或常数名字冲突的自变量名字的可能性。
作者定义函数的目的是提高原代码的可读性和简化改变。当程序被翻译为二进制形式时,每个对函数的引用被扩展为定义的全长度。这样使用函数不影响程序的最终大小或效率。
简化为常数
在压缩时可以被整个求值和压缩的任何整数值函数被简化为常数(见该章中前面的子表达式的压缩一部分)。因此,下面的两个定义是等价的:
length=4+256+128
length=388
简单函数简化为常数在定义变量时特别有用,由于能够如下构造:
define        local
HEADER        =4
ENTRIES       =20
LENGTH        =HEADER+ENTRIES
list(LENGTH),1
define        end
类型和长度
象文字、常数和变量一样,函数也有相关的类型和长度。这些是根据上面求值表达式所给出的规则来确定的。因此,函数的值常常是4字节整数或者8字节实数。实际上,这一般不重要,因为TenCORE自动执行任何需要的类型转换。
变量空间的物理分配
为了保持在第四章讨论的全局和本地变量之间的特征和用法中的不同,它们被存储在计算机8个存储器的不同物理段中。
全局变量存储
全局变量占据当TenCORE启动时保留的存储器段,并保存到TenCORE退出。仅有一个存储器段用于全局存储。每个define block和每个define global语句在该单个段的开头为变量分配存储器。
系统定义变量zvarsl给出分配给全局变量的存储器段的长度。
本地变量存储
本地变量占据的存储器段是指定给它们被定义的单元的。每个单元有其自己独立的本地存储器段,仅当该单元是活动时存在。当单元的执行开始时,该段被保留和置零。当通过转移到新的主单元、到达该单元的末端、或经return或goto q退出而退出该单元时,该单元的本地变量的空间被释放。
空间的分配
在一系列全局或本地变量内,存储器的连续字节被顺序地分配,从全局或本地段的开头开始。例如:
  定义   位置(从段的开始偏移)
  var1,2var2,2realvar,8,rusername,40   字节0-1字节2-3字节4-11字节12-51
两个系统单元函数返回在存储器内变量的位置:
varloc()返回在变量空间内的偏移(本地或全局)
absloc()返回在计算机存储器中的绝对位置
上面每个变量的开始字节可以被显示如下:
at      5:5
write   var1              starts at byte《s,varloc(var1)》
        var2              starts at byte《s,varloc(var2)》
        realvar starts at byte《s,varloc(realvar)》
        username starts at byte《s,varloc(buffer)》
存储器的字节可以被跳过,如:
var1,2
,4
var2,2
其中,4次分配4个字节作为未用。
绝对定义
变量可以被定义为绝对偏移(从本地或全局空间的开始,只要适合)通过以下格式:
@offset,name,length,type
其中@符号指明变量要在特定位置开始。例如:
@0,first,1         $$变量空间的第一个字节
@1000,name,8,i    $$在偏移1000的8字节整数
上面的变量“first”可以与zero一起使用,以便置零所有全局变量如下:
zero    first,zvarsl
通过在绝对位置定义“first”(而不是把它首先放在定义块中),作者保证zero命令总是在全局存储器的第一个字节开始,即使其它变量定义无意地被插入在定义块中“first”之前。
绝对定义变量的偏移可以作为定义的常数给出:
loc=2000       $定义常数
@loc,xyz,r    $在偏移2000开始‘xyz’
绝对定义的使用不影响后续变量的位置,分配顺序地继续接着不使用绝对变量定义的最后一个变量。
重定义
非常类似于绝对定义的技术是重定义,其中变量被定义为在与前面定义的变量相同的位置开始。重定义采用格式:
@oldname,newname,bytes,type
其中@符号指明变量newname要在oldname的相同位置开始。例如:
username,40              $$全用户名
@username,userchar,1    $$第一个字符被重定义/1字节整数
在该例子中,变量“usercha”可以被使用,如果要检验是否第一个字符(因而假定整个名字)为空:
if        userchar=0
.         do getname
endif
正如在绝对定义的情况,重定义不影响后续变量的位置,分配顺序地继续接着不使用重定义的最后一个变量。
分段
变量可以被分为更小的可以由名字引用的片或段。
define    local
systime,4
.              hours             ,1
.              minutes           ,1
.              seconds           ,1
.              hundr             ,1
define end
clock          systime
at             3:3
write          time:《s,hours》hrs,《s,minutes》min,《s,seconds》sec
用上面的“systime”段,字节可以被一起(如在clock命令中)或单独(如在write命令中)被引用。
是变量一部分的段的定义必须跟着该变量的定义。句点必须出现在第一位置,然后是7个空字符(一个制表位),然后是段的名字和大小。
段有时被用于定义磁盘操作的缓冲区,该操作常常使用256字节长度的数据。
record,256
.              name,40
.              response(64),1
.              score,4
time,4
这里,“record”保留全256字节,即使段仅需要40+64+4,或108字节。这保证了可以在256字节磁盘记录中读取,而不影响“time”或其它邻近变量。
如该例子所述,段不必加到分段变量的全部大小。然而,它们通常不必超过它。
当定义分段的变量时,仅允许一档缩进。如果段需要再被分为子段,可以通过结合段和重定义来实现。
userid,20
.             u.id1,10
.             u.div,1
.                 u.id2,21
*
@u.idl,,10                       $$u.id1的重定义
.                 u.id1.a,1
.                 u.id1.b,9
没有给重定义的变量名字。可以给它一唯一的名字,诸如“xuid1”,但是由于只要针对“u.id1”(子)段,省略名字较简单。
在TenCORE中,在变量名中使用句点(.)没有特殊的意思,其视句点与任何其它有效字符一样,但确实对逻辑结构给予可见的重视。
数组分段
数组分段类似于标量(scalar)变量的分段。然而,当数组被分段时,每个段本身是数组,即使没有给出数组大小。
define            local
systime(3)                          ,4
.                 hours             ,1
.                 minutes           ,1
.                 seconds           ,1
.                 hundr             ,1
define end
*
clock             systime(1)
clock             systime(2)
clock             systime(3)
*
write             The three times are:
《s,hours(1)》hrs,《s,minutes(1)》min,《s,seconds(1)》seconds
《s,hours(2)》hrs,《s,minutes(2)》min,《s,seconds(2)》seconds
《s,hours(3)》hrs,《s,minutes(3)》min,《s,seconds(3)》seconds
因为变量“systime(3)”被定义为3元素数组,每个段“hours”、“minutes”、“seconds”和“hundr”被视为数组,用括号里的索引来引用。
特殊分段
在某些情况下,特别是对数组,希望在变量的定义长度之外来分段。通常,当程序执行前编译时,这会导致错误。然而,通过在段定义后增加关键字special(缩写s),对分段在原始变量的长度之外的核查就省略了。对变量定义的缺省不能与该关键字一起使用:长度和连续必须清楚地指明,关键字special加在类型的后面。
在变量的末端之外的分段不引起任何更多的字节被分配在变量中。在特殊段被定义之后,下一个变量在最后一个通常定义的变量之后的位置开始。
例子
示出你可以如何定义包含混合数据类型的数据区域:两字节整数和八字节整数。每个数据由单个字节作前缀,指明所跟的数据类型。
data,8192
@data,buf1(8192),1
.             type1,1,i,s    $$前缀字节
.             data1,2,i,s    $$在任何字节访问2字节词
@data,buf2(8192),1
.             type2,1,i,s    $$前缀字节
.             data2,8,i,s    $$在任何字节访问8字节词
newvar,1     $$在“data”后开始8192个字节
              $$由特殊段重写newar
通过知道单个条目的开始字节,可以确定其类型和用于访问适当格式的数据的适当变量名(“data1”或“data2”)。通过由当前条目(3或9)的长度增加索引到数组可以找到下一个条目。
类似于分段但可以应用于更大范围的技术是变量(variable)块。定义变量块保留了一部分可变量空间。在变量块内,标量和数组变量可以被定义和分段。
定义变量块的一般格式是:
name,size,block
其中name是对变量有效的任何名字;size是为块保留的字节的数目;block指明这是一变量块(block可以缩写为b)
下面的例子定义了256字节块,名字为“diskio”。
diskio,256,block                $$256字节数据区域,用于磁盘输入/输出
,10                              $$10字节未用
name,20                          $$用户的名字
date,6                           $$最后使用的日期
time,4                           $$最后使用的时间
.                hours            ,1
.                minutes          ,1
.                seconds          ,1
.                hund             ,1
score,2                          $$最近的测试分数
status,256,block                $$下一块这里开始
一旦变量块被定义,所有后续的变量定义都是定义块的一部分,直到下一个变量块定义。如果在变量块内的定义使用多于为块保留的空间,则发生编辑错误。
当变量块的长度未知时,size参数可以留作空白。在该情况下,变量块被给定任何需要的大小,以保存后面定义的所有变量,直到下一个块定义。源文件间分享定义
如果一程序在几个源文件上扩展,必须考虑使全局变量对每个文件适用。这通常是通过将所有全局定义放在一个文件中和在其它文件中用下面的命令包括该定义的拷贝来实现的:
tax 1,globals(defines block)
lastname,15
firstnam,10
mi,1
stunum,9
p(64),1
score,4
tax 1a,globals(defines block)
use             tax1,globals
tax 1b,globals(defines block)
use             tax1,globals
在该例子中,文件tax1,tax1a和tax1b的所有变量在tax1中定义。在tax1a和tax1b中的use命令就包括了已经在tax1中进行的定义的拷贝。
分享一些定义但不分享其它的
有时,希望定义一些变量,由整个源文件使用,定义其它一些变量是针对每个单独的源文件的。由于对所有全局变量仅有一个存储区域,单个源文件的变量的定义必须自然地避免冲突的定义。这可以通过结合使用变量块和重定义来实现。
下面的例子通过增加在tax1a和tax1b中定义的变量,将该技术应用到文件tax1、tax1a和tax1b。
tax1,globals(defines block)
lastname,15
firstnam,10
mi,1
stunum,9
p(64),1
score,4
*
tax1a,2048,block
tax1b,2048,block
tax1a,globals(defines block)
use             tax1,globals
*
@tax1a,ownvars,2048,block
*
xloc,2
yloc,2
interest,8,r
tax1b,globals(defines block)
use            tax1,globals
*
@tax1b,ownvars,2048,block
*
line11a,8,r
line11b,8,r
line12,8,r
在该例子中,由所有三个文件使用的定义包括2048字节变量块“tax1a”和“tax1b”。这些变量块是为同名字的源文件保留的数据区域。该源文件tax1a和tax1b然后使用名字“ownvars”重定义它们自己的块,在该块内定义它们自己的变量。使“ownvars”为块变量保证了在tax1a和tax1b中的变量定义不超出为它们保留的区域之外。
不象其它重定义的变量,重定义块变量一直影响变量分配。如果tax1a在“ownvars“后定义另一个块,该块将会与在tax1b中定义的变量矛盾。
访问其它存储器段
有时希望访问在除了本地和全局变量空间以外的存储器区域存储的数据。可以使用transfr和exchang命令来实现。
transfr
transfr命令从一个地方传送数据到另一个地方。其具有的一般形式是:
transfr    from-base-address,offset;to-base-address,offset;length
from-base和to-base都必须来自下面的关键字:
●  routvars,r
    路由变量。这是特殊的无结构256字节缓冲器,仅可以经transfr和
    exchang被访问。路由缓冲器为通常不由课程使用的数据提供区域。
    该缓冲器的通常用途是为活动管理器(Activity Manager)保存用户性能
    数据。
●  display,d
    CGA屏幕显示存储器。注意其它显示类型EGA、VGA等的显示存
    储器不能用transfr访问。
●  global,g
    全局变量
●  local,l
    本地变量
●  sysvars,s
    系统数据区域。注意:不为数据存储使用该区域。
●  sysprog,p
    系统程序区域。注意:不为数据存储使用该区域。
●  absolute,a
    绝对存储位置
下面的例子将路由变量传送到本地变量,然后显示学生的注册名字
define           local
localr,256
.                info,8
.                name,20
define           end
transfr          routvars,0;local,varloc(localr);256
at               10:5
write            The student name is《a,name》
exchang
exchang命令类似于transfr命令,但交换两个存储器区域。
下面的代码使用exchang命令以交换一对2字节变量:
if               x1<x0
.                exchang g,varloc(x0);g,varloc(x1);2
endff
这等价于下面内容,但更简单:
        if       x1<x0
.       calc    
Figure C9880941501221
                
Figure C9880941501222
            xl
endif
访问绝对存储器
transfr和exchang命令也可以用于访问计算机中的任何绝对存储器地址。这是通过使用基于地址的关键字absolute来实现。然后偏移四字节整数位置。
当传送到或从绝对存储器位置传送是的一有用的函数是absloc(),其返回在变量的存储器中的绝对位置。这常常用于将数据的位置传到库例程,如:
pack             name;namelen;Wendell Oliver Holmes
library mclib,answer(absloc(name),namelen)
这里使用absloc()的优点是单元mclib,answer不需要知道是否数据在本地或全局段中,它可以从绝对存储器位置直接拷贝数据。
对绝对地址的技术要点
absloc()函数返回连续整数范围内的四字节值。为了转换absloc()值为段:将数据传到DOS函数所需的偏移形式,可以使用下面的计算:
define        local
temp          ,4
segment       ,2
offset        ,2
define        end
calc          temp    
Figure C9880941501232
              segrment
Figure C9880941501233
              offset   $需要额外的0
该计算产生最可能的段地址和最不可能的偏移地址。
从现在的段计算:到绝对整数地址的偏移地址是:
calc         segment
Figure C9880941501235
$$或本地,只要合适
             offset 
             temp   
             (offset$mask$h0000ffff)
访问存储器
数据也可以从变量传送到TenCORE存储器,如:
memory write,mempool,moffset,bigbuf,bufsize
其中write是一个关键字,指明传送的方向;“mempool”是存储器块的名字;“moffset”是到存储器块的偏移;“bigbuf”是开始传送的变量;和“bufsize”是要传送的字节的数目。
关键字write指明传送是从变量空间到存储区组;read从存储器传送到变量空间;exchange交换两者的内容。
更多关于该主题或关于主和副存储区组的信息,参见memory命令。
                          命令列表
area........................................................................1
71
asmcall.....................................................................1
87
at/aff......................................................................1
89
beep........................................................................1
92
block.......................................................................1
94
box.........................................................................1
95
branch......................................................................1
97
calc........................................................................19
8
calcc.......................................................................1
98
calcs.......................................................................2
00
circle......................................................................2
01
clearu......................................................................2
02
clock.......................................................................2
03
color.......................................................................20
4
colore......................................................................2
05
compare.....................................................................2
07
compute.....................................................................2
09
date........................................................................2
10
debug.......................................................................2
11
device......................................................................2
12
disable.....................................................................2
13
do..........................................................................2
16
dot.........................................................................2
19
draw........................................................................2
20
ellipse.....................................................................2
21
else........................................................................2
22
elseif......................................................................2
23
enable......................................................................2
23
endif.......................................................................2
27
endloop.....................................................................2
27
erase.......................................................................2
28
error.......................................................................22
29
exchang.....................................................................2
30
exec........................................................................2
32
exitsys.....................................................................2
36
extin.......................................................................2
37
extout......................................................................2
39
fill........................................................................24
0
find........................................................................24
1
flow........................................................................24
4
font........................................................................26
lgoto.......................................................................2
72
if..........................................................................27
3
image.......................................................................27
5
initial.....................................................................28
4
intcall.....................................................................2
87
loadu.......................................................................2
96
loop........................................................................2
97
memory......................................................................2
99
mode........................................................................3
06
move........................................................................3
11
nextkey.....................................................................31
2
nocheck.....................................................................3
15
operate.....................................................................3
15
origin......................................................................3
16
outloop.....................................................................3
18
pack,packz,packc,packzc..................................................31
9
page........................................................................3
23
palette.....................................................................3
25
pause.......................................................................3
29
perm........................................................................3
36
polygon.....................................................................3
41
press.......................................................................3
42
print.......................................................................3
44
put.........................................................................3
46
receive.....................................................................3
48
reloop......................................................................3
50
return......................................................................3
51
rotate......................................................................3
53
scale.......................................................................3
55
screen......................................................................3
57
seed........................................................................3
63
set.........................................................................3
64
setbit......................................................................3
65
setc........................................................................3
66
show........................................................................3
68
showa.......................................................................70
showh.......................................................................3
71
showt.......................................................................3
72
showv.......................................................................3
74
status......................................................................3
75
text........................................................................3
80
width.......................................................................3
96
window......................................................................3
96
write.......................................................................4
02
writec......................................................................4
04
zero........................................................................4
06
area
管理指针输入
area    关键字
        define         定义指针区域
        highlight      指明加亮类型和颜色
        disable        暂时休眠当前指针区域
        enable         重新激活不能用的指针区域
        clear          删除当前指针区域
        select         醒目指针区域
        save           保留当前指针区域给命名的存储器块
        restore        从命名的存储器块检索指针区域
        delete         删除命名的指针区域存储器块
        reset          删除所有命名的指针区域存储器块
        toggle         加亮乒乓指针区域或使其不醒目
        inarea         确定是否位置在指针区域内
        dir            返回活动指针区域识别符的列表
        key            返回特定键的区域识别符
        info           报告与指针区域相关的特性
        repos          重定位窗口中的所有指针区域
描述
方便在屏幕的指定区域中的指针输入。一旦指针区域已经被定义,在该区域内的Click或其它指针行为产生特殊的输入值,就好象已经按下了键盘键。合适的代码可以使这一输入激发到另一个单元的flow转移,打断一pause,产生打印一箭头或其它任何希望的行为。
直到50个活动的指针区域可能存在;该数目可以用/sa=命令行选项来增加。当前定义的指针区域的数目被存储在系统变量zareacnt中。zmaxarea保存了所允许的最大数目的区域。
area定义基于jump转移到新的主单元而被清除。作为新的主单元的初始化的一部分,area的缺省设定是激活的。当窗口打开时,area定义被保存,当窗口被关闭时,其恢复到它们的先前状态,除非在window close上使用noarea。
在指针移入或移出区域时,指针区域可以被自动加亮或不加亮。当前指针区域与其特性一起可以被保留在命名的存储器块中;用该名字可以关闭或重激活它们。指针区域可以被暂时不能用或能用。
area define;[LOCATION];[LOCATION];[action=KEY,action=KEY...]
定义矩形屏幕区域,其对角由两个位置标识,其中所列的任何指针动作产生输入键。带几个定义的动作和键值的指针区域可以在后面的行继续。
下面的指针行为可以产生输入值。每个指针行为有其自己的关键字:
click=                按下任何指针按钮
left=,right=        按下左或右指针按钮
clickup=              释放任何指针按钮
leftup=,rightup=    释放左或右指针按钮
add=,sub=           按下或释放第二个按钮
enter=,exit=        指针进入或离开一区域
如果使用关键字left或right,则不能使用click。如果使用leftup或rightup,则不能使用clickup。如果click=是唯一的特定的行为,则可以省略click=关键字。
KEY可以是任何普通的键值,诸如a,b,c,%f1等,或者伪键%input1-999之一。
例1
当在由10:20;11:30定义的区域内按钮被单击时,输入值%enter。在这种情况下,关键字click=是可选的(click=%enter)。与下面的flow命令一起,area输入使jump到单元nextunit。
area     define;10:20;11:30;%enter
flow     jump;%enter;nextunit
例2
如果左按钮被按下,则输入值%“L”,如果右按钮被按下,则输入值%“R”。
area     define;100,200;300,250;Left=L,right=R
例3
当指针进入由5:3;6:10定义的区域时,输入伪键%input999。如果在该区域中左按钮被释放,产生%f10。
area        define;5:3;6:10;leftup=%f10,enter=%input999
例4
定义整个屏幕作为指针区域。单击右按钮将输入伪键%other。
area        define;;;right=%other
例5
定义从10:10的矩形区域,30个字符跨两行。指针按钮单击将输入%f1键。
at           10:10
area         define;30,2;;click=%f1
例6
定义矩形区域围绕文本“Topic 1:Introduction”,允许固定的或可变的空间。在区域中单击将输入%“1”
at           15:10
write        Topic 1:Introduction
area         define;15:10;zx,zy+zfonth;click=%“1”
例7
在两行上继续
area         define;200,150;400,170;left=a,right=%home,leftup=b,rightup=《01》,enter=%inputl,exit=%input255
area define;[LOCATION];[LOCATION];[action=KEY,action=KEY...][;modifier;modifier...]
Modifiers
下面的修正符(modifier)可以与arear define语句一起可选地使用。可以使用任何数量的修正符,它们可以以任何次序排列。setid和getid是互斥的。
default   为所有后面的主单元保留活动的指针区域。(通常,到新的擦除
          屏幕的主单元的转移清除所有指针区域。)参见Default Area
          Highlighting。
priority  分配从0到15的优先级,以便建立优先次序,用于重叠区域。
          15级是最高的优先级。
          如果优先级没有设定,该区域被指定0级。如果指针活动发生
       在两个或多个重叠的指针区域内,最高优先级的区域将优先。
       如果重叠的指针区域具有相同等级,最后定义的区域优先。
getid  指明变量以保存专用的2字节指针区域识别符,其当定义指针
       区域时自动产生。系统产生的识别符常常是负的,在-32768
       和-1之间。ID用于以区域命令的形式识别特定区域,在系
       统变量zinputa中返回。
setid  指明成为指针区域的专用识别符的号码。作者指定的识别符必
       须在1和32767之间以避免与系统产生的识别符的可能冲突。
       其识别符与现存指针区域的识别符一致的指针区域的定义将
       导致现存指针区域被重新定义。ID用于以区域命令的形式识
       别特定区域,在系统变量zinputa中返回。
例1
指针区域定义将是基于进入新主单元的缺省区域。该区域可以随后使用在可变areaID中接收的ID被引用。
area        define;5:10;10:25;left=b,right=B;default;getid,areaID
例2
当在矩形区域中任一按钮被按下时,输入伪键%input1。该区域可以由特定ID值1来引用。
area        define;100,100;200,110;%input1;setid,1
例3
当指针进入矩形区域时输入十六进制值7000。如果任何具有较低优先级的其它指针区域重叠该区域时,则该区域优先,因为它具有最大优先级。
area        define;400,150;450,200;enter=《h7000》;priority,15
area  highlight:COLOR|off[;xor][track|toggle]
控制所有后面的指针区域的加亮颜色。区域加亮在缺省时被关掉。单个area highlight语句影响所有后面的area define语句,但不影响前面定义的指针区域。由initial语句加亮被重置为关掉。
系统变量zareahl保存当前醒目区域的区域id(如果没有醒目的区域则为0)。
通过在屏幕区域上以异或(XOR)模式和颜色绘制框,来产生加亮的给定颜色。屏幕区域的左上象素被用于确定框颜色,该框颜色XOR屏幕到希望的加亮颜色。
识别符
下面的修改符可以与area highlight语句一起可选地使用,但仅当颜色被指定时。track和toggle是互斥的。
xor     通过直接XOR屏幕和指明的颜色,指明要加亮的指针区域
track   仅当指针进入已使加亮使能的另一个区域时,使该区域不加亮
toggle  禁止自动区域加亮,允许作者控制加亮(参见area toggle)
Default Area Highlighting(缺省区域加亮)
当缺省区域是有效的且主单元经jump类型转移被进入时,区域加亮直到下面事件之一后才发生:
◆  执行转移命令(loop,jump,jumpop,branch,doto,goto)
◆  从系统请求输入(pause,arrow,nextkey,delay)
◆  到达单元末端
◆  执行某些可能要很长执行时间的命令(image,fill)
◆  带关键字area,pointer或break的enable命令
这些也是检查指针位置看是否它已经进入或退出一加亮区域的时刻。
该延迟允许作者在希望加亮的屏幕上得到显示的时间。如果需要转移或如果输入必须在建屏幕之前被请求,作者必须首先发出disable area语句以禁止加亮。在建屏幕后,enable area接通任何加亮。
例1
产生红色+加亮区域。它使用区域的左上角作为XOR参考颜色。这样,在250,320(区域的左上角)的象素的颜色被用于确定哪个颜色与区域XOR(异或)以产生红色。
area        highlight;red+
area        define;250,300;400,320;click=%f10
例2
为所有后面定义的指针区域关掉醒目。
area        highlight;off
例3
用蓝色XOR后面定义的指针区域。当指针进入一区域时,该区域将被加亮,但直到其进入另一个区域时,该区域才被不加亮。
area         highlight;blue;xor;track
例4
禁止自动区域加亮。area togle可以被用于使这些区域加亮。
area         highlight;white;toggle
area disable [;areaID/s][;noplot]
暂时禁止具有特定识别符的指针区域。单个该disable关键字暂时禁止所有定义的区域。禁止的指针区域不再产生指针输入或加亮。如果指针区域在不能用时被加亮,则加亮被关掉,除非出现noplot修正符。
例1
禁止其识别符包含在变量idvar中的指针区域。如果该指针区域当前是醒目的。它将保持醒目。
area         disable;idvar;noplot
例2
禁止其识别符是1和2的指针区域。
area         disable;1,2
例3
暂时禁止所有指针区域。
area         enable
area enable[;areaID/s]
使能用area disable预先禁止的指针区域。
例1
使能其识别符包含在数组元素areaID(1)、area(2)和areaID(3)中的指针区域。
area         enable;areaID(1),areaID(2),areaID(3)
例2
使能所有指针区域。
area         enable
area clear [;[areaID/s][;noplot][;default]]
当和区域识别符使用时,clear去除特定的指针。当不与区域识别符使用时,clear除去所有的区域。区域的清除与禁止无关。
如果当一指针区域被去除时是加亮的,该加亮将被关掉,除非使用了noplot。
default修正符被用于去除任何已经用default修正符设定的区域定义。
例1
删除其识别符包含在变量ID1和ID2中的指针区域。
area          clear;ID1,ID2
例2
删除所有指针区域。接着的jump转移将恢复任何单元default指针区域。
area          clear
例3
从整个屏幕中删除所有指针区域,保持任何加亮不变。当窗口被关闭时,任何前面的区域被恢复。
window        open;100,100;300,300
area          clear;;noplot
...
window        close
area  select;areaID|pointer|off
使由识别符指明的区域或当前在指针下的区域加亮。如果off被指明,则任何加亮的区域被关闭。select不与toggle醒目区域工作。
一次仅有一个区域被加亮;任何前面加亮的区域被关闭。
例1
使其识别符包含在变量aID中的区域加亮。
area          select;aID
例2
关掉任何加亮的区域。
area          select;off
例3
在打开窗口之前,所有区域是禁止的。其关掉任何是接通的加亮。在关闭窗口之后,该区域被重新使能,任何在该指针下的区域被加亮。
area          disable         $$关掉区域和加亮
window        open,100,100;300,300
...
window        close
area          enable             $$再次接通区域
area          select;pointer    $$如果指针在区域上,则加亮
area  save;‘NAME’|local
area  save;default
在存储区组块或buffer缓冲区中保存当前组区域定义。该名字可以是文本文字或包含在变量中。命名的块可以以后在任何单元中恢复。
local关键字在指定给当前单元的存储区组块中保存区域设定。本地块仅可以在其保存它的单元中被恢复;当该单元的执行结束时它被自动删除。
将当前区域设定保存到buffer缓冲区,使它们成为所有新主单元的缺省area设定。在jump到另一个单元时它们被自动复位。
存储区组由下面的命令使用:memory,image,window,status.area,flow,font和perm。存储器块在产生时被标识为属于特定命令类型,不能由使用存储区组的其它命令来访问;不同的命令可以使用存储器块的同一名字而没有冲突。
例1
在命名的存储器块levell保存当前指针区域。
area     save;‘levell’
例2
使用包含在变量areavar中的名字保存当前指针区域。
area     save;areavar
例3
保存和恢复在针对执行的单元的存储区组块中的的子例程调用的活动流设定。
area     save;local
do       routines,graph
area     restore;local
例4
使当前区域设定成为由jump转移进入的所有后续单元的缺省值。
area     save;default
a rea   restore:‘NAME’|local[;delete][;noplot]
area    restore;default [;noplot]
用前面保存的设定取代当前区域设定。可选地,命名的或local块可以通过使用delete修正符从存储区组中删除。
任何在保存时加亮的区域在恢复时是加亮的,除非使用noplot修正符。
例1
在库调用时保存和恢复当前区域设定。库例程可以转换活动区域设定为所希望的,而不在返回时影响调用的程序。或者,area save和restore可以被建入库例程以提供更容易使用的工具。
area        save;‘areas’
library     routines,graph
area        restore;‘areas’
例2
保存和恢复在执行的单元专用的存储区组块中的的子例程调用的活动流设定。当退出单元时该块被自动删除。加亮状态不恢复。
area        save;local
do          routines,graph
area        restore;local;noplot
例3
恢复指针区域的单元缺省设定。
area        restore;default
area delete;‘NAME’|local
从存储区组中删除保存的指针区域组,而不影响任何当前的指针区域定义。
例子
从存储区组中删除在名字menu下保存的区域
area        delete;’menu’
area reset
从存储器中删除所有命名的指针区域组,而不影响当前的定义。缺省的区域定义组不被影响。
area toggle;areaID
使其识别符被指明的指针区域加亮或不加亮。该关键字选择仅工作于toggle指针区域(由area highlight设定)。这是为了想要整个控制指针区域的加亮的作者。不象area select,多于一个指针区域可以被加亮。
例子
使其识别符包含在变量cID中的指针区域加亮。
area          toggle;cID
a rea inarea:LOCATION;areaID
确定是否指明的位置在指针区域内。如果是这样,该区域的识别符被放入变量areaID。如果该位置是在多个区域内,最高优先级区域或,如果等级相同,最后定义的区域优先。
如果位置不在任何区域内,变量被设定为0。
例子
设定whichID为1,识别符属于优先级15指针区域。
area    define;90,100;120,160;click=%space;
        priority,15;setid,1
area    define;90,100;120,160;click=%homw;
        priority,6;setid,2
...
area    inarea;100,155;whichID
area dir;idBuffer [;length]
返回所有活动指针区域的识别符。为了报告指针区域的最大数目,区域识别符缓冲区应该在长度上是zmaxarea*2字节。
例子
返回在数组缓存id中的所有当前活动的指针区域的区域识别符。
define       local
id(50),2    $使用系统缺省作为数组长度
define       end
...
area         dir;id(1);2*zareacnt
area key;KEY;arsID
返回包括在其指针行为列表中的特定键的指针区域的识别符。如果两个区域有特定键列表,则最高优先级区域的识别符被返回。如果区域具有相同优先级,最后定义的指针区域的识别符被返回。
area info;areaID;infoBuffer48
返回使能指针区域的特性到特定缓冲器。指针区域通过提供其识别符来选择。48字节缓冲器的结构如下:
  特性   字节
  左下x坐标   2
  左下y坐标   2
  右上x坐标   2
  右上y坐标   2
  区域的加亮颜色   4
  类型(0=无,1=加亮,2=轨迹)   1
  优先级(0=无,1...15=优先等级)   1
  缺省(0=无,1=缺省)   1
  窗口打开等级(zwindows)   1
  保留   16
  left=键值   2
  right=键值   2
  enter=键值   2
  exit=键值   2
  leftup=键值   2
  rightup=键值   2
  add=键值   2
  sub=键值   2
例子
从其识别符包含在变量ID2中的区域中读取信息,到命名为areadata的缓冲区。
area       info;ID2;areadata
如果当该语句被执行时一窗口有效,则特定的坐标将与当前窗口有关。
area repos;xOffset,yOffset
由指明的绝对屏幕坐标调整所有指针区域。如果一个或多个窗口是打开的,它仅工作于当当前窗口打开时产生的区域。
例子
将所有指针区域移动到左20个象素和上100个象素。
area         repos;-20,100
系统变量
zreturn
save,restore,reset和delete形式的area命令,使用存储区,报告在zreturn中的成功或失败。另外,select和toggle形式也通过zreturn报告错误状态。所有其它形式设定zeturn为ok(-1)。主要的zreturn值是:
-2         冗余操作;区域已经被选择
-1         操作成功
10         名字未找到
11         无效醒目类型的选择或触发
18         不能满足存储区组请求
杂项
zareacnt   当前定义的指针区域的数目
zareahl    当前加亮的区域的area id(否则为0)
zinputa    引起当前zinput值的区域的area id(否则为0),当zinput更新
           时设定
zmaxarea   可以定义的区域的最大数目
asmcall
调用装载到变量中的汇编语言例程
asmcall    buffer[,variable]
           buffer       在例程装载处开始变量
           variable     将特定变量偏移放入寄存器BX
描述
调用已经装载到本地或全局变量中的汇编语言例程。段寄存器DS指向变量的开始。如果可选的variable被使用,则寄存器BX被设定为variable的偏移。结果是DS:[BX]指向列为第二标识的变量。在例程结束时必须执行远return,以返回控制到TenCORE。AL寄存器的值被返回在TenCORE系统变量zreturn中。
汇编语言例程可以转换任何微处理器寄存器,但SS和SP如果改变的话,在返回到TenCORE之前必须被恢复到原始值。
地址
下面的系统定义函数参考,有时对asmcall是有用的:
sysloc(global)      全局变量的段地址
sysloc(local)       当前单元的本地变量的段地址
varloc(变量)        变量的偏移地址
absloc(变量)        在存储器内变量的绝对地址,表达为4字节
                    偏移没有段,其对应于段:偏移地址如下:
                    段=absloc()$ars$4
                    偏移=absloc()$mask$h0f
如果你有段或偏移,希望将它们转换为绝对位置,使用下面的计算:
absloc=((segment $mask$h0000ffff)$cls4$4)+(offset$mask$h0000ffff)
例子
反转一字节中的比特。
*
define        global
asmbuff(12),1                     $$汇编语言程序的缓冲区
asmdata,1                         $$整数字节以反转
define        end
*
*             由直接执行装载短汇编语言例程
*
*             例程以DS开始:BX指向TenCORE
*             变量“asmdata”。程序装载和反转。
*             字节,将其留在寄存器AL中。在asmcall之后
*             zreturn被设定为留在AL中的值
*
*             这里所用的设定命令允许程序员仿真会用于汇编器
*             编程的结构。
*
set         asmbuff(1)    $$镜            proc far
            h8a,h27      $$mov ah,[bx];取回字节
            h0b9,h08,h00$$mov cx,0008  ;移位8比特
*           $mirrori;
            h0d0,h0ec    $$sh rah,01    ;移动LSB到CF
            h0d0,hd0     $$rcl al,01    ;移位CF到AL
            h0e2,h0fa    $$循环          镜1
*
            h0cb          $$retf          ;远返回
*                         $$endp
*
calc $$试验值以陈述比特反转
asmcall     asmbuff(1),asmdata           $$调用例程,指向数据
at         4:4
write      Original value=《h,asmdata》hex
           Reversed value=《h,zreturn》hex
系统变量
zreturn    基于返回保存AL寄存器的值
at/atf
设置屏幕位置和文本边框
at         [LOCATION][;LOCATION]
描述
设定当前屏幕x-y位置和左文本边界到标识中的第一LOCATION。系统变量zx,zy和zmargin被更新为该新位置。如果字符坐标被用于指定at位置,zx和zy系统变量包含字符单元的左下图形坐标。
右文本边界(其最初被设定为右屏幕或窗口边框)可以通过指明第二LOCATION来设定。右边界在系统变量zrmargin中。到达右边界的文本被自动转行到左边界。对于可用的文本换行选择见text margin。右边界由废弃的charset字符绘图而忽视。
空白标识形式设定左边界为当前屏幕位置。该形式等价于下面的语句:
at               zx,zy
命令的atf形式允许基于第一个下面的实绘图字符的高度来自动调整zy位置。该第一个后面的实字符的顶象素被放在标准字体字符的顶部的相同y位置。atf的该行为规定了文本的明显的固定顶边界,即使文本包含未知的开始的嵌入的文本特性,诸如大小和字体。当第一个实数字符被绘制在屏幕上时,对zy的调整发生在下面write或show语句中。
例子
例1
从x=10,y=150开始写文本。
at       10,150
write    This is line one of my text.
         This is line two at the same left margin.
例2
在行7,字符3开始写文本。
at       7:3
write    The line:character format is used for text more often than
         the graphic x,y format.
例3
带wordwrap的文本边界设定绘图,以便在下面两个位置at指出的右文本边界执行词的自动换行。在at的第二个位置在屏幕(或当前窗口)上的第30个字符位置建立了右边界。第二个位置的行号部分不由系统绘图器使用。
text     margin;wordwrap
at       5:10;20:30
write    This text will appear on the screen as a paragraph only 20 characterswide regardless of how long the lines look in source code...
例4
通过使用atf命令,从两个write语句的文本的顶部看起来在屏幕上有公共的顶边界。具有初始嵌入的大小2的代码序列的第二个write语句在绘图“S”时调整系统变量zy,这样“S”的顶部看起来在标准大小字体的相同位置。
atf                10:10
write              Size 1 text
atf                10:30
write              Size 2 text
*                  $$在文本的开始嵌入大小2
系统变量
下面的系统变量反映了at语句的行为
zx                 屏幕位置的x坐标
zy                 屏幕位置的y坐标
zline              行号
zspace             字符号
zxycolor           屏幕位置的象素颜色
zmargin            左文本边界
zrmargin           右文本边界
beep(蜂鸣)
使扬声器产生控制的蜂鸣
beep    duration[,hertz]
        duration           蜂鸣的长度,以秒计
        hertz              频率,以每秒的周数计
描述
产生在标识中指定的频率和长度的音调。如果频率不指定,则缺省为1000Hz。
例子
例1
产生一小的、可能是可识别的音调。
beep    .15,261.3         $$C
beep         .2,349.66        $$F
beep         .2,440.88        $$A
beep         .4,523.25        $$C
beep         .2,440.88        $$A
beep         .4,523.25        $$C
例2
示出beep命令的用户控制
define       local
length       ,4,r           $$蜂鸣的长度
define       end
*
at           5:5
write        How many seconds do you want the speaker to beep?
arrow        6:5
store        length
.            at 8:7
.            write            Please enter a number,like2,3,or 5
ok
.            beep             length
endarrow
频率
从中C开始的一个八度音阶具有下面的频率。其它八度由2乘或除:
C            261.63
C#           277.18
D            293.66
D#           311.13
E            329.63
F            349.23
F#           369.99
G            392.00
G#            415.30
A       440.00
A#      466.16
B       493.88
C       523.25
为了计算更精确的频率,使用110的倍数作为标准“A”和对每个半度音调增量由2的12次根乘。
block(块)
block[LOCATION];[LOCATION];[LOCATION][;[from page][,to page]]
描述
从一个位置拷贝矩形屏幕区域到另一个包括显示页的位置。仅对16色或256色屏幕可选。block命令仅工作于绝对绘图坐标;它对原点、旋转或比例无效。
第一个两个位置指明了要拷贝的源区域的角部;如果没指明,它们缺省为整个区域。第三个位置是目的处的左上角,它缺省为源区域的相同位置。
第四个参数(frompage)是源页的号码;它缺省为当前读取页(zrpage)。
最后一个参数(topage)是目的页的号码;它缺省为当前写入页(zwpage)。
block    x1,y1;x2,y2;x3,y3    $$拷贝屏幕的一个区域到另一个
block    x1,y1;x2,y2;;2,1    $$从页2拷贝到页1
block    x1,y1;x2,y2;;2$$从页2拷贝到当前页
at       10:10
block    6,5;;5:10              $$从10:10拷贝6字符、5行到5:10
box
在屏幕上画一实体方框或一框
box      [LOCATION][;[LOCATION][;Xframe[,Yframe]]]
描述
以前景颜色在屏幕上画一实体方框或一框。对于LOCATION的描述见命令用法约定。erase命令与box命令一致,除了它使用背景色来画图。
框宽度自变量的出现指明了要画一框而不是一实体框。右侧和左侧的宽度由第一个框自变量来指定,以象素计,而第二个框自变量指明了顶和底的宽度。如果第二个框自变量缺失,顶和底的框宽度被设定为最匹配在屏幕上的显示方面的侧宽度。
例子
例1
整个屏幕(或窗口)是蓝色,带白框5个象素宽。
color         blue
box
color         white+
box           ;;5
例2
实体矩形200象素宽100象素高被以前景颜色放在屏幕上。图形坐标被用于指明位置的每个x,y坐标。
box           101,101;300,200
例3
在write命令中的文本是红框2象素宽。text measure命令被用于确定屏幕区域,文本的下一段在该屏幕上绘制。该信息被返回在用于左下角的zplotxl,zplotyl和用于右上角的zplotxh,zplotyh系统变量中,
text          measure           $$初始化文本测量
*
at            100,150
write         This is a paragraph of text of arbitrary
              length that will be nicely framed...
*
color         red+
box           zplotxl-2,zploty-2;zplotxh+2,zplotyh+2;2
              $$帧文本
例4
20字符宽和10行深的蓝框被放在屏幕上,在第10行开始。由于box命令不能改变由at命令设定的系统变量zx和zx。文本也将出现在10行的开始。
at              10:1
color           blue
box             20:10
color           white+
write           This text appears in the box...
branch
将执行转移到同一单元中的标注的一点
branch label 1q
branch     SELECTOR;label|q;label|q;...
           label  出现在当前单元中的任何有效标注,标注是一数字,可
                  以跟着1到7个字母或数字,在行的命令段中。
           q      转移到当前单元的末端。
描述
在一单元内转换执行流,通过将执行转移到接着特定标注的行,或者如果关键字q被指明的话,到单元的末端。在选择的列表中的空白条目被用于通过到下面的命令。
例子
如果name已经被设定,branch命令将跳过箭头结构。
bfanch    name=0;;1skip
at        10:10
write     Enter your name
long      8
arrow     11:10
storea    name
ok
endarrow
*
1skip
at        15:10
write    Welcom,《showa,name》
calc
赋值一值或计算式到一变量
calc
Figure C9880941501501
描述
赋值箭头的右边的表达式可以是常数、文字、变量、运算符和函数的任意组合,只要它计算为单个数值。
calc不能与大小大于8字节的变量工作。
命令名字不需要为计算式的附加行而重复。
关于计算、赋值和变量的更多信息,参考在该文档中的Variable,Calculations,and Data Transfer部分。
例子
增加一计数器,计算一百分比,计算复合表达式。
calc
Figure C9880941501502
score
Figure C9880941501503
dist
calcc
选择性地执行整个计算和指定。
calcc
描述
calcc是calc的另一种形式,其基于选择器的值,执行计算列表之一。在列表中的每个计算可以指定不同的值到不同的变量。如果选择器的特定值没有计算要执行,则使用空标识(;;)。
calcc语句可以在后面行的标识段继续。
例子
例1
如果选择器right是1,设定review;如果right是2或更大,则指定score。
right的零值或负值不发生任何事情。
calcc
Figure C9880941501511
例2
如果选择器complete为真,则值4被赋值到section;若非,没有赋值发生。
calcc
例3
如果select为1,则指定column,如果select为2,则赋值apple,如果select为3则赋值total 50。如果select为负值、零或大于3,则不发生任何事情。
calcc         select,,,
Figure C9880941501513
Figure C9880941501514
Figure C9880941501515
calcs
选择性地赋值一值到一变量
calcs
Figure C9880941501516
描述
calcs是calc的另一种形式,计算表达式的列表之一,将其赋值到给定的变量。基于选择器的值,表达式被选择,从赋值箭头的右边的列表计算,将其赋值到特定的变量。如果对于选择器的特定值,没有赋值要执行,则使用空标识(;;);变量保持不变。
calcs语句可以在后面行的标识段继续。
例子
例1
选择器month被用于设定变量days到其合适的值。该选择的赋值连续了两行。
calcs
Figure C9880941501517
例2
如果complete为真,则section被赋值4;否则它被设定为表达式last*2的值。
calcs
Figure C9880941501521
circle
画圆。
circle radius[,fill|angle,angle2]
说明
以当前前景色画一特定半径的圆,该圆中心位于当前屏幕位置。
选项fill关键字生成用当前前景色填充的实线圆。
一个标识符circle后不改变当前屏幕位置,以便能够不用复位屏幕位置画同心圆。
三个标识符形式画一圆弧。总是从angle1到angle2逆时针画圆弧。结果,根据首先指定的角度画不同的圆弧。例如,circle 100,0,90画四分之一圆,从0到90度。语句circle 100,90,0画四分之三圆,从90度绕到360(或0)度。
对于一圆弧,当前屏幕位置更新到末端(最后)圆弧位置。
举例
在屏幕上定点画圆;两个圆弧具有相同中心,但半径不同;然后填充圆。
screen    vga,graphics,medium,color
at        320,240        $$设定圆的中心
circle    80              $$画半径为80的圆
circle    60,0,90       $$画圆的四分之一
at        320,240        $$复位该圆的中心
circle    70,90,0       $$画圆的四分之三
at        320,240        $$复位圆的中心
circle    40,fill        $$在该中心画填充的圆
clearu
从单元高速缓存中去除单元。
clearu    [UNIT]
clearu    SELECTOR;UNIT;UNIT...
说明
当需要时,各单元被自动装入虚拟存储中央单元高速缓存,并且在需要时删除,以为新单元腾出空间。clearu可用来人工从单元高速缓存中清除特定单元。
空白标识符形式,除了当前单元外从单元高速缓存中去除其它所有的单元。
clearu仅清除从对应于操作的当前模式的类型文件装入的单元。参看讨论操作模式的operate。
clearu被edisk命令影响。由于单个文件的多个拷贝可以出现在不同的驱动器上,在单元高速缓存中可以有单个单元的多个拷贝。如果zedisk=-1,通过搜索所有驱动器取出所述单元。从单元高速缓存中清除匹配clearu的标识符中课程/单元说明、以及匹配操作的当前模式(源或二进制)的所有单元。如果zedisk≠-1,则仅从单元高速缓存中清除来自当前执行盘的一个单元。
如果因为没有匹配单元参考及操作说明模式的单元,而没有单元从高速缓存中被清除,zreturn设定到-2。如果试图显式清除当前执行单元,zreturn设定到19。
clearu主要由实用程序使用,以控制单元的哪个版本是在存储器中或者控制那些单元被删除以为其它单元腾出空间。
系统变量(System Variables)
zreturn
-2      冗余操作;没有动作
-1      成功操作
19      操作无效;设法清除当前单元
clock
读或写系统时钟。
clock time4[,set]
说明
将来自系统时钟的信息拷贝进特定的4字节缓冲区。set关键字将系统时钟设定到缓冲区中的时间。
系统时钟存储为4字节;小时、分钟、秒和百分之一秒分别用一个字节。
举例
读系统时钟,并且以小时和分钟显示当前时间。
define    local
sysclock,4                $$保持时间变量
.         hours,1
.         minutes,1
.         seconds,1
.         hundrths,1
define    end
clock     sysclock         $$读当前时间
at        5:5
write     当前时间是:《t,hours,2》:《t,minutes,2》)
color
设定前景色。
color COLOR
color SELECTOR;COLOR;COLOR;...
write《color|c,COLOR》
说明
为后面的文本和图形选择前景色。
在关键字末端的+表示颜色的亮度版本。关键字backgnd给出背景色(用colore命令最后指定的)。计算硬件颜色号的数字表达式可代替关键字使用。
关键字设定前16色(参看颜色关键字的命令语法说明)。对于颜色,必须使用代码大于15的颜色号。
缺省前景色是white。可使用跟在color后的status save;default改变缺省值。
文本的颜色也能够通过将文本属性嵌入write命令的标识符中进行改变。
CGA限制
当在复合色监视器上使用任一CGA图形显示时,打开厚度选项(thick on)产生更真实的颜色。
screen  cga,graphics,medium,color
screen  cga,graphics,medium,mono
当使用screen cga,graphics,medium时,可用四个单独的颜色组:
  1   2  3   4
  backgnd   backgnd  backgnd   backgnd
  绿   绿+  青   青+
  红   红+  紫红(magenta)   紫红+
  标   标+  的   白+
显示的所有颜色必须来自一个颜色组。如果当来自一组的颜色在显示时,选择另一组的颜色,那么屏幕上的所有颜色改变到新选择组中的相应颜色。
举例
在蓝色框内显示黄文本。
screen      vga
color       blue
box         5:10;10:50
color       yellow
at          6:15;10:50
write       a paragraph of yellow text...
系统变量
zcolor   如果由颜色关键字名设定,为颜色号;如果由颜色号设定,为
         -1
zhcolor  硬件颜色号
colore
设定擦除色。
colore  COLOR
colore  SELECTOR;COLOR;COLOR;...
write《colore|ce,COLOR》
说明
设定用于擦除的颜色,包括:模式擦除绘图(plotting),全屏幕擦除,erase命令,和以mode rewrite的字符背景绘图。为了用擦除色填充屏幕或窗口,在colore之后,必须执行全屏擦除。
颜色关键字设定前16色(参看命令语法规范)。对于颜色,必须使用代码大于15的颜色号。
计算硬件颜色号的数字表达式可代替关键字使用。
在CGA图形显示器上,colore具有与color相同的颜色限制。参看color命令的详细描述。在CGA文本显示器上,colore不能使用亮度色(8-15)。
缺省擦除色是black。可使用跟在colore后的status save;default改变缺省。
举例
在[ENTER]按下之后,将屏幕擦成蓝色。
screen   vga
color    write+
at       5:5
write    Press Enter to see the background color change.
colore   blue
pause    pass=%enter
erase
at       5:5
write    The screen has been erased to change the background color.
系统变量
zcolor   如果由颜色关键字设定,为颜色号;如果由颜色号设定,为-1
zhcolor  硬件擦除颜色号
compare
比较两个文本串。
compare string1,string2,length,result
string1  基准字符串,通常是一变量或多至8个字节的在对齐的文字。
string2  比较字符串,必须是变量。
length  比较的字节数
result  -1=相等;0=不匹配;>0=最后匹配字符。
说明
逐字节比较两个字符串。变量边界可被交叉。返回到result中的值表示compare的成功。如果字符串部分匹配,result设定到最后匹配字符的位置。
除了result,如果字符串匹配,compare设定zreturn为-1。如果字符串不匹配,设定zreturn以指示哪个字符串“按字母顺序”小于另外的字符串:如果第一个字符串小于另外的字符串,则为0,如果第二个字符串小于另外的字符串,则为1。将比较不匹配的在先的字符的ASCII码,以确定哪个字符串“按数字顺序”小于另外的字符串。例如,如果比较“aaa”和“aab”,由于第一字符串的第三个“a”小于第二个字符串的第三个字符“b”,zreturn将设定为0。
任一个字符串都不能使用系统变量。
举例
让用户继续下去之前,检验“口令(password)”。
define    local
input     ,8               $$用户输入
password=’saturday’      $$今天的口令
return,2                   $$通过比较所返回的值
define    end
*
at        3:2
write     Enter the password of the day...
long      8
arrow     4:2
zero      input
storeainput
compare password,input,8,return
ok        return
         write    Good.Let’s continu
no
         write    Sorry,wrong password.Erase and try again.
endarrow
系统变量
zreturn
-1    第一个字符串等于第二个字符串
0     第一个字符串<第二个字符串
1     第二个字符串>第一个字符串
compute
计算字符串的数值
compute string,length,result
    string    包含要按数字求值的字符的文本变量
    length    求值的字符的数目
    result    保持有计算结果的数字变量
说明
将字符串转换成数字值。字符串可包含前导或结尾空白、前导+或-符号、和小数点。字符串不能包含任何其它运算符。如果转换成功,值存在result中。如果compute失败(zreturn=0),result保持不变。
举例
将字符串转换成数字值,对该值进行运算,然后将其转换回一个字符串:
define    local
string,  10      $$保持要转换的字符串
length,  2       $$字符串的长度
number,  4,r    $$用于result的实数
define    end
*
pack      string;length;23.65
compute string,length,number    $$转换成数字
calc    number number*4.83
packz   string;;<<show,number>>    $$转换成字符串
at      5∶5
write   The new string is:<<showa,string>>
系统变量
zreturn
-1    操作成功
0     在该字符串中没有发现有效数
1     设法存储在result变量中所转换数的溢出错误。result变量需要更大。
date
读或设定当前日期。
date date4[,set]
说明
从系统时钟读取日期,并且将其放在变量中。如果使用set关键字,系统日期被设定到存储在变量中的日期。
系统日期存储为4字节;年使用2个字节,月使用1个字节,天使用1个字节。
举例
显示当前日期。
define   local
today,4
.        year,2,integer
.        month,1,integer
.        day,1,integer
define   end
*
date     today
*
at       10∶10
write    Today is $$$
writec   month;;;January;February;March;April;May;June;
         July;August;September;October;November;December;
write    <<show,day>>,<<show,year>>
debug(调试程序)
执行或断开单步程序执行。
debug    on|off
debug    SELECTOR;on|off;on|off,...
说明
debug on停止当前单元的执行,进入调试程序(debugger)。从调试程序,执行过程可以继续,一次一个命令(单步方式)或直到到达一个特定的命令或单元(断点方式)。debug off返回到正常执行过程。
调试工具通过下列方式退出:
●执行debug off
●按[ESC]停止调试
●通过系统工具窗退出
●返回到编辑器(正常通过[SHIFT][F2])
●执行出错
debug仅在源模式执行期间,是正常作用的。通过选择执行二进制的选项,能够执行二进制方式的功能。学生执行器(student executor)不具有debug功能。
当通过按下[SHIFT][2]运行一个单元时,也能够进入调试程序,然后从System key options菜单中选择Debug。
device
控制TenCORE设备驱动器。
device    device,function[,variable[,length]]
          device     调用的设备号,范围在0到255
          function  调用的特定设备功能号,范围在0到255
          variable  由特定功能需要的数据变量
          length    如果不是定义的长度,是variable的长度
说明
device允许作者控制不直接由TenCORE语言支持的硬件设备,但是其通过TenCORE设备支持文件来实现。这些硬件设备包括特殊的鼠标、触摸屏、和超出置于TenCORE命令中的标准支持范围的交互视频特性。只有当函数需要数据变量时,才使用variable标识符。
设备支持文件
为了使用设备,需要TenCORE设备支持文件。在启动TenCORE执行器(excutor)前,设备支持文件被执行(装载),并且保持驻留在存储器中。device的使用取决于编址的设备支持文件。
系统变量
zreturn
在返回之前,设定到处理器寄存器AL。某些设备支持文件使用该特性,返回状态信息。
disable
禁止系统特性(与使能enable相反)。
disable关键字
     pointer  禁止指针显示和所有指针输入
     ptrup    禁止指针增加输入
     cursor   禁止在文本模式显示的闪烁光标
     arrow    禁止箭头提示的绘图
     absolute 禁止绝对屏幕绘图
     break    禁止从中断处理的break修改flow转移
     area     禁止area输入
     font     不用字体而是用字符集(charsets)绘出字符。
     mode     禁止嵌入文本的模式改变
可由单个禁止语句禁止多个特性。对于这些系统特性的初始状态参看Defults(缺省)部分。
说明
disable pointer
关闭指针显示和从所有从定点设备的输入。
disable ptrup
关闭定点设备的按钮增加(button-up)输入。
disable cursor
禁止文本模式屏幕的闪烁光标。
disable arrow
禁止arrow提示字符>和拖尾空间的绘图。用户输入准确出现在arrow命令给定的位置。
disable absolute
关闭enable absolute绘图模式,并且使后面的屏幕图形由scale、rotate、window、和origin命令修改。
disable break
禁止从中断程序执行的break修改flow转移。flow转移仍然出现在标准输入处理位置(参看描述的flow命令)。在必须整体完成的关键代码块(例如,文件操作或它们的zreturn检验)中经常禁止break。必须注意,在没有其它退出手段的程序循环中,避免禁止break。由于系统路由键[SHIFT][1]和[SHIFT][2]由disable break关闭,可能出现系统挂起。
disable area
禁止area输入。在area输入禁止时,可定义新的area,但是直到area输入使能,新area的输入才可发生。
disable font
从字符集(charsets)而不是字体来绘出字符。字符集是字符定义的过去形式。
disable mode
禁止嵌入文本的模式改变。
Defults(缺省)
用于enable和disable命令特性的系统缺省值通过下列initial命令设定:
ON     area,arrow,break,font,mode
OFF    absolute,cursor,pointer,ptrup
禁止特性的状态
在4字节的系统变量zenable的位图中找到由disable命令影响的系统特性的当前ON/OFF状态。
zenable位     属性
1             absolute
2             pointer
3             mode
4             cursor
5             ptrup
6             font
7             area
12            break
13            arrow
使用bit函数检查zenable。bit设定意指ON(启用),而未设定意指OFF(关闭)。
例如:
bit(zenable,2)=-1表示pointer ON
bit(zenable,2)=0表示pointer OFF
举例
在附带文件并且检验其成功时,关闭所有flow转移。
flow    do;%f10;glossary;break    $$一个flow break转移
...
disable break                         $$防止中断
attach  ‘afile’;nameset            $$试图打开文件
jump    zreturn;;erroru             $$检验成功
enable  break                         $$重新使能flow break
do
    执行作为一个子程序的单元。
do  UNIT[(argument/16s][;return/16s)]
do  SELECTOR;UNIT[(argument/16s][;return/16s])];...
说明
执行作为子程序的特定单元。一旦完成该子程序,执行过程用接着do的命令恢复。子程序可嵌套多达20层深。
包含do命令的单元某些时候叫做calling(主调)单元;子程序是called(被调)单元。
如果在子程序中出现去一个新主单元的jump(跳转)分支,执行过程不返回到接着do的命令,并且do栈被清除。
do能够传递多达16个自变量到一子程序,并且可从一子程序接收多达16个自变量。分号从接收的自变量列表中分开发送自变量列表,而逗号分开列表内的自变量。
被调单元必须接受用receive命令(除非nocheck receive命令激活)传递的自变量,否则将发生执行错误。被调单元必须使用return命令(除非nocheckreceive命令激活)返回任何需要的返回自变量,否则将发生执行错误。参看receive、return、no check。
所有自变量被传递,并且由值返回。但是,使用varloc()函数,变量的地址能够作为一个值被发送。
举例
例1
写课件时,最好把将在多处使用的显示和例程放在当需要时能够作为子程序被调用的一个地方。单元header可包含标题条的编码,该标题条将出现在课程的此段的所有页上。单元diagram1可绘制图像和对于该课程的此段公用的其它图形。对tools课程中的单元navigate的do调用,用来显示在该系列课程的所有课程中可用的学生导航选项的标准显示。
do    header      $$在当前课程中
do    diagram1    $$在当前课程中
at    20∶10
write This diagram shows the system we will be studying next at the start of
      its combustion cycle。
do    tools,navigate    $$在课程工具中
例2
do语句将值3传递到子程序month,以请求其返回按数字标识的月名和天数。do命令自变量列表被划分成由分号分开两个部分:第一部分用于发送自变量,第二部分用于接收自变量。
define    local
name,8
days,1
define    end
do        month(3;name,days)    $$得到第三月份的名称和天数
*
write     <<a,name>>has<<s,days>>days
*
unit      month
define       local
lnumber,1
lname,8
ldays,1
define   end
receive  lnumber    $$获得月份数自变量
packzc   lnumber;lname;;;;January;February;Harch;April...
calcs    lnumber;ldays
Figure C9880941501651
31;28;31;30...
return   lname,ldays    $$返回名称和天数
例3
表达式score<75用作true/false(真/假)选择器,以选择单元sad(悲伤)或smile(微笑),单元sad或smile用悲伤或微笑的面部图像图形显示一学生的状态。
do    score<75;sad;smile
dot
在屏幕上绘出单个象素。
dot  [LOCATION]
说明
用当前绘图模式和颜色,在屏幕上的特定位置绘出单个象素。如果没有指定位置,使用当前位置(zx,zy)。
由thick影响dot命令。用thick on,所有点被绘出两个象素厚度;用thickoff,点被绘出一个象素的厚度。
举例
例1
当暂停(pause)中断时,在鼠标指针(zinputx,zinputy)的位置显示一点。
enable    pointer
pause     pass=%pointer
dot       zinputx,zinputy
例2
使用dot画一正弦波。
define    local
x         ,8,r    $$用于x坐标的实变量
define    end
*
loop      x
Figure C9880941501661
0,2*π,0.1
.         dot    50*x,100+50*sin(x)
endloop
系统变量
zx    当前水平图形屏幕位置
zy    当前垂直图形屏幕位置
draw
在屏幕位置之间画线。
draw  [LOCATION];[LOCATION];[LOCATION];...
说明
以当前绘图模式和颜色在屏幕上画线。在由分号分开的每个位置之间画线。当到达双分号(;;)时,draw跳到下个位置。
单个draw命令可以连续用在多于一条线上。如果标识符用一分号开始,该条线在当前屏幕位置开始。
用thick on,所有点被绘出两个象素厚度;用thick off,点被绘出一个象素厚度。
举例
例1
用一个draw命令在屏幕上画一方框和三角形。标注双分号,以分开两个数字,并且在多条线上连续画图。
draw    10,10;80,10;80,100;10,100;10,10;10,130;100,130;10,190;10,130
例2
在屏幕上(或窗口)的随机位置画连接的线段。起始分号用来在先前绘图的结束点的当前屏幕位置开始每次绘图。
loop
.     color    randi(1,15)    $$选择随机颜色
.     draw     ;randi(0,zdispx),randi(0,zdispy)
.     delay    .01
endloop
ellipse(椭圆)
画椭圆。
ellipse Xradius,Yradius[,fill|anglel,angle2]
说明
用当前屏幕位置为中心画椭圆(或椭圆的一部分)。如果指定fill关键字,该椭圆用当前前景色填充。整个椭圆画出之后,当前屏幕位置不改变:能够用相同中心能够画出多个椭圆,而不用重新设置屏幕位置。
两个标识符形式画一个整椭圆。四个标识符形式只画由起始角和结束角规定的椭圆的弧。弧总是从第一角度到第二角度逆时针画出。例如,ellipse100,60,0,90画四分之一椭圆。命令ellipse 100,60,90,0画四分之三椭圆。在画出一段弧(四个标识符)之后,更新当前屏幕位置。
举例
画中心在屏幕上的椭圆和两个弧。
at          zxmax/2,zymax/2    $$设定椭圆的中心
ellipse    95,50              $$画整椭圆
ellipse    90,40,0,90       $$画椭圆的四分之一
at         zxmax/2,zymax/2    $$复位椭圆的中心
ellipse    70,30,90,0       $$椭圆的四分之三
else
用于if/else编程结构的选择情况。
else
说明
如果在先的if和elseif命令的条件为假,则执行缩排式else和endif之间的命令。在一if结构中,不需要else命令。对于更多if结构的信息,参看if命令说明。
举例
if      score  >90
.       write      Very Good!
elseif  score  >75
.       write      OK,but you could do better.
else
.write         You need more praetice.
Endif
elseif
用于if/else编程结构的有条件情况。
elseif CONDITION
说明
如果if命令和所有在先elseif命令的标识符计算为假,并且当前elseif命令的标识符计算为真,执行随后的缩排(indented)命令。然后控制转到endif后面的命令。对于更多if结构的信息,参看if命令说明
举例
if    score >90
      write    Very Good!
elseif score >75
.      write    OK,but you could do better.
else
.      write    You need more practice.
endif
enable
使能系统属性(与禁止相反)。
enable关键字
enable<<variable4>>
       pointer  启用指针显示和指针输入
       ptrup    使能指针增加(pointer-up)输入
       cursor   启用在文本模式显示的闪烁光标
       arrow    再使能箭头提示的绘图
       absolute 启用绝对屏幕绘图
       break    再使能break修改flow转移以中断处理
       area     再使能area输入
       font     再使能font绘图
       mode     再使能嵌入文本中的模式改变
可由单个使能语句使能多个特性。对于这些系统特性的初始状态参看Defults部分。
说明
enable pointer
启用指针显示和从指示设备的输入。
enable ptrup
使能按钮增加(button-up)输入。除非ptrup使能,指示设备及当按下按键时才产生输入。
enable cursor
启用用于文本模式屏幕的闪烁光标,该命令对图形屏幕没有不起作用。
enable arrow
再使能arrow提示字符>和尾部空间的绘图。
enable absolute
启用绝对屏幕绘图模式。并且后面的屏幕图形由scale、rotate、window、和origin命令修改。当windows变成由relative关闭和clip关闭修改的,scale、rotate和origin命令被有效关闭。
enable break
再使能break修改flow转移到中断程序执行。
enable area
再使能area输入。任何先前定义的当前area包括当area输入禁止时定义的那些area现在激活。
enable font
返回到使用字体而不用字符集作字符绘图。字符集是字符定义的废弃形式。
enable mode
再使能嵌入文本的模式改变。
enable<<variable4>>
enable命令的变量形式用来按照它们的在4字节变量中的位设定来使能/禁止所有属性。变量通常是用来以后将所有特性复位到先前状态的系统变量zenable的保存版本。特性位图在下面部分status of enable features(使能特性状态)中讨论。
Defults(缺省)
用于enable和disable命令特性的系统缺省通过下列initial命令设定:
ON     area,arrow,break,font,mode
OFF    absolute,cursor,pointer,ptrup
使能特性的状态
由enable命令影响的系统特性的当前ON/OFF状态在4字节的系统变量zenable的位图中找到。
zenable位      特性
1              absolute
2              pointer
3              mode
4              cursor
5              ptrup
6              font
7              area
12             break
13             arrow
使用bit函数检查zenable。bit设定意指ON(启用),而未设定意指OFF(关闭)。
例如:
bit(zenable,2)=-1表示pointer ON
bit(zenable,2)=0表示pointer OFF
举例
在指针位置显示指针的绝对屏幕坐标。坐标和显示相对于物理屏幕,而不受任何window、origin、rotate或scale命令的影响。
enable  pointer,absolute    $$启用指针和绝对屏幕坐标
loop
.       pause                $$移动鼠标然后按下按钮
.       at zinputx,zinputy  $$在指针位置
.       write  <s,zinputx>>-<s,zinputy>>    $$显示坐标
endloop
endif
结束if/else编程结构。
endif
说明
标记if结构的结束。每个if在同一缩排级中必须有一个匹配的endif。对于更多的if结构的信息,参看if命令说明。
举例
if    score>90
.        write    Very Good!
elseif   score>75
        write    OK,but you could do better.
else
        write    You need more practice.
endif
endloop
结束loop编程结构。
endloop
说明
标记loop结构的结束。每个loop在同一缩排级上必须有一匹配的endloop。对于更多关于loop结构的信息,参看loop命令的描述。
举例
在屏幕上写50个X。
loop    index
Figure C9880941501721
1,50
.       write X
endloop
erase
擦除屏幕上块、框或字符。
erase[LOCATION][;[LOCATION][;Xframe[,Yframe]]]
说明
擦除屏幕上的盒或框为背景色。参看用于LOCATION说明的命令语法规范。box命令除了使用前景色画图之外,与erase相同。
框宽度自变量的出现表示擦除一框而不是实心框。右边和左边的宽度由第一框自变量用象素表示,而第二框自变量表示顶和底的宽度。如果没有第二框自变量,在屏幕上的外观显示上,顶和底边框宽度设定到与边的宽度最好匹配。
举例
例1
整个屏幕(或窗口)被擦除为蓝色。
color    blue
erase
例2
矩形200个象素宽乘100个象素被擦除为背景色。图形坐标用来规定一位置的每个x、y坐标。
erase    101,101;300,200
例3
在write语句中的文本在pause之后接着被擦除。text measure命令用来确定接着的文本段落在屏幕上画完的屏幕区域。该信息用左下角系统变量zplotxl,zplotyl和右上角系统变量zplotxh,zplotyh返回。
text   measure    $$初始化文本测量
*
at     100,500
write  This is a paragraph of text of arbitrary
     length that will be erased...
*
pause
erase  zplotxl,zplotyl;zplotxh,zplotyh
例4
擦除10个字符。
at    10∶1
erase 10
error
指定一执行错误单元。
error  [UNIT]
error  SELECTOR;UNIT;UNIT
说明
设定执行错误课程和单元。无论何时出现执行错误,系统跳到用error指定的单元。如果没有指定单元,显示TenCORE系统错误消息。
空白标识符形式清除错误课程和单元。在遇到另一error命令之前,该error单元的设定保持有效。
当系统启动时,“error unit”通常由路由课程设定。
当执行error时,操作的当前模式、(二进制或源)与错误课程和单元名称一起保存。如果错误引起去错误单元的转移,操作的保存模式用来确定是否从二进制文件或源文件取错误单元。
系统变量
zerrorl    错误课程的名称
zerroru    错误单元的名称
exchange
交换存储器的两个区域的内容。
exchange  keyword,offset;keyword,offset;length
          keyword routvars|r  路由变量
          display|d CGA屏幕显示存储器
          global|g  全局变量
          local|l   本地变量
          sysvars|s 系统数据区
          sysvars|s 系统程序区
          absolute|a绝对存储位置
          offset    离存储基地址的偏移量
          length    交换的字节数
说明
存储器的两个区之间交换字节。能够变换最大65,535(64K-1)字节。0偏移量指示存储区的开始。
对于相对寻址,TenCORE将计算机存储器划分成多个区,每个区具有自己的关键字。通过提供一关键字,然后一偏移量,来指定一位置,0偏移量表示该区的第一字节。
关于每个关键字的附加消息:
routvars这是只能够通过exchang和transfr访问的存储器的256字节区域。当用户在动作时,该区由学生路由器(Student Router)使用用于存储数据。如果使用该路由器,小心不要修改该区的前128个字节。
display CGA屏幕显示存储器。其它显示类型(EGA、VGA等)的显示存储器不能用exchang访问。
sysvars  不使用该区域用于数据存储。
sysprog  不使用该区域用于数据存储。
absolute 参照绝对存储位置的程序不能工作在多任务环境中。
因为exchang能够访问计算机中存储器的任何区域,应该小心使用。
当在变量中指定一偏移量时,varloc()函数可用来指定特定变量的偏移量。
同样,能够使用absloc()函数指定绝对存储位置。然而,注意,absloc()在多任务操作系统诸如Windows或OS/2中不能正确地工作。
当使用varloc()时,本地定义的名称优先于全局定义名称。当exchang使用varloc()时这可产生不期望的结果。
举例
例1
表达式varloc(scorvar)指定包含用户分数的全局变量的开始。
exchang  global,varloc(scorvar);routvars,128;128
*        Uses 2nd half of routvars
例2
确定X0中的2字节值小于或等于X1中的2字节值。
if      xo>x1
.      exchang global,varloc(X0);global,varloc(X1);2
endif
exec
        执行DOS程序或命令。
exec    关键字...
        command 通过DOS命令处理器执行程序或命令,或提供对DOS
                提示符的访问。
        file    直接执行一程序
说明
exec command[,all|memorySize]
提供对DOS命令行提示的访问。为返回到TenCORE,在DOS提示符下键入exit。
当前没由TenCORE使用的DOS存储区可由在DOS提示符下输入的程序或命令使用。如果指定all选项,通过临时去除大部分TenCORE,尽可能多的DOS存储区可被使用。如果指定存储区容量,系统设法空出指定数千字节的存储区。注意DOS命令处理器使用该存储区的一部分。
exec  command[,all|memorySize];buffer[,length]
DOS命令处理器被装入,并且传送缓冲区以执行,好似其内容已经在DOS提示符下键入。DOS提示符的特性诸如路径搜索和批处理文件的执行是可用的。如果长度不指定,使用缓冲区的定义长度;在缓冲区末端的未使用字节应该填充零。
当前没有由TenCORE使用的DOS存储区可由被传送的程序或命令使用。如果指定all选项,通过临时去除大部分TenCORE,尽可能多的DOS存储区可被使用。如果指定存储区容量,系统设法空出指定数目的千字节的存储区。注意DOS命令处理器使用该存储区的一部分。
exec file [,all|memorySize];buffer[,length]
(只)执行.EXE和.COM文件。全文件名(包括.EYE或COM扩展),及驱动器和路径必须被指定。DOS提示符的特性诸如路径搜索和批处理文件的执行是不可用的。用第一个空格或斜杠(/)开始的任何字符作为自变量被传递到执行文件。如果长度不指定,使用缓冲区的定义长度;在缓冲区末端的未使用字节应该填充零。
当前没有由TenCORE使用的DOS存储区可由执行文件使用。如果指定all选项,通过临时去除大部分TenCORE,尽可能多的DOS存储区可被使用。如果指定存储区容量,系统设法空出指定数目的千字节的存储区。
当DOS命令处理器没被装入时,exec的file形式比command形式更有效。该形式也使得对被执行程序的错误报告进行访问(command形式为DOS命令处理器提供错误报告)。
举例
所有下列例子使用下列定义。
define  local
buf,100
define  end
例1
使用exec的command形式,使得在箭头处键入的DOS目录或程序名被执行。尽可能多的存储区可用。
write     Enter DOS commard to execute:
long      100
arrow
storea    buf    $$将输入存入变量中
ok
endarrow
exec      command,all;buf
writec    zreturn;;Error:zreturn=<<showt,zreturn>>
例2
使用exec的command形式,将当前目录中的所有TenCORE数据集辅助复制到驱动器a:尽可能多的存储区可使用。
packz    buf;;xcopy*.dat a:
exec     command,all;buf
writec   zreturn;;Error:zreturn=<<showt,zreturn>>
例3
使用exec的file形式,调用在目录D:\PROGS中的Autodesk Animator动画程序QUICKFLI.EXE,以播放在目录C:\ANIMS中的动画BACKHOE.FLI。需要250千字节的存储区。
screen    mcga,medium
packz     buf;;d:\progs\quickfli.exe c:\anims\backhoe.fli
exec      file,250;buf
writec    zreturn;;Error:zreturn=<<showt,zreturn>>
系统变量
exec命令设定下列系统变量
command形式:
zreturn  报告操作的成功
-1       成功执行DOS命令处理器
0        装入DOS命令处理器存储区不足,或不能够提供请求的存储量。
1       DOS命令处理器(COMMAND.COM)没发现。
file形式:
  zreturn  报告操作的成功
-1  成功执行程序
0   装入DOS命令处理器的存储区不足,或不能够提供请求的存储量。
1   程序未找到。
zerrlevl  正如由被执行program返回的DOS ERRORLEVEL值。
两种形式都还设定提供扩展DOS错误信息的系统变量zedoserr和zerrcode。
exitsys
退回到DOS或原来调用TenCORE的程序。
exitsys[error[,noerase]]
error传递到DOS变量ERRORLEVEL的1字节整数值
noerase屏幕方式不改变并且屏幕擦除
说明
将控制返回到原来调用TenCORE执行器的程序。通常,用户返回到DOS提示符。如果TenCORE通过DOS批处理文件启动,执行在该批处理文件中的下一个命令。如果指定error,值被传递到DOS变量ERRORLEVEL,在此可使用DOS命令测试。如果出现noerase关键字,屏幕方式不改变,并且屏幕不擦除。该关键字仅当使用返回值error时被指定。
ERRORLEVEL值
TenCORE使用ERRORLEVEL值表示各种错误情况。用exitsys,建议作者不使用值0到31。
0     通过exitsys(无标识符)正常退出
1     复制保护破坏
2     在TenCORE命令行选项中的错误
3     执行TenCORE的存储区不足
4     显示驱动器未找到
5     在显示驱动器中的错误(例如,无效修改号)
6     在TenCORE环境串的语法中的错误
7-15  保留后用
16    初始单元未找到
17    在被执行的第一单元中未找到启动
18    初始单元版本与执行器不兼容
19    所有驱动器被TCDISKS或TCSEARCH排除
20-30 保留后用
31    从一般执行错误显示中按下[SHIFT][7]
extin
从外部I/O端口读数据。
extin  port,buffer,length
       port    要读的I/O端口的地址
       buffer  从端口接收数据的缓冲区
       length  接收的字节数
说明
从指定的外部I/O端口读取指定的字节数。该命令能够用来通过串行或并行端口控制外部设备。对于寻址和控制串行和并行端口的细节参考IBM技术参考手册。extout与extin相对应。
举例
例1
从COM1中读取一个字节数据。
define    local
rstatus   ,1    $$要读入的变量
define    end
*
extin     1016,rstatus,1
*         从地址1016(h3F8)读1个字节给rstatus
例2
使用extin和extout将一个字节发送到使用xon/xoff协议的COM1端口。该例程可形成控制指针的例程的基础。
define    local
status    ,1    $$coml:的状态旗标
dr        ,1    $$数据准备,状态位的位0
*                如果该位被置位,具有准备好读取的数据
rstatus   ,1    $$从coml:读字符
tx        ,1    $$发送者状态。如果该位为0,该端口准备接受其它
要*              发送的字符
xonoff    ,1    $$xon/xoff旗标。如果为1,xoff.否则,xon.
char      ,1    $$要发送到端口的字符
*
lsr       =1021 $$行状态寄存器地址
rxvar     =1016 $$接收变量寄存器地址
txvar     =1016 $$发送者变量寄存器地址
define    end
*
loop
.         loop
.         .    extin    1sr,status,1
*         .    现在检查状态的第一位,
*         .    看是否xon/xoff被发送
.         .    calc     dr
Figure C9880941501801
status $mask$ 1
.         outloop dr=0 $$没有xon/xoff,继续
*         如果有xon/xoff,读取并且设定旗标
.         .     extin     rxvar,rstatus,1
.         .     calcs     rstatus=17;xonoff 0,1
.         endloop
reloop    xonoff=1    $$xoff,再循环
*         现在检查状态的位5看是否备好
*         发送其它字符
.         calc            tx
Figure C9880941501803
status $mask$ 32
outloop   tx=32          $$如果备好,发送它,否则再循环
endloop
extout    txvar,char,1    $$发送字符
extout
  写数据到外部I/O端口。
extout    port,buffer,length
          port    要写入的I/O端口的地址
          buffer  包含要发送到该端口的数据
          leneth  要发送的字节数
说明
写特定数目的字节到特定的外部I/O端口。该命令能够用来通过串行或并行端口来控制外部设备。对于寻址和控制串行和并行端口的细节参考IBM技术参考手册。extin相应于extout。
举例
例1
将rstatus的内容写入COM1。
define   local
rstatus  ,1
define   end
*
extout   1016,rstatus,1    $$将rstatus写到COM1(h3F8)
例2
参看extin命令说明,例2作为附加例子。
fill
填充屏幕上任何有边界的区域。
fill[color[,boundary]]
      color    填充用的颜色
      boundary 定义要填充的区域的边界颜色
说明
在当前光标位置用指定颜色填充一封闭的区域。如果没有color被指定,用当前前景色填充该区域。如果没有boundary颜色被指定,填充停止在任何不同于开始点的原始颜色的颜色处。
如果要填充的区域不是封闭的,整个屏幕被填充。
fill命令通常跟随着at,at设定填充开始的点。
填充不使用当前绘图模式:指定的颜色总是出现,与模式无关。
举例
生成具有亮白三角形轮廓的内切红色圆。第一延迟之后,三角形的顶部分用青色填充。第二延迟之后,顶部变成洋红。最后延迟之后,整个三角形变成内部为蓝色轮廓为白色。
screen  vga
color   red
at      320,216
circle  65,fill
color   white+
draw    320,335;200,150;440,150;320,335
delay   1
color   cyan
at      320,334
fill
delav   1
fill    magneta
delay   1
fill    blue,white+
find
找出列表内的数据目标的位置。
find  object,length,buffer,entries,incr,return
      object      要搜索的数据
      length      目标的字节长度
      buffer      开始搜索的变量
      entries     列表中项目数
incr    每个项目在缓冲区中的字节长度
return  第一匹配的项目数
说明
搜索希望目标字符串的字符列表或数字项目。find将从buffer的开始搜索每个incr字节的目标,不考虑变量的定义大小或边界。考虑buffer为列表的第一字节,该列表的特性全部由entries和incr确定。
如果incr是负数,搜索从列表的末端到开始后向进行。
return表示object被找到的在列表中的位置,第一个项目为1。如果目标没找到,返回-1。在return中的值总是相对于列表的开始,即使搜索是后向的。
举例
下面的例子均假定下列定义。
define   local
name    ,15    $$搜索的名称
found   ,2     $$“name”被找到的列表中的位置
list(5) ,15    $$名称列表
define end
在每个例子中,list包含5个名称,每个名称占据15个字符。内容如下:
John miller....mark ho........sarah johnston.james heflin...lisa berger....
↑            ↑               ↑             ↑              ↑
1             16               31              46              61
空字符作为圆点示出,以改进可视性,并且已经添加了数字,有助于对字节计数。
例1....Literal Object(文字对象)
搜索名称‘mark ho’
find  ‘mark ho’,7,list(1),5,15,found    $$found将为2
因为名称有8个或更少的字符,它能够作为文本文字‘mark ho’被提供。接着出现长度,7个字符。列表的开始作为list(1)给出,并且其长度为5个项目,每个项目为15个字节。
search之后,found包含值2,因为在列表中的第二位置(不是第二字节)发现‘mark ho’。
例2...Variable Object(变量对象)
多于8个字节的目标不作为文本文字给出,而是必须以变量出现。
定位‘james heflin’:
packz   name;;james heflin
find    name,15,list(1),5,15,found
变量found接收到值4,因为在第四位置找到‘james heflin’。
例3...逐字节(Byte-by-Byte)
找最后的名称
packz    name;;miller
find     name,6,list(1),75,1,found
当执行该例时,found接收到值6。
注意名称的长度给定为6,因为这找到了项目的一部分,不是整个项目。
同样,该列表规定为75个一字节项目而不是5个15字节项目。这使得find在每个字节开始查看‘miller’,而不只是在每个15字节项目的开始查看。这表示搜索的目标能够可比为其提供的标称项目长度长。
例4...Backwards Seach(后向搜索)
为了后向搜索,每个项目长度给定为负值。这从列表的末端后向搜索‘john’,仅查看在每个15字节项目的开始。
find‘john’,4,list(1),5,-15,found
这里,found接收值1。尽管从列表的末端后向搜索,位置总是从列表的开始数起。
例5...Backwards Byte-by-Byte(后向逐字节)
另一个后向搜索的例子如下:
find  ‘john’,4,list(1),75,-1,found
在此情况下,使用-1项目长度,使得find查看从列表的末端开始的每个字符。
found接收到值37,因为当后向逐字节搜索时发现的第一个‘john’出现在‘sarah johnston’中。如果搜索已经是在前向,‘john miller’将首先发现,并且found将接收值1。
flow
通过事件驱动单元转移来管理课程流程(flow)。
flow  关键字...
      jump    定义具有屏幕擦除的事件驱动转移
      jumpop  如同jump但是没有屏幕擦除
      do      定义事件驱动子程序调用
      library如同do但强制二进制子程序调用
      clear   清除激活的流程事件设定
      save    保存激活的流程事件组
      restore 恢复保存的流程事件组到激活的状态
      delete  删除保存的流程事件组
      reset   删除所有保存的流程事件组
      dir     返回激活流程事件的列表
      info    提供关于激活流程事件的流程转移数据
说明
管理事件驱动转移。事件可以是按键、指针输入、定时等。特定的事件能够触发到一个新主单元或子程序调用的jump(跳转)。
在给定时间内能够激活最大50个不同事件。一组流程事件和相关转移能够被定义为贯穿一课程的所有新主单元的缺省环境。高级选项能够规定课程的流程设定,以便提供到路由器或库例程的清楚连接。
在一课程内的等待状态通常发生流程事件:
●在允许流程键输入的pause处
●在处理用户按键的arrow处
●在单元的执行完成(“单元结束(end-of-unit”))处
一个序列的代码将不能由流程事件在任何其它地方中断,除非用break修改流程定义以允许程序中断。
flow  jump|jumpop|do|liabrary;KEY/s;UNIT[modifier;modifier;...]
定义按键(或其它输入事件)和一个转移之间的连接为一个单元。第一自变量是指定分支类型的关键字。KEY在语法规范部分全面描述。允许由逗号分开的多键,并且当这些键被按下引起到UNIT的一个转移。总共50个不同事件当由多flow命令创建时激活。一个给定的事件一次与一个转移相关连。如果同一事件定义在两个不同流程命令中,最晚的定义优先。Modifier(修改符)改变命令的标准操作。不支持自变量传递。
jump
结束当前单元,并且转移到新的主单元。执行下列初始化:
●屏幕擦除到缺省的背景色
●所有flow事件和area定义被清除,并且复位到它们的主单元缺省
●所有显示参数复位到它们的主单元缺省值(正如由status save;default设定的)
●单元变成用于处理的新单元和flow事件
jumpop
结束当前单元并且不擦除屏幕(“op”表示“on page”)转移到新主单元。只执行下列初始化:
●所有flow事件被清除,并且复位到它们的新主单元缺省值
●单元变成用于处理的新单元和flow事件
do
调用作为子程序的一个单元。不执行初始化。从子程序单元的返回在flowdo事件发生的地方继续执行。允许20层嵌套子程序调用。flow do根据调用课程的模式,以源或二进制模式执行。
library
调用作为二进制子程序的单元。不执行初始化。从子程序单元的返回在flow do事件发生的地方继续执行。允许20层嵌套子程序调用。flow liabrary经常用来调用代码仅以二进制形式存在的第三方软件。
例1
当按下[ENTER]时,转移和传递控制到当前课程中的quizl。屏幕擦除,并且所有显示设定、流程转移和指针区复位到它们的主单元缺省值。当按下[F8]时,moreinfo作为子程序被调用,并且控制由主调单元保持。单元moreinfo将包含代码,以将新信息添加到那些已经在屏幕上的信息。
write    Press Enter to Begin the Quiz.
         Press F8 for more information.
flow     jump;%enter;quizl
flow     do;%f8;moreinfo
例2
当按下[FI]或[ESC]时,转移和传递控制到课程aerol中的单元index。当按下[PG↑]时,执行二进制子程序scroll。当从scroll返回时,控制保持在主调单元。
flow    jump;%f1,%esc;aero,index
flow    library;%pgup;seroll
例3
当任何一个键a、b、c或包含在变量xkey中的值被输入时,转移到由变量unitVar指定的单元。
flow    jump;a,b,c,<<xkey>>;<<unitvar>>
例4
当按下[F1]或在相关区域发生Click时,带有屏幕擦除转移到help。按下[F2]或在相关区域发生Click,转移到more,没有屏幕擦除。在任何一种情况下,控制传递到新单元。
area    define;100,0;150,20;click=%f1
area    define;200,0;250,20;click=%f2
flow    jump;%f1;help
flow    jumpop;%f2;more
通用单元名称
对于到新主单元的普通jump目的地提供通用转移名称。
=next   本课程中当前主单元的下一个物理单元。如果没有,该转移被忽略。
=back   本课程中当前主单元的先前物理单元。如果没有,该转移被忽略。
=first  当前课程中的第一可执行单元。
=last   当前课程中的最后可执行单元。
=main   如保持在系统变量zmain1、zmainu中的当前主课程和单元。
=base   最后base修改flow转移发生的或如由base命令设定的主课程和单元。如果没有,该转移被忽略。当前base课程和单元的名称保持在系统变量zbasel、zbaseu中。通常用来从补充课程序列诸如help返回到学习的主行。参看在$$$页的base修正符。
=editor 如果由作者系统执行则为源编辑器(具有作为被编辑的源块的当前执行单元);由学生执行器执行则忽略。
=exit  如由exitles命令设定并且包含在系统变量zexitl、zexitu中的课程退出。如果没有,学生用户通常转移返回到它们的路由系统诸如TenCORE活动管理器或DOS。测试课程的作者返回到文件目录。
=system  打开具有计算器、图像捕获、光标等的系统选项窗口;在创作期间,[F2]通常用该转移装入作为TenCORE系统缺省值;若由学生执行器则忽略。
例1
当按下[ESC]或[F6]时,转移到当前主单元的下一个单元或前一个单元。在该课程的第一或最后单元中,该转移被忽略。这是编写用于线性翻页课程的基本流程程序的容易的方法。
flow    jump;%enter;=next
flow    jump;%f6;=back
例2
当按下[ESC]时,转移到由路由器中的exitles命令指定的退出单元,或者,如果没有,列DOS。
flow    jump;%escape;=exit
未预期输入
通过使用随机键%other,对于所有在一种自然等待状态的未预期输入,定义流程事件。只有当输入不能应用到任何其它可能的flow转移或输入情况时,该“other”事件发生。
例1
使得任何不如此就由系统抛弃的键输入转移到单元record,即记录这些未预期输入用于后面学习。
flow    do;%other;record;default;break
例2
在pause,键a、b和c继续单元的执行。在激活的flow事件中指定的任何输入诸如[ENTER]和[F6]按照定义工作。任何其它输入转移到单元continue。
flow    jump;%enter;=next
flow    jump;%f6;=back
...
flow    jump;%other;continue
...
pause   flow=all;pass=a,b,c
例3
在arrow,标准ASCII输入,诸如a、b和c使得打字按照希望的出现在屏幕上。另外的与arrow相关的功能诸如擦除、复制、用Enter键判断等也按照希望的执行。任何定义的flow事件诸如到单元aha的转移是激活的;未预期的键诸如未定义[F12]转移到单元help。
flow    do;%other;help
flow    jump;%f3;aha
...
arrow    10:20
modifiers(修正符)
在flow语句中的修改符改变命令的缺省动作。可使用由分号分开的多修改符,并且以任何顺序,尽管某些是相互之间排斥的。
default为所有后面新主单元建立作为缺省设定的flow转移。Default修改流程设定由具有default或router修改符的initial语句或flow clear语句清除。用于整个课程的default设定经常放置在课程的+initial控制块中,以便它们用该课程的任何入口设定。
complete延迟flow命令生效,直到单元中的所有处理包括任何pause或arrow语句完成。flow仅在单元末端起作用。例如,用户在转移到下个单元之前,可被请求完成单元中的所有arrow。complete和break修改符不能够组合。
router  永久建立经过所有后面单元的流程设定。不由initial语句清除。router修改符允许管理软件(诸如TenCORE动作管理器)永久设定应用中用于路由用途的键。router流程设定仅通过使用带有router修改符的flow clear被清除。
例如,使用[SHIFT][1]的router修改退出转移在学生执行器的启动时,由TenCORE系统设定,以使用户返回到DOS。如果使用活动管理器,在开始一个应用之前,它复位该flow转移,以使用户退回到活动管理器中的返回单元。
应该特别注意在应用课程中的清除router流程设定,因为用户可能在应用中变得迷惑。router和break修改符最好一起使用,除非你能确定你的课程在所有情况下都能够接受路由退出键。
break  允许在任何点出现flow转移,中断任何程序或在程序中pause。break修改flow转移总是起作用,除非临时由disable break关闭。break的主要用途是中断不检验键的程序循环。break修改符经常由router修改符通过一路由器使用,以保证退出转移在应用课程中总起作用。break不能与complete组合。
当break修改flow do或flow library事件中断正在处理的命令(如在程序循环中)时,完成当前的程序语句,执行子程序,然后继续处理下个语句。当在定时的pause或delay命令处发生break时,定时被中断,直到从该子程序返回。在子程序调用期间,flow事件临时禁止,以避免当从该子程序退出时的循环和再使能。此外,在子程序调用期间下列系统变量保存和恢复:zinput、ziputf、zinputx、zinputy、zinputa、zreturn。必须特别注意避免当或flow的do或library形式使用break时的不可靠结果。由于break中断可在任何地方发生,变量(尤其是系统变量)从调用返回时可在使变量无效的中断do或library调用层中被偶然改变。在关键代码(critical coding)期间通过使用disable break语句应该关闭break属性。参看例4
clearkeys  在转移时,从输入缓冲区中删除所有未处理的输入。clearkeys删除已经“stacked-up(堆积)”等待某些事件结束、诸如长的全页显示的键。
base  在flow转移上的base修改符使得从中出现转移的主课程或单元变成基课程和单元,并且存储在系统变量zbasel和zbaseu中。当base修改flow转移启动补充课程序列,诸如help,=base通用UNIT位置可用来使用户返回到起始基位置。
windowclose如果有,在执行flow转移之前关闭当前窗口。
windowreset如果有,在执行flow转移之前关闭所有打开的窗口。
operate       在转移之前,当遇到flow语句时,恢复执行模式有效。(参看operate命令)
binary        在转移之前,改变到二进制执行模式。
source    在转移之前,改变到源执行模式。
tpr       在转移之前,改变到tpr(生产者)执行模式。
例1
当按下[ENTER]键时,引起到该课程中的下个线性单元的立即转移。所有的相继的主单元将对该流程设定缺省值。如果该语句应用到整课程,它应该放置在+initial控制块中。
flow  jump;%enter;=next;default;break
例2
设定[ESC]成为路由器退出键。永久保持在整个initial命令中,并且将break任何程序情况(除非break禁止),关闭所有窗口,并且跳到route,return。
flow      jump;%escape;route,return;router;break;windowreset
例3
如果在单元结束按下[ENTER],分支到单元ques6。任何pause或arrow必须首先完成。任何其它输入“stacked-up(堆积的)”被去除。
flow    jump;%enter;ques6;complete;clearkeys
例4
安装库单元(在课程routines中的clock),以显示每当用户按下[F10]或%timeup输入发生的时间。在库例程本身,在退出之前执行time1语句,使得当用户保持在主单元中时,%timeup键将保持发生,并且每秒“refresh(刷新)”时钟。可能由未希望的中断影响的该课程中的关键代码应该通过在整个代码中禁止break属性来保护,然后在该代码之后,再次使能。
flow    library;%f10,%timeup;routines,clock;break;default
...
disable break    $$保护关键代码
attach  ‘file’;nameset $$perhaps unit clock also does attachdo zreturn;;erroru
setname  ‘block’$$和setname
...
enable break    $$再使能break
flow   clear[;[KEYS/s][;default|router]]
从激活列表中,并且可选从新主单元default和router列表中删除流程设定。default修改符用来去除用default修改符设定的任何flow定义。router修改符用来去除router和default修改流程设定。
例1
删除所有激活流程设定,那些用router修改的流程设定除外。当jump到新主单元时,任何用default修改符进行的设定将重新激活。
flow  clear
例2
删除[ENTER]和[F6]的任何激活的流程设定,除非这些流程设定用router修改符定义。如果用default修改符定义这些键的任何一个键,当jump到新主单元时,该键将被重新激活。
flow  clear;%enter,%f6
例3
从激活和default流程设定中删除[ENTER],除非它有router属性。
flow  clear;%enter;default
例4
从激活的和缺省设定两者中删除所有流程设定,那些用router修改的除外。initial语句也执行该语句。
flow  clear;;default
例5
完全删除作为流程设定的[ENTER],不管[ENTER]如何被设定。
flow  clear;%enter;router
例6
删除所有流程设定,不管它们如何被定义。使用时特别注意,对于所有系统flow设定诸如[SHIFT][F1]也被除去,防止任何退出,除非被提供用于退出。
flow    clear;;router
flow  save;‘NAME’|local
flow  save;default
在存储器组块或default缓冲区中保存激活的流程定义组。名称可以是文本文字也可包含在变量中。指定的块在后来被存储在任何单元中。
local关键字在指定给当前单元的存储器组块中保存流程设定。本地块可只在保存它的单元中恢复;当单元的执行结束时,它被自动删除。
保存激活的flow设定到default缓冲区使得它们用于所有新主单元的缺省flow设定。一旦jump或jumpop到另一单元,它们被自动复位。
通过下列命令使用存储区组:memory,image,window,status,atea,flow,font和perm。存储区块在创建时,被标识为属于特定的命令类型,并且不能由其它命令使用存储区组访问;不同命令能够使用相同名的存储区块,而不冲突。
例1
在存储区组中在名称flows下保存激活的流程设定。
flow  save;‘flows’
例2
在该单元独有的块中在子程序调用期间保存和恢复激活的流程设定。当退出该单元时,该块被自动删除。
flow  save;loeal
do    routines,graph
flow  restore;local
例3
对于通过jump或jumpop转移进入的所有后面单元进行激活流程设定缺省值。
flow  save;default
flow  restore;‘NAME’|local[;delete]
flow  restore;default
用先前保存的设定替换激活流程设定。可选的是,通过使用delete修改符,从存储区组中删除指定的或local块。
例1
在库调用期间保存和恢复激活流程设定。库例程能够按照所需改变激活流程设定,当返回时不影响主调的程序。或者,flow save和restore可被置于library例程中,以提供更容易使用的工具。
flow    save;‘flows’
library routines,graph
flow    restore;‘flows’
例2
重新激活其名称包含在变量setUp中的流程设定。然后删除存储区块。
flow  restore;setup;delete
flow delete;‘NAME’|local
从存储区组中删除保存的流程设定组。
举例
从存储区组中删除保存的flow事件的quiz组。
flow  delete;‘quiz’
flow  reset
从存储区组中删除所有指定的流程设定组。流程设定的default设定不被影响。
flow  dir;keyBuffer[,length]
列出用于所有激活的flow事件的键。键输入作为2字节值的序列(如果可能零结束)返回到keyBuffer中。这些值可用作flow info的输入,以获得关于flow事件的全部信息。系统变量zflowcnt保持激活事件的数目。
举例
获得用于所有激活流程设定的输入键值。输入作为2字节值返回到称为value的50个单元(最大)数组中。
define    local
value(50),2
define    end
...
flow      dir;value(1),zflowcnt*2    $$读激活的流程键
flow info;KEY;infoBufter[,length]
在给定的缓冲区中返回用于特定键输入值的流程设定参数。返回的信息的最大长度是22个字节。选项length自变量可限制返回的字节数。在课程TCSAMPLE单元i/flow中发现使用flow info的扩展码例子。
  参数  字节  值
 branch type   1  0=没有流程事件1=jump2=jumpop
3=do/liabrary
  Lesson   8 转移课程名
  Unit   8 转移单元名
  Range   1 0=只是当前主单元1=用于新主单元的default事件2=router(永久事件)
  Active   1 0=在正常等待状态1=complete(在单元结束)2=break(中断处理)
  execution mode   1 -2=在转移上没有改变-1=到二进制0=到源1=到tpr
  window   1 0=在转移上没有改变1=窗口关闭2=窗口复位
  Base   1 -1=set=base在转移上0=没有改变
系统缺省流程设定
在运行你的课程时,[SHIFT][F1],[F2]和[SHIFT][F2]通过作者系统预定义为:
flow  jump;%F1;=exit;break;router
flow  jump;%F2;=editor;break;router
flow  jump;%f2;=system;break;router
只有[SHIFT][F1]由学生系统定义为:
flow  jump;%F1;=exit;break;router
这些流程设定可以重新定义,或使用具有router修改符的flow clear删除。然而,要确保提供可选的办法,退出你的课程;否则用户可能因没有退出甚至到DOS中变得迷惑。
为了临时存储,在整个library调用期间或library调用内清除和恢复激活的和缺省的流程设定,执行下列程序:
flow  save;‘current’    $$保存激活的流程设定
flow  restore;default     $$恢复缺省值到激活的
flow  save;‘defsave’    $$保存缺省流程设定
flow  clear;;default     $$除了router设定删除所有的
...
library routines,stuff    $$除了router所有设定可被改变
...
flow  restore;‘defsave’ $$读回保存的缺省设定
flow  save;default        $$将它们设回作为缺省值
flow  restore;‘currents’$$恢复保存的激活设定
系统变量
zreturn
使用存储区组的flow命令的save、restore、reset和delete形式在zreturn中报告成功或失败。所有其它形式设定zreturn到ok(-1)。主zreturn值是:
-1    操作成功
10    名称未发现
18    不能满足存储区组请求
杂项(Miscellneous)
zflowcnt  激活的流程设定的数目
zmaxflow  流程设定的最大数目
font
选择文本显示的字体。
font  [‘LESSON’,]‘FONT’[;fontNumber|standard[;noload]]
font  [‘LESSON’,]‘FONTGROUP’[;fontNumber|standard[;noload]]
font  ;fontNumber
font  standard[;standard]
font  info;infoBuffer[,length]
说明
字体是在一课程中的命名的块。它包含对应于某些或所有ASCII字符码0到255的字符设计。一字体组(font group)也是在一课程中命名的块。它包含一系列的具有不同文本属性的相关字体。
size、bold、italic和narrow的text命令属性与字体和字体组交互。对于一个字体,属性的外观被合成(除了narrow)。当激活字体组时,系统自动选择在任何给定时间使能的最适合于文本属性的组成字体。
一个字体或字体组总被指定为standard。标准字体是字符屏幕坐标的基础。即使某些其它字体当前选择为文本显示。例如,at5:10表示屏幕位置顶部下面5个标准字符高度和从左边9个字符的宽度。当执行initial或screen命令时,适合于当前屏幕分辨率的字体组被自动指定为标准(standard)。然而,该标准可被不同的字体或字体组取代,于是改变字符栅格。
字体或字体组能够选择与一参考号相关连。该号后来能够单独用来重选字体。
status命令保存和恢复所有的font和text参数:选择的字体或字体组,standard字体,字体号表,和文本属性。需要status save;default语句来存储经过jump转移到一单元的这些参数。
字体和字体组保持在存储区组中。没有必要特意从存储区中删除字体;当其它存储区组目标需要空间时,它们被自动删除,并且如果再需要从盘中再装入。
font[‘LESSON’,]‘FONT’
从当前课程或可选从命名的课程中选择特定的字体。该字体从盘中输入到存储区组中,并且保持激活直到由另一font命令替换,或jump转移到复位为缺省字体的单元。
例1
initial命令使所有绘图参数设定到包括当前屏幕分辨率的standard字体的系统标准缺省值。然后在当前功课中字体gothic被装入,并且用于后面的write文本。然后文本属性被改变,使得最后的write语句以合成形式的字体gothic出现。zreturn检验指示在从盘中装入字体中的任何系统错误。任何font命令之后,建议zreturm检验,但是在下面的例子中被略去,以节省空间。
initial
write    This text uses the system standard font.
font     ‘gothic’
if       zreturn>-1
.        write Error<<s,zreturn>>loading Gothic
endif
write    This writing uses character designs in font Gothic.
text     size;2
text     bold;on
write    This writing uses a bold and double size font synthesized from
         font Gothic
例2
从课程TCFONTS中的装饰字体库中选择字体bur48。这是burlesk的48个点高的样式。
font    ‘tcfonts’,‘bur48’
write   This text is using Burlesk character definitions.
例3
从以变量fontLib指定的课程中选择以变量fontVar指定的字体。
font  fontLib,fontVar
font  [‘LESSON’,]‘FONTGROUP’
激活font group,并且基于当前text属性从组中选择一字体。特定字体能够存在于文本属性size(1到9)、italic、bold和narrow的所有72种组合的字体组中。text命令(与其嵌入和未覆盖代码形式一起)设定这些属性,并且因此确定从该组中选择哪种字体。如果在该组中不能发现具有需要的属性的字体,使用最接近的匹配,并且如果可能合成未匹配属性。能够合成的属性是size(仅2到4)、italic、和bold。系统变量zfontret和zfontf(参看后面的系统变量)指示从该组中当前字体选择如何与当前有效的文本属性的匹配有多接近。
通过查看font语句,不可能知道参考字体还是字体组。但是,在块目录页(Block Directory page)上显示块类型。
例1
字体组mine具有4种字体,特别为字体大小1和2设计的,均以正常体和斜体但不是黑体。在写语句中的文本属性未覆盖码选择斜体和黑体。斜体来自组中的一种设计的字体,而黑体被合成。
font    ‘mine’
text    size;1
write   This normal and italic text comes directly from designed fonts whilebold is synthesized starting from the size 2 normal and italic fonts.
例2
字体大小属性使得从每个装饰字体组中选择2号大小的字体。
textsize;2
font   ‘tcfonts’,‘burlesk’
write   This writing uses the font group burlesk.
font   ‘tcfonts’,‘opera’
write   This writing uses the font group opera.
font standard
选择标准字体或字体组。这是在课程TCSTDFNT中发现的一种系统标准字体,除非如同后面部分中描述的该标准字体已经被取代。
举例
font    ‘gothic’
write    This text is in Gothic
font     standard
write    while this is in standard.
font     [‘LESSON’,]‘FONT’;standard
font     [‘LESSON’,]‘FONTGROUP’;standard
在字体选择上的选项关键字standard使得命名的字体或字体组变成新字体,取代系统标准字体组。任何后面的font standard语句选择该新标准字体或字体组直到jump转移。
为了产生对于整个课程永久的standard字体选择,使用status save;default,以产生当jump转移时恢复的缺省显示参数的选择部分。然后,只有后继的initial,screen,status restore;standard,或font standard;standard语句恢复在课程TCSTDFNT中的系统standard字体组。
系统变量zcharw和zcharh报告在字体大小1的标准字体的宽度和高度。这些值是字符屏幕坐标的基础。
举例
变量typeface包含要激活的字体的名称;它变成standard字体。如果字体是32个象素高和32个象素宽,那么系统变量zcharh和zcharw变成32。对于screen vga、medium(480个象素高和640个象素宽),字符坐标网格现在具有15(480/32)行和20(640/32)列。用于write语句的文本将出现在x=128((5-1)*32)和y=416(480-(2*32))的图形坐标。该字符网格保持有效直到standard字体被替换。
screen  vga,medium
font    typeface;standard
at      2:5
write   Character position 5 on line 2.
font    standard;standard
从课程TCSTDFNT中恢复系统标准字体组。如果标准字体较早被取代,这个可能是所需要的。
课程TCSTDFNT包含系统standard字体组和字体,为每种垂直分辨率命名的一种:用由屏幕的垂直分辨率跟着的字母std开始的名称。例如,std350是用于ega、medium屏幕,std480用于vga、medium屏幕,及std600用于vga、high屏幕。无论何时执行font standard;standard或initial,screen,或status restore语句,当前屏幕分辨率用来选择系统standard字体组。由于它是字体组,从该组中选择的字体取决于当前的文本属性。
通过编辑在课程TCSTDFNT中的字体和字体组然后生成新的二进制以替换TCSTDFNT.BIN,可改变系统标准字体。
font  [‘LESSON’,]‘FONT’fontNumber[;noload]
font  [‘LESSON’,]‘FONTGROUP’;fontNumber[;noload]
选择一字体或字体组,并且给其分配从1到35的一个独有号码。编号的字体可由嵌入文本的未覆盖码序列访问。例如,这允许单个write命令内字体之间的切换。
在源编辑器中,输入序列[CTRL][A],[F],[1]-[9]输入用于前9个编号的字体的未覆盖码,而序列[CTRL][A],[F],[A]-[Z]输入用于编号的字体10到35的码。在arrow处的学生模式中,类似的码序列能够用来切换字体,但是缺省的未覆盖码序列的开始是不同的:
[CTRL][U],[M],[F],[A]-[z]。
编号的字体语句可包括在一课程的+editor控制块中,使得具有嵌入的字体选择序列的文本在编辑期间以正确的字体出现。
字体编号分配由status命令保存和恢复。
单个字体或字体组可通过使用多font命令被分配多于一个的编号。如果这样作后,分配给该字体的任何一个编号可用来选定该字体。然而,一个给定的编号一次只能与一个字体或字体组相关连。给定的字体编号的最近期的分配优先于任何较早的分配。
选项关键字noload用来使得字体或字体组具有字体编号关联,而不用实际将字体装入存储区。该选项可保存在多字体需要与字体编号关联的例程的开始的盘读取时间。接着,当字体由嵌入write语句中的其编号引用时,字体将按需要被自动装入。
例1
装入两种编号的字体。未覆盖码序列用来在write语句文本中的字体之间切换。(当隐藏的字符的显示在源编辑器中启用时,未覆盖码序列变成可见的。)
font    ‘gothic’;2
font    ‘geneva’;3
write   This text is Geneva,■f3 switches to Gothic,then.■f2 back toGeneva.
例2
在+initial控制块中,三种编号的字体被放入缺省显示status缓冲区。任何去一单元的jump转移复位到这些三种编号的字体,以便它们能够通过write、pack等语句的文本中的未覆盖码使用。如果font语句还被放入+editor控制块,任何具有未覆盖码的文本(例如该例的write语句)在编辑期间将以其所选择的字体显示。选项关键字noload用来避免任何可能的启动延迟。
*在+initial控制块中
font    ‘tcfonts’,‘geneva’;1;noload
font    ‘tcfonts’,‘poster’;2;noload
font    ‘mine’,‘firework’;3;noload
status  save;default
*       在整个课程的单元中
write    ■f1 Geneva,■f2 Poster,■f3 Fireworks
font;fontNumber
选择先前分配的编号的字体或字体组。
举例
装入两种编号的字体。几个write语句在通过只参照它们的号码在使用两个字体之间切换。
font    ‘gothic’;2
font    ‘geneva’;3
write    This text is Geneva then
font     ;2
write    switches to Gothic then
font     ;3
write    back to Geneva.
font     info;infoBuffer[,length]
读关于选择的字体或字体组的信息进入给定字节长度的缓冲区。如果长度不指定,使用缓冲区的定义长度。
下面的256字节的信息可用:
  系统数据(100字节)   字节   偏移量
  字体课程名   8   0
  字体块名   8   8
  字体组课程名(如果字体被装入,字体课程)   8   16
  字体组块名(如果字体被装入,字体块)   8   24
  字体编号(-1=标准,0=未编号)   1   32
  字体组(-1=yes,0=no)   1   33
  字符宽   2   34
  字符高   2   36
  基线偏移量   2   38
  下划线偏移量   2   40
  下划线厚度   2   42
  下划线间隙   2   44
  阴影x偏移量   2   46
阴影y偏移量   2   48
斜体角度(real)   4   50
空格增量(0=no,1=yes)  1   54
(保留)   45   55
 描述信息(156个字节)   字节   偏移量
  字体名   16   100
  修改号   1   116
  家族   1   117
  子类   1   118
  样式   1   119
  权重   2   120
  点   2   122
  水平分辨率   2   124
  垂直分辨率   2   126
  (保留)   48   128
  版权   80   176
举例
显示用于standard字体的版权信息。
define    local
infobur,256
.         ,176       $$跳到其它字段
.         copyrt,80  $$版权字段
define    end
...
font      standard
font      info;infobuf
at        10:1
showa     copyrt,80
系统变量
zreturn
font命令之后,zreturn指示装载字体的成功:
-1    操作成功
0     盘错误(参看zdoserr,zedoserr)
2     组中没有字体
4     没有发现文件
10    没有发现字体名
15    文件命令错误-不可恢复的
18    不能满足存储区组请求
zfontret
系统变量zfontret指示当前字体与当前有效的文本属性的匹配有多接近。
用于font的zfontret:
-1    字体被成功装入
2     不能装入字体;使用standard字体
3     不能装入standard字体;使用字符集
用于font group的zfontret(并且当文本属性改变时,被更新):
-2    属性精确匹配;使用某些合成
-1    属性精确匹配
0     属性部分匹配
1     没有合适的匹配;使用基字体
2     不能装入基字体;使用standard字体
3     不能装入standard字体;使用字符集
zfontf
仅对于fontgroups,zfontf包含位字段,报告每当装入字体时属性如何被产生,或引起该组中的另一种字体的选择的文本属性改变。
zfonff位意义
6     Bold(黑体)在字体组中匹配
7     Italic(斜体)在字体组中匹配
8     Size(字体大小)在字体组中匹配
16    Narrow(窄字体)在字体组中匹配
22    Bold合成
23    Italic合成
24    Size合成
属性可以不匹配请求,而且可以不被合成;例如,如果字体组仅具有黑体的条目,而且当前属性指定非黑体的,那么,位6和22两者均被关闭。
杂项
装入字体之后,设定下列系统变量,并且当文本属性改变时,如果合适则更新:
zfonth    选择字体的字符高度和宽度
zfontw
zcharh    standard大小1字体的字符高度和宽度
zcharw    (字符坐标系统的基础)
zfontb    选择字体的基线偏移量
zcharb    standard大小1字体的基线偏移量
goto
将执行过程转移到另一单元或到单元的结束。
goto    UNIT|q
goto    SELECTOR;UNIT|q;UNIT|q;...
说明
允许当前单元的逻辑连续进入另一单元。goto将执行过程切换到特定的单元,但是不进行下列动作:擦除屏幕,清除do返回标记,改变主单元,或改变help序列。
q关键字将执行过程转移到单元的结束。
很多人认为goto命令是由结构化的编程适当替换的废弃的编程方法。
if
开始一if结构。
if    condition
说明
标记if结构的开始。如果条件为真,执行任何后续的缩排码。如果条件为假,用下个非缩排elseif、else或endif继续执行过程。
if结构是TenCORE语言中的主条件结构。组成if结构的命令是:
if
elseif(选项,任何数目)
else(选项)
endif
if结构用if开始,并且用endif结束。当特定条件为真时要执行的命令紧接着if,elsei、或else缩排。在TenCORE中的缩排包括由7个空格(在源代码编辑器中的一个tab停止位)设在命令字段的第一个字符后的长度。然后命令和缩排命令的标识符按正常打印。
在任何if结构中,仅执行一组缩排命令。对于每个if和elseif连续检验条件。为真的第一if或elseif下面的缩排命令被执行,然后控制进行到endif之后的命令。如果if和elseif的条件没有一个为真,执行任何else后的缩排命令。
举例
例1
如果变量score的值大于75,执行缩排命令。
if     score>75
.      do goodfb
.      jump endless
endif
例2
在if结构中使用elseif和else命令。
if     right=0       $$用户错答所有问题
.      do          verybad
.      jump        helppg
elseif right<5       $$用户得到1到4个正确
.      do          notgood
.      jump        quiz
elseif right<10      $$用户得到5到9个正确
.      do          good
.    jump    review
else            $$用户得到多于9个正确
.    do      great
.    jump    endless
endif
例3
嵌套if结构。
if    wrong>5    $$用户错答大于5
.     write       You are making too many mistakes!
.     pause
.     if    wrong>10    $$用户错答大于10
.     .     jump quit
.     endif
endif
image
      显示,捕获和管理屏幕图像。
image 关键字
      plot     显示特定的图像
      save     将整个屏幕或部分屏幕捕获到特定的目的地
      move     在两个存储区域之间传递图像
      info     返回关于图像的信息
      delete   从存储区组中删除特定的图像
      reset    从存储区组中删除所有图像
      compress 启用或关闭图像数据的压缩
      palette  从图像中读调色板信息
说明
image命令用来在显示器上绘出完整的画面,以捕获不在显示的图像,或在变量、存储区组块和盘存储位置(名称集、数据集和课程)之间移动画面。画面是一些屏幕图像,它们是:由图像编辑器(Image Editor)在图像块中创建的,从由“paintbrush”程序创建的现有位图图像输入进图像块,或是通过按下系统键[F2]之后的图像选项(Image Option)或执行image save命令直接捕获和保存的部分屏幕。
image plot;from[;[LOCATION][;palette]]
在图像被保存的相同位置画出特定图像,除非指定位置。或者,不改变当前屏幕位置。在绘制图像中使用由mode命令设定的显示模式。(参看用于附加信息的mode。)如果指定关键字palette,使用用图像存储的调色板。如果不指定palette,调色板不改变。从对应于图像的左上角的特定位置向下画图像。
from关键字和语法:
block|b,‘NAME’
从特定的课程画图像块。如果只指定图像名称,假定是当前课程。
file|f[,record]
从附带的数据集或名称集绘图,除非指定起始record号,否则在记录1开始。在名称集的情况下,必须用setname命令先前已经选择有效名称。
memory|m,‘NAME’
从存储区组块绘图。名称可以是单引号中的文字,或在变量中出现。
vars|v,variable[,length]
从变量绘图。使用变量的定义长度,除非指定length。
举例
image    plot;block,‘horse’;20,100
*  块“horse”在位置20,100
image    plot;block,‘library’,‘horse’
*  块“horse”在文件“library”中
image    plot;file
*  当前附带的文件
image    plot;memory,myimage
*  包含在来自存储区组的myimage变量中的名称
image    plot;vars,picsave
*在变量“picsave”中的图像
image    plot;memory,‘show’;15:01;palette
*  使用用图像存储的调色板绘图
image move;destination [;[LOCATION];[LOCATION][;palette[,variablel]]]
保存由矩形区指定的屏幕的区域到destination。如果没有指定显示区,保存整个显示屏。如果使用palette关键字,也用图像存储当前调色板。如果给出variable,只有那些在variable中指定的颜色用图像保存。参看用于variable格式的palette read。用特定颜色格式保存图像,以便使用尽可能少的存储区。
destination关键字和语法:
file|f[,record]
保存到附带的数据集或名称集,除非指定起始record号,否则在记录1开始。在名称集的情况下,必须用setname命令先前已经选择有效名称。需要保存一图像的数目可如下计算:(bytes+255)$idiv$256。
memory|m,‘NAME’
保存到存储区组中的块中。名称可以是单引号中的文字,或者以变量出现。如果一图像已经用特定的名称存储,它被替换。由image创建的存储区组中的名称与任何用其它命令创建的名称无关。例如,memory命令和image命令均能创建在称为cat的存储区组中创建名称,而不引起冲突。initial命令从该存储区组中删除所有图像。
vars|v,variables[,length]
保存到变量。使用变量的定义长度,除非指定Length。如variable的定义长度不够,图像可以被截短。
举例
define     local
palblock(16),6
.          palslot,2
define     end
image      save;file;50,20;150,80
*  保存在附带文件中
image    save;memory,‘pic’;0,0;99,99
*  保存在存储区组的“pic”
image    save;memory,‘save’;0,0;zxmax,zymax;palette,palblock(1),10
*  保存palette的前十个项目
image move;from;destination
当from和destination均不是屏幕时,在from和destination之间复制图像。
举例
image    move;block,‘abc’;memory,‘def’
*  从在当前文件中的“abc”到在存储区组(memory pool)中的块“def”block不能用于destination,因为这将改变运行的课程源文件。此外,如果destination是file,那么from只能是memory或vars。
image info;buffer;from|last[;palerte]
image info;buffer;display|d,LOCATION[;[LOCATION][;palette]]
返回关于由from指定的图像的信息。信息以下列固定格式作为在指定缓冲区中的24个字节返回:
1个字节:    图像类型
          0=面向字节(CGA,EVGA等)
          1=面向平面(EGA,VGA等)
          2=文本图像
1个字节:    每象素的位(面向字节)或平面数
2个字节:    从平面左边的偏移
2个字节:    从平面顶部的偏移
2个字节:    图像宽度
2个字节:    图像高度
4个字节:    由图像块使用的字节数
10个字节:   保留
对于面向字节和面向平面的图像,偏移、宽度和高度以象素给出,并且对于文本图像,以字符位置给出。
添加palette关键字使调色板信息包括在图像的返回长度中。
用于image info的附加from关键字和语法出口:
display|d,LOCATION[;[LOCATION][;palette]]
从屏幕直接取图像。在创建保持图像的文件之前,该形式可用来确定一个屏幕上的特定图像将需要多大空间。
last[;palette]
由image命令处理的最后图像
举例
define    local
infovar,24
.           type,1
.           bits,1
.           xstart,2
.           ystart,2
.           xsize,2
.           ysize,2
.           length,4
.           ,10
define      end
*
image       info;infovar;diplay,50,50;100,100
at          2∶1
write       Image will require<<s,length>>bytes for storge
pause       pass=all
created  ‘imagel’,(length+255)$idiv$256
do          zreturn;;error(‘created’)$总检验zreturn
image       save;file;50,50;100,100
image delete;‘NAME’
从存储区组中删除指定的图像。
image reset
从存储区组中删除所有图像。
image compress;[on|off]
触发(Toggle)图像压缩。压缩的图像占据较少存储器或盘空间;在存储器中的非压缩图像绘图较快。缺省是on。
image palette;from;buffer,entries
将图像调色板项目读入缓冲区中。缓冲区必须包含下列形式的一个或多个6字节调色板项目:
槽(slot)  (2个字节)
红(red)   (1个字节)
绿(green) (1个字节)
蓝(blue)  (1个字节)
强度(intensity) (1个字节)
在执行image palette之前,必须为每个调色板项目预置slot的值。每个槽的值将确定哪个调色板槽信息被读入该项目(entry)。例如,如果特定项目的slot的值是8,调色板槽8的信息将读入该项目。如果slot的值没被设定,slot0将被读入所有项目。通过设定合适的槽值,可读或写调色板项目的任何子设定。
entries确定将读多少项目。
举例
从存储块test中的图像读用于基本16个调色板项目的调色板信息。
define     local
pvar(16), 6
.          slot,2
.          pred,1
.          pgreen,1
.          pblue,1
.          intensty,1
count      ,2
define     end
*
loop       count 1,16
*必须初始化槽号
.        calc  slot(count) count-1
endloop
*
image     palette;memory,‘test’;pvar(1),16
屏幕兼容性:
为了能够在另一屏幕上显示来自一个屏幕的图像,它们必须具有相同类型。有三种图像类型:
●面向字节的图形,诸如CGA,Hercules,MCGA,和EVGA
●面向屏幕的图形,诸如EGA和VGA
●文本
对于图形屏幕,每象素位数(面向字节)或平面数(面向平面)也必须相等。文本图像在所有文本屏幕类型中是兼容的。
可使用image info命令确定给定图像的特性。下列图表列出了当前由TenCORE支持的图形屏幕的特性:
  面向字节的屏幕   位/象素
  cga,medium   2
  cga,high   1
  Hercules   1
  mcga,hign   1
  mcga,medium   8
  Evga   8
  面向平面的屏幕   平面数
  Ega   4
  Vga   4
例如,在面向字节的组中,cga high,hercule和mcga high图像相互兼容。在面向平面的组中,所有列出的屏幕彼此都兼容。注意:即使来自一个屏幕的图像与另一屏幕兼容,由于在长宽比方面的变化,在另一屏幕上它看上去不同。例如,在vga medium屏幕上画的ega high图像将具有相同的宽度,但是仅仅是原始高度的约70%。
      系统变量(System Variable)
      zreturn
      -1    操作成功
      0     盘错误(参看zdoserr,zedoserr)
      1     没有附带文件
      2     块超出范围
      3     存储区超出范围
      4     文件没有发现
      5     图像屏幕类型不匹配执行屏幕类型
      8     盘记录不够
      9     没有有效名称
      10    名称或块没有发现
      11    无效类型
      16    无效名称
      17    无效图像
      18    不能满足存储区组请求
initial
      初始化系统到标准状态。
initial[nodetach]
说明
将系统设定到标准状态。当启动课程时,通常使用它,正如在+initial控制块中,将所有系统参数设定到已知状态。
nodetach关键字防止当前的附带文件被卸载,并且保持任何有效的对用共享文件的锁定。
initial命令执行下列命令初始化:
Display(显示)
window  reset;noplot(复位;无绘图)
status  restore;standard(恢复;标准)
blink   off(关)
color    white(白)
colore   black(黑)
colorg   black(黑)
disable  cursor(光标)
enable   font(字体)
font     standard;standard(标准;标准)
mode     write(写)
origin   0,0
rotate   0
scale    1.1
text     align;baseline(对齐;基线)
text     bold;off(黑体;关)
status   save;default(保存;缺省)
palette  init
disable  absolute(绝对)
text     delay;0(延迟;0)
text     direction;right(方向;右)
text     increment;0,0(增量;0,0)
text     italic;off(斜体;关)
text     margin;wrap(页边;绕)
text     narrow;off(窄;关)
text     revel;off(展现;关)
text     rotate;0(旋转;0)
text     shadow;off,white(阴影;关,白)
text     size(大小);1
text     spacing;fixed(间隔;固定)
text     underline;off,foregnd(下划线;关,前景)
thick    off(关)
page     1
display  1
Input(输入)
disable   pointer(指针)
disable   ptrup
enable    area(区域)
area      clear;default(清除,缺省)
area      highlight;off(高亮;关)
uncover   %ctl“u”
force     no lock(无锁)
time      clear(清除)    $$除了路由器所有的
Branching(转移)
flow      clear;default(清除;缺省)
enable    break(中断)
base
Disk(盘)
disk      -1        $$为文件搜索所有驱动器
edisk
detach    all
nsdirwr   -1        $$总是写名称集目录
Judging(判决)
enable         arrow
okword         ‘ok’
noword         ‘no’
General(总体)
memory         reset    $$除了路由器所有的
status         reset
area           reset
flow           reset    $$除了路由器所有的
perm           reset
image          reset
version                 $$没有版本模拟
Videodisc Overlay(视频盘覆盖)
video          init
      video               unitinit,on
intcall
      调用软件中断。
intcall number,pass,receive[;extended]
         number  调用中断例程
         pass    传递到中断例程的数据(8或20个字节)
         receive 从中断例程返回的数据(8或20字节)
         extended强制使用扩展寄存器
说明
调用由number指定的中断。在非扩展形式中,寄存器AX、BX、CX和DX设定到包含来自pass的四个2字节值。寄存器DS和ES设定到指向作为适合于pass变量的全局或本地变量段;SI和DI设定到段内的偏移量。在从该例程的出口,receive包含驻留在AX、BX、CX和DX寄存器中的四个2字节值。zreturn包含FLAGS寄存器的低字节。
extended关键字强制使用扩展寄存器组,这些扩展寄存器组以下列顺序分配给20字节pass和receive变量:
AX,BX,CX,DX,SI,DI,BP,DS,ES,FLAGS
Addresses(地址)
下列系统定义函数参考某些时候在intcall使用的设定或解释寄存器中是有用的:
sysloc(global)全局变量的段地址
sysloc(local) 当前单元的本地变量的段地址
varloc(var)   变量var的偏移地址
absloc(var)   存储器内的var的绝对位置,表达为没有段的4字节偏移量。对应于该段:偏移地址如下:
segment=absloc()$ars$4
offset=absloc()mask$h0f
absloc=((segment$mask$h0000ffff)$cIs4$4)+(offset $mask$h0000ffff)
举例
执行中断h12,它返回存储器大小。该中断不需要输入数据,输入和输出使用相同的变量。
define    local
regstrs,8
.         ax,2    $$AX数据
.         bx,2    $$BX数据
.         cx,2    $$CX数据
.         dx,2    $$DX数据
define    end
*       调用bios中断h12,“memory size determine”没有输入参数,这
*       样,输入和输出可使用相同变量
*
intcall h12,regstrs,regstrs
at      5:5
write   You have<<s,ax $imul$ 1024>>bytes of memory。
系统变量
zreturn包含计算机内部标志寄存器。函数参考bit(zreturn,8)可用来测试进位(CY)位,该进位位经常由软件中断设定,以指示错误情况。参看FLAGS寄存器定义的intcall在线文献。
jump
    转移到新主单元。
jump    UNIT[(argument/16s)]
jump    SELECTOR;UNIT[(argument 16s)];UNIT[argument/116s];...
jumpop  UNIT[(argument/16s)]
jumpop  SELECTOR;UNIT(argument/16s)];UNIIT[argument/16s];...
说明
jump和jumpop命令转移到特定的单元,使得该单元成为新主单元。可选的是,最大16个自变量可被传递到新主单元。所有flow转移设定被清除(除了router设定),并且恢复到它们的缺省值。
jump转移将所有绘图参数恢复到它们的缺省值(参看status),并且将屏幕(或窗口)擦除到colore颜色。所有指针区域清除并且恢复到它们的缺省值。
jumpop(jump on-page)分支不改变绘图参数、area设定或不执行屏幕擦除。
具有jump关键字的flow命令执行类似功能。然而,flow是延迟的驱动事件转移,而jump当执行该命令时,立即发生。jump还允许自变量,而flow不允许。
在“语法规范”中描述了SELECTOR形式。jump具有附加q(用于quit)列表项目形式,如果选择该项,则终止当前单元的进一步执行。参看例4。
用转移能够传递最多16个自变量,这些自变量由逗号分开。这些自变量用jump的执行求值,并且它们的值被传递到下个单元。在下个单元中的receive命令用来接受这些自变量。对于自变量传递和当传递自变量时设定系统变量zargs和zargsin的更多信息,参看receive命令。
举例
例1
jump two
立即转移到当前课程中的单元two。屏幕被擦除,并且重新建立所有缺省。
例2
jump  rivers,<<name>>
转移到在课程rivers中由变量name指定的单元。
例3
jumpop    build(98.6,men+women,size)
...
receive remp,total,size    $$在build单元中
转移(没有屏幕擦除)到的当前课程中的单元build作为自变量传递以下值:常数98.6,表达式men+women的求值和变量size中的值。在单元build中,receive语句接受被传递的自变量进入变量中。由于用jumpop屏幕不擦除,单元build能够将更多的添加到现存的屏幕显示。
例4
jump  x-2;one;two;three;q
如果x-2是负,jump的该选择形式转移到单元one;如果为0,转移到two;如果为1,转移到three,并且对于大于1的值,停止在当前单元中执行任何进一步的命令。
通用单元名称
对于到新主单元的普通jump目的地提供通用的转移名称:
=next    实际在本课程中的当前主单元后的单元。如果没有,转移
          被忽略。
=back    实际在本课程中的当前主单元之前的单元。如果没有,转
          移被忽略。
=first   在当前课程中的第一可执行单元。
=last    在当前课程中的最后可执行单元。
=main    如同保持在系统变量zmainl、zmainu中的当前主课程和
          单元。
=base    最后base修改flow转移发生,或者如同由base命令设定
          的主课程和单元。如果没有,转移被忽略。当前基课程和
          单元的名称保持在系统变量zbasel,zbaseu中。通常用于从
          补充课程序列诸如帮助(help)返回到学习主行(main line)。
=editor  如果由作者系统执行,则为源编辑器(用当前执行单元装入
=exit    如同由exitles命令设定并且包含在系统变量zexitl、zexitu
          中的课程退出。如果没有出现,学生用户通常转移回到它
          们自己的路由系统,诸如TenCORE活动管理器或DOS。
          测试课程的作者返回到文件目录。
=system  打开具有计算器、图像捕获器、光标等的系统选项窗口。
          在创作期间,[F2]通常用该转移装入作为TenCORE系统缺
          省;由学生执行器则忽略。
举例
如果问题在第一次尝试被正确的回答,学习者进行到下个主单元。如果需要两次或三次尝试,再进行当前主单元。对于任何其它数目的尝试,基单元指针被设定,并且学生转移到到称为trouble的帮助单元。在单元trouble中,jump到=base将学习者返回到基单元用于在问题中的另一次尝试。该代码将作为主单元的部分或由课程中的所有问题调用的子程序均运行良好。
if    tries=1
.      jump    =next    $$进行到下个问题
elseif tries<4
.      jump    =main    $$重新执行该单元
else
.      base    <<zmainu>>$$将base设定到当前主单元
.      jump trouble      $$给学习者扩展的帮助
endif
library(库)
进行对二进制单元的子程序调用。
library UNIT[([argument/16s][;return/16s])]
library SELECTOR;UNIT([argument/16s][;return/16s])];...
说明
一种特殊形式的do命令(参看do命令),进行对外部二进制库的子程序调用,不管主调单元是否以源或二进制模式执行。该格式与包括将自变量传递到被调单元并且从被调单元传递到自变量的do相同。该命令用来调用完整的例程或仅以二进制形式退出的第三方TenCORE软件。当二进制由一课程组成时,library和do同样工作。
如果calling单元以源模式执行(通过直接运行来自源代码编辑器的源代码),library切换到子程序调用的二进制执行模式。当从called单元返回到calling单元时,恢复源模式执行。如果被调库例程jumps到新主单元,执行过程以二进制模式继续,并且“返回到编辑”键[F2]不再工作。
参看源和二进制执行模式的讨论以及它们如何能够被显式控制的operate命令。
loadlib
将二进制单元装入单元缓冲区。
loadlib    UNIT
loadlib    SELECTOR;UNIT;UNIT
说明
将二进制单元装入单元缓冲高速缓存,用于由后面的library命令的执行过程。从二进制文件中取出该单元,与主调单元的类型(源或二进制)或由operate设定的状态无关。
loadlib可用来在执行一单元之前检验该单元的存在,或将单元强制装入存储器中。这可用于加速后面的码段,或用于允许单元驻留在其上的盘被移去。
使用loadlib应注意:如果单元的执行需要空间,可从存储器中清除任何非执行单元。
举例
从课程libfile的二进制复制中预装单元copyfile。单元copyfile从一个盘向另一盘复制文件。一旦被装入,包含课程libfile的盘可被去除。
loadlib    libfile,copyfile
*  将二进制单元copyfile强制装入存储器
jump      zreturn;;erroru    $$总检验zreturn
at        5:5
write     Now put the diskette to copy FROM in drive A and the diskette tocopy TO in drive B.
          Press Enter to begin the copy
pause     pass=%enter
library   libfile,copyfile    $$保证是在存储器中
      系统变量
      zreturn
      -1    操作成功
      0     盘错误(参看zdoserr,zedoserr)
      4     课程没有被发现
      10    单元没有被发现
      11    无效类型
      16    无效名称
      21    与另一用户的锁定冲突
loadu
      将单元装入单元缓冲区。
loadu    UNIT
loadu    SELECTOR;UNIT;UNIT;...
说明
将特定单元从盘装到单元缓冲高速缓存,而不执行该单元。loadu可用来提前装入一个或多个单元,以避免后面的盘访问延迟,以检验一单元是否存在,或从要移去的盘装入一单元。
举例
预装单元copyfile。单元copyfile从一个盘将文件复制到另一盘。一旦装入,可移去包含该例程的盘。
loadu    copyfile    $$将单元copfile装入存储器
jump     zreturn;;erroru  $$总检验zreturn
at       5:5
write    Now put he disk to copy FROM in drive A and the disk to copy TO
         in drive B.
         Press Enter to begin the copy。
pause    pass=%enter
jump     copyfile       $$保证在存储器中
   系统变量
   zreturn
   -1    操作成功
   0     盘错误(参看zdoserr,zedoserr)
   4     课程没有被发现
   10    单元没有被发现
   11    无效类型
   16    无效名称
   21    与另一用户的锁定冲突
loop
   开始一循环结构。
loop    [CONDITION]
loop    counter
Figure C9880941502241
start,end[,increment]
        counter用作索引计数器的变量
        start    计数器的起始值
        end      计数器的结束值
        increment索引计数器的增量(减量)
说明
开始由endloop结束的循环结构,该循环结构用来对一系列命令重复特定的次数,或当条件为真时重复一系列命令。loop结构可包含在同一缩排层上的reloop和outloop命令(参看该命令)。所有其它命令必须缩排。各循环可相互嵌套,但是内部的循环范围整体上必须在外部循环的范围之内。
分配箭头
Figure C9880941502242
将ITERATIVE循环区别于WHILE循环。
loop  [CONDITION]
只要CONDITION为真,执行WHILE循环结构内的代码。如果没有给出标识符,除非通过outloop,jump等提供出口,否则继续重复。
如果条件出现,每次测试其值,执行过程返回到loop命令。如果条件为真,开始新的重复;如果为假,循环退出。
举例
使用WHILE循环,在屏幕上画线X。
at    5:1
loop  zspace<80    $$当zspace小于80时
.     write X
endloop
loop  counter
Figure C9880941502243
start,end[,inerement]
ITERATIVE循环重复由控制自变量指示的次数。counter被赋予start的值。每次执行返回到循环的开始,increment添加到counter。如果忽略increment,缺省值是1。如果increment是负数,counter值将减少。如果counter已经达到end的值(无论什么方向计数循环),循环结束。
例1
loop    index
Figure C9880941502244
1,10    $$从1到10循环
.       at     index:4
.    write  index is<<s,index>>
endloop
例2
WHILE循环用来在屏幕上限制水平绘图。ITERATIVE循环用WHILE循环的每次重复画随机数X。
at    10:1
loop  zspace<80    $$当zspace小于80时
.     calc      random randi(10)
.     loop      index
Figure C9880941502252
1,random
.     .       write X
.     endloop
.     pause     .5
endloop
memory
     管理存储区组数据存储。
memory  关键字;...
        create   分配新存储块
        read     将数据从存储块转移到变量
        write    将数据从变量转移到存储块
        exchange 在存储块和变量之间交换数据
        move     在存储块之间传递数据
        delete   删除指定的存储块
        reset    删除所有存储块
        rename   改变存储块的名称
        resize   改变存储块的大小
        info     返回系统变量中的块信息
        total    改变存储区组的总大小
说明
提供对存储区组的访问。在组中的存储区由命名的块分配。变量(缓冲区)中的数据可写入那些命名的存储区组块中,并且可从那些命名的存储区组块中读出。随着创建、删除和改变存储块大小,系统自动管理存储区组。主存储区组由低于640千字节的所有未使用的DOS存储区组成。辅助(虚拟)存储区诸如扩充(EMS)、扩展(XMS)和盘存储区用来扩充主存储区组。
大部分memory命令调用应该后随zreturn检验,以确认成功的操作。
initial命令删除所有存储块。执行错误也删除所有块,并且恢复存储区组的大小为起始时的大小。
存储区组由下列命令使用:memory,image,window,status,area,flow,font和perm。存储块在创建时被标识为属于特定的命令类型,并且不能由其它命令使用该存储区组访问。不同命令可使用相同名称的存储块,而不冲突。memory create;‘NAME’,size[;fixed|router|temporary]
在存储区组中创建给定大小的命名的0填充的块。当在存储区组中分配一块时,其大小舍入到16字节的倍数。除了其舍入的长度,每个存储块使用该组中的额外的16个字节。
选项修改符fixed将该块插接到存储区中的固定地方,其地址在系统变量zmstart中发现。除非绝对需要,应该避免固定块,因为它们降低了存储区组的操作。固定块的一个示例性应用是作为与外部节目的通信缓冲区。
通常,除非有选项关键字router,否则存储块由initial或memory reset删除。只能用显式memory delete;‘NAME’或memory reset;router语句删除路由器修改存储块。router修改存储器块从任意域可访问,并且不由它们被创建的域的删除来删除。
当系统需要额外的存储区组空间时,自动删除temporary修改存储块:对于保持当需要时可再产生的数据是有用的。
修改符相互之间是排他的:在memory create语句中只能产生一个。
例1
在存储区组中创建称为temp的1000字节的存储块。如果出现错误诸如存储区不够,则出现跳转到发生错误的单元中。
memory    create;‘temp’,1000
jump      zreturn;;error
例2
使用包含在8字节变量name中的名称,创建200个字节的fixed存储块。
memory    create;name,200;fixed
jump         zreturn;;error
memory write;‘NAME’,offset;buffer;length
从变量缓冲区传送给定字节长度的数据到以给定偏移量起始的指定存储块。在存储块中的所有偏移量开始于0:以参考存储块的开始,使用0偏移量。
举例
从变量score传送8个字节到存储块results,在块results的起点(0)过去32个字节开始。如果出现某些错误,跳转到错误例程。
memory  write;‘results’,32;score;8
jump    zreturn;;error
memory read;‘NAME’,offset;buffer;length
从以给定偏移量开始的指定存储块传送给定长度字节的数据到变量缓冲区。
例1
从存储块info的起点(偏移量0)传送256字节的数据到缓冲区infobuf。如果出错,跳转到错误例程。
memory  read;‘info’,0;infobuf;256
jump    zreturn;;error
例2
在对库子程序的调用期间保存和恢复所有全局变量。首先,创建称为saveVars的存储块。全局变量传送到该存储区组块。调用可能按照需要改变全局变量的库例程。最后,恢复全局变量。
define    global
globals=29696        $$假定缺省全局空间(29千字节)
varBlock,globals,block
define    end
*
memory    create;‘savevars’,globals    $$创建全局块
jump      zreturn;;error
memory    write;‘savevars’,0;varBlock;globals    $$保存全局
jump      zreturn;;error
...
zero     varBlock,globals    $$所有全局假定为0
library  routines,graph         $$可使用所有全局
...
nemory  read;‘savevars’,0;varBlock;globals    $$恢复全局
jump    zreturn;;error
memory exchange‘NAME’,offset;buffer;length
在以给定的偏移量开始的指定存储块和变量缓冲区之间交换给定字节长度的数据。
举例
memory exchange;block,0;buf(i);12
交换以block指定的存储块的起始和以buf(i)开始的数组缓冲区之间的12个字节的数据。
memory move;‘FROMNAME’,offset;‘TONAME’,offset;length
直接移动存储块之间的数据。
举例
memory move;‘databuf’,0;‘backup’,3;256
从存储块databuf的开始到以偏移量3起始的存储块backup传送256字节的数据。
memory delete;‘NAME’
从存储区组中删除指定的块。
memory reset[;router]
memory reset删除除了那些用router修改符创建的存储块的其它所有存储块。使用选项修改符router使得包括那些用router修改符创建的所有存储块要被删除。
memory rename;‘NAME’,‘NEWNAME’
重新命名存储块。
memory resize;‘NAME’,size
改变指定的存储块的大小。存储块不能是fixed块。如果新大小较大,为零的字节加到末端。如果新大小较小,从末端移去这些字节。在两种情况下,保留数据不变。
memory info;‘NAME’
将系统变量zmlength设定到以字节表示的指定块大小(或如果块不存在,为0)。如果该块具有fixed类型,将系统变量zmstart设定到存储区组中的块的绝对地址。该命令可用来检验是否存在某个名称的存储块。
举例
zreturn检验用来确认存储块的存在,该存储块的名称包含在8字节变量test中。如果在存储区组中,显示其长度和地址(如果不具有fixed类型0)。
memory  info;test
if      return    $$测试成功(-1)
.       write  length=<<s,zmlength>>address=<<s,zmstart>>
elseif  zreturn=10
.       write  Name does not exist
else
.       write Other Error
endif
memory total;size
改变存储区组的大小。如果大小增加,从DOS请求额外的存储区;如果减少,未用的存储区返回到DOS。缺省地,所有未用DOS存储区(低于640K)分配给存储区组;因此,除非当启动TenCORE时由命令行选项特别限定,否则不能增加存储区组大小。如果TenCORE之后已经装载存储器驻留程序,不能增加存储区组的大小。
辅助存储区组
当在存储区组中的空间用完时,池中的现存块自动移到辅助存储区组,以为新块留出空间。辅助存储区组可以是下面的任何一种或所有的:扩充(EMS)存储区,扩展(XMS)存储区,或盘。如果多于一种存储器类型是可用的,首先使用扩充(EMS)、然后扩展(XMS)、最后是盘。
当启动TenCORE时,缺省量的可用EMS、XMS和盘空间自动分配给辅助存储区组。如果需要,当系统启动时,可设定每个的量。
当辅助存储区组可用时,仍然由主存储区组的大小限制块的最大大小;然而,由于现存块可移动到辅助存储区组,可创建更多的存储区组块。
创建fixed存储区组块限制了另外的存储区组块的最大大小,因为它们不能被移动到辅助存储区。一般来说,不推荐用fixed存储块。
系统变量
zreturn
memory命令设定zreturn如下:
1    操作成功
3    超出范围的变量参考
6    复制名称
10   名称不存在
11   无效类型(固定块的重定义大小)
16   无效名称
18   组中的存储区不够(创建并且重定义关键字)或添加到组中的DOS存储区不足(总关键字)
杂项
在参考存储块名之后的任何memory命令(除了delete)之后,设定下列系统变量:
zmlength最后被参考的存储块的以字节表示的大小
zmstart    如果固定,最后被参考的存储块的绝对地址;否则为1
下列系统变量提供关于TenCORE存储区组的信息:
zrmem    不是fixed的新存储块的最大可能大小
zfmem    新fixed存储块的最大可能大小
zmem     存储区组的大小
zxmem    能够添加到存储区组的额外DOS存储区的量(用memory
         total)
mode
控制如何在屏幕上绘出图形、文本和图像。
mode    mode
mode    SELECTOR;mode;mode;...
write   <<mode|m,mode>>
mode绘制关键字是:
write    使用前景色
erase    使用背景(擦除)色
rewrite  使用前景色,擦除字符背景
inverse  使用背景(擦除)色,绘字符背景
noplot   模拟绘图,不影响显示
xor      使用前景色与现存显示的EXCLUSIVE OR(异或)
add      使用前景色与现存显示的OR(或)
sub      使用前景色的反色与现存显示的AND(与)
说明
控制图形、字符和图像如何放在显示屏上。这三种目标类型的每一种具有其自己的结构和与模式和颜色命令的交互。诸如draw和circle的图形目标由定义目标的一些点组成;当绘在屏幕上时,它们使用前景色。字符由定义字符的前景点和其余的字符单元的背景点组成:前景和背景点使用前景和擦除色以各种模式执行不同的任务。图像由已经加色的点的长方形区域组成,并且不使用前景或背景色。然而,在图像中的黑色(调色板槽0)点对到任何预先存在的显示是透明的。
对于纯文本显示屏,单个点不是可寻址的:只能改变整个字符位置,这限定了很多模式的功能。纯文本模式操作在结尾单独讨论。
当jump转移到一单元时,模式复位到缺省模式。为模式设置初始缺省是write。这可通过使用状态save语句改变。
通过write语句中的嵌入mode命令的模式的改变不延伸到write以外:一旦完成写,模式恢复到作为write开始处的值。
mode write(写模式)
以前景色绘图形和字符点。用它们的所设计的颜色绘图像。字符背景和图像的槽0颜色对任何现存显示是透明的。
mode erase(擦除模式)
将图形和字符点擦除到背景(擦除)色。图像被擦除就象对于sub模式。
mode rewrite(重写模式)
以前景色绘图形和字符点。字符背景被擦除到背景(擦除)色。用包括槽0色的图像的被设计色来整体绘图。
举例
执行“count-down(递减计数)”从10到0向下递减计数由“BANG”跟随。
write    rewrite
loop     count
Figure C9880941502321
10,0,-1
.        at 10:25
.        showt count,2
.        pause 1
endloop
at       10:25
write    BANG!
Mode inverse(反转模式)
以背景(擦除)色绘图形和字符。以前景色绘字符背景。图像首先使所有颜色转到它们的反位(bit-wise complements),然后包括颜色槽0整个画出图像。
mode noplot(不绘图模式)
模拟绘图,不用改变屏幕。屏幕位置和除了mode的所有绘图属性被更新,就象实际绘图发生。
举例
使用mode noplot首先确定文本行的长度,并且放入变量length。这可通过由at将屏幕x位置设定到0、mode noplot绘文本、然后得到在系统变量zx中发现的结束位置来实现。然后中心在屏幕或显示窗上实际绘出文本。这可在减半显示宽度(zxmax/2)然后回移文本宽度的一半(length/2)的最后的at语句实现。
mode    noplot                $$不影响屏幕
at      0,100                $$在x=0开始
write   Handling Snakes       $$文本的模拟绘图
calc    length zx         $$系统变量zx给出
*                             $$文本长度
mode    write                 $$设定到标准绘图模式
at      zxmax/2-lengtj/2,100 $$设定文本的开始
*                             $$用于置于中心
write   Handling Snakes
mode xor
图形,字符点和图像与任何现存显示进行逻辑EXLUSIVE OR组合。在屏幕上以此方式在相同位置绘相同的材料两次。
举例
使单词“ORBIT”绕着屏幕中心活动旋转。如果“ORBIT”穿过某背景图形,将进行EXCLUSIVE OR绘图,不改变背景。rad定义为实数变量,并且保存弧度用于sin/cos计算。
screen    vga
calc      rad
Figure C9880941502331
0
mode      xor    $$切换到EXCLUSIVE OR绘图
loop
.         at     sin(rad)*100+320,cos(rad)*100+240
.         write      ORBIT
.         pause      .01
.         at     sin(rad)*100+320,cos(rad)*100+240
.         write      ORBIT
.         calc       rad rad+.05
endloop
mode add
图形,字符点和图像与任何现存显示进行逻辑OR组合。
mode sub
图形,字符点和图像是被取反的颜色,然后与任何现存显示进行逻辑AND组合。
纯文本硬件屏幕
模式write,erase,write和inverse按照需要操作,将字符前景和背景色改变为合适的。逻辑模式xor,add和sub按照已解释的改变前景字符颜色。然而,xor仅在屏幕上已经存在空(空格)字符的地方绘制字符,否则从屏幕上擦除字符。
系统变量
zmode  保持当前绘图模式
0      inverse
1    rewrite
2    erase
3    write
4    noplot
5    xor
6    add
7    sub
move
从一文字或变量将数个字节的数据移进一变量。
move    from,to,length
说明
将特定数目字节的数据从一个位置移动到另一位置。如果from和to两种均是变量。它们可以交迭,并且被移动的数据长度可超过两个变量中任何一变量的定义长度。move命令非常快。
举例
从rec(2)到rec(3)向下移动一个记录
define    local
reclen=256        $$TenCORE数据记录总是256个字节
rec(6),reclen     $$六个记录的数组
define    end
*
move    rec(2),rec(3),4*reclen    $$向下移动记录
nextkey
     提前系统键输入缓冲区和变量。
nextkey[关键字]
       blank    提前键缓冲区并且更新zinput
       test     更新zinput,不提前键缓冲区清除
       clears   键输入缓冲区
       flags    更新zinputf和zkeyset
pointer  更新zinputx,zinputy和zinputf,将zinput设定到%ptrinfo
说明
nextkey从系统键输入缓冲区读待读的键。输入通常被缓冲,直到遇到主单元的结束、pause、arrow或no判决。nextkey立即检验输入缓冲区,不等待这些等待状态中的一种。空白标识符将下个可用键从缓冲区复制到zinput,并且从缓冲区中移去该键。
如果键缓冲区空,系统变量zinput设定到零。
遇到nextkey不激活当前flow设定。
nextkey
用输入缓冲区中的下个可用键更新zinput,zinputf和zkeyset,从缓冲区中移去待用的键。如果使能指针,也更新zinputx和zinputy。
nextkey test
如同空白识别符形式,更新zinput,zinputf和zkeyset,但是不从键缓冲区中移去待用键。
nextkey clear
清除所有待用键的输入缓冲区。不清除zinput。
nextkey flags
更新zinputf和zkeyset的最左边字节,并且zkeyset的最右边字节填零。对zinputx和zinputy不改变。
nextkey pointer
更新zinutx,zinputy和zinputf。将zinput设定到%ptrinfo。
举例
问题“What goes meow?”作为活动的广告牌在显示器的顶部显示。当用户按下键盘上的字母时,活动停止,并且字母出现在后面的箭头处。变量x定义为2个字节的整数。
margin  wrap          $$绕着屏幕
mode    rewrite       $$替换下面的文字
calc    x
Figure C9880941502351
zxmax/2 $$在屏幕中间开始
nextkey clear         $$清除任何待用的键
nextkey               $$还清除zinput
*
loop    zinput=0    $$当没有输入键时循环
.       at      x,zymax-20    $$屏幕顶部附近
.       write   What goes meow?     $$$循环中文本将移动到的左边
.       calc    x x-1            $$将起点x向左移动1个象素
.       caics   x<0;x zmax;; $$检验屏幕绕动(wrap)
.       nextkey test                 $$更新zinput
endloop
*
arrow   10,zymax-40
answer  cat
endarrow
      系统变量
      zinput      0没有输入
                  最后按键的1-255字符值
                  >255非字符按键
      zinputf     在zinput中用于输入的旗标
      zkeyset     在zinput中用于输入的旗标和扫描码
      zinputx     在zinput中用于输入的指针设备的X坐标
      zinputy     在zinput中用于输入的指针设备的Y坐标
nocheck
      取消子程序调用自变量计数检验。
nocheck return|receive
nocheck return,receive
return     关闭用于return命令的自变量计数检验
receive    关闭用于receive命令的自变量计数检验
说明
禁止在return和/或receive命令进行的自动检验,以保证传递自变量的正确数目。
nocheck允许任何数目的标识符出现在return或receive中,不管由calling(do,library,或jump)命令给定的自变量数目。
nocheck必须是在return和receive命令要被影响(called单元)的相同单元中。
operate
     不同的执行模式之间的切换。
operate  mode
operate  SELECTOR;mode;mode;...
mode关键字是:
source   从.SRC文件执行后面单元
binary   从BIN文件执行后面单元
tpr      从.TPR文件执行后面单元
说明
设定操作模式,source,binary或tpr,用于系统文件执行。当命令执行需要系统访问一单元时,操作模式确定它查寻在source(.SRC),binary(.BIN)还是在producer(.TPR)文件中的单元。缺省将访问与从其装入当前单元的文件相同类型的文件。
operate命令保持有效,直到由另外的operate命令、library命令、error转移或具有operate标识符的flow的执行改变。
如果模式由flow do改变,一旦完成do序列,它将恢复。如果模式由flowjump改变,它不恢复。
在学生执行器中执行operate source产生执行错误11,“无效自变量值”。
error保存执行命令时(在装入转移指针时)的操作模式。当用error转移时,操作模式复位到在装入指针时有效的模式。
与库命令的交互
library的执行临时将操作模式设定到二进制。如果执行过程从二进制单元正常返回,操作的原始模式将恢复。
然而,两个事情可防止操作的原始模式的恢复:
●从库单元进入新主单元,其中发生没有从library返回,并且二进制操作继续的情况。
●当在二进制单元中时,执行operate,在这种情况中,一旦返回到主调单元,执行操作模式不恢复。如果主调单元由library自身调用,当返回到主调单元时,恢复操作模式。
origin
设定显示坐标系统的原点。
origin[LOCA TION]
说明
移动坐标系统的原点从缺省位置(0,0)到指定的位置。所有后面的显示命令相对于指定的原点定位。
在每个新主单元原点设定到(0,0)。这可使用由status save;default跟随的origin改变。
空白标识符将原点复位到0,0
举例
在屏幕的三个不同区域显示用x标记的框。
origin
origin    120,70    $$设定第一个框和x的原点
do        xbox       $$重定位绘制
origin    160,100   $$第二个框
do        xbox
origin    200,130   $$第三个框
do        xbox
xbox
*         该单元画4个象素厚的块,内部有“x”
*         通常在显示器的左下角画出
*
box     0,0;20,20;4    $$画出框
draw      0,0;20,20;;0,20;20,0    $$后随x
   系统变量
   zoriginx    当前原点的绝对X坐标
   zoriginy    当前原点的绝对Y坐标
outloop
   从结构内的任何点退出循环结构。
outloop  [CONDITION]
提供从循环结构内的任何点的退出。如果标识符空白或条件为真,outloop去接着相关endloop的命令。如果条件为假,没有动作,并且用循环结构内的下个命令继续执行。
outloop总是出现在与要被退出的循环结构相同的缩排层,与outloop周围的任何其它缩排结构无关。
举例
define    local
counter, 2    $$计数器
define    end
local
*
at        5:3
write     Press Enter to increment the counter,or Esc to exit the loop
calc      counter 1
loop
.         at 8:3
.         erase  50
.         write The counter value is<<show,counter>>
.         pause pass=%escape,%enter
outloopzinput=%escape    $$如果按下Esc,退出
.         calc    counter counter+1
endloop
*
at        10:3
write     You exited the loop!
Pack,packz
packc,packzc
     将文本串放入缓冲区。
pack buffer;[length];TEXT
packz  buffer;[length];TEXT
packc  SELECTOR;buffer;[length];TEXT;TEXT;...
packzc SELECTOR;buffer;[length];TEXT;TEXT;...
buffer 文本串被放入的一变量。
length 一赋值为放入缓冲区的字符数目的选项变量。
TEXT   要放入缓冲区的文本串。
SELECTOR  用来选择一种TEXT情况的表达式。
说明
将文本串放入给定的缓冲区,并且如果指定length变量,返回实际存储的字符数目。如果定义的缓冲区不长于文本串,pack形式使额外字节不改变,而packz形式将它们填零。命令中的c(conditional)后缀表示SELECTOR形式。
文本串可包含show型命令诸如show,showt和showa。如果文本超过一行,在每个附加行之前,回车(码13)组装(pack)进缓冲区。如果多个空白行后文本串继续,包括多个回车。如果不需要文本串的长度,使用用于长度的空自变量。
pack命令不执行上下限(bounds)检验:如果它们扩展超过定义,被组装的字符可溢出缓冲区并且重写后面的变量或引起执行错误。必须考虑文本串的最大可能长度。
SELECTOR分隔符
接着长度自变量的分隔符由packc和packzc使用,以分隔每种情况的文本串。下列分隔符有效:
逗号,
分号;
冒号:
行结束
Figure C9880941502401
通用分隔符|
两个连续分隔符指示空标识符;对于SELECTOR的相应值,没有什么要组装进缓冲区中。如果使用分隔符而不是行结束,单个串可跨越多于一行,其中对于碰到的每个行结束装入一回车。
空码
在嵌入showa命令中的任何空字符(码0)被跳过;空字符不出现在结果的串中。可通过带有包含空字符的变量的嵌入showv命令,空字符强制进入被组装的字符串。
举例
例1
将三行文本装入缓冲区lines。在缓冲区中它们由回车码分开。count设定到被组装的串的长度。showa语句将显示三行文本串。
pack    lines;count;The first line of text.
        The second line of text.
        The last line oftext
showa   lines,count
例2
嵌入命令用来在被组装进缓冲区introbuf的文本串内将名称包括进缓冲区name,以及将整数包入变量age。在introbuf中的任何额外空间填充零。不使用长度自变量。showa语句将显示诸如“My name is Alex.I am 23 yearsold”的消息。在introbuf中的任何后面的零码被系统绘图例程跳过。packz introbuf;;My name is<<a,name>>。I am<<s,age>>years old.showz introbuf
例3
基于变量number,文本negative、zero或positive被有条件放入设定count为被传送字符的数目的textBuf,End-of-line用作SELECTOR分隔符。在textBuf中的未用空间填充零。
packzc  number;textBuf,count
        negative
        zero
        positive
例4
缓冲区texDate设定到具有今天日期(例如“January 1,1993”)的字符串。变量temp用来保存月份,直到与日和年一起组装进textDate。注意在packzc命令上的三个空自变量:第一个表示不需要长度信息;下两个处理不可能是month的SELECTOR负和零的情况。
define    local
today,   4
.         year,2
.         month,1
.         day,1
temp,9
textDate,20
define    end
*
date      today       $$获得系统日期信息
*
packzc month;temp;;;;January;February;March;April;May;June;July;August;September;0ctober;November;December
*
at 5:10
showa     textDate  $$显示今天的日期
page(页)
     选择用于绘图和显示的硬件屏幕页
page  showpage[,writepage]
      showpage page number to display(要显示的页号)
      writepage  page to plot on(要绘图的页)
说明
某些显示硬件具有几个单独的、完整的显示,称为“页”(page)。page命令用于控制这些显示。
page的一个变元形式将有效显示页改变到一个指定的显示页。该页的内容将立即显示,并且在该页上将进行所有进一步的绘图活动。
有两个变元形式使该页首先被显示然后使该页用于所有进一步的绘图活动。这使得程序能够在存储器中构建一个新的隐藏页,同时用户在观看显示页。
进入新的主单元只删除被选择用于绘图的页。
可用的页数取决于所使用的显示硬件、可用的显示存储器、以及所选择的屏幕分辨率。系统变量zmaxpage包含当前屏幕所支持的页数。
例子
以mode xor(异或模式)作一个名为“鱼(fish)”的图像的动画。因为以modexor重新显示一个对象会在显示中完全删除它,所以在一个动画的对象必须穿过其它对象又不破坏它们时,将采用mode xor。若没有page、mode xor,动画通常会闪动得太厉害,以致于不能使用。
页1用于在奇数的x位置201、203、205等上显示图像。
页2用于在偶数的x位置202、204、206等上显示图像。通过各页的交替,使图像显示在201、202、203、204、205、206等上。
screen    ega,graphics,medium,color
define    local
x,2
define    end
*设置模式并将图像载入存储器
mode      xor
image     move;block,‘fish’;memory,‘fish’
*在页1上显示第一图像
image     plot;memory,‘fish’;201,100
*在显示页1时
*删除页2并在其上放入下一个图像
page      1,2
erase
image     plot;memory,‘fish’;202,100
loop      x
Figure C9880941502431
201,400
●        *显示页2同时改变页1上的显示
●        *...重新显示(从而删除)页1上的旧鱼
●        *...并在页1上显示向右移2个象素的新鱼
●      *然后将x位置计数器递增1
●      page  2,1
●      image plot;memory,‘fish’;x,100
●      image plot;memory,‘fish’;x+2,100
●      calc  x
Figure C9880941502441
x+1
●      *在改变页2上显示的同时一直显示页1
●      page 1,2
●      image plot;memory,‘fish’;x,100
●      image plot;memory,‘fish’;x+2,100
endloop
   系统变量
   zrpage    当前显示页
   zwpage    被写入文本和图形的页
   zmaxpage  屏幕类型可用的最大有效页数
palette(调色板)
     改变调色板
palette  keyword(关键字)
         init    将调色板初始化为缺省状态
         set     设置用于单个调色板条目的色彩值
         read    从硬件读出调色板条目到变量
         write   将变量中的调色板条目写入硬件
         color   将色彩关键字与调色板条目相关联
说明
改变基于调色板(palette)的显示硬件:EGA、MCGA、VGA、EVGA和兼容图形适配器的可用色彩设置。palette支持几种不同功能:
●改变全部或部分的当前调色板;
●读出全部或部分的当前调色板设置到变量中;
●根据不同的调色板条目改变色彩关键字。
“调色板”是分配给硬件色栏(slot)的色彩集合。VGA屏幕具有16个色栏,MCGA和EVGA具有256个色栏。“标准调色板”是用于这些色栏的缺省值的集合。
每种色彩是三个色彩值:红、绿、蓝的组合。它们一起被称为RGB。有些模式还采用一个强度字节来指示每个色彩的相对亮度。对于TenCORE,标准调色板采用下列的色彩分配:
0-黑   4-红   8-黑+   12-红+
1-蓝   5-紫红 9-蓝+   13-紫红+
2-绿   6-棕   10-绿+  14-棕+
3-青   7-白   11-青+  15-白+
在栏号和它包含的RGB值之间没有固定关系。它们只有在同一屏幕上显示多于一幅图像时才相关。如果各幅图像使用不同的调色板,则只有最近显示图像的调色板有效。由于其它图像要使用相同的色栏,所以在不同的调色板变得有效时,这些色栏的色彩会变化。因此,需要为在屏幕上显示多幅图像而仔细规划公共调色板。
每当进入新的主单元时将恢复缺省的调色板。通过palette修改符在修改调色板之后执行status save(状态保存)来改变缺省的调色板。通过执行statusrestore;standard;palette(状态恢复;标准;调色板)将调色板复位成palette init[;number]。
将调色板初始化到它的标准缺省状态。在支持多个缺省状态的卡上,则number(序号)指定所需的缺省调色板。
palette set;COLOR,red,green,blue,[,intersity]
按照COLOR,设置红、绿、蓝的值,以及所引用的调色板色栏的可选强度。调色板色栏可以由序号或色彩关键字来指定。
COLOR是所用硬件的有效硬件色彩数。red(红),green(绿),blue(蓝)和intensity(强度)的范围为0到255。对于不支持如此宽范围的硬件,对这些值自动进行定标:255=满强度,128=半强度等。系统变量zpalincr标识色彩值的最小有效增量,zintincr表示强度的最小有效增量。
intensity只对两种屏幕类型有效:ega,graphics,low以及ega,graphics,medium。对于其它的屏幕类型,zintincr为0,且忽略了强度值。这样在这两种屏幕类型中任一类型屏幕上原先产生的调色板用于另一屏幕类型时,会出现问题:它会导致新类型屏幕上调色板的“暗化(dimming)”。这是因为不再有强度信息,并且必须通过调节调色板的RGB值进行强度校正。
palette read;buffer,number
读出所请求的调色板条目号进入变量buffer(缓冲区)。下面将解释buffer的结构。
palette write;buffer,number
写入变量buffer中的所请求的调色板条目数。下面将解释buffer的结构。
palette color;COLOR,slot
将TenCORE色彩关键字与调色板色栏相关联。TenCORE色彩缺省地按照最初的16个调色板色栏来命名。color选项允许作者改变对应于给定色彩名称的调色板色栏。
调色板变量
关键字read(读)和write(写)允许从缓冲器读出调色板色栏条目或将其写入缓冲区。调色板缓冲区包括一个或多个6字节的调色板条目,其形式如下:
slot(色栏)      (2字节)
red(红色)       (1字节)
green(绿色)     (1字节)
blue(蓝色)      (1字节)
intensity(强度) (1字节)
在执行read或write之前必须为每个调色板条目设置slot值。通过设置合适的slot值可以读出或写入调色板条目的任何子集。
例子
为了读出缺省16个TenCORE色栏的调色板信息:
define    local
palette(16),6
.         slot,2
.         red,1
.         green,1
.         blue,1
.         intensity,1
count,   2
define    end
*
loop    count 1,16
*       必须记住要初始化色栏号
.       calc  slot(count)
Figure C9880941502472
count-1
endloop
*
palette read;palette(1),16
      系统变量
      zpaliner当前屏幕类型色彩值的最小有效增量
      zintincr当前屏幕类型强度值的最小有效增量
PAUSE
      在发生事件之前暂停执行
pause[time;][flow=all|EY/s;][pass=all|KEY/s]
pause[time;]testkeys=all|KEY/s
                 time在继续执行之前延时秒数
                 flow=用于flow转移的按键列表
                 pass=继续执行的按键列表
                 testkeys=类似pass=但没有从输入缓冲区中删除按键
说明
在一个如按压按键等的接受事件出现之前停止执行命令。按压按键可消除暂停并继续或执行flow定义的按键转移。若由pause处理按压按键,则正常情况下从输入缓冲区中删除它,并更新如zinput等的系统输入变量来反映新事件。
任何由break修改的flow转移总是起这样的作用:中断任何pause以执行其任务。其它的flow转移在pause时是有效的,只要它们的按键在flow=keylist(按键列表)上有设定。无论哪种情况,如果flow是do或library转移,则在子例程结束时,控制均返回到pause。
如果设定了时间,则此限时结束时会使运行时钟发出缺省的%timeup按键。在pass=keylist中自动包含%timeup按键。除非先发生其它某些接受事件,%timeup允许执行继续。如果在时间设定的pause期间出现flow do或flowlibrary转移,则计时被挂起,直到子例程将控制返回到pause,然后计时恢复。
如果需要列出所有选项,则可以将pause命令扩展几行。空白命令字段表示连续。
pause
无标记的pause命令将等待,直到某时出现继续命令执行的事件。这就设置了暂时程序中止:用户按压任何按键,程序将继续。只有由break修改的flow转移能够改变下一个命令的必然执行过程。
例子
write   Press Any Key to Continue
pause
write   Good,now let’s open the valve and see what happens......
pause time
仅具有计时的pause命令强迫进行设定时间的延时。只有由break修改的flow命令能够中断延时过程。忽略和删除按键输入缓冲区中的任何其它事件。对于不清空在延迟期间产生的事件的输入缓冲区的强制延迟,使用delay命令。
只有一个缺省计时器按键即%timeup,用于pause和time这两个命令。在pause中的计时将取代前一个time命令设置的任何缺省时间。
例子1
at     5:10
write  some text...
pause  5
at     7:10
write  some more text
在5秒延时之后,将附加文本添加到显示器。
例子2
flow   do;%f5;data;break
...
time   30
...
pause   5
程序将暂停5秒,前一计时(time 30)将取消。如果按压[F5],则该定时将挂起,同时将完成跳到单元data的由break修改的flow转移。在返回后,pause将等待剩下的时间。
pause[time;]flow=all|KEY/s
带有flow=keylist的pause只允许特定或所有flow转移工作。如果发生do或library转移,则控制将在子例程结束时返回到pause命令。任选地,可利用计时来在给定数秒之后结束pause。由break修改的flow转移总是占先,无论它们是否被列出。
例子1
pause    flow=all
在发生任何flow转移以前,暂停程序。将不会执行pause后的代码。
例子2
flow     jump;%f1;out
flow     do;%f2;info
flow     do;%f3;data
pause    10;flow=%f1,%f2
除非按压[F1]以jump(跳转)到单元out,则程序暂停10秒。如果按压[F2],则该计时将挂起,同时将完成作为子例程的单元info。在从单元info返回之后,pause将等待剩下的时间。在该暂停处,单元data是不可访问的,因为其转移按键不在flow=kevlist中
pause[time;]pass=all|KEY/s
带有pass=keylist的pause允许特定或所有按键通过pause,以便继续执行下面的命令。任选地,可利用计时来在给定数秒之后结束pause,所得到的%time up按键是pass=keylist中的自动输入条目。此处只有由break修改的flow转移工作并且比在pass=keylist中的任何按键占先。
例子1
选择页允许用户选择要学习的主题。在pause期间选择了一个选项之后,程序继续,(用自变量)跳转到适当的课程部分。跳转到单元index的由break修改的转移是能够在pause期间发生的唯一flow分支。
flow     jump;%f1;index;break
flow    jump;%f2;notes
...
write   Choose an option;
        a.anthracite coal
        b.bituminous coal
        c.peat
pause   pass=a,b,c    $$只接受a,b,c
if      zinput=“a”
        jump      unita(3,5,1)
elseif  zinput=“b”    $$其它等等
...
例子2
pause  10,pass=a,b,c,d,e,f,g,h,i,j,k,l,m,
                 n,o,p,q,r,s,t,u,v,w,x,y,z,
                 0,1,2,3,4,5,6,7,8,9
pause命令标记可扩展几行。此pause将等待10秒或直到按压了一个所列出的按键。
例子3
write    lots and lots of text
         over many,
         many lines.
nextkey  clear
pause    pass=a,b,c
如果有诸如在大型显示器上的时间消耗代码,则在执行pause命令之前可在输入缓冲区中对各按键进行堆栈。pause处理这些等待按键直到它处理完为止。有时需要这样做,因为这使用户可以先打字。如果不需要先打字,则在pause之前使用nextkey clear语句。这将清空所有待用按键的按键缓冲区。
pause[time;]flow=all|KEY/s;pass=all|KEY/s
flow=keylist和pass=keylist可以均出现在同一语句中,其中pass=keys比flow=keys占先。或者,可以利用计时来在给定数秒后结束pause。由break修改的flow转移按键在所有情况下均工作。
可以在任何一个按键列表中置入伪按键值%other来包括所有没有单独指定的按键。如果置入flow=keylist(或通过使用all关键字),则会激活任何带有%other伪按键的flow语句。
例子1
pause    flow=all;pass=%other
所有flow按键是有效的。所有其它按键均通过pause并继续执行该单元。
例子2
flow   jump;%timeup;timeout
...
time   10
pause  flow=all;pass=a,b,c
这里计时已经在以前设定,并且不能被pause语句重设。当系统产生%timeup按键,则会出现跳转到单元timeout的flow转移。
例子3
flow  jump;%f1;=exit
flow  jump;%f2;index
flow  do;%f5;data
flow  jump;%timeup;timeout
...
pause 10;flow=all;pass=a,b,c,%pointer
按压[A],[B]或[C]或点击任何指示设备,将通过该pause并继续下面的命令。任何设定的flow按键(不包括%timeup)执行为它们定义的flow功能。如果10秒内没有出现其它的接受事件,则继续执行pause后面的命令。控制不会传递到单元timeout,因为pause命令的定时会自动在pass=keylist中包括%timeup,这比flow赋值占先。
例子4
flow  jump;%f1;=exit
flow  jump;%f2;index
flow  do;%pgup,%pgdn;nextunit
flow  do;%other;badKeys
...
pause  flow=all;pass=a,b,c,%space,%f2
按压[A],[B],[C][]或[F2]将通过pause并继续下面的命令。不采纳%f2 flow转移,因为该按键在占先的pass=keylist中。%f1 flow转移和其它flow转移将工作,因为flow=all。没有包括在pass=keylist中也没有在其它flow语句中定义的按键执行flow do以转到单元badKeys,后者处理未预期的按键。
pause[time;]testkeys=all|KEY/s
testkeys=形式上与pass=类似,除了在输入缓冲区中不删除通过的按键这一点。这用来要测试待用输入,因为要更新诸如zinput的系统输入变量。在下一个输入处理点(pause,arrow,nextkey,end-of-unit)到来之前,要在输入缓冲区中保持通过的按键。testkeys=是nextkey test命令的pause形式。
testkeys=不能以其它按键列表形式出现
例子
pause    testkeys=0,1,2,3,4,5,6,7,8,9
long     1,judge
arrow    10:10
answer   3
.        write  Great!
Wrong    2
.        write No,that’s Mars.
Wrong    1
.        write No,that’s Mercury
...
endarrow
只有数字键会结束pause。由于在testkeys=形式下没有从输入缓冲区中删除通过的按键,它将保持到下一个arrow的输入。在屏幕上的arrow处显示之后,因long1,judge,该按键马上引发一判断。
废弃形式(Obsolete Form)
在这里,系统前面版本的模糊的keys=形式将被清晰的pass=和flow=keylist形式代替。不可能只通过查看keys=keylist来预测是否一个被列出的按键将执行一个flow转移或通过pause到下一个命令。若由于向上兼容的原因keys=形式仍工作,则建议用户切换到新的不模糊的形式。
   系统变量
   每当pause处理一个按键时,要更新与输入相关的系统变量。
   zinput    最近的按键按压、指示设备输入、或伪按键
   zinputa   引起当前zinput值的区域ID
   zinputf   在发生事件时键盘情况的位图
   zinputx   在发生事件时指示设备的x坐标
   zinputy   在发生事件时指示设备的y坐标
   zkeyset   键盘扫描码
   zpcolor   在发生事件时指示设备下的屏幕色彩
perm
   管理排列(permutation)表
perm  关键字
      create    在存储器中产生排列表
      next      从排列表中获得下一个号码
      remove    从排列表中删除特定的号码
      replace   将特定的号码放回排列表
      copy      复制排列表
      delete    从存储器中删除排列表
      reset     从存储器中删除所有排列表
      read      将排列表读出给变量
      write     将变量中的列表写入排列表
说明
通过perm命令可以提供排列管理选项,从而可以随机选择、删除或替换号码列表中的一个号码。可以同时访问多个排列表。可以在会话之间在任何时间在存储器或者盘片中保存和恢复复制的排列表,以便能够进行任意的排列。
可以在一个系统default(缺省)缓冲区或任何数量的命名缓冲区中创建排列表。如果可能,使用default缓冲区将简化使用排列过程,因为不能删除名称自变量。用于perm命令的default缓冲区由所有单元共享。
在存储区组中将排列表缓冲区作为存储块。存储区组用于下列命令:memory,image,window,status,area,flow,font和perm。在创建时,按照所属特定命令的类型来标记存储块,而且每个存储块不能被使用该存储区组的其它命令访问;不同命令能够为一个存储块使用相同名称而没有冲突。
perm create;length[;‘NAME’|default]
创建一个从1到特定长度(最大32,767)随机排序的不重复的整数排列表。将该表作为存储区组中的default或者用户命名的缓冲区来保存。创建一个新的default列表来自动代替default缓冲区中以前使用的列表。如果已经存在一个命名列表,则创建该命名列表将产生一个错误。如果想再次使用相同的名称,需首先使用delete选项。
例子1
创建一个整数值从1到10的缺省排列表。
perm  create;10
例子2
创建一个整数值从1到25的排列表,将该排列表保存在名为puiz1的存储块中。
perm  create;25;‘quiz1’
perm  next;variable[;‘NAME’|default]
随机选择一个排列号并将其代入一个变量。如果该排列表为空或出现一个错误,则从排列表中删除所选的号码,并返回0。
例子1
从缺省排列表中得到下一个号码,并将其代入变量question,再从该列表中删除该号码。
perm  next;question
例子2
类似例子1,但号码来自命名列表quiz1
perm  next;question;‘quiz1’
例子3
在缺省缓冲区中创建有5项的排列表。在一个循环内,在单元Q1到Q5中的5个问题以随机次序出现。当列表穷尽时,变量question中的0值用来跳出该循环结构。
perm    create;5                                $$创建缺省排列表
jump    zreturn;;error
loop
.       perm     next;question                  $$得到下一个排列号
.       do question;;;Q1;Q2;Q3;Q4;Q5      $$调用问题
outloop question=0                              $$若完成则跳出循环
endloop
perm    remove;itemNumber[;‘NAME’|default]
从排列表中删除特定项。该整数将不再对perm next语句的选择有效。
例子
从缺省排列表中删除在problem中的值。
perm  remove;problem
perm  replace;itemNumber[;‘NAME’|default]
将特定项放回排列表。该整数将再次对perm next语句的选择有效。
例子
将problem中的值放回缺省的排列表
perm    replace;problem
perm   copy;[‘FROM’|default];[‘TO’|default]
复制排列表。如果被复制成的列表已经存在,则重写它。default列表在该语句中仅出现一次。
例子1
将排列表first复制到命名列表second
perm    copy;‘first’;‘second’
例子2
将缺省排列表复制到在变量newList中命名的列表
perm    copy;default;newList
perm    delete[;‘NAME’|default]
    从存储器中删除一个排列表
perm    reset
    从存储器中删除所有的排列表
perm    read;permBuffer[,length][;‘NAME’|default]
将排列表读出到给定字节长度的特定缓冲区。如果未规定长度,则采用缺省的缓冲区长度。
perm命令的read和write形式用于在学习者会话期间在盘片上保存和恢复排列表。
缓冲区的结构如下:
  项目   字节
  perm版本   2
  列表长度   2
  剩余项的数量   2
  项目位图   N
格式化项目位图以便每个比特对应于排列表中的号码:如果该比特为“1”,则该项仍有效;0表示它已被删除。例如,如果将第3位设置成1,则第3个号码仍未从排列表中删除。项目位图的长度由列表长度来确定。由于每个字节保存有8项的状态,所以N等于列表长度除以8再取整。其计算过程可以是int((长度+7)/8)或((长度+7)÷8)。
perm  write;permBuffer[,length][;‘NAME’|default]
将来自缓冲区的给定字节长度写入排列表。如果未规定长度,则使用缓冲区的定义长度。
系统变量
zreturn
-2    冗余操作:利用列表中已有号码来替换用过的号码或利用已删
                除的号码来删除用过的号码
-1    操作成功
3     超出范围:试图创建大于32,767的列表或者试图删除或替换大
                于列表长度的号码
6     利用create复制名称
10    没有发现名称
17    试图写入无效的排列表数据
18    存储区组空间不足
polygon
      画一个多边形
polygon[LOCATION];[LOCATION];[LOCATION]...[;fill]
说明
利用规定的LOCATION(位置)作为顶点以前景色彩画一个多边形。可选修改符填充项规定该多边形的填充内容。只有外凸多边形可被填充。内凹多边形必须被分成多个外凸多边形(见下面)。最少必须规定3个顶点。最多可定义50个顶点。如果最后的顶点与第一顶点不匹配,就连接它们。
多边形有尺度比例、旋转方向和宽度的变化。填充多边形只有在水平线正好与多边形的两点相交时才有用。
将一个内凹多边形分成多个外凸多边形,将产生所需的形状。
polygon 0,100;200,0;200,100        $$画一个三角形
polygon 10;10;10∶20;20∶20;20∶10  $$画一个矩形
polygon 0,100;200,0;200,100;fill  $$画填充多边形
press
    产生一个输入值
press  KEY|expression[;first]
press  KEY|expression[;inputF[,inputX,inputY[,inputA]]][;first]
说明
press命令将一个特定键放入输入缓冲区,就象按压键盘一样。在下一个输入处理处(pause,arrow,nextkey或end-of unit),该按键将被处理并执行一个类似的实际按键按压操作所执行的功能,这包括更新系统变量zinput。
可选修改符first使得该按键插入在等待进入输入缓冲区的其它按键之前,即它将首先被处理。
任选地,系统变量ziputf,zinputx,zinputy和zinputa的值按照该按键被处理时的zinput来设定。如果未规定变量值,则将相应的系统变量设为0。
press的KEY值是有限的:没有嵌入和简单的a,b,c形式。然而,该按键可以是常数、变量或计算式等的表达式
例子
例子1
将%space放入输入缓冲区,就象在键盘上按压的一样
press    %space
例子2
在等待处理的其它按键之前,将%F1放入输入缓冲区,首先处理它。
press    %F1;first
例子3
通过将按键值%pointer以及位置和区域ID信息放入输入缓冲区,来模拟一个指示设备的点击。在下一个输入处理处,zinpunt=%pointer,zinputx=320,zinputy=240,以及zinputa=5。由于没有为zinputf规定任何值,所以将其设置为0。
press  %pointer,,320,240,5
例子4
在问题处的尝试不成功之后,为学习者打出正确答案的最初几个字母,就象在箭头处输入的一样。
write  Who is burieed in Grant’s tomb?
arrow
answer 《U,Ulysses,S》Grant
no
.      write Press any key for a hint
.      pause
.      press  %enter    $$删除错误
.      press  %“G”
.      press  %“r”
endarrow
     系统变量
     zreturn
     -1    操作成功
     0     按键缓冲区上溢
print
     向打印机发送输出,或改变打印参数
print  variable(变量),length(长度)
print  initial;prn|lpt1|lpt2|lpt3|com1|com2
print  initial;file,‘FILENAME’[,length]
print  end
       buffer  打印机输出的变量缓冲区
       length  发送给打印机的字节数
       initial 改变打印机设备
       end     结束网络假脱机(spooling)并将打印机复位到lpt1
说明
将特定数量的字节发送给标准的打印机设备lpt1,或发送到由printinitial规定的另一设备或文件。
print的合法设备是:
     prn,lpt1,lpt2,lpt3,com1,和com2。
initial关键字改变用于打印的设备。根据file的形式,设定一个文件名。ASCII文件名字串可包括驱动器和路径,而且必须终止于一个空字节。如果未规定长度,则使用该变量的定义长度。
如果已经存在该特定文件,为了准备打印将其初始化为0长度。
end关键字清除任何按照print initial建立的打印机连接。在一个网络系统上,它还终止打印机输出假脱机程序并启动打印程序。
如果print initial没有专门指定,则输出被发送到lpt1。
print仅将特定的字符发送到打印机。打印机控制字符没有被添加到输出。打印机控制代码请参照制造商的手册。
大多数打印机在每行的末尾需要ASCII回车符代码(h0d)或回车/换行序列码(h0d0a),以便将打印头和纸张放置到下一行的位置。
技术上的注意:当没有有效的打印机连接时,打印机输出将发送到BIOSINT 17H打印机驱动器,即正常情况为lpt1的设备0,如果它没有被重新指向的话。当打印机连接有效时,打印机输出通过DOS“写”调用被发送到该设备。
例子
例子1
打印一个报告的标题行。用户名被保存在usename中。注意其中包括回车/换行序列码。
define    local
username,20        $$用户名
text,100v          $$要打印的文本
textlen,2          $$要打印的文本的长度
CRLF=h0d0a         $$回车并换行
define   end
*
packz    text;textlen;Test results for《showa,username》
         《showa,CRLF》
*
print text,textlen    $$打印该行
例子2
将未来打印机重新指向到lpt2
print initial;lpt2    $$初始化lpt2
例子3
将未来打印机重新指向到文件C:\TENPRINT.PRN
define  local
filenarme,40
define  end
packz   filename;;c:\tenprint.prn    $$将文件名置入变量
print   initial;file,filename         $$将输出重新指向文件
    系统变量
    zreturn
    -1    操作成功
    0     盘片错误(见zdoserr和zedoserr)
put
    将一个字符串替换成另一个字符串。
put  fromTEXT;to TEXT[,buffer[,length]]
     fromTEXT 要查找和替换的文本串
to TEXT   替换的文本串(可以为空)
buffer    用于执行替换的用户变量缓冲区
length    缓冲区的最大长度
说明
在箭头处的学生响应缓冲区中或在任何专用的缓冲区中利用to TEXT替换出现的每一个fromTEXT。TEXT没有引号并且可包含嵌入显示命令。
例子
例子1
显示如何使用put来在回答判断中将缩写语改变成等效于它的完整词语。
write    what is the biggest US city?
arrow    10:10
put      NY,New York
answer   New York
.        write  Great!
endarrow
例子2
在缓冲区mystring中,利用“elephant(大象)”来替换出现的所有“dog(狗)”。
put    dog,elephant,mystring
例子3
from和to字符串均可使用嵌入文本。
put    《a,oldchars,oldlen》,《a,newchars,newlen》,textvar,length
例子4
产生24小时类型的时钟显示。如果小时或分钟小于10,则十位将包括一个来自pack的showt的空格。put将利用数字0替换任何var中的空格
pack    var,length,《show,hrs,2》:《showt,minus,2》
put     ,0,var,length     $$from字符串中只是空格
*                            用0替换空格
showa   var,length
    系统变量
     zreturn
     -1    操作成功,进行所有可能的替换
     0     用于替换的空间不足
     杂项
     zlength    替换后文本串的长度
     znumber    替换的次数
     zcount     响应缓冲区的长度,如果使用的话
receive
     接收传递到一个子例程的自变量值
receive自变量/16s
说明
接收传递到子例程的自变量,并将它们的值置入具体的变量。空自变量由自变量列表中的空格入口(,,)来规定。
do,library,jump和jumpop命令可以传递自变量。receive具有如下特点:
●在自变量中的任何元素可以为空。自变量列表中的空元素使相应
  的传递值被忽略。
●用作接收自变量的文字引起缺字(condense)错误。
●只有数值整数和实变量在自变量列表中有效。在这里,八个或更
  少字符的文本变量可以被认为是数值变量。
●可以执行任意数个的receive命令,并且可以执行任意次的任何
  receive命令。每次执行receive时,使用最初传递的自变量。
●插入对其它(能够接收或返回自身自变量的)单元的调用不会影响
  在当前单元中接收的值(传递值对于各个单元来说是本地的)。
●如果发送空自变量,则receive列表中的相应元素不变化。
●正常条件下,接收的自变量数目必须与传递数目匹配,否则会出
  现执行错误。利用nocheck receive可以重设执行错误。
例子
单元one将自变量传递给子过程circles。
one
.
.
.
do    circles(160,100,5)
.
.
.
circles
define    local
x,       2    $$圆心
y,       2
n,       2    $$圆数
r,       2    $$圆半径
define    end
*
receive   x、y,n
at        x,y
loop      r 10,n*10,10
.         circle  r
endloop
     系统变量
     zargsin    发送到子例程的自变量(包括空字符)的数目
     zargsout   期望返回的自变量的数目
     zargs      实际接收的非空自变量的数目
reloop
     返回到一个循环结构的开始点。
reloop  [条件]
说明
用于重新启动循环结构。如果标志符为空或条件为真,reloop返回到循环结构的开始处,就象执行了endloop一样。如果条件为假,则继续执行下面的命令。reloop总是出现在与它返回到的loop命令相同的缩排级上,而不管围绕reloop的其它缩排结构。
要了解循环结构的更多信息,参见loop命令
例子
跳过counter(计数器值)为13这种情况的ITERATIVE(迭代)循环。
define    local
index,2    $$循环计数器
define    end
*
loop     index
Figure C9880941502641
1,20
reloop   index=13
.        at index:5
.        write   Tiffs is line《show,index》
endloop
return
     可选返回自变量地结束子例程的执行
return[自变量/16s]
说明
马上跳出当前单元,如果它被d0或library调用。如果该单元没有被do或library调用,则出现执行错误。
空标志符形式将跳出该单元而没有将自变量传递回主调单元。
如果规定了返回自变量的列表,则备值将返回到主调单元。返回列表中的空入口使接收自变量列表中的相应值保持不变。
要了解更多自变量传递信息,参见receive和nocheck命令的说明。
例子
单元test调用子例程square,向它传递一个自变量。子例程square接收该自变量,利用它进行计算,然后将所得结果返回到单元test中的变量numsquar。
test
.
.
do   square(12,numsquar)
show  numsquar
.
.
square
define    local
number
number2
define    end
*
receive   number
calc      number2 number*number
return    number2
     系统变量
     杂项
     zargsin    包括空的发送到子过程的自变量的数目
     zargsout   调用do或library希望返回的自变量的数目
     zargs      由receive实际接收的非空自变量的数目
rotate
     旋转后续图形对象
rotate[degrees[;LOCATION]]
说明
将所有后面绘制的图形对象旋转一定的度数(degrees)。除非规定选项location(位置),旋转逆时针从origin命令规定的绘图原点开始。规定旋转原点仅影响后面旋转的对象。
系统缺省情况为每个主单元中由initial和status restore;default设置的rotate 0(无旋转)。空标志符形式也设置无旋转的标准缺省状态。可以利用rotate之后由status save;default来改变该缺省状态。
包括rotate的图形变换命令的效果可以用enable absolute暂时挂起并利用disable absolute来恢复。
以下列次序来施加显示控制命令
scale
rotate
长宽比校正
origin
相对窗口坐标
窗口剪切
下面的对象不进行旋转:
文本
图形
窗口
规定用于字符和行的方框和删除框(例如,box 10,3)
为了旋转文本,参见text rotate命令。
例子
在屏幕的中央连续旋转一个方框
define  local
degree  ,2
define  end
*
origin  zdispx/2,zdispy/2    $$屏幕中央
mode    xor
loop
.       rotate  degree
        box     -50,-50;50,50;1  $$画方框
        delay   01
.       box     -50,-50;50,50;1  $$删除方框
.       calc    degree
Figure C9880941502661
degree+1
endloop
      系统变量
      zrotate    旋转的度数
     zrotatex    旋转原点的X坐标
     zrotatey    旋转原点的Y坐标
scale
     定标图形对象的尺寸
scale  [factor|Xfactor,Yfactor[LOCATION]]
说明
利用给定因子或分别规定的x(水平)和y(垂直)因子,对后续绘制的图形对象的尺寸进行缩放。例如,scale.5将使所有图形对象为原来的1/2大小,而scale 2,3将在x方向上将图形放大一倍,在y方向上放大二倍。除非规定可选缩放原点位置,尺寸相对于由origin命令规定的绘图原点进行。
规定缩放原点仅影响后续的缩放对象。
标准缺省情况为每个主单元中由initial和status restore;default设置的scale 1(无缩放)。空标志符形式也设置无标志符的标准缺省状态。可以利用status save;default来改变该缺省状态。
包括scale的图形变换命令的效果可以用enable absolute暂时挂起并利用disable absolute来恢复。
以下列次序来施加显示图形变换:
scale
rotate
长宽比校正
origin
相对窗口坐标
窗口剪切
下列对象不进行缩放:
文本
图形
窗口
规定用于字符和行的方框和删除框(例如,box 10,3)
例子
产生一序列同心方框
define    local
factor,  2
define    end
*
origin zdispx/2,zdispy/2
*
loop   factor 1,10
.      scale tactor
.      box    -10,-10;10,10;1
endloop
     系统变量
     zscalex    水平缩放因子(8字节实数)
     zscaley    垂直缩放因子(8字节实数)
     zscaleox   缩放原点的x坐标
     zscaleoy   缩放原点的y坐标
screen
     设置或测试屏幕的分辨率类型
screen       [test,]type[,mode][,resolution][,chrome]
screen       [test,]variable,type,mode,resolution,chrome
screen       native|edit
             type         关键字和值:
             cga          0
             ega          3
             vga          10
             mcga         11
             evga         1
mode         关键字和值
             graphics     0
             text         1
resolution   关键字和值
             low       0
             medium    1
             high      2
             alt1      3
             alt2      4
             alt3      5
Chrome       关键字和值
             color     0
             mono      1
test:       只检查是否特定设置作用并在zreturn中返回结果,没有实际
             改变设置
ative:      将屏幕设置到给定显示驱动器的可能最高设置(最大到vga)
edit:       将设置置入编辑器设置
variable:   采用数值而不是关键字以用于type,mode,resolution和chrome
说明
将屏幕硬件设置到规定的type(类型),mode(模式),resolution(分辨率)和chrome(色度)。屏幕设置的选择受所使用的显示驱动器、显示控制器和监视器的限制。在产生在各种各样的直接使用DOS软件平台的IBM PC上运行的课件时,需要选择与最低公共显示硬件兼容的屏幕设置。
正常情况下,screen命令在课程开始处的如+initial控制块中出现一次。
若screen命令改变屏幕设置,擦除屏幕,将显示页复位为1,并且所有绘图参数复位到standard(标准),如同执行了下述语句:
status  restore;standard
status  save;default
简化表示(Shorthand Notation)
可以不用输入所有自变量来选择最常见的屏幕设置。图形和色彩为缺省设置。分辨率常常缺省地设置成显示控制器类型的标准值。
 简化表示   全部具体形式
 screen cga   cga,图形,中分辨,彩色
 screen,cga,high,mono   cga,图形,高分辨,单色
 screen ega   ega,图形,高分辨,彩色
  screen,ega,medium   ega,图形,中分辨,彩色
  screen ega,low   ega,图形,低分辨,彩色
  screen vga   vga,图形,中分辨,彩色
  screen,mcga   mcga,图形,中分辨,彩色
  screen,mcga,high,mono   mcga,图形,高分辨,单色
  screen evga   evga,图形,高分辨,彩色
  screen,evga,medium   evga,图形,中分辨,彩色
例子
例子1
选择640×480×16色(vga,medium,graphics,color)屏幕。如果这种屏幕设置不可能,则在一转移使用户跳回到调用系统之前,给出一个消息。
screen  vga
if    not(zreturn)  $$看看是否不能设置屏幕
.     write  Warning
             VGA Screen Type not available.
      pause
.     jump   =exit  $$跳到路由器(router)或DOS
endif
例子2
测试是否1280×1024×256色屏幕有效。如果有效,则采用化学课的高分辨率版本。如果无效,则使用该课程的较低分辨率版本。
screen   test,evga,alt2
if       zreturn  $$看是否真(-1)
.        jump     chemHigh,start  $$使用高分辨率版本
else
.        jump     chemLow,start   $$使用较低分辨率版本
endif
    屏幕类型和显示驱动器
  Screen     Pixels Palette Colors Chars CharSize DisplayDrivers
IBM标准
cga,medium       320x200   4    16       20:40     8x10    CEVS
cga,high         640x200   2    16       20:80     8x10    CEVS
ega,low          320x200   16   16*     20:40     8x10    EVS
ega,medium       640x200   16   16*     20:80     8x10    EVS
ega,high         640x350   16   64*     25:80     8x14    EVS
mcga,medium      320x200   256  262,144 20:40     8x10    VS
mcga,high        640x480   2    262,144 30:80     8x16    VS
mcga,high,color 360x480   256  262,144 30:45     8x16    VS
vga,medium       640x480   16   262,144 30:80     8x16    VS
增强VGA***
vga,high         800x600   16   262,144 33:88     9x18     S
vga,alt1         1024x768  16   262,144 38:102    10x20    S
vga,alt2         1280x1024 16   262,144 42:106    12x24    S
evga,low         640x400    256 262,144 25:80     8x16     S
evga,medium      640x480    256 262,144 30:80     8x16     S
evga,high        800x600    256 262,144 33:88     9x18     S
evga,alt1        1024x768   256 262,144 38:102    10x20    S
evga,alt2        1280×1024 256 262,144 42:106    12x24    S
   * 若使用VGA.DIS或EVGA.DIS,则可能的色彩数是262,144
   ** 持每个屏幕的显示驱动器由下列字母表示
C    CGA.DIS
E    EGA.DIS
V    VGA.DIS
S    EVGA.DIS
   ***支持大多数超VGA卡,直接或通过VESA标准
   系统变量
   zreturn
       screen命令将zreturn设置成下列各值:
   -2  ok,屏幕不变;已经生效的所请求的屏幕
-1    ok,屏幕改变(对于screen test形式没有变化)
0     对于显示驱动器文件的无效屏幕
1     显示驱动器不支持所请求的屏幕
若成功执行了screen命令,则下面的系统变量集合被复位。对于screentest形式它们没有变化。
zscreent  选择的屏幕类型
0         cga
2         hercules
3         ega
9         att
10        vga
11        mcga
14        evga
zscreenm  屏幕寻址方式
0         graphics(图形)
1         text(文本)
zscreenr  屏幕分辨率
0         low(低)
1         medium(中)
2         high(高)
3         alt1
4         alt2
S         alt3
zscreenc  屏幕色度
0         color(彩色)
1         mono(单色)
zscreen   BIOS报告的屏幕类型
  值   内容   屏幕命令
  0   40x25;text;mono   cga,text,medium,mono
  1   40x25;text;16color   cga,text,medium,color
  2   80x25;text;mono   cga,text,gigh,mono
  3   80x25;text;16color   cga,text,high,color
  4   320x200;graphics;4color   cga,graphics,medium,color
  5   320x200;graphics;mono   cga,graphics,medium,mono
  6   640x200;graphics;mono   cga,graphics,high
  7   80x25;text(on MDA)   cga,text
  13   320x200;graphics;16color   ega,graphics,low
  14   640x200;graphics;16color   ega,graphics,medium
  16   640x350;graphics;16color   ega,graphics,high
  17   640x480;graphics;2color   mcga,graphics,high
  18   640x480;graphics;16color   vga,graphics,medium
  19   320x200;graphics;256color   mcga,graphics,medium
  106*   800x600;graphics;16color   vga,graphics,high
  107*   800x600;graphics;256color   evga,graphics,high
  108*   1024x768;graphics;16color   vga,graphics,alt1
  109*   1024x768;graphics;256color   evga,graphics,alt1
  113*   1280x1024;graphics;16color   vga,graphics,alt2
  114*   1280x1024;graphics;256color   evga,graphics,alt2
  *仅属于VESA兼容显示适配器
zscreenh    所使用的显示驱动器文件(.DIS文件)(针对实际检测的显示硬件进行调整:例如,如果EVGA.DIS检测到VGA硬件,则zscreenh将为0)
0           cga
2           Hercules
3           ega
9           att
10          vga
11          mcga
14          evga
zinaxcol    当前屏幕类型的最大色彩数
      zpalincr    需要对显示色彩有影响的RGB值的最小变化值(见
zintincr)
      zintincr    需要对显示色彩有影响的强度值的最小变化值(见
zpalincr)
      zmaxpage    最大可用页数
seed
      获得或设置随机数种子(seed)
seed     variable4[;set]
说明
在随机数计算中使用。每次产生新的随机数时,系统将种子设置成新值。随机数种子由perm命令和randi和randf功能使用。
当前种子通过对seed命令使用作为单个自变量的4字节整数变量来获得。种子通过设定4字节整数值(0到4,294,967,295)和使用set关键字来设置。在启动时,系统将种子初始化成zclock的随机值。
seed命令一般用于可重复的随机数序列:相同的随机数序列可以通过保存初始种子然后再恢复它来再次产生。例如,若从相同的种子值开始产生了两个排列表,则两表将相同。
例子
100个随机点的散布图首先被显示屏幕上,然后在暂停之后擦除。在第一次产生随机点之前保存种子,然后在第二次“擦除”所产生的相同点之前再恢复。
define local
save,4,integer
index,2
define    end
...
seed    save    $$保存种子
loop    index
Figure C9880941502741
1,100
.       dot    index,randi(100)
endloop
pause
mode  erase
seed  save;set  $$恢复所保存的种源
loop  index 1,100
set
将分列值赋值给连续的变量
set    variable
Figure C9880941502752
value1,value2,...
       variable  赋值的起始变量
说明
将value(值)列表赋值到连续的存储位置,从规定变量的位置开始。赋值箭头右侧的第一个值被指定成variable。此后,相同大小和类型的连续存储位置将作为variable被赋予该标志符中的剩余值,而不管后续变量会如何定义。在set中给定的变量常常是数组中的第一元素,但它可以是对于calc有效的任何变量。set的标志符可以在后续行的标志符字段中连续。
空“value”可用于跳过一个赋值。
例子
将一系列值赋值给一个数组(array)。注意未赋值array(3)并保持其初始值。
define    local
array(4),2
define    end
set  array(1) 15,96,,score*100
     or
set  array(1) 15,    $$多行连续
     96,,
     score*100
上述的set命令等效于下列calc命令:
calc    array(1)
Figure C9880941502755
15
calc    array(2) 96
calc    array(4)
Figure C9880941502757
score*100
setbit
     设置变量中的一位
setbit  variable,bit,value
        variable  包含要设置位的变量
        bit       要设置的位号
        value     位值(0或1)
说明
设置变量中单个位。利用该命令,单个变量可以用作多个一位的旗标,这就更有效地利用变量空间。
位1是最左侧(最高)位。规定的位号可以跨越变量边界。如果位设置值非0或1,则使用最右侧位值。
算术函数bit(value,bit)用于“read(读)”设置位,而bitent(value,bits)给出变量中设置位的计数。
例子
4字节变量correct中的单个位旗标用于跟踪为一个学生给出的25个问题的判断结果。index包含当前问题号。问题位于数组prob()中,答案位于数组answ()中。在完成测验之后,bitcnt函数用于显示正确答案的数目。
*  进行所有25个问题的循环,显示问题,
*  获得答案,并设置适当的标志
loop    index
Figure C9880941502761
1,15
.       at  5:3
.       showa    prob(index)    $$显示问题
.       arrow    20:3
.       answer   《showa,answ(index)》
.       .   setbit    correct,index,1    $$ok
.       no
.       .   setbit    correct,index,0    $$错误
.       . judge quit                       $$跳出箭头
.       endarrow
.       erase    $$为下一个问题清屏幕
endloop
*
at    25:3
write The number correct is《s,bitcnt(correct,25)》.
setc
    有选择地按列表值设置变量
setc  SELECTOR;variable
Figure C9880941502771
value/s;value/s...
      variable  指定列表值的起始变量
说明
set的选择形式。根据selector(选择符)的值,setc选择标志符中的一个列表值,并将这些值指定给连续的变量。
每个值列表必须用分号(;)分隔。一个列表中的各值必须用逗号(,)分隔。空值用于跳过赋值。setc的标志符可以在后续行的标志符字段中连续。
起始变量不必是数组。根据初始变量的长度和类型来指定后面的变量空间的连续字节。
例子
根据flag(标志),有选择地将一系列值赋值给一个数组。
define    local
array(10),4
flag,1
define    end
*
setc  flag,array(1)
Figure C9880941502772
1,2,3,4;
      4,3,2,1;;1,2,,8
上述的setc命令等效于下列命令:
if    flag<0
.     calc      array(1)
Figure C9880941502773
1
.     calc      array(2) 2
.     calc      array(3)
Figure C9880941502775
3
.     calc      array(4) 4
elseif  flag    =0
.       calc    array(1)
Figure C9880941502781
4
.       calc    array(2)
Figure C9880941502782
3
.       calc    array(3)
Figure C9880941502783
2
.       calc    array(4)
Figure C9880941502784
1
elseif  flag    =1              $$被跳过的选择
elseif  flag    ≥2
.       calc    array(1)
Figure C9880941502785
1
.       calc    array(2) 2
.       calc    array(4) 8
endif
     注意在最后赋值的列表中,跳过了array(3)。
show
     显示变量或数值表达式
show           表达式[,field[,right]]
write          《show|s,表达式[,field[,right]]》
field          要显示的最大十进制位数,包括小数点
right          要显示在十进制小数点右侧的位数
说明
显示数值变量或表达式的值。可选标志符控制数值显示的格式。显示的数值在字段中向左看齐,屏幕位置被更新到在最后显示字符(没有领头空格或拖尾零)之后的字符位置。
十进制小数点的左侧的位数等于field值减去right值减去1。
show显示特殊符号来表示下列错误情况:
******        要显示的数值不适合指定字段。
??????  该数值无效。常常是非法浮点运算的结果。
如果省略可选标志符,则使用下列缺省值:
  如果变量是 则缺省的field和right是
  1-4字节整数   20,0
  8字节整数和实数   24,3
例子
例子1
显示10个测验分数。
at     3:5
write  Here are your last 10 quiz scores:
loop   index 1,10
.      at   index+5:10
.      show   quizscor(index)
endloop
例子2
通过在write语句中使用嵌入的show命令,将标页号标题放置在显示的顶部。
1
*
at     1:65
write  Page    《show,page》of 50
showa
    显示在变量中保存的文本。
showa        buffer[,length]
write        《showa|a,buffer[,length]》
说明
将变量缓冲区的内容显示为length字符的字母数字字符。如果省略length,则使用缓冲区的定义长度。可以显示任何数值变量的内容,即使它包含非数值信息。
在showa之后,当前屏幕位置被更新到在最后显示字符后的字符位置。因在显示文本中的退出(escape)码序列而导致的对于绘图参数的任何改动,在showa之后继续有效。
例子
例子1
将用户名保存在stuname中,然后使用showa显示:
define     local
stuname,  20    $$用户名
define     end
*
at         3:3
write      Please enter your name.
Long       20
arrow      4:3
storea     stuname,zcount
ok
endarrow
at         8:3
write      Thank you,$$$保留拖尾空格
showa      stuname,zcount
write      .        $$在结尾处加入句号
例子2
在左上角显示当前课程的名称和单元:
at         1:1
write      《a,zlesson》:《a,zunit》
showh
    以十六进制表示显示数据
showh         buffer[,length]
write         《showh|h,buffer[,length]》
说明
以十六进制形式显示length位的数据。如果省略length,则使用足够的位数来显示变量的整个定义长度。变量的每个字节将显示成两个十六进制位。可以显示任何长度的变量。
在showh之后,当前屏幕位置被更新到在最后显示字符后的字符位置。
例子
显示实数变量的精确十六进制内容。
define     local
float,8,real           $$实数变量
define    end
*
calc      float
Figure C9880941502811
π      $$π值
at        5:3
write     πlooks like this in“hex”
at        6:3
showh     float
showt
    以制表格式显示数值变量或表达式
showt       variable[,field[,right]]
write       《showt|t,变量[,field[,right]》
field       包括领头空格、各位和十进制小数点的显示字段的总长度
right       十进制小数点右侧的位数
说明
通过按需插入领头空格和拖尾零来填充所需字段,以向右看齐的制表格式显示数值变量或表达式的值。
在showt之后,当前屏幕位置被更新到在最后显示字符后的字符位置。
缺省值
如果省略可选标志符,则使用下面的缺省值:
  如果变量是 则缺省的field和right是
  1-4字节整数   8,0
  8字节整数和实数   12,3
showt显示特殊符号来表示下列错误情况:
******        要显示的数值不适合指定字段。
??????  该数值无效。常常是非法浮点运算的结果。
例子
显示一个表格中的一些条目。
define   local
rate(4),8,real   $$  费率结束
define    end
*
calc      rate(1) 4.05
          rate(1)
Figure C9880941502822
12.76
          rate(1)
Figure C9880941502823
8.63
          rate(1)
Figure C9880941502824
5.25
at        5:3
write     Your payroll situation now looks like this:
at        7:3
write     EMPLOYEE    HOURLY RATE YEARLY SALARY
at        8:30
write     Anderson
          Carmen
          Engdahl
          Lillith
at        8:18
write     《t,rate(1),5,2》
          《t,rate(2),5,2》
          《t,rate(3),5,2》
          《t,rate(4),5,2》
at        8:31
write     $《t,rate(1)*2080,8,2》
          $《t,rate(2)*2080,8,2》
          $《t,rate(3)*2080,8,2》
          $《t,rate(4)*2080,8,2》
showv
    显示包括空码的文本缓冲区
showv         buffer[,length]
write         《showv|v,buffer[,length]》
说明
将缓冲区内容显示成字母数值字符,这包括如要在屏幕上实际画出而被转换成空格码的所有空字符(十六进制值h00)。不象showv,showa忽略空字符。
showv主要以其在pack和put命令的标志符中的嵌入形式来使用。在此情况下,showv将空字符作为其它字符来对待,而不忽略它们或将它们转换成空格。
在showv之后,当前屏幕位置被更新到在最后显示字符后的字符位置。
例子
showa画出“ABC”,而showv画出“AB  C”。
define    local
var,4
define    end
*
calc      var
Figure C9880941502831
h41  42  00  43  $$AB空格C
at        10:10
showa     var                      $$ABC
at        11:10
showv     var                      $$ABC
status
     保存并恢复显示状态信息
status  关键字
        save    在存储块中保存当前显示设置
        restore 从存储块中恢复显示设置
        delete  删除命名状态存储块
        reset   删除所有状态存储块
说明
在存储区组块或缺省缓冲区中保存当前绘画参数(如前景或擦除色彩、方式、字体等)。之后可以恢复所保存的状态,以便将所有绘图参数返回到它们的先前状态。status可用于保持在子过程调用期间的绘图参数,或通过复位到缺省状态来为课程的所有主单元提供共同的状态信息。恢复选项允许复原系统standard(标准)设置或在单元中前一arrow处的设置。
status保存和恢复下列项目:
●当前屏幕位置
●零边界(左右两边)
●所有装入的字体,包括当前和标准字体
●调色板(如果请求)
status也保存和恢复下列命令的设置。下面显示的是它们的系统standard设置。利用status restore;standard选项(或利用initial命令)可以作为一个块来设置它们的系统standard设置。
●    blink    off(关)
●    color    white(白)
●    colore   black(黑)
●    colorg   black(黑)
●    disable  cursor(光标)
●    enable   font(字体)
●    font     standard;standard(标准)
●    mode     write(写)
●    origin   0,0
●    rotate   0
●    scale    1,1
●    text    align;baseline(对齐,基线)
              bold;off(黑体关)
              delay;0(延迟;0)
              direction;right(方向;右)
              increment;0,0
              italic;off(斜体;关)
              margin;wrap(页边,换行)
              narrow;off(窄;关)
              reveal;off(展现;关)
              rotate;0(旋转;0)
              shadow;off,white(阴影;关,白)
              size;1(大小;1)
              spacing;fixed(间距;固定)
              underline;off,foregnd(下划线;关,前景)
              underline;off,foregnd
●    thick   off(关)
status save;‘NAME’|local[;palette]
status save;default[;palette]
在存储区组块或default(缺省)缓冲区中保存当前绘图状态。NAME(名称)可以是文本文字或被包含在变量中。之后能够在任何单元中恢复命名块。palette修改符也将使当前调色板设置得到保存。
关键字local将该状态保存在当前单元专用的存储区组块中。只有在保存本地块的单元中能够恢复本地块,当该单元的执行结束时将自动删除本地块。
在default缓冲区中保存该状态,将使得该状态成为通过jump转移进入的所有新主单元的缺省状态。
memory,image,window,status,areas,flow,font和perm命令使用存储区组。在创建时存储块被标识成属于特定的命令类型,并且不能被其它使用存储区组的命令访问。不同的命令可以使用相同的存储块名称,而不会发生冲突。
例子1
在+initial控制块初始化绘图参数,然后保存在缺省状态缓冲区中。对于所有后续的通过jump转移进入的主单元,这些设置变成缺省设置。erase命令用来在即使第一转移进入了该课程的情况下使屏幕呈现蓝背景。
*                在控制块+initial
initial
color   yellow
colore  blue
size    2
font    geneva
status  save;default
erase
例子2
在名称status1下将当前绘图参数和调色板保存在存储区组中。
status    save;‘status 1’;palette
status    restore;‘NAME’|local[;delete]
status    restore;default|arrow
status    restore;standard
用先前保存的设置替换当前绘图设置。如果最初保存了调色板,则恢复它。或者,可以使用delete修改符从存储区组中删除命名或local块。
arrow选项恢复在遇到上一arrow命令时所处的状态。不恢复调色板。
standard选项恢复系统标准绘图状态,但不包括调色板。为了恢复标准调色板,要使用palette init。
例子1
恢复缺省的绘图参数(上次由status save;default语句保存的那些参数)
status    restore;default
例子2
保存和恢复通过库调用的绘图和调色板设置。库例程(library routine)可以按需改变显示设置而且在返回时不影响调用程序。或者,status save和restore可以在库路径中建立,以提供更容易使用的工具。
status   save;local;palette
library  routines,graph
status   restore;local
例子3
恢复其名称包含在变量mystat中的设置。然后删除存储块。
status    restore;mystat;delete
status delete;‘NAME’|local
从存储区组中删除一个所保存的状态块
例子
从存储区组中删除所保存设置的page1设置
status  delete;‘page 1’
status reset
从存储池中删除所有的命名状态块。不会影响default,local,arrow和standard的缓冲区。
    系统变量
    zreturn
    -1    操作成功
    6     重名
    10    名称不存在(没有保存先前状态)
    16    无效名称
    18    存储区组中存储空间不足
text
    控制文本属性
text    关键字
        size      选择字体大小                       2
        bold      选择粗字体                         3
        italic    选择斜字体                         4
        narrow    选择窄字体                         4
        spacing   控制字符间隔                       4
        shadow    控制加阴影                         5
        underline 控制下划线                         6
        delay     设置字符之间的延时                 7
        increment 增加字符间隔                       7
        rotate    旋转文本基线                       7
        direction 控制相对于基线的绘图方向           8
        margin    控制边界处的文本换行符(wraparound) 9
        align     控制字体间对齐                     10
        reveal    显示而不执行隐藏的文本代码         12
        measure   初始化文本范围量度                 12
        info      返回文本属性信息                   13
说明
改变文本在屏幕上的显示方式。initial,screen或status restore;standard命令将文本属性初始化为系统的缺省状态。在为具体课程选择了文本属性之后,由status命令保存并在以后恢复所修改的设置。如果(例如,通过在+initial控制块中编程)将所修改的设置保存在default状态缓冲区,则它们将变成由jump跳转到的任何单元的起始文本属性。
当在源编辑器(Source Editor)中输入一行文本时,可以通过使用隐藏的退出码或嵌入命令语句来直接在文本串中操纵text属性。下面是这些退出码:
色彩                         退出码
黑/黑+(灰)                    a/A
蓝/蓝+                        u/U
绿/绿+                        g/G
青/青+                        c/C
红/红+                        r/R
紫/紫+                        m/M
棕/棕+(黄)                    b/B
白/白+                        w/W
绘图方式                     退出码
擦除                          -
反转                          !
未制图                        -
重写                          =
写                            +
异或                          *
字体                         退出码
字号1-9                       f1-9
字号10-35                     fa-z
字型标准/文本开始             f@/&
字体控制                     退出码
粗体开/关                     Fb/B
斜体开/关                     Fi/I
阴影开/关                Fs/S
阴影色                   F/color
下划线                   Fu/U
下划线色                 F_color
功能                    退出码
大小1-9                  1-9
间隔变量/固定            v/V
窄体开/关                n/N
缺省状态/文本开始        @/&
擦除色                   d color
页边回车/释放            >/<
页边前进/靠左设置        CR/1
字符功能                退出码
不间断空格                #
不间断连字符              h
新行                      \
继续写                    |
size,bold,italic和narrow属性或者从一个单独的字体开始合成它们的效果,或者从一个字体组中选择最佳的字体匹配。为了获得更多关于如何从字体组中选择字体来最佳匹配属性设置的信息,见font命令和系统变量zfontf和zfontret。
text size;size
控制大小属性,缺省值为size 1。
对于一个字体,可以在水平和垂直两个方向上合成4倍于基本字符大小的放大字符。对于一个字体组,系统试图在最大尺寸为9的该组中选择适当大小的字体。如果在字体组中不存在这样大小的字体,则合成多至4种尺寸的字体,同时将较大尺寸缺省设置为1。
例子1
如果使用一种字体,则合成基本字体放大两倍的字符。如果使用字体组,则使用该组中适当大小为2的字体。如果不存在这样大小的字体,则通过基本大小为1的字体来合成它。
text    size;2
例子2
大小是一种可以通过使用《和》嵌入符号嵌入到文本行中的文本属性。嵌入方法优于退出(escape)码之处在于,在源编辑器中预览时不改变文本,从而能够更好地打印输出代码。
write   《size,1》Start out small,《size,2》end up big
text    size;sizeX,size Y
分别将水平和垂直字符放大到最大尺寸值为4的字符尺寸。若X和Y值不同,就要合成字符。若X和Y值相同,或者从有效字体组中选择字符的匹配字体或者合成字符。
例子
X的4×4矩阵形式表示能够利用双自变量的size形式合成的16种尺寸的放大字符。letters应是一种字体但不是字体组,否则四个sizeX=sizeY输入项将试图匹配并使用一组格式上不与其余合成尺寸匹配的字体。
font    ‘letter’
loop    sizeX 1,4
.       loop  sizeY
Figure C9880941502902
1,4
.       .     at     4*sizeX+1∶4*sizeY+1
.       .     text   size;size X,sizeY
.       .     write  X
.       endloop
endloop
text  bold;on|off|CONDTION
控制粗体属性,缺省值为off。
例子1
通过水平复制字符的各象素使字体big变粗。
font    big’    $$字体框
text    bold;on
write    This text is synthesized bold.
例子2
在+initial控制块中,initial命令将包括字体的所有绘图参数按系统标准设置。然后在default状态缓冲区中改变并保存几种文本属性。在此任何jump分支将复位到这些缺省的文本属性设置。由于系统标准字体是一个字体组,所以bold属性从该字体组中选择粗字体。
*       in+initial block
initial
text    bold;on
text    spacing;variable
...
status  save;default
text    italic;on|off|CONDTION
控制斜体属性,缺省值为off
例子
用于开/关斜体的退出码已经插入单词amorous的附近。在源编辑器中,通过按压[CTRL][A][|]和[CTRL][A][SHIFT][|]输入这些脱离码。这些斜体字或者通过当前字体来合成,或者若字体组有效则直接来自该组中的适当斜体字。
write  The word anorous is derived from Latin
text   narrow;on|off|CONDTION
控制窄体属性,缺省值为off。
narrow属性用于如CGA等的低分辨率屏幕,以便在屏幕上产生最大数量的文本。在系统标准字体组中提供有窄体字,用于向上兼容TenCORE系统的早期版本。narrow不能被合成。
text spacing;fixed|variable|spacing
控制字符间隔,缺省值为fixed。
若具有fixed(固定)的间隔,则每个字符占据相同的由字体最大字符宽度定义的水平空间。它常常用于对齐数字表格或产生强调效果。
若具有variable(可变)的间隔,则每个字符仅占据所需的水平空间。例如,小写的i就比大写的M占据的水平空间小。利用variable间隔要比利用fixed在每行绘出的字符多。研究表明variable间隔提高了阅读速度。
该变量标志符形式使用下列的值:-1=variable,0=fixed
例子1
当使用标准字体时,具有可变间隔的第二行文本比具有固定间隔的第一行占据的空间少。
at      10:1
text    spacing;fixed
write   This text runs to here
at      11:1
text    spacing;variable
write   This text runs to here plus
例子2
可变间隔用于标号但固定间隔解决了数字排列的问题。
at      6:10
text    spacing;variable
write   Pork
        Beef
        Chicken
at      6:20
text    spacing;fixed
write   365
        4
        1512
text    shadow;on|off|CONDITION[,COLOR]
控制为字符加阴影,缺省值为off。阴影色彩的缺省状态为white。
通过将每个字符显示两次来实现阴影效果:第一次绘制被偏移后并呈阴影色,而第二次绘制呈前景色。在Font Editor(字体编辑器)中设置为字体加阴影偏移。如果没有规定阴影色,则使用最近规定的色彩。缺省的阴影色是在initial命令后的white(白)。
例子
展现一个非常具有爱国效果的美国国旗画面
colore    blue
erase
color     white+
text      shadow;on,red+
text      size;2
at        10:10
write     An American statement
text      underline;on|off|CONDITION[,COLOR|foregnd]
控制字符下划线(underline),缺省值为off。下划线的色彩缺省设置为用于绘制该字符的当前前景(关键字foregnd)色。
在字体编辑器中为字体规定下划线的位置和下行字母(descender)间隔尺寸。如果没有规定下划线色彩,则使用最近规定的下划线色彩。缺省的下划线色彩是在initial命令后的foegnd。
例子
采用前景色为第一句子加下划线并采用蓝色为第二句子加下划线。另一种加下划线的方法是在文本中采用退出码
text    underline;on,foregnd
write   This text is underlined in the same color as the text.
text    underline;on,blue
write   This text is underlined in blue.
text    delay;seconds[;break]
在绘出每个字符之后延时规定秒,缺省值为0。在执行延时长的text语句时,若出现可选break修改符,则允许任何由break修改的流事件迅速发生。其余输出的延时被关,以便快速完成该命令,从而使流转移能够发生。
例子
使消息缓缓出现在屏幕上(在每个字符之间延时四分之一秒)
text    delay;0.25
text    size;2
color   red+
write   WARNING!
text    increment;x,y
在绘出一个字符后加入附加间隔偏移量,缺省值为0,0。
在绘出一个字符后,在水平位置上加入x偏移,在垂直位置上加入y偏移。允许负的偏移值。
例子
使每个后续字符在其正常位置的靠右2象素和靠下3象素的位置上绘出。
text    increment;2,-3
write   Descending text!
text    rotate;degrees
将字符绘制基线旋转一定度数,缺省值为0。
最佳结果是,在长宽比为1∶1(普通类型的VGA或EVGA)的屏幕上使用90度倍数的旋转。
例子1
将字符绘制基线逆时针旋转90度,以使单词TEMPERATURE成为图形垂直轴的标记。
at      250,200
text    rotate;90
write   TEMPERATURE
例子2
在屏幕中央呈现旋转的4个字母表
loop    angle 0,270,90
.       at zxmax/2,   zymax/2
.       text       rotate;angle
.       write      ABCDEFGHIJKLMNOPQRSTUVWXYZ
endloop
text  direction;right|left|up|down|direction
控制相对于字符绘制基线的文本显示方向,缺省值为right。
如果前面没有text rotate语句,则字符格栅不旋转。
由下列关键字(或变量值)来规定字符显示方向:
right    (0)   从左至右
left     (180) 从右至左
up      (90)  从下至上
down    (270) 从上至下
若将方向设置为left,则在使用适当字体的情况下能够显示诸如阿拉伯语和希柏来语等各种向左书写的语言。
例子
text    direction;left
text    delay;.1
write   drawtfel gniog
使词组going leftward从屏幕右边开始缓缓出现在屏幕上。
text  margin;advance|release|wrap|wordwrap|margin
控制超出屏幕或窗口的右边界或边缘的文本行为,缺省值是绘制到下一个行的advance字符。
advance选项是文本行显示的缺省设置。它预先检查是否绘出的字符的某部分将超出屏幕或窗口的右边界或边缘,若超出,则将该字符前送到下一行的左边界。
wordwrap预先检查是否绘出的单词的某部分将超出屏幕或窗口的右边界或边缘,若超出,则将整个单词“wordwrap(整词换行)”到下一行的左边界。这一方式常用于字处理并且能够在Display Editor(显示编辑器)中编辑write对象时被访问。现有的几个特定字符如硬空格符和硬连字符可用于wordwrap方式。
wrap选项使超出屏幕或窗口的右边界或边缘的字符及其部分返回屏幕的另一侧,并继续绘制。任何由at设置的边界将被忽略。甚至在一个字符内部也会发生wrap,这样该字符的两个部分会出现在屏幕或窗口的两侧。可以使活动的文本产生沿屏幕绕动的广告牌效果。
release选项允许字符绘制在窗口或屏幕之外继续或开始。忽略由at设置的任何边界。不进行advance(前送)。如果标准剪切有效,则只显现窗口中现有的字符及其部分。
该变量标志符形式使用下列值:-1=advance,0=wrap,1=release,2=wordwrap。
例子1
当采用下列代码
以wordwrap方式绘
制此文本段落时看起
来就象本段这样。
screen    vga
text      margin;wordwrap
at        0,464;204,0
write     This paragraph of text looks just like this when plotted in wordwrapmode by the following code
例子2
下面的代码使文本Welcome to Aviation Basics沿屏幕从左至右循环出现,就象在广告牌上一样。calc语句测试屏幕的右边缘,或者使变量x前进一位或者将其复位为0。下面的at语句然后使文本的起始点沿屏幕进行loop的每次循环。write语句中的文本的开头是一个空格,而在rewrite方式下从前次循环删除在下的“W”的开头部分。如该例改为向左移,文本在结束处应有拖尾空格。
zero    X
text    margin;wrap    $$启动屏幕循环显示
text    size;2
mode    rewrite         $$替换以下屏幕
flow    jump;%other;start;break    $$设置任一键跳出
loop
.       calcs  x=zxmax;x
Figure C9880941502961
0;x+1
.       at     x,zymax/2                       $$半屏显示
.       write  Welcome to AVIATION BASICS         $$注意开始的空格
endloop
text    align;baseline|bottom|align
对齐不同尺寸或字体的字符,缺省值是baseline。
align选项控制不同尺寸或字体的字符如何彼此相对绘制。这要通过按字符基线或字符单元的底线排列字符来实现。基线常常是非下行字母的底线。在字体编辑器中为每个字体设置基线。
当baseline对齐有效时,各字符沿它们的基线对齐。不同尺寸和类型的字体将呈现在相同的基线上,如下所示。
Figure C9880941502971
当bottom对齐有效时,各字符沿各自的底线对齐。当几种尺寸或类型的字符按各自的底线排列时,它们没有呈现在共同的直线上,因为字母的下行部分需要随字符尺寸而增大,如下所示。
当baseline对齐有效时,standard字体的基线用于确定在屏幕上字符相对于所有其它字体的位置。在standard大小1字体中,基线位于字符单元底线上zcharb处。对于当前选择字体和放大尺寸,基线位于该单元底线上zfontb处。由于基线是对齐的,所以绘出的当前字体的字符底线位于与绘有standard字体大小1底线的设定的zy位置有zcharb-zfontb垂直点数处。
该变量标志符形式使用下列值:-1=baseline,0=bottom
text  reveal;off|all|allcr|editior|reveal
控制隐藏文本代码的显示,缺省值为off。
显示但不运行在文本中出现的隐藏代码,如未隐藏的退出码、上标、下标和回车符(CR)。隐藏代码显示或者是单一符号,或者以方格开始后面是规定隐藏功能的一至三个附加字符。该变量标志符形式采用以下关键字后示出的值。
all        (2)显示隐藏代码,但不包括CR;CR起作用
allcr      (3)显示隐藏代码和CE;CR起作用
editor     (4)显示隐藏代码和CR;CE不起作用
off        (0)返回到起作用的隐藏代码
text    measure
初始化能够用于确定文本段落矩形范围的文本量度系统变量。下面的系统变量定义该矩形的顶点:
(zplotxl,zplotyl);(zplotxh,zplotyh)
例子
设定任何宽度和高度的段落框。可以使用多个write和show命令,但本例中仅使用一个write。
text    measure
write   This is a paragraph
        of text
box     zplotxl,zplotyl;zplotxh,zplotyh;2
text    info;infoBuffer[,length]
读出text选项的当前设置信息到给定长度的缓冲区。如果未规定长度,则使用该缓冲区的定义长度。该缓冲区的格式如下:
 文本选项   字节数 可能值
 x尺寸   2 1...9
 y尺寸   2 1...9
 粗体   1 -1=on;0=off
 斜体   1 -1=on;0=off
 窄体   1 -1=on;0=off
 (预留)   5
 闪动   1 -1=on;0=off(text,obsolete)
 加亮   1 -1=on;0=off(text,obsolete)
 y基线相同   1 -1=on;0=off(charset,obsolete)
 间隔   1 -1=variable;0=fixed
 阴影   1 -1=on;0=off
 阴影色   4 当前阴影色
 (预留)   5
 下划线   1 -1=on;0=off
 下划线   1 -1=foregnd;0=具体色
 下划线色   4 当前下划线色
 (预留)   6
 延时中断   1 -1=yes;0=no
 边界   1 -1=上一行;0=下一行;1=释放;2=wordwrap
 方向   2 0=右;90=上;180=左;270=下
 旋转   2 0..359
  对齐  1 -1=基线;0=底
  延迟  4,实数 秒延时
  显露  1 0=off,1=reveal*;2=allcr;3=allcr;4=editor
  x增量  2 x-increment
  y增量  2 y-increment
*用于废弃reveal on命令
例子
读出并显示当前文本属性设置。
define    local
settings,54
.         sizex,2
.         sizey,2
.         bold,1
...
define    end
*
text      info;settings
write     The current X-size=《s,sizex》
                      y-size=《s,sizey》
          and bold is
writec    bold;on;off
width
说明
规定图形宽度,缺省值为一个象素。系统变量zwidth保持当前宽度值。对称地在基本图形元素两侧添加width,但不为刚刚能够被看见的点添加。
width对下列命令有效:
dot(点)
draw(画线)
polygon(多边形)    (仅限于非填充的)
circle(圆)         (仅限于非填充的)
ellipse(椭圆)        (仅限于非填充的)
box和erase不直接受width命令影响。然而,它们能够使用各自width自变量的系统变量zwidth,从而就变得有关了。注意,由于这些图形的预先存在的width自变量定义,它们仅向内“加宽”。
当前宽度设置是状态缓冲区的一部分。
width,    expression
width      5        $$下面的图形线宽为5个象素
width      var      $$宽度取决于变量
window
    管理显示窗口
window   关键字
         open     使用相对坐标打开显示窗口
         openabs  类似于open,但使用绝对坐标
         close    关闭当前窗口,恢复先前显示状态
         reset    关闭所有窗口,恢复先前显示状态
         frame    使用相对坐标改变窗口边界
         frameabs 类似于frame,但使用绝对坐标
         relative 控制窗口相对坐标的使用
         clip     控制超出窗口的图形的剪切
         compress 控制所保存的底层显示的压缩
说明
window命令打开、关闭并改变显示窗口。当打开一窗口时,该窗口下的当前显示状态和屏幕显示保存在存储区组中。除非选择绝对坐标特征,进一步的显示操作相对于该窗口进行,并仅出现在该窗口中。当关闭一窗口时,恢复该窗口下的先前显示状态和屏幕显示。
在进入该系统时,打开对应于整个物理屏幕的初始窗口。利用window命令可改变该外层窗口的性质,但不能关闭该窗口。
window open[;LOCATION[;LOCATION]]
在规定的矩形区域上打开一个显示窗口,将该矩形窗口下的屏幕显示、显示状态(见status)、当前区域设置(见area)、以及相对坐标(见windowrelative)、剪切(见window clip)和压缩(window compress)的当前设置保存在存储区组中。在关闭该窗口时,所保存的数据用于将屏幕恢复到其先前状态。
屏幕坐标相对于新打开的显示窗口:图形坐标0,0在该窗口的左下顶点,字符坐标1:1指示在该窗口中最上一行上的第一个字符。如果显示对象超出了该窗口(见window clip),则剪切它们。
window矩形坐标受先前打开的窗口和origin命令的影响,但不受scale,rotate或window clip的影响。使用window openabs或enable absolute相对于物理屏幕而不参照先前打开窗口来设定一窗口的位置。如果一个窗口会超出物理屏幕(zreturn=23),则不打开它。
若两个矩形LOCATIONS均为空,则表示整个屏幕或先前window。若仅有一个矩形LOCATION(第一个),则表示当前屏幕位置应为起始位置,并且LOCATION给出当前选择字体的字符数或字符数和行数,借此确定窗口尺寸。
例子1
在VGA屏幕上打开一个具有蓝背景、白边界和一些文本的窗口。若按压任何按键,则关闭该窗口并恢复底层显示。
window    open;100,100;400,250    $$在屏幕中央,打开窗口
colore    blue
erase                 $$以蓝色清除窗口
color     white+
box       ;;1           $$在窗口边缘设置边界
at        2:4
write     The author of this lesson is:
            Dr.John Burdeen
            University of Illinois at Urbana
            Press any key to continue
pause     pass=all
window    close
例子2
at        5:15
window    open;20,5
在底层屏幕(或窗口)的行5字符15的位置打开一个20字符宽和5行高的窗口。
window    openabs[;LOCATION[;LOCATION]]
除了就象enable absolute有效一样要解释矩形位置以外,与window open相同:LOCATION坐标指示物理屏幕且不受先前打开窗口或origin命令的影响。
window close[;noplot][;noarea]
关闭当前显示窗口,从存储区组中恢复所保存的底层窗口显示、显示status、area定义、以及window relative、window clip和window compress的状态。可选的关键字noplot禁止底层窗口显示的恢复。可选关键字noarea禁止区域定义的恢复。
window reset[;noplot][;noarea]
按从最后到最初打开窗口的次序关闭所有开启的窗口,恢复底层窗口显示、显示status、area定义、以及window relative、window clip和windowcompress的状态。可选的关键字noplot禁止底层窗口显示的恢复。可选关键字noarea禁止区域定义的恢复。
window frame[;LOCATION[;LOCATION]]
改变当前显示窗口的边界。窗口内容和该窗口下所保存的显示不变。window frame可以用于外层物理屏幕窗口。
window frameabs[;LOCATION[;LOCATION]]
除了就象enable absolute有效即坐标指示物理屏幕一样来解释矩形位置之外,与window frame相同。先前打开的窗口或origin命令无效。
window relative;[on|off|CONDITION]]
打开(on)和关闭(off)当前显示窗口的窗口相对坐标的使用。在窗口打开时的缺省值是relative on。如果关闭相对坐标,则坐标将相对于物理屏幕而不是当前窗口。然而scale,rotate,origin和window剪切仍有效。
对于CONDITIONAL形式,判断成负值的表达式将被当作on而零值或正值被当作off。
window clip;[on|off|CONDITION]]
打开(on)和关闭(off)超出当前窗口的显示对象的剪切。在窗口打开时的缺省值是clip on。如果关闭剪切,将显示超出当前窗口的对象。
系统变量zclipx1,zclipy1,zclipx2,zclipy2保持剪切区域的左下角和右上角的绝对坐标。
window compress;[on|off|CONDITION]]
控制底层屏幕的数据压缩(compress)。在窗口打开时的缺省值是compresson。当窗口打开时,在该窗口下的显示内容被保存在存储区组中。当前窗口压缩被设置成on,所保存的数据将占据很少的存储区组空间。当窗口压缩被设置成off,在存储区组中会使用更多的空间,而在旧型号的计算机中窗口的打开和关闭会更快。
    系统变量
    zreturn
    -1    操作成功
    18    存储区组中存储空间不足
    23    部分窗口超出物理屏幕
    杂项
    下列系统变量受窗口的影响:
    zdispx    窗口的宽度和高度
    zdispy
    zxmax     窗口中的最大x和y坐标
    zymax
    zwindowx  窗口左下角的绝对x和y坐标
    zwindowy
    zclipx1   左下剪切区的绝对x和y坐标
    zclipy1
    zclipx2   右上剪切区的绝对x和y坐标
    zclipy2
write
    显示文本
write TEXT
说明
从当前屏幕位置开始在屏幕上显示文(text)。当前位置常常由前面的at命令来设置。at命令还能够设置左、右文本页边。write的文本可以扩展到许多行,其换行行为由text margin命令自动控制。
文本属性(例如,色彩、下划线、加阴影、字体设计等)可以使用嵌入的文本属性来逐个字符地修改。在文本中可出现如下项目:显示通过菜单选项插入在源代码和显示编辑器中的代码序列;以及,通过使用嵌入符号《》嵌入的命令。可以嵌入的这些命令和text命令关键字属性有:
color|c    选择前景显示色彩
colore|ce  选择背景显示色彩
margin|ma  控制文本换行
mode|m     选择在已有显示上绘制文本的方式
size|s     改变字体尺寸
spacing|sp 选择成比例的或固定的间隔
在一个write的开始处存在的文本属性被保存并在该write的结尾处被恢复,这样在该文本中进行的任何属性改变不会延伸到下面的命令。可以在该文本中的任何时间上通过使用“status text start”显式代码序列Esc-&来恢复这些在开始时保存的属性。该命令的writex变量不保存开始的文本属性,它用于恢复由先前write命令保存的属性。
也可以使用show命令的嵌入形式将变量和缓冲区内容的显示嵌入在write的文本中:
show|s    显示变量或表达式
showa|a   显示缓冲区中的文本
showh|h   以十六进制格式显示缓冲区
showt|t   以表格格式显示变量
showv|v   显示包括空节点的文本缓冲区
一文本行的拖尾空格正常情况下由编译器删除:可以使用三个美元注释符号($$$)作为该行的结尾以包括这些空格。
例子
例子1
下列书写内容的源代码持续三行。然而,在屏幕上它将显示出更多的行数,因为由at命令设置的边界使得段落变得很窄。
at    1:10;1:10         $$左边界为10字符
                            $$右边界为30字符
text    margin;wordwrap    $$在右边界进行整字换行
write   This is a paragraph of text that goes on and on.It will
        appear nicely between the margins as set by the preceding at
        command.Continued lines of text in a write statement begin by
        tabbing over the command field.
例子2
嵌入显示命令能够同时显示文本和变量的数值。例如,可以显示如下的内容:
        Bill:
        your score is 92%
        the class average was 85%
write   《showa,name》:
        your score is《show,score》%
        the class average was《show,average》%
例子3
write   Special effects such as  underlining and italics are easily
        put on characters through insertion of embedded code sequences
        in the editors.Some attributes such as size can use the
        embedded command form so that they《size,4》can be seen clearly
        in《color,red+》printouts of your code.writec
writec
     有选择地显示文本
writec    SELECTOR;TEXT;TEXT
说明
write命令的选择形式。
SELECTOR后的第一个分隔符用于分隔所有后面的TEXT事例,它可以是:
分号    ;
冒号    :
逗号          ,
行尾符       
Figure C9880941503061
通用分隔符    |
例子
例子1
变量month用于有选择地挑选一个月份的文本来显示。最初的两个事例(负值和零)不用于文本。
write    Today’s month is $$$  保留拖尾空格
writec   month,,,January,February,March,April,May,June
         July,August,September,October,November,December
例子2
在每个可选情况中能够出现多个文本行。在该文本中可以出现不用作选择分隔符的分隔符
writec  question;;;
        What city was once called Fort Dearborn?
        Hint:it is also called the Windy City.;$$  事例1
        What is the largest city in the US?
        Hint:it is on the east coast.;         $$  事例2
        What city is known as the Gateway to the west?
        Hint:it is on the Mississippi.;        $$  事例3
        ...
zero
使一个变量或规定数个字节变成零值
zero    variable[,length]
说明
使变量空间的字节变成零值。一个标志符形式仅使规定的variable(变量)变成零值。两个标志符形式使从规定变量开始的任意数字节变成零值,利用此形式可以跨过变量边界。
例子
利用一个命令是使一个大变量成为零值。
define    global
var,128     $$  128字节缓冲区
define    end
*
zero  var    $$  使所有128各字节变成零值
虽然已经参照具体实施例和应用说明了本发明,但是对于本领域普通技术人员来说,根据本说明书的教导,在不脱离和不超过本发明所要求范围的情况下,可以产生另外的实施例和修改。因此,应该理解,为了便于理解本发明在这里所提供的附图和说明是示例性的,不应该将它们认为是对本发明范围的限制。

Claims (36)

1.一种优化控制方法,用于优化控制在网络上的计算机之间的计算机程序的存储和传送以方便交互程序使用,包括:
在第一计算机的非易失存储器中存储一应用程序,所述应用程序被存储为多个单个和独立的机器可执行代码模块;
响应于在网络链路上传送的来自第二计算机的请求,从所述存储器中提取所述机器可执行代码模块中的选择的一个并且只提取所述机器可执行代码模块的所述选择的一个;和
在所述网络链路上发送所述机器可执行代码模块中所述所选择的一个代码模块到所述第二计算机。
2.如权利要求1所述的优化控制方法,其中所述第一计算机是网络上的服务器计算机,所述第二计算机是所述网络上的副服务器,还包括,响应于对所述第一计算机的用户请求,从所述第一计算机发送所述用户请求到所述第二计算机以启动所述第二计算机的所述用户请求的处理,所述第二计算机需要所述所选择的所述机器可执行代码模块之一用来处理所述用户请求。
3.如权利要求2所述的优化控制方法,还包括:
在所述第一计算机的存储器中,存储在所述网络上的副服务器的列表,所述列表包括对各个副服务器的响应时间;
通过将回声信息包从所述第一计算机送到所述副服务器,和在所述第一计算机测量在所述回声信息包的发送和来自各个副服务器的对所述回声信息包的响应的接收之间的延迟,周期性地更新所述响应时间;和
从所述副服务器中选择所述第二计算机作为具有最短响应时间的副服务器。
4.如权利要求1所述的优化控制方法,还包括:
在所述存储器中存储用户验证代码的列表;
在从所述第二计算机接收所述请求之后,比较在所述请求中的用户验证代码与所述存储器中的用户验证代码的所述列表;
仅当在所述请求中的用户验证代码与所述列表中的用户验证代码匹配时,进行所述机器可执行代码模块中所述所选择的一个代码模块的提取和发送。
5.如权利要求4所述的优化控制方法,其中来自所述第二计算机的所述请求包含在加密信息包中,还包括在将在所述请求中的所述用户验证代码与所述存储器中的用户验证代码的所述列表进行比较之前解密所述加密信息包。
6.如权利要求1所述的优化控制方法,其中来自所述第二计算机的所述请求是来自所述第二计算机的对所述第一计算机的第二请求,在第二请求之前,还包括:
经所述网络链路接收来自所述第二计算机的对所述第一计算机的第一请求,所述第一请求要求发送包含在所述机器可执行代码模块中的特定代码模块的第一版本;和
从所述第一计算机经所述网络链路向所述第二计算机发送一信号,指明所述特定代码模块的比第一版本新的版本可用,所述机器可执行代码模块中所述所选择的一个代码模块是所述特定代码模块的所述比第一版本新的版本。
7.如权利要求1所述的优化控制方法,其中所述机器可执行代码模块是写在用户友好编程代码中的,还包括翻译在所述第二计算机的所述代码模块的所述所选择的一个代码模块,将其从所述编程代码翻译为可以直接由所述第二计算机利用的机器代码。
8.一种优化控制方法,用于优化控制在网络上的计算机之间的计算机程序的存储和传送以方便交互程序使用,包括:
在第一计算机中存储应用程序的一部分,所述应用程序包括多个单个和独立的机器可执行代码模块,仅有一些所述机器可执行代码模块被存储在所述第一计算机中;
至少在所述第一计算机上执行所述机器可执行代码模块之一;
将对所述应用程序的其它机器可执行代码模块的请求经网络链路发送到第二计算机;
从所述第二计算机在所述网络链路上在所述第一计算机接收所述其它机器可执行代码模块;和
在所述第一计算机上执行所述其它机器可执行代码模块。
9.如权利要求8所述的优化控制方法,还包括:
将来自所述第一计算机的对所述网络上的服务器列表的请求送到另外的计算机;
在从所述另外的计算机发送所述服务器列表到所述第一计算机后,通过(a)从所述第一计算机发送回声信息包到所述服务器和(b)在所述第一计算机测量在所述回声信息包的发送和接收到来自各个副服务器的对所述回声信息包的响应之间的延迟,确定所述服务器的响应时间;和
从所述副服务器中选择所述第二计算机作为具有最短响应时间的服务器,所述对所述另外的机器可执行代码模块的请求的发送在所述第二计算机的选择之后执行。
10.如权利要求8所述的优化控制方法,其中来自所述第一计算机的所述请求是来自所述第一计算机的对所述第二计算机的第二请求,在第二请求之前,还包括将第一请求从所述第一计算机经所述网络发送到所述第二计算机,所述第一请求是要求所述应用程序的特定机器可执行代码模块的第一版本,所述第二请求响应于来自所述第二计算机的一信号而被传送,指明所述特定机器可执行代码模块的一比第一版本新的版本可用,所述第二请求是要求所述特定机器可执行代码模块的所述比第一版本新的版本。
11.如权利要求8所述的优化控制方法,其中所述第二计算机至少存储所述应用程序的一些所述机器可执行代码模块,所述第二计算机至少响应于由所述第一计算机执行的机器可执行代码模块,执行所述机器可执行代码模块中至少之一,从而所述第一计算机和所述第二计算机经所述网络从事交互处理。
12.如权利要求8所述的优化控制方法,其中所述机器可执行代码模块写在用户友好编程代码中,还包括将所选择的在所述第二计算机的所述代码模块之一从所述编程代码翻译为可以由所述第二计算机利用的机器代码。
13.如权利要求8所述的优化控制方法,其中所述机器可执行代码模块每个包含一作者标识,还包括,响应于由所述第一计算机在所述网络上接收的指令,并且在所述第一计算机上执行所述机器可执行代码模块之一之前,确定是否包含在所述机器可执行代码模块之一中的特定的作者标识是一被允许的标识,且仅当所述特定作者标识是一被允许的标识时继续执行所述机器可执行代码模块之一。
14.如权利要求8所述的优化控制方法,其中在所述第一计算机中的所述应用程序的所述部分的存储包括在所述第一计算机中的非易失存储器中缓存所述代码模块。
15.如权利要求8所述的优化控制方法,还包括在所述第一计算机的空闲时间期间,将一对机器可执行代码模块的请求从所述第一计算机传送到所述第二计算机。
16.一种方便交互程序使用的计算系统,包括:
数字处理电路;
非易失存储器,存储通用操作程序和应用程序,所述应用程序包括多个单个和独立的机器可执行代码模块,所述存储器被连接到所述处理电路以使得能够由所述处理电路访问所述存储器;
通信链路,用于在网络上通信传送数据和程序到远程计算机;和
代码模块交换装置,可操作地连接到所述存储器和所述通信链路,用于从所述机器可执行代码模块中提取单个代码模块和响应于来自所述远程计算机的对所述单个代码模块的请求将所述单个代码模块发送到所述远程计算机。
17.如权利要求16所述的计算系统,其中所述计算系统是在所述网络上的服务器计算机。
18.如权利要求17所述的计算系统,其中所述存储器包含在所述网络上的副服务器的列表,所述列表包括对各个副服务器的响应时间,还包括:
检测装置,用于检测所述计算系统的过载状态;和
服务器选择装置,可操作地连接到所述检测装置、所述存储器和所述通信链路用于确定哪个所述副服务器具有最短的响应时间,和用于当在所述用户请求到达时存在所述过载状态时,将进入的用户请求分流到具有最短响应时间的副服务器。
19.如权利要求18所述的计算系统,其中所述用户请求被分流到的所述副服务器是所述远程计算机,需要所述单个代码模块用来使所述远程计算机能够处理所述用户请求。
20.如权利要求18所述的计算系统,还包括更新装置,可操作地连接到所述存储器和所述通信链路,用于(I)周期性地送出回声信息包到所述副服务器,(II)测量在所述回声信息包的送出和接收到来自各个副服务器的对所述回声信息包的响应之间的延迟,和(III)根据所测量的延迟,更新在所述列表中的响应时间。
21.如权利要求17所述的计算系统,其中所述网络是互联网。
22.如权利要求16所述的计算系统,其中所述存储器包含一用户验证代码的存储的列表,还包括比较装置,用于比较在所述请求中的用户验证代码和在所述存储器中的用户验证代码的所述列表,和用于在所述请求中的用户验证代码和在所述列表中的任何用户验证代码不对应时,防止代码模块的提取和发送。
23.如权利要求22所述的计算系统,其中来自所述远程计算机的所述请求包含在一加密信息包中,还包括解密装置,连接到所述通信链路和所述比较装置,用于在比较在所述请求中的所述用户验证代码和在所述存储器中的用户验证代码的所述列表之前,解密所述加密信息包。
24.如权利要求16所述的计算系统,还包括比较装置,用于确定是否所请求的代码模块具有更新的版本,并用对所述远程计算机的邀请来响应所述请求,以接受所请求的代码模块的更新版本。
25.如权利要求16所述的计算系统,其中所述机器可执行代码模块是写在用户友好编程代码中,还包括一解释器,用于将所述编程代码翻译为可以由所述处理电路用的机器代码。
26.一种计算系统,包括:
第一计算机;
相对所述第一计算机位置在远处的第二计算机;
所述第一计算机和所述第二计算机的通信链路,用于将所述第一计算机和所述第二计算机在网络上彼此相连,
所述第一计算机包括一非易失存储器,至少存储一应用程序的一部分,所述应用程序包括多个单个和独立的机器可执行代码模块,
每个计算机带有代码模块交换装置,用于和其它计算机的代码模块交换装置合作,以便将来自所述机器可执行代码模块中的一单个代码模块从所述第一计算机传送到所述第二计算机。
27.如权利要求26所述的计算系统,其中在所述网络上所述第一计算机是主服务器,所述第二计算机是副服务器,所述第一计算机包括检测装置,用于检测所述第一计算机的过载状态,所述第一计算机还包括分流装置,可操作地连接到所述第一计算机的所述检测装置和通信链路,用于当所述用户请求到达时存在所述过载状态时,将进入的用户请求分流到所述第二计算机。
28.如权利要求27所述的计算系统,其中所述第一计算机还包括更新装置,可操作地连接到所述存储器和所述通信链路,用于(I)周期性地送出回声信息包到所述副服务器,(II)测量在所述回声信息包的送出和接收到来自各个副服务器的对所述回声信息包的响应之间的延迟,和(III)根据所测量的延迟,更新在所述列表中的响应时间。
29.如权利要求26所述的计算系统,其中所述第一计算机是服务器计算机,所述第二计算机是用户计算机。
30.一种计算系统,包括:
一存储器,存储一应用程序的一部分,所述应用程序包括多个单个和独立的机器可执行代码模块,仅有一些所述机器可执行代码模块存储在所述存储器中;
数字处理电路,可操作地连接到所述存储器,用于执行至少所述机器可执行代码模块之一;
通信链路,用于在网络上通信数据和程序到远程计算机;和
代码模块交换装置,可操作地连接到所述存储器和所述通信链路,用于经网络链路和远程计算机通信,以从所述远程计算机获得所述应用程序的其它机器可执行代码模块,所述数字处理电路可操作地连接到所述代码模块交换装置,用于在接收到来自所述远程计算机的所述其它机器可执行代码模块后执行所述其它的机器可执行代码模块。
31.如权利要求30所述的计算系统,其中所述计算系统是在所述网络上的用户计算机,所述远程计算机是服务器计算机。
32.如权利要求31所述的计算系统,其中所述存储器包含在所述网络上的服务器的列表,所述列表包括各个服务器的响应时间,还包括服务器选择装置,可操作地连接到所述存储器和所述代码模块交换装置用于指令所述代码模块交换装置与从所述服务器中所选择的具有最短的响应时间的服务器相通信,所述远程计算机是所选择的服务器。
33.如权利要求32所述的计算系统,还包括更新装置,可操作地连接到所述存储器和所述通信链路,用于(I)周期性地送出回声信息包到所述服务器,(II)测量在所述回声信息包的送出和接收到来自各个服务器的对所述回声信息包的响应之间的延迟,和(III)根据所测量的延迟,更新在所述列表中的响应时间。
34.如权利要求30所述的计算系统,还包括一软件修改电路,可操作地连接到所述代码模块交换装置,用于加密发送到所述远程计算机的通信和解密从所述远程计算机接收的通信。
35.如权利要求30所述的计算系统,其中所述机器可执行代码模块以用户友好编程代码写出,还包括一解释器,用于将所述编程代码翻译为可以直接由所述处理电路用的机器代码。
36.一种用于在计算机网络上的计算机之间分配处理的方法,包括:
在第一计算机的非易失存储器中存储一应用程序,所述应用程序被存储为多个单个和独立的机器可执行代码模块;
在所述第一计算机上执行所述应用程序的部分;
在网络链路上从所述第一计算机发送一请求到第二计算机,所述第二计算机没有满负荷运行,所述请求是要接替所述第一计算机的工作负荷;
响应于来自所述第二计算机的请求,选择性地从所述第一计算机在所述网络链路上发送所述应用程序的机器可执行代码模块到所述第二计算机,所发送的代码模块小于所述应用程序的所有代码模块;和
操作所述第二计算机以按照在所发送的代码模块中的编程指令帮助所述第一计算机执行其工作负荷。
CNB988094150A 1997-07-29 1998-07-28 最优控制计算机网络程序存储传递的计算机化系统及方法 Expired - Fee Related CN1232913C (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US08/902,591 1997-07-29
US08/902,591 US6065046A (en) 1997-07-29 1997-07-29 Computerized system and associated method of optimally controlled storage and transfer of computer programs on a computer network

Publications (2)

Publication Number Publication Date
CN1315018A CN1315018A (zh) 2001-09-26
CN1232913C true CN1232913C (zh) 2005-12-21

Family

ID=25416079

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB988094150A Expired - Fee Related CN1232913C (zh) 1997-07-29 1998-07-28 最优控制计算机网络程序存储传递的计算机化系统及方法

Country Status (12)

Country Link
US (1) US6065046A (zh)
EP (1) EP1010193A4 (zh)
JP (2) JP2001512272A (zh)
KR (1) KR100345460B1 (zh)
CN (1) CN1232913C (zh)
AU (1) AU724513B2 (zh)
BR (1) BR9811593A (zh)
CA (1) CA2297069C (zh)
IL (1) IL134141A (zh)
NZ (1) NZ502477A (zh)
RU (1) RU2226711C2 (zh)
WO (1) WO1999007007A2 (zh)

Families Citing this family (120)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6760746B1 (en) * 1999-09-01 2004-07-06 Eric Schneider Method, product, and apparatus for processing a data request
JP3901806B2 (ja) * 1997-09-25 2007-04-04 富士通株式会社 情報管理システム及び二次サーバ
SE513248C2 (sv) * 1997-12-19 2000-08-07 Ericsson Telefon Ab L M Metod för hantering av datastrukturer
US6493870B1 (en) * 1998-03-20 2002-12-10 Sun Microsystems, Inc. Methods and apparatus for packaging a program for remote execution
KR100290862B1 (ko) * 1998-04-02 2001-07-12 구자홍 이동통신시스템에서의패킷데이터를전송하기위한슬롯의구조
US20010044850A1 (en) 1998-07-22 2001-11-22 Uri Raz Method and apparatus for determining the order of streaming modules
US7197570B2 (en) * 1998-07-22 2007-03-27 Appstream Inc. System and method to send predicted application streamlets to a client device
US6311221B1 (en) * 1998-07-22 2001-10-30 Appstream Inc. Streaming modules
US6279030B1 (en) * 1998-11-12 2001-08-21 International Business Machines Corporation Dynamic JAVA™ class selection and download based on changeable attributes
US9141717B2 (en) 1999-03-22 2015-09-22 Esdr Network Solutions Llc Methods, systems, products, and devices for processing DNS friendly identifiers
US7162699B1 (en) 1999-04-02 2007-01-09 Massachusetts Institute Of Technology Mechanisms and artifacts to manage heterogeneous platform interfaces in a collaboration system
US6834343B1 (en) * 1999-05-27 2004-12-21 Microsoft Corporation Method for watermarking computer programs
US6446218B1 (en) 1999-06-30 2002-09-03 B-Hub, Inc. Techniques for maintaining fault tolerance for software programs in a clustered computer system
US6324692B1 (en) * 1999-07-28 2001-11-27 Data General Corporation Upgrade of a program
US6944586B1 (en) * 1999-11-09 2005-09-13 Interactive Drama, Inc. Interactive simulated dialogue system and method for a computer network
US6658449B1 (en) * 2000-02-17 2003-12-02 International Business Machines Corporation Apparatus and method for periodic load balancing in a multiple run queue system
ATE267418T1 (de) * 2000-03-10 2004-06-15 Cit Alcatel Verfahren und gerät zur datensicherung
US7092985B2 (en) * 2000-03-30 2006-08-15 United Devices, Inc. Method of managing workloads and associated distributed processing system
US20040103139A1 (en) * 2000-03-30 2004-05-27 United Devices, Inc. Distributed processing system having sensor based data collection and associated method
US20010039497A1 (en) * 2000-03-30 2001-11-08 Hubbard Edward A. System and method for monitizing network connected user bases utilizing distributed processing systems
USRE42153E1 (en) 2000-03-30 2011-02-15 Hubbard Edward A Dynamic coordination and control of network connected devices for large-scale network site testing and associated architectures
US20090222508A1 (en) * 2000-03-30 2009-09-03 Hubbard Edward A Network Site Testing
US6963897B1 (en) * 2000-03-30 2005-11-08 United Devices, Inc. Customer services and advertising based upon device attributes and associated distributed processing system
US20090216641A1 (en) * 2000-03-30 2009-08-27 Niration Network Group, L.L.C. Methods and Systems for Indexing Content
US8010703B2 (en) * 2000-03-30 2011-08-30 Prashtama Wireless Llc Data conversion services and associated distributed processing system
US8234203B1 (en) 2000-05-12 2012-07-31 Adventive, Inc. E-commerce system including online automatable inventory monitor and control system
US6978378B1 (en) * 2000-05-12 2005-12-20 Bluetie, Inc. Secure file transfer system
JP3511978B2 (ja) 2000-05-18 2004-03-29 日本電気株式会社 優先度制御機能付きルータ及びプログラムを記録した機械読み取り可能な記録媒体
US6981260B2 (en) * 2000-05-25 2005-12-27 International Business Machines Corporation Apparatus for minimizing lock contention in a multiple processor system with multiple run queues when determining the threads priorities
JP4033619B2 (ja) * 2000-05-26 2008-01-16 シャープ株式会社 サーバ装置
WO2001095116A2 (en) * 2000-06-07 2001-12-13 Netbloom A/S A method and a system for providing information from a server to a client
US6633876B1 (en) * 2000-06-07 2003-10-14 Sun Microsystems, Inc. Analyzing post-mortem information on a remote computer system using a downloadable code module
US7089301B1 (en) * 2000-08-11 2006-08-08 Napster, Inc. System and method for searching peer-to-peer computer networks by selecting a computer based on at least a number of files shared by the computer
US7822655B1 (en) * 2000-08-22 2010-10-26 i-Deal, LLC Method, apparatus and article-of-manufacture for managing and supporting initial public offering and other financial issues
AU2001294637A1 (en) * 2000-09-21 2002-04-02 Michael B. Cantor Method for non-verbal assessment of human competence
US20020087717A1 (en) * 2000-09-26 2002-07-04 Itzik Artzi Network streaming of multi-application program code
US6876995B1 (en) * 2000-10-04 2005-04-05 Microsoft Corporation Web store events
US6629103B1 (en) * 2000-11-02 2003-09-30 Oridus, Inc. Method for securely providing a text file for execution
US7254232B2 (en) * 2001-02-14 2007-08-07 Copytele, Inc. Method and system for selecting encryption keys from a plurality of encryption keys
US7219122B1 (en) 2001-04-23 2007-05-15 Massachusetts Institute Of Technology Software service handoff mechanism with a performance reliability improvement mechanism (PRIM) for a collaborative client-server system
US9900286B2 (en) 2001-04-26 2018-02-20 Nokia Technologies Oy Device classification for media delivery
FR2824929B1 (fr) * 2001-05-18 2003-08-08 Gemplus Card Int Deploiement d'application depuis une carte a puce
US7409420B2 (en) * 2001-07-16 2008-08-05 Bea Systems, Inc. Method and apparatus for session replication and failover
US7571215B2 (en) * 2001-07-16 2009-08-04 Bea Systems, Inc. Data replication protocol
US20030023898A1 (en) * 2001-07-16 2003-01-30 Jacobs Dean Bernard Layered architecture for data replication
US6918013B2 (en) * 2001-07-16 2005-07-12 Bea Systems, Inc. System and method for flushing bean cache
US7702791B2 (en) * 2001-07-16 2010-04-20 Bea Systems, Inc. Hardware load-balancing apparatus for session replication
US6986148B2 (en) * 2001-07-17 2006-01-10 Appforge, Inc. Methods and systems for providing platform-independent shared software components for mobile devices
US20030028583A1 (en) * 2001-07-31 2003-02-06 International Business Machines Corporation Method and apparatus for providing dynamic workload transition during workload simulation on e-business application server
US20030046230A1 (en) * 2001-08-30 2003-03-06 Jacobs Dean Bernard Method for maintaining account consistency
US7028030B2 (en) * 2001-08-30 2006-04-11 Bea Systems, Inc. Cluster caching with concurrency checking
US7113980B2 (en) * 2001-09-06 2006-09-26 Bea Systems, Inc. Exactly once JMS communication
EP1428356B1 (en) * 2001-09-07 2007-04-25 Telefonaktiebolaget LM Ericsson (publ) Method and arrangements to achieve a dynamic resource distribution policy in packet based communication networks
US7143019B2 (en) * 2001-10-30 2006-11-28 International Business Machines Corporation Maintaining data integrity within a distributed simulation environment
US7092868B2 (en) * 2001-10-30 2006-08-15 International Business Machines Corporation Annealing harvest event testcase collection within a batch simulation farm
US7085703B2 (en) * 2001-11-30 2006-08-01 International Business Machines Corporation Count data access in a distributed simulation environment
US7143018B2 (en) * 2001-11-30 2006-11-28 International Business Machines Corporation Non-redundant collection of harvest events within a batch simulation farm network
US7359847B2 (en) * 2001-11-30 2008-04-15 International Business Machines Corporation Tracking converage results in a batch simulation farm network
US7027971B2 (en) * 2001-11-30 2006-04-11 International Business Machines Corporation Centralized disablement of instrumentation events within a batch simulation farm network
EP1318451B1 (de) * 2001-12-10 2004-10-06 Aladdin Knowledge Systems GmbH&amp; Co. KG Verfahren zum Ausführen eines Programms auf einem Computer
EP1324217A1 (en) * 2001-12-18 2003-07-02 Hewlett-Packard Company, A Delaware Corporation Process and cache system for providing an electronic service through a telecommunication network
US6978278B2 (en) * 2002-01-18 2005-12-20 Bea Systems, Inc. System and method for heterogeneous caching
US7020684B2 (en) * 2002-01-18 2006-03-28 Bea Systems, Inc. System and method for optimistic caching
US6898587B2 (en) * 2002-01-18 2005-05-24 Bea Systems, Inc. System and method for performing commutative operations in data access systems
AU2003216332A1 (en) * 2002-02-21 2003-09-09 Bea Systems, Inc. System and method for message driven bean service migration
US7392302B2 (en) * 2002-02-21 2008-06-24 Bea Systems, Inc. Systems and methods for automated service migration
US7152181B2 (en) * 2002-02-22 2006-12-19 Bea Systems, Inc. Method for highly available transaction recovery for transaction processing systems
US7178050B2 (en) * 2002-02-22 2007-02-13 Bea Systems, Inc. System for highly available transaction recovery for transaction processing systems
US8005978B1 (en) * 2002-03-01 2011-08-23 Cisco Technology, Inc. Method to optimize the load balancing of parallel coprocessors
US6988139B1 (en) * 2002-04-26 2006-01-17 Microsoft Corporation Distributed computing of a job corresponding to a plurality of predefined tasks
JP2004005189A (ja) * 2002-05-31 2004-01-08 Ricoh Co Ltd 文書管理システムおよび文書管理方法
US20040030801A1 (en) * 2002-06-14 2004-02-12 Moran Timothy L. Method and system for a client to invoke a named service
AU2003209885A1 (en) * 2002-09-20 2004-04-08 Mks Inc. Version control system for software development
US7240096B1 (en) * 2002-09-30 2007-07-03 Bell South Intellectual Property Corp. System and method for providing service technicians access to dispatch information
JP3654360B2 (ja) * 2002-12-02 2005-06-02 ソニー株式会社 制御システムおよび方法、情報処理装置および方法、情報処理端末および方法、記録媒体、並びにプログラム
WO2004070568A2 (en) 2003-01-31 2004-08-19 Viair, Inc. Asynchronous real-time retrieval of data
US7536674B2 (en) * 2003-08-13 2009-05-19 Intel Corporation Method and system for configuring network processing software to exploit packet flow data locality
US8037515B2 (en) 2003-10-29 2011-10-11 Qualcomm Incorporated Methods and apparatus for providing application credentials
US7765543B1 (en) * 2003-12-17 2010-07-27 Vmware, Inc. Selective descheduling of idling guests running on a host computer system
KR100657065B1 (ko) * 2004-01-29 2006-12-13 삼성전자주식회사 휴대단말기의 캐릭터 처리 장치 및 방법
US7818416B2 (en) * 2004-02-27 2010-10-19 Teamon Systems, Inc. Communications system and method for accessing a server and preventing access blocking and minimizing network traffic
US7559058B2 (en) 2004-05-11 2009-07-07 Microsoft Corporation Efficient patching
US8539469B2 (en) 2004-05-11 2013-09-17 Microsoft Corporation Efficient patching
US7890946B2 (en) 2004-05-11 2011-02-15 Microsoft Corporation Efficient patching
US9400875B1 (en) 2005-02-11 2016-07-26 Nokia Corporation Content routing with rights management
US7657737B2 (en) * 2005-02-28 2010-02-02 International Business Machines Corporation Method for mapping an encrypted https network packet to a specific url name and other data without decryption outside of a secure web server
JP4110557B2 (ja) * 2005-06-21 2008-07-02 三菱電機株式会社 プログラム実行システムを備えた検査装置およびプログラミングシステム
US20070257354A1 (en) * 2006-03-31 2007-11-08 Searete Llc, A Limited Liability Corporation Of The State Of Delaware Code installation decisions for improving aggregate functionality
US8260924B2 (en) 2006-05-03 2012-09-04 Bluetie, Inc. User load balancing systems and methods thereof
US8056082B2 (en) 2006-05-31 2011-11-08 Bluetie, Inc. Capacity management and predictive planning systems based on trended rate change of monitored factors and methods thereof
US9767460B2 (en) 2006-09-18 2017-09-19 Adventive, Inc. Methods for integrating revenue generating features within a software application and systems thereof
US20080091726A1 (en) * 2006-10-16 2008-04-17 Bluetie, Inc. Methods for scheduling and completing reservations within an application and systems thereof
US20080098000A1 (en) * 2006-10-23 2008-04-24 Blue Tie, Inc. System and method for storing user data in a centralized database and intelligently reducing data entry
US20080097815A1 (en) * 2006-10-23 2008-04-24 Bluetie, Inc. Methods for employing temporary time zones and predictive locations and systems thereof
US10430845B2 (en) * 2006-10-23 2019-10-01 Adventive, Inc. Systems and methods for automated purchase requests
US20080120570A1 (en) * 2006-11-22 2008-05-22 Bluetie, Inc. Methods for managing windows within an internet environment and systems thereof
US8301776B2 (en) * 2007-11-19 2012-10-30 Arris Solutions, Inc. Switched stream server architecture
US9489177B2 (en) * 2008-02-25 2016-11-08 Adventive, Inc. Methods for integrating and managing one or more features in an application and systems thereof
KR20090098500A (ko) * 2008-03-14 2009-09-17 삼성전자주식회사 가상 머신의 유휴 구간 검사 장치 및 방법, 그리고 그방법을 수행하기 위한 컴퓨터 프로그램
AU2009335697A1 (en) * 2008-12-18 2011-08-04 Copiun, Inc. Methods and apparatus for content-aware data partitioning and data de-duplication
US8924534B2 (en) * 2009-10-27 2014-12-30 Vmware, Inc. Resource optimization and monitoring in virtualized infrastructure
WO2011113042A2 (en) * 2010-03-12 2011-09-15 Copiun, Inc. Distributed catalog, data store, and indexing
WO2011116087A2 (en) * 2010-03-16 2011-09-22 Copiun, Inc. Highly scalable and distributed data de-duplication
EP2609517B1 (en) 2010-08-24 2020-04-01 BlackBerry Limited Constant access gateway and de-duplicated data cache server
CN102566862B (zh) * 2010-12-21 2014-08-27 汉王科技股份有限公司 交互式电子白板中几何图形的擦除方法和装置
EP2690830B1 (en) * 2011-03-22 2017-09-20 Fujitsu Limited Parallel computer, communication control device and method of controlling communication
JP6171386B2 (ja) * 2013-02-15 2017-08-02 オムロン株式会社 コントローラ、情報処理装置およびプログラム
JP2015032958A (ja) * 2013-08-01 2015-02-16 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation 特定装置、特定方法、及び、プログラム
KR101498700B1 (ko) * 2013-09-23 2015-03-06 주식회사 플로우시스 가상화시스템 환경에서의 스토리지 성능 테스팅장치
JP6289882B2 (ja) * 2013-11-26 2018-03-07 京セラ株式会社 携帯端末装置、ダウンロード抑制方法およびプログラム
US9854053B1 (en) * 2014-03-24 2017-12-26 Amazon Technologies, Inc. Providing faster data access using multiple caching servers
CN104363300B (zh) * 2014-11-26 2018-06-05 浙江宇视科技有限公司 一种服务器集群中计算任务分布式调度装置
RU2609076C2 (ru) * 2015-03-16 2017-01-30 Рамиль Ильдарович Хантимиров Способ и система интеллектуального управления распределением ресурсов в облачных вычислительных средах
EP3418887A1 (en) * 2017-06-19 2018-12-26 Clarion Co., Ltd. Electronic device and program updating method
CN107786544B (zh) * 2017-09-29 2018-08-17 贵州白山云科技有限公司 一种消息的任务状态处理方法及系统
CN109968359A (zh) * 2019-03-28 2019-07-05 台州九牛慧联机器人技术有限公司 一种工业机器人控制系统
US11063882B2 (en) * 2019-08-07 2021-07-13 International Business Machines Corporation Resource allocation for data integration
CN112328510B (zh) * 2020-10-29 2022-11-29 上海兆芯集成电路有限公司 进阶主机控制器及其控制方法
DE102022001652A1 (de) 2022-05-10 2022-08-25 Mercedes-Benz Group AG Verfahren zur Bereitstellung eines fahrzeugbasierten Servers sowie ein Fahrzeug
CN115185526B (zh) * 2022-05-27 2023-10-10 韩济澎 一种能够逆向推理的编程语言的编译系统及方法

Family Cites Families (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4558413A (en) * 1983-11-21 1985-12-10 Xerox Corporation Software version management system
US4954941A (en) * 1988-08-31 1990-09-04 Bell Communications Research, Inc. Method and apparatus for program updating
US5341477A (en) * 1989-02-24 1994-08-23 Digital Equipment Corporation Broker for computer network server selection
ATE143511T1 (de) * 1989-04-28 1996-10-15 Softel Inc Verfahren und vorrichtung zur fernsteuerung und - überwachung der anwendung von rechnerprogrammen
CA2053261A1 (en) * 1989-04-28 1990-10-29 Gary D. Hornbuckle Method and apparatus for remotely controlling and monitoring the use of computer software
US5473772A (en) * 1991-04-02 1995-12-05 International Business Machines Corporation Automatic update of static and dynamic files at a remote network node in response to calls issued by or for application programs
CA2048306A1 (en) * 1990-10-02 1992-04-03 Steven P. Miller Distributed configuration profile for computing system
US5426427A (en) * 1991-04-04 1995-06-20 Compuserve Incorporated Data transmission routing system
AU3944793A (en) * 1992-03-31 1993-11-08 Aggregate Computing, Inc. An integrated remote execution system for a heterogenous computer network environment
US5329619A (en) * 1992-10-30 1994-07-12 Software Ag Cooperative processing interface and communication broker for heterogeneous computing environments
US5544320A (en) * 1993-01-08 1996-08-06 Konrad; Allan M. Remote information service access system based on a client-server-service model
US5459837A (en) * 1993-04-21 1995-10-17 Digital Equipment Corporation System to facilitate efficient utilization of network resources in a computer network
CA2137488C (en) * 1994-02-18 1998-09-29 Richard I. Baum Coexecuting method and means for performing parallel processing in conventional types of data processing systems
US5732273A (en) * 1995-08-11 1998-03-24 Digital Equipment Corporation System for monitoring compute system performance
US5475813A (en) * 1994-07-18 1995-12-12 International Business Machines Corporation Routing transactions in the presence of failing servers
US5630066A (en) * 1994-12-20 1997-05-13 Sun Microsystems, Inc. System and method for locating object view and platform independent object
US5819020A (en) * 1995-10-16 1998-10-06 Network Specialists, Inc. Real time backup system
US5680461A (en) * 1995-10-26 1997-10-21 Sun Microsystems, Inc. Secure network protocol system and method
US5708709A (en) * 1995-12-08 1998-01-13 Sun Microsystems, Inc. System and method for managing try-and-buy usage of application programs
US5692047A (en) * 1995-12-08 1997-11-25 Sun Microsystems, Inc. System and method for executing verifiable programs with facility for using non-verifiable programs from trusted sources
US5828847A (en) * 1996-04-19 1998-10-27 Storage Technology Corporation Dynamic server switching for maximum server availability and load balancing
US5727950A (en) * 1996-05-22 1998-03-17 Netsage Corporation Agent based instruction system and method
US5774660A (en) * 1996-08-05 1998-06-30 Resonate, Inc. World-wide-web server with delayed resource-binding for resource-based load balancing on a distributed resource multi-node network

Also Published As

Publication number Publication date
RU2226711C2 (ru) 2004-04-10
EP1010193A4 (en) 2004-09-01
BR9811593A (pt) 2002-01-22
JP2001512272A (ja) 2001-08-21
CN1315018A (zh) 2001-09-26
WO1999007007A2 (en) 1999-02-11
CA2297069C (en) 2002-05-07
IL134141A0 (en) 2001-04-30
KR100345460B1 (ko) 2002-07-26
JP2009009584A (ja) 2009-01-15
NZ502477A (en) 2002-07-26
CA2297069A1 (en) 1999-02-11
IL134141A (en) 2004-06-20
EP1010193A2 (en) 2000-06-21
KR20010022458A (ko) 2001-03-15
US6065046A (en) 2000-05-16
AU724513B2 (en) 2000-09-21
AU8667198A (en) 1999-02-22
WO1999007007A3 (en) 1999-05-14

Similar Documents

Publication Publication Date Title
CN1232913C (zh) 最优控制计算机网络程序存储传递的计算机化系统及方法
CN100476734C (zh) 用于修改信息以从源语言变换为目标语言的方法和系统
KR101203335B1 (ko) 회계 데이터와 함께 워드 프로세서를 사용하는 방법
US20080282160A1 (en) Designated screen capturing and automatic image exporting
US10552918B2 (en) Method and system for formatting data from one software application source into a format compatible for importing into another software application
JP2003140861A (ja) ハードコピーの作成を助ける方法
Hahn Government policy toward open source software: an overview
US20070157087A1 (en) Method and system for automatically generating user interfaces for integration
Mercer Drupal
JP2005215915A (ja) 個人情報配信システム
US20030130928A1 (en) Method of creating and distributing real estate marketing packages utilizing the internet
JP2004046657A (ja) 計算支援方法とその装置、及び計算支援ソフト
US9495333B2 (en) Contract authoring system and method
KR20180058350A (ko) 기업형 솔루션을 제공하는 프로세서 및 방법
KR20200057173A (ko) 소프트웨어 설계서 생성 시스템 및 방법
JP7011912B2 (ja) 文書処理システム、処理システムおよび文書処理プログラム
CN103116816A (zh) 信息管理系统和输入辅助方法
US20070185747A1 (en) Business process assistance wizard
JP2011198313A (ja) 業務文書処理装置、及びプログラム
JP2007034806A (ja) 情報処理装置及びプログラム
JP2009003496A (ja) 帳票データ変換装置
JP2006126943A (ja) ワークフロー管理装置、ネットワークシステム、制御方法、及びプログラム
KR20230127710A (ko) 해외 진출 사업을 위한 지원 플랫폼 제공 장치 및 방법
Foster Oracle e-Business Suite 11i: Implementing Core Financial Applications
Goel Computer Applications In Management

Legal Events

Date Code Title Description
C06 Publication
C10 Entry into substantive examination
PB01 Publication
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C17 Cessation of patent right
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20051221