Jump to content
Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

256 byte Overscan MEGATEXT Intro - (features 50Hz fullscreen scroll)

From CPCWiki - THE Amstrad CPC encyclopedia!
	;---------------------------------------------------------------------
	;	256 byte Overscan MegaText Intro v1.1b
	;	(7DX Demo Party 2011 Release)
	;
	;	for Amstrad 464/664/6128 computers
	;
	;	by matahari - (Dec 24, 2011)
	;
	;	Featuring;
	;	 - Greetings message via 50Hz hardware scroll
	;	 - 100% overscan (full) screen size
	;	 - Complete Amstrad palette (27 colours) on screen at once
	;	 - And, all in 256 bytes!
	;---------------------------------------------------------------------

		LET ADDR_Start 		= &400
		LET ADDR_TextMap		= ADDR_Start + 256

		LET CONST_TotalRasterLines	= 269

		LET VAR_BgrndColour		= ADDR_Start - 1
		LET VAR_FlipFlop		= VAR_BgrndColour - 1
		LET VAR_LineSkipMinus		= CONST_TotalRasterLines * -9
		LET VAR_LineSkipPlus		= CONST_TotalRasterLines * 9

		VAR_XOR			equ 1 xor 0

		run start
		org ADDR_Start

start:	;---------	Generate a dummy interrupt handler ---------------------------

		ld	hl,&c9fb
		ld	(&0038),hl

	;---------	Set CRTC Registers -------------------------------------------

		ld	hl,CRTC_Data
loopCRTC:		ld	a,(hl)
		ld	b,&bc + 1
		outi
		ld	b,&bd + 1
		outi
		inc	a
		jr	nz,loopCRTC

	;---------	Display text message -----------------------------------------

		ld	hl,ADDR_TextMap 
		ld	de,Message

loopText:		push	de
		push	hl
		ld	a,2
		call	&bc0e
		pop	hl
		pop	de

		ld	a,(de)
		cp	255
		jr	z,loopExec

		call	&bb5a

		inc	de
		push	de

	;---------	Grab pixels of displayed char --------------------------------

		ld	de,&c000
		ld	a,8
		ld	c,&40
outer:		ex	af,af'
		ld	iy,vangelis + 1
		ld	(iy),%10000000
		call	Proc_FlipFlop
inner:		call	Proc_FlipFlop
		or	a
		jr	z,bitBckgrndA
		ld	a,&55
		jr	bitBckgrndB
bitBckgrndA:	ld	a,&57
bitBckgrndB:	ld	(VAR_BgrndColour),a
		ld	a,(de)
vangelis:		and	0
		jr	z,blit
		ld	a,c

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

blit:		push	hl
		push	de
		push	bc
		ld	de,9
		ld	b,26
blitText:		add	hl,de
		or	a
		jr	z,blitBckgrnd
		ld	(hl),c
		inc	c
		jr	blitSkip

blitBckgrnd:	push	af
		ld	a,(VAR_BgrndColour)
		ld	(hl),a
		pop	af

blitSkip:		djnz	blitText
		pop	bc
		pop	de
		pop	hl

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

		inc	hl
		rr	(iy)
		jr	nc,inner

		inc	hl
		
		ld	a,8
		add	a,d
		ld	d,a

		push	bc
		ld	bc,25*9
		add	hl,bc
		pop	bc

		ex	af,af'
		dec	a
		jr	nz,outer

		pop	de
		jr	loopText

	;*********************************************************************
	;	MAIN LOOP - INITIALIZE!
	;*********************************************************************

loopExec:		ld	hl,ADDR_TextMap + VAR_LineSkipPlus

					; Checking VBlanking only for once!
					; Rest of the code will be manually synced
					; via precise t-state calculations.
		ld	b,&f5
waitVBlanking:	in	a,(c)
		rra
		jr	nc,waitVBlanking

		halt
		di

	;---------	X-Pos Alignment ----------------------------------------------

		ld	a,(hl)		; waste time! => 7 cycles
					; Aligns perfect on WinApe.

					; If you need precise
					; alignment on an original Amstrad,
					; you need to comment out this line
					; OR replace it with a NOP!

					; No worries, intro size will not
					; exceed 256 bytes either way ;-)

	;*********************************************************************
	;	MAIN LOOP - BEGIN
	;*********************************************************************

loopBegin:		ld	de,VAR_LineSkipMinus + 9
		add	hl,de

	;---------	Wait for perfect sync! ---------------------------------------

		ld	b,203		; waste time!
waste1:		nop			; waste time!
		add	ix,ix		; waste time!
		djnz	waste1		; waste time!

	;---------	Start Gate Array code ----------------------------------------

		ld	de,CONST_TotalRasterLines
		ld	bc,&7f00
		out	(c),c

crash:		outi
		inc	b
		outi
		inc	b
		outi
		inc	b
		outi
		inc	b
		outi
		inc	b
		outi
		inc	b
		outi
		inc	b
		outi
		inc	b
		outi
		inc	b

		ld	a,(hl)		; waste time!
		nop			; waste time!

		dec	de
		ld	a,d
		or	e
		jr	nz,crash

	;---------	Raster colour = Black ----------------------------------------

		ld	a,&54
		out	(c),a

		nop			; waste time!
		ld	b,(hl)		; waste time!
		ld	b,224		; waste time!
waste2:		djnz	waste2		; waste time!

loopEnd:		jr	loopBegin

	;*********************************************************************
	;	MAIN LOOP - END
	;*********************************************************************


	;---------	Procedure for Flip/Flop --------------------------------------

Proc_FlipFlop:	ld	a,(VAR_FlipFlop)
		xor	VAR_XOR
		ld	(VAR_FlipFlop),a
		ret

	;---------	CRTC Data ----------------------------------------------------

CRTC_Data:		db	1,54		; set display width
		db	2,50		; set horizontal sync
		db	6,34		; set display height
		db	7,35		; set vertical sync
		db	255		; => EXIT LOOP

Message:		db	'  WELCOME TO 7DX2011 ',255