A2osX/SYS/PM.NSC.S.txt

324 lines
5.4 KiB
Plaintext
Raw Normal View History

2022-03-13 12:58:15 +00:00
NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF sys/pm/pm.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/pm.nsc.s
ASM