mirror of
https://github.com/tjboldt/Apple2-IO-RPi.git
synced 2024-09-29 23:57:22 +00:00
0ef9d567aa
The new hardware type has simple UART-type interface. Beside the two data registers, there are only the two bits to indicate readability and writability of the data registers.
180 lines
3.1 KiB
NASM
180 lines
3.1 KiB
NASM
; Copyright Terence J. Boldt (c)2020-2022
|
|
; 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 firmware
|
|
; that was formerly used to act as a pseudo-shell
|
|
|
|
;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
|
|
MenuCommand = $08
|
|
|
|
InputString = $fd67
|
|
PrintChar = $fded
|
|
Keyboard = $c000
|
|
ClearKeyboard = $c010
|
|
Wait = $fca8
|
|
|
|
.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 #$3f ;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:
|
|
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:
|
|
rts
|
|
|
|
.repeat 251-<end
|
|
.byte 0
|
|
.endrepeat
|
|
|
|
.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 DriverEntry&$00FF ;low byte of entry
|