This commit is contained in:
Joshua Bell 2019-12-08 18:16:21 -08:00
parent 75215cb031
commit 4641da6adf
1 changed files with 198 additions and 96 deletions

View File

@ -4,7 +4,23 @@
.feature string_escapes
.org $2000
.setcpu "6502"
.setcpu "65C02"
.enum MessageCode
kInstall = 0
kNoSysFile = 1
kDiskError = 2
kIIc = 3
kIIe = 4
kCurrentYear = 5
kOkPrompt = 6
kNoClock = 7
kRunning = 8
kSeikoIIc = 9
kSeikoIIe = 10
kRemoveWriteProtect = 11
.endenum
SLOT3_FIRMWARE := $C300
@ -26,45 +42,58 @@ kClockRoutineMaxLength = 125 ; Per ProDOS 8 TRM
L2000:
L2001 := * + 1
lda #$06
L2003 := * + 1
L2003 := * + 1 ; Patched location for ...?
lda #$A0
cmp #$CC
bne L2013
sta L239E + (L1272 - L1000) ; In relocated code
lda #$5C
sta L2285
sta L2336
L2013: ldx #$FF
L2013:
;; Clear stack
ldx #$FF
txs
lda #$00
;; Clear interpreter version
;; TODO: Remove this
lda #0
sta IBAKVER
sta IVERSION
;; Trash reset vector to cause reboot
sta ROMIN2
lda $03F3
eor #$FF
sta $03F4
;; Identify machine type
ldy #$00
ldx #$00
lda MACHID
and #%10001000 ; IIe or later, modifier
beq L2035
inx
L2035: cmp #$88
beq L2041
L2035: cmp #%10001000 ; IIc ?
beq is_iic
lda L2003
cmp #$CC
beq L2041
beq is_iic
iny
L2041: sty $07
is_iic: sty $07
lda L239C,x
sta $08
;; Check 40/80 columns; wrap strings if 40 columns.
lda MACHID
and #%00000010 ; 80 Column card?
lsr a
sta $09
bne L206B
bne init_80_col
lda #$8D
lda #CR|$80
;; Convert spaces to newlines if 40 Columns
sta chain + (wrap1 - L1000)
@ -75,19 +104,21 @@ L2041: sty $07
inc L2095
inc L2099
bne L206E
L206B: jsr SLOT3_FIRMWARE
bne :+
init_80_col:
jsr SLOT3_FIRMWARE
:
;; --------------------------------------------------
;; Copy to $1000
L206E: ldy #0
.proc RelocateChainingCode
ldy #0
;; End signature is two adjacent $FFs
L2070:
loop:
L2072 := * + 2
lda L239E,y
cmp #$FF
@ -101,16 +132,19 @@ L207E:
L2080 := * + 2
sta L1000,y
iny
bne L2070
bne loop
inc L2072
inc L2079
inc L2080
bne L2070 ; always
bne loop ; always
.endproc
L208F: ldy #MessageCode::kInstall
jsr ShowMessage
L208F: ldy #$00
jsr L10EF
L2095 := * + 1
ldy #$03
sty $22
@ -122,7 +156,7 @@ L2099 := * + 1
lsr a
sta L22C7
jsr L222B
sta L11FF
sta year
ldx DEVCNT
L20AF: lda DEVLST,x
and #$0F
@ -172,7 +206,7 @@ apply_patch:
sta L2269,x
iny
inx
cpx #$38
cpx #kPatchLength
bne :-
L20FE: lda #$02
@ -182,8 +216,10 @@ L2103: jsr L223F
dec L210F
bpl L2103
bmi L2156
L210F: brk
L2110: brk
L210F: .byte 0
L2110: .byte 0
L2111: lda $07
bne L2135
lda L2110
@ -199,22 +235,26 @@ L2111: lda $07
beq L20FE
sty L229F
bne L20FE
L2135: ldy #$07
L2135: ldy #MessageCode::kNoClock
sty $0B
lda MACHID
lda MACHID ; Check for clock card
ror a
bcc L2145
bcc no_clock ; Bit 0 = 0 means no clock card
jsr MON_HOME
jmp L1000
;; --------------------------------------------------
L2145: lda #0
no_clock:
lda #0
sta DATELO
sta DATELO+1
sta TIMELO
sta TIMELO+1
jmp L11AA
jmp ShowMessageAndMaybeChain
;; --------------------------------------------------
L2156: lda #OPC_JMP_abs
sta DATETIME
@ -243,32 +283,42 @@ L218C: bit KBDSTRB
lda #$03
cmp $0A
ror L11FE
L2199: ldy #$05
jsr L10EF
lda L11FF
;; Show current year prompt
L2199: ldy #MessageCode::kCurrentYear
jsr ShowMessage
lda year ; 2-digit year
jsr PRBYTE
ldy #$06
jsr L10EF
L21A9: jsr RDKEY
and #$DF
cmp #$D9
ldy #MessageCode::kOkPrompt
jsr ShowMessage
;; Wait for keypress
: jsr RDKEY
and #%11011111 ; lowercase --> uppercase
cmp #'Y'|$80
beq L21D3
cmp #$CE
bne L21A9
ldy #$05
jsr L10EF
jsr L238E
cmp #'N'|$80
bne :-
;; Prompt for two digit year
ldy #MessageCode::kCurrentYear
jsr ShowMessage
jsr GetDigitKey ; Decade
asl a
asl a
asl a
asl a
sta L11FF
jsr L238E
sta year
jsr GetDigitKey ; Year
and #$0F
ora L11FF
sta L11FF
ora year
sta year
jmp L2199
;; Current year is okay
L21D3: lda $1204
jsr L2210
jsr L238A
@ -300,7 +350,7 @@ install_ptr := * + 1
;; Chain
jmp L1000
L2210: lda L11FF
L2210: lda year
pha
lsr a
lsr a
@ -366,10 +416,10 @@ Driver: cld
L2269:
L226A := * + 1
lda PORT2_ACIA_COMMAND
pha
pha ; Save command register
ldy #$03
ldx #$16
lda #$08
lda #%00001000
L2273:
L2274 := * + 1
sta PORT2_ACIA_COMMAND
@ -384,7 +434,7 @@ L2276: dex
L2284:
L2285 := * + 1
lda #$5D
L2286: .byte $3A
L2286: dec ; 65C02
bne L2286
L2289:
L228A := * + 1
@ -399,7 +449,8 @@ L228A := * + 1
ldy #$04
dex
bpl L2284
pla
pla ; Restore command register
L229F := * + 1
sta PORT2_ACIA_COMMAND
ldx #$06
@ -496,7 +547,7 @@ patch2:
nop
ldy #$03
ldx #$16
lda #$02
lda #%00000010
L2324: sta PORT2_ACIA_COMMAND
L2327: dex
bne L2327
@ -509,7 +560,7 @@ L2327: dex
L2335:
L2336 := * + 1
lda #$5D
L2337: .byte $3A
L2337: dec ; 65C02
bne L2337
L233A: lda PORT2_ACIA_STATUS
eor #$20
@ -572,12 +623,20 @@ L236B: lda MOUSE_BTN
L238A: jsr Driver
rts
L238E: jsr RDKEY
;;; ------------------------------------------------------------
;;; Prompt, loop until digit key is pressed
.proc GetDigitKey
jsr RDKEY
cmp #'0' | $80
bcc L238E
bcc GetDigitKey
cmp #('9'+1) | $80
bcs L238E
bcs GetDigitKey
jmp COUT
.endproc
;;; ------------------------------------------------------------
L239C: .byte $DF
.byte $FF
@ -647,9 +706,9 @@ L1053: lda $05
lda $07
beq L106D
iny
L106D: jsr L10EF
L1070: ldy #$08
jsr L10EF
L106D: jsr ShowMessage
L1070: ldy #MessageCode::kRunning
jsr ShowMessage
ldy #$01
L1077: lda ($00),y
sta $121D,y
@ -688,13 +747,13 @@ L10A8: clc
sty L11E7
lda $1C03
sta L11E8
bne L10D3
bne :+
tya
bne L10D3
ldy #$01
jmp L11AA
bne :+
ldy #MessageCode::kNoSysFile
jmp ShowMessageAndMaybeChain
L10D3: jsr L119F
: jsr L119F
lda #$00
sta $04
lda #$04
@ -709,9 +768,13 @@ L10E5: lda L11FE
ldy #$09
L10EE: rts
L10EF: lda $1242,y
;;; ------------------------------------------------------------
;;; Call with message number in Y
.proc ShowMessage
lda message_table_lo,y
sta L1109
lda L124E,y
lda message_table_hi,y
sta L1109+1
cpy #$06
beq L1106
@ -731,6 +794,9 @@ L1113: jsr COUT
iny
bne L1108
L1119: rts
.endproc
;;; ------------------------------------------------------------
L111A: lda #$07
sta L11F9
@ -749,23 +815,23 @@ L1121: lda DATELO,y
rts
: cmp #$2B
bne L11A8
ldy #$0B
jsr L10EF
bne ShowDiskErrorAndChain
ldy #MessageCode::kRemoveWriteProtect
jsr ShowMessage
jsr L11C3
jsr RDKEY
jmp L111A
L114F: PRODOS_CALL MLI_OPEN, $11E9
bne L11A8
bne ShowDiskErrorAndChain
lda L11EE
sta L11F0
PRODOS_CALL MLI_READ, $11EF
bne L11A8
bne ShowDiskErrorAndChain
PRODOS_CALL MLI_CLOSE, $11F7
bne L11A8
bne ShowDiskErrorAndChain
rts
L116E: lda DEVNUM
@ -773,7 +839,7 @@ L116E: lda DEVNUM
sta L11E4
PRODOS_CALL MLI_ON_LINE, $11DC
bne L11A8
bne ShowDiskErrorAndChain
lda $120C
and #$0F
@ -784,28 +850,41 @@ L116E: lda DEVNUM
sta $120C
PRODOS_CALL MLI_SET_PREFIX, $11E0
bne L11A8
bne ShowDiskErrorAndChain
PRODOS_CALL MLI_GET_FILE_INFO, L11F9
bne L11A8
bne ShowDiskErrorAndChain
rts
L119F: PRODOS_CALL MLI_READ_BLOCK, $11E3
bne L11A8
bne ShowDiskErrorAndChain
rts
L11A8: ldy #$02
L11AA: sty $0B
jsr L10EF
;;; ------------------------------------------------------------
.proc ShowDiskErrorAndChain
ldy #MessageCode::kDiskError
;; fall through
.endproc
;;; Show message and chain to next system file, unless
;;; kNoClock (in which case: hang)
.proc ShowMessageAndMaybeChain
sty $0B
jsr ShowMessage
jsr L11C3
lda $0B
cmp #$07
bne L11C0
cmp #MessageCode::kNoClock
bne loop
lda #OPC_RTS
sta DATETIME
jmp L1000
L11C0: jmp L11C0
loop: jmp loop ; Infinite loop!
.endproc
;;; ------------------------------------------------------------
L11C3: lda #$20
sta $0C
@ -819,6 +898,8 @@ L11C7: lda #$02
bne L11C7
rts
;; MLI call params
.byte $02
L11DD: .byte $60
@ -843,7 +924,9 @@ L11F9: .byte $0A
L11FC: .byte 0
L11FD: .byte 0
L11FE: .byte 0
L11FF: .byte 0
year: .byte 0 ; 2-digit
.res 46, 0
str_system:
@ -854,37 +937,56 @@ str_clock_system:
PASCAL_STRING "CLOCK.SYSTEM"
strlen_str_clock_system = .strlen("CLOCK.SYSTEM")
.byte $5A,$AC,$08,$30,$4D,$64,$77,$87
.byte $AA,$2A,$47,$CD
L124E: .byte $12,$12,$13,$13
.byte $13,$13,$13,$13,$13,$13,$13,$12
message_table_lo:
.byte <msgInstall,<msgNoSysFile,<msgDiskError,<msgIIc
.byte <msgIIe,<msgCurrentYear,<msgOkPrompt,<msgNoClock
.byte <msgRunning,<msgSeikoIIc,<msgSeikoIIe,<msgRemoveWriteProtect
message_table_hi:
.byte >msgInstall,>msgNoSysFile,>msgDiskError,>msgIIc
.byte >msgIIe,>msgCurrentYear,>msgOkPrompt,>msgNoClock
.byte >msgRunning,>msgSeikoIIc,>msgSeikoIIe,>msgRemoveWriteProtect
msgInstall:
HIASCII "Install Clock Driver 1.5"
L1272: .byte $A0
L1272: HIASCII " " ; Modified at launch
HIASCII "\rCopyright (c) 1986 "
wrap1 := *-1
HIASCIIZ "Creative Peripherals Unlimited, Inc."
msgNoSysFile:
HIASCIIZ "Unable to find a '.SYSTEM' file!"
msgRemoveWriteProtect:
HIASCII "Remove Write-Protect tab, "
wrap2 := *-1
HIASCIIZ "Replace disk, and Press a key..."
msgDiskError:
HIASCIIZ "Disk error! Unable to continue!!!"
HIASCIIZ "Seiko //c driver installed. "
msgSeikoIIc:
HIASCII "Seiko "
msgIIc: HIASCIIZ "//c driver installed. "
wrap4 := *-2
HIASCIIZ "Seiko //e driver installed. "
msgSeikoIIe:
HIASCII "Seiko "
msgIIe: HIASCIIZ "//e driver installed. "
wrap5 := *-2
HIASCII "Current year is 19"
.byte 0, $AE
msgCurrentYear:
HIASCIIZ "Current year is 19"
msgOkPrompt:
HIASCII "."
wrap3 := *
HIASCIIZ " OK? (Y/N) "
msgNoClock:
HIASCIIZ "No clock! Driver not installed...\r"
msgRunning:
HIASCIIZ "Running "
;; Signature for end of range to copy to $1000