view level1/cmds/error.asm @ 2898:28ed72477814 lwtools-port

Dummy merge of default branch into lwtools hg -y merge --tool=internal:fail default hg revert --all --no-backup --rev . hg resolve -a -m This dummy merge discards any changes from the default branch so that the result is the same as what lwtools already had. When merging back to default branch later, the discarded changes will be discarded there also, so the result will be that the default branch will contain what the lwtools branch had before these merges. Only scripts/burst was "rescued" from default branch.
author Tormod Volden <debian.tormod@gmail.com>
date Sat, 11 Jan 2014 18:40:44 +0100
parents 84ea83668304
children
line wrap: on
line source

********************************************************************
* Error - Show text error messages
*
* $Id$
*
* By Bob Devries (c) 2003; bdevries@gil.com.au
*
* Released under the GNU public licence
*
* Edt/Rev  YYYY/MM/DD  Modified by
* Comment
* ------------------------------------------------------------------
*   1      2003/01/20  Bob Devries
* Rewrote in assembler for size.
*
*          2003/01/21  Bob Devries
* Fixed problem with trailing space.

         nam   Error
         ttl   Show text error messags

         ifp1
         use   defsfile
         endc

tylg     set   Prgrm+Objct   
atrv     set   ReEnt+rev
rev      set   $00
edition  set   1

         mod   eom,name,tylg,atrv,start,size

name     fcs   /Error/
         fcb   edition

        org     0
path    rmb     1
same    rmb     1
prmptr  rmb     2
prmend  rmb     2
length  rmb     2
parbuff rmb     256
filbuff rmb     256
stack   rmb     350
size    equ     .

start   cmpd    #1              1 char == CR
        lbeq    help
        tfr     d,y            length of parameters
        bsr     open
        bcs     exit
        pshs    u
        leau    parbuff,u       point to buffer
entry0  lda     ,x+
        cmpa    #C$SPAC        is it a space (between parameters?)
        beq     entry1
        cmpa    #C$CR
        bne     nocr
entry1  clra                   yes, null it
nocr    sta     ,u+            store in buffer
        leay    -1,y           decrement length counter
        bne     entry0
        clr     ,u
        tfr     u,y
        puls    u
        sty     <prmend        store end of all parameters
        leax    parbuff,u       load address of parbuff into X
        stx     <prmptr        save parameter pointer
entry2  lda     ,x
        bne     entry3
        leax    1,x
        bra     rered2
entry3  bsr     strlen         go get string length of first param
        std     <length        store it
reread  bsr     readlin        read line from errmsg file
        bcc     rered0
        cmpb    #E$EOF         did we find end-of-file?
        lbeq    unknown        yep, tell user we don't know his error num
rered0  bsr     compare        compare user number with 1st 3 chars of line
        beq     reread         compare returns 0 if failed
        bsr     print          else go print the errmsg line
        bcs     exit           exit if I$WritLn problem
rered1  ldd     <length        get length
        ldx     prmptr         get parameter pointer
        leax    d,x            add length to it
        leax    1,x            increment past null byte
rered2  clrb
        cmpx    <prmend
        bge     exit
        stx     <prmptr        store it
        lbsr    seek0          rewind the file
        bra     entry2         loop around again

exit    os9     F$Exit

open    pshs    x
        leax    errmsg,pcr     point to file name
        lda     #READ.         read mode
        os9     I$Open
        bcs     open0
        sta     <path          store path number
open0   puls    x,pc

readlin pshs    x,y
        lda     <path          get file path number
        ldy     #256           read max 256 bytes
        leax    filbuff,u       into memory pointed to by filbuff
        os9     I$ReadLn
        puls    x,y,pc

print   pshs    x,y,a
        lda     #1             STDOUT
        leax    filbuff,u       point to buffer
        ldy     #256           max of 256 chars
        os9     I$WritLn
        puls    x,y,a,pc

strlen  pshs    x,y
        ldy     #0             initialise count
strl0   tst     ,x+            is it a char > null
        beq     strl1          nope, exit
        leay    1,y            yep, increment count
        bra     strl0          do again
strl1   tfr     y,d            return with length in D
        puls    x,y,pc

compare pshs    x,y
        clr     <same          comparison indicator
        ldx     prmptr         get address of next cmd line param
        leay    filbuff,u       point to file buffer
comp0   lda     ,x+            get char from cmd line
        beq     comp1          is it null (end of param)
        cmpa    ,y+            compare to file buffer
        bne     comp2          not same, exit
        inc     <same          yep, in comparison counter
        bra     comp0          'round again
comp1   lda     ,y
        cmpa    #C$SPAC        was it end of number in errmsg file?
        bne     comp2
        tst     <same          test indicator
        puls    x,y,pc
comp2   clr     <same          clear the counter
        puls    x,y,pc

unknown leax    unkmsg,pcr     point to message
        ldy     #unkmsgl       num of chars to print
        lda     #1             to STDOUT
        os9     I$Write
        lbcs    exit           exit if problem with I$Write
        ldx     prmptr         put pointer into parameter buffer in X
        lda     #1             STDOUT
        ldy     <length        get length of user's param
        os9     I$Write
        lbcs    exit
        lda     #1             STDOUT
        leax    return,pcr     point to CR char
        ldy     #1             print 1 char
        os9     I$WritLn
        lbcs    exit
        ldx     prmptr         put point into parameter buffer in X
        ldd     <length        get length of user's param
        leax    d,x            add to X
        leax    1,x            increment past null byte
        clrb
        cmpx    prmend
        lbge    exit
        stx     <prmptr        store X
        bsr     seek0          rewind file
        lbra    entry2

seek0   pshs    x,u
        lda     <path
        ldx     #0
        ldu     #0
        os9     I$Seek
        puls    x,u,pc

help    leax    hlpmsg,pcr     point to help message
        lda     #2             STDERR
        ldy     #256           max of 256 bytes (arbitrary, really)
        os9     I$WritLn
        lbcs    exit
        leax    hlpmsg2,pcr    2nd line of message
        lda     #2
        ldy     #256
        os9     I$WritLn
        lbcs    exit
        clrb
        lbra    exit

hlpmsg  fcc     /Error  errno [errno...]/
        fcb     C$CR
hlpmsg2 fcc     /Usage: returns error message for given error numbers/
        fcb     C$CR
errmsg  fcc     "/DD/SYS/errmsg"
        fcb     0
unkmsg  fcc     /Unknown error number - /
unkmsgl equ     *-unkmsg
return  fcb     C$CR

        emod
eom     equ     *
        end