mirror of
https://github.com/tjboldt/Apple2-IO-RPi.git
synced 2024-06-10 01:29:31 +00:00
Add clock driver, remove from firmware (#168)
This commit is contained in:
parent
1336371b49
commit
8b04a0e926
140
Apple2/Clock.Driver.asm
Normal file
140
Apple2/Clock.Driver.asm
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
; Copyright Terence J. Boldt (c)2024
|
||||||
|
; Use of this source code is governed by an MIT
|
||||||
|
; license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
; This file contains the source for the clock
|
||||||
|
; driver for the Apple2-IO-RPi
|
||||||
|
|
||||||
|
EnableWriteLang = $C08B
|
||||||
|
DisableWriteLang = $C082
|
||||||
|
|
||||||
|
ProdosJump = $BF06
|
||||||
|
ProdosClockCode = $BF07
|
||||||
|
ProdosMachineId = $BF98
|
||||||
|
|
||||||
|
PrintChar = $FDED
|
||||||
|
PrintHex = $FDE3
|
||||||
|
PrintByte = $FDDA
|
||||||
|
|
||||||
|
GetTimeCommand = $03
|
||||||
|
|
||||||
|
.org $2000
|
||||||
|
; Find Apple2-IO-RPi card
|
||||||
|
ldx #$06
|
||||||
|
ldy #$09
|
||||||
|
CheckIdBytes:
|
||||||
|
lda $C700,y ; !! Self modifying code
|
||||||
|
cmp IdBytes,y
|
||||||
|
bne NextCard
|
||||||
|
dey
|
||||||
|
bne CheckIdBytes
|
||||||
|
jmp FoundCard
|
||||||
|
NextCard:
|
||||||
|
dec CheckIdBytes+2
|
||||||
|
ldy #$09
|
||||||
|
dex
|
||||||
|
bne CheckIdBytes
|
||||||
|
CardNotFound:
|
||||||
|
ldy #$00
|
||||||
|
PrintCardNotFound:
|
||||||
|
lda TextCardNotFound,y
|
||||||
|
beq Failed
|
||||||
|
ora #$80
|
||||||
|
jsr PrintChar
|
||||||
|
iny
|
||||||
|
bne PrintCardNotFound
|
||||||
|
Failed:
|
||||||
|
rts
|
||||||
|
FoundCard:
|
||||||
|
ldy #$00
|
||||||
|
PrintCardFound:
|
||||||
|
lda TextCardFound,y
|
||||||
|
beq PrintCardNumber
|
||||||
|
ora #$80
|
||||||
|
jsr PrintChar
|
||||||
|
iny
|
||||||
|
bne PrintCardFound
|
||||||
|
PrintCardNumber:
|
||||||
|
inx
|
||||||
|
txa
|
||||||
|
jsr PrintHex
|
||||||
|
lda #$8D
|
||||||
|
jsr PrintChar
|
||||||
|
|
||||||
|
|
||||||
|
; Change driver code to point to the card
|
||||||
|
txa
|
||||||
|
ora #$C0
|
||||||
|
sta GetByte+2
|
||||||
|
sta SendByte+2
|
||||||
|
|
||||||
|
; Change destination to be ProDOS clock code location
|
||||||
|
lda ProdosClockCode
|
||||||
|
sta DriverDestination+1
|
||||||
|
lda ProdosClockCode+1
|
||||||
|
sta DriverDestination+2
|
||||||
|
|
||||||
|
; Changing RTS to JMP enables clock driver
|
||||||
|
lda #$4C ; jump instruction
|
||||||
|
sta ProdosJump
|
||||||
|
|
||||||
|
; Enable writing to language card RAM
|
||||||
|
; by triggering switch twice
|
||||||
|
lda EnableWriteLang
|
||||||
|
lda EnableWriteLang
|
||||||
|
|
||||||
|
; write driver code to language card RAM
|
||||||
|
ldy #$00
|
||||||
|
WriteDriver:
|
||||||
|
lda Driver,y
|
||||||
|
DriverDestination:
|
||||||
|
sta $D742,y ; !! this address gets modified above
|
||||||
|
iny
|
||||||
|
cpy #EndDriver-Driver+2
|
||||||
|
bne WriteDriver
|
||||||
|
|
||||||
|
; Disable writing to language card RAM
|
||||||
|
lda DisableWriteLang
|
||||||
|
|
||||||
|
; Update ProDOS Machine ID to mark clock as enabled
|
||||||
|
lda ProdosMachineId
|
||||||
|
ora #$01
|
||||||
|
sta ProdosMachineId
|
||||||
|
|
||||||
|
ldy #$00
|
||||||
|
PrintFinished:
|
||||||
|
lda TextDriverInstalled,y
|
||||||
|
beq Finished
|
||||||
|
ora #$80
|
||||||
|
jsr PrintChar
|
||||||
|
iny
|
||||||
|
bne PrintFinished
|
||||||
|
Finished:
|
||||||
|
rts
|
||||||
|
|
||||||
|
IdBytes:
|
||||||
|
.byte $E0,$20,$E0,$00,$E0,$03,$E0,$3C,$A9,$3F
|
||||||
|
|
||||||
|
TextCardFound:
|
||||||
|
.byte "Found Apple2-IO-RPi in slot ",$00
|
||||||
|
|
||||||
|
TextCardNotFound:
|
||||||
|
.byte "Apple2-IO-RPi not found",$8D,$00
|
||||||
|
|
||||||
|
TextDriverInstalled:
|
||||||
|
.byte "Apple2-IO-RPi Clock driver version 0001",$8D,$00
|
||||||
|
|
||||||
|
Driver:
|
||||||
|
lda #GetTimeCommand
|
||||||
|
SendByte:
|
||||||
|
jsr $C749 ; !! address gets modified on installation
|
||||||
|
ldy #$00
|
||||||
|
getTimeByte:
|
||||||
|
GetByte:
|
||||||
|
jsr $C743 ; !! address gets modified on installation
|
||||||
|
sta $bf90,y
|
||||||
|
iny
|
||||||
|
cpy #$04
|
||||||
|
bne getTimeByte
|
||||||
|
EndDriver:
|
||||||
|
rts
|
|
@ -2,8 +2,9 @@
|
||||||
; Use of this source code is governed by an MIT
|
; Use of this source code is governed by an MIT
|
||||||
; license that can be found in the LICENSE file.
|
; license that can be found in the LICENSE file.
|
||||||
|
|
||||||
; This file contains the source for the firmware
|
; This file formerly contained the source for the
|
||||||
; that was formerly used to act as a pseudo-shell
|
; firmware that had a pseudo command prompt
|
||||||
|
; but is now empty except required common bytes
|
||||||
|
|
||||||
;ProDOS Zero Page
|
;ProDOS Zero Page
|
||||||
Command = $42 ;ProDOS Command
|
Command = $42 ;ProDOS Command
|
||||||
|
@ -32,141 +33,41 @@ LoadFileCommand = $06
|
||||||
SaveFileCommand = $07
|
SaveFileCommand = $07
|
||||||
MenuCommand = $08
|
MenuCommand = $08
|
||||||
|
|
||||||
InputString = $fd67
|
|
||||||
PrintChar = $fded
|
|
||||||
Keyboard = $c000
|
|
||||||
ClearKeyboard = $c010
|
|
||||||
Wait = $fca8
|
|
||||||
|
|
||||||
.org SLOT*$100 + $C000
|
.org SLOT*$100 + $C000
|
||||||
;ID bytes for booting and drive detection
|
;ID bytes for booting and drive detection
|
||||||
cpx #$20 ;ID bytes for ProDOS and the
|
cpx #$20 ;ID bytes for ProDOS
|
||||||
cpx #$00 ; Apple Autostart ROM
|
cpx #$00 ;
|
||||||
cpx #$03 ;
|
cpx #$03 ;
|
||||||
|
cpx #$3C ;ID byte for Autostart ROM
|
||||||
|
|
||||||
ldx #SLOT*$10
|
|
||||||
stx $2b
|
|
||||||
stx Unit
|
|
||||||
|
|
||||||
;force EPROM to second page on boot
|
|
||||||
lda #$3f ;set all flags high and page 3 of EPROM for menu
|
lda #$3f ;set all flags high and page 3 of EPROM for menu
|
||||||
|
jmp PageJump
|
||||||
|
|
||||||
|
;The following bytes must exist in this location for Pascal communications
|
||||||
|
;as they are standard pointers for entry points
|
||||||
|
.byte CommInit&$00FF ;low byte of rts for init of Pascal comms
|
||||||
|
.byte $43 ; low byte of read for Pascal comms
|
||||||
|
.byte $49 ; low byte of write for Pascal comms
|
||||||
|
.byte $4F ; low byte of rts for status of Pascal comms
|
||||||
|
|
||||||
|
CommInit:
|
||||||
|
lda #$0f ; set all flags high and page 0 for comm driver
|
||||||
|
sta OutputFlags
|
||||||
|
ldx #$00 ; set error code to 0 for success
|
||||||
|
rts
|
||||||
|
|
||||||
PageJump:
|
PageJump:
|
||||||
sta OutputFlags
|
sta OutputFlags
|
||||||
jmp Start ;this jump is only called if coming in from PageJump with A=$2f
|
jmp Start ;this jump is only called if coming in from PageJump with A=$0f
|
||||||
|
|
||||||
;entry points for ProDOS
|
;entry points for ProDOS
|
||||||
DriverEntry:
|
DriverEntry:
|
||||||
lda #$0f ;set all flags high and page 0 of EPROM
|
lda #$0f ;set all flags high and page 0 of EPROM
|
||||||
sta OutputFlags
|
sta OutputFlags
|
||||||
|
jmp Start ; this is never called as the EPROM page changes
|
||||||
|
|
||||||
|
;load first two blocks and execute to boot
|
||||||
Start:
|
Start:
|
||||||
jsr $c300 ;enable 80 columns
|
|
||||||
lda #$05 ;execute command
|
|
||||||
jsr SendByte
|
|
||||||
ldy #$00
|
|
||||||
sendHelp:
|
|
||||||
lda HelpCommand,y
|
|
||||||
beq endSendHelp
|
|
||||||
jsr SendByte
|
|
||||||
iny
|
|
||||||
bne sendHelp
|
|
||||||
endSendHelp:
|
|
||||||
lda #$00
|
|
||||||
jsr SendByte
|
|
||||||
jsr DumpOutput
|
|
||||||
|
|
||||||
lda $33
|
|
||||||
pha
|
|
||||||
lda #$a4
|
|
||||||
sta $33
|
|
||||||
GetCommand:
|
|
||||||
jsr InputString
|
|
||||||
lda $0200
|
|
||||||
cmp #$8d ;skip when return found
|
|
||||||
beq GetCommand
|
|
||||||
jsr SendCommand
|
|
||||||
clc
|
|
||||||
bcc GetCommand
|
|
||||||
|
|
||||||
SendCommand:
|
|
||||||
bit ClearKeyboard
|
|
||||||
lda #$05 ;send command 5 = exec
|
|
||||||
jsr SendByte
|
|
||||||
ldy #$00
|
|
||||||
getInput:
|
|
||||||
lda $0200,y
|
|
||||||
cmp #$8d
|
|
||||||
beq sendNullTerminator
|
|
||||||
and #$7f
|
|
||||||
jsr SendByte
|
|
||||||
iny
|
|
||||||
bne getInput
|
|
||||||
sendNullTerminator:
|
|
||||||
lda #$00
|
|
||||||
jsr SendByte
|
|
||||||
DumpOutput:
|
|
||||||
jsr GetByte
|
|
||||||
bcs skipOutput
|
|
||||||
cmp #$00
|
|
||||||
beq endOutput
|
|
||||||
jsr PrintChar
|
|
||||||
skipOutput:
|
|
||||||
bit Keyboard ;check for keypress
|
|
||||||
bpl DumpOutput ;keep dumping output if no keypress
|
|
||||||
lda Keyboard ;send keypress to RPi
|
|
||||||
jsr PrintChar
|
|
||||||
and #$7f
|
|
||||||
jsr SendByte
|
|
||||||
bit ClearKeyboard
|
|
||||||
clc
|
|
||||||
bcc DumpOutput
|
|
||||||
endOutput:
|
|
||||||
rts
|
|
||||||
|
|
||||||
HelpCommand:
|
|
||||||
.byte "a2help",$00
|
|
||||||
|
|
||||||
SendByte:
|
|
||||||
bit InputFlags
|
|
||||||
bvs SendByte
|
|
||||||
sta OutputByte
|
|
||||||
.if HW_TYPE = 0
|
|
||||||
lda #$1e ; set bit 0 low to indicate write started
|
|
||||||
sta OutputFlags
|
|
||||||
finishWrite:
|
|
||||||
bit InputFlags
|
|
||||||
bvc finishWrite
|
|
||||||
lda #$1f
|
|
||||||
sta OutputFlags
|
|
||||||
.endif
|
|
||||||
rts
|
|
||||||
|
|
||||||
GetByte:
|
|
||||||
.if HW_TYPE = 0
|
|
||||||
ldx #$1d ;set read flag low
|
|
||||||
stx OutputFlags
|
|
||||||
.endif
|
|
||||||
waitRead:
|
|
||||||
bit InputFlags
|
|
||||||
bpl readByte
|
|
||||||
bit Keyboard ;keypress will abort waiting to read
|
|
||||||
bpl waitRead
|
|
||||||
.if HW_TYPE = 0
|
|
||||||
lda #$1f ;set all flags high and exit
|
|
||||||
sta OutputFlags
|
|
||||||
.endif
|
|
||||||
sec ;failure
|
|
||||||
rts
|
|
||||||
readByte:
|
|
||||||
lda InputByte
|
|
||||||
.if HW_TYPE = 0
|
|
||||||
ldx #$1f ;set all flags high
|
|
||||||
stx OutputFlags
|
|
||||||
finishRead:
|
|
||||||
bit InputFlags
|
|
||||||
bpl finishRead
|
|
||||||
.endif
|
|
||||||
clc ;success
|
|
||||||
end:
|
end:
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
@ -175,5 +76,6 @@ end:
|
||||||
.endrepeat
|
.endrepeat
|
||||||
|
|
||||||
.byte 0,0 ;0000 blocks = check status
|
.byte 0,0 ;0000 blocks = check status
|
||||||
.byte 7 ;bit set(0=status 1=read 2=write) unset(3=format, 4/5=number of volumes, 6=interruptable, 7=removable)
|
.byte 23 ;bit set(0=status 1=read 2=write) unset(3=format, 4/5=number of volumes, 6=interruptable, 7=removable)
|
||||||
.byte DriverEntry&$00FF ;low byte of entry
|
.byte DriverEntry&$00FF ;low byte of entry
|
||||||
|
|
||||||
|
|
|
@ -36,16 +36,27 @@ MenuCommand = $08
|
||||||
|
|
||||||
.org SLOT*$100 + $C000
|
.org SLOT*$100 + $C000
|
||||||
;ID bytes for booting and drive detection
|
;ID bytes for booting and drive detection
|
||||||
cpx #$20 ;ID bytes for ProDOS and the
|
cpx #$20 ;ID bytes for ProDOS
|
||||||
cpx #$00 ; Apple Autostart ROM
|
cpx #$00 ;
|
||||||
cpx #$03 ;
|
cpx #$03 ;
|
||||||
|
cpx #$3C ;ID byte for Autostart ROM
|
||||||
|
|
||||||
ldx #SLOT*$10
|
|
||||||
stx $2b
|
|
||||||
stx Unit
|
|
||||||
|
|
||||||
;force EPROM to second page on boot
|
|
||||||
lda #$3f ;set all flags high and page 3 of EPROM for menu
|
lda #$3f ;set all flags high and page 3 of EPROM for menu
|
||||||
|
jmp PageJump
|
||||||
|
|
||||||
|
;The following bytes must exist in this location for Pascal communications
|
||||||
|
;as they are standard pointers for entry points
|
||||||
|
.byte CommInit&$00FF ;low byte of rts for init of Pascal comms
|
||||||
|
.byte CommRead&$00FF ; low byte of read for Pascal comms
|
||||||
|
.byte CommWrite&$00FF ; low byte of write for Pascal comms
|
||||||
|
.byte CommStatus&$00FF ; low byte of rts for status of Pascal comms
|
||||||
|
|
||||||
|
CommInit:
|
||||||
|
lda #$0f ; set all flags high and page 0 for comm driver
|
||||||
|
sta OutputFlags
|
||||||
|
ldx #$00 ; set error code to 0 for success
|
||||||
|
rts
|
||||||
|
|
||||||
PageJump:
|
PageJump:
|
||||||
sta OutputFlags
|
sta OutputFlags
|
||||||
jmp Start ;this jump is only called if coming in from PageJump with A=$0f
|
jmp Start ;this jump is only called if coming in from PageJump with A=$0f
|
||||||
|
@ -58,6 +69,10 @@ DriverEntry:
|
||||||
|
|
||||||
;load first two blocks and execute to boot
|
;load first two blocks and execute to boot
|
||||||
Start:
|
Start:
|
||||||
|
ldx #SLOT*$10
|
||||||
|
stx $2b
|
||||||
|
stx Unit
|
||||||
|
|
||||||
lda #$01 ;set read command
|
lda #$01 ;set read command
|
||||||
sta Command
|
sta Command
|
||||||
|
|
||||||
|
@ -71,6 +86,21 @@ Start:
|
||||||
|
|
||||||
jmp $801 ;execute the block
|
jmp $801 ;execute the block
|
||||||
|
|
||||||
|
CommRead:
|
||||||
|
jsr GetByte
|
||||||
|
ldx #$00 ; clear error code
|
||||||
|
rts
|
||||||
|
|
||||||
|
CommWrite:
|
||||||
|
jsr SendByte
|
||||||
|
ldx #$00 ; clear error code
|
||||||
|
rts
|
||||||
|
|
||||||
|
CommStatus:
|
||||||
|
ldx #$00 ; clear error code
|
||||||
|
sec ; set carry to indicate ready to read or write
|
||||||
|
rts
|
||||||
|
|
||||||
; ProDOS Driver code
|
; ProDOS Driver code
|
||||||
; First check that this is the right drive
|
; First check that this is the right drive
|
||||||
Driver:
|
Driver:
|
||||||
|
@ -78,7 +108,7 @@ Driver:
|
||||||
lda Command; Check which command is being requested
|
lda Command; Check which command is being requested
|
||||||
beq GetStatus ;0 = Status command
|
beq GetStatus ;0 = Status command
|
||||||
cmp #ReadBlockCommand
|
cmp #ReadBlockCommand
|
||||||
beq ReadBlockAndSetTime
|
beq ReadBlock
|
||||||
cmp #WriteBlockCommand
|
cmp #WriteBlockCommand
|
||||||
beq WriteBlock
|
beq WriteBlock
|
||||||
sec ;set carry as we don't support any other commands
|
sec ;set carry as we don't support any other commands
|
||||||
|
@ -94,22 +124,7 @@ GetStatus:
|
||||||
rts
|
rts
|
||||||
|
|
||||||
; ProDOS Read Block Command
|
; ProDOS Read Block Command
|
||||||
ReadBlockAndSetTime:
|
ReadBlock:
|
||||||
lda BlockHi ; only get the time if block 0002
|
|
||||||
bne readBlock
|
|
||||||
lda BlockLo
|
|
||||||
cmp #$02
|
|
||||||
bne readBlock
|
|
||||||
ldy #$00 ;Get the current time on each block read for now
|
|
||||||
lda #GetTimeCommand
|
|
||||||
jsr SendByte
|
|
||||||
getTimeByte:
|
|
||||||
jsr GetByte
|
|
||||||
sta $bf90,y
|
|
||||||
iny
|
|
||||||
cpy #$04
|
|
||||||
bne getTimeByte
|
|
||||||
readBlock:
|
|
||||||
lda #ReadBlockCommand ;read the block after setting the clock
|
lda #ReadBlockCommand ;read the block after setting the clock
|
||||||
jsr SendByte
|
jsr SendByte
|
||||||
lda BlockLo
|
lda BlockLo
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
; Use of this source code is governed by an MIT
|
; Use of this source code is governed by an MIT
|
||||||
; license that can be found in the LICENSE file.
|
; license that can be found in the LICENSE file.
|
||||||
|
|
||||||
; This file contains the source for the firmware
|
; This file formerly contained the source for the
|
||||||
; that was formerly used to copy files from RPi
|
; firmware that had a file access
|
||||||
; to Apple II RAM
|
; but is now empty except required common bytes
|
||||||
|
|
||||||
;ProDOS Zero Page
|
;ProDOS Zero Page
|
||||||
Command = $42 ;ProDOS Command
|
Command = $42 ;ProDOS Command
|
||||||
|
@ -33,117 +33,41 @@ LoadFileCommand = $06
|
||||||
SaveFileCommand = $07
|
SaveFileCommand = $07
|
||||||
MenuCommand = $08
|
MenuCommand = $08
|
||||||
|
|
||||||
InputString = $fd67
|
|
||||||
Monitor = $ff59
|
|
||||||
|
|
||||||
.org SLOT*$100 + $C000
|
.org SLOT*$100 + $C000
|
||||||
;ID bytes for booting and drive detection
|
;ID bytes for booting and drive detection
|
||||||
cpx #$20 ;ID bytes for ProDOS and the
|
cpx #$20 ;ID bytes for ProDOS
|
||||||
cpx #$00 ; Apple Autostart ROM
|
cpx #$00 ;
|
||||||
cpx #$03 ;
|
cpx #$03 ;
|
||||||
|
cpx #$3C ;ID byte for Autostart ROM
|
||||||
|
|
||||||
ldx #SLOT*$10
|
|
||||||
stx $2b
|
|
||||||
stx Unit
|
|
||||||
|
|
||||||
;force EPROM to second page on boot
|
|
||||||
lda #$3f ;set all flags high and page 3 of EPROM for menu
|
lda #$3f ;set all flags high and page 3 of EPROM for menu
|
||||||
|
jmp PageJump
|
||||||
|
|
||||||
|
;The following bytes must exist in this location for Pascal communications
|
||||||
|
;as they are standard pointers for entry points
|
||||||
|
.byte CommInit&$00FF ;low byte of rts for init of Pascal comms
|
||||||
|
.byte $43 ; low byte of read for Pascal comms
|
||||||
|
.byte $49 ; low byte of write for Pascal comms
|
||||||
|
.byte $4F ; low byte of rts for status of Pascal comms
|
||||||
|
|
||||||
|
CommInit:
|
||||||
|
lda #$0f ; set all flags high and page 0 for comm driver
|
||||||
|
sta OutputFlags
|
||||||
|
ldx #$00 ; set error code to 0 for success
|
||||||
|
rts
|
||||||
|
|
||||||
PageJump:
|
PageJump:
|
||||||
sta OutputFlags
|
sta OutputFlags
|
||||||
jmp Start ;this jump is only called if coming in from PageJump with A=$2f
|
jmp Start ;this jump is only called if coming in from PageJump with A=$0f
|
||||||
|
|
||||||
;entry points for ProDOS
|
;entry points for ProDOS
|
||||||
DriverEntry:
|
DriverEntry:
|
||||||
lda #$0f ;set all flags high and page 0 of EPROM
|
lda #$0f ;set all flags high and page 0 of EPROM
|
||||||
sta OutputFlags
|
sta OutputFlags
|
||||||
|
jmp Start ; this is never called as the EPROM page changes
|
||||||
|
|
||||||
|
;load first two blocks and execute to boot
|
||||||
Start:
|
Start:
|
||||||
lda #$a4
|
|
||||||
sta $33
|
|
||||||
|
|
||||||
GetFilename:
|
|
||||||
jsr InputString
|
|
||||||
|
|
||||||
LoadFile:
|
|
||||||
lda #$00
|
|
||||||
sta BufferLo
|
|
||||||
lda #$20
|
|
||||||
sta BufferHi
|
|
||||||
lda #$06 ; send command 6 = load
|
|
||||||
jsr SendByte
|
|
||||||
ldy #$00
|
|
||||||
sendFilename:
|
|
||||||
lda $0200,y
|
|
||||||
cmp #$8d
|
|
||||||
beq sendNullTerminator
|
|
||||||
and #$7f
|
|
||||||
jsr SendByte
|
|
||||||
iny
|
|
||||||
bne sendFilename
|
|
||||||
sendNullTerminator:
|
|
||||||
lda #$00
|
|
||||||
jsr SendByte
|
|
||||||
|
|
||||||
jsr GetByte
|
|
||||||
sta BlockLo ; not really a block, just using the memory space
|
|
||||||
jsr GetByte
|
|
||||||
sta BlockHi
|
|
||||||
NextPage:
|
|
||||||
lda BlockHi
|
|
||||||
beq ReadFinalPage
|
|
||||||
ldy #$00
|
|
||||||
NextByte:
|
|
||||||
jsr GetByte
|
|
||||||
sta (BufferLo),y
|
|
||||||
iny
|
|
||||||
bne NextByte
|
|
||||||
inc BufferHi
|
|
||||||
dec BlockHi
|
|
||||||
bne NextPage
|
|
||||||
ReadFinalPage:
|
|
||||||
lda BlockLo
|
|
||||||
beq ExitToMonitor
|
|
||||||
ldy #$00
|
|
||||||
NextByteFinal:
|
|
||||||
jsr GetByte
|
|
||||||
sta (BufferLo),y
|
|
||||||
iny
|
|
||||||
cpy BlockLo
|
|
||||||
bne NextByteFinal
|
|
||||||
ExitToMonitor:
|
|
||||||
jsr Monitor
|
|
||||||
|
|
||||||
SendByte:
|
|
||||||
bit InputFlags
|
|
||||||
bvs SendByte
|
|
||||||
sta OutputByte
|
|
||||||
.if HW_TYPE = 0
|
|
||||||
lda #$2e ; set bit 0 low to indicate write started
|
|
||||||
sta OutputFlags
|
|
||||||
finishWrite:
|
|
||||||
bit InputFlags
|
|
||||||
bvc finishWrite
|
|
||||||
lda #$2f
|
|
||||||
sta OutputFlags
|
|
||||||
.endif
|
|
||||||
rts
|
|
||||||
|
|
||||||
GetByte:
|
|
||||||
.if HW_TYPE = 0
|
|
||||||
ldx #$2d ;set read flag low
|
|
||||||
stx OutputFlags
|
|
||||||
.endif
|
|
||||||
waitRead:
|
|
||||||
bit InputFlags
|
|
||||||
bmi waitRead
|
|
||||||
lda InputByte
|
|
||||||
.if HW_TYPE = 0
|
|
||||||
ldx #$2f ;set all flags high
|
|
||||||
stx OutputFlags
|
|
||||||
finishRead:
|
|
||||||
bit InputFlags
|
|
||||||
bpl finishRead
|
|
||||||
.endif
|
|
||||||
end:
|
end:
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
@ -152,6 +76,6 @@ end:
|
||||||
.endrepeat
|
.endrepeat
|
||||||
|
|
||||||
.byte 0,0 ;0000 blocks = check status
|
.byte 0,0 ;0000 blocks = check status
|
||||||
.byte 7 ;bit set(0=status 1=read 2=write) unset(3=format, 4/5=number of volumes, 6=interruptable, 7=removable)
|
.byte 23 ;bit set(0=status 1=read 2=write) unset(3=format, 4/5=number of volumes, 6=interruptable, 7=removable)
|
||||||
.byte DriverEntry&$00FF ;low byte of entry
|
.byte DriverEntry&$00FF ;low byte of entry
|
||||||
|
|
||||||
|
|
|
@ -47,19 +47,30 @@ htab80 = $057b
|
||||||
|
|
||||||
.org SLOT*$100 + $C000
|
.org SLOT*$100 + $C000
|
||||||
;ID bytes for booting and drive detection
|
;ID bytes for booting and drive detection
|
||||||
cpx #$20 ;ID bytes for ProDOS and the
|
cpx #$20 ;ID bytes for ProDOS
|
||||||
cpx #$00 ; Apple Autostart ROM
|
cpx #$00 ;
|
||||||
cpx #$03 ;
|
cpx #$03 ;
|
||||||
|
cpx #$3C ;ID byte for Autostart ROM
|
||||||
|
|
||||||
ldx #SLOT*$10
|
lda #$3f ;set all flags high and page 3 of EPROM for menu
|
||||||
stx $2b
|
jmp PageJump
|
||||||
stx Unit
|
|
||||||
|
;The following bytes must exist in this location for Pascal communications
|
||||||
|
;as they are standard pointers for entry points
|
||||||
|
.byte CommInit&$00FF ;low byte of rts for init of Pascal comms
|
||||||
|
.byte $43 ; low byte of read for Pascal comms
|
||||||
|
.byte $49 ; low byte of write for Pascal comms
|
||||||
|
.byte $4F ; low byte of rts for status of Pascal comms
|
||||||
|
|
||||||
|
CommInit:
|
||||||
|
lda #$0f ; set all flags high and page 0 for comm driver
|
||||||
|
sta OutputFlags
|
||||||
|
ldx #$00 ; set error code to 0 for success
|
||||||
|
rts
|
||||||
|
|
||||||
;force EPROM to second page on boot
|
|
||||||
lda #$3f ;set all flags high and page 1 of EPROMi
|
|
||||||
PageJump:
|
PageJump:
|
||||||
sta OutputFlags
|
sta OutputFlags
|
||||||
jmp Start
|
jmp Start ;this jump is only called if coming in from PageJump with A=$0f
|
||||||
|
|
||||||
;entry points for ProDOS
|
;entry points for ProDOS
|
||||||
DriverEntry:
|
DriverEntry:
|
||||||
|
@ -191,9 +202,9 @@ Text:
|
||||||
.byte "(c)2020-2024 Terence J. Boldt",$8d
|
.byte "(c)2020-2024 Terence J. Boldt",$8d
|
||||||
.byte $8d
|
.byte $8d
|
||||||
.if HW_TYPE = 0
|
.if HW_TYPE = 0
|
||||||
.byte "Waiting for RPi FW:0010..."
|
.byte "Waiting for RPi FW:0011"
|
||||||
.else
|
.else
|
||||||
.byte "Waiting for RPi FW:8010..."
|
.byte "Waiting for RPi FW:8011"
|
||||||
.endif
|
.endif
|
||||||
end:
|
end:
|
||||||
.byte $00
|
.byte $00
|
||||||
|
@ -205,4 +216,3 @@ end:
|
||||||
.byte 0,0 ;0000 blocks = check status
|
.byte 0,0 ;0000 blocks = check status
|
||||||
.byte 7 ;bit set(0=status 1=read 2=write) unset(3=format, 4/5=number of volumes, 6=interruptable, 7=removable)
|
.byte 7 ;bit set(0=status 1=read 2=write) unset(3=format, 4/5=number of volumes, 6=interruptable, 7=removable)
|
||||||
.byte DriverEntry&$00FF ;low byte of entry
|
.byte DriverEntry&$00FF ;low byte of entry
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ MenuCommand = $08
|
||||||
|
|
||||||
InputString = $fd67
|
InputString = $fd67
|
||||||
PrintChar = $fded
|
PrintChar = $fded
|
||||||
|
PrintHex = $fde3
|
||||||
Keyboard = $c000
|
Keyboard = $c000
|
||||||
ClearKeyboard = $c010
|
ClearKeyboard = $c010
|
||||||
Wait = $fca8
|
Wait = $fca8
|
||||||
|
@ -50,53 +51,68 @@ ESC = $9b
|
||||||
.endmacro
|
.endmacro
|
||||||
|
|
||||||
.org $2000
|
.org $2000
|
||||||
ldx #$07 ; start at slot 7
|
; Find Apple2-IO-RPi card
|
||||||
DetectSlot:
|
ldx #$06
|
||||||
|
ldy #$09
|
||||||
|
CheckIdBytes:
|
||||||
|
lda $C700,y ; !! Self modifying code
|
||||||
|
cmp IdBytes,y
|
||||||
|
bne NextCard
|
||||||
|
dey
|
||||||
|
bne CheckIdBytes
|
||||||
|
jmp FoundCard
|
||||||
|
NextCard:
|
||||||
|
dec CheckIdBytes+2
|
||||||
|
ldy #$09
|
||||||
|
dex
|
||||||
|
bne CheckIdBytes
|
||||||
|
CardNotFound:
|
||||||
ldy #$00
|
ldy #$00
|
||||||
lda #$fc
|
PrintCardNotFound:
|
||||||
sta SlotL
|
lda TextCardNotFound,y
|
||||||
|
beq Failed
|
||||||
|
jsr PrintChar
|
||||||
|
iny
|
||||||
|
bne PrintCardNotFound
|
||||||
|
Failed:
|
||||||
|
rts
|
||||||
|
FoundCard:
|
||||||
|
ldy #$00
|
||||||
|
PrintCardFound:
|
||||||
|
lda TextCardFound,y
|
||||||
|
beq PrintCardNumber
|
||||||
|
jsr PrintChar
|
||||||
|
iny
|
||||||
|
bne PrintCardFound
|
||||||
|
PrintCardNumber:
|
||||||
|
inx
|
||||||
txa
|
txa
|
||||||
ora #$c0
|
jsr PrintHex
|
||||||
sta SlotH
|
lda #$8D
|
||||||
lda (SlotL),y
|
jsr PrintChar
|
||||||
bne nextSlot
|
|
||||||
iny
|
SetOffsetForCard:
|
||||||
lda (SlotL),y
|
|
||||||
bne nextSlot
|
|
||||||
iny
|
|
||||||
lda (SlotL),y
|
|
||||||
cmp #$17
|
|
||||||
bne nextSlot
|
|
||||||
iny
|
|
||||||
lda (SlotL),y
|
|
||||||
cmp #$14
|
|
||||||
bne nextSlot
|
|
||||||
txa
|
txa
|
||||||
asl
|
asl
|
||||||
asl
|
asl
|
||||||
asl
|
asl
|
||||||
asl
|
asl
|
||||||
tax
|
tax
|
||||||
clc
|
|
||||||
bcc Start
|
|
||||||
nextSlot:
|
|
||||||
dex
|
|
||||||
bne DetectSlot
|
|
||||||
rts
|
|
||||||
Start:
|
Start:
|
||||||
stx slotx + $1e01 ;set the slot for the driver
|
stx slotx + $1e01 ;set the slot for the driver
|
||||||
ldy #$00
|
ldy #$00
|
||||||
PrintString:
|
PrintString:
|
||||||
lda Text,y
|
lda Text,y
|
||||||
beq copyDriver
|
beq copyDriver
|
||||||
ora #$80
|
|
||||||
jsr PrintChar
|
jsr PrintChar
|
||||||
iny
|
iny
|
||||||
bne PrintString
|
bne PrintString
|
||||||
copyDriver:
|
copyDriver:
|
||||||
ldy #$00
|
ldy #$00
|
||||||
copyDriverByte:
|
copyDriverByte:
|
||||||
lda $2100,y
|
lda $2200,y
|
||||||
sta $0300,y
|
sta $0300,y
|
||||||
iny
|
iny
|
||||||
cpy #$e6
|
cpy #$e6
|
||||||
|
@ -140,8 +156,24 @@ a2help:
|
||||||
.byte "a2help", $00
|
.byte "a2help", $00
|
||||||
|
|
||||||
Text:
|
Text:
|
||||||
aschi "RPI command version: 000E"
|
.if HW_TYPE = 0
|
||||||
|
aschi "RPI command version: 000F (classic)"
|
||||||
|
.else
|
||||||
|
aschi "RPI command version: 800F (pico)"
|
||||||
|
.endif
|
||||||
.byte $8d
|
.byte $8d
|
||||||
|
.byte $00
|
||||||
|
|
||||||
|
IdBytes:
|
||||||
|
.byte $E0,$20,$E0,$00,$E0,$03,$E0,$3C,$A9,$3F
|
||||||
|
|
||||||
|
TextCardFound:
|
||||||
|
aschi "Found Apple2-IO-RPi in slot "
|
||||||
|
.byte $00
|
||||||
|
|
||||||
|
TextCardNotFound:
|
||||||
|
aschi "Apple2-IO-RPi not found"
|
||||||
|
.byte $8D
|
||||||
end:
|
end:
|
||||||
.byte $00
|
.byte $00
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,9 @@ ShellCommand = $09
|
||||||
InputString = $fd6a
|
InputString = $fd6a
|
||||||
StringBuffer = $0200
|
StringBuffer = $0200
|
||||||
PrintChar = $fded
|
PrintChar = $fded
|
||||||
|
PrintHex = $FDE3
|
||||||
|
PrintByte = $FDDA
|
||||||
|
|
||||||
Keyboard = $c000
|
Keyboard = $c000
|
||||||
ClearKeyboard = $c010
|
ClearKeyboard = $c010
|
||||||
Home = $fc58
|
Home = $fc58
|
||||||
|
@ -59,39 +62,55 @@ SlotH = $ff
|
||||||
ESC = $9b
|
ESC = $9b
|
||||||
|
|
||||||
.org $2000
|
.org $2000
|
||||||
ldx #$07 ; start at slot 7
|
; Find Apple2-IO-RPi card
|
||||||
DetectSlot:
|
ldx #$06
|
||||||
|
ldy #$09
|
||||||
|
CheckIdBytes:
|
||||||
|
lda $C700,y ; !! Self modifying code
|
||||||
|
cmp IdBytes,y
|
||||||
|
bne NextCard
|
||||||
|
dey
|
||||||
|
bne CheckIdBytes
|
||||||
|
jmp FoundCard
|
||||||
|
NextCard:
|
||||||
|
dec CheckIdBytes+2
|
||||||
|
ldy #$09
|
||||||
|
dex
|
||||||
|
bne CheckIdBytes
|
||||||
|
CardNotFound:
|
||||||
ldy #$00
|
ldy #$00
|
||||||
lda #$fc
|
PrintCardNotFound:
|
||||||
sta SlotL
|
lda TextCardNotFound,y
|
||||||
|
beq Failed
|
||||||
|
ora #$80
|
||||||
|
jsr PrintChar
|
||||||
|
iny
|
||||||
|
bne PrintCardNotFound
|
||||||
|
Failed:
|
||||||
|
rts
|
||||||
|
FoundCard:
|
||||||
|
ldy #$00
|
||||||
|
PrintCardFound:
|
||||||
|
lda TextCardFound,y
|
||||||
|
beq PrintCardNumber
|
||||||
|
ora #$80
|
||||||
|
jsr PrintChar
|
||||||
|
iny
|
||||||
|
bne PrintCardFound
|
||||||
|
PrintCardNumber:
|
||||||
|
inx
|
||||||
txa
|
txa
|
||||||
ora #$c0
|
jsr PrintHex
|
||||||
sta SlotH
|
lda #$8D
|
||||||
lda (SlotL),y
|
jsr PrintChar
|
||||||
bne nextSlot
|
|
||||||
iny
|
SetOffsetForCard:
|
||||||
lda (SlotL),y
|
|
||||||
bne nextSlot
|
|
||||||
iny
|
|
||||||
lda (SlotL),y
|
|
||||||
cmp #$17
|
|
||||||
bne nextSlot
|
|
||||||
iny
|
|
||||||
lda (SlotL),y
|
|
||||||
cmp #$14
|
|
||||||
bne nextSlot
|
|
||||||
txa
|
txa
|
||||||
asl
|
asl
|
||||||
asl
|
asl
|
||||||
asl
|
asl
|
||||||
asl
|
asl
|
||||||
tax
|
tax
|
||||||
clc
|
|
||||||
bcc Init
|
|
||||||
nextSlot:
|
|
||||||
dex
|
|
||||||
bne DetectSlot
|
|
||||||
rts
|
|
||||||
|
|
||||||
Init:
|
Init:
|
||||||
lda #$8d
|
lda #$8d
|
||||||
|
@ -291,10 +310,19 @@ restoreChar:
|
||||||
|
|
||||||
Text:
|
Text:
|
||||||
.if HW_TYPE = 0
|
.if HW_TYPE = 0
|
||||||
.byte "Apple2-IO-RPi Shell Version 000F",$8d
|
.byte "Apple2-IO-RPi Shell Version 0010 (classic)",$8d
|
||||||
.else
|
.else
|
||||||
.byte "Apple2-IO-RPi Shell Version 800F",$8d
|
.byte "Apple2-IO-RPi Shell Version 8010 (pico)",$8d
|
||||||
.endif
|
.endif
|
||||||
.byte "(c)2020-2024 Terence J. Boldt",$8d
|
.byte "(c)2020-2024 Terence J. Boldt",$8d
|
||||||
.byte $8d
|
.byte $8d
|
||||||
.byte $00
|
.byte $00
|
||||||
|
|
||||||
|
IdBytes:
|
||||||
|
.byte $E0,$20,$E0,$00,$E0,$03,$E0,$3C,$A9,$3F
|
||||||
|
|
||||||
|
TextCardFound:
|
||||||
|
.byte "Found Apple2-IO-RPi in slot ",$00
|
||||||
|
|
||||||
|
TextCardNotFound:
|
||||||
|
.byte "Apple2-IO-RPi not found",$8D,$00
|
||||||
|
|
|
@ -9,6 +9,5 @@
|
||||||
18 PRINT "To start a shell to the RPi, type:"
|
18 PRINT "To start a shell to the RPi, type:"
|
||||||
19 PRINT "-shell"
|
19 PRINT "-shell"
|
||||||
20 PRINT
|
20 PRINT
|
||||||
21 PRINT "To add RPI command to ProDOS, type:"
|
21 PRINT CHR$ (4)"-clock.driver"
|
||||||
22 PRINT "-rpi.command"
|
22 PRINT CHR$ (4)"-rpi.command"
|
||||||
23 PRINT
|
|
||||||
|
|
|
@ -88,7 +88,12 @@ ca65 RPi.Command.asm -D HW_TYPE=%HW_TYPE% -o RPi.Command.o --listing RPi.Command
|
||||||
ld65 RPi.Command.o -o RPi.Command.bin -C ../.cicd/none.cfg
|
ld65 RPi.Command.o -o RPi.Command.bin -C ../.cicd/none.cfg
|
||||||
@if errorlevel 1 goto exit
|
@if errorlevel 1 goto exit
|
||||||
|
|
||||||
del *.o
|
ca65 Clock.Driver.asm -D HW_TYPE=%HW_TYPE% -o Clock.Driver.o --listing Clock.Driver.lst
|
||||||
|
@if errorlevel 1 goto exit
|
||||||
|
ld65 Clock.Driver.o -o Clock.Driver.bin -C ../.cicd/none.cfg
|
||||||
|
@if errorlevel 1 goto exit
|
||||||
|
|
||||||
|
cdel *.o
|
||||||
del DriveFirmware.bin
|
del DriveFirmware.bin
|
||||||
del MenuFirmware.bin
|
del MenuFirmware.bin
|
||||||
del CommandFirmware.bin
|
del CommandFirmware.bin
|
||||||
|
|
|
@ -51,6 +51,9 @@ ld65 Shell.o -o ../RaspberryPi/driveimage/Shell.bin -C ../.cicd/none.cfg || exi
|
||||||
ca65 RPi.Command.asm -D HW_TYPE=$HW_TYPE -o RPi.Command.o --listing RPi.Command.lst || exit 1
|
ca65 RPi.Command.asm -D HW_TYPE=$HW_TYPE -o RPi.Command.o --listing RPi.Command.lst || exit 1
|
||||||
ld65 RPi.Command.o -o ../RaspberryPi/driveimage/RPi.Command.bin -C ../.cicd/none.cfg || exit 1
|
ld65 RPi.Command.o -o ../RaspberryPi/driveimage/RPi.Command.bin -C ../.cicd/none.cfg || exit 1
|
||||||
|
|
||||||
|
ca65 Clock.Driver.asm -D HW_TYPE=$HW_TYPE -o Clock.Driver.o --listing Clock.Driver.lst || exit 1
|
||||||
|
ld65 Clock.Driver.o -o ../RaspberryPi/driveimage/Clock.Driver.bin -C ../.cicd/none.cfg || exit 1
|
||||||
|
|
||||||
rm ./*.o
|
rm ./*.o
|
||||||
rm DriveFirmware.bin
|
rm DriveFirmware.bin
|
||||||
rm MenuFirmware.bin
|
rm MenuFirmware.bin
|
||||||
|
|
Loading…
Reference in New Issue
Block a user