From f7c762e7d7196a94b0f1d0bb5fcc4baa50917bf0 Mon Sep 17 00:00:00 2001 From: Date: Sat, 12 Dec 2020 23:26:16 -0500 Subject: [PATCH] Add initial firmware for EPROM --- Firmware/Driver.lst | 2 +- Firmware/Firmware.asm | 196 ++++++++++++++++++++++++++++++++++++ Firmware/Firmware.bin | Bin 0 -> 1792 bytes Firmware/driver_assemble.sh | 8 ++ 4 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 Firmware/Firmware.asm create mode 100644 Firmware/Firmware.bin diff --git a/Firmware/Driver.lst b/Firmware/Driver.lst index 1603b34..966d058 100644 --- a/Firmware/Driver.lst +++ b/Firmware/Driver.lst @@ -1,4 +1,4 @@ -ca65 V2.18 - Ubuntu 2.18-1 +ca65 V2.19 - Git 59c58ac Main file : Driver.asm Current file: Driver.asm diff --git a/Firmware/Firmware.asm b/Firmware/Firmware.asm new file mode 100644 index 0000000..0d63fb9 --- /dev/null +++ b/Firmware/Firmware.asm @@ -0,0 +1,196 @@ +;ProDOS Zero Page +Command = $42 ;ProDOS Command +Unit = $43 ;ProDOS unit (SDDD0000) +BufferLo = $44 +BufferHi = $45 +BlockLo = $46 +BlockHi = $47 + +; ProDOS Error Codes +IOError = $27 +NoDevice = $28 +WriteProtect = $2B + +SlotDrive = $50 +InputByte = $c08e +OutputByte = $c08d +ReadBlockCommand = $01 +WriteBlockCommand = $02 +NibbleStorage = $1d + + .org STARTSLOT +;ID bytes for booting and drive detection + cpx #$20 ;ID bytes for ProDOS and the + cpx #$00 ; Apple Autostart ROM + cpx #$03 ; + cpx #$3C ;this one for older II's + +;load first two blocks and execute to boot +Boot: + lda #$01 ;set read command + sta Command + + jsr $ff58 + tsx + lda $0100,x + asl + asl + asl + asl + sta $2b + sta Unit + tax + + lda #$00 ;block 0 + sta BlockLo + sta BlockHi + sta BufferLo ;buffer at $800 + lda #$08 + sta BufferHi + jsr Driver ;get the block + +; lda #$00 ;block 1 +; sta BlockLo +; sta BlockHi +; sta BufferLo ;buffer at $A00 +; lda #$0A +; sta BufferHi +; jsr Driver ;get the block + +; ldx #sdrive ;set up for slot n + jmp $801 ;execute the block + +;; +; ProDOS Driver code +; First check that this is the right drive +Driver: + ldx Unit + lda Command; Check which command is being requested + beq GetStatus ;0 = Status command + cmp #ReadBlockCommand + beq ReadBlock + cmp #WriteBlockCommand + beq WriteBlock + sec ;set carry as we don't support any other commands + lda #$53 ;Invalid parameter error + rts + +; ProDOS Status Command Handler +GetStatus: + ldx #$ff ;low byte number of blocks + ldy #$ff ;high byte number of blocks + lda #$0 ;zero accumulator and clear carry for success + clc + rts + +; ProDOS Read Block Command +ReadBlock: + lda #ReadBlockCommand + jsr SendByte + lda BlockLo + jsr SendByte + lda BlockHi + jsr SendByte + ldy #$0 + jsr read256 + inc BufferHi + jsr read256 + dec BufferHi + lda #$0 ;zero accumulator and clear carry for success + clc + rts + +read256: + jsr GetByte + sta (BufferLo),y + iny + bne read256 + rts + +; ProDOS Write Block Command +WriteBlock: + lda #WriteBlockCommand + jsr SendByte + lda BlockLo + jsr SendByte + lda BlockHi + jsr SendByte + ldy #$0 + jsr write256 + inc BufferHi + jsr write256 + dec BufferHi + lda #$0 ;zero accumulator and clear carry for success + clc + rts + +write256: + lda (BufferLo),y + jsr SendByte + iny + bne write256 + rts + +SendByte: + pha + lsr + lsr + lsr + lsr + jsr SendNibble + pla + jsr SendNibble + rts + +SendNibble: + and #$0F + ora #$70 ;Write bit low + pha +waitWrite: + lda InputByte,x + asl ;Second highest bit goes low when ready + bmi waitWrite + pla + sta OutputByte,x +finishWrite: + lda InputByte,x + asl + bpl finishWrite + lda #$FF + sta OutputByte,x + rts + +GetByte: + jsr GetNibble + asl + asl + asl + asl + sta NibbleStorage + jsr GetNibble + and #$0f + ora NibbleStorage + rts + +GetNibble: + lda #$b0 ;set read flag low + sta OutputByte,x +waitRead: + lda InputByte,x + bmi waitRead + ora #$f0 ;set all flags high + sta OutputByte,x + pha +finishRead: + lda InputByte,x + bpl finishRead + pla +end: + rts + +.repeat 251-Mq`hs{+b+&`cv?rk)SsI}`-+qw4VBOGIW%q-{3e;evU4)NMq z`d5SJmv@&|zIOy2iMz*vevNK&q#tMQPxZ%bH@43wi_2xbyPn=$EOBeDX{4{N^Xh;8 z-j=?!8(S@xK71A3&3347_*!!_b*&$tYA5)$pB4HU{0x2uKZBncKTG`Cj-VrP2R}>s znf9}MKQn$-uAdkBIs6=c4nK#V8$VC{*^ZziaR)z7`MLJF9bKid&>B<`@kO6{-o{wjZeW%gHp+5ZDhDBLvw literal 0 HcmV?d00001 diff --git a/Firmware/driver_assemble.sh b/Firmware/driver_assemble.sh index 42f9ba3..ddb9fac 100755 --- a/Firmware/driver_assemble.sh +++ b/Firmware/driver_assemble.sh @@ -1,3 +1,11 @@ #!/bin/sh ca65 Driver.asm --listing Driver.lst ld65 Driver.o -o Driver.bin -t none +ca65 Firmware.asm -D STARTSLOT=\$c100 -o Slot1.o +ca65 Firmware.asm -D STARTSLOT=\$c200 -o Slot2.o +ca65 Firmware.asm -D STARTSLOT=\$c300 -o Slot3.o +ca65 Firmware.asm -D STARTSLOT=\$c400 -o Slot4.o +ca65 Firmware.asm -D STARTSLOT=\$c500 -o Slot5.o +ca65 Firmware.asm -D STARTSLOT=\$c600 -o Slot6.o +ca65 Firmware.asm -D STARTSLOT=\$c700 -o Slot7.o +ld65 Slot1.o Slot2.o Slot3.o Slot4.o Slot6.o Slot6.o Slot7.o -o Firmware.bin -t none