 ;Install.Written by Kamran Karimi.It istalls two routines at the DoIO and
 ;SendIO vectors.To be Assembled with Cape Assembler and linked with blink
 ;to produce SofTrack
 

ExecBase equ 4
PutMsg equ -366
Allocmem equ -198
FreeMem equ -210
DoIo equ -454
SendIo equ -460

 XDEF _Install
 XREF _Port

_Install:
 move.l  a6,-(a7)
 move.l  ExecBase,a6
 move.l  DoIo(a6),SaveDoIo
 move.l  SendIo(a6),SaveSendIo
 lea     MessageD,a1
 move.b  #5,8(a1)      ;message type
 move.w  #6,18(a1)      ;message length
 lea     MessageS,a1
 move.b  #5,8(a1)     ;message type
 move.w  #6,18(a1)  
 move.l  ExecBase,a6
 move.l  _Port,PortD
 move.l  _Port,PortS
 beq     End_Main
 move.l  #EndeDoIo-BeginDoIo,d0
 move.l  #$10000,d1
 jsr     Allocmem(a6)
 move.l  d0,ReservedDoIo
 beq     End_Main
 move.l  #EndeSendIo-BeginSendIo,d0
 jsr     Allocmem(a6)
 move.l  d0,ReservedSendIo
 bne     MemAllocated
 move.l  ReservedDoIo,a1
 move.l  #EndeDoIo-BeginDoIo,d0
 jsr     FreeMem(a6)
 bra     End_Main
MemAllocated: 
 move.l  #BeginDoIo,a0
 move.l  ReservedDoIo,a1
 move.l  #EndeDoIo-BeginDoIo,d0
 subi.l  #1,d0
lop1:
 move.b  (a0)+,(a1)+
 dbra    d0,lop1
 move.l  ReservedDoIo,DoIo(a6)

 move.l  #BeginSendIo,a0
 move.l  ReservedSendIo,a1
 move.l  #EndeSendIo-BeginSendIo,d0
 subi.l  #1,d0
lop2:
 move.b  (a0)+,(a1)+
 dbra    d0,lop2
 move.l  ReservedSendIo,SendIo(a6)
 moveq   #0,d0
 bra     Payan
End_Main:
 move.l  #10,d0
Payan:             ;in Persian (Parsi or Farsi, as we call it) means end
 move.l (a7)+,a6
 rts

ReservedDoIo:   dc.l 0
ReservedSendIo: dc.l 0

BeginDoIo:
 movem.l d0/d1/d2/d3/d4/a0/a1/a2/a3/a4/a6,-(a7)
 move.l  20(a1),a2
 move.l  10(a2),a3
 move.l  #15,d0
 lea     TrackNameD(pc),a4
lop2D:
 cmpm.b  (a3)+,(a4)+
 bne     EnditD
 dbra    d0,lop2D
 lea     MessageD(pc),a2
 move.l  24(a1),a4
 move.b  $41(a4),d0
 btst.b  #3,d0
 bne     df1D
 move.b  #0,20(a2)
 bra     ContD
df1D:
 btst.b  #4,d0
 bne     df2D
 move.b  #1,20(a2)
 bra     ContD
df2D:
 btst    #5,d0
 bne     df3D
 move.b  #2,20(a2)
 bra     ContD
df3D:
 btst.b  #6,d0
 bne     EnditD
 move.b  #3,20(a2)
ContD:
 move.b  #'R',26(a2)
 move.w  28(a1),d0         ;d0 has command
 andi.w  #$00ff,d0
 cmpi.w  #2,d0
 beq     TrackChangeD
 cmpi.w  #10,d0
 beq     TrackChangeD
 cmpi.w  #16,d0
 beq     TrackChangeD
 move.b  #'W',26(a2)
 cmpi.w  #3,d0
 beq     TrackChangeD
 cmpi.w  #11,d0
 beq     TrackChangeD
 cmpi.w  #17,d0
 beq     TrackChangeD
 bra     EnditD

TrackChangeD:
 moveq   #0,d4  
 move.l  #16,d2
 move.l  44(a1),d1  ;sector offset
 move.l  #11264,d3
 divu    d3,d1     ;track
 andi.l  #$0000ffff,d1
 divu    #100,d1
 addi.b  #48,d1
 cmp.b   #'0',d1
 bne     NZD1
 move.b  #' ',d1
 moveq   #1,d4
NZD1:
 move.b  d1,22(a2)
 lsr.l   d2,d1
 divu    #10,d1
 addi.b  #48,d1
 tst     d4
 beq     NZD2
 cmp.b   #'0',d1
 bne     NZD2
 move.b  #' ',d1
NZD2:
 move.b  d1,23(a2)
 lsr.l   d2,d1
 addi.b  #48,d1
 move.b  d1,24(a2)

 move.l  ExecBase,a6
 move.l  PortD(pc),a0
 lea     MessageD(pc),a1
 jsr     PutMsg(a6)

EnditD:
 movem.l (a7)+,d0/d1/d2/d3/d4/a0/a1/a2/a3/a4/a6
 move.l  SaveDoIo(pc),-(a7)
 rts


SaveDoIo:   dc.l 0
MessageD:   ds.b 20
            dc.w 0
            dc.b "000  ",0
PortD:      dc.l 0
TrackNameD: dc.b "trackdisk.device",0,0
EndeDoIo:


BeginSendIo:
 movem.l d0/d1/d2/d3/d4/a0/a1/a2/a3/a4/a6,-(a7)
 move.l  20(a1),a2
 move.l  10(a2),a3
 move.l  #15,d0
 lea     TrackNameS(pc),a4
lop2S:
 cmpm.b  (a3)+,(a4)+
 bne     EnditS
 dbra    d0,lop2S
 lea     MessageS(pc),a2
 move.l  24(a1),a4
 move.b  $41(a4),d0
 btst.b  #3,d0
 bne     df1S
 move.b  #0,20(a2)
 bra     ContS
df1S:
 btst.b  #4,d0
 bne     df2S
 move.b  #1,20(a2)
 bra     ContS
df2S:
 btst.b  #5,d0
 bne     df3S
 move.b  #2,20(a2)
 bra     ContS
df3S:
 btst.b  #6,d0
 bne     EnditS
 move.b  #3,20(a2)
ContS:
 move.b  #'R',26(a2)
 move.w  28(a1),d0         ;d0 has command
 andi.w  #$00ff,d0
 cmpi.w  #2,d0
 beq     TrackChangeS
 cmpi.w  #10,d0
 beq     TrackChangeS
 cmpi.w  #16,d0
 beq     TrackChangeS
 move.b  #'W',26(a2)
 cmpi.w  #3,d0
 beq     TrackChangeS
 cmpi.w  #11,d0
 beq     TrackChangeS
 cmpi.w  #17,d0
 beq     TrackChangeS
 bra     EnditS

TrackChangeS:
 moveq   #0,d4 
 move.l  #16,d2
 move.l  44(a1),d1  ;sector offset
 move.l  #11264,d3
 divu    d3,d1     ;track
 andi.l  #$0000ffff,d1
 divu    #100,d1
 addi.b  #48,d1
 cmp.b   #'0',d1
 bne     NZS1
 move.b  #' ',d1
 moveq   #1,d4
NZS1:
 move.b  d1,22(a2)
 lsr.l   d2,d1
 divu    #10,d1
 addi.b  #48,d1
 tst     d4
 beq     NZS2
 cmp.b   #'0',d1
 bne     NZS2
 move.b  #' ',d1
NZS2:
 move.b  d1,23(a2)
 lsr.l   d2,d1
 addi.b  #48,d1
 move.b  d1,24(a2)

 move.l  ExecBase,a6
 move.l  PortS(pc),a0
 lea     MessageS(pc),a1
 jsr     PutMsg(a6)

EnditS:
 movem.l (a7)+,d0/d1/d2/d3/d4/a0/a1/a2/a3/a4/a6
 move.l  SaveSendIo(pc),-(a7)
 rts


SaveSendIo: dc.l 0
MessageS:   ds.b 20
            dc.w 0
            dc.b "000  ",0
PortS:      dc.l 0
TrackNameS: dc.b "trackdisk.device",0,0
EndeSendIo:

 end
