;************************************************************************
;* MICROMIX compilation disc containing MICROMIX 1 & 2                  *
;*                                                                      *
;* Written entirely by Mark Sherdley-Davies                             *
;* Written using K_SEKA V1.6 AND DEVPAC                                 *
;*                                                                      *
;* Started 3/3/89   Finished 7/3/89                                     *
;* Include files;-                                                      *
;*                RAM_MASK.IMG into SET                                 *
;*                TUNE_1.WAS into TUNE                                  *
;* Other files needed;-                                                 *
;*                TITLE_PIC.MSD on root directory                       *
;*                                                                      *
;* P.O.V is the group name for M.S.D and DR.SYNE                        *
;************************************************************************

GO:
;Size the job and free back to GEM unused memory.
	move.l	A7,A5
	move.l	4(A5),A5	;get basepage
	move.l	$C(A5),D0	;text segment
	add.l	$14(A5),D0	;data segment
	add.l	$1C(A5),D0	;unitialized
	add.l	#$100,D0	;basepage size
M_SHRINK:
	move.l	D0,-(sp)
	move.l	A5,-(sp)
	move.w	D0,-(sp)
	move.w	#$4A,-(sp)
	trap	#1
	add.l	#12,sp		;okay that's it memory free & allocated

init:	equ	$A000		;A-LINE variables
hide_m:	equ	init+10
show_m:	equ	init+9

	dc.w	init	;INITIALISE A_LINE ROUTINES
	dc.w	hide_m	;hide mouse

;test for supervisor
	move.l	#1,-(sp)
	move.w	#32,-(sp)
	trap	#1
	addq.l	#6,sp
	tst.l	D0
	bne.s	IN_SUPER

;set 68000 to supervisor mode
	clr.l	-(sp)		;Set super stack equal
	move.w	#32,-(sp)	; to user stack before call
	trap	#1
	addq.l	#6,sp		;correct stack
	move.l	d0,stksv	;save old supervisor stack value
	bra.s	JUMP
IN_SUPER:
	move.l	A7,stksv
JUMP:
	bsr	GET_BASE
	BSR	GET_REZ
	lea	B_PAL,A0
	BSR	SET_PALETTE
	move.w	#0,D0
	bsr	SET_REZ

	clr.b 	$484	;no keyclick

; START THE MUSIC
	move.l	#vbl,$4d2
	move.w	#$1,D0
	JSR	TUNE+$4D2

	lea	pic+2,A0
	BSR	SET_PALETTE
	lea	pic+34,a0
	move.l	screen_base,a1
	move.w	#32000/4-1,d0
.loop:	move.l	(a0)+,(a1)+
	dbf	d0,.loop

;set up pixel scroll
	lea	SENTENCE,A0
	move.l	A0,POSITION
	move.w	#3,COUNT	;COUNT is a count down timer for PAUSING
				;the higher COUNT, the faster the scroll

;	Now wait for a sign from the user.
WAIT:	bsr	TST_KBD
	tst.w	D0
	bne.s	KYBD_ACTIVE

	move.l	POSITION,A0
	clr.w	D0
	move.b	(A0)+,D0	;get character
	cmp.b	#$FF,D0		;is it end of SENTENCE?
	beq.s	SWAIT		;YES!
	move.l	A0,POSITION	;no so poke new position back
	bsr	LETTER_PRINTER
;OKAY NOW SCROLL IT
	move.w	#16-1,D0	;characters are 16 bits wide
GG:	move.l	D0,-(sp)
	bsr	SCROLL_MESS
	move.l	(sp)+,D0
	dbra	D0,GG
	bra.s	WAIT

SWAIT:	lea	SENTENCE,A0	;end of SENTENCE so restart message
	move.l	A0,POSITION
	bra.s	WAIT

KYBD_ACTIVE:	;something has pressed the keyboard!
	cmp.b	#'1',D0		;key 1
	beq.s	MICRO_1

	cmp.b	#'2',D0		;key 2
	beq.s	MICRO_2
	bra.s	WAIT
MICRO_1:
	lea	F_MICRO_1,A6
	bra.s	JOINT
MICRO_2:
	lea	F_MICRO_2,A6

JOINT:
;   TURN MUSIC OFF THEN LOAD
endmus:
	CLR.L	$4d2
	MOVE.L	#$FF8800,A0
	MOVE.L	#$8080000,(A0)
	MOVE.L	#$9090000,(A0)
	MOVE.L	#$A0A0000,(A0)

;set 68000 to user mode from supervisor
	move.l	stksv,-(sp)	;recover old supervisor stack
	move.w	#32,-(sp)
	trap	#1		;back to user
	addq.l	#6,sp		;correct stack

	pea	CLS
	move.w	#9,-(sp)
	trap	#1
	addq.l	#6,sp

	lea	SHIFT,A0
	move.l	#$30000,A1
	move.l	#PAUSE-SHIFT,D0
UPMEM:	move.l	(A0)+,(A1)+
	sub.l	#1,D0
	bne.s	UPMEM
	jmp	$30000

SHIFT:	move.l	#$80000,A7
	move.l	#GO,-(sp)
	move.l	#GO,-(sp)
	move.l	A6,-(sp)	;filename
	move.w	#0,-(sp)
	move.w	#75,-(sp)
	trap	#1
	add.l	#16,sp
	clr.w	-(sp)
	trap	#1
	addq.l	#4,sp
HERE:	bra.s	HERE

TST_KBD:	;C_RAWIO
	MOVE.W	#255,-(SP)
	MOVE.W	#6,-(SP)
	TRAP	#1
	ADDQ.W	#4,SP
	RTS
PAUSE:	MOVE.L	D0,-(sp)
	MOVE.W	#8,D0
PAU:	NOP
	DBRA	D0,PAU
	MOVE.L	(sp)+,D0
	RTS
SET_PALETTE:	;palette address in A0 on entry
	move.W	#15,d0
	move.l	#$FF8240,A1
set_col:
	MOVE.W	(A0)+,D2
	MOVE.W	D2,(A1)+
	dbra	D0,set_col
	RTS
GET_BASE:
;	Get screen base address
	MOVE.W	#3,-(SP)
	TRAP	#14
	ADDQ.W	#2,SP
	MOVE.L	D0,screen_base
	rts
GET_REZ:
;	Get rez.	_GETREZ
	MOVE.W	#4,-(SP)
	TRAP	#14
	ADDQ.L	#2,SP
	MOVE.W	D0,ORG_REZ	
	rts
SET_REZ:
;	Set screen address to logical base.
	MOVE.W	D0,-(SP)	; Set Res.
	move.l	screen_base,D0
	MOVE.L	D0,-(SP)	; PHYSBASE
	MOVE.L	D0,-(SP)	; LOGBASE
	MOVE.W	#5,-(SP)
	TRAP	#14
	ADD.l	#12,SP
	rts
	even
stksv:		dc.l	1	;old stack value
screen_base:	dc.L	1	;Screen base address
ORG_REZ:	dc.W	1	;Origional rez. store.


B_PAL:		dc.l	0,0,0,0,0,0,0,0	;blank palette

;************************************************************************
;* Main routines for pixel scroll routine follow                        *
;************************************************************************
LETTER_PRINTER:
;  *** Character number is in D0.W on entry ***
; print characters in one plane of display via buffer.
	move.l	A0,-(sp)
	sub.b	#32,D0	;correct for ASCII offset of 32 bytes
	lea	CHAR,A0
	mulu	#16,D0	;get char position in memory
	add.w	D0,A0	;A0=char position

	lea	BUFFER,A1	;print char into buffer
	add.w	#2,A1
	move.w	#8-1,D0		;chars are 8 bytes down
PRT_SET:
	move.w	(A0)+,(A1)+
	add.w	#2,A1
	and.w	#$FFEE,SR
	dbra	D0,PRT_SET
	move.l	(sp)+,A0
	and.w	#$FFEE,SR	;clear X and C flags to stop wrap
	rts
SCROLL_MESS:
	lea	BUFFER,A0	;scroll buffer first
	addq.w	#2,A0
	move.w	#8-1,D0
B_DOWN:	roxl	(A0)
	subq.w	#2,A0
	roxl	(A0)
	addq.w	#6,A0
	and.w	#$FFEE,SR
	dbra	D0,B_DOWN

	lea	BUFFER,A0		;now move buffer to screen
	move.l	screen_base,A1
	add.w	#32000-1280-8,A1
	move.w	#8-1,D0
B_TRANS:
	move.w	(A0),(A1)
	add.w	#4,A0
	add.w	#160,A1
	dbra	D0,B_TRANS

	move.l	screen_base,A0
	add.w	#32000-1280-8,A0
	move.w	#8-1,D0		;characters are 8 bits down
S_DOWN:	move.w	#20-1,D1	;screen is 20 * 8 bytes (1 plane)=160
S_ACROSS:
	roxl	(A0)
	sub.w	#8,A0
	dbra	D1,S_ACROSS
	and.w	#$FFEE,SR
	add.w	#160+160,A0
	dbra	D0,S_DOWN
	bsr.s	S_PAUSE
	rts
EXITALL:	rts
S_PAUSE:
	movem.l	D0-D3/A0-A4,-(sp)
VSYNC:	move.w	COUNT,D0	;COUNT is a count down for the pause
	sub.w	#1,D0		;the higher COUNT, the more the PAUSE
	beq.s	RST_COUNT	;routine is done.
	sub.w	#1,COUNT
	bra.s	EXIT_PAUSE
RST_COUNT:
	move.w	#3,COUNT
	move.w	#37,-(sp)
	trap	#14
	addq.l	#2,sp
EXIT_PAUSE:
	movem.l	(sp)+,D0-D3/A0-A4
	rts
POSITION:	dc.l	0	;position in SENTENCE
COUNT:		dc.w	0	;pause counter for V_SYNC

SENTENCE:
	dc.b	"           I'M BACK!!!           MSD HAS RETURNED WITH "
	DC.B	"THE FIRST EVER DEMO COMPILATION DISC.              I'VE "
	DC.B	"TEAMED UP WITH A "
	DC.B	"LOCAL LAD (DR.SYNE) AND NOW COME UNDER THE JOINT "
	DC.B	"NAME OF P.O.V.                 RIGHT, I'LL GIVE "
	dc.b	"50 QUID TO THE FIRST PERSON TO GUESS CORRECTLY WHAT "
	DC.B	"P.O.V. STANDS FOR!!         GIVE UP?     "
	DC.B	"        THE ANSWER IS               "
	DC.B	"          YOU'LL HAVE TO SEE SOME "
	DC.B	"FUTURE DEMOS TO FIND OUT."
	DC.B	"                    HAVE YOU SEEN THE "
	DC.B	"NEW VERSION OF THE GHOSTBUSTERS DEMO YET?       "
	DC.B	"  WHAT DO YOU MEAN NO?        GET A COPY "
	DC.B	"AND SEE WHAT IMPROVEMENTS I'VE MADE.        "
	DC.B	"            OKAY, NOW FOR THE MENTIONS,   "
	dc.b	"A BIG HELLO GOES TO;  -  WAS (NOT WAS),  L.S.D.,   TEX,"
	dc.b	"   A-HA,   THE UNION,   BASHER,   ALY,   STEVE C,   "
	dc.b	"AND   WOLIN KILSON (RIM, RAM, ROM, ST, ST, ST)!!!    "
	DC.B	"                     FOLLOWING IN THE "
	dc.b	"STYLE SET BY MARL FROM L.S.D., HERE IS A MESSAGE FOR "
	dc.b	"ALL YOU WHIZZ KIDS . . . . . . . "
	DC.B	"$41   $52   $45   $20   $59   $4F   $55   $20   $53   "
	DC.B	"$54   $49   $4C   $4C   $20   $44   $45   $43   $4F   "
	DC.B	"$44   $49   $4E   $47   $20   $54   $48   $45   $53   "
	DC.B	"$45   $20   $48   $45   $58   $20   $4D   $45   $53   "
	DC.B	"$53   $41   $47   $45   $53   $3F   $20   $53   $54   "
	DC.B	"$4F   $50   $20   $44   $45   $43   $4F   $44   $49   "
	DC.B	"$4E   $47   $20   $41   $4E   $44   $20   $53   $54   "
	DC.B	"$41   $52   $54   $20   $57   $52   $49   $54   $49   "
	DC.B	"$4E   $47   $20   $28   $4F   $52   $20   $43   $52   "
	DC.B	"$41   $43   $4B   $49   $4E   $47   $29   $2C   $20   "
	DC.B	"$42   $59   $45   $2E   $2E                           "
	DC.B	"           PLEASE NOTE:  THIS DISC IS 80 TRACK, 10 SECT"
	DC.B	"ORS AND DOUBLE SIDED, SORRY ABOUT THE FORMAT BUT I "
	DC.B	"DIDN'T HAVE TIME TO PACK THE ORIGINALS,"
	DC.B	" I'LL LEAVE THAT "
	DC.B	"TO AUTOMATION UNTIL I'VE WRITTEN A DECENT "
	DC.B	"PACKER.                                "
	DC.B	"PRESS 1 OR 2 FOR THE MICRO MIX DEMOS.          "
	DC.B	"                                            "
	DC.B	"YOU STILL THERE?                          "
	DC.B	"BAAL:   IN 'CONAN THE CONQUEROR', A MINION "
	DC.B	"OF XALTOTUN;  FROM BA'AL, HEBREW-PHOENICIAN FOR "
	DC.B	"'LORD'."
	DC.B	"                    THE FOLLOWING SPACE WAS LEFT FOR "
	DC.B	"DR.SYNE TO ADD HIS MESSAGE, BUT HE'S AT WORK "
	DC.B	"AT THE MOMENT, SO HE CAN'T!!             OH WELL,"
	DC.B	"  HE CAN HAVE A GO AT THE NEXT DEMO.            "
	DC.B	"       IF YOU LIKE THIS INTRO AND WOULD LIKE TO ADD "
	DC.B	"SOMETHING TO THE NEXT ONE THEN GET YOURSELF TO THE "
	DC.B	"BLACKPOOL CLUB.     WE ARE ESPECIALLY "
	DC.B	"LOOKING FOR MUSIC WIZARDS TO STEAL MORE TUNES FOR "
	DC.B	"OUR INTROS, BUT PLEASE NOTE - MACHINE CODERS ONLY, "
	DC.B	"NONE OF THIS GFA BASIC PAP.            "
	DC.B	"               RIGHT THAT'S IT,  NO MORE.       "
	DC.B	"      BYE.......                                "
	DC.B	"                   "
	DC.B	$FF,$FF
	even
CHAR:	dc.b	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	even
SET:	INCBIN	'RAM_MASK.IMG'	;RAM_MASK.IMG to be loaded here
	even
BUFFER:	ds.b	32

CLS:		dc.b	27,'E',0,0
F_MICRO_1:	dc.b	'\1.POV\MIX1.PRG',0
	even
F_MICRO_2:	dc.b	'\2.POV\MIX2.PRG',0
	even
F_TUNE:		dc.b	'\MONTY.PRG',0
	even
vbl:		jsr	TUNE+$28	;jsr	$2c028
		move.w	#$ffff,$4ee
		rts
pic:	incbin	"micro.pi1"
TUNE:		INCBIN	'TUNE_1.WAS'
END:
	even

