; "Special Delivery" boot tracer ; for DOS 3.3P disks ; e.g. Ernie's Quiz, Elite ;------------------------------- ; IDSpecDel ; returns C clear if "Special Delivery" bootloader ; detected in T00,S00 ;------------------------------- IDSpecDel lda #$00 tax ldy #$58 jsr compare !byte $02,$90,$4A,$C6,$27,$BD,$31,$09 !byte $49,$B0,$48,$C6,$3D,$98,$C8,$48 !byte $CE,$00,$08,$A9,$20,$C6,$27,$48 !byte $51,$26,$91,$26,$AA,$A5,$27,$85 !byte $32,$CE,$00,$08,$A8,$B5,$33,$84 !byte $29,$84,$21,$8A,$A2,$17,$86,$31 !byte $D5,$33,$A6,$2B,$5D,$31,$09,$85 !byte $29,$5D,$32,$09,$C6,$3D,$85,$28 !byte $5D,$33,$09,$85,$48,$A0,$2B,$84 !byte $20,$C6,$40,$30,$3E,$24,$40,$30 !byte $33,$24,$24,$24,$24,$40,$40,$40 rts ;------------------------------- ; 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 inc precheck_sectors+7 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 ldy #$01 jsr CopyMemory 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 ldy #$03 jsr compare ; if $1B00 == !byte $4C,$4D,$2A SDfail php lda #$0A ; restore zero page from before trace ldx #$00 ldy #$01 jsr CopyMemory 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 ldy #$01 jsr CopyMemory lda #$12 ldx #$13 ldy #$01 jsr CopyMemory lda #$11 ldx #$12 ldy #$01 jsr CopyMemory lda #$10 ldx #$11 ldy #$01 jsr CopyMemory ; $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 lda #s_bootwrite jsr PrintByID + ; 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 ldy #$01 jsr CopyMemory 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