继续APPLE的LodeRunner游戏分析
苹果电脑早期的程序是值得研究的。
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挂跳舞毯游戏自己整合的资料。
手柄电路直连电脑的改法。(硬件相关)国外有相关网站有提到这个游戏,解密和程序方法。我这网站可能链接还在。