; "Special Delivery" boot tracer ; for DOS 3.3P disks ; e.g. Ernie's Quiz, Elite ;------------------------------- ; IDSpecDel ; ; in: $0800..$08FF contains T00,S00 ; first page of track buffer also contains T00,S00 ; A = 0 ; X = 0 ; out: C clear if Special Delivery bootloader found ; C set otherwise ; A = 0 ; X = 0 ; all other registers & flags clobbered ;------------------------------- !macro IDSpecDel { ldy #$08 jsr compare !byte $02 !byte $90,$4A !byte $C6,$27 !byte $BD,$31,$09 ; passport-test-suite/Ernie's Quiz.woz [C=0] matches } ;------------------------------- ; TraceSpecDel ; set up boot trace to capture the bootloader and DOS ; of "Special Delivery" disks (stored in non-sector ; format on tracks 0-2) ;------------------------------- TraceSpecDel ldx #$0F lda #$FF - sta precheck_sectors, x dex bpl - inc precheck_sectors lda #$07 inc precheck_sectors+1 jsr PreCheckT00 jsr ClearTSBuffer lda #$00 ; set a marker to see if entire sta $3FFF ; RWTS loads successfully later ;; lda #$00 ; save zero page before trace ldx #$0A jsr CopyMemory1 jsr MoveT00PakHigh lda #TraceSpecDel2 jmp Trace TraceSpecDel2 lda #$4C sta $0855 lda #TraceSpecDel3 sta $0857 lda #$02 sec jmp $0801 TraceSpecDel3 lda $1212 cmp #$D8 sec bne SDfail ldy #$00 lda $10D1 cmp #$A2 beq + ; passport-test-suite/Ernie's Quiz.woz [Z=1] matches ldy #$04 ; passport-test-suite/Kaves of Karkhan.woz [Z=0] matches + lda #$4C sta $10D1,Y sta $10EC,Y lda #TraceSpecDel4 sta $10D3,Y sta $10EE,Y jmp $1212 TraceSpecDel4 lda $C0E8 ; turn off source drive lda $3FFF cmp #$EA sec bne SDfail lda #$0B ldx #$00 jsr compare3 ; if $1B00 == !byte $4C,$4D,$2A SDfail php lda #$0A ; restore zero page from before trace ldx #$00 jsr CopyMemory1 plp bcc SDsuccess jmp UseUniversal SDsuccess ; ; Restore the original code in memory before writing. ; ldy #$00 lda $10D1 cmp #$4C beq + ldy #$04 + lda #$A2 sta $10D1,Y lda #$FF sta $10D2,Y lda #$9A sta $10D3,Y lda #$A5 sta $10EC,Y lda #$2B sta $10ED,Y lda #$4A sta $10EE,Y ; ; move $1000-$13FF to $1100-$14FF to align it as we need it ; for writing to disk with the Standard Delivery bootloader ; in T00,S00 ; lda #$13 ldx #$14 jsr CopyMemory1 lda #$12 ldx #$13 jsr CopyMemory1 lda #$11 ldx #$12 jsr CopyMemory1 lda #$10 ldx #$11 jsr CopyMemory1 ; $1B00-$1FFF is real code and in the right place ; but we should clear the rest of T00 so we're not ; writing garbage to disk on unused sectors lda #$15 ldx #$00 ldy #$06 jsr ClearMemory ; copy Standard Delivery bootloader into place for T00,S00 ldx #ID_DOS33p jsr ConstructStandardDelivery ; maybe say we're writing a bootloader bit gMode ; don't say we're writing a bootloader in verify-only mode, bpl + ; that's scary jsr PrintByID !byte s_bootwrite + ; now manually write out track 0 with Standard Delivery ; bootloader jsr IncProgress lda #$00 sta gTrack jsr WriteTrackNA ; doesn't really write anything in verify-only mode ; manually write out track 1 jsr IncProgress inc gTrack lda #$10 tax tay asl jsr CopyMemory jsr WriteTrackNA ; doesn't really write anything in verify-only mode ; manually write out track 2 with a patched RWTS jsr IncProgress inc gTrack lda #$30 ldx #$10 ldy #$10 jsr CopyMemory lda #$08 ldx #$B6 ldy #$04 jsr modify !byte $C9,$AD,$90,$E5 lda #$18 ldx #$38 jsr CopyMemory1 jsr WriteTrackNA ; doesn't really write anything in verify-only mode lda #$C9 sta $38B6 lda #$AD sta $38B7 lda #$90 sta $38B8 lda #$E5 sta $38B9 ; mark tracks 0-2 as "skip" in sector map ldy #$2F lda #kSectorIgnore skipsectors sta T00,y dey bpl skipsectors ; set up RWTS entry point lda #$D5 sta jCallRWTS+1 lda #$36 sta jCallRWTS+2 ; read the rest of the disk with the original RWTS lda #$03 sta gLastTrack jmp ADStyle