;*****  IFF-Demo-Programm  6/87  S.D.  *****
;From the Abacus book Amiga System Programming Guide
;Start AssemPro from CLI for debugging, Run program only from the CLI

OpenLib =-408
closelib=-414
ExecBase=4

Open    =-30
Close   =-36
Seek    =-66
Read    =-42
Write   =-48
mode_old=1005

key = $bfec01               ;Alternate key status

run:
     move.l execbase,a6     ;Pointer to EXEC library
     lea    dosname(pc),a1
     moveq  #0,d0
     jsr    openlib(a6)     ;Open DOS library
     move.l d0,dosbase
     beq    error

     move.l #consolname,d1  ;Console definition
     move.l #mode_old,d2
     move.l dosbase,a6
     jsr    open(a6)        ;Open CON: window
     beq    error
     move.l d0,conhandle

     move.l #filename,d1
     move.l #mode_old,d2
     move.l dosbase,a6
     jsr    open(a6)        ;Open file
     beq    error
     move.l d0,filehandle

loop:
     cmp.b  #$37,key        ;Alternate pressed?
     beq    qu              ;YES: break

     move.l #-1,d0
del:
     dbra   d0,del          ;Short pause for reading...

     bsr    read4           ;Read declarator
     beq    qu              ;EOF
     bmi    error           ;Error

     move.l conhandle,d1
     move.l #buffer,d2      ;Buffer address
     move.l #6,d3           ;4 characters
     jsr    write(a6)       ;Display declarator
     beq    error

     move.l buffer,d5       ;Reserve declarator
     cmp.l  #'FORM',d5      ;FORM?
     bne    noform          ;NO
     st     flag            ;Else set flag
     bra    form            ;and continue

noform:
     tst    flag            ;Identifier?
     beq    form            ;NO
     clr    flag            ;Else clear flag
     move.l #'----',outbuff ;Identification
     bsr    print
     bra    loop            ;and continue

form:
     bsr    read4           ;Read length
     beq    qu              ;EOF
     bmi    error           ;Error
     move.l buffer,d0       ;Value in D0
     bsr    phex            ;and display

     cmp.l  #'FORM',d5      ;FORM?
     beq    loop            ;YES:Next

     move.l filehandle,d1
     move.l buffer,d2
     addq.l #1,d2
     bclr   #0,d2           ;For even addresses
     move.l #0,d3           ;Mode: OFFSET_CURRENT
     jsr    Seek(a6)        ;Look for next part
     bra    loop            ;Continue....

qu:
     move.l conhandle,d1
     move.l #endtext,d2     ;End of text
     move.l #25,d3
     jsr    Write(a6)       ;Output

     move.l conhandle,d1
     move.l #buffer,d2      ;Buffer address
     move.l #1,d3           ;1 character
     jsr    Read(a6)        ;Read this character
     bra    ende

error:
ende:
     move.l conhandle,d1    ;Close the window
     move.l dosbase,a6
     jsr    Close(a6)

     move.l filehandle,d1   ;Close file
     jsr    Close(a6)

     move.l dosbase,a1      ;DOS.Lib closed
     move.l execbase,a6
     jsr    CloseLib(a6)

     rts                    ;done

read4:                      ;Read 4 characters
     move.l filehandle,d1
     move.l #buffer,d2      ;Buffer address
     move.l #4,d3           ;Read 4 characters
     jmp    Read(a6)

phex:                       ;Display D0 hex
     lea    outbuff,a0
     move   d0,d2
     move   #3,d3           ;4 numbers
niblop:
     rol    #4,d2           ;Move left nibble down
     move   d2,d1
     and    #$f,d1          ;Mask it off
     add    #$30,d1         ;Make it ASCII
     cmp    #'9',d1         ;Is it a number?
     bls    nibok           ;YES
     add    #7,d1           ;else correct it
nibok:
     move.b d1,(a0)+        ;Character in output buffer
     dbra   d3,niblop       ;Continue loop
     move.b #$a,(a0)        ;Return to End

print:
     move.l dosbase,a6
     move.l conhandle,d1
     move.l #outbuff,d2     ;Output  buffer
     move.l #5,d3           ;5 characters
     jmp    Write(a6)       ;Output

 align                      ;even
dosbase:    dc.l 0
conhandle:  dc.l 0
filehandle: dc.l 0
flag:       dc.w 0
outbuff:    dc.b '      '
buffer:     dc.b '      '
consolname: dc.b 'RAW:0/10/400/100/** IFF-Format',0
dosname:    dc.b 'dos.library',0
filename:   dc.b 'df0:dragon.iff',0  ;IFF file from BeckerText Amiga
endtext:    dc.b '** Please press a key! **'

 align                      ;even
 
 end



