📄 dac.lis
字号:
0080 bHIGHBITS: equ 80h ; Setting for FCap and ClockPhase
00C0 bHBMASK: equ C0h ; Mask for FCap and ClockPhase
0000
0000
0000 ;;---------------------------
0000 macro Stall
0000 ;;---------------------------
0000 mov reg[ASY_CR], 1
0000 macro UnStall
0000 ;;---------------------------
0000 mov reg[ASY_CR], 0
0000 DAC_Start:
0000 _DAC_Start:
0000 DAC_SetPower:
0000 _DAC_SetPower:
0000 2103 and A, bPWRMASK ; trim input to bits of interest
0002 4F mov X, SP ; Set stack frame pointer
0003 08 push A
0004 ;; read CR3 registers, modify power bits & write back
0004 5D83 mov A, reg[DAC_MSB_CR3]
0006 21FC and a, ~bPWRMASK ; clear old setting
0008 2B00 or A, [X] ; set power in MSB register image
000A 6083 mov reg[DAC_MSB_CR3], A
000C 5D93 mov A, reg[DAC_LSB_CR3]
000E 21FC and a, ~bPWRMASK ; clear old setting
0010 2B00 or A, [X] ; set power in LSB register image
0012 6093 mov reg[DAC_LSB_CR3], A
0014 18 pop A
0015 7F ret
0016
0016 ;;---------------------------------------------------------------------------
0016 ;; WriteBlind
0016 ;;
0016 ;; Modify the DAC's update value without worrying about the clocks.
0016 ;; Lowest overhead, but may cause glitches on the output.
0016 ;;
0016 ;; INPUTS: A contains the update value if data format is offset binary or
0016 ;; For offset binary format: A contains the low byte; X the high byte.
0016 ;; For twos complement format: A contains the low byte; X the high byte.
0016 ;; For two-byte sign-and-magnitude format:
0016 ;; A contains the LSB as 00smmmmm; X contains the MSB as 00tmmm00,
0016 ;; where t=s\ (the inverted sign).
0016 ;;
0016 ;; OUTPUTS: Analog output voltage reflects input value
0016 ;;---------------------------------------------------------------------------
0016 DAC_WriteBlind:
0016 _DAC_WriteBlind:
0016
IF DAC_OFFSETBINARY
;; Data is an unsigned byte value in [0..510] (511 unique values).
;; Following converts it to 2's complement:
sub A, iOFFSET
swap A, X ; A <- upper, X <- lower
sbb A, 0
swap A, X ; A <- lower, X <- upper
ENDIF
IF DAC_OFFSETBINARY | DAC_TWOSCOMPLEMENT
swap A, X ; A <- upper, X <- lower
push A ; Save Sign on stack 1
; Sign is either FFh or 00h
dec A ; set or clear Carry Flag
; A is now FEh(CF=0) or FFh(CF=1)
mov A,X ; MSB: 76543210
jc DAC9_WriteBlind_dont_cpl_positive_mag
cpl A ; change negative magnitude to positive
DAC9_WriteBlind_dont_cpl_positive_mag:
push A ; MSB: 76543210 (mag) 2
asr A ; MSB: 77654321
asr A ; MSB: 77765432
asr A ; MSB: 77776543
and A,bMAGMASK ; MSB: 00076543
mov X,SP
and [X-2],bSIGNMASK
or A,[X-2] ; MSB: 00s76543
mov X,A ; MSB
pop A ; LSB: 76543210 (mag) 1
push X ; MSB 2
asl A ; LSB: 65432100
asl A ; LSB: 54321000
and A,bMAGMASK ; LSB: 00021000
mov X,SP
or A,[X-2] ; LSB: 00s21000
xor A,bSIGNMASK ; LSB: 00t21000
; LSB in A
pop X ; MSB in X 1
ENDIF
; IF DAC_SIGNANDMAGNITUDE
0016 2980 or A,bHIGHBITS ; LSB: 10t21000
0018 4B swap A,X ; LSB in X, MSB in A
0019 2980 or A,bHIGHBITS ; MSB: 10s76543
001B 6080 mov reg[DAC_MSB_CR0],A
001D 5B mov A,X ; LSB in A
001E 6090 mov reg[DAC_LSB_CR0],A
0020 18 pop A ; stack cleanup 0
0021 ; ENDIF
0021
0021 7F ret
0022
0022
0022 DAC_WriteBlind2B:
0022 _DAC_WriteBlind2B:
0022 2980 or A,bHIGHBITS ; LSB: 10t21000
0024 4B swap A,X ; LSB in X, MSB in A
0025 2980 or A,bHIGHBITS ; MSB: 10s76543
0027 6080 mov reg[DAC_MSB_CR0],A
0029 5B mov A,X ; LSB in A
002A 6090 mov reg[DAC_LSB_CR0],A
002C 7F ret
002D
002D ;;---------------------------------------------------------------------------
002D ;; WriteStall
002D ;;
002D ;; Modify the DAC's update value, stalling the CPU if necessary.
002D ;; This routine should be used with faster analog clocks or when the
002D ;; effect of prolonging interrupt latencies can be safely tolerated.
002D ;;
002D ;; INPUTS: A contains the update value if data format is offset binary or
002D ;; For offset binary format: A contains the low byte; X the high byte.
002D ;; For twos complement format: A contains the low byte; X the high byte.
002D ;; For two-byte sign-and-magnitude format:
002D ;; A contains the LSB as 00smmmmm; X contains the MSB as 00tmmm00,
002D ;; where t=s\ (the inverted sign).
002D ;;
002D ;; OUTPUTS: Analog output voltage reflects input value
002D ;;---------------------------------------------------------------------------
002D DAC_WriteStall:
002D _DAC_WriteStall:
002D
IF DAC_OFFSETBINARY
;; Data is an unsigned byte value in [0..510] (511 unique values).
;; Following converts it to 2's complement:
sub A, iOFFSET
swap A, X ; A <- upper, X <- lower
sbb A, 0
swap A, X ; A <- lower, X <- upper
ENDIF
IF DAC_OFFSETBINARY | DAC_TWOSCOMPLEMENT
swap A, X ; A <- upper, X <- lower
push A ; Save Sign on stack 1
; Sign is either FFh or 00h
dec A ; set or clear Carry Flag
; A is now FEh(CF=0) or FFh(CF=1)
mov A,X ; MSB: 76543210
jc DAC9_WriteStall_dont_cpl_positive_mag
cpl A ; change negative magnitude to positive
DAC9_WriteStall_dont_cpl_positive_mag:
push A ; MSB: 76543210 (mag) 2
asr A ; MSB: 77654321
asr A ; MSB: 77765432
asr A ; MSB: 77776543
and A,bMAGMASK ; MSB: 00076543
mov X,SP
and [X-2],bSIGNMASK
or A,[X-2] ; MSB: 00s76543
mov X,A ; MSB
pop A ; LSB: 76543210 (mag) 1
push X ; MSB 2
asl A ; LSB: 65432100
asl A ; LSB: 54321000
and A,bMAGMASK ; LSB: 00021000
mov X,SP
or A,[X-2] ; LSB: 00s21000
xor A,bSIGNMASK ; LSB: 00t21000
; LSB in A
pop X ; MSB in X 1
ENDIF
; IF DAC_SIGNANDMAGNITUDE
002D 2980 or A,bHIGHBITS ; LSB: 10t21000
002F 4B swap A,X ; LSB in X, MSB in A
0030 2980 or A,bHIGHBITS ; MSB: 10s76543
0032 436501 or reg[ASY_CR], ASY_CR_SYNCEN
0035 6080 mov reg[DAC_MSB_CR0],A
0037 4165FE and reg[ASY_CR], ~ASY_CR_SYNCEN
003A 5B mov A,X ; LSB in A
003B 6090 mov reg[DAC_LSB_CR0],A
003D 18 pop A ; stack cleanup 0
003E ; ENDIF
003E
003E 7F ret
003F
003F DAC_WriteStall2B:
003F _DAC_WriteStall2B:
003F 2980 or A,bHIGHBITS ; LSB: 10t21000
0041 4B swap A,X ; LSB in X, MSB in A
0042 2980 or A,bHIGHBITS ; MSB: 10s76543
0044 436501 or reg[ASY_CR], ASY_CR_SYNCEN
0047 6080 mov reg[DAC_MSB_CR0],A
0049 4165FE and reg[ASY_CR], ~ASY_CR_SYNCEN
004C 5B mov A,X ; LSB in A
004D 6090 mov reg[DAC_LSB_CR0],A
004F 7F ret
0050
0050 ;;-------------------------------------------------------------------------
0050 ;; Stop: Cuts power to the user module.
0050 ;; INPUTS: None
0050 ;; OUTPUTS: None
0050 ;;-------------------------------------------------------------------------
0050 DAC_Stop:
0050 _DAC_Stop:
0050 4183FC and reg[DAC_MSB_CR3], ~bPWRMASK
0053 4193FC and reg[DAC_LSB_CR3], ~bPWRMASK
0056 7F ret
0057
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -