Added calibration specific error codes

This commit is contained in:
Joppe Blondel
2026-10-09 11:50:14 +02:00
parent d3a3e68d39
commit b8c6eaf4c9
2 changed files with 40 additions and 16 deletions
+8 -3
View File
@@ -4649,7 +4649,7 @@ CLOADB: inc hl ; skip #
; hl contains block, check block type
ld a,(hl)
cp 1 ; first block needs to be a header
jr nz,CLNOHDR ; First block is not a header
jp nz,CLNOHDR ; First block is not a header
; first block is a header, get nr of blocks
inc hl
ld de,(hl)
@@ -4706,7 +4706,9 @@ CLREADBLOCK:
jr nc,2$
; error, make sure it is silent again
push af
push bc ; save specific error code
call BIOS_CAS_WAIT_SILENCE
pop bc
pop af
jr CLERR
1$: push hl ; save hl
@@ -4727,7 +4729,10 @@ CLERR: cp 1
cp 4
jr z,CLECHS
jp FCERR ; Unknown error
CLECAL: ld hl, CLECALMSG
CLECAL: ld h,0
ld l,b ; get specific error code
call PRNTHL ; print specific error code
ld hl, CLECALMSG
jr CLEPRINT
CLESYN: ld hl, CLESYNMSG
jr CLEPRINT
@@ -4745,7 +4750,7 @@ CLEPRINT:
jp FCERR
CLSTARTMSG: .db "Play tape...",0ah,0dh,00h
CLECALMSG: .db "Calibration failed",0ah,0dh,00h
CLECALMSG: .db " - Calibration failed",0ah,0dh,00h
CLESYNMSG: .db "Synchronization failed",0ah,0dh,00h
CLEREDMSG: .db "Read failed",0ah,0dh,00h
CLECHSMSG: .db "Checksum error",0ah,0dh,00h
+32 -13
View File
@@ -13,6 +13,18 @@ LONG_MIN .equ TAPE_WORKSPACE + 004h ; byte
LONG_MAX .equ TAPE_WORKSPACE + 005h ; byte
BLOCK_BUFFER .equ TAPE_WORKSPACE + 006h ; BLOCK_SIZE
; -------------------------------------------------------
; Error return callback macro
; creates a simple macro which puts a return code in a
; and sets the carry flag
; -------------------------------------------------------
create_error_return MACRO &name, &code
&name:
ld a,&code
scf
ret
ENDM
; -------------------------------------------------------
; Measure edge-to-edge pulse
; needs d (comparator state)
@@ -133,7 +145,7 @@ make_window:
; Calibration
; d needs to be kept from now on
; uses a,b,c,e,h,l
; carry is error
; carry is error, a contains error code
; -------------------------------------------------------
calibrate:
ld a,(TAPE_PORT) ; get current state
@@ -155,7 +167,7 @@ calibrate:
; edge found
; get short leader timing
call average8
jr c,cal_err ; timeout
jr c,cal_err_short_leader_average
ld (SHORT_AVG),a
call make_window
ld a,b
@@ -175,9 +187,9 @@ calibrate:
; is ignored
4$:
call sample_pulse
jr c,cal_err
jr c,cal_err_wait_for_long
call sample_pulse
jr c,cal_err
jr c,cal_err_wait_for_long
ld a,b
; try again if its a short pulse
cp c
@@ -187,7 +199,7 @@ calibrate:
jr nz,4$ ; repeat this 4 times
; long leader found
call average8
jr c,cal_err ; timeout
jr c,cal_err_long_leader_average
ld (LONG_AVG),a
call make_window
ld a,b
@@ -202,7 +214,7 @@ calibrate:
ld c,a ; c = 1.5*short
ld a,(LONG_AVG)
cp c
jr c,cal_err
jr c,cal_err_sanity_check
; Find the marker. marker is 2*long
; threshold is 1.5*long
ld a,(LONG_AVG)
@@ -215,7 +227,7 @@ calibrate:
ld e,0
6$:
call measure_pulse
jr c,cal_err ; timeout
jr c,cal_err_marker_measure
ld a,b
cp c
jr c,5$ ; not a marker
@@ -227,15 +239,21 @@ calibrate:
; we are at the beginning of the first data pulse
; next 8 bytes is the training byte 0x55
call read_byte
jr c,cal_err
jr c,cal_err_training_read
cp a,055h
jr nz,cal_err ; training byte not 0x55
jr nz,cal_err_training_incorrect
; calibration complete
or a ; clear carry
ret
cal_err:
scf
ret
create_error_return cal_err, 000h
create_error_return cal_err_short_leader_average, 001h
create_error_return cal_err_wait_for_long, 002h
create_error_return cal_err_long_leader_average, 003h
create_error_return cal_err_sanity_check, 004h
create_error_return cal_err_marker_measure, 005h
create_error_return cal_err_training_read, 006h
create_error_return cal_err_training_incorrect, 007h
; -------------------------------------------------------
; Read a single bit
@@ -351,7 +369,7 @@ read_sync:
; Read a block into BLOCK_BUFFER
; needs d (comparator state)
; uses b,c,d,e,h,l
; returns error code in a
; returns error code in a, specific error code in b
; returns start of block in hl
; carry is fail
; -------------------------------------------------------
@@ -364,6 +382,7 @@ read_block:
; calibrate reader
call calibrate
jr nc,1$ ; if no error jump
ld b,a
ld a,BLOCK_ERROR_CALIBRATION
scf
jr 101$