diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 2228e07..6ab5174 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -22,15 +22,10 @@ body: label: Hardware Version description: What version of the hardware are you running? options: - - Sixth Prototype (Purchased from Terence) - - Sixth Prototype (Self-assembled) - - Sixth Prototype (Purchased from third party) - - Fifth Prototype (Purchased from Terence) - - Fifth Prototype (Self-assembled) - - Fifth Prototype (Purchased from third party) - - Fourth Prototype (Purchased from Terence) - - Fourth Prototype (Self-assembled) - - Fourth Prototype (Purchased from third party) + - RPi Pico + - Sixth Prototype (lastest classic hardware) + - Fifth Prototype (classic hardware without jumper) + - Fourth Prototype (classic hardware with EPROM) validations: required: true - type: dropdown @@ -39,6 +34,8 @@ body: label: Firmware Version description: What version of the firmware are you running? (shown on boot screen) options: + - 8010 (initial RPi Pico hardware) + - 0010 (classic hardware) - 000F - Older (not shown on boot, pre-2022-Feb-07) validations: @@ -49,6 +46,7 @@ body: label: Driver Version description: What version of the driver are you running? Check with `RPI a2version` options: + - 002D (add support for RPi Pico hardware) - 002C (fix nano editor) - 002B (fix keyboard delay) - 002A (reduce CPU usage) @@ -69,6 +67,8 @@ body: label: Shell Version description: What version of the shell are you running?` options: + - 800F (initial RPi Pico support) + - 000F (classic hardware support) - 000E (fix hang on exit) - 000D (added version info) - Older (pre-2022-Mar-01) diff --git a/.gitignore b/.gitignore index 3c2a99b..390a0a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ *-bak -*.lst *.o -*.bin *.DS_Store RaspberryPi/apple2driver/apple2driver RaspberryPi/Apple2-IO-RPi.log diff --git a/Apple2/CommandFirmware.lst b/Apple2/CommandFirmware.lst new file mode 100644 index 0000000..4c3767f --- /dev/null +++ b/Apple2/CommandFirmware.lst @@ -0,0 +1,195 @@ +ca65 V2.18 - Debian 2.19-1 +Main file : CommandFirmware.asm +Current file: CommandFirmware.asm + +000000r 1 ; Copyright Terence J. Boldt (c)2020-2024 +000000r 1 ; Use of this source code is governed by an MIT +000000r 1 ; license that can be found in the LICENSE file. +000000r 1 +000000r 1 ; This file contains the source for the firmware +000000r 1 ; that was formerly used to act as a pseudo-shell +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 InputByte = $c08e+SLOT*$10 +000000r 1 OutputByte = $c08d+SLOT*$10 +000000r 1 InputFlags = $c08b+SLOT*$10 +000000r 1 OutputFlags = $c087+SLOT*$10 +000000r 1 +000000r 1 ReadBlockCommand = $01 +000000r 1 WriteBlockCommand = $02 +000000r 1 GetTimeCommand = $03 +000000r 1 ChangeDriveCommand = $04 +000000r 1 ExecCommand = $05 +000000r 1 LoadFileCommand = $06 +000000r 1 SaveFileCommand = $07 +000000r 1 MenuCommand = $08 +000000r 1 +000000r 1 InputString = $fd67 +000000r 1 PrintChar = $fded +000000r 1 Keyboard = $c000 +000000r 1 ClearKeyboard = $c010 +000000r 1 Wait = $fca8 +000000r 1 +000000r 1 .org SLOT*$100 + $C000 +00C700 1 ;ID bytes for booting and drive detection +00C700 1 E0 20 cpx #$20 ;ID bytes for ProDOS and the +00C702 1 E0 00 cpx #$00 ; Apple Autostart ROM +00C704 1 E0 03 cpx #$03 ; +00C706 1 +00C706 1 A2 70 ldx #SLOT*$10 +00C708 1 86 2B stx $2b +00C70A 1 86 43 stx Unit +00C70C 1 +00C70C 1 ;force EPROM to second page on boot +00C70C 1 A9 3F lda #$3f ;set all flags high and page 3 of EPROM for menu +00C70E 1 PageJump: +00C70E 1 8D F7 C0 sta OutputFlags +00C711 1 4C 19 C7 jmp Start ;this jump is only called if coming in from PageJump with A=$2f +00C714 1 +00C714 1 ;entry points for ProDOS +00C714 1 DriverEntry: +00C714 1 A9 0F lda #$0f ;set all flags high and page 0 of EPROM +00C716 1 8D F7 C0 sta OutputFlags +00C719 1 +00C719 1 Start: +00C719 1 20 00 C3 jsr $c300 ;enable 80 columns +00C71C 1 A9 05 lda #$05 ;execute command +00C71E 1 20 95 C7 jsr SendByte +00C721 1 A0 00 ldy #$00 +00C723 1 sendHelp: +00C723 1 B9 8E C7 lda HelpCommand,y +00C726 1 F0 06 beq endSendHelp +00C728 1 20 95 C7 jsr SendByte +00C72B 1 C8 iny +00C72C 1 D0 F5 bne sendHelp +00C72E 1 endSendHelp: +00C72E 1 A9 00 lda #$00 +00C730 1 20 95 C7 jsr SendByte +00C733 1 20 6B C7 jsr DumpOutput +00C736 1 +00C736 1 A5 33 lda $33 +00C738 1 48 pha +00C739 1 A9 A4 lda #$a4 +00C73B 1 85 33 sta $33 +00C73D 1 GetCommand: +00C73D 1 20 67 FD jsr InputString +00C740 1 AD 00 02 lda $0200 +00C743 1 C9 8D cmp #$8d ;skip when return found +00C745 1 F0 F6 beq GetCommand +00C747 1 20 4D C7 jsr SendCommand +00C74A 1 18 clc +00C74B 1 90 F0 bcc GetCommand +00C74D 1 +00C74D 1 SendCommand: +00C74D 1 2C 10 C0 bit ClearKeyboard +00C750 1 A9 05 lda #$05 ;send command 5 = exec +00C752 1 20 95 C7 jsr SendByte +00C755 1 A0 00 ldy #$00 +00C757 1 getInput: +00C757 1 B9 00 02 lda $0200,y +00C75A 1 C9 8D cmp #$8d +00C75C 1 F0 08 beq sendNullTerminator +00C75E 1 29 7F and #$7f +00C760 1 20 95 C7 jsr SendByte +00C763 1 C8 iny +00C764 1 D0 F1 bne getInput +00C766 1 sendNullTerminator: +00C766 1 A9 00 lda #$00 +00C768 1 20 95 C7 jsr SendByte +00C76B 1 DumpOutput: +00C76B 1 20 AD C7 jsr GetByte +00C76E 1 B0 07 bcs skipOutput +00C770 1 C9 00 cmp #$00 +00C772 1 F0 19 beq endOutput +00C774 1 20 ED FD jsr PrintChar +00C777 1 skipOutput: +00C777 1 2C 00 C0 bit Keyboard ;check for keypress +00C77A 1 10 EF bpl DumpOutput ;keep dumping output if no keypress +00C77C 1 AD 00 C0 lda Keyboard ;send keypress to RPi +00C77F 1 20 ED FD jsr PrintChar +00C782 1 29 7F and #$7f +00C784 1 20 95 C7 jsr SendByte +00C787 1 2C 10 C0 bit ClearKeyboard +00C78A 1 18 clc +00C78B 1 90 DE bcc DumpOutput +00C78D 1 endOutput: +00C78D 1 60 rts +00C78E 1 +00C78E 1 HelpCommand: +00C78E 1 61 32 68 65 .byte "a2help",$00 +00C792 1 6C 70 00 +00C795 1 +00C795 1 SendByte: +00C795 1 2C FB C0 bit InputFlags +00C798 1 70 FB bvs SendByte +00C79A 1 8D FD C0 sta OutputByte +00C79D 1 .if HW_TYPE = 0 +00C79D 1 A9 1E lda #$1e ; set bit 0 low to indicate write started +00C79F 1 8D F7 C0 sta OutputFlags +00C7A2 1 finishWrite: +00C7A2 1 2C FB C0 bit InputFlags +00C7A5 1 50 FB bvc finishWrite +00C7A7 1 A9 1F lda #$1f +00C7A9 1 8D F7 C0 sta OutputFlags +00C7AC 1 .endif +00C7AC 1 60 rts +00C7AD 1 +00C7AD 1 GetByte: +00C7AD 1 .if HW_TYPE = 0 +00C7AD 1 A2 1D ldx #$1d ;set read flag low +00C7AF 1 8E F7 C0 stx OutputFlags +00C7B2 1 .endif +00C7B2 1 waitRead: +00C7B2 1 2C FB C0 bit InputFlags +00C7B5 1 10 0C bpl readByte +00C7B7 1 2C 00 C0 bit Keyboard ;keypress will abort waiting to read +00C7BA 1 10 F6 bpl waitRead +00C7BC 1 .if HW_TYPE = 0 +00C7BC 1 A9 1F lda #$1f ;set all flags high and exit +00C7BE 1 8D F7 C0 sta OutputFlags +00C7C1 1 .endif +00C7C1 1 38 sec ;failure +00C7C2 1 60 rts +00C7C3 1 readByte: +00C7C3 1 AD FE C0 lda InputByte +00C7C6 1 .if HW_TYPE = 0 +00C7C6 1 A2 1F ldx #$1f ;set all flags high +00C7C8 1 8E F7 C0 stx OutputFlags +00C7CB 1 finishRead: +00C7CB 1 2C FB C0 bit InputFlags +00C7CE 1 10 FB bpl finishRead +00C7D0 1 .endif +00C7D0 1 18 clc ;success +00C7D1 1 end: +00C7D1 1 60 rts +00C7D2 1 +00C7D2 1 00 00 00 00 .repeat 251-RPI ; external command JMP +002063 1 8D 08 BE STA EXTRNCMD+2 ; vector. +002066 1 +002066 1 A9 05 lda #ExecCommand +002068 1 20 6F 03 jsr SendByte +00206B 1 A0 00 ldy #$00 +00206D 1 nextCommandByte: +00206D 1 B9 8C 20 lda a2help, y +002070 1 F0 07 beq finishCommand +002072 1 20 6F 03 jsr SendByte +002075 1 C8 iny +002076 1 4C 6D 20 jmp nextCommandByte +002079 1 finishCommand: +002079 1 A9 00 lda #$00 +00207B 1 20 6F 03 jsr SendByte +00207E 1 showVersion: +00207E 1 20 8D 03 jsr GetByte +002081 1 C9 00 cmp #$00 +002083 1 F0 06 beq FinishDriver +002085 1 20 ED FD jsr PrintChar +002088 1 4C 7E 20 jmp showVersion +00208B 1 FinishDriver: +00208B 1 60 rts +00208C 1 +00208C 1 a2help: +00208C 1 61 32 68 65 .byte "a2help", $00 +002090 1 6C 70 00 +002093 1 +002093 1 Text: +002093 1 D2 D0 C9 A0 aschi "RPI command version: 000E" +002097 1 E3 EF ED ED +00209B 1 E1 EE E4 A0 +0020AC 1 8D .byte $8d +0020AD 1 end: +0020AD 1 00 .byte $00 +0020AE 1 +0020AE 1 00 00 00 00 .repeat 255-XRETURN ; at the time we intercept +00031D 1 +00031D 1 8D 51 BE STA XTRNADDR+1 ; our command. +000320 1 A9 00 LDA #0 ;Mark the cmd number as +000322 1 8D 53 BE STA XCNUM ; zero (external). +000325 1 8D 54 BE STA PBITS ;And indicate no parameters +000328 1 8D 55 BE STA PBITS+1 ; to be parsed. +00032B 1 A9 8D lda #$8d +00032D 1 20 ED FD jsr $fded +000330 1 A2 70 slotx: ldx #$70 ; set x to slot # in high nibble +000332 1 18 clc +000333 1 90 04 bcc SendCommand +000335 1 ; +000335 1 38 NOTOURS: SEC ; ALWAYS SET CARRY IF NOT YOUR +000336 1 6C AD 03 JMP (NXTCMD) ; CMD AND LET NEXT COMMAND TRY +000339 1 ; ; TO CLAIM IT. +000339 1 +000339 1 SendCommand: +000339 1 2C 10 C0 bit ClearKeyboard +00033C 1 A9 05 lda #$05 ;send command 5 = exec +00033E 1 20 6F 03 jsr SendByte +000341 1 A0 03 ldy #$03 ;skip over "RPI" +000343 1 getInput: +000343 1 B9 00 02 lda $0200,y +000346 1 C9 8D cmp #$8d +000348 1 F0 08 beq sendNullTerminator +00034A 1 29 7F and #$7f +00034C 1 20 6F 03 jsr SendByte +00034F 1 C8 iny +000350 1 D0 F1 bne getInput +000352 1 sendNullTerminator: +000352 1 A9 00 lda #$00 +000354 1 20 6F 03 jsr SendByte +000357 1 DumpOutput: +000357 1 20 8D 03 jsr GetByte +00035A 1 C9 00 cmp #$00 +00035C 1 F0 06 beq endOutput +00035E 1 20 ED FD jsr PrintChar +000361 1 18 clc +000362 1 90 F3 bcc DumpOutput +000364 1 endOutput: +000364 1 18 clc +000365 1 6C AD 03 jmp (NXTCMD) +000368 1 +000368 1 HelpCommand: +000368 1 61 32 68 65 .byte "a2help",$00 +00036C 1 6C 70 00 +00036F 1 +00036F 1 SendByte: +00036F 1 48 pha +000370 1 waitWrite: +000370 1 BD 8B C0 lda InputFlags,x +000373 1 2A rol +000374 1 2A rol +000375 1 B0 F9 bcs waitWrite +000377 1 68 pla +000378 1 9D 8D C0 sta OutputByte,x +00037B 1 .if HW_TYPE = 0 +00037B 1 A9 1E lda #$1e ; set bit 0 low to indicate write started +00037D 1 9D 87 C0 sta OutputFlags,x +000380 1 finishWrite: +000380 1 BD 8B C0 lda InputFlags,x +000383 1 2A rol +000384 1 2A rol +000385 1 90 F9 bcc finishWrite +000387 1 A9 1F lda #$1f +000389 1 9D 87 C0 sta OutputFlags,x +00038C 1 .endif +00038C 1 60 rts +00038D 1 +00038D 1 GetByte: +00038D 1 .if HW_TYPE = 0 +00038D 1 A9 1D lda #$1d ;set read flag low +00038F 1 9D 87 C0 sta OutputFlags,x +000392 1 .endif +000392 1 waitRead: +000392 1 BD 8B C0 lda InputFlags,x +000395 1 2A rol +000396 1 B0 FA bcs waitRead +000398 1 readByte: +000398 1 BD 8E C0 lda InputByte,x +00039B 1 .if HW_TYPE = 0 +00039B 1 48 pha +00039C 1 A9 1F lda #$1f ;set all flags high +00039E 1 9D 87 C0 sta OutputFlags,x +0003A1 1 finishRead: +0003A1 1 BD 8B C0 lda InputFlags,x +0003A4 1 2A rol +0003A5 1 90 FA bcc finishRead +0003A7 1 68 pla +0003A8 1 .endif +0003A8 1 18 clc ;success +0003A9 1 60 rts +0003AA 1 +0003AA 1 +0003AA 1 F2 F0 E9 CMD: aschi "rpi" +0003AD 1 CMDLEN = 3 ;Our command length +0003AD 1 ; +0003AD 1 00 00 NXTCMD: .byte 0,0 ; STORE THE NEXT EXT CMD'S +0003AF 1 ; ADDRESS HERE. +0003AF 1 +0003AF 1 +0003AF 1 diff --git a/Apple2/Shell.asm b/Apple2/Shell.asm index c7f7937..50be903 100755 --- a/Apple2/Shell.asm +++ b/Apple2/Shell.asm @@ -290,7 +290,11 @@ restoreChar: rts Text: -.byte "Apple2-IO-RPi Shell Version 000E",$8d +.if HW_TYPE = 0 +.byte "Apple2-IO-RPi Shell Version 000F",$8d +.else +.byte "Apple2-IO-RPi Shell Version 800F",$8d +.endif .byte "(c)2020-2024 Terence J. Boldt",$8d .byte $8d .byte $00 diff --git a/Apple2/Shell.lst b/Apple2/Shell.lst new file mode 100644 index 0000000..7ff11be --- /dev/null +++ b/Apple2/Shell.lst @@ -0,0 +1,309 @@ +ca65 V2.18 - Debian 2.19-1 +Main file : Shell.asm +Current file: Shell.asm + +000000r 1 ; Copyright Terence J. Boldt (c)2021-2024 +000000r 1 ; Use of this source code is governed by an MIT +000000r 1 ; license that can be found in the LICENSE file. +000000r 1 +000000r 1 ; This file contains the source for the SHELL +000000r 1 ; application that runs on the Apple II to talk +000000r 1 ; to the Raspberry Pi +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 InputByte = $c08e +000000r 1 OutputByte = $c08d +000000r 1 InputFlags = $c08b +000000r 1 OutputFlags = $c087 +000000r 1 +000000r 1 ResetCommand = $00 +000000r 1 ReadBlockCommand = $01 +000000r 1 WriteBlockCommand = $02 +000000r 1 GetTimeCommand = $03 +000000r 1 ChangeDriveCommand = $04 +000000r 1 ExecCommand = $05 +000000r 1 LoadFileCommand = $06 +000000r 1 SaveFileCommand = $07 +000000r 1 MenuCommand = $08 +000000r 1 ShellCommand = $09 +000000r 1 +000000r 1 InputString = $fd6a +000000r 1 StringBuffer = $0200 +000000r 1 PrintChar = $fded +000000r 1 Keyboard = $c000 +000000r 1 ClearKeyboard = $c010 +000000r 1 Home = $fc58 +000000r 1 Wait = $fca8 +000000r 1 PromptChar = $33 +000000r 1 Read80Col = $c01f +000000r 1 TextPage1 = $c054 +000000r 1 TextPage2 = $c055 +000000r 1 +000000r 1 htab = $24 +000000r 1 vtab = $25 +000000r 1 BasL = $28 +000000r 1 htab80 = $057b +000000r 1 BasCalc = $fbc1 +000000r 1 +000000r 1 LastChar = $06 +000000r 1 SlotL = $fe +000000r 1 SlotH = $ff +000000r 1 ESC = $9b +000000r 1 +000000r 1 .org $2000 +002000 1 A2 07 ldx #$07 ; start at slot 7 +002002 1 DetectSlot: +002002 1 A0 00 ldy #$00 +002004 1 A9 FC lda #$fc +002006 1 85 FE sta SlotL +002008 1 8A txa +002009 1 09 C0 ora #$c0 +00200B 1 85 FF sta SlotH +00200D 1 B1 FE lda (SlotL),y +00200F 1 D0 1C bne nextSlot +002011 1 C8 iny +002012 1 B1 FE lda (SlotL),y +002014 1 D0 17 bne nextSlot +002016 1 C8 iny +002017 1 B1 FE lda (SlotL),y +002019 1 C9 17 cmp #$17 +00201B 1 D0 10 bne nextSlot +00201D 1 C8 iny +00201E 1 B1 FE lda (SlotL),y +002020 1 C9 14 cmp #$14 +002022 1 D0 09 bne nextSlot +002024 1 8A txa +002025 1 0A asl +002026 1 0A asl +002027 1 0A asl +002028 1 0A asl +002029 1 AA tax +00202A 1 18 clc +00202B 1 90 04 bcc Init +00202D 1 nextSlot: +00202D 1 CA dex +00202E 1 D0 D2 bne DetectSlot +002030 1 60 rts +002031 1 +002031 1 Init: +002031 1 A9 8D lda #$8d +002033 1 20 00 C3 jsr $c300 ; force 80 columns +002036 1 +002036 1 A0 00 ldy #$00 +002038 1 PrintString: +002038 1 B9 73 21 lda Text,y +00203B 1 F0 08 beq Start +00203D 1 09 80 ora #$80 +00203F 1 20 ED FD jsr PrintChar +002042 1 C8 iny +002043 1 D0 F3 bne PrintString +002045 1 +002045 1 Start: +002045 1 A5 06 lda LastChar +002047 1 48 pha +002048 1 2C 10 C0 bit ClearKeyboard +00204B 1 ; lda #ResetCommand +00204B 1 ; jsr SendByte +00204B 1 A9 09 lda #ShellCommand +00204D 1 20 C7 20 jsr SendByte +002050 1 20 57 20 jsr DumpOutput +002053 1 68 pla +002054 1 85 06 sta LastChar +002056 1 60 rts +002057 1 +002057 1 DumpOutput: +002057 1 20 E5 20 jsr GetByte +00205A 1 C9 00 cmp #$00 +00205C 1 F0 26 beq endOutput +00205E 1 48 pha +00205F 1 20 5E 21 jsr ClearCursor +002062 1 68 pla +002063 1 C9 48 cmp #'H' +002065 1 F0 27 beq setColumn +002067 1 C9 56 cmp #'V' +002069 1 F0 31 beq setRow +00206B 1 C9 43 cmp #'C' +00206D 1 F0 16 beq clearScreen +00206F 1 C9 54 cmp #'T' +002071 1 F0 37 beq setTop +002073 1 C9 42 cmp #'B' +002075 1 F0 3B beq setBottom +002077 1 C9 55 cmp #'U' +002079 1 F0 3F beq moveUp +00207B 1 20 ED FD jsr PrintChar +00207E 1 20 2D 21 jsr SetCursor +002081 1 4C 57 20 jmp DumpOutput +002084 1 endOutput: +002084 1 60 rts +002085 1 clearScreen: +002085 1 20 58 FC jsr Home +002088 1 20 2D 21 jsr SetCursor +00208B 1 4C 57 20 jmp DumpOutput +00208E 1 setColumn: +00208E 1 20 E5 20 jsr GetByte +002091 1 85 24 sta htab +002093 1 8D 7B 05 sta htab80 +002096 1 20 2D 21 jsr SetCursor +002099 1 4C 57 20 jmp DumpOutput +00209C 1 setRow: +00209C 1 20 E5 20 jsr GetByte +00209F 1 85 25 sta vtab +0020A1 1 20 C1 FB jsr BasCalc +0020A4 1 20 2D 21 jsr SetCursor +0020A7 1 4C 57 20 jmp DumpOutput +0020AA 1 setTop: +0020AA 1 20 E5 20 jsr GetByte +0020AD 1 85 22 sta $22 +0020AF 1 4C 57 20 jmp DumpOutput +0020B2 1 setBottom: +0020B2 1 20 E5 20 jsr GetByte +0020B5 1 85 23 sta $23 +0020B7 1 4C 57 20 jmp DumpOutput +0020BA 1 moveUp: +0020BA 1 C6 25 dec vtab +0020BC 1 A5 25 lda vtab +0020BE 1 20 C1 FB jsr BasCalc +0020C1 1 20 2D 21 jsr SetCursor +0020C4 1 4C 57 20 jmp DumpOutput +0020C7 1 +0020C7 1 SendByte: +0020C7 1 48 pha +0020C8 1 waitWrite: +0020C8 1 BD 8B C0 lda InputFlags,x +0020CB 1 2A rol +0020CC 1 2A rol +0020CD 1 B0 F9 bcs waitWrite +0020CF 1 68 pla +0020D0 1 9D 8D C0 sta OutputByte,x +0020D3 1 .if HW_TYPE = 0 +0020D3 1 A9 1E lda #$1e ; set bit 0 low to indicate write started +0020D5 1 9D 87 C0 sta OutputFlags,x +0020D8 1 finishWrite: +0020D8 1 BD 8B C0 lda InputFlags,x +0020DB 1 2A rol +0020DC 1 2A rol +0020DD 1 90 F9 bcc finishWrite +0020DF 1 A9 1F lda #$1f +0020E1 1 9D 87 C0 sta OutputFlags,x +0020E4 1 .endif +0020E4 1 60 rts +0020E5 1 +0020E5 1 GetByte: +0020E5 1 .if HW_TYPE = 0 +0020E5 1 A9 1D lda #$1d ;set read flag low +0020E7 1 9D 87 C0 sta OutputFlags,x +0020EA 1 .endif +0020EA 1 waitRead: +0020EA 1 BD 8B C0 lda InputFlags,x +0020ED 1 2A rol +0020EE 1 90 2B bcc readByte +0020F0 1 2C 00 C0 bit Keyboard ;keypress will abort waiting to read +0020F3 1 10 F5 bpl waitRead +0020F5 1 keyPressed: +0020F5 1 BD 8B C0 lda InputFlags,x +0020F8 1 2A rol +0020F9 1 2A rol +0020FA 1 B0 F9 bcs keyPressed +0020FC 1 AD 00 C0 lda Keyboard ;send keypress to RPi +0020FF 1 29 7F and #$7f +002101 1 9D 8D C0 sta OutputByte,x +002104 1 2C 10 C0 bit ClearKeyboard +002107 1 .if HW_TYPE = 0 +002107 1 A9 1C lda #$1c ;set write flag low too +002109 1 9D 87 C0 sta OutputFlags,x +00210C 1 finishKeyPress: +00210C 1 BD 8B C0 lda InputFlags,x +00210F 1 2A rol +002110 1 2A rol +002111 1 90 F9 bcc finishKeyPress +002113 1 A9 1D lda #$1d ;set flags back for reading +002115 1 9D 87 C0 sta OutputFlags,x +002118 1 .endif +002118 1 4C EA 20 jmp waitRead +00211B 1 readByte: +00211B 1 BD 8E C0 lda InputByte,x +00211E 1 .if HW_TYPE = 0 +00211E 1 48 pha +00211F 1 A9 1F lda #$1f ;set all flags high +002121 1 9D 87 C0 sta OutputFlags,x +002124 1 finishRead: +002124 1 BD 8B C0 lda InputFlags,x +002127 1 2A rol +002128 1 90 FA bcc finishRead +00212A 1 68 pla +00212B 1 .endif +00212B 1 18 clc ;success +00212C 1 end: +00212C 1 60 rts +00212D 1 +00212D 1 SetCursor: +00212D 1 AD 7B 05 lda htab80 ;get horizontal location / 2 +002130 1 4A lsr +002131 1 A8 tay +002132 1 AD 55 C0 lda TextPage2 +002135 1 90 03 bcc setChar +002137 1 AD 54 C0 lda TextPage1 +00213A 1 setChar: +00213A 1 B1 28 lda (BasL),y +00213C 1 85 06 sta LastChar ; save so ClearCursor will pick it up +00213E 1 C9 E0 cmp #$e0 +002140 1 10 0C bpl lowerCase +002142 1 C9 C0 cmp #$c0 +002144 1 10 0D bpl upperCase +002146 1 C9 A0 cmp #$a0 +002148 1 10 04 bpl symbol +00214A 1 C9 80 cmp #$80 +00214C 1 10 0A bpl noop +00214E 1 symbol: +00214E 1 lowerCase: +00214E 1 invert: +00214E 1 49 80 eor #$80 +002150 1 4C 58 21 jmp storeChar +002153 1 upperCase: +002153 1 29 1F and #$1f +002155 1 4C 58 21 jmp storeChar +002158 1 noop: +002158 1 storeChar: +002158 1 91 28 sta (BasL),y +00215A 1 AD 54 C0 lda TextPage1 +00215D 1 60 rts +00215E 1 +00215E 1 ClearCursor: +00215E 1 AD 7B 05 lda htab80 ;get horizontal location / 2 +002161 1 4A lsr +002162 1 A8 tay +002163 1 AD 55 C0 lda TextPage2 +002166 1 90 03 bcc restoreChar +002168 1 AD 54 C0 lda TextPage1 +00216B 1 restoreChar: +00216B 1 A5 06 lda LastChar +00216D 1 91 28 sta (BasL),y +00216F 1 AD 54 C0 lda TextPage1 +002172 1 60 rts +002173 1 +002173 1 Text: +002173 1 .if HW_TYPE = 0 +002173 1 41 70 70 6C .byte "Apple2-IO-RPi Shell Version 000F",$8d +002177 1 65 32 2D 49 +00217B 1 4F 2D 52 50 +002194 1 .else +002194 1 .byte "Apple2-IO-RPi Shell Version 800F",$8d +002194 1 .endif +002194 1 28 63 29 32 .byte "(c)2020-2024 Terence J. Boldt",$8d +002198 1 30 32 30 2D +00219C 1 32 30 32 34 +0021B2 1 8D .byte $8d +0021B3 1 00 .byte $00 +0021B3 1 diff --git a/RaspberryPi/apple2driver/info/version.go b/RaspberryPi/apple2driver/info/version.go index 3bcded3..6b8aa97 100644 --- a/RaspberryPi/apple2driver/info/version.go +++ b/RaspberryPi/apple2driver/info/version.go @@ -8,4 +8,4 @@ package info // Version is the hexadecimal version number that // should be incremented with each driver update -const Version = "002C" +const Version = "002D" diff --git a/RaspberryPi/driveimage/AT28C64B.bin b/RaspberryPi/driveimage/AT28C64B.bin new file mode 100644 index 0000000..318e666 Binary files /dev/null and b/RaspberryPi/driveimage/AT28C64B.bin differ diff --git a/RaspberryPi/driveimage/RPi.Command.bin b/RaspberryPi/driveimage/RPi.Command.bin new file mode 100644 index 0000000..212cba8 Binary files /dev/null and b/RaspberryPi/driveimage/RPi.Command.bin differ diff --git a/RaspberryPi/driveimage/Shell.bin b/RaspberryPi/driveimage/Shell.bin index 07bb2f6..de2e0bc 100644 Binary files a/RaspberryPi/driveimage/Shell.bin and b/RaspberryPi/driveimage/Shell.bin differ