IIcSystemClock/clock.system.s

849 lines
18 KiB
ArmAsm

.include "opcodes.inc"
.include "apple2.inc"
.include "common.inc"
.feature string_escapes
.org $2000
.setcpu "6502"
SLOT3_FIRMWARE := $C300
PORT2_ACIA_STATUS := $C0A9
PORT2_ACIA_COMMAND := $C0AA
PORT2_ACIA_CONTROL := $C0AB
DISXY := $C058
ENBXY := $C059
DISVBL := $C05A
ENVBL := $C05B
X0EDGE1 := $C05C
X0EDGE2 := $C05D
MOUSE_BTN := $C063
L2000:
L2001 := * + 1
lda #$06
L2003 := * + 1
lda #$A0
cmp #$CC
bne L2013
sta L239E + (L1272 - L1000) ; In relocated code
lda #$5C
sta L2285
sta L2336
L2013: ldx #$FF
txs
lda #$00
sta IBAKVER
sta IVERSION
sta ROMIN2
lda $03F3
eor #$FF
sta $03F4
ldy #$00
ldx #$00
lda MACHID
and #%10001000 ; IIe or later, modifier
beq L2035
inx
L2035: cmp #$88
beq L2041
lda L2003
cmp #$CC
beq L2041
iny
L2041: sty $07
lda L239C,x
sta $08
lda MACHID
and #%00000010 ; 80 Column card?
lsr a
sta $09
bne L206B
lda #$8D
;; Convert spaces to newlines if 40 Columns
sta chain + (wrap1 - L1000)
sta chain + (wrap4 - L1000)
sta chain + (wrap5 - L1000)
sta chain + (wrap3 - L1000)
sta chain + (wrap2 - L1000)
inc L2095
inc L2099
bne L206E
L206B: jsr SLOT3_FIRMWARE
;; --------------------------------------------------
;; Copy to $1000
L206E: ldy #0
;; End signature is two adjacent $FFs
L2070:
L2072 := * + 2
lda L239E,y
cmp #$FF
bne L207E
L2079 := * + 2
ldx L239E+1,y
cpx #$FF
beq L208F
L207E:
L2080 := * + 2
sta L1000,y
iny
bne L2070
inc L2072
inc L2079
inc L2080
bne L2070 ; always
L208F: ldy #$00
jsr L10EF
L2095 := * + 1
ldy #$03
sty $22
L2099 := * + 1
ldy #$05
sty $23
jsr L116E
lda $1204
lsr a
sta L22C7
jsr L222B
sta $11FF
ldx DEVCNT
L20AF: lda DEVLST,x
and #$0F
beq L20C8
dex
bpl L20AF
lda L2001
and #$07
bne L20C2
lda #$06
L20C2: asl a
asl a
asl a
asl a
bne L20CB
L20C8: lda DEVLST,x
L20CB: and #%01110000 ; slot
ora #$80
sta L22E3 ; Set $C0nn address
lda $11FE
and #$03
beq L20E3
cmp #$02
bcs L20FE
lda $07
bne L20EE
beq L20FE
L20E3: ldy #$38
lda $07
beq L20F0
ldy #$00
jmp L20F0
L20EE: ldy #$70
L20F0: ldx #$00
L20F2: lda L22E2,y
sta L2269,x
iny
inx
cpx #$38
bne L20F2
L20FE: lda #$02
sta L210F
L2103: jsr L223F
bcs L2111
dec L210F
bpl L2103
bmi L2156
L210F: brk
L2110: brk
L2111: lda $07
bne L2135
lda L2110
bne L2135
inc L2110
ldy #$99
sty L228A
iny
sty L226A
sty L2274
lda $11FE
and #$03
beq L20FE
sty L229F
bne L20FE
L2135: ldy #$07
sty $0B
lda MACHID
ror a
bcc L2145
jsr MON_HOME
jmp L1000
L2145: lda #$00
sta DATELO
sta DATELO+1
sta TIMELO
sta TIMELO+1
jmp L11AA
L2156: lda #OPC_JMP_abs
sta DATETIME
lda MACHID
ora #%00000001 ; has clock
sta MACHID
bit KBD
bmi L218C
lda $0A
cmp #$0B
bcc L2176
bit $11FE
bpl L2176
sta $1204
L2176: lda $1204
lsr a
cmp #$56
bcc L218C
lda DATELO
cmp $1203
lda DATELO+1
sbc $1204
bcs L21DF
L218C: bit KBDSTRB
rol $11FE
lda #$03
cmp $0A
ror $11FE
L2199: ldy #$05
jsr L10EF
lda $11FF
jsr PRBYTE
ldy #$06
jsr L10EF
L21A9: jsr RDKEY
and #$DF
cmp #$D9
beq L21D3
cmp #$CE
bne L21A9
ldy #$05
jsr L10EF
jsr L238E
asl a
asl a
asl a
asl a
sta $11FF
jsr L238E
and #$0F
ora $11FF
sta $11FF
jmp L2199
L21D3: lda $1204
jsr L2210
jsr L238A
jsr L111A
L21DF: lda RWRAM1
lda RWRAM1
lda DATETIME+1
sta L2202
clc
adc #$76
sta L22B1
lda DATETIME+2
sta L2203
adc #$00
sta L22B2
;; Relocate clock driver
ldy #$7C
L21FE: lda L2265,y
L2202 := * + 1
L2203 := * + 2
sta $F000,y
dey
bpl L21FE
jsr DATETIME
lda ROMIN2
jmp L1000
L2210: lda $11FF
pha
lsr a
lsr a
lsr a
lsr a
sta $06
asl a
asl a
adc $06
asl a
sta $06
pla
and #$0F
clc
adc $06
sta L22C7
rts
L222B: ldx #$FF
L222D: inx
sec
sbc #$0A
bcs L222D
adc #$0A
sta $06
txa
asl a
asl a
asl a
asl a
ora $06
rts
L223F: jsr L238A
lda DATELO+1
ror a
lda DATELO
rol a
rol a
rol a
rol a
and #$0F
sec
beq L2264
cmp #$0D
bcs L2264
sta $0A
lda TIMELO+1
cmp #$18
bcs L2264
lda TIMELO
cmp #$3C
L2264: rts
;;; ============================================================
;;; Clock Driver (Relocatable)
;;; ============================================================
L2265: cld
cld
php
sei
L2269:
L226A := * + 1
lda PORT2_ACIA_COMMAND
pha
ldy #$03
ldx #$16
lda #$08
L2273:
L2274 := * + 1
sta PORT2_ACIA_COMMAND
L2276: dex
bne L2276
eor #$0A
ldx #$09
dey
bne L2273
ldy #$04
bne L2289
L2284:
L2285 := * + 1
lda #$5D
L2286: .byte $3A
bne L2286
L2289:
L228A := * + 1
lda PORT2_ACIA_STATUS
rol a
rol a
rol a
ror $0200,x
lsr $0201,x
dey
bne L2284
ldy #$04
dex
bpl L2284
pla
L229F := * + 1
sta PORT2_ACIA_COMMAND
ldx #$06
L22A3: lda $0201,x
L22A6: dec $0200,x
bmi L22B0
clc
adc #$0A
bcc L22A6
L22B0:
L22B1 := * + 1
L22B2 := * + 2
ldy L22DB,x
sta $BF30,y ; Modifying DEVLST ???
dex
dex
bne L22A3
L22BA: lda $0200
asl a
and #$E0
ora DATELO
sta DATELO
L22C7 := * + 1
lda #$56
rol a
sta DATELO+1
ldy #$01
L22CE: lda $0208,y
ora #$B0
sta $020F,y
dey
bpl L22CE
dex
L22DB := * + 1
bne L22BA
plp
rts
.byte $FF
.byte $63
.byte $FF
.byte $62
L22E2:
L22E3 := * + 1
lda $C0E0 ; Set to $C0x0, n=slot+8
lda DISVBL
ldy #$01
ldx #$16
L22EC: dex
bne L22EC
lda DISVBL,y
ldx #$0B
dey
bpl L22EC
L22F7: dex
bne L22F7
ldx #$09
ldy #$04
bne L2307
L2300: lda #$5D
sec
L2303: sbc #$01
bne L2303
L2307: lda MOUSE_BTN
rol a
ror $0200,x
lsr $0201,x
nop
dey
bne L2300
ldy #$04
dex
bpl L2300
lda PORT2_ACIA_COMMAND
nop
ldy #$03
ldx #$16
lda #$02
L2324: sta PORT2_ACIA_COMMAND
L2327: dex
bne L2327
eor #$0A
ldx #$09
dey
bne L2324
ldy #$04
bne L233A
L2335:
L2336 := * + 1
lda #$5D
L2337: .byte $3A
bne L2337
L233A: lda PORT2_ACIA_STATUS
eor #$20
rol a
rol a
rol a
ror $0200,x
lsr $0201,x
dey
bne L2335
ldy #$04
dex
bpl L2335
nop
nop
lda ENVBL
sta ENBXY
sta X0EDGE1
nop
nop
nop
nop
lda DISXY
ldx #$15
L2364: dex
bne L2364
ldx #$09
L2369: ldy #$04
L236B: lda MOUSE_BTN
rol a
ror $0200,x
lsr $0201,x
sta X0EDGE2
nop
nop
nop
nop
nop
nop
sta X0EDGE1
dey
bne L236B
dex
bpl L2369
lda DISVBL
L238A: jsr L2265
rts
L238E: jsr RDKEY
cmp #$B0
bcc L238E
cmp #$BA
bcs L238E
jmp COUT
L239C: .byte $DF
.byte $FF
chain:
L239E:
;; Relocated to $1000
;;; ============================================================
;;; Chaining code???
;;; ============================================================
.org $1000
L1000:
ldy #$00
sty $11E8
iny
sty $04
iny
sty $11E7
jsr L119F
lda $1C23
sta $02
lda $1C24
sta $03
lda #$2B
sta $00
lda #$1C
sta $01
L1021: ldy #$10
lda ($00),y
cmp #$FF
bne L10A8
ldy #$00
lda ($00),y
and #$30
beq L10A8
lda ($00),y
and #$0F
sta $05
tay
ldx #$06
L103A: lda ($00),y
cmp $122E,x
bne L10A8
dey
dex
bpl L103A
ldy #$0C
L1047: lda ($00),y
cmp $1235,y
bne L1053
dey
bne L1047
beq L10A8
L1053: lda $05
sta $121D
sta $0280
inc $05
lda $0B
cmp #$07
beq L1070
ldy #$03
jsr L10E5
lda $07
beq L106D
iny
L106D: jsr L10EF
L1070: ldy #$08
jsr L10EF
ldy #$01
L1077: lda ($00),y
sta $121D,y
sta $0280,y
ora #$80
jsr COUT
iny
cpy $05
bne L1077
jsr L114F
lda #$00
sta WNDTOP
lda #$18
sta WNDBTM
jsr MON_HOME
lda $09
beq L10A5
lda #$15
jsr COUT
lda #$8D
jsr COUT
L10A5: jmp L2000
L10A8: clc
lda $00
adc $02
sta $00
lda $01
adc #$00
sta $01
inc $04
lda $04
cmp $03
bne L10E2
ldy $1C02
sty $11E7
lda $1C03
sta $11E8
bne L10D3
tya
bne L10D3
ldy #$01
jmp L11AA
L10D3: jsr L119F
lda #$00
sta $04
lda #$04
sta $00
lda #$1C
sta $01
L10E2: jmp L1021
L10E5: lda $11FE
and #$03
bne L10EE
ldy #$09
L10EE: rts
L10EF: lda $1242,y
sta $1109
lda $124E,y
sta $110A
cpy #$06
beq L1106
cpy #$08
beq L1106
jsr MON_HOME
L1106: ldy #$00
L1108: lda $F000,y
beq L1119
cmp #$E0
bcc L1113
and $08
L1113: jsr COUT
iny
bne L1108
L1119: rts
L111A: lda #$07
sta $11F9
ldy #$03
L1121: lda DATELO,y
sta $1203,y
dey
bpl L1121
lda #OPC_RTS
sta DATETIME
PRODOS_CALL MLI_SET_FILE_INFO, $11F9
bne :+
lda #OPC_JMP_abs
sta DATETIME
rts
: cmp #$2B
bne L11A8
ldy #$0B
jsr L10EF
jsr L11C3
jsr RDKEY
jmp L111A
L114F: PRODOS_CALL MLI_OPEN, $11E9
bne L11A8
lda $11EE
sta $11F0
PRODOS_CALL MLI_READ, $11EF
bne L11A8
PRODOS_CALL MLI_CLOSE, $11F7
bne L11A8
rts
L116E: lda DEVNUM
sta $11DD
sta $11E4
PRODOS_CALL MLI_ON_LINE, $11DC
bne L11A8
lda $120C
and #$0F
tay
iny
sty $120B
lda #'/'
sta $120C
PRODOS_CALL MLI_SET_PREFIX, $11E0
bne L11A8
PRODOS_CALL MLI_GET_FILE_INFO, $11F9
bne L11A8
rts
L119F: PRODOS_CALL MLI_READ_BLOCK, $11E3
bne L11A8
rts
L11A8: ldy #$02
L11AA: sty $0B
jsr L10EF
jsr L11C3
lda $0B
cmp #$07
bne L11C0
lda #OPC_RTS
sta DATETIME
jmp L1000
L11C0: jmp L11C0
L11C3: lda #$20
sta $0C
L11C7: lda #$02
jsr WAIT
sta SPKR
lda #$24
jsr WAIT
sta SPKR
dec $0C
bne L11C7
rts
.byte $02
rts
.byte $0C
.byte $12
ora ($0B,x)
.byte $12,$03,$60,$00,$1C,$00,$00,$03
.byte $1D,$12,$00,$1C,$00,$04,$00,$00
.byte $20,$00,$9F,$00,$00,$01,$00,$0A
.byte $35,$12
.res 50, 0
.byte ".SYSTEM"
PASCAL_STRING "CLOCK.SYSTEM"
.byte $5A,$AC,$08,$30,$4D,$64,$77,$87
.byte $AA,$2A,$47,$CD,$12,$12,$13,$13
.byte $13,$13,$13,$13,$13,$13,$13,$12
HIASCII "Install Clock Driver 1.5"
L1272: .byte $A0
HIASCII "\rCopyright (c) 1986 "
wrap1 := *-1
HIASCIIZ "Creative Peripherals Unlimited, Inc."
HIASCIIZ "Unable to find a '.SYSTEM' file!"
HIASCII "Remove Write-Protect tab, "
wrap2 := *-1
HIASCIIZ "Replace disk, and Press a key..."
HIASCIIZ "Disk error! Unable to continue!!!"
HIASCIIZ "Seiko //c driver installed. "
wrap4 := *-2
HIASCIIZ "Seiko //e driver installed. "
wrap5 := *-2
HIASCII "Current year is 19"
.byte 0, $AE
wrap3 := *
HIASCIIZ " OK? (Y/N) "
HIASCIIZ "No clock! Driver not installed...\r"
HIASCIIZ "Running "
;; Signature for end of range to copy to $1000
.byte $FF,$FF
;;; ============================================================
.byte $00,$04,$00
.byte $FF,$00,$FF,$00,$FF,$00,$00,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$00
.byte $FF,$00,$FF,$00,$FF,$00,$FF,$65
.byte $00,$FF,$00,$FF,$00,$FF,$00,$FF
.byte $00,$FF,$00,$FF,$00,$FF,$00,$FF
.byte $00,$FF,$00,$FF,$00,$FF,$00,$FF
.byte $00