A2osX/SYS/KM.NSC.S.txt
burniouf 64b71db7b3 ProDOS.FX:Added DCLK support and //c related Fixes
NSC: Reverted to $C3xx I/O space
2021-07-26 14:33:08 +02:00

324 lines
5.4 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF sys/km.nsc
*--------------------------------------
.INB inc/macros.i
.INB inc/io.i
.INB inc/monitor.i
.INB inc/mli.i
*--------------------------------------
NSC.IOBASE .EQ $C300
*--------------------------------------
TmpPtr1 .EQ $0
TmpPtr2 .EQ $2
offset .EQ $4
*--------------------------------------
NSC.Init >LDYAI NSC.MSG0
jsr NSC.Print
lda MACHID
and #MACHID.CLK Clock already installed ?
beq .1
>LDYAI NSC.MSG1
bra NSC.Print
.1 jsr NSC.Detect
bcc .2
>LDYAI NSC.MSG2
bra NSC.Print
.2 jsr NSC.Install
lda #MACHID.CLK
tsb MACHID
>LDYAI NSC.MSG3
* jmp NSC.Print
*--------------------------------------
NSC.Print sty TmpPtr1
sta TmpPtr1+1
ldy #0
.1 lda (TmpPtr1),y
beq .8
jsr COUT
iny
bne .1
.8 jmp CROUT
*--------------------------------------
DS1216E.DATA1 .EQ $10
DS1216E.DATA2 .EQ $18
*--------------------------------------
NSC.Detect php
sei
lda RDCXROM
php
sta SETCXROM
sta NSC.IOBASE
* lda $C00B Workaround for Ultrawarp bug
ldx #8
.1 ldy #8
.2 lda NSC.IOBASE+4
lsr
ror DS1216E.DATA1-1,x
dey
bne .2
dex
bne .1
sta NSC.IOBASE
* lda $C00B Workaround for Ultrawarp bug
lda NSC.IOBASE+4 Reset DS1216E comparison register with READ A2=1
ldy #8 Read 8 bytes...
.3 lda DS1216E.PATTERN-1,x
phy
ldy #8 ....of 8 bits
.4 ldx #0
lsr
bcc .5
inx
.5 bit NSC.IOBASE,x Write Pattern bit in A0, with A2=0
dey
bne .4
ply
dey
bne .3
*--------------------------------------
ldx #8
.6 ldy #8
.7 lda NSC.IOBASE+4
lsr
ror DS1216E.DATA2-1,x
dey
bne .7
dex
bne .6
plp
bmi .8
sta CLRCXROM
.8 plp
*--------------------------------------
ldx #8
.81 lda DS1216E.DATA1-1,x
cmp DS1216E.DATA2-1,x
bne .9
dex
bne .81
* sec from CMP
rts
.9 clc
rts
*--------------------------------------
NSC.Install lda DATETIME+1
sta TmpPtr1
sec
sbc #NSCDRV.B.START
sta offset
lda DATETIME+2
sta TmpPtr1+1
sbc /NSCDRV.B.START
sta offset+1
ldy #1
ldx #0
.1 lda NSCDRV.RELOC,x
beq .2
sta TmpPtr2
inx
lda NSCDRV.RELOC,x
sta TmpPtr2+1
lda (TmpPtr2)
clc
adc offset
sta (TmpPtr2)
lda (TmpPtr2),y
adc offset+1
sta (TmpPtr2),y
inx
bne .1
.2 lda RRAMWRAMBNK1
lda RRAMWRAMBNK1
.3 ldy #NSCDRV.SIZE-1 always < 128
.7 lda NSCDRV.B.START,y
sta (TmpPtr1),y
dey
bpl .7
lda RROMBNK1
lda #$4C
sta DATETIME
rts
*--------------------------------------
NSCDRV.RELOC .DA NSCDRV.R1+1
* .DA NSCDRV.R2+1
* .DA NSCDRV.R3+1
.DA NSCDRV.R4+1
.DA NSCDRV.R5+1
.DA NSCDRV.R6+1
.DA NSCDRV.R7+1
.DA NSCDRV.R8+1
* .DA NSCDRV.R9+1
.DA #0
*--------------------------------------
NSC.MSG0 .AZ -"NSC 'No-Slot-Clock'/DS1216E Driver For A2osX"
NSC.MSG1 .AZ -"Clock Already Present!"
NSC.MSG2 .AZ -"No DS1216E Detected!"
NSC.MSG3 .AZ -"DS1216E Driver Successfully Installed."
*--------------------------------------
* Driver For DS1216E
*--------------------------------------
DS1216E.DATA .EQ $200 Reverted YY MM DD Day HH mm SS CS
*--------------------------------------
NSCDRV.B.START .EQ *
NSCDRV php
sei
lda RDCXROM
php
sta SETCXROM
sta NSC.IOBASE
* lda $C00B Workaround for Ultrawarp bug
lda NSC.IOBASE+4 Reset DS1216E comparison register with READ A2=1
ldy #8 Read 8 bytes...
NSCDRV.R1 lda DS1216E.PATTERN-1,y
phy
ldy #8 ....of 8 bits
NSCDRV.2 ldx #0
lsr
bcc NSCDRV.3
inx
NSCDRV.3 bit NSC.IOBASE,x Write Pattern bit in A0, with A2=0
dey
bne NSCDRV.2
ply
dey
bne NSCDRV.R1
ldx #8
NSCDRV.4 ldy #8
NSCDRV.5 pha
lda NSC.IOBASE+4 Read Byte...
lsr
pla
ror
dey
bne NSCDRV.5
pha
lsr
lsr
lsr
lsr
tay
pla
and #$0F
clc
.HS 2C Bit Absolute to skip adc #$0A
NSCDRV.6 adc #$0A
dey
bpl NSCDRV.6
NSCDRV.R4 sta DS1216E.DATA-1,x
dex
bne NSCDRV.4
pha DS1216E.DATA
NSCDRV.R7 lda DS1216E.DATA+1 Get MM
asl
asl
asl
asl
asl
NSCDRV.R8 ora DS1216E.DATA+2 Get DD
sta DATELO
*NSCDRV.R9 lda DS1216E.DATA Get YY
pla
rol
sta DATELO+1
NSCDRV.R6 lda DS1216E.DATA+5 Get mm
sta TIMELO
NSCDRV.R5 lda DS1216E.DATA+4 Get HH
sta TIMELO+1
plp
bmi .8
sta CLRCXROM
.8 plp
rts
*--------------------------------------
DS1216E.PATTERN .HS 5CA33AC55CA33AC5 Reverted 7->0
*--------------------------------------
.LIST ON
NSCDRV.SIZE .EQ *-NSCDRV.B.START
.LIST OFF
*--------------------------------------
* CONTROL SECTION :
*--------------------------------------
.DO NSCDRV.SIZE>125
ERROR:NSCDRV.SIZE too big
.FIN
*--------------------------------------
MAN
SAVE usr/src/sys/km.nsc.s
ASM