diff --git a/Apple2/CommandFirmware.asm b/Apple2/CommandFirmware.asm new file mode 100644 index 0000000..50fe54a --- /dev/null +++ b/Apple2/CommandFirmware.asm @@ -0,0 +1,101 @@ +;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 + +InputByte = $c08e+SLOT*$10 +OutputByte = $c08d+SLOT*$10 +InputFlags = $c08b+SLOT*$10 +OutputFlags = $c087+SLOT*$10 + +ReadBlockCommand = $01 +WriteBlockCommand = $02 +GetTimeCommand = $03 +ChangeDriveCommand = $04 +ExecCommand = $05 +LoadFileCommand = $06 +SaveFileCommand = $07 + + .org SLOT*$100 + $C000 +;ID bytes for booting and drive detection + cpx #$20 ;ID bytes for ProDOS and the + cpx #$00 ; Apple Autostart ROM + cpx #$03 ; + + ldx #SLOT*$10 + stx $2b + stx Unit + +;force EPROM to second page on boot + lda #$1f ;set all flags high and page 3 of EPROM for menu +PageJump: + sta OutputFlags + jmp Start ;this jump is only called if coming in from PageJump with A=$2f + +;entry points for ProDOS +DriverEntry: + lda #$0f ;set all flags high and page 0 of EPROM + sta OutputFlags + +Start: + +; Put command firmware here +; +; +; + + +SendByte: + pha +waitWrite: + lda InputFlags + rol + rol + bcs waitWrite + pla + sta OutputByte + lda #$0e ; set bit 0 low to indicate write started + sta OutputFlags +finishWrite: + lda InputFlags + rol + rol + bcc finishWrite + lda #$0f + sta OutputFlags + rts + +GetByte: + lda #$0d ;set read flag low + sta OutputFlags +waitRead: + lda InputFlags + rol + bcs waitRead + lda InputByte + pha + lda #$0f ;set all flags high + sta OutputFlags +finishRead: + lda InputFlags + rol + bcc finishRead + pla +end: + rts + +.repeat 251- Firmware_27256_EPROM.bin cat \ DriveFirmware.bin MenuFirmware.bin DriveFirmware.bin DriveFirmware.bin \ @@ -35,3 +55,5 @@ ld65 Rpi.Command.o -o Rpi.Command.bin -t none rm *.o rm DriveFirmware.bin rm MenuFirmware.bin +rm CommandFirmware.bin +rm FileAccessFirmware.bin