; Copyright Terence J. Boldt (c)2021-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 SHELL
; application that runs on the Apple II to talk
; to the Raspberry Pi

;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
OutputByte = $c08d
InputFlags = $c08b
OutputFlags = $c087

ResetCommand = $00
ReadBlockCommand = $01
WriteBlockCommand = $02
GetTimeCommand = $03
ChangeDriveCommand = $04
ExecCommand = $05
LoadFileCommand = $06
SaveFileCommand = $07
MenuCommand = $08
ShellCommand = $09

InputString = $fd6a
StringBuffer = $0200
PrintChar = $fded
Keyboard = $c000
ClearKeyboard = $c010
Home = $fc58
Wait = $fca8
PromptChar = $33
Read80Col = $c01f
TextPage1 = $c054
TextPage2 = $c055

htab = $24
vtab = $25
BasL = $28
htab80 = $057b
BasCalc = $fbc1

LastChar = $06
SlotL = $fe
SlotH = $ff
ESC = $9b

 .org $2000
 ldx #$07 ; start at slot 7
DetectSlot:
 ldy #$00
 lda #$fc
 sta SlotL
 txa
 ora #$c0
 sta SlotH 
 lda (SlotL),y
 bne nextSlot
 iny
 lda (SlotL),y
 bne nextSlot
 iny 
 lda (SlotL),y
 cmp #$17
 bne nextSlot
 iny
 lda (SlotL),y
 cmp #$14
 bne nextSlot
 txa
 asl
 asl
 asl
 asl
 tax
 clc
 bcc Init
nextSlot:
 dex
 bne DetectSlot
 rts 

Init:
 lda #$8d
 jsr $c300 ; force 80 columns

 ldy #$00
PrintString:
 lda Text,y
 beq Start
 ora #$80
 jsr PrintChar
 iny
 bne PrintString

Start:
 lda LastChar
 pha
 bit ClearKeyboard
; lda #ResetCommand
; jsr SendByte
 lda #ShellCommand
 jsr SendByte
 jsr DumpOutput
 pla
 sta LastChar
 rts

DumpOutput:
 jsr GetByte
 cmp #$00
 beq endOutput
 pha
 jsr ClearCursor
 pla
 cmp #'H'
 beq setColumn
 cmp #'V'
 beq setRow
 cmp #'C'
 beq clearScreen
 cmp #'T'
 beq setTop
 cmp #'B'
 beq setBottom
 cmp #'U'
 beq moveUp
 jsr PrintChar
 jsr SetCursor
 jmp DumpOutput
endOutput:
 rts
clearScreen:
 jsr Home
 jsr SetCursor
 jmp DumpOutput
setColumn:
 jsr GetByte
 sta htab
 sta htab80
 jsr SetCursor
 jmp DumpOutput
setRow:
 jsr GetByte
 sta vtab
 jsr BasCalc
 jsr SetCursor
 jmp DumpOutput
setTop:
 jsr GetByte
 sta $22
 jmp DumpOutput
setBottom:
 jsr GetByte
 sta $23
 jmp DumpOutput
moveUp:
 dec vtab
 lda vtab
 jsr BasCalc
 jsr SetCursor
 jmp DumpOutput

SendByte:
 pha 
waitWrite: 
 lda InputFlags,x
 rol
 rol 
 bcs waitWrite
 pla
 sta OutputByte,x
.if HW_TYPE = 0
 lda #$1e ; set bit 0 low to indicate write started
 sta OutputFlags,x 
finishWrite:
 lda InputFlags,x
 rol
 rol
 bcc finishWrite
 lda #$1f
 sta OutputFlags,x
.endif
 rts

GetByte:
.if HW_TYPE = 0
 lda #$1d ;set read flag low
 sta OutputFlags,x
.endif
waitRead:
 lda InputFlags,x
 rol
 bcc readByte
 bit Keyboard ;keypress will abort waiting to read
 bpl waitRead
keyPressed:
 lda InputFlags,x
 rol
 rol
 bcs keyPressed
 lda Keyboard ;send keypress to RPi
 and #$7f
 sta OutputByte,x
 bit ClearKeyboard
.if HW_TYPE = 0
 lda #$1c ;set write flag low too
 sta OutputFlags,x
finishKeyPress:
 lda InputFlags,x
 rol
 rol
 bcc finishKeyPress
 lda #$1d ;set flags back for reading
 sta OutputFlags,x
.endif
 jmp waitRead
readByte:
 lda InputByte,x
.if HW_TYPE = 0
 pha
 lda #$1f ;set all flags high
 sta OutputFlags,x
finishRead:
 lda InputFlags,x
 rol
 bcc finishRead
 pla
.endif
 clc ;success
end:
 rts

SetCursor:
 lda htab80 ;get horizontal location / 2
 lsr
 tay
 lda TextPage2
 bcc setChar
 lda TextPage1
setChar:
 lda (BasL),y
 sta LastChar ; save so ClearCursor will pick it up
 cmp #$e0
 bpl lowerCase
 cmp #$c0
 bpl upperCase
 cmp #$a0
 bpl symbol
 cmp #$80
 bpl noop
symbol:
lowerCase:
invert:
 eor #$80
 jmp storeChar
upperCase:
 and #$1f
 jmp storeChar
noop:
storeChar:
 sta (BasL),y
 lda TextPage1
 rts

ClearCursor:
 lda htab80 ;get horizontal location / 2
 lsr
 tay
 lda TextPage2
 bcc restoreChar
 lda TextPage1
restoreChar:
 lda LastChar 
 sta (BasL),y
 lda TextPage1
 rts

Text:
.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
