From 559819ab3a4ca1e0e0e28be7b1d5134f7f0cdd78 Mon Sep 17 00:00:00 2001 From: Terence Boldt Date: Sat, 6 Mar 2021 00:11:29 +0000 Subject: [PATCH] Update firmware to full byte communications --- Apple2/{Firmware.asm => DriveFirmware.asm} | 0 Apple2/Driver.asm | 173 -------------------- Apple2/Driver.lst | 178 --------------------- Apple2/{driver_assemble.sh => assemble.sh} | 2 - 4 files changed, 353 deletions(-) rename Apple2/{Firmware.asm => DriveFirmware.asm} (100%) delete mode 100644 Apple2/Driver.asm delete mode 100644 Apple2/Driver.lst rename Apple2/{driver_assemble.sh => assemble.sh} (92%) diff --git a/Apple2/Firmware.asm b/Apple2/DriveFirmware.asm similarity index 100% rename from Apple2/Firmware.asm rename to Apple2/DriveFirmware.asm diff --git a/Apple2/Driver.asm b/Apple2/Driver.asm deleted file mode 100644 index 7da2d81..0000000 --- a/Apple2/Driver.asm +++ /dev/null @@ -1,173 +0,0 @@ -; ProDOS Global Page -Device5S1 = $bf1a ;POINTER FOR SLOT 5 DRIVE 1 DRIVER -DeviceCount = $bf31 ;DEVICE COUNT -1 -DeviceList = $bf32 ;DEVICE LIST - -; 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 = $c0de -OutputByte = $c0dd -ReadBlockCommand = $01 -WriteBlockCommand = $02 -NibbleStorage = $1d - - .org $1000 - -; Register the driver with ProDOS - lda #Driver - sta Device5S1+1 -; Add the drive to the device list - inc DeviceCount - lda DeviceCount - ldy #SlotDrive - sta DeviceList,y - rts - -; ProDOS Driver code -; First check that this is the right drive -Driver: - lda Unit - cmp #SlotDrive - beq DoCommand ;correct device, so proceed - sec ;set carry as ProDOS treats this as an error - lda #NoDevice ;put the error code in accumulator for ProDOS - rts - -; Check which command is being requested -DoCommand: - lda Command - 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 - asl ;Second highest bit goes low when ready - bmi waitWrite - pla - sta OutputByte -finishWrite: - lda InputByte - asl - bpl finishWrite - lda #$FF - sta OutputByte - 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 -waitRead: - lda InputByte - bmi waitRead - ora #$f0 ;set all flags high - sta OutputByte - pha -finishRead: - lda InputByte - bpl finishRead - pla - rts - diff --git a/Apple2/Driver.lst b/Apple2/Driver.lst deleted file mode 100644 index fa96aad..0000000 --- a/Apple2/Driver.lst +++ /dev/null @@ -1,178 +0,0 @@ -ca65 V2.19 - Git 59c58acb -Main file : Driver.asm -Current file: Driver.asm - -000000r 1 ; ProDOS Global Page -000000r 1 Device5S1 = $bf1a ;POINTER FOR SLOT 5 DRIVE 1 DRIVER -000000r 1 DeviceCount = $bf31 ;DEVICE COUNT -1 -000000r 1 DeviceList = $bf32 ;DEVICE LIST -000000r 1 -000000r 1 ; ProDOS Zero Page -000000r 1 Command = $42 ;ProDOS Command -000000r 1 Unit = $43 ;ProDOS unit (SDDD0000) -000000r 1 BufferLo = $44 -000000r 1 BufferHi = $45 -000000r 1 BlockLo = $46 -000000r 1 BlockHi = $47 -000000r 1 -000000r 1 ; ProDOS Error Codes -000000r 1 IOError = $27 -000000r 1 NoDevice = $28 -000000r 1 WriteProtect = $2B -000000r 1 -000000r 1 SlotDrive = $50 -000000r 1 InputByte = $c0de -000000r 1 OutputByte = $c0dd -000000r 1 ReadBlockCommand = $01 -000000r 1 WriteBlockCommand = $02 -000000r 1 NibbleStorage = $1d -000000r 1 -000000r 1 .org $1000 -001000 1 -001000 1 ; Register the driver with ProDOS -001000 1 A9 16 lda #Driver -001007 1 8D 1B BF sta Device5S1+1 -00100A 1 ; Add the drive to the device list -00100A 1 EE 31 BF inc DeviceCount -00100D 1 AD 31 BF lda DeviceCount -001010 1 A0 50 ldy #SlotDrive -001012 1 99 32 BF sta DeviceList,y -001015 1 60 rts -001016 1 -001016 1 ; ProDOS Driver code -001016 1 ; First check that this is the right drive -001016 1 Driver: -001016 1 A5 43 lda Unit -001018 1 C9 50 cmp #SlotDrive -00101A 1 F0 04 beq DoCommand ;correct device, so proceed -00101C 1 38 sec ;set carry as ProDOS treats this as an error -00101D 1 A9 28 lda #NoDevice ;put the error code in accumulator for ProDOS -00101F 1 60 rts -001020 1 -001020 1 ; Check which command is being requested -001020 1 DoCommand: -001020 1 A5 42 lda Command -001022 1 F0 0C beq GetStatus ;0 = Status command -001024 1 C9 01 cmp #ReadBlockCommand -001026 1 F0 10 beq ReadBlock -001028 1 C9 02 cmp #WriteBlockCommand -00102A 1 F0 34 beq WriteBlock -00102C 1 38 sec ;set carry as we don't support any other commands -00102D 1 A9 53 lda #$53 ;Invalid parameter error -00102F 1 60 rts -001030 1 -001030 1 ; ProDOS Status Command Handler -001030 1 GetStatus: -001030 1 A2 FF ldx #$ff ;low byte number of blocks -001032 1 A0 FF ldy #$ff ;high byte number of blocks -001034 1 A9 00 lda #$0 ;zero accumulator and clear carry for success -001036 1 18 clc -001037 1 60 rts -001038 1 -001038 1 ; ProDOS Read Block Command -001038 1 ReadBlock: -001038 1 A9 01 lda #ReadBlockCommand -00103A 1 20 88 10 jsr SendByte -00103D 1 A5 46 lda BlockLo -00103F 1 20 88 10 jsr SendByte -001042 1 A5 47 lda BlockHi -001044 1 20 88 10 jsr SendByte -001047 1 A0 00 ldy #$0 -001049 1 20 57 10 jsr read256 -00104C 1 E6 45 inc BufferHi -00104E 1 20 57 10 jsr read256 -001051 1 C6 45 dec BufferHi -001053 1 A9 00 lda #$0 ;zero accumulator and clear carry for success -001055 1 18 clc -001056 1 60 rts -001057 1 -001057 1 read256: -001057 1 20 B0 10 jsr GetByte -00105A 1 91 44 sta (BufferLo),y -00105C 1 C8 iny -00105D 1 D0 F8 bne read256 -00105F 1 60 rts -001060 1 -001060 1 ; ProDOS Write Block Command -001060 1 WriteBlock: -001060 1 A9 02 lda #WriteBlockCommand -001062 1 20 88 10 jsr SendByte -001065 1 A5 46 lda BlockLo -001067 1 20 88 10 jsr SendByte -00106A 1 A5 47 lda BlockHi -00106C 1 20 88 10 jsr SendByte -00106F 1 A0 00 ldy #$0 -001071 1 20 7F 10 jsr write256 -001074 1 E6 45 inc BufferHi -001076 1 20 7F 10 jsr write256 -001079 1 C6 45 dec BufferHi -00107B 1 A9 00 lda #$0 ;zero accumulator and clear carry for success -00107D 1 18 clc -00107E 1 60 rts -00107F 1 -00107F 1 write256: -00107F 1 B1 44 lda (BufferLo),y -001081 1 20 88 10 jsr SendByte -001084 1 C8 iny -001085 1 D0 F8 bne write256 -001087 1 60 rts -001088 1 -001088 1 SendByte: -001088 1 48 pha -001089 1 4A lsr -00108A 1 4A lsr -00108B 1 4A lsr -00108C 1 4A lsr -00108D 1 20 95 10 jsr SendNibble -001090 1 68 pla -001091 1 20 95 10 jsr SendNibble -001094 1 60 rts -001095 1 -001095 1 SendNibble: -001095 1 29 0F and #$0F -001097 1 09 70 ora #$70 ;Write bit low -001099 1 48 pha -00109A 1 waitWrite: -00109A 1 AD DE C0 lda InputByte -00109D 1 0A asl ;Second highest bit goes low when ready -00109E 1 30 FA bmi waitWrite -0010A0 1 68 pla -0010A1 1 8D DD C0 sta OutputByte -0010A4 1 finishWrite: -0010A4 1 AD DE C0 lda InputByte -0010A7 1 0A asl -0010A8 1 10 FA bpl finishWrite -0010AA 1 A9 FF lda #$FF -0010AC 1 8D DD C0 sta OutputByte -0010AF 1 60 rts -0010B0 1 -0010B0 1 GetByte: -0010B0 1 20 C1 10 jsr GetNibble -0010B3 1 0A asl -0010B4 1 0A asl -0010B5 1 0A asl -0010B6 1 0A asl -0010B7 1 85 1D sta NibbleStorage -0010B9 1 20 C1 10 jsr GetNibble -0010BC 1 29 0F and #$0f -0010BE 1 05 1D ora NibbleStorage -0010C0 1 60 rts -0010C1 1 -0010C1 1 GetNibble: -0010C1 1 A9 B0 lda #$b0 ;set read flag low -0010C3 1 8D DD C0 sta OutputByte -0010C6 1 waitRead: -0010C6 1 AD DE C0 lda InputByte -0010C9 1 30 FB bmi waitRead -0010CB 1 09 F0 ora #$f0 ;set all flags high -0010CD 1 8D DD C0 sta OutputByte -0010D0 1 48 pha -0010D1 1 finishRead: -0010D1 1 AD DE C0 lda InputByte -0010D4 1 10 FB bpl finishRead -0010D6 1 68 pla -0010D7 1 60 rts -0010D8 1 -0010D8 1 diff --git a/Apple2/driver_assemble.sh b/Apple2/assemble.sh similarity index 92% rename from Apple2/driver_assemble.sh rename to Apple2/assemble.sh index 3831a93..7dba3e9 100755 --- a/Apple2/driver_assemble.sh +++ b/Apple2/assemble.sh @@ -1,6 +1,4 @@ #!/bin/sh -ca65 Driver.asm --listing Driver.lst -ld65 Driver.o -o Driver.bin -t none ca65 Firmware.asm -D STARTSLOT=\$c000 -o Slot0.o ca65 Firmware.asm -D STARTSLOT=\$c100 -o Slot1.o --listing Firmware1.lst ca65 Firmware.asm -D STARTSLOT=\$c200 -o Slot2.o --listing Firmware2.lst