; PSX modchip
; Stealth_28 "ST2.8 MCUK"

	TITLE	"Stealth2.8"

	RADIX       DEC
	__IDLOCS    h'0208'

	
    ifdef __12C508A
		LIST P=12F508A
		include <p12c508a.inc>
		__CONFIG	_IntRC_OSC & _WDT_OFF & _MCLRE_OFF & _CP_OFF
	endif
    ifdef __12F508
		LIST P=12F508
		include <p12f508.inc>
		__CONFIG	_IntRC_OSC & _WDT_OFF & _MCLRE_OFF & _CP_OFF
	endif
    ifdef __12C509A
		LIST P=12F509A
		include <p12c509a.inc>
		__CONFIG	_IntRC_OSC & _WDT_OFF & _MCLRE_OFF & _CP_OFF
	endif
    ifdef __12F509
		LIST P=12F509
		include <p12f509.inc>
		__CONFIG	_IntRC_OSC & _WDT_OFF & _MCLRE_OFF & _CP_OFF
	endif
    ifdef __12F683
		LIST P=12F683
		include <p12f683.inc>
		__CONFIG	_INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _PWRTE_OFF & _CP_OFF & _CPD_OFF & _BOD_ON & _FCMEN_OFF & _IESO_OFF
	endif


;**************************************************************************
; EUR, *****, USA, WORLD
#define EUR

#define REGION_CODE_EUR		"SCEE"
#define REGION_CODE_USA		"SCEA"
#define REGION_CODE_JAP		"SCEI"
#define REGION_CODE_WORLD	"SCEW"

; 250 bps, n,8,2

	ifdef EUR
; SCEE (Europe)
; Modchip HEX: 09 A9 3D 2B A5 74
; TrackingError Signal "BIN": 10011010100 10011110100 10101110100 11101110100
;
#define	REGION_CODE	REGION_CODE_EUR
	endif
	ifdef *****
; SCEI (Japan)
; Modchip HEX: 09 A9 3D 2B A5 B4
; TrackingError Signal "BIN": 10011010100 10011110100 10101110100 11110110100
;
#define	REGION_CODE	REGION_CODE_JAP
	endif
	ifdef USA
; SCEA (U.S.A. & America)
; Modchip HEX: 09 A9 3D 2B A5 F4
; BIN: (0000)1001 10101001 00111101 00101011 10100101 11110100
;
#define REGION_CODE	REGION_CODE_USA
	endif
	ifdef WORLD
; SCEW (World)
; Modchip HEX: 09 A9 3D 2B A5 A8
; TrackingError Signal "BIN": 10011010100 10011110100 10101110100 11110101000
;
#define REGION_CODE	REGION_CODE_WORLD
	endif

#define REGION_CODE_1	REGION_CODE
#define REGION_CODE_2	REGION_CODE
#define REGION_CODE_3	REGION_CODE

;**************************************************************************

    ifdef __12F683
RAMbase EQU 20H
    endif
    ifdef __12C508A
RAMbase EQU 07H
    endif
    ifdef __12F508
RAMbase EQU 07H
    endif
    ifdef __12C509A
RAMbase EQU 07H
    endif
    ifdef __12F509
RAMbase EQU 07H
    endif

    CBLOCK  RAMbase
		counter, count, bitcnt, cnt0, cnt1
		txbyte, byteptr, count1, count0
		memflag, rstflag, bittime, bittime1, bittime2
		signum3, signum2, signum1
		dummy, unused, gatebsyflg, dino_mode
;		r0x1c, r0x1d, r0x1e, r0x1f
    ENDC

;**************************************************************************
;                         ____  ____
;                        |    \/    |
;                  Vdd --+ 1      8 +-- Vss
;    Mem Card            |          |
;    (GP5) Conn. Pin 3 --+ 2      7 +-- signal from door (GP0)
;                        |          |
; (GP4) LED +-|>|-/\/\/--+ 3      6 +-- data stream (GP1)
;                        |          |
;          (GP3) reset --+ 4      5 +-- gate in/out (GP2)
;                        |          |
;                        +----------+

#define	DOOR_SW		GPIO, 0x0	; Door switch (in) (open=0, closed=1)
#define	DATA_OUT	GPIO, 0x1	; Data out (out)
#define	GATE		GPIO, 0x2	; Gate in (in/out)
#define	RESET		GPIO, 0x3	; Reset (in)       (reset=0, normal=1)
#define	LED			GPIO, 0x4   ; Led (out)        (on=0, off=1)
#define	MEM_ACCESS	GPIO, 0x5   ; Mem access (in)

;**************************************************************************
;MACROS
;
; Check every 50ms if RESET is active (low) and wait until inactive
WAIT_RST  macro
	  local Loop
Loop	CALL	Dly_50ms
		BTFSS	RESET		; Check if RESET is released
		GOTO	Loop
	endm
;
;----------------------------
;Macro to avoid the limit of the 12c508 two level stack unfolding the code
;
DINO_MODE  macro mode
	local Start, Loop, Exit
Start
		WAIT_RST			; Wait until RESET is released

		CLRF	byteptr		; Start of string
		CALL	TXregcode	; Send 1st region_code datagram
		BTFSS	RESET		; Check if Reset
		GOTO	Exit		; Yes. Go next mode

		CALL	TXregcode	; Send 2nd region_code datagram
		BTFSS	RESET		; Check if Reset
		GOTO	Exit		; Yes. Go next mode

		CALL	TXregcode	; Send 3rd region_code datagram

		MOVLW	.38 + mode	; Wait 3.8 to 5 sec between
		MOVWF	dino_mode                             
Loop	CALL	Dly_100ms
		BTFSS	RESET		; Check if Reset
		GOTO	Exit		; Yes. Go next mode

		DECFSZ	dino_mode, F                         
		GOTO	Loop

		CALL	Loadregs	; bittime=bittime1 : bittime2
		GOTO	Start		; Keep sending datagrams while not reset
Exit
	endm
;
;----------------------------
;
M001 macro
		MOVLW	0xfb		;--x1xx1x DATA=1, LED=1 (OFF)
		BTFSS	GATE		; If GATE=0 then set DATA=0
		MOVLW	0xf9		;--x1xx0x DATA=0, LED=1 (OFF)
		MOVWF	GPIO
		NOP                                    
	endm

;**************************************************************************
; ENTRY POINT * ENTRY POINT * ENTRY POINT * ENTRY POINT * ENTRY POINT *
;**************************************************************************

        ORG 0

Reset
	ifdef __12C508A
		MOVWF	OSCCAL		; Set calibration
		GOTO	Start

		dt "ST2.8 MCUK"
	endif
    ifdef __12F508
		MOVWF	OSCCAL		; Set calibration
		GOTO	Start

		dt "ST2.8 MCUK"
	endif
	ifdef __12C509A
		MOVWF	OSCCAL		; Set calibration
		GOTO	Start

		dt "ST2.8 MCUK"
	endif
    ifdef __12F509
		MOVWF	OSCCAL		; Set calibration
		GOTO	Start

		dt "ST2.8 MCUK"
	endif
    ifdef __12F683
		MOVLW	07h			; Setup I/O
		MOVWF	CMCON0		; Set GP<2:0> to digital I/O
		BSF     STATUS,RP0
  errorlevel -302			; Turn off banking message
; Disable A/D input !!!
		CLRF    ANSEL		; digital I/O
;		MOVLW   b'00101111'
;		MOVWF   TRISIO
; WakeUp,PullUp Disabled, T0CS=Fosc/4, PSA Prescaler to Timer0, PS2:PS0=1:8
;		MOVLW   0xc2		;
;		MOVWF   OPTION_REG
  errorlevel +302			; Enable banking message
		BCF     STATUS,RP0

		GOTO	Start

		dt "ST2.8"
	endif
;
;**************************************************************************
;
		ORG 0xc

; Preload bittime with alternating count values to send with dual baudrate
; inc dummy; (odd)? bittime=bittime1 : bittime=bittime2
Loadregs
		INCF	dummy, F
		BTFSS	dummy, 0
		GOTO	Dummyodd

		MOVF	bittime2, W	; dummy was even
		MOVWF	bittime
		RETLW 0                                
;
Dummyodd
		MOVF	bittime1, W	; dummy was odd
		MOVWF	bittime
		RETLW 0                                
;
;
;
;**************************************************************************
; Delay 100 milliseconds aprox.
;
Dly_100ms
		MOVLW	.100
		GOTO	Delay_W
;
;----------------------------
; Delay 10 milliseconds aprox.
;
Dly_10ms
		MOVLW	.10
		GOTO	Delay_W
;
;----------------------------
; Delay 50 milliseconds aprox.
;
Dly_50ms
		MOVLW	.50
;
;----------------------------
; Delay W milliseconds aprox.
;
Delay_W	MOVWF	cnt0		;
Dloop1
		MOVLW	0xc6		;
		MOVWF	cnt1		;
Dloop2
		BTFSS	MEM_ACCESS	; Mem access? (Memcard is accessed when the machine has booted)
		CLRF	memflag		; Yes. Clear flag
		DECFSZ	cnt1, F                          
		GOTO	Dloop2

		BTFSS	RESET		; Resetting?
		CLRF	rstflag		; Yes. Clear flag
		DECFSZ	cnt0, F                          
		GOTO	Dloop1

		RETLW 0                                
;
;
;
;**************************************************************************
; send bit=0
TXb_0	BTFSC	gatebsyflg, 0	; GATE busy?
		GOTO	TXb_0nogate	; Yes. Then send bits without forcing GATE

		NOP					; MEM, LED, RESET, GATE, DATA, DOOR
		MOVLW	0xe9		;--101001 DATA, GATE, LED output
		TRIS	GPIO
		MOVLW	0xe9		;--x0x00x DATA=0, GATE=0, LED=0 (ON)
		MOVWF	GPIO
		GOTO	Dly_4ms
;
;
;
TXb_0nogate
		MOVLW	0xed		;--101101 DATA, LED output, GATE input
		TRIS	GPIO
		MOVLW	0xe9		;--x0xx0x DATA=0, LED=0 (ON)
		MOVWF	GPIO

		GOTO	Dly_4ms
;
;
;
; send bit=1
TXb_1	BTFSC	gatebsyflg, 0	; GATE busy?
		GOTO	TXb_1nogate	; Yes. Then send bits without forcing GATE

		NOP					; MEM, LED, RESET, GATE, DATA, DOOR
		MOVLW	0xeb		;--101011 DATA input, GATE, LED output
		TRIS	GPIO
		MOVLW	0xf9		;--x1x0xx GATE=0, LED=1 (OFF), DATA=1 (ext. pullup)
		MOVWF	GPIO

		GOTO	Dly_4ms
;
;
; Wait 4ms per bit for a rate of 250bps
;
Dly_4ms	MOVF	bittime, W                           
		MOVWF	cnt1                              
Dly_4msloop1
		MOVLW	.2
		MOVWF	cnt0
Dly_4msloop2
		BTFSS	MEM_ACCESS	; Mem access?
		CLRF	memflag		; Yes. Clear flag
		BTFSS	RESET		; Resetting?
		CLRF	rstflag		; Yes. Clear flag

		DECFSZ	cnt0, F                          
		GOTO	Dly_4msloop2

		DECFSZ	cnt1, F                          
		GOTO	Dly_4msloop1

		RETLW 0                                
;
;
; Wait 4ms per bit for a rate of 250bps
;
TXb_1nogate					; MEM, LED, RESET, GATE, DATA, DOOR
		MOVLW	0xed		;--101101 DATA, LED output, GATE input
		TRIS	GPIO

		MOVF	bittime, W                           
		MOVWF	cnt1                              
TXb1ngloop
		MOVLW	0xfb		;--x1xx1x DATA=1, LED=1 (OFF)
		BTFSS	GATE		; If GATE=0 then set DATA=0
		MOVLW	0xf9		;--x1xx0x DATA=0, LED=1 (OFF)
		MOVWF	GPIO
		NOP                                    

		BTFSS	MEM_ACCESS	; Mem access?
		CLRF	memflag		; Yes. Clear flag
		BTFSS	RESET		; Resetting?
		CLRF	rstflag		; Yes. Clear flag

		MOVLW	0xfb		;--x1xx1x DATA=1, LED=1 (OFF)
		BTFSS	GATE		; If GATE=0 then set DATA=0
		MOVLW	0xf9		;--x1xx0x DATA=0, LED=1 (OFF)
		MOVWF	GPIO
		NOP                                    

		NOP                                    
		DECFSZ	cnt1, F                          
		GOTO	TXb1ngloop

		NOP                                    

		MOVLW	0xfb		;--x1xx1x DATA=1, LED=1 (OFF)
		BTFSS	GATE		; If GATE=0 then set DATA=0
		MOVLW	0xf9		;--x1xx0x DATA=0, LED=1 (OFF)
		MOVWF	GPIO
		NOP                                    

		MOVLW	0xfb		;--x1xx1x DATA=1, LED=1 (OFF)
		BTFSS	GATE		; If GATE=0 then set DATA=0
		MOVLW	0xf9		;--x1xx0x DATA=0, LED=1 (OFF)
		MOVWF	GPIO
		NOP                                    

		RETLW 0                                
;
;
;----------------------------
; Transmit region_code signature datagram 250bps,8,n,2 inverted
; DATA=0 previoulsy
TXregcode
		MOVLW	.72			; Delay 72 ms marker at head
		CALL	Delay_W

		MOVLW	.4			; region_code datagram len=4
		MOVWF	count		;
TXrc_byteloop
		MOVF	byteptr, W	; Get current char pointer
		CALL	Table		; Read signature from Table
		MOVWF	txbyte		; Store temp code
		COMF	txbyte, F	; The signature must be complemented
		MOVLW	.9			; start+byte=9 
		MOVWF	bitcnt                              
		GOTO	TXrc_b1		; Send start bit=1

TXrc_bitloop
		RRF		txbyte, F	; LSB rotate byte thru carry
		BTFSS	STATUS, C	; Is carry set?
		GOTO	TXrc_b0		; c=0
TXrc_b1
		CALL	TXb_1		; Send bit=1
		GOTO	TXrc_bnxt
TXrc_b0
		CALL	TXb_0		; Send bit=0
		NOP                                    
TXrc_bnxt
		DECFSZ	bitcnt, F	; Last bit?
		GOTO	TXrc_bitloop	; Send next

		CALL	TXb_0		; Send stop bit=0
		CALL	TXb_0      	; Send stop bit=0
		INCF	byteptr, F	; Point to next byte
		DECFSZ	count, F	; Last byte?
		GOTO	TXrc_byteloop	; Send next byte

		RETLW 0
;
;
;
;**************************************************************************
Table	ADDWF	PCL, F		; Table with region_codes
		dt	REGION_CODE_1	; 1st
		dt	REGION_CODE_2	; 2nd
		dt	REGION_CODE_3	; 3rd
;
;
;
;**************************************************************************
Main_1	CLRF	dummy
		CALL	Dly_50ms	; Wait 50ms
		BTFSC	RESET		; Reset active?
		GOTO	Main_2		; No

		MOVLW	.250		; delay 2.5 secs
		MOVWF	count1
Mloop1	BTFSC	RESET		; Reset active?
		GOTO	Main_2		; No

		CALL	Dly_10ms                              
		DECFSZ	count1, F
		GOTO	Mloop1

		WAIT_RST			; Wait until RESET is released. Could've been in the dino macro if were after the jump.

		GOTO	Dino1		; RESET active > 2.5 sec starts dino mode
;
;
;
Main_2
		MOVLW	.18			; delay 900ms
		MOVWF	counter
Mloop2	CALL	Dly_50ms
		DECFSZ	counter, F
		GOTO	Mloop2
;
		CLRF	gatebsyflg	; Initialize flag
;
; Wait up to 5 secs until GATE is quiet high or low
;
		MOVLW	.25                             
		MOVWF	count1

ChkGateloop
		MOVLW	.20
		MOVWF	count0
ChkGateloop1
		BTFSC	GATE
		GOTO	ChkGatehigh

		DECFSZ	count0, F
		GOTO	ChkGateloop1

		GOTO	Gatequiet	; GATE was low 100us
;
ChkGatehigh
		MOVLW	.20
		MOVWF	count0
ChkGateloop2
		BTFSS	GATE
		GOTO	ChkGateagain

		DECFSZ	count0, F
		GOTO	ChkGateloop2

		GOTO	Gatequiet	; GATE was high 100us

ChkGateagain
		DECFSZ	count1, F
		GOTO	ChkGateloop
;
; More than 5 secs with a data stream in GATE
; Set DATA=0, LED=0	(ON) and GATE as input
;
		BSF		gatebsyflg, 0	; Set to mark that GATE is busy

		MOVLW	0xe9		;--101001 DATA=0, GATE=0, LED=0	(ON)
		MOVWF	GPIO
		MOVLW	0xed		;--101101 DATA, LED output, GATE input
		TRIS	GPIO		; MEM, LED, RESET, GATE, DATA, DOOR
		GOTO	Gatecont
;
; GATE is quiet high or low
; Set DATA=0, GATE=0, LED=0 (ON)
;
Gatequiet
		MOVLW	0xe9		;--101001 DATA=0, GATE=0, LED=0 (ON)
		MOVWF	GPIO
		MOVLW	0xe9		;--101001 DATA, GATE, LED output
		TRIS	GPIO		; MEM, LED, RESET, GATE, DATA, DOOR                              

Gatecont
		BSF		rstflag, 0	; Initialize flag
		BSF		memflag, 0	; Initialize flag
;
; Wait 314 ms before sending the country code
;
		MOVLW	.157		; delay 157 ms
		CALL	Delay_W                             
		MOVLW	.157		; delay 157 ms
		CALL	Delay_W                             
;
; Send (signum2=18) * 3 times the country code
;
		MOVF	signum2, W	; signum2=18
		MOVWF	count1
TXsig
		MOVLW	.3			; Send 3 region_code datagrams (MAX=3)
		MOVWF	count0
		CLRF	byteptr		; Start of string
TXsigloop1
		CALL	TXregcode	; Send region_code datagram
		BTFSS	rstflag, 0	; Resetting?
		GOTO	Main		; Yes

		BTFSS	memflag, 0	; Mem access?
		GOTO	TXsigloop6	; Yes

		DECFSZ	count0, F
		GOTO	TXsigloop1	; Send next region code

		CALL	Loadregs	; bittime=bittime1 : bittime2
		DECFSZ	count1, F
		GOTO	TXsig		; Send all again

		GOTO	TXsigloop5
;
; Send (signum1=3) * 3 times the country code
;
TXsigloop6
		MOVF	signum1, W	; signum1=3
		MOVWF	count1
		BSF		memflag, 0	; Initialize flag
TXsigloop3
		CLRF	byteptr		; Start of string

		MOVLW	.3			; Send 3 region_code datagrams (MAX=3)
		MOVWF	count0
TXsigloop2
		CALL	TXregcode	; Send region_code datagram
		BTFSS	rstflag, 0	; Resetting?
		GOTO	Main		; Yes

		DECFSZ	count0, F
		GOTO	TXsigloop2

		CALL	Loadregs	; bittime=bittime1 : bittime2
		BTFSS	memflag, 0	; Mem access?
		GOTO	TXsigloop6	; Yes

		DECFSZ	count1, F
		GOTO	TXsigloop3
;
;Keep sending 3 times the country code unless thereis a memcard access
;
TXsigloop5
		CLRF	byteptr		; Start of string

		MOVLW	.3			; Send 3 region_code datagrams (MAX=3)
		MOVWF	count0
TXsigloop4
		CALL	TXregcode	; Send region_code datagram
		BTFSS	memflag, 0	; Mem access?
		GOTO	Stealth		; Yes

		BTFSS	rstflag, 0	; Resetting?
		GOTO	Main		; Yes

		DECFSZ	count0, F
		GOTO	TXsigloop4

		CALL	Loadregs	; bittime=bittime1 : bittime2
		GOTO	TXsigloop5	; Keep sending
;
;
; Enter stealth mode with GPIO tristate. Wait for reset or door open
;
Stealth	MOVLW	0xff		; All GPIO tristate
		TRIS	GPIO
Stwaitopen
		BTFSS	RESET		; Reset?
		GOTO	Main		; Yes. Start again

		BTFSS	DOOR_SW		; Door open?
		GOTO	Stwaitopen	; No. Keep waiting
							; Yes. Wait to let the door to be fully open
		MOVLW	.255		; delay 255 ms
		CALL	Delay_W                             
		MOVLW	.255		; delay 255 ms
		CALL	Delay_W                             

Stwaitclose
		BTFSS	RESET		; Reset?
		GOTO	Main		; Yes. Start again

		BTFSC	DOOR_SW		; Door open?
		GOTO	Stwaitclose	; Yes. Keep waiting

		BTFSS	RESET		; Reset?
		GOTO	Main		; Yes. Start again
;
; Try to boot the second CD and enter stealth mode again
; Send (signum3=40) * 3 times the country code
;
		MOVF	signum3, W	; signum3=40
		MOVWF	count1
		BSF		rstflag, 0	; Initialize flag
		CLRF	dummy
Stloop3
		CALL	Loadregs	; bittime=bittime1 : bittime2
		CLRF	byteptr		; Start of string
		MOVLW	.3			; Send 3 region_code datagrams (MAX=3)
		MOVWF	count0
Stloop4
		CALL	TXregcode	; Send region_code datagram
		BTFSS	rstflag, 0	; Resetting?
		GOTO	Main		; Yes

		BTFSC	DOOR_SW		; Door open?
		GOTO	Stealth		; Yes?. Try again

		DECFSZ	count0, F
		GOTO	Stloop4

		DECFSZ	count1, F
		GOTO	Stloop3

		GOTO	Stealth		; All sent. Loop stealth again
;
;
;
;**************************************************************************
Start	MOVLW	0xc2		; WakeUp,PullUp Disabled, T0CS=Fosc/4
		OPTION				; PSA Prescaler to Timer0, PS2:PS0=1:8

Main	MOVLW	0xff		; All GPIO tristate
		TRIS	GPIO

		MOVLW	.40			; Loop 40 times
		MOVWF	signum3		;
		MOVLW	.221		; 4ms @ 4MHz for 250bps
		MOVWF	bittime		; Bit time counter preload
		MOVWF	bittime1	; Bit time count 1
		MOVLW	.221		;
		MOVWF	bittime2	; Bit time count 2
		MOVLW	.18			; Loop 18 times
		MOVWF	signum2		;
		MOVLW	.3			; Loop 3 times
		MOVWF	signum1
		GOTO	Main_1		;
;
;
;
;**************************************************************************
; Dino mode. Press Reset 3 sec to enter
;
Dino1	CLRF	byteptr		; Start of string
		CALL	TXregcode                              
		BTFSS	RESET                        
		GOTO	Nextdino

		CALL	TXregcode                              
		BTFSS	RESET                        
		GOTO	Nextdino

		CALL	TXregcode                              

		MOVLW	.38 + 1
		MOVWF	dino_mode                             
Dino1loop
		CALL	Dly_100ms                              
		BTFSS	RESET                        
		GOTO	Nextdino

		DECFSZ	dino_mode, F                         
		GOTO	Dino1loop

		CALL	Loadregs	; bittime=bittime1 : bittime2
		GOTO	Dino1

Nextdino
		DINO_MODE	.2
		DINO_MODE	.3
		DINO_MODE	.4
		DINO_MODE	.5
		DINO_MODE	.6
		DINO_MODE	.7
		DINO_MODE	.8
		DINO_MODE	.9
		DINO_MODE	.10
		DINO_MODE	.11

Lock	GOTO	Lock		; Disabled. Power cycle to reset

;**************************************************************************
; Check that factory programmed OSCCAL is not overwritten
	if ($ > 0x1ff)
    	ifdef __12C508A
			error "Overwritting factory programmed OSCCAL at 0x1ff"
		endif
    	ifdef __12F508
			error "Overwritting factory programmed OSCCAL at 0x1ff"
		endif
	endif
;**************************************************************************
	end 
by

Assembly Online Compiler

Write, Run & Share Assembly code online using OneCompiler's Assembly online compiler for free. It's one of the robust, feature-rich online compilers for Assembly language. Getting started with the OneCompiler's Assembly compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as Assembly and start coding.

About Assembly

Assembly language(asm) is a low-level programming language, where the language instructions will be more similar to machine code instructions.

Every assembler may have it's own assembly language designed for a specific computers or an operating system.

Assembly language requires less execution time and memory. It is more helful for direct hardware manipulation, real-time critical applications. It is used in device drivers, low-level embedded systems etc.

Syntax help

Assembly language usually consists of three sections,

  1. Data section

    To initialize variables and constants, buffer size these values doesn't change at runtime.

  2. bss section

    To declare variables

  3. text section

    _start specifies the starting of this section where the actually code is written.

Variables

There are various define directives to allocate space for variables for both initialized and uninitialized data.

1. To allocate storage space to Initialized data

Syntax

variable-name    define-directive    initial-value 
Define DirectiveDescriptionAllocated Space
DBDefine Byte1 byte
DWDefine Word2 bytes
DDDefine Doubleword4 bytes
DQDefine Quadword8 bytes
DTDefine Ten Bytes10 bytes

2. To allocate storage space to un-initialized data

Define DirectiveDescription
RESBReserve a Byte
RESWReserve a Word
RESDReserve a Doubleword
RESQReserve a Quadword
RESTReserve a Ten Bytes

Constants

Constants can be defined using

1. equ

  • To define numeric constants
CONSTANT_NAME EQU regular-exp or value

2. %assign

  • To define numeric constants.
%assign constant_name value

3. %define

  • To define numeric or string constants.
%define constant_name value

Loops

Loops are used to iterate a set of statements for a specific number of times.

mov ECX,n
L1:
;<loop body>
loop L1

where n specifies the no of times loops should iterate.

Procedures

Procedure is a sub-routine which contains set of statements. Usually procedures are written when multiple calls are required to same set of statements which increases re-usuability and modularity.

procedure_name:
   ;procedure body
   ret