本帖最后由 tyw 于 2015-8-5 13:59 编辑
20年前扒拉过的近万条汇编指令,那是一个赌机类的游戏机主板源程序,用z80编的.近万条,平均每条10个中文,算一哈,俺码了多少个字了拉?哈哈,拖出来晒晒.
疯狂赛车主板源程序 V96.3.27 205页 407K.pdf
(406.1 KB)
疯狂赛车主板源程序.rar
(50.79 KB)
; ┏━━━━━━━━━━━┓
; ┃┏━━━━━━━━━┓┃
; ┃┃ 疯狂赛车主板 ┃┃
; ┃┃ 源程序 ┃┃
; ┃┃ V96.3.27 ┃┃
; ┃┗━━━━━━━━━┛┃
; ┗━━━━━━━━━━━┛
SYMBOLS ON
A3567 EQU E05CH ;3567数据地址
ATIMR EQU E1ABH ;翻牌声延时值
ALLWIN EQU E600H ;E600-E602投币总数
ALWIN1 EQU E604H ;E604-E606 投币总数-退币总数-中奖数
ALLOST EQU E608H ;E608-E60A退币总数
ALLYB EQU E60CH ;E60C-E60E总押币数
ALLYBD EQU E610H ; 没有使用
AWIN1 EQU E620H ;第1组净利
AYB1 EQU E623H ;第1组押币数
ALOST1 EQU E626H ;第1组退币数
;AWIN2 EQU E629H ;第2组净利
;AYB2 EQU E62CH ;第2组押币数
;ALOST2 EQU E62FH ;第2组退币数
;AWIN3 EQU E632H ;第3组净利
;AYB3 EQU E635H ;第3组押币数
;ALOST3 EQU E638H ;第3组退币数
;AWIN4 EQU E63BH ;第4组净利
;AYB4 EQU E63EH ;第4组押币数
;ALOST4 EQU E641H ;第4组退币数
;AWIN5 EQU E644H ;第5组净利
;AYB5 EQU E647H ;第5组押币数
;ALOST5 EQU E64AH ;第5组退币数
;AWIN6 EQU E64DH ;第6组净利
;AYB6 EQU E650H ;第6组押币数
;ALOST6 EQU E653H ;第6组退币数
;AWIN7 EQU E656H ;第7组净利
;AYB7 EQU E659H ;第7组押币数
;ALOST7 EQU E65CH ;第7组退币数
;AWIN8 EQU E65FH ;第8组净利
;AYB8 EQU E662H ;第8组押币数
;ALOST8 EQU E665H ;第8组退币数
AWIN EQU E0B0H ;此次押币组的赢利地址
AYB EQU E0B2H ;此次押币组的押币总数地址
ALWI1R EQU E086H ;<1500D净利
BYB EQU E089H ;E089-E08A本次押币数
BAWIN EQU E08BH ;本次押币数赢利数地址
BAYB EQU E08DH ;E08D-E08F本次押币数档的总数地址
CAP EQU E00CH ;CAP头盔押币数
CUP EQU E00FH ;CUP金杯押币数
CUPBUF EQU E027H ;CUP金杯显示缓冲区
CAPBUF EQU E024H ;CAP头盔显示缓冲区
COIN EQU E04CH ;硬币面值数,=1为1元,=5为5元,=10为10元,=50为50元
CSTART EQU E051H ;连续启动键计数器
CTC1D EQU E060H ;循环灯移位计数值
CTC2D EQU E061H
CTC3D EQU E062H
CTC1 EQU E065H ;循环灯延时减法计数值
CTC2 EQU E066H ;2倍灯用,LED闪烁用
CTC3 EQU E067H ;押币数闪烁用
CTC4 EQU E068H ;押币计数器连续工作用
CA EQU E170H ;E170-E173(0:LL,1:LS,2:SL,3:SS)
COAL EQU E181H ;开奖计数器
CANPN EQU E16CH ;可开奖位置个数
DPR EQU E0CAH ;中奖个数
DOLL EQU E162H ;美圆数
DOLL1 EQU E164H ;美圆数(25%修正值)
DOLL2 EQU E166H ;总美圆数
DOLL3 EQU E168H ;总美圆数(10进制)
DSLCM EQU E408H ;为拟开奖类别
DPRI EQU E0E6H ;欲开出的奖金数
ERRDAT EQU E064H ;出错代码值
FAN2 EQU E028H ;E028-E02F各押币数备份
FUNDAT EQU E038H ;E038-E03F功能键计数值
FIRPRI EQU E680H ;E680-E687H 第1--8组1奖类别表
HINC1 EQU E049H ;延时1分16位计数值
HEXDEC EQU E400H ;E400-E403为10进制数缓冲区
INCDAT EQU E059H ;随机数计数器1(减)
INCDA1 EQU E05AH ;随机数计数器2(加)
INCDA2 EQU E05BH ;随机数计数器3(加)
INTIS EQU E070H ;INTIS=FFH 中断不处理键盘
JLB EQU E050H ;机率(原来没有注释)
JLAD EQU E0AAH ;上限
JLBD EQU E0ACH ;基限 没有使用
JLCD EQU E0AEH ;正限 没有使用
KAIF EQU E04DH ;=5表示1次,=10表示10次,=50表示50次,
KEY EQU E00EH ;KEY钥匙押币数
KEYBUF EQU E026H ;KEY钥匙显示缓冲区
KAIDAT EQU E043H ;开分键计数值
KAIN EQU E052H ;开分键计数值
KAID EQU E053H ;按开分键的次数
LOALED EQU E603H ;当前跑灯跑灯LED位置
LUN EQU E009H ;轮胎 押币数
LUNBUF EQU E021H ;轮胎 显示缓冲区
LED1 EQU E054H ;E054-E057 373A-373D,跑灯LED显缓
LED2 EQU E0CBH ;E0CB-E0CDH LOOP 灯数据
LED3 EQU E0E1H ;E0E1-E0E2H LAMP 灯数据
LOADM EQU E1ACH ;E1AC-E1B1H DEMO 跑灯位置用
MONEY EQU E000H ;E000-E002投币数
MONBUF EQU E018H ;投币数显示缓冲区
MONDAT EQU E040H ;投币键计数值
MUSDAT EQU E05FH ;3567设定计数值
MUL1 EQU E0A0H ;E0A0 8位乘数
MUL2 EQU E0A1H ;E0A1 8位被乘数
MULD EQU E0A2H ;E0A2-E0A3 16位乘数积
MULD1 EQU E0A3H ;高8位
MIMA EQU E0B5H ;38H口地址数据缓冲区
MUSD EQU E05EH ;3567延时计数值
NSTR EQU E0B4H ;STR有效宽度计数器
NYB EQU E088H ;押币分组数(1-8)
N3812 EQU E0B6H ;3812乐曲计数器
NPAOMU EQU E0B7H ;十二半音阶首代码
NUBYB EQU E16AH ;本次押币个数
NDOL EQU E174H ;送美圆倍数
OIL EQU E00DH ;OIL加油站押币数
OILBUF EQU E025H ;OIL加油站显示缓冲区
OF EQU E405H ;E404-E405为无效0改为F区
PRICE EQU E005H ;E005-E006中奖数
PRIBUF EQU E01DH ;中奖数显示缓冲区
PRBF EQU E063H ;E41A-E41B中奖数备份
PR EQU E0C0H ;E0C0-E0C9 中奖位置
PRRND EQU E428H ;E428-E429H 乱数奖金额
QIA EQU E00AH ;千斤顶 押币数
QIABUF EQU E022H ;千斤顶 显示缓冲区
RNDADD EQU E700H ;乱数累加器
RLED1 EQU E06AH ;E06A-E06D 32个跑灯LED1,2,3,4组印象区
RA3567 EQU E06EH ;A3567印象区
RLED2 EQU E0CEH ;E0CE-E0E0H LOOP 灯备份数据
RLED3 EQU E0E3H ;E0E3-E0E4H LAMP 灯备份数据
RGB EQU E0E4H ;红绿灯数据
ROUNDN EQU E0E5H ;二个小环灯计数器
RL4 EQU E160H ;中奖数/8
RFANBU EQU E190H ;E190-E197H押分数显缓备份
ROW1 EQU E487H ;E187-E189H 3个转数
RNDD1 EQU E48AH ;=0-3(IS R1 OR R2 OR R3 OR R4)
RNDD2 EQU E48BH ;=0-5(CALL RND次数)
ROW2 EQU E48CH ;ROW2=E48CH~E48EH,左中右翻牌数缓冲区
R1 EQU E710H ;R1-R4 乱数用
R2 EQU E711H
R3 EQU E712H
R4 EQU E713H
SLS EQU E04FH ;=1表示快速比倍,=0表示慢速比倍
SPR EQU E003H ;E003-E004乱数
STEPL EQU E007H ;步数
SPE EQU E00BH ;SPEAKER喇叭押币数
SISPR EQU E010H ;乱数显示标志,=A0H乱数停止跳动
SPRBUF EQU E01BH ;乱数奖显示缓冲区
STEBUF EQU E01FH ;步数显示缓冲区
SPEBUF EQU E023H ;SPEAKER喇叭显示缓冲区
SIGN EQU E044H ;BIT0=1大键 =0小键,BIT1=1比倍赢
;BIT2=1一次结束,
;BIT4=13567在工作,BIT5=1退币键标志
;BIT6=1<-键标志
SIGN1 EQU E045H ;BIT0=1超时不按键,
;BIT2=1跑灯
;BIT4=1 LED快速闪烁, BIT5=1中奖灯闪烁
SIGN2 EQU E046H ;BIT1=1快速->键
;BIT5=1 押币数闪烁, BIT4=1押币数亮,=0灭
SIGN3 EQU E047H ;BIT0=1重复原音乐,BIT1=1中奖后30秒结束
;BIT2=1重复START键,BIT3=1投币计数器连续工作
;BIT4=1中THREE奖,BIT5=1 二个小环灯跑
;BIT7=1开机后没按过START键
SIGN4 EQU E048H ;BIT0=1奖分最快速->得分 ,BIT1=1押币后没按START键
;BIT2=1 "咬"分 ,=0 "吐"分
SIGN5 EQU E011H ;BIT0=1 错算术题, BIT1=1猜拳平,BIT2=1 猜拳赢
;BIT 3=1 DEMO BIT 4=1 STR低 BIT 5=0 升调(跑灯)
ST8255 EQU E058H ;8255 A口数据初始值
SIGNA EQU E090H ;=11 第1组"咬", =0 第1组"吐"
;SIGNB EQU E091H ;=11 第2组"咬", =0 第2组"吐"
;SIGNC EQU E092H ;=11 第3组"咬", =0 第3组"吐"
;SIGND EQU E093H ;=11 第4组"咬", =0 第4组"吐"
;SIGNE EQU E094H ;=11 第5组"咬", =0 第5组"吐"
;SIGNF EQU E095H ;=11 第6组"咬", =0 第6组"吐"
;SIGNG EQU E096H ;=11 第7组"咬", =0 第7组"吐"
;SIGNH EQU E097H ;=11 第8组"咬", =0 第8组"吐"
STAL EQU E180H ;开奖位置STEP
SFAN EQU E410H ;E410-E41FH,押币数印象区
SORTFAN EQU E420H ;E420-E427H,押币数序号首址
SENDSU EQU E490H ;E490H-E494H,待发送数据缓冲区首址
TON EQU E008H ;打气筒押币数
TONBUF EQU E020H ;打气筒显示缓冲区
TJDAT EQU E042H ;退奖键计数值
TBN EQU E069H ;退币7秒计数用
TEMP1 EQU E071H ;DEMO ;FANADD用
TEMP2 EQU E073H ;E073-E074 数币单位SUBI,JJLL;THREE用
TEMP2A EQU E074H ;E073-E074 SUBI,JJLL,SLCMAX用
TEMP4 EQU E075H ;JJLL用
TEMP3 EQU E076H ;DIV24用
TEMP5 EQU E077H ;E077-E078H BYBSUB用,DEMO中为音效标志
TEMP6 EQU E079H ;E079-E07AH BYBSUB用
TEMPX EQU E080H
TEMPY EQU E082H
TEMPZ EQU E084H ;计算机率用
TE1 EQU E16DH ;算开奖时暂存器
TEMPA EQU E1A0H ;24位DIV用
TEMPB EQU E1A3H ;24位DIV用
TEMPC EQU E1A6H ;24位DIV用 (E1A6-E1A9)
TUSIA EQU E668H ;第1组大奖类别(2-9)
;TUSIB EQU E669H ;第2组大奖类别(2-9)
;TUSIC EQU E66AH ;第3组大奖类别(2-9)
;TUSID EQU E66BH ;第4组大奖类别(2-9)
;TUSIE EQU E66CH ;第5组大奖类别(2-9)
;TUSIF EQU E66DH ;第6组大奖类别(2-9)
;TUSIG EQU E66EH ;第7组大奖类别(2-9)
;TUSIH EQU E66FH ;第8组大奖类别(2-9)
TUDBA EQU E670H ;第1组大奖累积数
;TUDBB EQU E672H ;第2组大奖累积数
;TUDBC EQU E674H ;第3组大奖累积数
;TUDBD EQU E676H ;第4组大奖累积数
;TUDBE EQU E678H ;第5组大奖累积数
;TUDBF EQU E67AH ;第6组大奖累积数
;TUDBG EQU E67CH ;第7组大奖累积数
;TUDBH EQU E67EH ;第8组大奖累积数
WILLP EQU E0A8H ;E0A8-E0A9欲开奖的PRICE数
WY EQU E04BH ;(WY)=1表示 1:1 (WY)=5表示 5:1
YBKDAT EQU E030H ;E030-E037押币键计数值
XQDAT EQU E041H ;洗钱键计数值
;******************
;* 开机初始化程序 *
;******************
ORG 0H
DI ;关中断
LD BC,02FFFH ;上电复位延时计数器预置数
LA1: DEC BC ;延时计数器减一
LD A,B
OR C ;高低字节=0?
JR NZ,LA1 ;非0转LA1循环
LD SP,E7FFH ;设置堆栈为E7FFH~FFFFH
CALL FIR1 ;8279 8253 8255 计数器初始化
JP 106H ;转106H主程序
;****************
;* 中断向量入口 *
;****************
ORG 38H
JP INTI ;转INTI中断处理程序
;**********
;* 主程序 *
;**********
ORG 106H
CALL DELAY ;延时
CALL DELAY
;*******************
;* 有总清零按钮吗? *
;*******************
AN1: LD A,E0H ;"111",设置允许对RAM再次写入
OUT (61H),A ;(61H)为8279命令字地址
LD A,42H ;"010",设置只读FIFO/传感器"02H"单元内容
OUT (61H),A ;"02H"单元内容为DIP4开关值
IN A,(60H) ;读取键入数据,60H为8279数据口地址
AND 30H ;屏敝出BIT5,BIT4(即AN2,AN1.见图MAIN-2:3B处)
CP 30H ;与00110000比较(按键AN1,AN2低有效)
JR NZ,STARTD ;没按下,转STARTD游戏开始
LD BC,0FFFH ;有按下,则延时
LA2: DEC BC
LD A,B
OR C
JR NZ,LA2
;***********************
;* 再判有总清零按钮吗? *
;***********************
LD A,E0H ;"111",设置允许对RAM再次写入
OUT (61H),A ;(61H)为8279命令字地址
LD A,42H ;"010",设置只读FIFO/传感器"02H"单元内容
OUT (61H),A ;"02H"单元内容为DIP4开关值
IN A,(60H) ;读取键入数据,60H为8279数据口地址
AND 30H ;屏敝出BIT5,BIT4(即AN2,AN1.见图MAIN-2:3B处)
CP 30H ;与00110000比较(按键AN1,AN2低有效)
JR NZ,STARTD ;没,转STARTD游戏开始
CALL CLSALL ;6116存储器E000H~E6FFH清零,预置投币校验数
; CALL PLMU1
JP LIALL ;全部发光管,白炽灯及数码管交替闪,关机才能退出
;************
;* 开始游戏 *
;************
STARTD: LD A,E0H ;"111",设置允许对RAM再次写入
OUT (61H),A ;(61H)为8279命令字地址
LD A,42H ;"010",设置只读FIFO/传感器"02H"单元内容
OUT (61H),A ;"02H"单元内容为DIP4开关值
IN A,(60H) ;读取键盘数据,有按钮吗?
BIT 7,A ;测试BIT7
JP NZ,SUBI ;BIT7≠0,进入数币SUBI
BIT 4,A ;测试BIT4
JP NZ,DISP1 ;BIT4≠0,显示总输赢数,净收入,赢输比
START: CALL CLSME ;6116游戏部分清零,押币数显示"0",8255通讯初始化
CALL FIRMAP ;亮初始灯
CALL DIP ;DIP8,DIP4开关设定处理子程式
CALL MAPLOOP ;亮二个小环灯
LD A,(SIGN3) ;(SIGN3)的BIT7为开机后没按过START键标志
SET 7,A ;BIT7←1,开机后没按过START键标志置位
LD (SIGN3),A ;(SIGN3)=E047H
STARTC: IM1 ;设置中断方式1
EI ;开中断
LD HL,(PRICE) ;(PRICE)=E005H~E006H,为中奖数寄存器
LD A,H ;检查奖金是否为"0"
OR L
JR Z,STARTH ;奖金为"0",转STARTH检查6116出入表
LD A,60H ;奖金不为"0",则(CTC1)←60H
LD (CTC1),A ;(CTC1)为循环灯定时减法计数器
PTM: LD A,(CTC1) ;取出定时值
CP 0 ;检查(CTC1)是否为"0"
JR NZ,PTM ;定时未到,转PTM等待
JP LP5UA ;转LP5UP,将奖金数(PRICE)→移入投币口(MONEY)
;*************************************
;* 检查6116出入表及投币数(MONEY)程式 *
;*************************************
STARTH: CALL SELFCK ;检查6116出入表
LD HL,(MONEY) ;(MONEY)=E000H~E002H,为投币数
LD A,L
OR H
JR NZ,STARTA ;投币数(MONEY)≠"0",转STARTA继续
CALL DEMO ;没钱了则调用DEMO演示程序,有投币数才退出
;***********************************
;* 投币数(MONEY)≠"0",继续游戏程式 *
;***********************************
STARTA: LD A,(SIGN5) ;投币数(MONEY)≠"0"则清(SIGN5)中的DEMO标志
RES 3,A ;(SIGN5)之BIT3为DEMO标志
LD (SIGN5),A
CALL CLSD7 ;清押币数闪烁标志
LD A,0FFH ;(LED3)为白炽灯LAMP数据寄存器(E0E1H~E0E2H)
LD (LED3),A ;点亮8只押币灯
LD A,40H ;40H=01000000B,START灯在E0E2H之BIT6
LD (LED3+1),A ;点亮START灯
CALL MAPLAMP ;调用按钮灯驱动子程式
CALL MAP8 ;点亮数码管
CALL MAPLED ;点亮跑灯
;***************************
;* 产生随机数,开始跑灯程式 *
;***************************
LOOP1: LD HL,INCDAT ;INCDAT为随机数计数器1(减),地址为E059H
DEC (HL) ;产生随机数1
INC HL ;指向随机数计数器2(加),地址为E05AH
INC (HL) ;产生随机数2
;************************************
;* 检查(SIGN1)之BIT2,有否超时不按键 *
;************************************
LD A,(SIGN1) ;(SIGN1)=E045H,BIT2=1,跑灯
BIT 2,A ;测试(SIGN1)之BIT2,在跑灯吗?
JR Z,LOOP1A ;BIT2="0",不在跑灯,转LOOP1A继续
;****************
;* 跑灯处理程式 *
;****************
LD A,(CTC1) ;正在跑灯,定时到?
AND A
JR NZ,LOOP1A ;跑灯定时未到,转LOOP1A继续
CALL GOPAO ;调用跑灯程序
LD A,(STEPL) ;(STEPL)=E007H,为跑灯步数计数器
AND A ;跑灯步数结束?
JR NZ,LOOP1A ;步数(STEPL)≠"0",转LOOP1A继续
LD A,(SIGN1) ;清跑灯标志(SIGN1)之BIT2
RES 2,A
LD (SIGN1),A
JP JIPRI ;转JIPRI计算奖分
LOOP1A: LD A,(SIGN3) ;(SIGN3)=E047H,BIT5=1,二个小环灯跑
BIT 5,A ;测试(SIGN3)之BIT5,二个小环灯跑?
JR Z,LOOP1P ;BIT5="0",小环灯不跑,转LOOP1P继续
LD A,(CTC1) ;BIT5≠0,小环灯在跑,定时到?
OR A
JR NZ,LOOP1P ;定时未到,转LOOP1P继续
CALL ROUND ;调用小环灯程序
;*********************************
;* 检查(SIGN)之BIT5,有否退币键? *
;*********************************
LOOP1P: LD A,(SIGN) ;(SIGN)=E044H,BIT5=1,退币键标志
BIT 5,A ;测试(SIGN)之BIT5,有退币键?
JP Z,LOOP1Q ;BIT5="1",有退币键,转LOOP1Q继续
LD A,(CTC1) ;BIT5≠0,有退币键,定时到?
CP 0
JP NZ,LOOP1Q ;定时未到,转LOOP1Q继续
LD A,(TBN) ;(TBN)=E069H,退币7秒计数器
DEC A
JR Z,TBERR ;退币7秒计数到,转TBERR故障处理
LD (TBN),A ;退币7秒计数器计数
LD A,FFH ;重置8253定时器
LD (CTC1),A
JR LOOP1Q ;转LOOP1Q继续
;**********************
;* 退票机故障处理程式 *
;**********************
TBERR: LD A,33H ;>7秒,退票机有故障
LD (ERRDAT),A ;设置退票机故障显示代码"33H"
LD A,(ST8255) ;读8255 A口数据初始值
RES 1,A
LD (ST8255),A
OUT (80H),A
JP MYERR ;系统故障显示
;**********************************************
;* 将奖金数(PRICE)快速→移入投币口(MONEY)程式 *
;**********************************************
LOOP1Q: LD A,(SIGN2) ;(SIGN2)=E046H,BIT1=1,快速移分
BIT 1,A ;测试(SIGN2)之BIT1,有否快速移分?
JR Z,LOOP1S ;BIT1="0",无快速移分,转LOOP1S继续
CALL DECSPR ;BIT1≠0,有快速移分,则先做乱数减(WY)
LD A,(SIGN4) ;(SIGN4)=E048H,BIT0=1,奖分最快速移分
BIT 0,A ;测试(SIGN4)之BIT0,有否最快速移分?
JP NZ,LP5U1 ;BIT0≠"0",最快速移分,转LP5U1继续
LD A,(CTC1) ;BIT5=0,最快速移分,定时到?
CP 0
JP NZ,LOOP1S ;定时未到,转LOOP1S继续
LD A,(SIGN3) ;(SIGN3)=E047H,BIT2=1,重复START键
BIT 2,A ;BIT2="1",有重复START键
JP Z,LP5U1 ;BIT2="0",转LP5U1
LD A,(SIGN4) ;(SIGN4)=E048H,BIT0=1,奖分最快速得分
SET 0,A
LD (SIGN4),A ;清奖分最快速→移分标志
JP LP5U1 ;转LP5U1,奖金数快速→移入投币口
LOOP1S: LD A,(SIGN3) ;(SIGN3)=E047H,BIT1=1,中奖后30秒结束
BIT 1,A ;测试(SIGN3)之BIT1
JR Z,LOOP1T ;BIT1="0",无中奖后30秒结束,转LOOP1T继续
;*************************************************
;* 测试到(SIGN3)之BIT1=1,中奖后30秒结束处理程式 *
;*************************************************
BIT 2,A ;测试(SIGN3)之BIT2,有否重复START键
JR NZ,LOOP1T ;BIT2≠"0"重复START键,转LOOP1T继续
LD HL,(HINC1) ;延时1分16位计数值
LOP1S1: LD A,H
CP 18H ;FFFFH-1800H=E7FFH(即59361D*1ms=60秒)
JR C,LOOP1T ;定时未到,转LOOP1T继续
LOP1S2: LD A,(SIGN1) ;(SIGN1)=E045H,BIT5=1,中奖灯闪烁
RES 5,A ;(SIGN1)之BIT5←"0"
LD (SIGN1),A ;清中奖灯闪烁标志
|