

TAPE_ENTRY:
		mvi	a, 8
		sta	RAM_TAPE_E
		rrc	
		sta	BitLatchA
		xra	a
		sta	RAM_TAPE_DSPLAY	; Seems	to be used to determine	the tape display message

TAPE_CANCEL:
		lxi	d, MSG_TAPE	; Load DE with 0x1FDA

TAPE_GOOD_ENTRY:
		xra	a		; The jump in point when the tape
					; result is good
		sta	RAM_TAPE_A	; Somehow related to Tape operations.
					; Might	be a status byte.
		sta	RAM_TAPE_B

TAPE_USER_LOOP:
		lxi	sp, 2800h
		mvi	a, 4Fh	; 4=Stop the timer when it reaches TC
					; F=Set all ports to output
		out	40h
		in	40h		; Read the status register
		stc			; Set carry flag=1
		cmc			; Complement carry flag
					; So carry flag	is now zero
		call	TAPE_B
		lda	Keypad		; Read the keypad
		mov	b, a		; Copy keypad into B for temp storage
		ani	20h		; Test for Load	or Keypad "3"
		jnz	TAPE_LOAD_MAIN	; Goto Set Load	handler
		mov	a, b		; Copy Swiches into Acc
		ani	10h		; Test for Save	or Keypad "4"
		jnz	TAPE_SAVE_MAIN	; Goto Save handler
		mov	a, b		; Copy Switches	to Acc
		ani	2		; Test for Keypad "7"
		jz	TAPE_USER_LOOP	; No Tape Control Switches Active so loop
		mvi	a, 1		; Fall into the	Verify (Keypad 7) handler
					; and set tape mode to verify

SET_TAPE_MODE:				; CODE XREF: HighROM:1DA2j
		sta	RAM_TAPE_MODE	; 0=Load, 1=Verify
		jmp	TAPE_VERIFY
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TAPE_LOAD_MAIN:				; CODE XREF: HighROM:1D8Aj
		xra	a		; Set Tape Mode	to LOAD
		jmp	SET_TAPE_MODE
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TAPE_VERIFY:				; CODE XREF: HighROM:1D9Ej
		xra	a
		sta	RAM_TAPE_D
		sta	RAM_TAPE_C	; ??? Seems to be related to tape commands or switches
		lxi	d, MSG_LOAD	; Load DL=0x0000
		lda	RAM_TAPE_MODE	; 0=Load, 1=Verify
		ora	a		; Test for ones
		jz	TAPE_VERIFY_A	; Yes, we are in verify	mode
		lxi	d, MSG_VERIFY	; Load DL=0x0000

TAPE_VERIFY_A:				; CODE XREF: HighROM:1DB3j
					; HighROM:1DBEj ...
		call	TAPE_VERIFY_C
		cpi	0B3h ; '³'
		jnz	TAPE_VERIFY_A
		mvi	a, 1
		sta	RAM_TAPE_D
		call	TAPE_VERIFY_C
		cpi	0BFh ; '¿'
		jnz	TAPE_VERIFY_A
		lxi	h, M_RCV_CHANNEL ; The current MIDI receive channel

TAPE_VERIFY_B:				; CODE XREF: HighROM:1E18j
					; HighROM:1E1Ej
		call	TAPE_VERIFY_C
		mov	c, a
		lda	RAM_TAPE_MODE	; 0=Load, 1=Verify
		ora	a
		jnz	loc_0_1DF7
		lda	RAM_TAPE_C	; ??? Seems to be related to tape commands or switches
		ora	a
		lda	RearSwitches	; Get rear switches
		jz	TAPE_VERIFY_BA	; No switches are active so jump
		ani	10h		; Check	for Program Write Enable
		jz	TAPE_X		; It's disabled so jump
		jmp	TAPE_VERIFY_BC	; Do not include sequencer in verify
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TAPE_VERIFY_BA:				; CODE XREF: HighROM:1DE3j
		ani	8
		jz	TAPE_X		; Jump when Sequencer Write is enabled

TAPE_VERIFY_BC:				; CODE XREF: HighROM:1DEBj
		mov	m, c		; Do not include sequencer in verify
		jmp	TAPE_X
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_0_1DF7:				; CODE XREF: HighROM:1DD9j
		mov	a, c
		cmp	m
		jnz	TAPE_ERROR	; This is reading from HIGHROM

TAPE_X:					; CODE XREF: HighROM:1DE8j
					; HighROM:1DF0j ...
		lda	RAM_TAPE_B
		add	c
		sta	RAM_TAPE_B
		inx	h
		mov	a, h
		cpi	22h ; '"'
		jnz	loc_0_1E15
		mov	a, l
		cpi	0
		jnz	loc_0_1E15
		mvi	a, 1
		sta	RAM_TAPE_C	; ??? Seems to be related to tape commands or switches

loc_0_1E15:				; CODE XREF: HighROM:1E07j
					; HighROM:1E0Dj
		mov	a, h
		cpi	27h ; '''
		jnz	TAPE_VERIFY_B
		mov	a, l
		cpi	41h ; 'A'
		jnz	TAPE_VERIFY_B
		call	TAPE_VERIFY_C
		lxi	h, RAM_TAPE_B
		cmp	m
		jnz	TAPE_ERROR	; This is reading from HIGHROM
		lxi	d, MSG_GOOD	; Blank
		jmp	TAPE_GOOD_ENTRY	; The jump in point when the tape
					; result is good

; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


sub_0_1E31:				; CODE XREF: TAPE_VERIFY_C+6p
					; TAPE_VERIFY_C+9p ...
		push	psw
		push	b
		push	h

loc_0_1E34:				; CODE XREF: sub_0_1E31+1Dj
		mvi	b, 46h ; 'F'

loc_0_1E36:				; CODE XREF: sub_0_1E31+10j
		rim	
		ani	80h
		lxi	h, RAM_TAPE_VERIFY ; Seems to be involved in the tape verify
		cmp	m
		jnz	loc_0_1E51
		dcr	b
		jnz	loc_0_1E36
		lda	RAM_TAPE_D
		ora	a
		jnz	TAPE_ERROR	; This is reading from HIGHROM
		call	sub_0_1FCD
		jmp	loc_0_1E34
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_0_1E51:				; CODE XREF: sub_0_1E31+Cj
		sta	RAM_TAPE_VERIFY	; Seems	to be involved in the tape verify
		in	40h
		sta	RAM_TAPE_F
		mvi	a, 4Fh ; 'O'
		out	40h
		in	40h
		mvi	a, 50h ; 'P'
		out	44h
		mvi	a, 5
		out	45h
		mvi	a, 0CFh	; 'Ï'
		out	40h
		pop	h
		pop	b
		pop	psw
		ret	
; End of function sub_0_1E31


; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


TAPE_VERIFY_C:				; CODE XREF: HighROM:1DB9p
					; HighROM:1DC6p ...
		rim	
		ani	80h
		sta	RAM_TAPE_VERIFY	; Seems	to be involved in the tape verify
		call	sub_0_1E31

TAPE_VERIFY_D:				; CODE XREF: TAPE_VERIFY_C+11j
		call	sub_0_1E31
		lda	RAM_TAPE_F
		ani	40h
		jz	TAPE_VERIFY_D
		mvi	b, 8
		xra	a

TAPE_VERIFY_E:				; CODE XREF: TAPE_VERIFY_C+24j
		call	sub_0_1E31
		mov	c, a
		lda	RAM_TAPE_F
		ral	
		ral	
		cmc	
		mov	a, c
		rar	
		dcr	b
		jnz	TAPE_VERIFY_E
		push	psw
		call	sub_0_1FCD
		pop	psw
		ret	
; End of function TAPE_VERIFY_C


; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


TAPE_DISPLAY:				; CODE XREF: HighROM:1F5Dp sub_0_1FCDp
		push	psw
		push	b
		push	d
		lda	RAM_TAPE_DSPLAY	; Seems	to be used to determine	the tape display message
		mov	b, a
		add	e
		mov	e, a
		xra	a
		out	42h		; Turn display off
		inr	b
		mov	c, b
		stc			; Set Carry Flag = 1

TAPE_DSPLAY_A:				; CODE XREF: TAPE_DISPLAY+11j
		ral			; Rotate Acc left one bit
		dcr	b
		jnz	TAPE_DSPLAY_A	; Rotate Acc left one bit
		out	43h		; Set display units
		ldax	d
		out	42h		; Set display segments
		mov	a, c
		cpi	6
		jnz	TAPE_DSPLAY_B
		xra	a

TAPE_DSPLAY_B:				; CODE XREF: TAPE_DISPLAY+1Cj
		sta	RAM_TAPE_DSPLAY	; Seems	to be used to determine	the tape display message
		pop	d
		pop	b
		pop	psw
		ret	
; End of function TAPE_DISPLAY


; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


TAPE_EXIT:				; CODE XREF: HighROM:1F66p
					; sub_0_1FCD+9p
		lda	RearSwitches
		ani	20h		; Test for Tape	Enable
		jz	ColdStart	; Tape Enable is off so	exit Tape
		ret	
; End of function TAPE_EXIT

; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TAPE_ERROR:				; CODE XREF: HighROM:1DF9j
					; HighROM:1E28j ...
		lxi	d, MSG_ERROR	; This is reading from HIGHROM
		call	sub_0_1FCD
		jmp	TAPE_ERROR	; This is reading from HIGHROM

; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


TAPE_TEST_CAN:				; CODE XREF: HighROM:1F63p
					; sub_0_1FCD+6p
		lda	Keypad
		ani	1		; Test for Cancel (keypad 8)
		jnz	TAPE_CANCEL	; Load DE with 0x1FDA
		ret	
; End of function TAPE_TEST_CAN

; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TAPE_SAVE_MAIN:				; CODE XREF: HighROM:1D90j
		lxi	h, 280h
		lxi	d, MSG_SAVE	; Blank
		in	40h
		call	sub_0_1F8A
		mvi	a, 0B3h	; '³'
		call	sub_0_1F73
		mvi	a, 0BFh	; '¿'
		call	sub_0_1F73
		lxi	h, M_RCV_CHANNEL ; The current MIDI receive channel

loc_0_1EF6:				; CODE XREF: HighROM:1F05j
					; HighROM:1F0Bj
		mov	a, m
		call	sub_0_1F73
		lda	RAM_TAPE_B
		add	m
		sta	RAM_TAPE_B
		inx	h
		mov	a, h
		cpi	27h ; '''
		jnz	loc_0_1EF6
		mov	a, l
		cpi	41h ; 'A'
		jnz	loc_0_1EF6
		lda	RAM_TAPE_B
		call	sub_0_1F73
		lxi	h, 140h
		call	sub_0_1F8A
		jmp	TAPE_CANCEL	; Load DE with 0x1FDA

; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


TAPE_B:					; CODE XREF: HighROM:1D81p
					; sub_0_1F73+2p ...
		push	psw
		push	h
		jc	TAPE_B2		; On first entry there should be no carry
					; Don't know what the carry is used for yet
		mvi	a, 0
		out	44h		; Set upper TC=0
		mvi	a, 7
		out	45h		; Set lower TC=7
		lda	RAM_TAPE_A	; Get the TIMER_A byte
		cma			; Complement the TIMER byte
		sta	RAM_TAPE_A	; Store	the TIMER byte
		ora	a		; Logical OR the byte with itself
		mvi	a, 14h
		jz	TAPE_B1
		mvi	a, 0Ch

TAPE_B1:				; CODE XREF: TAPE_B+17j
		sta	BitLatchA
		jmp	TAPE_B4
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TAPE_B2:				; CODE XREF: TAPE_B+2j
		mvi	a, 0C1h	; 'Á'
		out	44h
		mvi	a, 2
		out	45h
		lda	RAM_TAPE_A	; Somehow related to Tape operations.
					; Might	be a status byte.
		cma	
		sta	RAM_TAPE_A	; Somehow related to Tape operations.
					; Might	be a status byte.
		ora	a
		mvi	a, 1Ch
		jnz	TAPE_B3
		mvi	a, 4

TAPE_B3:				; CODE XREF: HighROM:1F51j
		sta	BitLatchA

TAPE_B4:				; CODE XREF: HighROM:1F3Cj
		mvi	a, 0CFh	; 'Ï'
		out	40h
		call	TAPE_DISPLAY
		call	TAPE_Y
		call	TAPE_TEST_CAN
		call	TAPE_EXIT

TAPE_B5:				; CODE XREF: HighROM:1F6Dj
		in	40h
		ral	
		ral	
		jnc	TAPE_B5
		pop	h
		pop	psw
		ret	

; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


sub_0_1F73:				; CODE XREF: HighROM:1EEBp
					; HighROM:1EF0p ...
		stc	
		cmc	
		call	TAPE_B
		mvi	b, 8

loc_0_1F7A:				; CODE XREF: sub_0_1F73+Cj
		rar	
		call	TAPE_B
		dcr	b
		jnz	loc_0_1F7A
		stc	
		call	TAPE_B
		call	TAPE_B
		ret	
; End of function sub_0_1F73


; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


sub_0_1F8A:				; CODE XREF: HighROM:1EE6p
					; HighROM:1F17p ...
		mvi	a, 0FFh
		call	sub_0_1F73
		dcx	h
		mov	a, l
		ora	h
		jnz	sub_0_1F8A
		ret	
; End of function sub_0_1F8A


; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


TAPE_Y:					; CODE XREF: HighROM:1F60p
					; sub_0_1FCD+3p
		push	psw
		push	b
		lda	RAM_TAPE_E
		mov	b, a
		cpi	8
		jz	TAPE_YC
		cpi	10h
		jz	TAPE_YD

TAPE_YA:				; CODE XREF: TAPE_Y+34j
		mov	a, b
		sta	BitLatchB
		cpi	17h
		jnz	TAPE_YB
		mvi	a, 7

TAPE_YB:				; CODE XREF: TAPE_Y+16j
		inr	a
		sta	RAM_TAPE_E
		pop	b
		pop	psw
		ret	
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TAPE_YC:				; CODE XREF: TAPE_Y+8j
		mvi	a, 18h
		sta	BitLatchB
		xra	a
		jmp	TAPE_YE
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TAPE_YD:				; CODE XREF: TAPE_Y+Dj
		mvi	a, 18h
		sta	BitLatchB
		mvi	a, 0FFh

TAPE_YE:				; CODE XREF: TAPE_Y+28j
		out	41h
		jmp	TAPE_YA
; End of function TAPE_Y


; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B	R O U T	I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


sub_0_1FCD:
		call	TAPE_DISPLAY
		call	TAPE_Y
		call	TAPE_TEST_CAN
		call	TAPE_EXIT
		ret	
; End of function sub_0_1FCD

; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MSG_TAPE:	.db	0			; Blank
		.db	0			; Blank
		.db  54h			; T
		.db  7Dh			; A
		.db  79h			; P
		.db  3Bh			; E
MSG_SAVE:	.db	0			; Blank
		.db	0 			; Blank  
		.db  3Eh			; S
		.db  7Dh			; A
		.db  17h			; V
		.db  3Bh			; E
MSG_LOAD:	.db	0			; Blank
		.db	0			; Blank
		.db  23h			; L
		.db  0Fh			; O
		.db  7Dh			; A
		.db  4Fh			; D
MSG_VERIFY:	.db	0			; Blank
		.db   0			; Blank
		.db  17h			; V
		.db    9			; r
		.db  39h			; f
		.db  6Eh			; y
MSG_GOOD:	.db	0			; Blank
		.db	0			; Blank
		.db  37h 			; G
		.db  0Fh			; o
		.db  0Fh			; o
		.db  4Fh			; d
MSG_ERROR:	.db	0			; Blank
		.db	0			; Blank
		.db	0			; Blank
		.db  3Bh			; E
		.db    9			; r
		.db    9			; r
;not sure if these two bytes below are used at all
		.db  82h			; Unknown
		.db  6Eh			; Unknown
