[分享]NC3000 宏

6502 組合語言,是哈電族裡使用的程式語言,也是目前設計 Bin 的唯一方法,有興趣的就進來吧
回覆文章
zqy881012
會員
會員
文章: 25
註冊時間: 2004-12-29 12:28 PM
來自: china

文章 zqy881012 »

;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

頭像
Eastsun
會員
會員
文章: 24
註冊時間: 2004-05-14 9:11 PM
來自: 大陆

文章 Eastsun »

请问这是楼主自己写的吗?
转贴请主明原作者! :!:

zqy881012
會員
會員
文章: 25
註冊時間: 2004-12-29 12:28 PM
來自: china

文章 zqy881012 »

好啦!!
下次一定

Mowd
系統管理員
系統管理員
文章: 1827
註冊時間: 2003-07-16 6:31 PM
來自: 台灣台北
聯繫:

文章 Mowd »

那到底是誰寫的呢?
Mowd 與你的交流天地
歡迎您的到來

Matt
版面管理員
版面管理員
文章: 603
註冊時間: 2003-07-28 3:38 PM
來自: 台灣台北

文章 Matt »

好啦!!
下次一定
請善用編輯文章

頭像
Eastsun
會員
會員
文章: 24
註冊時間: 2004-05-14 9:11 PM
來自: 大陆

文章 Eastsun »

Mowd 寫:那到底是誰寫的呢?
应该是由 clockrun 写的,
适用于大陆的NC3000机型,不一定全适用于台湾版的.

你们可以去 http://wqx.4irc.com/bbs 的NC3000版快上上看(这是由徐洪海做的网站),里面有更详细的文档.
注意:不要用里面的升级文件,那个应该不适用于台湾版

zqy881012
會員
會員
文章: 25
註冊時間: 2004-12-29 12:28 PM
來自: china

文章 zqy881012 »

是clockrun的
我觉得应该可以把tw的机器刷成大陆的
当然反过来因该也可以
毕竟硬件没什么区别

Mowd
系統管理員
系統管理員
文章: 1827
註冊時間: 2003-07-16 6:31 PM
來自: 台灣台北
聯繫:

文章 Mowd »

我也想啊@@,可是不曉得要怎麼刷,如果直接用系統升級會有問題,應該是NOR的關係。之前找到了一些方法可以刷內存,在系統損毀時案F3+RESET會進入等待傳送模式...可我只成功過一次。
Mowd 與你的交流天地
歡迎您的到來

回覆文章