On Sat, 9 Aug 2003 06:20:20 EDT, [EMAIL PROTECTED] wrote:

> Hmm - one of my old machine code extensions reports an error on QL2K (oddly 
> enough, it reports Channel Not Open when I use d$=SAV_DEV$).
> 
> Can anyone spot anything wrong with the code - I wonder if I have cocked up 
> the return stack...
> 
> Sorry about the mess - I cannot find the original assembler, so had to use 
> DEA to get the source back...
> 
> *  Start of Deassembly Code - Dea v5.2 Plus 3
> *  Original file: WIN2_NEMESIS_HDEV_cde
> *  Code execution starts at $10000 with label Lab10000
> 
> START_CODE 
> Lab10000  lea       lab1000a,a1
>           movea.w   $0110,a0            ; SB.INIPR
>           jmp       (a0)
> 
> *  Def SB extensions
> Lab1000A  dc.w      0
>           dc.w      0
>           dc.w      2
>           dc.w      lab1001e-*
>           dc.b      8
>           dc.b      'SAV_DEV$'
>           dc.b      0
>           dc.w      0
> *  End SB ext

That last 'dc.b 0' should be removed, although it will not make a
difference here given their is no more function name after that one
and that the following bytes are 0 as well...
The number of bytes in the name table must be kept even: as
SAV_DEV$ counts 8 bytes, you don't need for a padding null byte.
 
> Lab1001E  moveq     #0,d1
>           moveq     #0,d0
>           move.w    lab10076,d1
>           beq       lab1006a
>           btst      #0,d1
>           beq.s     lab10032
>           addq.l    #1,d1
> Lab10032  addq.l    #2,d1
>           move.l    d1,d5
>           movea.l   $58(a6),a1
>           movea.w   $011a,a0            ; QA.RESRI
>           jsr       (a0)
>           movea.l   $58(a6),a1
>           suba.l    d5,a1
>           move.l    a1,$58(a6)
>           movea.l   a1,a2
>           lea       lab10076,a0
>           moveq     #0,d0
>           move.w    (a0)+,d0
>           move.w    d0,0(a6,a2.l)
>           subq.l    #1,d0
> Lab1005A  move.b    (a0)+,2(a6,a2.l)
>           addq.l    #1,a2
>           dbf       d0,lab1005a
>           moveq     #1,d4
>           moveq     #0,d0
>           rts
> 
> Lab1006A  moveq     #-$0c,d0            ; ERR.INAM
>           rts
> 
> Lab1006E  dc.l      '<<QDRV>>'
> 
> Lab10076  dc.w      13
>           dc.b      'win2_NEMESIS_'
> 
> Lab10085  dc.b      0
> Lab10086  ds.b      34
> END_CODE  
>           end
> *  End of Deasm


The code seems correct although far than optimized. I'd propose:

Lab1001E    moveq     #0,d5              Clear MS word.
            lea       Lab10076,a4        Name string address
            move.w    (a2)+,d5           Name length
            addq.l    #3,d5              | Take length word into account
            bclr      #0,d5              |  and round up to word boundary
            move.l    d5,d1              Number of bytes to reserve
            movea.l   $58(a6),a1         Arithmetic stack address.
            movea.w   $011a,a0           QA.RESRI
            jsr       (a0)               Reserve the space on the stack
            movea.l   $58(a6),a1         New stack address
            suba.l    d5,a1              Make space for the string
            move.l    a1,$58(a6)         Store the new top of stack
            movea.l   a1,a2              Copy of stack pointer
            lsr.l     #1,d5              | Number of words to transfer
            subq.l    #1,d5              |
Lab1005A    move.w    (a4)+,0(a6,a2.l)   Transfer a word.
            addq.l    #2,a2              Increment stack pointer
            dbf       d5,Lab1005A        Continue until end of name.
            moveq     #1,d4              Parameter on stack = string
            moveq     #0,d0              No error
            rts                          retuns...

Lab1006E    dc.b      '<<QDRV>>'

Lab10076    dc.w      13
            dc.b      'win2_NEMESIS_'
Lab10086    ds.b      35

The above is tested and working.

QDOS/SMS forever !

Thierry ([EMAIL PROTECTED]).

Reply via email to