Re: 89C51ED2
- From: "TT_Man" <Someone@xxxxxxxxxxxx>
- Date: Sat, 6 Sep 2008 11:26:20 +0100
">> > Now why does my code always start with an initialisation procedure for
variables
Set the stack pointer to where you want it to be- #mainStackand the 8051 special function registers function I wonder ?
Mine usually starts:
LJMP Startup
.........................
StartUp:
MOV SP,#MainStack
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
WTF is that supposed to do ?
Graham
Set ports 1,2 and 3 to 0xFF
How hard is that?
BTW my text code didn't get attached in a previous post. So here are some
segments of it......sorry it's long.........
;12 MHz
;CONSTANTS
;SOUND ADDRESSES
..EQU EMPTYS,H'2000 ;"NO ENERGY" will be replaced with new version
..EQU WARN01,H'4622 ;"WARNING" will now be good shot
..EQU HITSND,H'5D18 ;"YOU ARE HIT"
..EQU GOSND,H'85FC ;"GO"
..EQU GUNSND1,H'96A5 ;GUN SOUND1
..EQU GUNSND2,H'D4D9 ;GUN SOUND2
..EQU GUNSND3,H'E5CF ;GUN SOUND3
..EQU GUNSND4,GUNSND3 ;GUN SOUND4
..EQU GAMEND,H'ADF7 ;"GAME OVER"
..EQU BPS524,H'89 ;@16 MHZ = 61, @12 MHZ = 89, @11.0592=92
..EQU BPS600,H'98 ;@16 MHZ = 75, @12 MHZ = 98, @11.0592=A0
..EQU BPS1600,H'D9 ;@16 MHZ = CC, @12 MHZ =D9, @11.0592=DC
..EQU INT100,H'99 ;@16 MHZ = 77, @12 MHZ = 99,@ 11.0592= A4
..EQU CKFREQ,H'BF ;@16 MHZ = FF, @12 MHZ = BF
..EQU DEFID,H'FF ;INVALID GUN ID
..EQU DEFTCD,H'ff ;15 MINUTES DEFAULT TIME CODE
..EQU DEFGMF,H'00 ;TEAM DEFAULT GAME STYLE
..EQU DEFSTS,H'FF ; DEFAULT UNLIMITED SHOTS
..EQU DEFLVS,H'FF ; DEFAULT UNLIMITED LIVES
..EQU DEFINV,H'02 ;INVINCIBLE FOR 13 TO 18.5 SECONDS
..EQU DEFDEL,H'00 ;1 MINUTE INITIAL DELAY
..EQU SPSTRT,H'19 ;STACK POINTER START LOCATION
;BIT CONSTANTS
..EQU BAKLED,P3.7 ;BACK LEDS
..EQU SCL,P3.6 ;NOVA-RAM CLOCK BIT CPU PIN 16
..EQU SDA,P3.5 ;NOVA-RAM DATA BIT CPU PIN 15
..EQU DATA,P3.4 ;LED DATA BIT CPU PIN 14
..EQU CLCK,P3.5 ;LED DATA BIT CPU PIN 15
..EQU TRGGER,P3.3 ;TRIGGER
..EQU LASER,P3.2 ;LASER
..EQU TXD,P3.1 ;I/R OUTPUT
..EQU DFLAG,PSW.5 ;DOWNLOAD FLAG
..EQU STFLAG,PSW.1 ;START TRIGGER FLAG
..EQU GFLAG,B.7 ;GAME FLAG, 1=GAME OVER, 0=GAME ON
..EQU TFLAG,B.6 ;TRIGGER FLAG, 1=TRIGGER PULLED
..EQU SFLAG,B.5 ;START FLAG, 1=DURING START DELAY
..EQU LFLAG,B.4 ;LOW FLAG, 1=LESS THAN 10 SHOTS LEFT
..EQU EFLAG,B.3 ;EMPTY FLAG, 1=NO ENERGY
..EQU HFLAG,B.2 ;HIT FLAG, 1=BEEN HIT
..EQU OTFLAG,B.1 ;OLD TRIGGER STATUS FLAG
..EQU IFLAG,B.0 ;INVINCIBLE FLAG, 1=INVINCIBLE
..EQU FLAGS,B ;ALL THE ABOVE FLAGS
;BYTE VARIABLES
..EQU TXCNTR,H'08 ;TX BUFFER COUNTER
..EQU TNFREQ,H'09 ;TONE FREQ
..EQU TNLEN,H'0A ;LENGTH OF BEEPS
..EQU FRQCTR,H'0B ;FREQUENCY COUNTER FOR TONE
..EQU BPNUM,H'0C ;NO OF BEEPS
..EQU DELSIX,H'0D ;SIX SECOND DELAY COUNTER
..EQU RXPREV,H'0E ;PREVIOUSLY RECEIVED IR BYTE
..EQU RXLAST,H'0F ;MOST RECENTLY RECEIVED BYTE
..EQU LEDTIM,H'10 ;256 mS LED CLOCK COUNTER
..EQU LEDRFR,H'11 ;REFRESH 256 mS LED CLOCK
..EQU RXCNTR,H'12 ;RX BUFFER COUNTER
..EQU R13,H'13 ;R13
..EQU R14,H'14 ;R14
..EQU R15,H'15 ;R15
..EQU LEDByte,R15
..EQU DELAYL,H'16 ;DELAY LSB
..EQU DELAYM,H'17 ;DELAY MSB
..EQU CTR100,H'18 ;DELAY REGISTER
..EQU GUNID,H'30 ;GUN ID
..EQU GAMESM,H'31 ;GAMES PLAYED MSB
..EQU GAMESL,H'32 ;GAMES PLAYED LSB
..EQU TIMCOD,H'33 ;TIME CODE 6.5 SECONDS
..EQU SHOTS,H'34 ;SHOTS PER RE-ENERGISE
..EQU LIVES,H'35 ;LIVES
..EQU INVRST,H'36 ;INVINCIBLE TIME CODE RESET VALUE
..EQU DLTIME,H'37 ;LED TIMER
..EQU GMFLAG,H'38 ;GAME FLAG $80 = SOLO $ = TEAM
..EQU SHTSDN,H'39 ;SHOTS DOWN COUNTER
..EQU SHOTSM,H'3A ;SHOTS FIRED MSB
..EQU SHOTSL,H'3B ;SHOTS FIRED LSB
..EQU REENGS,H'3C ;RE-ENERGISES NOW GOOD SHOT FLAG
..EQU LIVSDN,H'3D ;LIVES DOWN COUNTER
..EQU INVCTR,H'3E ;INVINCIBLE TIME CODE COUNTER
..EQU GUNSOUND,H'3F ;
..EQU PCON,H'87 ;POWER CONTROL REGISTER
..EQU EECON,H'0D2 ;EEPROM SFR
..EQU AUXR1,H'0A2
..EQU DAC,P1 ;DIGITAL TO ANALOGUE COUNTER
..ORG H'0000
AJMP START ;GOTO START
..DB " V9.3S" ;VERSION NUMBER
..ORG H'000B
AJMP TIMINT ;100 uS REAL TIME INTERRUPT
..ORG H'0013
AJMP TRGINT ;TRIGGER INTERRUPT
..DB "MINIGUN"
..ORG H'0023 ;SERIAL PORT INTERRUPT
JNB TI,NOTTXI
AJMP TXINT ;TX INTERRUPT
NOTTXI: AJMP RXINT ;RX INTERRUPT
;****************************************************************************************************
DoAudio: MOV DAC,R3 ;last value
INC DPTR ;POINT TO NEXT SOUND BYTE
CLR A
MOVC A,@A+DPTR ;GET IT
MOV R3,A ;STORE IT READY FOR NEXT TIME INTERRUPT
JNZ NTimer
MOV DAC,#H'7F ;dac = 1/2 vref out/
SJMP NTimer
;
;
;
TIMINT: PUSH ACC ;SAVE ACCM
PUSH PSW ;SAVE CARRY
CJNE R3,#0,DoAudio
NTIMER: DJNZ CTR100,TIMER ;GENERAL PURPOSE TIMER EVERY 100uS
MOV CTR100,DELAYL ;RELOAD LSB OF TIMER
DEC DELAYM ;DECREMENTS EVERY 100uS * DELAY LSB
TIMER: DJNZ R7,RETINT ;GAME TIMER EVERY 100uS
MOV C,TRGGER ;EVERY 25.6mS
MOV OTFLAG,C ;SAVE POSITION OF TRIGGER FOR DEBOUNCE
JB GFLAG,TIMERC ;GAME OVER, NO LEDS
JB HFLAG,TIMERC ;YOU ARE HIT, NO LEDS
TSTLED: DJNZ LEDTIM,TIMERC ;NOT YET 25.6mS * LED REFRESH, NO LEDS
JNB SFLAG,RANDOM ;LEDS, IF NOT DURING START DELAY, RANDOM
CLR DATA ;DURING START DELAY, TURN ON NEXT LED
LJMP CKLEDS ;CLOCK LEDS ROUND
;
;
;;
START: CLR LASER ;LASER OFF
LCALL RESLED ;RESET LED DISPLAYS & BACK LED
MOV SCON,#H'70 ;MODE 3 WITH PARITY SM2 = 0
ORL PCON,#H'80 ;SMOD=1 ,FE IN SMOD
MOV TMOD,#H'22 ;AUTO RELOAD T1,T0
MOV TH1,#BPS524 ;GUN IR RATE
MOV TH0,#INT100 ;100 MICRO SEC RTC INT 12 MHZ
MOV TCON,#H'50 ;RUN T1 AND T0
SETB IT1 ;TRIGGER INTERRUPT EDGE TRIGGERED
MOV SP,#SPSTRT ;SET STACK POINTER
; NOW READ GUN ID DIP SWITCH
READPORT: MOV A,P0 ;READ PORT
CPL A
MOV B,A
ANL A,#H'0C0
CJNE A,#H'C0,TRYBIT8
AJMP TESTnovreset
TRYBIT8: RLC A
JC TESTMODE ;DO SPEECH TEST
LJMP NOTTEST ;
TESTnovreset:
JB TRGGER,READPORT
LJMP SETNOV
NOTCX: LJMP NOTTEST
;
;;
;
SETNOV: MOV GUNID,#DEFID ;DEFAULT GUN ID
MOV GAMESL,#H'00 ;ZERO
MOV GAMESM,#H'00 ;GAME COUNTER
MOV TIMCOD,#DEFTCD ;DEFAULT TIME CODE
MOV GMFLAG,#DEFGMF ;DEFAULT GAME STYLE
MOV SHOTS,#DEFSTS ;DEFAULT SHOTS
MOV LIVES,#DEFLVS ;DEFAULT LIVES
MOV DLTIME,#DEFDEL
MOV INVRST,#DEFINV
MOV R0,#GUNID
MOV R1,#H'08
LCALL NOVAWT
MOV H'08,#H'46 ;FMS1
MOV H'09,#H'4D
MOV H'0A,#H'53
MOV H'0B,#H'31
MOV R0,#H'08
MOV R1,#H'04
LCALL NOVAWT
LCALL BEEP5
LJMP ASLEEP
WAIT: ORL PCON,#H'01
JB SFLAG,WAIT ;start up delay while sflag=1
JNB GFLAG,AWAKE
LJMP GMOVER
;SAY GO GO GO, RESET ALL GAME PARAMETERS
AWAKE:
lcall reset_display
MOV FLAGS,#H'00 ;CLEAR FLAGS
MOV LEDRFR,#H'01
MOV LEDTIM,LEDRFR ;SET LEDS REFRESH RATE TO FAST
CLR ES ;STOP SERIAL STUFF WHILST SAYING "GO GO GO"
MOV R4,#H'03 ;3 "GO" S
NEXTGO: LCALL GO ;SET UP "GO" SOUND
LCALL WAITSP ;WAIT TIL IT'S DONE
LCALL GODEL ;A LITTLE DELAY
DJNZ R4,NEXTGO ;REPEAT TWICE MORE
JNB STFLAG,CONTIN ;TRIGGER WAS IN WHEN F3'ED SO CONTINUE GAME
; code jumps to NXTGUN and outputs a phrase 'good shot'somewhere here as
trigger is is not 'in'
MOV R0,#H'7F
NXTGUN: CJNE R0,#GUNSOUND,CLEARIT
LJMP TRYNXGUN
CLEARIT: MOV @R0,#H'00
TRYNXGUN: DEC R0
CJNE R0,#H'37,NXTGUN ;CLEAR GUN LOGGING AREA
CONTIN: MOV R3,#H'00 ;CLEAR AUDIO OUTPUT
MOV R7,#H'00
MOV R6,#H'00
MOV R5,TIMCOD ;SET GAME TIME
ETC ETC
;
;
;
GO: MOV DPTR,#GOSND
LJMP AUDIO
;
;
;
AUDIO: CLR A
MOVC A,@A+DPTR
MOV R3,A
RET
;
;
;
WAITSP: MOV A,R3
JNZ WAITSP
RET
.
- Follow-Ups:
- Re: 89C51ED2
- From: MooseFET
- Re: 89C51ED2
- From: Eeyore
- Re: 89C51ED2
- References:
- Re: 89C51ED2
- From: Robert Baer
- Re: 89C51ED2
- From: MooseFET
- Re: 89C51ED2
- From: Eeyore
- Re: 89C51ED2
- From: MooseFET
- Re: 89C51ED2
- From: Eeyore
- Re: 89C51ED2
- Prev by Date: Re: 89C51ED2
- Next by Date: ABSE on virgin (uk)
- Previous by thread: Re: 89C51ED2
- Next by thread: Re: 89C51ED2
- Index(es):
Relevant Pages
|