/***************************************/
/*  Use MADS http://mads.atari8.info/  */
/*  Mode: DLI (char mode)              */
/***************************************/

	icl "atari.h"

	org $f0

fcnt	.ds 2
fadr	.ds 2
fhlp	.ds 2
cloc	.ds 1
regA	.ds 1
regX	.ds 1
regY	.ds 1

WIDTH	= 40
HEIGHT	= 30

; ---	BASIC switch OFF
	org $c00\ mva #$ff portb\ rts\ ini $c00

; ---	MAIN PROGRAM
	org $c00
ant	dta $70
	dta $70,$70,$70,$44,a(scr),$04,$04,$04,$04,$04,$04,$84,$04,$04,$04,$84,$04
	dta $84,$84,$04,$84,$84,$84,$82,$82,$02,$82,$70,$70,$70
	dta $41,a(ant)

fname .byte c'CPEDE   XEX' ; 11 znakow ATASCII
fname1 .byte c'GALAXIANXEX' ; 11 znakow ATASCII
fname2 .byte c'MMAGIC  XEX' ; 11 znakow ATASCII

scr	ins "atari.scr"

	.ALIGN $0400
fnt	ins "atari.fnt"

	ift USESPRITES
	.ALIGN $0800
pmg	.ds $0300
	ift FADECHR = 0
	SPRITES
	els
	.ds $500
	eif
	eif

main
; ---	init PMG

	ift USESPRITES
	mva >pmg pmbase		;missiles and players data address
	mva #$03 pmcntl		;enable players and missiles
	eif

	lda:cmp:req $14		;wait 1 frame

	sei			;stop IRQ interrupts
	mva #$00 nmien		;stop NMI interrupts
	sta dmactl
	mva #$fe portb		;switch off ROM to get 16k more ram

	mwa #NMI $fffa		;new NMI handler

	mva #$c0 nmien		;switch on NMI+DLI again

	ift CHANGES		;if label CHANGES defined

_lp
	lda skctl
	and #$04
	bne _lp			;wait to press any key; here you can put any own routine


	lda $d209	; odczytyaj kod klawisza bezpośrednio z POKEY'a


	cmp #31		; "1"
	beq g1
	cmp #30		; "2"
	beq g2
	cmp #26		; "3"
	beq g3
	jmp _lp

	els

null	jmp DLI.dli1		;CPU is busy here, so no more routines allowed

	eif


g1
;	.ifdef FADE_CHARS\ lda #0\ jsr fade_chars\ eif

;	mva #$00 pmcntl		;PMG disabled
;	tax
;	sta:rne hposp0,x+

;	mva #0 dmactl	;set new screen width

;	mva #$ff portb		;ROM switch on
;	mva #$40 nmien		;only NMI interrupts, DLI disabled
;	cli			;IRQ enabled

    ldy     < fname
    ldx     > fname

    jsr     $806
;	rts			;return to ... DOS


g2

    ldy     < fname1
    ldx     > fname1

    jsr     $806

g3

    ldy     < fname2
    ldx     > fname2

    jsr     $806

; ---	DLI PROGRAM

.local	DLI

	?old_dli = *

	ift !CHANGES

dli1

	lda vcount
	cmp #$02
	bne dli1

	:3 sta wsync

	DLINEW DLI.dli2
	eif


dli_start

dli2
	sta regA
	lda >fnt+$400*$01
	sta wsync		;line=96
	sta chbase
	DLINEW dli3 1 0 0

dli3
	sta regA
	lda >fnt+$400*$02
	sta wsync		;line=128
	sta chbase
	DLINEW dli4 1 0 0

dli4
	sta regA
	lda >fnt+$400*$00
	sta wsync		;line=144
	sta chbase
	DLINEW dli5 1 0 0

dli5
	sta regA
	lda >fnt+$400*$01
	sta wsync		;line=152
	sta chbase
	DLINEW dli6 1 0 0

dli6
	sta regA
	lda >fnt+$400*$00
	sta wsync		;line=168
	sta chbase
	DLINEW dli12 1 0 0

dli12
	sta regA

c5	lda #$0E
	sta wsync		;line=176
	sta color1
	DLINEW dli13 1 0 0

dli13
	sta regA

c6	lda #$00
	sta wsync		;line=184
	sta color2
	DLINEW dli7 1 0 0

dli7
	sta regA
	lda >fnt+$400*$01
	sta wsync		;line=192
	sta chbase
	DLINEW dli8 1 0 0

dli8
	sta regA
	lda >fnt+$400*$02
	sta wsync		;line=200
	sta chbase
	DLINEW dli9 1 0 0

dli9
	sta regA
	lda >fnt+$400*$00
	sta wsync		;line=216
	sta chbase

	lda regA
	rti

.endl

; ---

CHANGES = 1
FADECHR	= 0

; ---

.proc	NMI

	bit nmist
	bpl VBL

	jmp DLI.dli_start
dliv	equ *-2

VBL
	sta regA
;	stx regX
;	sty regY

	sta nmist		;reset NMI flag

	mwa #ant dlptr		;ANTIC address program

	mva #scr40 dmactl	;set new screen width

	inc cloc		;little timer

; Initial values

	lda >fnt+$400*$00
	sta chbase
c0	lda #$00
	sta colbak
	sta chrctl
	lda #$04
	sta gtictl
c1	lda #$48
	sta color0
c2	lda #$7C
	sta color1
c3	lda #$0E
	sta color2
c4	lda #$46
	sta color3
x0	lda #$00
	sta hposp0
	sta hposp1
	sta hposp2
	sta hposp3
	sta hposm0
	sta hposm1
	sta hposm2
	sta hposm3
	sta sizep0
	sta sizep1
	sta sizep2
	sta sizep3
	sta sizem
	sta colpm0
	sta colpm1
	sta colpm2
	sta colpm3

	mwa #DLI.dli_start dliv	;set the first address of DLI interrupt

;this area is for yours routines

quit
	lda regA
;	ldx regX
;	ldy regY
	rti

.endp

; ---
	ini main
; ---

	opt l-

.MACRO	SPRITES
missiles
	.ds $100
player0
	.ds $100
player1
	.ds $100
player2
	.ds $100
player3
	.ds $100
.ENDM

USESPRITES = 0

.MACRO	DLINEW
	mva <:1 NMI.dliv
	ift [>?old_dli]<>[>:1]
	mva >:1 NMI.dliv+1
	eif

	ift :2
	lda regA
	eif

	ift :3
	ldx regX
	eif

	ift :4
	ldy regY
	eif

	rti

	.def ?old_dli = *
.ENDM

