From 1bf4065b6a0ed9a6763681d9bf9f31d90d61fd4c Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 16 May 2020 18:38:26 -0700 Subject: [PATCH] Global Error Codes --- Source/CPM3/diskio.z80 | 47 +++++++++++++++++++-------------- Source/HBIOS/hbios.asm | 60 +++++++++++++++++++++++++++++------------- Source/HBIOS/hbios.inc | 17 ++++++++++++ Source/HBIOS/md.asm | 3 ++- 4 files changed, 87 insertions(+), 40 deletions(-) diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 45df4372..90c0eb1c 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -431,7 +431,7 @@ media: ld a,e ; resultant media id to accum ld (medid),a ; save media id or a ; set flags, 0 is no media - jp z,err_diskio ; handle no media error + jp z,err_nodisk ; handle no media error ; Initialize slice start LBA & sectors per slice ld hl,0 ; assume slice starts @@ -769,27 +769,21 @@ cin$echo1: err_nodisk: ld hl,str_err_nodisk - jr err + jr err_perm err_noslice: ld hl,str_err_noslice - jr err + jr err_perm +err_perm: + call prt_err + jr err_ret err_diskio: - ld hl,str_err_diskio - jr err -err_sig: - ld hl,str_err_sig - jr err -err_api: - ld hl,str_err_api - jr err -err: + cp -10 ; HBIOS read only error + jr z,err_rdonly ; if so, handle special ld a,(@ermde) ; get error mode cp 0FFh ; FFh means suppress jr z,err_ret ; if so, go to err return - push hl - call ?pderr - pop hl - call ?pmsg + ld hl,str_err_diskio + call prt_err ld hl,str_err_retry call ?pmsg call cin$echo @@ -797,16 +791,29 @@ err: jr nz,err_ret ; return error to caller ld hl,(retry$adr) ; get retry address jp (hl) ; and go there +err_rdonly: + ld hl,str_err_rdonly + call prt_err + ld a,2 ; signal readonly media + ret +prt_err: + ld a,(@ermde) ; get error mode + cp 0FFh ; FFh means suppress + ret z ; if so, go to err return + push hl + call ?pderr + pop hl + jp ?pmsg err_ret: - ld a,1 ; signal I/O error + ld a,0FFh ; signal error ret ; and done -str_err_retry db ", Retry (Y/N) ? ",0 +str_err_retry db ", Retry (Y/N)?",0 str_err_nodisk db ", No disk",0 str_err_noslice db ", No slice",0 str_err_diskio db ", Disk I/O",0 -str_err_sig db ", No system",0 -str_err_api db ", API failure",0 +str_err_rdonly db ", Read Only",0 +str_err_prefix db 13,10,"BIOS Error: ",0 retry$adr dw ?wboot ; error retry address curdph dw 0 ; working dph value diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index b136e875..ce6bf8dd 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2185,7 +2185,9 @@ RTC_DISPATCH: RET ; RTC_DISPERR: - OR $FF + ;CALL PANIC + LD A,ERR_NOHW + OR A RET ; ; SET RTC DISPATCH ADDRESS, USED BY RTC DRIVERS DURING INIT @@ -2338,7 +2340,9 @@ SYS_RESET: JR Z,SYS_RESWARM CP BF_SYSRES_COLD JR Z,SYS_RESCOLD - OR $FF ; SIGNAL ERROR + ;CALL PANIC + LD A,ERR_NOFUNC + OR A ; SIGNAL ERROR RET ; ; SOFT RESET HBIOS, RELEASE HEAP MEMORY NOT USED BY HBIOS @@ -2449,8 +2453,9 @@ SYS_ALLOC: ; ALL OTHER REGISTERS PRESERVED ; SYS_FREE: - CALL PANIC ; NOT YET IMPLEMENTED - OR $FF + ;CALL PANIC ; NOT YET IMPLEMENTED + LD A,ERR_NOTIMPL ; NOT YET INMPLEMENTED + OR A ; SET FLAGS RET ; ; GET SYSTEM INFORMATION @@ -2480,7 +2485,9 @@ SYS_GET: JR Z,SYS_GETMEMINFO CP BF_SYSGET_BNKINFO JR Z,SYS_GETBNKINFO - OR $FF ; SIGNAL ERROR + ;CALL PANIC + LD A,ERR_NOFUNC ; SIGNAL ERROR + OR A ; SET FLAGS RET ; ; GET TIMER @@ -2618,7 +2625,9 @@ SYS_SET: JR Z,SYS_SETSECS CP BF_SYSSET_BOOTINFO JR Z,SYS_SETBOOTINFO - OR $FF ; SIGNAL ERROR + ;CALL PANIC + LD A,ERR_NOFUNC ; SIGNAL ERROR + OR A ; SET FLAGS RET ; ; SET BOOT INFORMATION @@ -2713,7 +2722,9 @@ SYS_INT: JR Z,SYS_INTGET CP BF_SYSINT_SET JR Z,SYS_INTSET - OR $FF ; SIGNAL ERROR + ;CALL PANIC + LD A,ERR_NOFUNC ; SIGNAL ERROR + OR A ; SET FLAGS RET ; ; GET INTERRUPT SYSTEM INFORMATION @@ -2739,8 +2750,9 @@ SYS_INTINFO: ; SYS_INTVECADR: #IF (INTMODE == 0) - CALL PANIC ; INVALID FOR INT MODE 0 - OR $FF + ;CALL PANIC ; INVALID FOR INT MODE 0 + LD A,ERR_BADCFG ; SIGNAL ERROR + OR A ; SET FLAGS RET #ENDIF #IF (INTMODE == 1) @@ -2754,8 +2766,9 @@ SYS_INTVECADR: LD A,E ; INCOMING INDEX POSITION TO A CP C ; COMPARE TO VECTOR COUNT JR C,SYS_INTGET1 ; CONTINUE IF POSITION IN RANGE - CALL PANIC ; ELSE ERROR - OR $FF + ;CALL PANIC ; ELSE ERROR + LD A,ERR_RANGE ; SIGNAL ERROR + OR A ; SET FLAGS RET SYS_INTGET1: OR A ; CLEAR CARRY @@ -2934,13 +2947,13 @@ HB_DISPCALL: ; CHECK INCOMING UNIT INDEX IN C FOR VAILIDITY LD A,C ; A := INCOMING DISK UNIT INDEX CP (IY-1) ; COMPARE TO COUNT - JR NC,HB_DISPERR ; HANDLE INVALID UNIT INDEX + JR NC,HB_FUNCERR ; HANDLE INVALID UNIT INDEX ; CHECK FUNCTION INDEX FOR VALIDITY LD A,B ; A := INCOMING FUNCTION NUMBER AND $0F ; LOW NIBBLE ONLY FOR FUNC INDEX CP (IY-3) ; CHECK FN NUM AGAINST MAX - JR NC,HB_DISPERR ; HANDLE FN NUM OUT OF RANGE ERROR + JR NC,HB_UNITERR ; HANDLE FN NUM OUT OF RANGE ERROR ; BUMP IY TO ACTUAL XXX_TBL ENTRY FOR INCOMING UNIT INDEX PUSH BC ; SAVE BC @@ -2971,10 +2984,17 @@ HB_DISPCALL: RET ; JUMP TO DRIVER FUNC ADR ON TOS ; -HB_DISPERR: - CALL PANIC ; PANIC - OR $FF ; SIGNAL ERROR - RET ; AND RETURN VIA DISPEXIT +HB_FUNCERR: + ;CALL PANIC + LD A,ERR_NOFUNC ; SIGNAL ERROR + OR A ; SET FLAGS + RET +; +HB_UNITERR: + ;CALL PANIC + LD A,ERR_NOUNIT ; SIGNAL ERROR + OR A ; SET FLAGS + RET ; ; ADD AN ENTRY TO THE UNIT TABLE AT ADDRESS IN HL ; BC: DRIVER FUNCTION TABLE @@ -3060,8 +3080,10 @@ HB_ALLOC: HB_ALLOC1: ; ERROR RETURN POP DE ; RESTORE INCOMING DE - OR $FF ; SIGNAL ERROR - RET ; AND RETURN + ;CALL PANIC + LD A,ERR_NOMEM ; SIGNAL ERROR + OR A ; SET FLAGS + RET ; HB_TMPSZ .DW 0 HB_TMPREF .DW 0 diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index fadb8345..d0734cd2 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -116,6 +116,23 @@ BF_SYSINT_SET .EQU $20 ; SET INT VECTOR ADDRESS ; CIO_CONSOLE .EQU $80 ; CIO UNIT NUM FOR CUR CON ; +; HBIOS GLOBAL ERROR RETURN VALUES +; +ERR_NONE .EQU 0 ; SUCCESS +; +ERR_UNDEF .EQU -1 ; UNDEFINED ERROR +ERR_NOTIMPL .EQU -2 ; FUNC NOT IMPLEMENTED +ERR_NOFUNC .EQU -3 ; INVALID FUNCTION +ERR_NOUNIT .EQU -4 ; INVALID UNIT NUMBER +ERR_NOMEM .EQU -5 ; OUT OF MEMORY +ERR_RANGE .EQU -6 ; PARAMETER OUT OF RANGE +ERR_NOMEDIA .EQU -7 ; MEDIA NOT PRESENT +ERR_NOHW .EQU -8 ; HARDWARE NOT PRESENT +ERR_IO .EQU -9 ; I/O ERROR +ERR_READONLY .EQU -10 ; WRITE REQ TO READ-ONLY MEDIA +ERR_TIMEOUT .EQU -11 ; DEVICE TIMEOUT +ERR_BADCFG .EQU -12 ; INVALID CONFIGURATION +; ; MEDIA ID VALUES ; MID_NONE .EQU 0 diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 2b9c9c0a..9d290c0a 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -190,7 +190,8 @@ MD_WRITE: OR A ; SET FLAGS TO TEST FOR ROM (UNIT 0) JR NZ,MD_RW ; NOT ROM, SO OK TO WRITE, CONTINUE LD E,0 ; UNIT IS READ ONLY, ZERO SECTORS WRITTEN - OR $FF ; SIGNAL ERROR + LD A,ERR_READONLY ; SIGNAL ERROR + OR A ; SET FLAGS RET ; AND DONE ; ;