From b8c6eaf4c99e405502348c44468961cbe1a71b1d Mon Sep 17 00:00:00 2001 From: Joppe Blondel Date: Fri, 9 Oct 2026 11:50:14 +0200 Subject: [PATCH] Added calibration specific error codes --- apps/basic/basic.asm | 11 ++++++++--- tape.asm | 45 +++++++++++++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/apps/basic/basic.asm b/apps/basic/basic.asm index be96293..8e8a8fe 100644 --- a/apps/basic/basic.asm +++ b/apps/basic/basic.asm @@ -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 diff --git a/tape.asm b/tape.asm index b1a06eb..aba9e92 100644 --- a/tape.asm +++ b/tape.asm @@ -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$