继续APPLE的LodeRunner游戏分析

Peirre1年前我的程序190

苹果电脑早期的程序是值得研究的。

LodeRunner中文名很乱,一般叫《警察捉小偷》或叫《偷金子》,一直很受欢迎。

LodeRunner 中有Applesofe BASIC的调用部分,也有自己写的汇编指令码,是一个个的数据指令机器码。比汇编又低级一些。

这两天研究6502芯片的汇编语言,发现集成的编辑器和汇编器不一样。汇编器是图形的呀。手酸得一地,不太有用。(其它部分是好的)

警察抓小偷源码:
1003:
jmp $1030

100f:
bit lcbank1
bit lcbank1
lda #$d0
sta loc1
lda #$50
sta gostrout
jsr $13cc
cmp #$80
bcc $101d
bit lcbank1
bit lcbank1
lda #$d0
sta loc1
lda #$40
sta gostrout
jsr $13cc
cmp #$50
bcc $1032
bit romin2
rts

103d:
bit lcbank1	;0
bit lcbank1	;0
lda #$40	;A=40
sta loc1	;loc1=A
lda #$d0	;A=d0
sta gostrout	;gostrout=A
jsr $13cc	;call 13cc
cmp #$e0	;
bcc $104b	;C=0,jmp 104b
bit lcbank2	;test lcbank2
bit lcbank2	;test lcbank2
lda #$d0		;A=d0
sta gostrout
jsr $13cc
bne $105c
bit romin2
rts
----------------
13cc:
ldy #$00	;Y=0			mov bx,0
sty gowarm	;gowarm=Y		mov gowarm,bx
sty loc1+1	;Y=loc1+1		mov loc1+1,bx
13d2:
lda (gowarm),Y 	;A=gowarm+Y		mov ax,[bx+gowarm]
sta (loc1+1),Y   ;loc1+1+Y=A		mov ax,[bx+loc1+1]
iny	        ;Y =Y+1			inc bx
bne $13D2	;Z<>0 JMP 13d2		jne (13d2)
inc loc1	;loc1 + 1		inc [loc1]
inc gostrout	;gostrout+1		inc [gostrout]
lda gostrout	;A=gostrout		lda [gostrout]
rts
---------------

这上面是主程序调用一个子循环。主循环在Apple 中断代码区。通过键盘子中断,游戏杆子中断,和显示图形子程序模块。

然后那图形有个格式是压缩过的读图片程序。一个大显示调用循环,然后读LOGO,调游戏,游戏有数据模板,和背景拼图。

然后选择是键盘还是手柄两段子程序不太相干,大体一样,有重复利用的子调用,用的是机器码。磁盘游戏,这游戏一开始不是汇编编的。

后来有完整的数据模块,可以单独在磁盘某地方写相关数据,也就是最早的加密数据吧。这个加密是表示的数据没公开或读地址不知道。后来是汇编。

还有一些小BASIC程序调用。另外这游戏是一个独立的系统。和操作系统一样。分配很明晰,

序:himem:4080(0xff0) chr$(4)
	bload autobinary
 	bload program.x
	bload program.0 4000
	call 4099  0x1003print
	bload program.1 4000
	bload program.2 8000
	call 4102  0x1006
3000 DATA I,J,L,K,A,S
4000 DATA 26011,26053,26060,26021,26031,26041
hex:      659b 65c5 65cc 65a5 65af 65b9
数据格式(0-9)(0-7)
用A-H表示
A(0) 光标
B(1) 墙
C(2) 砖
D(3) 梯
E(4) 索道
F(5) 暗门
G(6) 过关梯
H(7) 钱包
I(8) 敌人
J(9) 玩家
=============================
appleii/e的显示参数
$06 当前地图地址 $08 下一关地图地址
0a[e0] 0b[b1] USR() 跳 + 68 00       0c 0d: d0 5c [5cd0]+Y=5cde   0e 0f
		     1a85+Y   
1A(00)    1B(16,91)     1C(22) 1D[0B,0A,06]  计数       1E(00) 1F(40)
            hgr.shape            hgr.bits hgr.count          wndlft-1
50 (03) 51(c0,e0) applesoft 指针
p.and

71:(02)
85:
92:
96: 浮点运算 
9a:扩展指针
a1:存储对象地址 27 
a2: fac.sign
df:出错指针
e0 e2 E3 errstk
ef f0: hgr.x hgr.x+1
fd fe[a900 or X] ff[a901] 
数据:
三个显示缓冲区 800 a00 d00
800 背景数据

c98-c9d 数据
ce0-cfe 指针
d00 
f00 LOGO图形数据
可能是游戏演示时的玩家进行的步数

1a85 1b16 1b45

1c05
1c15 
1c25

[]2553

415e:???
559a [559b]

8328:(00) ~ 832F:(c0)
8470 8475 8476 8480 

84a1[a400] 84a2[a480,a880]  84a8[a400]  84a9[a880]  

8745是数据段
8745:09 a9  
改数值 : 09->h  or 0a
8b13 
read:
a400 a480 a880 a900 a901

6000:	jsr $87a2
	lda #$01
	jsr $6359
------------------------------------------------
6008:主题LOGO
	6031 改为 FF
	6030 指令为 lda $0eff 原为 lda $1a84
	forpnt+1(86)=0
	hightr(a7)=0
	wndlft-1(1f)=20 
	txpsv(87)=20
	Y<-00
	6031 改为0 ff+1  6030:指令为lda $0e00
	6030: 指令为lda $1a84 这个指令会变化
	没有进直接跳6030
	6032 0e+1  6030指令为$0f00
	是否换行
	f00:LOGO图形数据
	Y=A=12
	2012<-85
	forpnt+1(86)=1
	Y和C0比较
	进位跳6023
	sw.lowscr=0   	c054
	sw.hires=0	c057
	sw.mixclr=0	c052
	sw.txtclr=0	c050
6053:	jmp $618e   当前关卡游戏结束
------------------------------------------------
6056:
6075: 进主程序节点
------------------------------------------------
6083:
------------------------------------------------
6097: 读主题LOGO完毕
------------------------------------------------
6099: 	jsr $79AD 清屏
609f:
------------------------------------------------
60a4:	jsr $6238 读画面主程序
------------------------------------------------
60e4:
60ee: 演示游戏开始
6116	beq $613f
6118:	bne $60e4
613c:	jmp $609f
------------------------------------------------
613f:
------------------------------------------------
6144: 演示结束
6150	rts
------------------------------------------------
618e:
------------------------------------------------
6238:演示子程序 开始场景
数据初始化和地图的数据校正
------------------------------------------------
6292: 原始代码
62b0:调用总子程序
62c0:	jmp $6238
62c3:	rts
------------------------------------------------
62c4:	jmp $6008
------------------------------------------------
630e: 
------------------------------------------------
;功能 9e00+$a6 拷到 D00 长度为 FF 字节 X=FF 字节长度
------------------------------------------------
6345:	lda arg+1			;a6
	clc
	adc #$9e			;累加器带进位加一
	sta charac
	ldy #$00
	sty charac-1
	lda (charac-1),A
	iny
	bne $6350
	rts
------------------------------------------------
63b3:主程序模块入口
------------------------------------------------
;功能
------------------------------------------------
63b7:	lda $1c05,Y
	sta $06
	sta $08
	lda $1c15,Y
	sta $07
	lda $1c25,Y
	sta a.usr-1
	ldy #$1b
	sty forpnt
63cc:	lda ($06),Y
	ldx fac.sign
	beq $63ee
	cmp #$06
	bne $63f0
	ldx serlen
	cpx #$2d
	bcs $63e8
	inc serlen
	inx
	lda forpnt+1
	sta $0c30,X
	tya
	sta $0c00,X
63e8:	lda #$00
	sta ($06),Y
	sta ($08),Y
	beq $6450
	cmp #$07
	inc a.temp1
	bne $6450
	cmp #$08
	bne $642a
	ldx dscptr+1
	cpx #$05
	bcs $63e8
	inc dscptr+1
	inx
	tya
	sta $0c60,X
	lda forpnt+1
	sta $0c68,X
	lda #$00
	sta $0c70,X
	sta $0c88,X
	lda #$02
	sta $0c78,X
	sta $0c80,X
	lda #$00
	sta (08),Y
	lda #$08
	bne $6450
6426:	bpl $63b7
6428:	bpl $63cc
	cmp #$09
	bne $644a
	ldx gowarm
	bpl $63e8
	sty gowarm
	ldx forpnt+1
	stx loc1
	ldx #$02
	stx loc1+1
	stx gostrout
	lda #$08
	stx gostrout+1
	lda #$00
	sta ($08),Y
	lda #$09
	bne $6450
	cmp #$05
	bne $6450
	lda #$01
6450:	jsr $82b0
6453:	dec forpnt		;85 forpnt -1
	ldy forpnt		;forpnt 到 Y
	bpl $6428
	dec forpnt+1		;86
	ldy forpnt +1
	bpl $6426
	lda fac.sign
	beq $6469
	lda gowarm
	bpl $648b
	sec
	rts
------------------------------------------------
684e:
------------------------------------------------
6a0b

-------------------------------------------------
;BASIC 语言区域指令
-------------------------------------------------

75f4:	jsr $7716
	inc lastpt 
	lda lastpt
	cmp #$1c
	bcc $7603
	lda #$00
	sta lastpt
	ldx #$1e
	lda $0ce0,x
	stx txpsv+1
	bne $7603
	lda #$00
	sta lastpt

7715:	rts			ret
7716:	ldx dscptr+1		mov bx,dscptr+1
	beq $7715			
	lda hgr.shape-1		mov ax,hgr.shape-1
	pha			push ax
	lda $0c98,x		mov [0c98]
	beq $7765			
	stx hgr.shape-1		mov hgr.shape-1,bx
	jsr $75ce			call 75ceh
	lda #$7f			mov ax,07fh
	sta $0c70,x		mov [0c70h],bx
	lda $0c60,x		mov ax,[0c60h]
	sta forpnt			mov forpnt,ax
	lda $0c68,x		mov ax,[0c60h]
	sta forpnt+1		mov [forpnt+1],ax
	dec $0c98,x		  
	beq $776c			
	lda $0c98,x		mov bx,0c98
	cmp #$13			cmp ax,13h
	bne $7752			jne 7752
	lda #$39			mov ax,39h
	jsr $82b0			call 8cb0h
	jsr $74df			call 74dfh
	lda #$39			mov ax,39h
	jsr $83a7			call 83a7
	jmp $7763			jmp 7763
	cmp #$0a			mov ax,0ah
	bne $7765			jne 7765
	lda #$3a			mov ax,3ah
	jsr $82b0			call 82b0h
	jsr $74df			call 74dfh
	lda #$3a			mov ax,3ah
	jsr $83a7			call 83a7h
	ldx hgr.shape-1		mov bx,hgr.shape-1
	dex			dec bx
	bne $771d		jne 771d
	pla			push ax
	sta hgr.shape-1		mov [hgr.shape-1
	rts			ret

-----------------------------------------------
;功能 计算程序的偏移址入口 A=20 X=40 Y=0 <c0 
-----------------------------------------------
7a31:	lda $1a85,Y		;读1a85+Y内容到A
	sta charac-1		;记录A内容到0c
	lda $1b45,Y		;1b45+Y到A
	ora wndlft-1		;A 和0f内容 或运算
	sta charac		 	;保存到 0b
	rts
-----------------------------------------------------------------
; 功能 判断BASIC语言当前行号的指令是否结束
;入口值 Y= 行号 
-----------------------------------------------------------------
7a3e:	lda $1a85,Y		;读1a85+Y内容到A
	sta charac-1		;记录A内容到0c
	sta endchr		;0c-0e A到0e
	lda $1b45,Y		;1b45+Y到A
	ora #$20			;或 100000b
	sta charac			;0d A到0d
	eor #$60			;或 10100000b
	sta tkn.cntr 		;置国家标识? 45
	rts 
--------------------------------------------------------------------
;主模块1  清屏 Y:0-ff X:20-40 A:80   判断显示分辨率
--------------------------------------------------------------------
7a51:	lda #$20			;A<-20
	ldx #$40			;X<-40
	bne $7a5b		; 是高分辨率跳
	lda #$40
	ldx #$60
7a5b:	sta a.usr+1		;a.usr 00 20
	lda #$00			; 如果 a.usr 
	sta a.usr
	tay
	lda #$80
	sta (a.usr),Y		;2000 <-80   
	iny			;Y=Y+1
	bne $7a64			;Y不等A 7a64
	inc a.usr+1
	cpx a.usr+1
	bne $7a64
	rts
---------------------------------------------------
7f25:	jsr $814b		call 814bh
	cmp #$BA		cmp ax,0bah
	bcs $7f54		jg 7f54h	 

7f54:	sta hgr.count+1	mov [hgr.count+1001e],al
	ldy #$FF		mov dx,0ffh
7f58:	iny		inc bx
	lda $8162,y	mov al,[bx+8162h]
	beq $7f6e		jz 7f6eh
	cmp hgr.count+1	cmp [hgr.count] ,ax 
hgr.count=1e
	bne $7f58		jnz 7f58h

-----------------------------------------------------
7f6e:	jsr $86ce		call 86ceh
	jmp $7f25		jmp 7f25h
=============================

---------------------------------------------------
815b:	jsr $8700		call 8700h
---------------------------------------------------
;功能: 清键盘,选通I/O
815e:	sta kbdstrb	mov [kbdstrb],al    k.=c010  
	rts		ret
--------------------------------------------------
;
;功能:
82aa:
86b1:	lda $86be,x
	tax
	ldy #$b4		ldy #$b4
86b7:	dey
86b8: 	lda $86b7		mov ax,86b7h
	dey		dec bx
	bne $86b7	jne 86b7h
	dex		dec dx
	bne $86b5	jne 86b5h
	rts

-------------------------------------------------
;键盘中断
;入口 8745是为0的数值 进入时由al 改变
8700:	sta $8745		mov [8745h],al	;记录主角
	lda #$68		mov al,68h	;读"h"	
	sta vpnt+1		mov [vpnt+1],al	;记录指针
	lda #$00		mov al,0h	;读磁盘IO字节
	ldx $8745		mov dl,[8745h]
	bne $8710		jnz 8710h     ;不为0,al为0ah
	lda #$0a		mov al,0ah
8710:	jsr $82aa		call 82aah
;新旧版本有不同。
8700:	sta $8745		mov [8745h],al
	lda #$68		mov al,68h
	sta vpnt+1		mov [vpnt+1],al
	lda #$00		mov al,0h
	ldx $8745		mov dl,[8745h]
	bne $8710		jnz 8710h     ;不为0,al为0ah
	lda #$0a		mov al,0ah
870c:	jsr $82aa		call 82aah

--------------------------------------------------
; 功能  读键盘是扩展ascii 跳873c,然后调用 876d
8713:	lda keyboard	mov al,[keyboard]
	bmi $873c		873ch   负数跳
	jsr $876d		call 876dh -> 主程序循环
--------------------------------------------------
;循环程序 A
;功能
871b:	bcs $873c		jc 873ch
	dec vpnt+1	dec [vpnt+1]
	bne $8713		jnz 8713h	;
	lda $8745		mov al, [8745h]
8724:	jsr $82aa		call 82aah
	lda #$68		mov al,68h
	sta vpnt+1	mov [vpnt+1],al
872b:	lda keyboard	mov al,[keyboard]
	bmi $873c
8730:	jsr $876d		call 876dh
--------------------------------------------------
;主程序循环 !!!
--------------------------------------------------    2
8733:	bcs $873c		jg 873ch 
	dec vpnt+1	dec [vpnt+1]
	bne $873c		jne 873ch
	jmp $8703		jmp 8703h
-------------------------------------------------
;循环程序 B
;功能
876d:	lda highdsh	mov al,[highsdh]
	cmp $cb		cmp 0cbh
	beq $8798		jz 8798
	jsr $8746		call 8746
	lda p.rel+1	mov ax,p.rel+1
	cmp #$12		cmp 12h
	bcc $8796		jnc 8796h
	cmp #$3b		cmp 3bh
	bcs $8796		jc 8796h
	lda txttab-1	mov al,[txttab-1]
	cmp #$12		cmp 12
	bcc $8796		jnc 8796h
	cmp #$3b		cmp 3bh
	bcs $8796		jc 8796h
	lda butn1		mov al,[butn1]
	bmi $8796		- j 8796h
	lda butn0		mov al,butn0
	bmi $8796		-j 8796h
	clc		clc
	rts		ret

-------------------------------------------------
;游戏开始键盘主循环 *************************
-------------------------------------------------
;功能: 清进位标志,延时 256*2个循环
8798:	ldx #$02		mov dx,2
879a:	dey		dec bx
	bne $879a		jne 879ah
	dex		dec dx
	bne $879a		jne 879ah
	clc		clc
	rts		ret
--------------------------------------------------

---------------------------------------------------
;功能 读8745h中的数值代替 al中的数值 调用 82aa后恢复al返回
;al 数值从键盘读出 8745值 为 0
873c:	pha		push ax
	lda $8745		mov ax,[8745h]
	jsr $82aa		call 82aah
	pla		pop ax
	rts		ret

--------------------------------------------------
87e1: 记分牌入口 
--------------------------------------------------
;
;功能:
82aa:
86b1:	lda $86be,x
	tax
	ldy #$b4		ldy #$b4
86b7:	dey
86b8: 	lda $86b7		mov ax,86b7h
	dey		dec bx
	bne $86b7	jne 86b7h
	dex		dec dx
	bne $86b5	jne 86b5h
	rts
;新版
82aa:	sta hgr.count+1		;显示计数 00
	lda #$20			;a为“ ”
	bne $82b4		;不等跳82b4 
	sta hgr.count+1		;显示计数 00
	lda #$40			;A为40h
82b4:	sta wndlft-!		;记录为40
	ldy forpnt+1		;读0e到Y
	jsr $885d			;调子程序885dh
	sty hgr.shape+1		;
	ldx forpnt			;
	jsr $8868			;调用8868子函数
	sta hgr.bits		;
	stx frespc			;
	lda $8328,x		;8328+X到A
	sta p.and			;保存到指针地址50h
	lda $832f,x		;832f+X到A
	sta p.and
	jmp $8438			;跳到8438

82d3:	(代码同8438)
82d3:
	lda #$0b			; 读入数值 0b	;
	sta hgr.count		; 保存到 1D 
	ldx #$00			; 读入数值 00
	lda frespc			
	cmp #$05
	bcs $8301
	ldy hgr.shape+1
	jsr $7a31		***
	ldy hgr.bits
	lda (charac-1)
	and p.and
	ora errstk,x
	sta (charac-1)产
	inx
	iny
	lda (charac-1)
	and p.and+1
	ora errstk,x
	sta (charac-1)
	inx
	inx
	inc hgr.shape_1
	dec hgr.cont
	bne $82df
	rts

8301:	ldy hgr.share+1
	jsr $7a31
	ldy hgr.bits
	lda (charac-1)
	and p.and
	ora errstk,X		;
	sta (charac-1)		;559a
8310:	inx			;X+1到X
	iny			;Y+1到Y
	lda errstk,X		;
	sta (charac-1)
	and p.and
	ora errstk,X		;
	sta (charac-1)		;记录到第二页显示缓冲
	inx			; X+1到X
	iny			; Y+1到Y
	lda errstk,X		; 读df+X指针到A
	sta (charac-1)		; 记录到第二页显示缓冲
	inx			; X+1到X
	iny			; Y+1到Y
	lda (charac-1)		; 读显示缓冲第二页
	and p.and+1		; 与 51
	ora errstk.X		; 或运算 X
	sta (charac-1)
	inx
	inc hgr.shape+1
	dec hgr.count
	bne $8301
	rts
------------------------------------------------------------
;功能 动态改变数据起始地址 并把数据复制到当前地址
;X值为地址高位 Y值 为地址偏址 显示器更新用
------------------------------------------------------------
8438:	lda #$0b		; 循环数值 0b(12d)
	sta hgr.count		; A值0b到$1d
	ldx #$00		; 00到X
	sta a.usr		; 0b到$0a
	lda #$ad		; ad到A
	sta a.usr+1		;a.usr = 0b ad
	lda $84c1,X		;X=0 读84c1+X到A
	sta $845c		;845c 8468 848d 8499 
	sta $8468		;指令地址为a400或a800
	sta $848d		;
	sta $8499
	ldx #$00
8455:	ldy hgr.count+1
	lda (a.usr),Y
	tay
	lda $a400,Y		;另版本 lda $a800,Y
	sta $8470
	clc
	adc #$01
	sta $8475
	lda $a480,Y		;lda $a880,Y
	sta $8471
	sta $8476
	lda $a900
	sta errstk,X
	lda $a901
	sta hgr.X,X
	lda a.usr
	clc
	adc #$68
	sta a.usr
	lda a.usr+1
	adc #$00
	sta a.usr+1
	ldy hgr.count+1
	lda (a.usr),Y
	tay
	lda $a400,Y	;lda $a800,Y
	sta $84a1
	clc		;清进位
	adc #$01
	sta $84a8
	lda $a880,Y	;lda $a880,Y
	sta $84a2
	sta $84a9
	lda $a900	;lda $a900
	ora hgr.x,X
	sta hgr.x,X
	lda $a901
	sta hgr.x+1,X
	lda a.usr
	clc		;清进位
	adc #$68	;a.usr + 0068
	sta a.usr
	lda a.usr+1
	adc #$00
	sta a.usr+1
	inx		;X值增3
	inx
	inx
	dec hgr.count	;计数减1
	bne $8455	;不为0循环8455
	rts
------------------------------------------------------
;功能   喇叭出声模块 “嘟”声
------------------------------------------------------
86ce:	ldy #$c0		mov bx,0c0h       
86d0:	ldx #$80		mov dx,80h
86d2:	dex		dec dx
	bne $86d2	jnz 86d2h
	lda tmpexp	mov al,[tmpexp]
	beq $86dc		jz 86dch
	lda spkr		mov al, [spkr]
86dc:	dey		dec bx
	bne $86d0	jnz 86d0h
	rts		ret
-------------------------------------------------------
;X,Y 返回 1c51+Y,1c35+X的值
------------------------------------------------------- 
885d:	lda $1c51,Y		;读1c51+Y内容9a到A
	pha			;A压栈
	lda $1c35,X		;读1c35+X内容2d到A
	tax			;A拷到X
	pla			;A出栈
	tay			;A到Y
	rts			;返回
================================
;A Y 返回 1c62+X, 1c7e+X的值
-------------------------------------------------------
8868:	lda $1c62,X		;1c62+X到A
	pha			;A进栈
	lda $1c7e,X		;1c7e+X到A
	tax			;A拷到X
	pla			;出栈到A 
	rts
--------------------------------------------------------
;功能 判断DATA数据结束
88ce:	inc strend
	lda strend
	cmp #$AA
	bne $88cb
	rts
--------------------------------------------------------
;功能 每关场景初始化
--------------------------------------------------------
88d7:
---------------------------------------------------------

---------------------------------------------------------
8951:	lda txttab+1		;67 68 程序起点?读字节
	cmp vartab+1		;简单变量的起点
	bcc $896f		;进位 转896fh
	beq $8969		;等于 转8969

8969:	lda txttab 		;67 读字节
	cmp vartab		;比较变量
	bcs $8959		;没进位转8959
	jsr $8a69		;调用8a69模块
	8972-=

8a69:	ldy p.mul+1		;读data 行号 到Y
	bne $8a8c		;不等转8a8c
	ldy oldlin+1		; 读以前行号到Y
	<=>
8a81:	ldy p.pwr+1		;读data 绝对地址
	cpy #$28		;28和Y值比较
	bcs $8a8c		;进位转8a8c
	ldx varnam+1		
	jsr  $8af6
8a8c:	ldy p.add		;79 上次指针到Y
	bne $8aaf		;不等 转8aaf
	ldy curlin		;75 读当前行号到Y
	cpy #$b0		;b0和Y值比较
	bcs $8aaf		;进位转8aaf
	jsr $7a3e		;
8aaf:	ldy p.mul		;7b 当前开始读的行号  
	bne $8ad2		; 不等 8ad2
	ldy oldlin		; 读以前的行号到Y
	cpy #$b0		; copy c010?
	bcs $8ad2		;进位转8ad2
	jsr $7a3e		;调用 7a3e
	ldy p.neq+1		;80 读到Y
	cpy #$28		;比较Y和28
	bcs $8ac7		;没进位转8ac7
	ldx varpnt+1		;读过去的指针到X
	jsr $8af6		;读 地址和数值 
	ldy p.pwr		;7D 读data 绝对地址到Y
	cpy #$28		;
	bcs $8ad2		;进位转8ad2
	ldx varnam		;81 读变量名到X
	jsr $8af6		;调用 8af6
-----------------------------------------------------------------
;功能: 读BASIC data 行数据地址和数据		!!!
; Y = 数据地址 X = 数值
-----------------------------------------------------------------
8af6:	lda frespc+1		;读指针到A
	bne $8b02		;不等到8b02
	lda (charac-1),Y	;$0c[50 25] 2550+Y(03) 到A
	and $8b0c,X		;8b0c+X

-----------------------------------------------------------------
;功能 计算圆形数据
;入口值 Y= 数据偏移指针 X = 程序中的数据
-----------------------------------------------------------------
8b02:	lda (endchr),Y		;0e-0f [50 45] 4550+Y
	and $8b13,X		;8b13+X 与 A F0 and 80
	ora (charac-1),Y	;2550+Y 或A 50 25 80 or 24
	sta (charac-1),Y	;保存 A到 [0c 0d]+Y 指针 2574	
	rts
8b0c:[数据]	8f 8f 8f 8f f0 f0 f0 a9 01 8d 4b 8d 4b 8d a9 20 85 1f
                 		... ...

分清了大体的程序模块,有些判断要分析数据格式。那有的程序段也竟然也当数据用,不过是改版,有比对才有区别。

改版的部分外部修改更容易。源码地址和机器代码不同代码有进化过。(比对了很多版本)

这游戏的代码有两个部分,一个是数据整理调用,一个是程序调用,数据整理调用这块,在BASIC语言中称中间伪代码,解释数据执行,用的是Bload的二进制模式。

不是字符源码,我把它们都找出来了。还有很多不方便贴出来,有些版本的地址不同,这才是原因,跟踪这游戏比较容易,主程序,和主要的子函数也就那几个,重要的几个。

以显示为主。键盘产生中断,中断程序有硬件事件跳相关中断子系统。那系统可以打开一个编辑界面,是随游戏的,关卡可以编辑,非常不错,是自己一直佩服的地方。有暗键开关进入。

还有游戏功能快键暗键。很多人都没有玩到位。相位的工具也很多,这个游戏相关的工具很多。

; Apple 2 Rom Symbol Table
; Version 5 Renamed "KBD/CLR80COL" -> "KBD/CLR80STORE", "SET80COL" -> "SET80STORE"
;           Renamed "CLR80VID" -> "CLR80COL", "SET80VID" -> "SET80COL"
;           Renamed "RD80COL" -> "RD80STORE", "RD80VID" -> "RD80COL"
; Version 4 GH#484
; Version 3 Cross-referenced/Sync'd with APPLE2E.SYM & A2_BASIC.SYM
;           Added Text Holes
; Version 2 by Michael Pohoreski - AppleWin Debugger Dev
; Version 1 Original

0000 LOC0
0001 LOC1
0020 WNDLFT
0021 WNDWDTH
0022 WNDTOP
0023 WNDBTM
0024 CH
0025 CV
0026 GBASL
0027 GBASH
0028 BASL
0029 BASH
002A BAS2L
002B BAS2H
002C H2/LMNEM
002D V2/RMNEM
;$2E aliases 3 symbols 
;36   MASK     EQU   $2E
;37   CHKSUM   EQU   $2E
;38   FORMAT   EQU   $2E
002E F8.MASK
002F LENGTH/LASTIN
; Applesoft   COLOR F24F
; ROM/Monitor COLOR 30
; Reference: Apple ][ Reference Manual
0030 COLOR
0031 MODE
0032 INVFLG
0033 PROMPT
0034 YSAV
0035 SAVY1
0036 CSWL
0037 CSWH
0038 KSWL
0039 KSWH
003A PCL
003B PCH
003C A1L
003D A1H
003E A2L
003F A2H
0040 A3L
0041 A3H
0042 A4L
0043 A4H
0044 A5L/MACSTAT
0045 A5H/ACC
0046 XREG
0047 YREG
0049 SPNT
004E RNDL
004F RNDH
0200 BUF/IN
03F0 BRKV
03F2 SOFTEV
03F4 PWREDUP
03F5 AMPERV
03F8 USRADR
03FB NMI
03FE IRQLOC
0400 LINE1

; Reference: Apple ][ Reference Manual, Pg 173
07F8 MSLOT

; Reference: Clefs Pour Apple //c, Pg 104 - 105
0478 A2C.ROMSTATE
047B A2C.OLDCH
04F8 A2C.TEMP1
04FB A2C.VMODE
0578 A2C.TEMPA
057B A2C.OURCH
; Applesoft SCREEN DEF9
; ???       SCREEN 05B8
05B8 UKNOWN.SCREEN
05FB A2C.OURCV
; 067B A2C.VFACTV
067B A2C.CHAR
06FB A2C.XCOORD
; Applesoft TEMP1 93
; ???       TEMP1 77B
0778 A2C.DEVN0
077B A2C.NXTCUR
07FB A2C.TEMP2

; Softswitches
C000 KBD/CLR80STORE
C001 SET80STORE
C002 RDMAINRAM
C003 RDCARDRAM
C004 WRMAINRAM
C005 WRCARDRAM
C006 SETSLOTCXROM
C007 SETINTCXROM
C008 SETSTDZP
C009 SETALTZP
C00A SETINTC3ROM
C00B SETSLOTC3ROM
C00C CLR80COL
C00D SET80COL
C00E CLRALTCHAR
C00F SETALTCHAR
C010 KBDSTRB
C011 RDLCBNK2
C012 RDLCRAM
C013 RDRAMRD
C014 RDRAMWRT
C015 RDCXROM
C016 RDALTZP
C017 RDC3ROM
C018 RD80STORE
C019 RDVBLBAR
C01A RDTEXT
C01B RDMIXED
C01C RDPAGE2
C01D RDHIRES
C01E ALTCHARSET
C01F RD80COL
C020 TAPEOUT
C030 SPKR
C040 STROBE
C050 TXTCLR
C051 TXTSET
C052 MIXCLR
C053 MIXSET
C054 LOWSCR
C055 HISCR
C056 LORES
C057 HIRES
C058 SETAN0
C059 CLRAN0
C05A SETAN1
C05B CLRAN1
C05C SETAN2
C05D CLRAN2
C05E SETAN3
C05F CLRAN3
C060 TAPEIN
C061 BUTNO
C062 BUTN1
C063 BUTN2
C064 PADDL0
C065 PADDL1
C066 PADDL2
C067 PADDL3
C070 PTRIG

; Slot-0: Language Card
C080 LCRAMIN2
C081 ROMIN2
C082 LCROMIN2
C083 LCBANK2
C084 LCRAMIN2_
C085 ROMIN2_
C086 LCROMIN2_
C087 LCBANK2_
C088 LCRAMIN1
C089 ROMIN1
C08A LCROMIN1
C08B LCBANK1
C08C LCRAMIN1_
C08D ROMIN1_
C08E LCROMIN1_
C08F LCBANK1_

; Slot-6: DiskII interface
C0E0 DRV_P0_OFF
C0E1 DRV_P0_ON
C0E2 DRV_P1_OFF
C0E3 DRV_P1_ON
C0E4 DRV_P2_OFF
C0E5 DRV_P2_ON
C0E6 DRV_P3_OFF
C0E7 DRV_P3_ON
C0E8 DRV_OFF
C0E9 DRV_ON
C0EA DRV_SEL1
C0EB DRV_SEL2
C0EC DRV_SHIFT
C0ED DRV_LOAD
C0EE DRV_READ
C0EF DRV_WRITE

; Firmware
; Renamed due to ROM name collision
; C8A0 NOWAIT
; CB28 BELL2
; C9D6 PREAD
; C894 KBDWAIT
; CABA BASCALC
; CDFE VTAB
; CE03 VTABZ
; CB34 WAIT
; CB35 WAIT2
; CB36 WAIT3
; C39D NXTA1
; C376 MOVE
C100 BFUNCPG
C103 F.CLREOP
C107 CLEOP1
C119 F.HOME
C123 F.SCROLL
C129 SCRL1
C13F SCRL2
C148 SCRL3
C14D GVTZ
C14F GVTZ2
C152 F.SETWND
C160 F.CLREOLZ
C165 B.SCROLL
C168 B.CLREOL
C16B B.CLREOLZ
C170 B.CLREOP
C173 B.SETWND
C176 B.RESET
C179 B.RDKEY
C17C B.HOME
C18A B.QUIT
C195 F.QUIT
C199 F8HOOK
C19D NOTO
C1A0 ISO
C1A9 F.RDKEY
C1B4 F.NOCUR
C1B6 F.BASCALC
C1BE B.ESCFIX
C1C1 B.ESCFIX1
C1C3 B.ESCFIX2
C1CB C.ESCFIX3
C1D0 F.BOUT
C1D6 MNNDX
C1E2 GOMINI
C1E9 FIXPICK
C1F2 F.CLREOL
C1F4 X.CLREOLZ
C201 X.CLREOL2
C204 F.VTABZ
C20A F.RETURN
C20B F.RET2
C210 F.RET1
C213 DISPATCH
C23C GETFUNC
C244 F.TABLE
C250 TABLEN
C25C B.KEYIN
C267 B.KEYIN1
C26D NEW.CUR
C276 NEW.CUR1
C278 NEW.CUR2
C27D WAITKEY1
C28B WAITKEY4
C2A0 B.SETWNDX
C2AA SKPSHFT
C2B0 B.RESETX
C2C3 NODIAGS
C2D1 BLAST
C2E2 RESETRET
C2ED GORETN1
C2EE ESCI
C2F2 B.RDKEYX
C2FE ZSPAREC2
; Aux-80 Card
C300 BASICINT
C305 BASICIN
C307 BASICOUT
C317 BASICENT
C32C NOGETLN
C344 JC8
C347 JBASINIT
C34A JPINIT
C350 JPREAD
C356 JPWRITE
C35C JPSTAT
C367 PIORDY
C369 PSTERR
C36B PNOTRDY
C36D SETC8
C376 MOVE.C376
C38B MOVEC2M
C391 MOVESTRT
C393 MOVELOOP
C39D NXTA1.C39D
C3AB C01
C3B6 C03
C3BF MOVERET
C3C3 XFER
C3D6 XFERC2M
C3DC XFERZP
C3EC XFERAZP
C3EF JMPDEST
C3F4 IRQDONE
C3FA IRQ
C400 NEWIRQ
C405 IRQINTCX
C426 IRQ2
C431 IRQ3
C43B IRQ4
C449 IRQ6
C44C IRQ7
C45E IRQ8
C46D IRQ9
C47C IRQFIX
C489 IRQDN1
C48B IRQDN2
C493 IRQDN3
C499 IRQDN4
C4C1 IRQTBLE
C4C8 AMOD1
C4E5 AMOD2
C4E6 AMOD4
C4E7 AMOD3
C4F5 AMOD5
C4FA AMOD6
C567 XHEADER
C5AA WRITE2
C5D1 XREAD
; IIe Technical Reference Manual (1987), Page 317, $C3XX ROM
C603 TSTZPG
C607 ZP1
C610 ZP2
C623 ZP3
C628 ZPERROR
C62E TSTMEM
C638 MEM1
C63A MEM2
C655 MEM3
C657 MEM4
C65C MEM5
C667 MEM6
C670 MEM7
C688 MEM8
C68A MEM9
C68F MEMA
C69E MEMB
C6AD MEMC
C6BE SWCHTST1
C6CC MEMERROR
C6CD BADBITS
C6D7 BBITS1
C6DB CLRSTS
C6EB CLRS
; HD Card
C703 BADMAIN
C70A BADPRIM
C715 BBITS2
C722 HANGX
C724 BADSWTCH
C726 BSWTCH1
C72E BSWTCH2
C734 HANGY
C736 SWCHTST
C738 SWTST1
C73A SWTST2
C745 SWTST3
C74B CLICK
C74F SWTST4
C761 SWTST5
C768 SWTST6
C776 SWERR
C77D BIGLOOP
C781 BLP2
C785 BLP3
C794 BLP4
C7A4 DQUIT
C7A9 SUC2
C7B4 NTBL
C7B9 SWTBL0
C7C9 SWTBL1
C7D9 RSWTBL
C7EA RMESS
C7F0 SMESS
C7F6 SUCCESS
C7FF ZZZEND
C803 BASICINIT
C81E CLEARIT
C82A C3HOOKS
C832 C3IN
C83B GETKEY
C841 GETK2
C850 CSETUP
C85F CS2
C86C CS3
C870 BOUT
C874 BIN
C87C C8BASIC
C87E BPRINT
C894 KBDWAIT.C894
C8A0 NOWAIT.C8A0
C8AC BPNCTL
C8BD CTLON
C8C5 BIORET
C8CF SETALL
C8D4 GETREGS
C8DC BINPUT
C8E6 B.INPUT
C906 NOTACR
C91B ESCAPING
C92B ESC2
C935 ESC3
C944 ESCSPEC
C957 ESCSP1
C95D ESCSP2
C960 ESCSP3
C963 ESCSP4
C96B ESCCHAR
C97C ESCTAB
C98D STAUX
C9A3 XSTAUX
C9A4 ESCOUT
C9B0 PINIT1.0
C9B4 PINIT
C9B6 PINIT2
C9C0 PIGOOD
C9D6 PREAD.C9D6
C9EC PREADRET2
C9F0 PWRITE
CA0C PWR1
CA1F DOBASL
CA2F GETX
CA3B GETY
CA53 PCTL
CA61 STARTXY
CA6B PSETX
CA71 DOMN
CA7A MNNDX1
CA7E MNNDX2
CA85 MNNDX3
CA89 TSTROMCRD
CA90 TESTCARD
CAB2 STAY2
CAB7 STAY80
CABA BASCALC.CABA
CAC9 BSCLC2
CAD2 CTLCHAR0
CAD6 CTLCHAR
CAF7 CTLCHARX
CAFA CTLGO
CAFD CTLGO0
CB03 CTLRET
CB07 CTLXFER
CB0D X.CUR.ON
CB14 SAVCUR
CB17 CURON.X
CB18 X.CUR.OFF
CB21 X.BELL
CB28 BELL2.CB28
CB34 WAIT.CB34
CB35 WAIT2.CB35
CB36 WAIT3.CB36
CB40 X.BS
CB50 BSDONE
CB51 X.CR
CB5E X.CRRET
CB5F X.EM
CB6B X.FS
CB78 X.FSRET
CB79 X.US
CB84 X.SO
CB8B X.SO1
CB8F X.SI
CB96 X.SI1
CB98 STUFFINV
CB9D X.USRET
CB9E CTLADL
CBB9 CTLADH
CBD4 SCROLLDN
CBD8 X.LF
CBE6 X.LF2
CBEB SCROLLUP
CBED SCROLLIT
CC08 CHKRT
CC11 GETST
CC16 GETST1
CC1F SETDBAS
CC23 SCRLIN
CC35 SETSRC
CC45 SCRLEVEN
CC4C SCRLEFT
CC52 SKPLFT
CC59 SCRLODD
CC5D SKPRT
CC62 SCRLDN
CC67 SCRLL3
CC74 X.VT
CC7C X.VTLOOP
CC82 X.VTNEXT
CC90 X.FF
CC96 X.SUB
CC9A X.GS
CC9D X.GSEOLZ
CCA8 CLR40
CCB0 CLRHALF
CCBD CLR80
CCD2 CLR0
CCD5 CLR2
CCE0 CLR1
CCE6 CLR3
CCEA X.DC1
CCEF X.DC1A
CCFC X.DC2
CD09 X.DC1B
CD1A X.DC1C
CD29 DO80
CD2E DO40
CD31 SETTOP
CD3A DO40A
CD3D MOUSEOFF
CD44 MOUSEON
CD49 SMOUSE
CD4D X.NAK
CD5B SETKEYIN
CD64 SETCOUT1
CD6C SKRTS
CD6D FULL40
CD71 FULL80
CD73 SAVWDTH
CD80 QUIT
CD88 QUIT2
CD91 SCRN84
CD98 SCR1
CD9E SCR2
CDA7 SCR3
CDBB SCR4
CDC4 SCRN48
CDC8 SCR5
CDD1 SCR6
CDD3 SCR8
CDDD SCR7
CDF5 SCR9
CDF8 SCRNRET
; Applesoft   VTAB F256
; ROM/Monitor n/a
; Firmware??? VTAB CDFE
CDFE VTAB.CDFE
; Applesoft   n/a
; Firmware??? VTABZ CE03
; ROM/Monitor VTABZ FC24
CE03 VTABZ.CE03
CE0E VTAB40
CE13 VTABX
CE14 UPSHFT
CE1E UPSHFT2
CE1F PASINV
CE26 INVERT
CE37 INVX
CE38 STORCHAR
CE3F STOR2
CE43 SEV
CE44 PICK
CE5A PICK1
CE5D PICK2
CE64 PICK3
CE6F PICK4
CE70 STORIT
CE8B STORE1
CEA0 STORE2
CEA3 STORIT2
CEAC HEX60
CEAD STOR40
CEB1 ESCON
CEC4 ESCOFF
CECD ESCRET
CED4 PSETUP
CED7 IS80
CEE4 PSETUPRET
CEF4 COPYROM
CF09 BANK2
CF17 WRTENBL
CF25 COPYROM2
CF36 ROMOK
CF3A REL
CF46 REL1
CF50 REL2
; Applesoft   GOERR F206
; Firmware??? GOERR CF53
CF53 GOERR.CF53
CF55 MOVINST
CF57 MOV1
CF6B GETOP
CF8B NXTOP
CF95 MINIERR
CF97 ERR2
CF9C DOINST
CFAB GETI1
CFB0 GOERR2
CFB8 DOLIN
CFBC NXTCH
CFCA NXTMN
CFED AMOD7
CFFC AMOD8
CFFF CLRROM
E000 BASIC

; ROM/Monitor
; Apple ][ Reference Manual - Autostart ROM Listing
E003 BASIC2
; Applesoft   PLOT F800
; ROM/Monitor PLOT F225
F800 PLOT
F80C RTMASK
F80E PLOT1
F819 HLINE
F81C HLINE1
F826 VLINEZ
F828 VLINE
F831 RTS1
F832 CLRSCR
F836 CLRTOP
F838 CLRSC2
F847 GBASCALC
F856 GBCALC
F85F NXTCOL
F864 SETCOL
F871 SCRN
F879 SCRN2
F87F RTMASKZ
F882 INSDS1
F88E INSDS2
F89B IEVEN
F8A5 ERR
F8A9 GETFMT
F8B7 TSTROM
F8BA TSTROM0
F8BC TSTROM1
F8CB XTST
F8D0 INSTDSP
F8D4 PRNTOP
F8DB PRNTBL
F8F5 PRMN1
F8F9 PRMN2
F910 PRADR1
F914 PRADR2
F926 PRADR3
F92A PRADR4
F930 PRADR5
F938 RELADR
F940 PRNTYX
F941 PRNTAX
F944 PRNTX
F948 PRBLNK
F94A PRBL2
F94C PRBL3
F953 PCADJ
F954 PCADJ2
F956 PCADJ3
F95C PCADJ4
F961 RTS2
F962 FMT1
F9A6 FMT2
F9B4 CHAR1
F9BA CHAR2
F9C0 MNEML
FA40 OLDIRQ
FA47 NEWBREAK
FA4C BREAK
FA59 OLDBRK
FA62 RESET
FA6F INITAN
FA81 NEWMON
FA9B FIXSEV
FAA3 NOFIX
FAA6 PWRUP
FAA9 SETPG3
FAAB SETPLP
FABA SLOOP
FAC7 NXTBYT
FAD7 REGDSP
FADA RGDSP1
FAE4 RDSP1
FAFD PWRCON
FB02 DISKID
FB11 XLTBL
FB19 RTBL
FB1E PREAD
FB25 PREAD2
FB2E RTS2D
FB2F INIT
FB39 SETTXT
FB40 SETGR
FB4B SETWND
FB5B TABV
FB60 APPLEII
FB65 STITLE
FB6F SETPWRC
FB78 VIDWAIT
FB88 KBDWAIT
FB94 NOWAIT
FB97 ESCOLD
FB9B ESCNOW
FBA5 ESCNEW
FBB3 VERSION
FBB4 GOTOCX
FBC0 ZIDBYTE
FBC1 BASCALC
FBD0 BASCLC2
FBD9 BELL1
FBE4 BELL2
FBEF RTS2B
FBF0 STORADV
FBF4 ADVANCE
FBFC RTS3
FBFD VIDOUT
FC10 BS
FC1A UP
; Applesoft   VTAB F256
; Firmware??? VTAB CDFE
; ROM/Monitor VTAB FC22
FC22 VTAB
; Firmware??? VTABZ CE03
; ROM/Monitor VTABZ FC24
FC24 VTABZ
FC29 GOTOCX1
FC2C ESC1
FC42 CLREOP
FC46 NEWVW
FC4F NEWVW1
FC58 HOME
FC5A GOTOCX3
FC62 CR
FC66 LF
FC70 SCROLL
FC74 IRQUSER
FC7A IRQDONE2
FC8F IRQNOSLT
FC95 DOCOUT1
FC99 DOCOUT2
FC9C CLREOL
FC9E CLREOLZ
; Applesoft   WAIT E784
; ROM/Monitor WAIT FCA8
FCA8 WAIT
FCA9 WAIT2
FCAA WAIT3
FCB4 NXTA4
FCBA NXTA1
FCC8 RTS4B
FCC9 HEADR
FCD2 ERR3
FCE3 DISLIN
FCF0 GETINST1
FCFD UPMON
FD0B UPMON2
FD0C RDKEY2
FD10 FD10
FD13 RDKEY0
FD18 RDKEY1
FD1B KEYIN
FD1D GOTOCX2
FD21 RDESC
FD28 NEWRDKEY
FD2F ESC
FD35 RDCHAR
FD3D PICKFIX
FD47 NOTCR
FD5F NOTCR1
FD62 CANCEL
FD67 GETLNZ
FD6A GETLN
FD71 BCKSPC
FD75 NXTCHAR
FD84 ADDINP
FD8E CROUT
FD92 PRA1
FD96 PRYX2
FDA3 XAM8
FDAD MO
FDB3 XAM
FDB6 DATAOUT
FDC5 RTS4C
FDC6 XAMPM
FDD1 ADD
FDDA PRBYTE
FDE3 PRHEX
FDE5 PRHEXZ
FDED COUT
FDF6 COUTZ
FDF7 COUTZ1
FE00 BL1
FE04 BLANK
FE0B STOR
FE17 RTS5
FE18 SETMODE
FE1D SETMDZ
FE20 LT
FE22 LT2
FE2C MOVE
FE36 VFY
FE58 VFYOK
; Applesoft   LIST D6A5
; ROM/Monitor LIST FE5E
FE5E LIST
FE63 LIST2
FE75 A1PC
FE78 A1PCLP
FE7F A1PCRTS
FE80 SETINV
FE84 SETNORM
FE86 SETIFLG
FE89 SETKBD
FE8B INPORT
; Applesoft   INPRT ED19
; ROM/Monitor INPRT FE8D
FE8D INPRT
FE93 SETVID
FE95 OUTPORT
FE97 OUTPRT
FE9B IOPRT
FEA5 IOPRT1
FEAB GOTOCX4
FEAF CKSUMFIX
FEB0 XBASIC
FEB3 BASCONT
FEB6 GO
FEBF REGZ
; Applesoft   TRACE F26D
; ROM/Monitor TRACE FEC2
FEC2 TRACE
FEC4 STEPZ
FEC5 RETCX1
FEC8 RETCX2
; Applesoft   USR 0A
; ROM/Monitor USR FECA
FECA USR
FECD WRITE
FECF WRT2
FED7 SEARCH
FEE1 SRCH1
FEEB SRCH2
FEF1 MINI
FEF6 CRMON
; Applesoft   READ DBE2
; ROM/Monitor READ FEFD
FEFD READ
FF03 RD2
FF0A TITLE
FF13 NNBL
FF1B LOOKASC
FF2D PRERR
FF3A BELL
; Applesoft   RESTORE D849
; ROM/Monitor RESTORE FF3F
FF3F RESTORE
FF44 RESTR1
FF49 RTS6
; Applesoft   SAVE D8B0
; ROM/Monitor SAVE FF4A
FF4A SAVE
FF4C SAV1
FF59 OLDRST
FF65 MON
FF69 MONZ
FF73 NXTITM
FF7A CHRSRCH
FF8A DIG
FF90 NXTBIT
FF98 NXTBAS
FFA2 NXTBS2
FFA7 GETNUM
FFAD NXTCHR
FFBE TOSUB
FFC7 ZMODE
FFCC CHRTBL
FFE3 SUBTBL

; Removed - can't find Applesoft/ROM/DOS33/PRODOS reference
; Probably because is a typo of C05F
; C0F5 CLRAN3

; Removed - Moved to Applesoft Symbol Table
; 0095 PICK
; Reference: MAKE.NEW.VARIABLE BLTU@$D393 & TAPEPNT@$F7BC
; 0094 HIGHDS
; 0095 HIGHDSH

; Applesoft   n/a
; DOS3.3      MODE 04FB
; ROM/Monitor n/a
; Reference: Apple Assembly Line Volume 3 -- Issue 10
04FB DOS33.MODE

; Text Page 1 Holes
; Text Screen Hole 478 - 47F
; Text Screen Hole 4F8 - 4FF
; Text Screen Hole 578 - 57F
; Text Screen Hole 5F8 - 5FF
; Text Screen Hole 678 - 67F
; Text Screen Hole 6F8 - 4FF
; Text Screen Hole 778 - 77F
; Text Screen Hole 7F8 - 7FF
0478 TEXT.HOLE.1
04F8 TEXT.HOLE.2
0578 TEXT.HOLE.3
05F8 TEXT.HOLE.4
0678 TEXT.HOLE.5
06F8 TEXT.HOLE.6
0778 TEXT.HOLE.7
07F8 TEXT.HOLE.8

; Reference: Videx Videoterm 80 Column Display
;0478 TEXT.HOLE.1	VIDEX.EASEL
;04F8 TEXT.HOLE.2	VIDEX.BASEM
;0578 TEXT.HOLE.3	VIDEX.CHORZ
;05F8 TEXT.HOLE.4	VIDEX.CVERT
;0678 TEXT.HOLE.5	VIDEX.BYTE
;06F8 TEXT.HOLE.6	VIDEX.START
;0778 TEXT.HOLE.7	VIDEX.POFF
;07F8 TEXT.HOLE.8

. = ?@ A asc b bench bechmark bload bm bmc bml bmsave bp bw
calc cd cl clb clc cld cli cln clr clv clz code code1 code2 color console
cycles d da data data1 data2 db db2 db4 db8 dgr dgr1 dgr2 dhgr
dhgr1 dhgr2 disasm disk dw dw2 dw4 echo f font g gg gr gr1 gr2
hcolor help hgr hgr1 ghr2 in input jsr key load m m1 m2 ma1 ma2 mc
md1 md2 mdb me me16 me8 meb mew mm mono motd ms mt1 mt2
nop ntsc out p p0 p1 p2 p3 p4 pagedn pagedown256 pagedown4k
pageup pageup256 pageup4k pop ppop print printf profile push pwd
r rb rc rcc rd register ret ri rn rr rts run rv rz s save sb sc sd se seb sec
sed sei sen ser sev sez sh si sn source source1 source2 sr sv sym symasm
symbasic symdos symdos33 syminfo symlist symmain sympro symprodos
symsrc symsrc2 symuser symuser2 sync sz t text text1 text2 text40 text41
text42 text80 text81 text82 tf tl trace tsave u version videoinfo w wa wc
wd we win window wl wsave x z zap zp zp0 zp1 zp2 zp3 zp4 zp5 zp6 zp7
zpa zpc zpd zpe zpl zpsave \
====================
.    光标地址进入反汇编窗口

=  设置PC寄存器地址到当前指令

G  运行在正常速度 [PC寄存器 = 地址]
使用: 地址 | 标号 [保留,长度]
使用: 地址 | 标号 [开始,结束]
保留 :开始地址到保留步数
长度:字节计数从开始地址到保留步数
结束:保留步数到结束地址
如果程序计数溢出到保留区,挂起单步执行
能在 ROM/OS/用户区 中使用代码。
例子:
G[G] C600 FA00,600
G[G] C600 F000:FFFF

GG  全速运行  [PC寄存器 = 地址]
使用: 地址 | 标号 [保留,长度]
使用: 地址 | 标号 [开始,结束]
保留 :开始地址到保留步数
长度:字节计数从开始地址到保留步数
结束:保留步数到结束地址
如果程序计数溢出到保留区,挂起单步执行
能在 ROM/OS/用户区 中使用代码。
例子:
G[G] C600 FA00,600
G[G] C600 F000:FFFF

IN  从IO区$c0xx 输入字节

KEY  设置键进行模拟

JSR  调用子段
使用: [标号|地址] 
压入PC值到堆栈,调用子段标号名

NOP 清空当前指令为NOP
放一个NOP指令到当前指令

OUT  输出字节到 IO区 $c0xx 
使用: [8位地址 | 16位地址 | 标号] ## [##]
输出一个字节或字到IO 地址 $c0xx

PROFILE	列表/保存 6502 辅助文件
使用: [RESET | SAVE | LIST]
没有参数复拉辅助文件

R  设置寄存器
使用: <reg> <value> | expression | symbol>
  <reg> 为 A X Y PC SP 中一个
参照: OPERATORS
例子:
R PC RESET + 1
R PC $FC58
R A A1
R A $A1
R A #A1

P  单步当前指令
使用: [#] 
 单步, #次,到当前指令
 JSR 将被单步和进入和.相与

RTS  步进出子段
步进出当前子段
热键: Ctrl-Space

T  跟踪当前指令
使用: [#]
跟踪,#次,当前指令
JSR 将 跟入子段
热键:Shift-Space

TF  保存跟踪到文件 [带显示扫描信息]
使用:"[文件名]" [v]

TL  跟踪 (带校验计数)
使用: [#]
跟踪到当前指令
带校验计数

U 反汇编指令
使用: [地址|标号]
反汇编内存

BM  BMA(标记地址)的别名
使用: [地址|标号]
使用:# <地址|标号>
如果没有指定地址和标号,列表当前书签
升级指定的书签(#)
例子:
BM RESET
BM 1 HOME

BMA  增加/升级书签
使用: [地址|标号]
使用:# <地址|标号>
如果没有指定地址和标号,列表当前书签
升级指定的书签(#)
例子:
BMA RESET
BMA 1 HOME

BMC  清除(移去)书签
使用: [#|*]
清除指定的或所有的书签

BML  列表所有的书签

BMG 移动光标到书签

BMSAVE 保存书签

BRK 在BRK 或 INVALID 上调试
使用: [ON|OFF] [#|# ON|# OFF]
#为0=BRK,1=错误代码1,2=错误代码2,3=错误代码3

BRKOP  在操作码上进入调试

BP  BPR的别名(断点寄存器地址)
使用:[LOAD|SAVE|RESET]
最大断点:16
设置没参数断点在PC上。
读入/保存为保留选择

BPA 增加一个断点
使用:[地址|寄存器]
如果地址设置了两个断点
1.在地址上有一个内存访问
2.PC指针到达地址
如果断点访问设置的是IO地址
如果一个断点地址在寄存器上的内存访问,地址访问,寄存器访问。

BPR  增加寄存器变量断点
使用: [A|X|Y|PC|S] [op] <range | value>
[op]有值时断点设置寄存器值
默认操作符是'=‘
参考:OPERATORS
例子:
BPR PC < D000
BPR PC = F000:FFFF PC < D000,1000
BPR A <= D5
BPR A != 01:FF
BPR X = A5

BPX  增加断点为当前指令
使用: [地址]
设置一个断点为当前PC或指定地址

BPIO 增加断点为 IO 地址 $c0xx

BPM  增加一个内存访问断点
使用: <range>
当 <range> 是以下时:
地址,长度 [地址,地址+长度]
地址:结束  [地址,结束]

BPMR  增加一个内存只读访问断点
使用: <range>
当 <range> 是以下时:
地址,长度 [地址,地址+长度]
地址:结束  [地址,结束]

BPMW  增加一个内存写入访问断点
使用: <range>
当 <range> 是以下时:
地址,长度 [地址,地址+长度]
地址:结束  [地址,结束]

BPC  清除(移去)断点
使用: [#|*]
清除指定或所有断点
例子:
BPC 1

BPD  关闭断点-仍然在列表,不激活
使用: [#[,#]|*]
关闭一个断点或所有断点预设置
例子:
BPD 1

BPEDIT  编辑断点

BPE  打开关闭的断点
使用: [#[,#]|*]
恢复关闭的一个断点或所有断点预设置
例子:
BPE 1

BPL  列表所有断点

BPSAVE  保存断点

BENCHMARK  测试这个模拟器

BW  设置/显示 RGB 为 黑白显示

COLOR  设置/显示 RGB 为彩色显示
使用: [<#>|<# RR GG BB>]
0参数:切换到'彩色'显示
1参数:保留 R G B 显示 “彩色”
4参数: 设置 R G B 显示 “彩色”

DISASM   设置/显示 反汇编视窗选择
注意:所有的参数效果在反汇编视窗
使用:[BRANCH | |CLICK|COLON|OPCODE|SPACES]
没有参数就显示当前设置
使用:BRANCH [#]
设置类型或测试字符
0 off,1 plain, 2 fancy
例子:
DISASM BRANCH 1
使用: CLICK [#]
左键点击后设置正确的键。(Alt,Control,或Shift)
0 左键点击 (不含Alt,Ctrl,Shift)
1 Alt 左键点击
2 Ctrl 左键点击
3 Alt+Ctrl 左键点击
4 Shift 左键点击
5 Shift+Alt 左键点击
6 Shift+Ctrl 左键点击
7 Shift+Ctrl+Alt 左键点击
例子:
DISASM CLICK 0 // Plain Left-click
DISASM CLICK 1 // Require Alt Left-click
DISASM CLICK 2 // Require Ctrl Left-click
DISASM CLICK 3 // Require Alt+Ctrl Left-click
使用:COLON [0|1]
显示一个克隆在这地址之后
例子:
DISASM COLON0
使用:OPCODE [0|1]
显示操作码在克隆之后
例子:
DISASM OPCODE 1
使用: SPACES [0|1]
显示空格在两个操作码之间
例子:
DISASM SPACES 0
使用:TARGET [#]
显示设置这目标类型的地址/变量。
0 off,1 仅值,2 仅地址,3 两者
例子:
DISASM TARGET 1

FONT  显示当前字体或设置一个新的字体
新调试器下使用,不常使用。

HCOLOR   设置/显示 颜色图到 Apple HGR

LOAD  读入调试器配置。
使用: ["文件"]
读入调试器配置为空文件或指定文件。

MONO  设置/显示 单色显示器的 RGB
使用: [<#>|<# RR GG BB>]
0参数:切换到'单色'显示
1参数:保留 R G B 显示 “单色”
4参数: 设置 R G B 显示 “单色”

SAVE  保存调试器配置
使用: ["文件"]
保存调试器配置为空文件或指定文件。

PWD  显示当前调试器目录,使用scripts 和 mem 读入/保存

CD  更新当前调试器目录。

RET   设置光标到子段调用

PAGEUP  向上卷动屏幕

PAGEUP256 向上卷动256个字节

PAGEUP4K  向上卷动4096个字节

PAGEDN  向下卷动屏幕

PAGEDOWN256  向下卷动256个字节

PAGEDOWN4K  向下卷动4096个字节

CYCLES   校验显示配置
使用: <abs | rel | part>
abs = 绝对值数
rel = 过去的跟踪数或断点数
part =  处理的当前指令数

RCC  复位校验记数
使用计数值 ‘cycles part'到当前指令

Z  数据

X  代码

B  列表所有的程式数据

DB  定义字节
使用: DB <地址>| <标号地址>|<标号范围>
告诉反汇编在肛码中的数据是字节
例子:
DB WNDTOP 22
DB WNDBTM 23
X WNDTOP   // treat as code again
B    // list all addresses viewed as data

DB2  定义字节数组,显示2字节/行

DB4  定义字节数组,显示4字节/行

DB8  定义字节数组,显示8字节/行

DW   定义地址数组
使用: DW <地址> | <标号地址>|<标号范围>
告诉这反汇编在代码中的数据是字
这数据是2字节的数据
例子:
DW NEXT1 801  //AppleSoft Basic Line#1 Pointer to Next line
DW LINE1 803 //Applesoft Basic Line#1 Line Number
X NEXT1  // treat as code again
B  //list all addresses viewed as data

DW2  定义地址数组,每行显示2字

DW4  定义地址数组,每行显示4字

ASC  定义文本字符串

DA  定义字地址数组

DISK  访问磁盘驱动函数

CL  清除指定标志位

CLC  清除进位标志位

CLZ  清除为零标志位

CLI   清除关中断标志位

CLD  清除十进制标志位

CLB   清除中断标志位

CLR   清除保留标志位

CLV  清除溢出标志位

CLN  清除符号标志位

SE  设置指定标志位

SEC  设置进位标志位

SEZ  设置为零标志位

SEI   设置关中断标志位

SED  设置十进制标志位

SEB   设置中断标志位

SER  设置保留标志位

SEV   设置溢出标志位

SEN  设置符号标志位

?  列出所有可用命令

HELP  帮助指定命令

VERSION  显示模拟器和调试器版本
使用:[*]
* 显示扩展内部结构

MD1  在最小内存区1显示十六进制数据

MD2  在最小内存区2显示十六进制数据

MA1  在最小内存区1显示 ASCII 文本
使用:<地址|标号>
在最小内存区显示 ASCII 文本
高亮ASCII 控制字符
常规ASCII字符
使用:<地址|标号>
在最小内存区显示 ASCII 文本
反显APPLE控制字符
常规APPLE字符

MA2  在最小内存区2显示 ASCII 文本
使用:<地址|标号>
在最小内存区显示 ASCII 文本
高亮ASCII 控制字符
常规ASCII字符
使用:<地址|标号>
在最小内存区显示 ASCII 文本
反显APPLE控制字符
常规APPLE字符

====================

7B2A:
cmp #$c1
bcc $7b32
cmp #$db
bcc $7b60
7B32:
ldx #$7c
cmp #$a0
beq $7b5f
ldx #$db
cmp #$be
beq $7b5f
inx
cmp #$a8
beq $7b5f
inx
cmp #$a9
beq $7b5f
inx
cmp #$af
beq $7b5f
inx
cmp #$ad
beq $7b5f
inx
cmp #$bc
beq $7b5f
lda #$10
rts

7B5F:
txa
7B60:
sec
sbc #$7c
rts

7B64:
cmp #$8d
beq $7b7d
jsr $7b2a
ldx txpsv
cpx #$40
beq $7b77
jsr $8caa

7B77:
jsr $82b0

7B7D:
inc forpnt+1
lda #$00
sta forpnt
rts
-----------------------------------
rti
sta txpsv
lda #$00
sta forpnt
sta forpnt+1
jsr $86e0
-----------------------------------
cpy $d6c5
cmp $cc
ldy #$c8
cmp (hgr.quad,X)
ldy #$c2
cmp $c5
dec $c3a0
iny
cmp ($ce,X)
nop
cmp $c4
ldy #$c2
cmp hgr.e,X
sta $cfce
nop vpnt,X
nop
cmp (lock,X)
cmp $c4
ldx $c4a0
nop
ldy #$d9
nop
cmp vpnt,X
nop
cmp #$d3
iny
ldy #$d4
nop
sta $c1d3
dec $c5,X
ldy #$cd
nop
cpy rndseed
dec rndseed
cmp $c4
ldy #$cc
cmp lock
ldy #$a8
cmp $ceaf,Y
lda #$a0
brk
jsr $86ce
--------------------------------------

86e0:
pla
sta dimflg
pla
sta valtyp
bne $86F1

86E8:
ldy #$00
lda (dimflg),y
beq $86f9
jsr $7b64
86F1:
inc dimflg
bne $86e8
inc valtyp
bne $86e8
86F9:
lda valtyp
pha
lda dimflg
pha
rts
-----------------------------------
86CE:
ldy #$c0
ldx #$80
dex
bne $86D2
lda tmpexp
beq $86dc
lda spkr
dey
bne $86d0
rts
-------------------------------------

-------------------------------------

d6c5  b1

=========================
call 4102 * fa4 brk
+++++++
sty p.neq+1,X
sta arg.sign
cmp varnam+1,X
sta valtyp
tay
bne $0fb9
cpy #$82
cmp varnam+1
cmp varnam+1
cmp varnam+1
sty $a8,X
sty $a8,X
sty $a8,X
sty $a8,X
brk
++++++++
0fb9:
tay
bne $0f46
bne $0f68
brk
++++++++

==========================
apple ii /e 游戏杆端口开关(三态输出数据选择器74LS251)
		         十六进制地址  
游戏口选通脉冲	STB	$c04X	49216~49231
		AN0 关	$c058	49240
		AN0 开	$c059	49241
		AN1 关	$c05a	49242
		AN1 开	$c05b	49243
		AN2 关	$c05c	49244
		AN2 开	$c05d	49245
		AN3 关	$c05e	49246
		AN3 开	$c05f	49247
按钮开关		SW0	$c061(or $c069) 49249
		SW1	$c062(or $c06a) 49250
		SW2	$c063(or $c06b) 49251
游戏杆		PDL0	$c064(or $c06c) [A]
		PDL1	$c065(or $c06d) [B]
		PDL2	$c066(or $c06e) [C]
		PDL3	$c067(or $c06f) [D]
85 8D A B 两游戏键值
apple ii /e 系统内存结构分配表(简)
		零页用法:
		0~5 跳指令到applesoft
		A~C USR()函数跳转地址
		D~17 applesoft的常规国家标识
		20~4F apple ii 系统的保留地址
		50~61 applesoft 常规指针
		62~66 上次的乘法/除法结果
		67~68 程序开始点,由ROM的$801设置,或由RAM的$3001设置(磁带)
		69~6A 简单变量的开始点,每次由程序加5,不能在LOMEM中手动改变结构
		6B~6C 数组开始空间
		6D~6E 数字记录结束点
		6F~70 字串记录点。
		71~72 常规指针
		73~74 在applesoft里设置高内存可用,初始化是起点,完成后是结束点
		75~76 当前执行行号
		77~78 以前的行号,被control-C中断过的或执行中断的行号
		79~7A 以前的文本指针,方便下次使用
		7B~7C 当前开始读DATA的行号
		7D~7E 当前读入DATA进内存的绝对地址
		7F~80 当前输入口指针,由$201 INPUT 和 DATA READ使用
		81~82 获得过去的使用变量名
		83~84 过去使用的变量值指针
		85~9C 常规说明
		9D~A3 主要的浮点加法器
		A4      常规的使用浮点数学环
		A5~AB 第二个浮点加法器
		AC~B0 常规的说明标志指针组
		B1~C8 CHRGET 环,applesoft 调用后是另外字符。
		B8~B9 通过CHRGET环反映的过去的字符指针
		C9~CD 随机数
		D0~D5 高分辨图形指针
		D8~DF ONERR 指针组/搜索组
		E0~E2 高分辨图形X,Y坐标
		E4      高分辨图形颜色属性字节
		E5~E7 常规使用高分辨图形模式
		E8~E9 链表指针开始
		EA     高分辨率图形的页面模式
		F0-F3 常规标志
		F4~F8 ONERR 指针
		(00-FF 意思相近,请纠错)
		0100~01FF 系统堆栈
		0200~02FF 输入缓冲区(字符不能超过256)
		03FE~03FF 中断向量
		0400~07FF 文本/低分辨率第一页缓冲区
		0800-0BFF  第二页缓冲区
		2000-3FFF 高分辨率作图第一页缓冲区
		4000-5FFF 高分辨率第二页缓冲区
		0C00~BFFF RAM用户区
		C030 喇叭
		C070  计时器(558象限时间器)
		C0-CF为接口区
		C0     为板上接口
		C1~C7为扩展插槽
		C8~CF为扩展ROM
		C080~C0FF 平均分给每个槽(256+16+8)
		C090~C09F  为一号槽 C0A0~C0AF 为二号槽
警察抓小偷源码:
1003:
jmp $1030

100f:
bit lcbank1
bit lcbank1
lda #$d0
sta loc1
lda #$50
sta gostrout
jsr $13cc
cmp #$80
bcc $101d
bit lcbank1
bit lcbank1
lda #$d0
sta loc1
lda #$40
sta gostrout
jsr $13cc
cmp #$50
bcc $1032
bit romin2
rts

103d:
bit lcbank1	;0
bit lcbank1	;0
lda #$40		;A=40
sta loc1		;loc1=A
lda #$d0		;A=d0
sta gostrout	;gostrout=A
jsr $13cc		;call 13cc
cmp #$e0		;
bcc $104b		;C=0,jmp 104b
bit lcbank2	;test lcbank2
bit lcbank2	;test lcbank2
lda #$d0		;A=d0
sta gostrout
jsr $13cc
bne $105c
bit romin2
rts
----------------
读磁盘子模块
13cc:
ldy #$00	;Y=0			mov bx,0
sty gowarm	;gowarm=Y		mov gowarm,bx
sty loc1+1	;Y=loc1+1		mov loc1+1,bx
13d2:
lda (gowarm),Y 	;A=gowarm+Y		mov ax,[bx+gowarm]
sta (loc1+1),Y  ;loc1+1+Y=A		mov ax,[bx+loc1+1]
iny	        ;Y =Y+1			inc bx
bne $13D2	;Z<>0 JMP 13d2		jne (13d2)
inc loc1	;loc1 + 1		inc [loc1]
inc gostrout	;gostrout+1		inc [gostrout]
lda gostrout	;A=gostrout		lda [gostrout]
rts
---------------
自动启动监控程序注释
loc0	$00 ;磁盘 I/O 口向量低位暂存单元
loc1	$01 ;磁盘 I/O 口向量高位暂存单元
wndlft	$20 ;屏幕窗口左极限列存贮单元
wndwdth	$21 ;屏幕窗口总列数存贮单元
wndtop	$22 ;屏幕窗口最高行数存贮单元
wndbtm	$23 ;屏幕窗口最低行数存贮单元
ch	$24 ;光标水平位置指针(列计数)
cv	$25 ;光标高度指针(屏幕字符行计数)
gbasl	$26 ;低分辨图形象元位置基值向量低字节
gbash	$27 ;低分辨图形象元位置基值向量高字节
basl	$28 ;光标位置基值向量低字节
bash	$29 ;光标位置基值向量高字节
bas2l	$2a ;光标基值向量低字节暂存单元
bash	$2b ;光标基值向量高字节暂存单元
h2	$2c ;低分辨图形列极限暂存单元
lmmem	$2c ;反汇编左助记符代码暂存单元
v2	$2d ;低分辨图形行极限暂存单元
rmnem	$2d ;反汇编右助记符代码暂存单元
mask	$2e ;图象元颜色屏幕字暂存单元
chksum	$2e ;写,读磁带时“检查和”存贮单元
format	$2e ;反汇编寻址方式代码存贮单元
lastin	$2f ;检查读磁带,信号单元,平时D7=0
length	$2f ;反汇编操作数字节计数存贮单元
sign	$2f ;
color	$30 ;低分辨图形象元颜色代码存贮单元
mode	$31 ;监控键盘命令中“:",".","-","x"方式存贮单元
invflg	$32 ;屏幕显示方式代码存贮单元
prompt	$33 ;操作状态提示符存贮单元
ysav	$34 ;变址寄存器Y暂存单元
ysav1	$35 ;变址寄存器Y暂存单元
cswl	$36 ;字符输出软开关低字节,通常存$f0
cswh	$37 ;字符输出软开关高字节,高常存$fd
kswl	$38 ;字符输入子程序低字节,通常存$1b
kswh	$39 ;字符输入处理子程序高字节,通常存$fd
pcl	$3a ;指令计数器PC低字节暂存单元
pch	$3b ;指令计数器PC高字节暂存单元
a1l	$3c ;操作数地址缓冲区a1低字节存贮单元
a1h	$3d ;a1高字节存贮单元
a2l	$3e ;操作地址缓冲区,a2低字节存贮单元
a2h	$3f ;a2高字节存贮单元
a3l	$40 ;操作数地址缓冲区a3
a3h	$41 ;a3高字节存贮单元
a4l	$42 ;操作数地址缓冲区a4
a4h	$43 ;a4高字节存贮单元
a5l	$44 ;操作数地址缓冲区a5
a5h	$45 ;a5高字节存贮单元
acc	$45 ;累加器内容暂存单元
xreg	$46 ;变址寄存器X内容暂存单元
yreg	$47 ;变址寄存器Y内容暂存单元
status	$48 ;状态寄存器P内容暂存单元
spnt	$49 ;堆栈指针S内容暂存单元
pndl	$4e ;随机数产生器低字节
pndh	$4f ;随机数产生器高字节
pick	$95 ;ctrl/u字符代码
in	$200 ;键盘输入字符缓冲区首址
brkv	$3f0 ;新断点向量,在磁盘启动后置入
softev	$3f2 ;“软进入向量”暖起动低位存贮单元,软向量一般为$e003
pwredup	$3f4 ;建立“电源合上”标志字节,一般存$45
amperv	$3f5 ;applesoft,入口向量
usradr	$3f8 ;用户子程序向量
nmi	$3fb ;不可屏蔽中断向量
irgloc	$3fe ;用户设置的处理断点程序向量
line1	$400 ;屏幕显示器缓冲区首址(显示缓冲区第一页)
mslot	$7f8 ;磁盘 I/O向量高字节暂存单元
oadr	$c000 ;I/O设备码存贮区首址
kbd	$c000 ;键盘输入I/O地址
kbdstrb	$c010 ;清键盘选通I/O地址
tapeout	$c020 ;磁带输出 I/O 地址
spkr	$c030 ;扬声器输出 I/O 地址
txtclr	$c050 ;设置屏幕为显示图形工作方式地址
txtset	$c051 ;设置屏幕为显示文本工作方式地址
mixclr	$c052 ;设置屏幕为显示完整图形式文本方式地址
mixset	$c053 ;设置屏幕为显示文本
lowscr	$c054 ;显示缓冲区第一页地址
hiscr	$c055 ;显示缓冲区第二页地址
lores	$c056 ;显示低分辨率图形方式设备码
hires	$c057 ;显示高分辨率图形方式设备码
setan0	$c058 ;开游戏软开关an0设备码
clran0	$c059 ;关游戏软开关an0设备码
setan1	$c05a ;开游戏软开关an1设备码
clran1	$c05b ;关游戏软开关an1设备码
setan2	$c05c ;开游戏软开关an2设备码
clran2	$c05d ;关游戏软开关an2设备码
setan3	$c05e ;开游戏软开关an3设备码
clran3	$c05f ;关游戏软开关an3设备码
tapein	$c060 ;7位磁带数据输入地址
paddl0	$c064 ;游戏接口电位器PDL0输入设备码
ptrig	$c070 ;清除游戏电位器模拟量输入设备码
clrrom	$cfff ;扩展PROM选通设备码
basic	$e000 ;BASIC状态入口
basic2	$e003 ;BASIC状态入口

Apple II /e 模拟软件 APPLEWIN 的新表:
A2C.VMODE	$4FB	[M]	DOS33.MODE
A2C.ROMSTAATE	$478	[M]	TEXT.HOLE.1
A2C.TEMP1	$4F8	[M]	TEXT.HOLE.2
A2C.TEMPA	$578	[M]	TEXT.HOLE.3
A2C.DEVN0	$778	[M]	TEXT.HOLE.7
MSLOT		$7F8	[M]	TEXT.HOLE.8

basic 表 [别名.数值.系统:B=BASIC,M=主系统,称谓]
DSCTMP	$9D	[B]		FAC
DATAFLG	$13	[B]		GARFLG
LOC0	$00	[M]		GOWARM
ARYPNT	$94	[B]		HIGHDS
Warn:				INCREMENT.FAC.MANTISSA (22>20)
BUF/IN	$200	[M]		INPUT.BUFFER
KBD/CLR80STORE	$C000 [M]		KEYBOARD
DPFLG	$9B	[B]		LOWTR
A1H	$3D	[M]		MON.A1H
A1L	$3C	[M]		MON.A1L
A2H	$3F	[M]		MON.A2H
A2L	$3E	[M]		MON.A2L
CH	$24	[M]		MON.CH
Warn:				MOVE.HIGHEST.STRING.TO.TOP (26>20)
EOL.PNTR	$0F	[B]		NUMDIM
OLDTEXT	$79	[B]		P.ADD
LINNUM	$50	[B]		P.AND
DATLIN	$7B	[B]		P.MUL
INPTR	$7F	[B]		P.NEQ
XREG	$46	[M]		P.OR
DATPTR	$7D	[B]		P.PWR
L	$E8FD	[B]		SHIFT.RIGHT.3
CPRMASK	$16	[B]		SIGNFLG
DECTBL.END $EE8D	[B]		SQR
Warn:				STA.IN.FAC.SIGN.AND.EXP(23>20)
Warn:				STORE.FAC.AT.YX.ROUNDED(23>20)
Warn:				STORE.FAC.IN.TEMP1.ROUNDED(26>20)
Warn:				STORE.FAC.IN.TEMP2.ROUNDED(26>20)
SGNCPR	$AB	[B]		STRNG1
SERPNT	$AD	[B]		STRNG2
HIRES	$C057	[M]		SW.HIRES
HISCR	$C055	[M]		SW.HISCR
LORES	$C056	[M]		SW.LORES
LOWSCR	$C054	[M]		SW.LOWSCR
MIXCLR	$C052	[M]		SW.MIXCLR
MIXSET	$C053	[M]		SW.MIXSET
TXTCLR	$C050	[M]		SW.TXTCLR
FNCNAM	$8A	[B]		A.TEMP3
NUMDIM	$0F	[B]		TKN.CNTR
INDX	$99	[B]		TMPEXP
LASTOP	$87	[B]		TXPSV
TXTPTR	$B8	[B]		TXTPTRL  
HIGHDS	$94	[B]		HIGHDSL

其它的可以看 A2_basic.sym和apple2e.sym这两个文件

这段是查阅当时那年代的资料游戏柄部分,是只公开一次的资料,出现在早期的电脑报上。还有实际的电路图,后来在公司玩了一下用winamp挂跳舞毯游戏自己整合的资料。

手柄电路直连电脑的改法。(硬件相关)国外有相关网站有提到这个游戏,解密和程序方法。我这网站可能链接还在。

109eb7ecd4c1d46463d09f33.jpg


相关文章

linux 下的汉字输入法.

linux 下的汉字输入法.

各位老师,才子,同事们好!有很多初级玩linux的同学都会碰到一个难题,也就是在linux 下的汉字输入法.这个问题一直困绕了linux 使用者多年.我还好,每次都使用正常.现在说说心得笔记就可以了....

linux 下的 opengl SDK。

linux 下的 opengl SDK。

opengl 图形库是开放式图形库,最近出了一个freeglut3 我们下载它:sudo apt-get install freeglut3sudo apt-get install freeglut3...

linux 下的《仙剑奇侠传》

linux 下的《仙剑奇侠传》

以前的DOS游戏《仙剑奇侠传》是炙制人口的一个很容易上手的游戏。这个游戏流行了很多年。很多人在玩过多年以后,重温旧梦,回味游戏之中的情感。这个游戏再版了很多次了。现在linux 下也可以直接玩这个游戏...

USB设备的插入机制与USB驱动故障。

USB设备的插入机制与USB驱动故障。

USB主机检测设备,首先在USB集线器的每个端口的D+,D-上,分别接了一个15K欧姆的下拉电阻到地。集线器端口为空时,被这两个电阻拉低了电平。在USB设备端,D+或者D- 上接了上拉1.5K电阻。全...

关于编译器不愿意说的那些事。

关于编译器不愿意说的那些事。

计算机发展了好多年。当中也不泛有很多对程序的爱好。很多人不是专业水平,也不是在算法类中特别出众,就是喜欢而已。好像认为自己就只那个水平,或者为一些调试不通过发愁。可以说,实际上都不是你的错,是编译器的...

谈谈引导程序的想法。

谈谈引导程序的想法。

当个人电脑一出现就有了磁盘系统,不管是软盘,光盘,硬盘,计算机要应用操作系统就要引导,引导程序一段代码。这引导代码很小,在第一个磁盘的扇区上,平时没什么人注意它。这段代码损坏一个字节,都会造成计算机瘫...