diff --git a/directi-dos.zip b/directi-dos.zip new file mode 100644 index 0000000..10e0253 Binary files /dev/null and b/directi-dos.zip differ diff --git a/fstbt.s b/fstbt.s new file mode 100644 index 0000000..f28355b --- /dev/null +++ b/fstbt.s @@ -0,0 +1,107 @@ +;fast boot-loader in one sector +;"special delivery" version for Directi-DOS +;copyright (c) Peter Ferrie 2016 +;thanks to 4am for inspiration and testing +;assemble using ACME +!cpu 6502 +!to "fstbt",plain +*=$800 + +!byte 1 + + tay ;A is last read sector+1 on entry + lda $C081 ;bank in ROM while leaving RAM write-enabled if it was before + + ;check array before checking sector number + ;allows us to avoid a redundant seek if all slots are full in a track, + ;and then the list ends + +incindex + inc adrindex + 1 ;select next address + +adrindex + lda adrtable - 1 ;15 entries in first row, 16 entries thereafter + sta $4FB ;set 80-column state (final store is an #$FF to disable it) + cmp #$FF + beq jmpoep ;#$C0 means end of data + sta $27 ;set high part of address + + ;2, 4, 6, 8, $0A, $0C, $0E + ;because PROM increments by one itself + ;and is too slow to read sectors in purely incremental order + ;so we offer every other sector for read candidates + + iny + cpy #$10 + bcc setsector ;cases 1-$0F + beq sector1 ;finished with $0E + ;next should be 1 for 1, 3, 5, 7... sequence + + ;finished with $0F, now we are $11, so 16 sectors done + + jsr seek ;returns A=0 + + ;back to 0 + + tay + !byte $2C ;mask LDY #1 +sector1 + ldy #1 + +setsector + sty $3D ;set sector + iny ;prepare to be next sector in case of unallocated sector + lda $27 + beq incindex ;empty slot, back to the top + + ;convert slot to PROM address + + txa + lsr + lsr + lsr + lsr + tay + ora #$C0 + pha + lda #$5B ;read-1 + pha + lda #2 + sta $478, y ;save current phase for DOS use when we exit + lda $C083 + lda $C083 ;write-enable RAM and bank it in so read can decode + rts ;return to PROM + +seek + inc $41 ;next track + asl $40 ;carry clear, phase off + jsr seek1 ;returns carry set, not useful + clc ;carry clear, phase off + +seek1 + jsr delay ;returns with carry set, phase on + inc $40 ;next phase + +delay + lda $40 + and #3 + rol + ora $2B ;merge in slot + tay + lda $C080, y + lda #$30 + jmp $FCA8 ;common delay for all phases + +jmpoep + jsr $FE89 ;rehook keyboard (needed particularly after PR#) + jsr $FE93 ;rehook video + jsr $FB2F ;text mode + sta $C00C + sta $C00E ;clear 80-column mode + lda $C083 ;bank in our RAM, write-enabled + jmp $D000 ;jump to unpacker + +adrtable +!byte $dd,$dc,$db,$da,$d9,$d8,$d7,$d6,$d5,$d4,$d3,$d2,$d1,$d0,$de +!byte $df,$ed,$ec,$eb,$ea,$e9,$e8,$e7,$e6,$e5,$e4,$e3,$e2,$e1,$e0,$ee +!byte $FF ;end of list diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..e1a82be --- /dev/null +++ b/readme.md @@ -0,0 +1,2 @@ +This is Diversi-DOS for the Apple II, crammed into two tracks, and loading directly into the Language Card.
+Powered by the Standard Delivery loader, and aPLib compression.