ExecBase: EQU 4 AllocSignal: EQu -$14a findtask: equ -$126 freesignal: equ -$150 allocmem: equ -$c6 freemem: equ -$d2 addport: equ -$162 remport: equ -$168 opendevice: equ -$1bc closedevice: equ -$1c2 doio: equ -$1c8 waitio: equ -$1d8 alert: equ -$6c closelibrary: equ -$19e openlibrary: equ -$228 open: equ -$1e close: equ -$24 read: equ -$2a write: equ -$30 input: equ -$36 output: equ -$3c lock: equ -$54 examine: equ -$66 fibsize: equ 300 filesize: equ 124 CMD_reset: equ 1 CMD_read: equ 2 CMD_write: equ 3 CMD_update: equ 4 CMD_clear: equ 5 CMD_stop: equ 6 CMD_start: equ 7 CMD_flush: equ 8 TD_motor: equ 9 TD_seek: equ 10 TD_format: equ 11 TD_remove: equ 12 TD_changenum: equ 13 TD_changestate: equ 14 TD_protstatus: equ 15 io_command: equ 28 io_error: equ 30 io_actual: equ 32 io_lenght: equ 36 io_data: equ 40 io_offset: equ 44 blocklongpos: equ $b8 start: move.l execbase,a6 move.l #dosname,a1 clr.l d0 jsr openlibrary(a6) move.l d0,dosbase beq nodos move.l #welcome,a0 bsr print move.l #quest1,a0 bsr print move.l bootname,a0 bsr print move.l #quest2,a0 bsr print bsr getchars move.b #0,-1(a0,d0) ;return loeschen cmp.w #1,d0 bne default move.l bootname,a0 default: move.l #1024,d1 ;minimalgr. wg. checksum bsr getfile move.l d0,fileort move.l d1,filelenght beq nofile add.w #511,d1 lsr.l #8,d1 lsr.l #1,d1 sub.w #2,d1 cmp.w #0,d1 bgt ok move.w #0,d1 ok: move.w d1,filesects move.l #quest3,a0 bsr print bsr getchars move.l #0,d0 bsr gettrackdisk move.l execbase,a6 move.l #$0800,d0 move.l #$10001,d1 jsr allocmem(a6) move.l d0,tdbuffer bne goon1 move.l #notdmem,a0 bsr print bra cleanup3 goon1: bsr motoron move.l tdbuffer,a0 move.l #1024,d0 move.l diskrequest,a1 move.l #880,d1 bsr dread move.l tdbuffer,a0 add.l #$13c,a0 move.l (a0),d1 move.l d1,bitmapsektor add.l #$2c4,a0 move.l diskrequest,a1 move.l #$400,d0 bsr dread move.l tdbuffer,a0 add.l #$400,a0 move.l 4(a0),d0 move.w #0,d1 clr.l d2 move.l #2,d3 move.l #3,d4 move.w filesects,d5 secloop: btst d1,d0 beq nomore cmp.w d5,d2 bhs hab_genug bclr d1,d0 bset d3,d4 hab_genug: add.l #1,d2 nomore: addi.w #1,d1 addi.w #1,d3 cmp.w #20,d1 blt secloop move.l d0,4(a0) move.w d2,tracksects move.l d4,blocklong move.l #mengemsg,a0 bsr print clr.l d0 move.w tracksects,d0 bsr itoa bsr print move.l #menge2msg,a0 bsr print move.w tracksects,d2 cmp.w filesects,d2 bhi goon2 move.l #stillused,a0 bsr print bra cleanup4 goon2: move.l fileort,a0 move.l blocklong,d4 move.l d4,blocklongpos(a0) bsr bootblockchecksum move.l #$200,d0 move.l #$0,d1 clr.l d3 wrloop: bclr d3,d4 beq dontwrite bsr dwrite bne cleanup4 add.l #$200,a0 dontwrite: add.w #1,d3 add.l #$200,d1 tst.l d4 bne wrloop jsr dupdate move.l tdbuffer,a0 add.l #$400,a0 bsr bitmapchecksum move.l bitmapsektor,d1 move.l #512,d0 lsl.l #8,d1 lsl.l #1,d1 bsr dwrite bne cleanup4 bsr dupdate move.l #goodinstall,a0 bsr print cleanup4: bsr motoroff cleanup3: move.l execbase,a6 move.l tdbuffer,a1 move.l #$0800,d0 jsr freemem(a6) move.l execbase,a6 move.l fileort,a1 move.l filelenght,d0 jsr freemem(a6) move.l diskrequest,a1 bsr closetrackdisk nofile: move.l execbase,a6 move.l dosbase,a1 jsr closelibrary(a6) nodos: move.l oldcheck,d0 move.l newcheck,a0 ;illegal clr.l d0 rts fileort: dc.l 0 filelenght: dc.l 0 filesects: dc.w 0 tracksects: dc.w 0 bitmapsektor: dc.l 0 tdbuffer: dc.l 0 blocklong: dc.l 0 bootname: dc.l bn bn: dc.b "df1:boottrack",0 even bootblockchecksum: movem.l d0-d3/a0-a1,-(a7) clr.l d0 clr.l d2 clr.l d3 move.l #$ff,d1 move.l a0,a1 clr.l $4(a0) move.w #$4,ccr bo_checkloop: move.l (a0)+,d2 addx.l d2,d0 dbra d1,bo_checkloop move.l #-1,d1 subx.l d0,d1 move.l d1,$4(a1) move.l d1,test movem.l (a7)+,d0-d3/a0-a1 rts bitmapchecksum: movem.l d0-d3/a0-a1,-(a7) clr.l d0 clr.l d2 clr.l d3 move.l a0,a1 move.l (a0),oldcheck clr.l (a0) move.w #$7f,d1 bm_checkloop: move.l (a0)+,d2 sub.l d2,d0 dbra d1,bm_checkloop move.l d0,(a1) move.l d0,newcheck movem.l (a7)+,d0-d3/a0-a1 rts itoa: move.l #ascii_zahl+6,a0 move.l #0,-4(a0) move.w #0,-6(a0) w_loopi: divu #10,d0 swap d0 addi.w #"0",d0 move.b d0,-(a0) clr.w d0 swap d0 cmp.w #0,d0 bne w_loopi rts even ascii_zahl: blk.b 7,0 even motoron: move.l diskrequest,a1 move.w #td_motor,io_command(a1) move.l #1,io_lenght(a1) move.l execbase,a6 jsr doio(a6) rts motoroff: move.l diskrequest,a1 move.w #td_motor,io_command(a1) move.l #0,io_lenght(a1) move.l execbase,a6 jsr doio(a6) rts dcheckwp: movem.l d0-d7/a0-a6,-(a7) move.l diskrequest,a1 move.w #td_protstatus,io_command(a1) move.l execbase,a6 jsr doio(a6) move.l diskrequest,a1 move.l io_actual(a1),d0 movem.l (a7)+,d0-d7/a0-a6 rts dread: lsl.l #8,d1 lsl.l #1,d1 move.w #cmd_read,io_command(a1) move.l d1,io_offset(a1) move.l a0,io_data(a1) move.l d0,io_lenght(a1) move.l execbase,a6 jsr doio(a6) rts even dwrite: movem.l d0-d7/a0-a6,-(a7) bsr dcheckwp beq notprotected move.l #wpon,a0 bsr print move.b #1,d0 bra endofwrite notprotected: move.l diskrequest,a1 move.l d1,io_offset(a1) move.w #cmd_write,io_command(a1) move.l d0,io_lenght(a1) move.l a0,io_data(a1) move.l execbase,a6 jsr doio(a6) move.b #0,d0 endofwrite: movem.l (a7)+,d0-d7/a0-a6 rts dupdate: movem.l d0-d7/a0-a6,-(a7) move.l diskrequest,a1 move.w #cmd_update,io_command(a1) move.l execbase,a6 jsr doio(a6) movem.l (a7)+,d0-d7/a0-a6 rts gettrackdisk: move.l d0,unit move.l #0,a0 move.b #0,d0 bsr createport move.l a0,diskport beq gt_fail1 move.l #56,d0 bsr createextio move.l a0,diskrequest beq gt_fail2 move.l execbase,a6 move.l #diskname,a0 move.l unit,d0 move.l diskrequest,a1 move.l #0,d1 jsr opendevice(a6) tst.l d0 bne gt_fail3 move.l diskrequest,a1 rts gt_fail1: move.l #0,a1 rts closetrackdisk: move.l a1,diskrequest move.l execbase,a6 move.l diskrequest,a1 jsr closedevice(a6) gt_fail2: move.l diskrequest,a0 bsr deleteextio gt_fail3: move.l diskport,a0 bsr deleteport move.l #0,a1 rts unit: dc.l 0 diskport: dc.l 0 diskrequest: dc.l 0 diskname: dc.b "trackdisk.device",0 even even createport: move.l a0,name move.b d0,prio move.l execbase,a6 move.b #-1,d0 jsr allocsignal(a6) move.b d0,sigbit bmi.l nosignal move.l execbase,a6 move.l #$10001,d1 move.l #34,d0 jsr allocmem(a6) move.l d0,port beq nomemory move.l d0,a0 move.l name,10(a0) move.b prio,9(a0) move.b #4,8(a0) move.b #0,14(a0) move.b sigbit,15(a0) move.l execbase,a6 move.l #0,a1 jsr findtask(a6) move.l d0,16(a0) cmpi.l #0,name beq donewlist move.l execbase,a6 move.l port,a1 jsr addport(a6) bra.s rts donewlist: lea 20(a0),a0 bsr newlist rts: move.l port,a0 rts nosignal: clr.l port bra.s rts nomemory: move.l execbase,a6 clr.l d0 move.b sigbit,d0 jsr freesignal(a6) bra.s nosignal even port: dc.l 0 sigbit: dc.b 0 prio: dc.b 0 name: dc.l 0 deleteport: cmpi.l #0,10(a0) beq noremport move.l a0,-(a7) move.l execbase,a6 move.l a0,a1 jsr remport(a6) move.l (a7)+,a0 noremport: move.b #$ff,8(a0) move.l #-1,20(a0) move.l a0,-(a7) move.l execbase,a6 clr.l d0 move.b 15(a0),d0 jsr freesignal(a6) move.l execbase,a6 move.l (a7)+,a1 move.l #34,d0 jsr freemem(a6) rts lh_tail: equ 4 lh_tailpred: equ 8 newlist: move.l a0,(a0) addq.l #lh_tail,(a0) clr.l lh_tail(a0) move.l a0,lh_tailpred(a0) rts createextio: cmpi.l #0,a0 beq noreplyport move.w d0,size move.l a0,replyport move.l execbase,a6 move.l #$10001,d1 jsr allocmem(a6) move.l d0,a0 beq nomemory2 move.b #5,8(a0) move.w size,18(a0) move.l replyport,14(a0) rts noreplyport: nomemory2: move.l #0,a0 rts size: dc.w 0 replyport: dc.l 0 deleteextio: cmpi.l #0,a0 beq rts2 move.b #$ff,8(a0) move.l #-1,20(a0) move.l #-1,24(a0) move.l execbase,a6 move.w 18(a0),d0 move.l a0,a1 jsr freemem(a6) rts2: rts createstdio: move.l #32,d0 bsr createextio rts deletestdio: bsr deleteextio rts align 4 getfile: move.l a0,filename move.l d1,buffersize move.l dosbase,a6 move.l filename,d1 move.l #1005,d2 jsr lock(a6) move.l d0,filelock beq rts move.l execbase,a6 move.l #fibsize,d0 move.l #$10001,d1 jsr allocmem(a6) move.l d0,fileinfoblock beq arts move.l dosbase,a6 move.l filelock,d1 move.l fileinfoblock,d2 jsr examine(a6) cmpi.w #0,d0 beq freefib move.l fileinfoblock,a0 move.l filesize(a0),d0 addi.l #16,d0 cmp.l buffersize,d0 blt gross_genug move.l d0,buffersize gross_genug: move.l execbase,a6 move.l buffersize,d0 move.l #$10003,d1 jsr allocmem(a6) move.l d0,buffer beq freefib move.l dosbase,a6 move.l filename,d1 move.l #1005,d2 jsr open(a6) move.l d0,handle beq freebuf move.l dosbase,a6 move.l handle,d1 move.l buffer,d2 move.l buffersize,d3 jsr read(a6) cmpi.w #0,d0 beq freebuf closeit: move.l dosbase,a6 move.l handle,d1 jsr close(a6) freefib: move.l execbase,a6 move.l #fibsize,d0 move.l fileinfoblock,a1 jsr freemem(a6) move.l buffer,d0 arts: move.l buffersize,d1 rts freebuf: move.l execbase,a6 move.l buffersize,d0 move.l buffer,a1 jsr freemem(a6) move.l #0,buffer bra closeit handle: dc.l 0 filelock: dc.l 0 fileinfoblock: dc.l 0 buffer: dc.l 0 buffersize: dc.l 0 dosbase: dc.l 0 filename: dc.l 0 dosname: dc.b 'dos.library',0 even print: move.l a0,-(a7) move.l dosbase,a6 jsr output(a6) move.l d0,d1 move.l (a7)+,a0 move.l a0,d2 andi.w #-2,d2 nullfind: tst.b (a0)+ bne.s nullfind move.l a0,d3 sub.l d2,d3 move.l dosbase,a6 jsr write(a6) rts getchars: move.l dosbase,a6 jsr input(a6) move.l d0,d1 move.l #inbuffer,d2 move.l #80,d3 move.l dosbase,a6 jsr read(a6) move.l #inbuffer,a0 rts inbuffer: blk.b 40,0 test: dc.l 0 oldcheck: dc.l 0 newcheck: dc.l 0 even notdmem: dc.b "Kann keinen speicher fur den trackdisk-" dc.b "Buffer allokieren !",10,0 even stillused:dc.b "Tut mir leid, aber auf dieser disk ist " dc.b "kein Platz mehr fur den Boot-Track!",10,0 even welcome: dc.b "BIGBOOT",10 dc.b "BY REPLICA COPY CREW 1988",10 dc.b "ich versuche die installation ",10,0 quest1: dc.b "wie ist der filename des zu installierenden" dc.b "files ?",10,"(return =",34,0 quest2: dc.b 34,")",10,0 quest3: dc.b "bitte legen sie nun die disk auf der ich" dc.b "installieren soll in df0:",10 dc.b "und drucken sie return ",10,0 mengemsg: dc.b "auf dieser disk sind ",0 menge2msg:dc.b " freie sektoren. ",0 wpon: dc.b "diskette isr schreibgeschutzt!",10,0 goodinstall: dc.b "der boottrack ist nun installiert,",10 dc.b "viel spass damit ! ",10,0