;**************************************************************************
;*
;* read keyboard (something is wrong here, press/release seems not to work)
;*
;**************************************************************************
	
	org $2000			   ;prg start
	
	icl "custom.i"

START:

	
	;

	sei				  ;disable irqs
	lda	#$00
	sta	NMIEN			  ;NMIEN all off 
	sta	DMACTL			  ;DMACTL all off

	;set display list (use shadow regs)
	
	lda	#<displayList
	sta	DLISTL	
	lda	#>displayList
	sta	DLISTH
	
	;set display list interrupt
	  
	lda	#<dli_irq
        sta	VDSLSTL           
        lda	#>dli_irq
        sta	VDSLSTH    
	
	;vertical blank interrupt 
	
	lda 	#>vbi_irq
	sta	VVBLKIH	
	lda 	#<vbi_irq
	sta	VVBLKIL	
	
	;os key remove
	
	lda	#<noKeyRead
        sta	VSERINL        
        lda	#>noKeyRead
        sta	VSERINH        
	
	;chbase
	
	lda	#$e0	
	sta	CHBASE
	
	;color setup
	
	lda	#$0	;black
	sta	COLBK
	lda	#$34	;red		
	sta	COLPF0
	lda	#$b6	;green	
	sta	COLPF1
	lda	#$1a	;yellow		
	sta	COLPF2
	lda	#$70	;blue (usable width GTIA mode 2)			
	sta	COLPF3
		
		
	;disable player/missile dma
	
	lda	#$00
	sta	GRACTL
	
	;setup displays
	   
	lda	#DMACTL_DL|DMACTL_PF_NORMAL		
		
		
		;enable display list dma 			
		;playfield normal display (40)
			
	sta	DMACTL	;DMACTL
	
	lda	#0
	sta	HSCROL
	
	;enable dli
	
	lda	#NMIEN_VBI|NMIEN_DLI
	sta	NMIEN	;VBI + DLI enbable
	
	;
	
	cli		;irq enable

loop
	
	;Wait VBlank

?WaitVC0
        lda	VCOUNT		
        beq	?WaitVC0   	
?WaitVCnot0
        lda	VCOUNT		
        bne	?WaitVCnot0   
	
	;joystick 0
	
	ldx	#" "
	lda	PORTA
	and	#$1
	bne	@+
	ldx	#"U"
@	stx	charData+20*3+11

	ldx	#" "
	lda	PORTA
	and	#$2
	bne	@+
	ldx	#"D"
@	stx	charData+20*3+12

	ldx	#" "
	lda	PORTA
	and	#$4
	bne	@+
	ldx	#"L"
@	stx	charData+20*3+13

	ldx	#" "
	lda	PORTA
	and	#$8
	bne	@+
	ldx	#"R"
@	stx	charData+20*3+14

	ldx	#" "
	lda	TRIG0
	cmp	#0
	bne	@+
	ldx	#"F"
@	stx	charData+20*3+15

	;joystick 1
	
	ldx	#" "
	lda	PORTA
	and	#$10
	bne	@+
	ldx	#"U"
@	stx	charData+20*4+11

	ldx	#" "
	lda	PORTA
	and	#$20
	bne	@+
	ldx	#"D"
@	stx	charData+20*4+12

	ldx	#" "
	lda	PORTA
	and	#$40
	bne	@+
	ldx	#"L"
@	stx	charData+20*4+13

	ldx	#" "
	lda	PORTA
	and	#$80
	bne	@+
	ldx	#"R"
@	stx	charData+20*4+14

	ldx	#" "
	lda	TRIG1
	cmp	#0
	bne	@+
	ldx	#"F"
@	stx	charData+20*4+15
	
	;special keys (SELECT/START/OPTION)
	
	ldx	#" "
	lda	CONSOL
	and	#1
	bne	@+
	ldx	#"L"
@	stx	charData+20*5+11

	ldx	#" "
	lda	CONSOL
	and	#2
	bne	@+
	ldx	#"S"
@	stx	charData+20*5+12

	ldx	#" "
	lda	CONSOL
	and	#4
	bne	@+
	ldx	#"O"
@	stx	charData+20*5+13
	
	jmp loop			;end
	
	
	
	
;************************************************
;*
;* dummy
;*
;************************************************
	
noKeyRead	
	rts
	
;************************************************
;*
;* vertical blank interrupt (immidiate, x,y regs save bei os rom)
;*
;************************************************

vbi_irq
		
	;prolog (like XITVBL)
	
	pla					  
	tay
	pla					  
	tax
	pla					  
	rti
			
;************************************************
;*
;* display list interrupt
;*
;************************************************

dli_irq

	;prolog

        pha 
	txa	
	pha
	tya	
	pha
	
	
	;epilog
	
        pla					  
	tay
	pla					  
	tax
	pla
        rti   	;direct (no stack used)

		
; display list

	;7	6	5	4	3	2	1	0
	;DLI	LMS	VSCROLL	HSCOLL	Mode
	;
	;Mode 0 Blank lines 7..4 is count+1 of blank lines
	;Mode 1 JMP (use with LMS to set destination)
	;Mode $2-$f is ANTIC mode

	.align $400
	
displayList	 
	.byte 0			   ; Mode 0
	.byte $70,$70,$70  ; 8 blank lines (mode 0) * 3
	.byte $47,<charData,>charData  ; Mode 7 + LMS, setting screen memory to $4000
	.byte $7  ;1
	.byte $7  ;2
	.byte $7  ;3 
	.byte $7  ;4
	.byte $7  ;5 
	.byte $7  ;6 
	.byte $7  ;7 
	.byte $7  ;8 
	.byte $7  ;9 
	.byte $7  ;10
	.byte $7  ;11
	.byte $41,<displayList,>displayList ; wait vblank, restart same display list on next frame	
	
	org	$4000
	 
	;note here its a 8x16 pixel mode
	
charData

	;20 chars per screen width (20*8 = 160Pixel)
	;12 char height (12*16 = 192 (/2))

	;        --------------------
	.byte	"--------------------" ;0
	.byte	"I use you joystick I" ;1
	.byte	"I                  I" ;2
	.byte	"I stick 0:         I" ;3
	.byte	"I stick 1:         I" ;4
	.byte	"I console:         I" ;5
	.byte	"I                  I" ;6
	.byte	"I                  I" ;7
	.byte	"I                  I" ;8
	.byte	"I                  I" ;9
	.byte	"I                  I" ;10
	.byte	"--------------------" ;12
	
	
	org	$8000
	
	
	
