在上一节中,我们利用ophis实现了简单的hello world程序。接下来我们将进一步了解ophis的更多出色功能,它们能大大降低开发难度。
本节参考了Labels and aliases、Headers, Libraries, and Macros

标签

汇编代码的标签必须要求唯一,因此随着程序长度的增加,起一个不冲突的标签将会愈发困难。Ophis提供了以下特性以解决该问题。

1. 临时标签

临时标签类似于C语言中函数中声明的临时变量,仅在一块语句中有效。

int func() {int a;   //a仅在花括号内可被访问
}

不同于C语言的花括号,在Ophis中使用.scope.scend表示"块"的起始与终止。嵌套的"块"类似于子函数的逻辑,声明的变量仅在最内层块有效。为区别全局标签与临时标签,临时标签一律以下划线_开头。

.word $0801
.org  $0801                     ; BASIC内存开始地址; BASIC部分
.scope.word _next, 10           ; 下一行与当前行号.byte $9e,"2061",0      ; 调用机器代码语句: SYS 2061
_next:  .word 0                 ; 结束程序
.scend.advance 2064                 ; 补0直到内存0x0810(2064)位置

2. 匿名标签

匿名标签适用于"短距离"引用,在行开头使用*可添加一个匿名标签,在行中使用+访问下一个标签,使用-访问上一个标签。++--+++---以此类推。值得注意的是,匿名标签不是临时标签,不受scope的限制。

        ldx #0
*       lda hello, xbeq +jsr $ffd2inxbne -
*       rts

别名

别名可用于标记特殊的内存地址,如函数入口点、常量、变量位置等。

.alias chrout $ffd2
jsr chrout          ; 调用KERNAL的打印字符子程序

头文件和库

PRG文件的开头总是一段相同的BASIC代码,KERNAL的子程序位置又恒定不变,产生了大量重复书写,而且记忆函数的地址也很难。Ophis为解决此问题,提供了丰富的头文件以供引用,位于./platform。引用文件可使用三种方式。

.include “file.oph”

类似于C语言的#include,将复制引号中文件的所有内容到语句位置。

.require “file.oph”

类似于C语言的

#ifdef XXX#include "xxx.h"
#endif

它将检查file.oph是否被引用。如没有,则增加引用。

.incbin “file.bin”

直接将二进制数据插入语句位置。可提供至多两个参数,指出读取开始位置与读取字节数。

宏定义

宏很像一个内联函数,以.macro xxx.macend包裹,xxx为宏名。还可以向宏传递参数,参数必须可解析为byteword值。在宏中,可以_1_2依次使用各参数。特别值得注意的是,在宏中不能定义全局/匿名标签,且宏内部自带scope,无需额外书写。

.macro printldx #0
_loop:  lda _1, xbeq _donejsr chroutinxbne _loop
_done:
.macend

可使用如下两种方式引用宏

`print msg
.invoke print msg

附录

./platform/c64kernal.oph

; KERNAL routine aliases (C64).alias acptr       $ffa5
.alias  chkin       $ffc6
.alias  chkout      $ffc9
.alias  chrin       $ffcf
.alias  chrout      $ffd2
.alias  ciout       $ffa8
.alias  cint        $ff81
.alias  clall       $ffe7
.alias  close       $ffc3
.alias  clrchn      $ffcc
.alias  getin       $ffe4
.alias  iobase      $fff3
.alias  ioinit      $ff84
.alias  listen      $ffb1
.alias  load        $ffd5
.alias  membot      $ff9c
.alias  memtop      $ff99
.alias  open        $ffc0
.alias  plot        $fff0
.alias  ramtas      $ff87
.alias  rdtim       $ffde
.alias  readst      $ffb7
.alias  restor      $ff8a
.alias  save        $ffd8
.alias  scnkey      $ff9f
.alias  screen      $ffed
.alias  second      $ff93
.alias  setlfs      $ffba
.alias  setmsg      $ff90
.alias  setnam      $ffbd
.alias  settim      $ffdb
.alias  settmo      $ffa2
.alias  stop        $ffe1
.alias  talk        $ffb4
.alias  tksa        $ff96
.alias  udtim       $ffea
.alias  unlsn       $ffae
.alias  untlk       $ffab
.alias  vector      $ff8d; Character codes for the colors.
.alias  color'0        144
.alias  color'1        5
.alias  color'2        28
.alias  color'3        159
.alias  color'4        156
.alias  color'5        30
.alias  color'6        31
.alias  color'7        158
.alias  color'8        129
.alias  color'9        149
.alias  color'10   150
.alias  color'11   151
.alias  color'12   152
.alias  color'13   153
.alias  color'14   154
.alias  color'15   155; ...and reverse video
.alias  reverse'on     18
.alias  reverse'off    146; ...and character set
.alias  upper'case 142
.alias  lower'case 14

c64-1.oph

.word $0801
.org  $0801.scope.word _next, 10        ; Next line and current line number.byte $9e,"2061",0 ; SYS 2061
_next:  .word 0         ; End of program
.scend.require "../platform/c64kernal.oph"

可读性与重用率更高的代码示例

.include "c64-1.oph"
.outfile "hello.prg".macro printldx #0
_loop:  lda _1, xbeq _donejsr chroutinxbne _loop
_done:
.macend.macro greet`print hello1`print _1`print hello2
.macendlda #147jsr chrout       ; 清屏`greet target1`greet target2`greet target3`greet target4`greet target5`greet target6`greet target7`greet target8`greet target9`greet target10rtshello1: .byte "HELLO, ",0
hello2: .byte "!", 13, 0target1:  .byte "PROGRAMMER", 0
target2:  .byte "ROOM", 0
target3:  .byte "BUILDING", 0
target4:  .byte "NEIGHBORHOOD", 0
target5:  .byte "CITY", 0
target6:  .byte "NATION", 0
target7:  .byte "WORLD", 0
target8:  .byte "SOLAR SYSTEM", 0
target9:  .byte "GALAXY", 0
target10: .byte "UNIVERSE", 0

效果演示

前往下一节

利用 Ophis 编写 Commodore 64 programs PRG 程序(二)相关推荐

  1. 利用 Ophis 编写 Commodore 64 programs PRG 程序(一)

    参考Producing Commodore 64 programs.Writing the actual code 本节将实现简单的hello world程序,从而形成对ophis的初步认识 准备工作 ...

  2. 利用 Ophis 编写 Commodore 64 programs PRG 程序(四)

    在上一节中,我们理解了字符映射与.data段的用法.接下来我们将看看另外两个好用的功能:表达式和零页 本节参考了Expressions.Advanced Memory Segments 表达式 Oph ...

  3. 利用 Ophis 编写 Commodore 64 programs PRG 程序(三)

    在上一节中,我们理解了标签.别名.头文件/库以及宏定义的用法.接下来我们将看看另外两个好用的功能:字符映射与.data段 本节参考了Character maps.Local variables and ...

  4. 利用 Ophis 编写 Commodore 64 programs PRG 程序(五)

    在上一节中,我们理解了表达式和零页,接下来让我们一起来看看一些汇编代码与高级语言的对应关系:分支.循环与栈 本节参考了Structured Programming.The stack.Procedur ...

  5. Commodore 64 programs PRG 程序文件结构分析

    参考Programming with Ophis-Producing Commodore 64 programs PRG程序文件的前两个字节是一个小端序的数字,指向程序起始地址(不会拷贝入内存),接下 ...

  6. 利用C#编写一个高斯正反算程序

    一.代码界面展示 整个界面控件为tabControl,groupBox,label,textbox,comboBox,button,richTextBook. 二.代码运算结果展示 数据结果采用国家统 ...

  7. 利用Python编写一个高斯正反算程序

    一.前言 这次的高斯正反算程序是使用的Python编写的. 环境信息是:Win10.PyCharm 2021.3.1.PySide6 6.3.1.Python 3.9.9,基于QT Designer设 ...

  8. linux终端程序如何编写,[LINUX]利用Ncursesw编写支持中文的终端程序

    1. Ncursesw库的安装与使用 Ncurses库的安装(Ubuntu): 查看相关软件包 sudo apt-cache search ncursesw 安装ncursew必须软件包 sudo a ...

  9. 向串口助手发送数据c语言程序,利用DSP2812编写直流电机PID调速程序(C语言)

    ==57) { Scia_VarRx=9; } kb=Scia_VarRx[0]*1000; hd=Scia_VarRx[1]*100; de=Scia_VarRx[2]*10; un=Scia_Va ...

最新文章

  1. 解决点击事件让背景变红,在点击背景变正常,并且可以多选的效果
  2. 中软python编码规范考试试题_卓越分享 | 如何写出一手漂亮的Python代码?
  3. java2017下载_Download Java for OS X 2017-001
  4. 最全的国内外电子书籍网站合集
  5. 解决-win10软件默认安装路径为C盘——修改注册表
  6. 如何利用官方SDK文件来辅助开发?
  7. IE11 For Win7、win2008中文版官方下载地址
  8. python程序设计基础上机题5.16-----5.26(2)
  9. 数据仓库和数据集市详解:ODS、DW、DWD、DWM、DWS、ADS
  10. Java基础(二)集合
  11. 大球分析系统_走地大球分析系统app
  12. 什么是相位,为什么会有相位?
  13. 微信小程序父子组件通信详解
  14. 交换机和路由器之间区别
  15. 攒机笔记十二:路由器
  16. 有了这25个正则表达式,代码效率提高80%
  17. app卡在启动页面android,uni-app运行时卡在启动界面
  18. 2022第三届全国大学生网络安全精英赛练习题(5)
  19. 记FTP链接:Server Reply: SSH-2.0-OpenSSH_8.0
  20. Cesium绘制抛物线弧线

热门文章

  1. 关于74HC165芯片进行并转串程序步骤(软硬件)详细解析
  2. 零跑掌握行业话语权,零跑汽车股价迎来新的突破
  3. Python 将JSON格式文件进行数据可视化制作世界人口地图
  4. 锐浪报表根据后端返回值判断是否显示自由表格行
  5. 现在流行的html软件,目前流行的前端框架APP设计制作软件介绍
  6. 实战西瓜集 决策树及其注释
  7. 苏格拉底的苹果_喻道故事18:一只没有香气的苹果
  8. 深度学习-2.1 LeNet5-手写字体识别
  9. 10-24-程序员日-我的第一个python爬虫项目-爬取蜂鸟上的图片
  10. Bluez 自带工具小结(BR)