DRUID Development Docs: gerror.inc

Gadget Sourcecode: gerror.inc

; Justice Unlimited Gadget Microcode
; (C) 2004 Nathan (Acorn) Pooley 
;
; gerror.inc
;
;@DOC@ handle errors
;


;
; error handling
;

;############################################
;############### Errors #####################
;############################################

;
; NOTE: All errors should have bit 5 set to 0
;
ERROR_BASE          EQU ~0x20               ; DF = 20
ERROR_BADINT        EQU ERROR_BASE^0x01     ; DE = 21
ERROR_BADPC         EQU ERROR_BASE^0x02     ; DD = 22
ERROR_HANG          EQU ERROR_BASE^0x03     ; DC = 23
ERROR_OUT_PUTC      EQU ERROR_BASE^0x04     ; DB = 24
#if 0
ERROR_OUT_PUTC_W    EQU ERROR_BASE^0x05     ; DA = 25
ERROR_OUT_PUTC_B    EQU ERROR_BASE^0x06     ; D9 = 26
ERROR_OUT_PUTC_WB   EQU ERROR_BASE^0x07     ; D8 = 27
ERROR_OUT_WCOL      EQU ERROR_BASE^0x08     ; D7 = 28
ERROR_OUT_BUS       EQU ERROR_BASE^0x09     ; D6 = 29
#endif
ERROR_OUT_HANG      EQU ERROR_BASE^0x0a     ; D5 = 2A
ERROR_OUT_DIS       EQU ERROR_BASE^0x0b     ; D4 = 2B
ERROR_OUT_EN        EQU ERROR_BASE^0x0c     ; D3 = 2C

ERROR_TABLE         EQU ERROR_BASE^0x0d     ; D2 = 2D
ERROR_JUMP          EQU ERROR_BASE^0x0e     ; D1 = 2E
ERROR_MODE          EQU ERROR_BASE^0x0f     ; D0 = 2F
ERROR_STRING        EQU ERROR_BASE^0x10     ; CF = 30
ERROR_BAD_SC        EQU ERROR_BASE^0x11     ; CE = 31
ERROR_STACKPOP      EQU ERROR_BASE^0x12     ; CD = 32
ERROR_STACKPUSH     EQU ERROR_BASE^0x13     ; CC = 33
ERROR_NEXTC         EQU ERROR_BASE^0x14     ; CB = 34

ERROR_MAX           EQU ERROR_BASE^0x1f     ; max allowed error


    ;
    ; REPORT ERRORS
    ; When an error occurs hang and report condition
    ; on PORTA
    ;
#if REPORT_ERRORS
unknown_error:
    movlw   ERROR_BASE
error_loop:
error_loop1:
    BREAKPOINT  bp_error
    bcf     b_gieh      ; disable interrupts
    bcf     b_giel


    goto    soft_reset

    btfss   b_error_occurred
    bra     error_loop1

error_loop2:
    movwf   v_errno
    bsf     b_error_occurred
    clrf    TRISA
    movwf   PORTA

    rcall   output_disable
    rcall   input_disable
    DISABLE_DISPLAY
    clrf    TRISA
    movf    v_errno,w
    movwf   PORTA
    DISABLE_IR
    LIGHT_OFF
    SOUND_OFF
    DISABLE_SPINNER
    rcall   output_enable
    clrf    v_putl_linenum
    rcall   put_position_linestart
    PUT_CHAR    'E'
    PUT_CHAR    'R'
    PUT_CHAR    'R'
    PUT_CHAR    'O'
    PUT_CHAR    'R'
    PUT_CHAR    ' '
    movf        v_errno,w
    rcall       putnum_w

error_loop3:
    nop
    bra     error_loop3


    ;
    ; unexpected interrupt occurred
    ;
error_badint_low:
    movlw   ERROR_BADINT
    bra     error_loop

    ;
    ; program counter in bad place
    ;
error_badpc:
    movlw   ERROR_BADPC
    bra     error_loop

    ;
    ; puts_nextc was called for last char in string
    ;
error_nextc:
    movlw   ERROR_NEXTC
    bra     error_loop

#if 0
    ;
    ; wcol error in I2C transmission
    ;
error_out_wcol:
    movlw   ERROR_OUT_WCOL
    bra     error_loop

    ;
    ; bus collision in I2C transmission
    ;
error_out_bus:
    movlw   ERROR_OUT_BUS
    bra     error_loop
#endif

    ;
    ; hung waiting for sspif
    ;
error_out_hang:
    movlw   ERROR_OUT_HANG
    bra     error_loop

    ;
    ; Table crosses page boundary
    ;
error_table:
    movlw   ERROR_TABLE
    bra     error_loop

    ;
    ; bad jump table index
    ;
error_jump:
    movlw   ERROR_JUMP
    bra     error_loop

    ;
    ; bad mode
    ;
error_mode:
    movlw   ERROR_MODE
    bra     error_loop

    ;
    ; stack pop underflow
    ;
error_stackpop:
    movlw   ERROR_STACKPOP
    bra     error_loop

    ;
    ; stack push overflow
    ;
error_stackpush:
    movlw   ERROR_STACKPUSH
    bra     error_loop

    ;
    ; bad string id
    ;
error_string:
    movlw   ERROR_STRING
    bra     error_loop

    ;
    ; bad special character
    ;
error_bad_sc:
    movlw   ERROR_BAD_SC
    bra     error_loop

    ;
    ; program was hung
    ;
error_hang:
    movf    v_hang_state,w
    addlw   -ERROR_OUT_PUTC
    bz      error_out_putc

    movf    v_hang_state,w
    bnz     error_loop
    movlw   ERROR_HANG
    bra     error_loop

    ;
    ; putc hung
    ;
error_out_putc:
    movlw   ERROR_OUT_PUTC
#if 0
    btfsc   b_wcol
    iorlw   ERROR_OUT_PUTC_W
    btfsc   b_bclif
    iorlw   ERROR_OUT_PUTC_B
#endif
    bra     error_loop

    

    ;
    ; DO NOT REPORT ERRORS
    ; When error occurs reset the chip
    ;
#else
unknown_error:
error_badint_low:
error_badpc:
#if 0
error_out_wcol:
error_out_bus:
#endif
error_out_hang:
error_table:
error_bad_sc:
error_hang:
error_out_putc:
    clrf    INTCON      ; disable interrupts
    bsf     b_error     ; signal error condition
    reset               ; reset the chip
#endif



This file Copyright (C) 2004 by Nathan (Acorn) Pooley
Go to DRUID Development page
Go to DRUID page
Go to JU Gadgets page
Go to Justice Unlimited homepage
Go to Acorn's personal webpage
Contact Acorn
See comments from others
Post your own comments
File created by do_doc at Wed Aug 4 17:52:43 2004