_panic macro
       call fatal
       endm

; ===========================================================================
fatal proc far
; ===========================================================================
      _print ErrMsg0004, 1
      _print ErrMsg0005, 1
      ; _print shutdownmsg, 1
IF (DEBUG)
      call pauseprompt
ENDIF
IF (ZSTART)
      call dosexit
ENDIF
IF (MSDOS)
      cli
      hlt
ELSE
      call reset
      call reboot
      call lockup
ENDIF
      ret
fatal endp

; ===========================================================================
errm proc far
; ===========================================================================
     jnc  noerror
           push ds
           push cs
           pop   ds
           mov   bx, cs:[errorcode]
           mov   si, bx
           mov   ax, cs:[bp+si]
           mov   di, ax
           ; call  showerrmsg
           pop   ds
noerror:
     ret
errm endp

; ===========================================================================
error proc far
; ===========================================================================
      _echo '#'
      xor  ax, ax
      mov  al, byte ptr cs:EXTERR_LOCUS
      push ax
      call putnum
      pop  ax
      _echo ' '
      mov  bp, ax
      mov  dx, word ptr cs:[Errmsgs+bp]
      mov  si, dx
      pusha
      mov  dl, 1
      mov  bh, 1
      xor  cx, cx
      call cs:print
      popa
      ret
error endp

; ===========================================================================
crash proc far
; ===========================================================================
      jnc   short dos_lives
dos_dies:
      mov  al, byte ptr cs:exterr_locus
      cmp  al, 8
      jne  needredscrn
      _textcolor 15, 1
      jmp  short crashb_
needredscrn:
      _textcolor 15, 4
crashb_:
      call cs:bluescreen
      _panic
dos_lives:
      ret
; ===========================================================================
bluescreen proc far
; ===========================================================================
      ; if vgamode show("dysentry.gif") else
IF (DEBUG)
   pusha
   call pauseprompt
   popa
ENDIF
      call clrscr
      call debugregisters
      _newline
      call error

      _newline
      push sp
      pop  si
      push ss
      pop  es
      mov  cx, 64
      call debugdump
      _newline

      mov  ax, word ptr cs:[stackseg]
      mov  dx, word ptr cs:[stackofs]
      push ax
      pop  es
      push dx
      pop  si
      mov  cx, 16
      ;push cs
      ;pop  es
      ;lea  ax, stack_data
      ;push ax
      ;pop  si
      ;mov  cx, 16
      call debugdump
      _newline
      assert 90, 1, 1, 1
      _print dosdied_msg, 1
      call show_hardware
      ret
bluescreen endp

;
dosdied_msg db ' '           
IF (HUMOR)
            db 'CompuSquare vs. TeknoSphere, you have died of dysentery!.',0ffh
ENDIF
            db 0
            ;
crash endp


