BOOT		= $09
POKMSK		= $10
BRKKEY		= $11

ICAX5Z		= $2E
ICAX6Z		= $2F
STATUS		= $30
CHKSUM		= $31
BUFRLO		= $32
BUFRHI		= $33
BFENLO		= $34
BFENHI		= $35
LTEMP		= $36

COLDST		= $0244
BASICF		= $03F8

COLBK		= $D01A
IRQST		= $D20E
SKSTAT		= $D20F
PORTB		= $D301
PACTL		= $D302
PBCTL		= $D303
DMACTL		= $D400
NMIEN		= $D40E

		*= $400
THEAD		=*

THEAD_TYPE	=*
		* = * + 1
THEAD_NAME_LEN = 10
THEAD_NAME	=*
		* = * + THEAD_NAME_LEN

THEAD_START	=*
THEAD_STLO	=*
		* = * + 1

THEAD_STHI	=*
		* = * + 1

THEAD_LENGTH	=*
THEAD_LENLO	=*
		* = * + 1

THEAD_LENHI	=*
		* = * + 1

THEAD_RUN	=*
THEAD_RUNLO	=*
		* = * + 1

THEAD_RUNHI	=*
		* = * + 1

THEAD_END	=*

		*= $5AC

BOOTST:	        .BYTE 0
		.BYTE (ENDBOOT-BOOTST+127)/128
		.WORD *-2
		.WORD BOOT_INIT

		LDA	#$3C
		STA	PACTL
		CLC
		RTS
		BRK

BOOT_INIT:
		;display the Turbo2000 message
		LDX	#<DISPMSG
		LDY	#>DISPMSG
		JSR	$C642

		LDA	#$01
		STA	BOOT
		STA	BASICF
		LDA	#$FF
		STA	PORTB
		LDA	#$00
		STA	COLDST

		;beeps
LOADNOW:	LDA	#$01
		JSR	$FDFC

		;set buffer to load 17 bytes of header
FINDHEAD:	LDA	#>THEAD
		STA	BUFRHI
		STA	BFENHI
		LDA	#<THEAD_END
		STA	BFENLO
		LDA	#<THEAD
		STA	BUFRLO
		JSR	LOADBLK
		BCC	FINDHEAD

		;set buffers for loaded program
		LDA	THEAD_STLO
		STA	BUFRLO
		CLC
		ADC	THEAD_LENLO
		STA	BFENLO
		LDA	THEAD_STHI
		STA	BUFRHI
		ADC	THEAD_LENHI
		STA	BFENHI

		;display program name
		LDA	#$7D
		STA	THEAD_NAME - 1
		LDA	#$9B
		STA	THEAD_NAME + THEAD_NAME_LEN
		LDX	#<(THEAD_NAME - 1)
		LDY	#>(THEAD_NAME - 1)
		JSR	$C642

		;cassette beep
		LDA	#$01
		JSR	$FDFC

		;load program's body
		LDA	#$FF
		JSR	LOADBLK
		BCS	RUNNOW

		;display boot error message
		JSR	$C63E
		JMP	LOADNOW

RUNNOW:		JMP	(THEAD_RUN)

DISPMSG:	.BYTE "TURBO  2000", $9B

LOADBLK:
		;store header type
		STA	LTEMP

		;TODO
		LDA	#$34
		STA	PACTL
		STA	PBCTL

		;disable all IRQs except for BREAK
		LDA	#$80
		STA	POKMSK
		STA	IRQST

		;reset values, disable NMI, Antic
		CLC
		LDY	#$00
		STY	STATUS
		STY	CHKSUM
		STY	NMIEN
		STY	DMACTL

		PHP
L0650:		BNE	L06C2
L0652:		JSR	L06DB
		BCC	L0650
		LDA	#$00
		STA	ICAX5Z
		STA	LTEMP+1
L065D:		LDY	#$B4
		JSR	L06D6
		BCC	L0650
		CPY	#$D8
		BCC	L0652
		INC	ICAX5Z
		BNE	L065D
		DEC	LTEMP+1
L066E:		LDY	#$D1
		JSR	L06DB
		BCC	L0650
		CPY	#$DE
		BCS	L066E
		JSR	L06DB
		BCC	L06C2
		LDY	#$C6
		JMP	L069D

L0683:		PLP
		BNE	L068E
		LDA	LTEMP
		EOR	ICAX6Z
		BNE	L06C3
		BEQ	L069A
L068E:		LDY	#$00
		LDA	ICAX6Z
		STA	(BUFRLO),Y
		INC	BUFRLO
		BNE	L069A
		INC	BUFRHI
L069A:		LDY	#$C8
		PHP
L069D:
		LDA	#$01
		STA	ICAX6Z
L06A1:		JSR	L06D6
		BCC	L06C2
		CPY	#$E3
		ROL	ICAX6Z
		LDY	#$C6
		BCC	L06A1
		LDA	CHKSUM
		EOR	ICAX6Z
		STA	CHKSUM
		LDA	BUFRLO
		CMP	BFENLO
		LDA	BUFRHI
		SBC	BFENHI
		BCC	L0683
		LDA	#$00
		CMP	CHKSUM

L06C2:		PLA

		;restore screen
L06C3:		LDA	#$C0
		STA	NMIEN
		STA	POKMSK
		STA	IRQST

		;TODO
		LDA	#$3C
		STA	PACTL
		STA	PBCTL
		RTS

L06D6:		JSR	L06DB
		BCC	L06FF
L06DB:		LDX	#$04

SLOWLOOP:	DEX
		BNE	SLOWLOOP

		LDA	STATUS
		LSR
		AND	LTEMP+1
		STA	COLBK
L06E8:		INY
		BEQ	L06FE
		LDA	BRKKEY
		BEQ	L06FC
		LDA	SKSTAT
		AND	#$10
		CMP	STATUS
		BEQ	L06E8
		STA	STATUS
		SEC
		RTS

L06FC:		DEC	BRKKEY
L06FE:		CLC

L06FF:		RTS

ENDBOOT:
		.END
