;FILE HEAD
.ORG $3fd0
.DB "Application", $20,$20,$20,$20,$20 ;固定格式
.DB "应用程序文件名",$20,$20 ;文件名+".bin"的最大长度为16个字符,若不足16个字符,后面用$20补充。
.DB $F8,$DF,$FF,$FF,$FF,$FF,$FF,$FF ;固定格式
.DB $00,$10 ;文件的大小,这是BIN文件的实际字节数,一般就写 $00,$10,若字节数 > 4K,那么就写 $00,$20,依次类推
.DB $00,$FF,$FF,$FF,$FF,$FF ;固定格式
.DB $AE,$EE,$EA ;固定格式
.DB $00,$10,$00,$20 ;Bin文件长度
JMP Main ;BIN文件是从这里开始执行的,所以整个程序的开始地址对应的标号应该为 Main
.DB $B7,$08,$31,$03,$FF,$FF ;固定格式
;-----------------------------------------------------------------------
;此文件包含了NC3000画图部分的宏
;-----------------------------------------------------------------------
ClearGraph: .MACRO ;注意,此宏只是将图像缓存清空。
int m_ClearGraph
.ENDM
Draw: .MACRO x,y,type
LDA #x
STA Graph_x
LDA #y
STA Graph_y
LDA #type
STA GraphType
int m_Draw
.ENDM
JudgePoint: .MACRO x,y,type
LDA #x
STA Graph_x
LDA #y
STA Graph_y
LDA #type
STA GraphType
int m_JudgePoint ;如果该坐标存在点的话,标志位Z=0
.ENDM
;-----------------------------------------------------------------------
;以下的Macro名称中,A表示不填充,B表示填充
;-----------------------------------------------------------------------
BoxA: .MACRO x1,y1,x2,y2,type
LDA #x1
STA Graph_x1
LDA #y1
STA Graph_y1
LDA #x2
STA Graph_x2
LDA #y2
STA Graph_y2
LDA #type
STA GraphType
int m_BoxA
.ENDM
BoxB: .MACRO x1,y1,x2,y2,type
LDA #x1
STA Graph_x1
LDA #y1
STA Graph_y1
LDA #x2
STA Graph_x2
LDA #y2
STA Graph_y2
LDA #type
STA GraphType
int m_BoxB
.ENDM
BoxC: .MACRO x,y,type ;从屏幕0,0开始作矩形,不填充
LDA #x
STA Graph_x1
LDY #y
LDA #type
STA GraphType
int m_BoxC
.ENDM
BoxD: .MACRO x,y,type ;从屏幕0,0开始作填充矩形
LDA #x
STA Graph_x1
LDY #y
LDA #type
STA GraphType
int m_BoxD
.ENDM
;-----------------------------------------------------------------------
Line: .MACRO x1,y1,x2,y2,type
LDA #x1
STA Graph_x1
LDA #y1
STA Graph_y1
LDA #x2
STA Graph_x2
LDA #y2
STA Graph_y2
LDA #type
STA GraphType
int m_Line
.ENDM
LineC: .MACRO x,y,type ;从屏幕左端往屏幕上端作线
LDA #x
STA Graph_x1
LDY #y
LDA #type
STA GraphType
int m_LineC
.ENDM
;-----------------------------------------------------------------------
;作圆
CircleA: .MACRO x,y,r,type
LDA #x
STA Graph_x1
LDA #y
STA Graph_y1
LDA #r
STA GraphType
int m_CircleA
.ENDM
CircleB: .MACRO x,y,r,type
LDA #x
STA Graph_x1
LDA #y
STA Graph_y1
LDA #r
STA GraphType
int m_CircleB
.ENDM
;-----------------------------------------------------------------------
;作椭圆
EllipseA: .MACRO x,y,a,b,type
LDA #x
STA Graph_x1
LDA #y
STA Graph_y1
LDA #a
STA Graph_a
LDA #b
STA Graph_b
LDA #type
STA GraphType
int m_EllipseA
.ENDM
EllipseB: .MACRO x,y,a,b,type
LDA x
STA Graph_x1
LDA y
STA Graph_y1
LDA a
STA Graph_a
LDA b
STA Graph_b
LDA type
STA GraphType
int m_EllipseB
.ENDM
;-----------------------------------------------------------------------
FillGraphA: .MACRO x1,y1,x2,y2,addr
LDA #x1
STA Graph_x1
LDA #y1
STA Graph_y1
LDA #x2
STA Graph_x2
LDA #y2
STA Graph_y2
LDA GraphAddr
STA $92
LDA GraphAddr+1
STA $93
JMP GraphAddr+2
GraphAddr: .DD addr
.ENDM
FillGraphB: .MACRO x,y,addr ;数据开始两字节为图像末端的x,y坐标
LDX #x
LDY #y
LDA GraphAddr
STA $92
LDA GraphAddr+1
STA $93
JMP GraphAddr+2
GraphAddr: .DD addr
.ENDM
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
;此文件为内存操作的宏
;-----------------------------------------------------------------------
;设置内存某块连续地址为指定值,只能设置255字节
MemSet: .MACRO Value,Lenth ;入参要求,$80,$81为首地址
LDA #Value
LDY #Lenth
DEC $80
Set_loop:
STA ($80),y
DEY
BNE Set_loop
.ENDM
;-----------------------------------------------------------------------
;将指定内存的内容复制到另一处,只能复制255字节
;MemCpyA是从内容开始往后复制,而MemCpyB是从内容结尾往开头复制
MemCpyA: .MACRO ;入参要求,$80,81为原地址,$82,$83为目标地址,$84为长度
LDY $84
STY $84
LDY #$00
cp_loop:
LDA ($80),y
STA ($82),y
INY
CPY $84
BNE cp_loop
.ENDM
MemCpyB: .MACRO ;入参要求,$80,81为原地址,$82,$83为目标地址,$84为长度
LDY $84
DEC $80
DEC $82
cp_loop:
LDA ($80),y
STA ($82),y
DEY
BNE cp_loop
.ENDM
;-----------------------------------------------------------------------
;此文件包含了NC3000输入输出部分的宏
;-----------------------------------------------------------------------
.INCLUDE "Memory.65s"
;在这里定义一些用到的地址,如果实际程序中没有用到,可以将此处删除
OutputAddr: .dw TextBuffer ;字符打印地址
TxtBuffer: .dw TextBuffer ;许多过程需要用到的地址
;-----------------------------------------------------------------------
Update_LCD: .MACRO ;将文字缓存的内容打印到屏幕上
int m_UpdateLCD
.ENDM
ClearText: .MACRO ;注意,此宏只是将文字缓存清空。
int m_ClearText
.ENDM
;-----------------------------------------------------------------------
;设置字符模式
SetFontBig: .MACRO ;设置字符显示模式为8*16
LDA #$00
STA FontType1
LDA #$01
STA FontType2
LDA #$ff
STA FontType3
STA FontType4
Update_LCD
.ENDM
SetFontNormal: .MACRO ;设置字符显示模式为6*12
LDA #$01
STA FontType1
LDA #$00
STA FontType2
LDA #$ff
STA FontType3
STA FontType4
Update_LCD
.ENDM
SetFontSmall: .MACRO ;设置字符显示模式为8*8,此模式下无法显示中文
LDA #$00
STA FontType1
STA FontType3
STA FontType4
LDA #$01
STA FOntType2
Update_LCD
.ENDM
SetFontSmaller: .MACRO ;设置字符显示模式为6*6,此模式下无法显示中文
LDA #$01
STA FontType1
LDA #$00
STA FontType2
STA FontType3
STA FontType4
Update_LCD
.ENDM
;-----------------------------------------------------------------------
;设置文字输出地址
;注意,此宏指定文字缓存首地址为$02c0
Locate .MACRO x,y ;适用于所有模式,但
LDA #$bf
STA OutputAddr
LDX #$02
LDY #y
DEY
CLC
BEQ Next2
Cal_loop:
LDA OutputAddr
ADC ScreenRow
BCC Next
INX
Next:
DEY
bne Cal_loop
Next2: ADC #x
BCC next3
INX
Next3: STA OutputAddr
STX OutputAddr+1
.ENDM
;-----------------------------------------------------------------------
;打印字符
PrintText: .MACRO CharLenth,PrintChar ;字符所在地址,字符长度
LDY OutputAddr
DEY
STY $80
LDA OutputAddr+1
STA $81
LDY #CharLenth
cp_Char:
LDA PrintChar-1,y
STA ($80),y
DEY
BNE cp_Char
Update_LCD
.ENDM
;-----------------------------------------------------------------------
;弹出信息框/是否选择框/多项选择框
MessageBox: .MACRO ArguAddrIn,type ;ArguAddrIn为参数表地址
LDX ArguAddr
LDY ArguAddr+1
LDA #type
int m_MessageBox
JMP Arguaddr+2
ArguAddr:
.DW ArguAddrIn
.ENDM
;type=$00时为弹出信息框
;type=$01时为带叹号的是否对话框
;type=$02时为带问号的是否对话框
;type=$03时为菜单选择框
;参数表格式:
; .db $80 //固定格式
; .dw CharAddr //文字信息所在地址,文字以$00结尾
; .db x,y //信息框的坐标
; .db CharLenth //文字长度
; .db RowNum //占用的行数,=2为一行,=4为两行,=6为三行,=8为四行,不存在四行以上
; .dw CharAttu //文字状态所在地址
; .dw JmpAddr //当type为菜单选择框时有效,此地址指向菜单各选项跳转地址的首地址
; .db CharAttu //文字状态,=02 8*16字正常,=82反显,=04 8*8字正常,=84反显
; 当type为是否对话框时最后结果保存在a中,若a=#$79说明选了"是",不等于说明选了"否"
;-----------------------------------------------------------------------
;进度条
;$83=0时显示百分比,$83=1是显示数值
Progress: .MACRO ;入参要求,$88,$89为最大值,$86,$87为当前值
int m_Progress
.ENDM
;-----------------------------------------------------------------------
;向上滚动屏幕
TextMoveUp: .MACRO
LDA TxtBuffer+1
STA $80
STA $82
LDA TxtBuffer
STA $81
STA $83
LDA ScreenRow
ADC $82
STA $82
LDA ScreenChar
STA $84
MemCpyA ScreenChar
.ENDM
;-----------------------------------------------------------------------
;向下滚动屏幕
TextMoveDown: .MACRO
LDA TxtBuffer+1
STA $80
STA $82
LDA TxtBuffer
STA $81
STA $83
LDA ScreenRow
ADC $80
STA $80
LDA ScreenChar
STA $84
MemCpyB ScreenChar
.ENDM
;-----------------------------------------------------------------------
;此文件为字符串操作的宏
;-----------------------------------------------------------------------
Number: .DB "0123456789"
HighWord: .DB "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LowWord: .db "abcdefghijklmnopqrstuvwxyz"
;以上内容若无用到,可以删除
;
;以下的宏中,宏名末尾为A则该宏使用的是立即数,末尾为B则该宏使用的是零页地址
;-----------------------------------------------------------------------
;将两字节的整型数转为ASCII码,转出的五字节在$82,$83,$84,$85,$86
Int2AscA: .MACRO intL,intH
LDA intL
STA $80
LDA intH
STA $81
int m_Int2ASC
.ENDM
Int2AscB: .MACRO ;该宏参数为$80,$81,出参同上
int m_Int2Asc
.ENDM
;-----------------------------------------------------------------------
;将HEX值转为ASCII码
Hex2AscA: .MACRO hex ;转出的高四位字符在y中,低四位在x中
LDA #hex
TAX
LSR
LSR
LSR
LSR
TAY
LDA Number,y
TAY
TXA
AND #$0f
TAX
LDA Number,x
TAX
.ENDM
Hex2AscB: .MACRO ;该宏入参为$80,出参为$80,$81
LDA $80
TAX
LSR
LSR
LSR
LSR
TAY
LDA Number,y
STA $80
TXA
AND #$0f
TAX
LDA Number,x
STA $81
.ENDM
;-----------------------------------------------------------------------
;将十进制值转为ASCII码
Dec2AscA: .MACRO DecN ;转出的高位在y中,低位在x中
LDA #DecN
TAX
LSR
LSR
LSR
LSR
TAY
LDA Number,y
TAY
TXA
AND #$0f
TAX
LDA Number,x
TAX
.ENDM
Dec2AscB: .MACRO ;该宏入参为$80,出参为$80,$81
LDA $80
TAX
LSR
LSR
LSR
LSR
TAY
LDA Number,y
STA $80
TXA
AND #$0f
TAX
LDA Number,x
STA $81
.ENDM
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
;连接字符串,并存放到指定位置
;注意,此函数要求两个字符串长度之和不可超过255字节
;使用技巧:可以将字符串2直接连接到字符串1的末尾而不改变位置
StrCat: .MACRO Str1,Str2,Dest ;将第二个字符串连接到第一个的末尾,并复制到指定位置
LDX #$00
LDY #$00
Read_loop:
LDA Str1,x
BEQ Write_loop
STA Dest,x
INX
JMP Read_loop
Write_loop:
LDA Str2,y
BEQ Exit
STA Dest,x
INX
INY
JMP Write_loop
Exit:
STA Dest,x ;复制$00到字符串末尾
.ENDM
;-----------------------------------------------------------------------
;此文件包含了读/写文件所需的宏
;-----------------------------------------------------------------------
;打开文件,请勿使用此宏来建立新文件
OpenFile: .MACRO NameLenth,iFileName,OpenMode
LDX #NameLenth
cp_filename:
LDA iFileName-1,x
STA FileName-1,x
DEX
BNE cp_filename
lda #OpenMode
STA FileMode
int m_OpenFile
.ENDM
;-----------------------------------------------------------------------
;建立新文件
CreatFile: .MACRO NameLenth,iFileName,FileAttrA,FileAttrB
LDA #FileAttrA
STA WriteFileAttr
LDA #FileAttrB
STA WriteFileAttr+1
LDX #NameLenth
cp_filename
LDA iFileName-1,x
STA FileName-1,x
DEX
BNE cp_filename
int m_OpenFile
.ENDM
;-----------------------------------------------------------------------
;关闭文件
CloseFile: .MACRO
int m_CloseFile
.ENDM
;-----------------------------------------------------------------------
;读取文件
ReadFile: .MACRO ReadDestL,ReadDestH,ReadLenL,ReadLenH
LDA #ReadDestL
STA RWFileDest
LDA #ReadDestH
STA RWFileDest+1
LDA #ReadLenL
STA RWFileLenth
LDA #ReadLenH
STA RWFileLenth+1
int m_ReadFile
.ENDM
;-----------------------------------------------------------------------
;写入文件
WriteFile: .MACRO WriteDestL,WriteDestH,WriteLenL,WriteLenH
LDA #WriteDestL
STA RWFileDest
LDA #WriteDestH
STA RWFileDest+1
LDA #WriteLenL
STA RWFileLenth
LDA #WriteLenH
STA RWFileLenth+1
int m_WriteFile
.ENDM
;-----------------------------------------------------------------------
;读取Nand
ReadNand: .MACRO NandDestL,NandDestH,ReadLenL,ReadLenH,NandNumL,NandNumH,NandOffsetL,NandOffsetH
LDA #NandDestL
sta NandReadDest
LDA #NandDestH
sta NandReadDest+1
LDA #ReadLenL
STA NandLenth
LDA #ReadLenH
STA NandLenth+1
LDA #NandNumL
STA NandNum
LDA #NandNumH
STA NandNum+1
LDA #NandOffsetL
STA NandOffset
LDA #NandOffsetH
STA NandOffset+1
int m_ReadNand
.ENDM
;-----------------------------------------------------------------------
;新建文件夹
CreatDir: .MACRO NameLenth,iDirName
LDX #NameLenth
cp_DirName:
LDA iDirName-1,x
STA FileName-1,x
DEX
BNE cp_DirName
int m_CreatDir
.ENDM
;-----------------------------------------------------------------------
;进入文件夹
EnterDir: .macro NameLenth,iDirName
LDX #NameLenth
cp_DirName:
LDA iDirName-1,x
STA FileName-1,x
DEX
BNE cp_DirName
int m_EnterDir
.ENDM
;-----------------------------------------------------------------------
;删除文件/文件夹
DelFile: .MACRO NameLenth,iFileName ;对于目录,只可删除空文件夹
LDX #NameLenth
cp_FileName:
LDA iFileName-1,x
STA FileName-1,x
DEX
BNE cp_FileName
int m_DeleteFile
.ENDM
;-----------------------------------------------------------------------
;退出程序,回到网络
Exit: .MACRO
int m_Exit
.ENDM
;-----------------------------------------------------------------------
;初始化文件操作
InitPro .MACRO
int m_InitPro
.ENDM
int: .MACRO Brk_name
.DB $00
.DW Brk_name
.ENDM
PushAll: .MACRO
PHA
TXA
PHA
TYA
PHA
.ENDM
PopAll: .MACRO ;请留意操作的顺序
PLA
TAY
PLA
TAX
PLA
.ENDM
;-----------------------------------------------------------------------
;此文件包含了NC3000其余的函数
;-----------------------------------------------------------------------
Beep: .MACRO
PushAll
JSR m_Beep
PopAll
.ENDM
DebugA: .MACRO
PushAll
JSR m_DebugA
PopAll
.ENDM
DebugB: .MACRO
PushAll
int m_DebugB
PopAll
.ENDM
NowFind: .MACRO
PushAll
int m_NowFind
PopAll
.ENDM
NotFind: .MACRO
PushAll
int m_NotFind
PopAll
.ENDM
Inkey: .MACRO
int m_Inkey
.ENDM
[分享]NC3000 宏
应该是由 clockrun 写的,Mowd 寫:那到底是誰寫的呢?
适用于大陆的NC3000机型,不一定全适用于台湾版的.
你们可以去 http://wqx.4irc.com/bbs 的NC3000版快上上看(这是由徐洪海做的网站),里面有更详细的文档.
注意:不要用里面的升级文件,那个应该不适用于台湾版