571 lines
8.3 KiB
NASM
571 lines
8.3 KiB
NASM
;*********************************************
|
|
;
|
|
; External command for Davex
|
|
;
|
|
; x10 -- experinmental x10 stuff
|
|
;
|
|
; x10 [-z] [-i] [-s slot] [-h housecode] [-d day] <string>
|
|
; [-b base-housecode]
|
|
;
|
|
; -z = debugging
|
|
; -i = display info (time, day, house code)
|
|
;
|
|
; <string> is a bunch of characters like this:
|
|
; a through p toggle selection of devs 1-16
|
|
; "*" inverts selection of all devices
|
|
; "+" sends an "on"
|
|
; "-" sends an "off"
|
|
; "=x" dims units to level x (a=dimmest,p=brightest)
|
|
; "#x" sends function 0-15 (a-p)
|
|
;
|
|
;*********************************************
|
|
;
|
|
; Converted to MPW IIgs 21-Sep-92 DAL
|
|
;
|
|
;*********************************************
|
|
|
|
.include "Common/2/Globals2.asm"
|
|
.include "Common/2/Apple.Globals2.asm"
|
|
.include "Common/2/Mli.globals2.asm"
|
|
.include "Common/Macros.asm"
|
|
|
|
|
|
.segment "CODE_A000"
|
|
|
|
|
|
OrgAdr = $a000 ;change as necessary (end below $B000)
|
|
; org OrgAdr
|
|
|
|
MyVersion = $09
|
|
MinVersion = $12
|
|
MinVerAux = 5
|
|
;*********************************************
|
|
rts
|
|
.byte $ee,$ee
|
|
.byte MyVersion,MinVersion
|
|
.byte %00000000 ;hardware req
|
|
.addr descr
|
|
.addr OrgAdr
|
|
.addr start
|
|
.byte MinVerAux,0,0,0
|
|
; parameters here
|
|
.byte 0,t_string
|
|
.byte $80+'s',t_int1
|
|
.byte $80+'b',t_string
|
|
.byte $80+'h',t_string
|
|
.byte $80+'d',t_int1
|
|
.byte $80+'z',t_nil
|
|
.byte $80+'i',t_nil
|
|
.byte 0,0
|
|
descr: pstr "experimental x10 controller stuff"
|
|
|
|
;*********************************************
|
|
; dum xczpage ;32 locations
|
|
str = xczpage ;ds 2
|
|
hStr = str+2 ;ds 2
|
|
counter = hStr+2 ;ds 1
|
|
slot = counter+1 ;ds 1
|
|
house = slot+1 ;ds 1
|
|
refnum = house+1 ;ds 1 ;for print_drvr
|
|
index = refnum+1 ;ds 1
|
|
unitmask = index+1 ;ds 2
|
|
Function = unitmask+2 ;ds 1
|
|
Housecode = Function+1 ;ds 1
|
|
;
|
|
Status = Housecode+1 ;ds 1
|
|
Minutes = Status+1 ;ds 1
|
|
Hours = Minutes+1 ;ds 1
|
|
Day = Hours+1 ;ds 1
|
|
;
|
|
Debug = Day+1 ;ds 1
|
|
; dend
|
|
;
|
|
start = *
|
|
sta str+1
|
|
sty str
|
|
;
|
|
; check debugging flag
|
|
;
|
|
lda #'z'+$80
|
|
jsr xgetparm_ch
|
|
ror a
|
|
eor #$80
|
|
sta Debug
|
|
;
|
|
; default slot is 2; can override with -s
|
|
;
|
|
lda #2
|
|
sta slot
|
|
lda #'s'+$80
|
|
jsr xgetparm_ch
|
|
bcs no_slot
|
|
sty slot
|
|
no_slot:
|
|
;
|
|
lda slot
|
|
ldx #mli_open
|
|
jsr xprint_drvr
|
|
bcc opened
|
|
jmp xProDOS_err
|
|
opened: sta refnum
|
|
lda slot
|
|
ldx #mli_open-$80 ;open for input
|
|
jsr xprint_drvr
|
|
;
|
|
; tell the serial port to send stuff straight through
|
|
; %%% send ctrl-i if slot 1 ?
|
|
;
|
|
lda #1
|
|
jsr outchar
|
|
lda #'Z'
|
|
jsr outchar
|
|
;
|
|
; set the clock (-d day, use ProDOS hour/min)
|
|
;
|
|
lda #'d'+$80
|
|
jsr xgetparm_ch
|
|
bcs no_day
|
|
jsr set_clock
|
|
no_day:
|
|
;
|
|
; set house code
|
|
;
|
|
lda #'b'+$80
|
|
jsr xgetparm_ch
|
|
bcs no_setbase
|
|
jsr parse_hcode
|
|
jsr set_basehc
|
|
no_setbase:
|
|
;
|
|
; Determine house code for direct commands
|
|
; (specified with -h, or defaults to base
|
|
; housecode)
|
|
;
|
|
lda #'h'+$80
|
|
jsr xgetparm_ch
|
|
bcs use_base
|
|
jsr parse_hcode
|
|
jmp got_code
|
|
use_base: jsr calc_hcode
|
|
got_code:
|
|
;
|
|
; cruise through the string one character at a time
|
|
; and send stuff
|
|
;
|
|
lda #0
|
|
sta index
|
|
sta unitmask+1
|
|
sta unitmask
|
|
next_char:
|
|
lda index
|
|
ldy #0
|
|
cmp (str),y
|
|
bcs str_dun
|
|
inc index
|
|
ldy index
|
|
lda (str),y
|
|
jsr do_char
|
|
jmp next_char
|
|
str_dun:
|
|
;
|
|
; display info
|
|
;
|
|
lda #'i'+$80
|
|
jsr xgetparm_ch
|
|
bcs no_info
|
|
jsr show_info
|
|
no_info:
|
|
;
|
|
; close the slot
|
|
;
|
|
ldy refnum
|
|
ldx #mli_close
|
|
jsr xprint_drvr
|
|
ldy refnum
|
|
ldx #mli_close-$80
|
|
jsr xprint_drvr
|
|
|
|
rts
|
|
|
|
;*****************************************
|
|
;
|
|
; do_char
|
|
;
|
|
do_char: jsr xdowncase
|
|
cmp #'+'+$80
|
|
beq do_on
|
|
cmp #'-'+$80
|
|
beq do_off
|
|
cmp #'='+$80
|
|
beq do_dim
|
|
cmp #'#'+$80
|
|
beq do_generic
|
|
cmp #'*'+$80
|
|
beq do_invert
|
|
cmp #'a'+$80
|
|
bcc bad_char
|
|
cmp #'p'+$80+1
|
|
bcs bad_char
|
|
sec
|
|
sbc #'a'+$80
|
|
jsr do_number
|
|
rts
|
|
|
|
bad_char:
|
|
jsr xmess
|
|
.byte cr
|
|
asc_hi "*** A-P, *, +, -, and = are allowed"
|
|
.byte 13,0
|
|
jmp xerr
|
|
|
|
do_invert:
|
|
lda #$ff
|
|
eor unitmask+1
|
|
sta unitmask+1
|
|
lda #$ff
|
|
eor unitmask
|
|
sta unitmask
|
|
rts
|
|
|
|
do_dim: inc index
|
|
ldy index
|
|
lda (str),y
|
|
jsr calc_level
|
|
ora #5 ;dim command
|
|
bne do_OnOff
|
|
;
|
|
do_generic:
|
|
inc index
|
|
ldy index
|
|
lda (str),y
|
|
jsr xdowncase
|
|
sec
|
|
sbc #'a'+$80
|
|
jmp do_OnOff
|
|
;
|
|
do_on: lda #2
|
|
bne do_OnOff
|
|
do_off: lda #3
|
|
do_OnOff:
|
|
sta Function
|
|
|
|
jsr header
|
|
lda #1
|
|
jsr outchar
|
|
lda Function
|
|
jsr outchar
|
|
lda Housecode
|
|
jsr outchar
|
|
lda unitmask+1
|
|
jsr outchar
|
|
lda unitmask
|
|
jsr outchar
|
|
|
|
clc
|
|
lda Function
|
|
adc Housecode
|
|
clc
|
|
adc unitmask+1
|
|
clc
|
|
adc unitmask
|
|
jsr outchar
|
|
|
|
lda #0
|
|
sta unitmask+1
|
|
sta unitmask
|
|
|
|
jsr wait_ack
|
|
jsr print_status
|
|
rts
|
|
|
|
do_number:
|
|
tax
|
|
cmp #8
|
|
bcs upper8
|
|
lda bit_table,x
|
|
eor unitmask
|
|
sta unitmask
|
|
rts
|
|
upper8: lda bit_table-8,x
|
|
eor unitmask+1
|
|
sta unitmask+1
|
|
rts
|
|
|
|
bit_table:
|
|
.byte %10000000
|
|
.byte %01000000
|
|
.byte %00100000
|
|
.byte %00010000
|
|
.byte %00001000
|
|
.byte %00000100
|
|
.byte %00000010
|
|
.byte %00000001
|
|
;
|
|
; calc_level:
|
|
; a=character --> a=$L0
|
|
;
|
|
calc_level:
|
|
jsr xdowncase
|
|
cmp #'p'+$80+1
|
|
bcs bad_level
|
|
cmp #'a'+$80
|
|
bcc bad_level
|
|
sbc #'a'+$80
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
eor #$f0
|
|
rts
|
|
bad_level:
|
|
jsr xmess
|
|
.byte cr
|
|
|
|
|
|
asc_hi "*** level must be A-P"
|
|
|
|
.byte 13,0
|
|
jmp xerr
|
|
;
|
|
; header--send 16 $FFs to the controller
|
|
;
|
|
header: lda #16
|
|
sta counter
|
|
out_ff: lda #$ff
|
|
jsr outchar
|
|
dec counter
|
|
bne out_ff
|
|
rts
|
|
;
|
|
; outchar--send character in A to controller
|
|
;
|
|
outchar:
|
|
pha
|
|
jsr debugByte
|
|
pla
|
|
ldy refnum
|
|
ldx #mli_write-$80
|
|
jsr xprint_drvr
|
|
bcs out_err
|
|
rts
|
|
out_err: jmp xProDOS_err
|
|
;
|
|
; parse house code (string in AY)
|
|
;
|
|
parse_hcode:
|
|
sta hStr+1
|
|
sty hStr
|
|
ldy #0
|
|
lda (hStr),y
|
|
cmp #1
|
|
bne house_bad
|
|
ldy #1
|
|
lda (hStr),y
|
|
jsr xdowncase
|
|
cmp #'a'+$80
|
|
bcc house_bad
|
|
cmp #'p'+$80+1
|
|
bcs house_bad
|
|
sec
|
|
sbc #'a'+$80 ;house code 0-15
|
|
tax
|
|
lda hCodes,x
|
|
sta Housecode
|
|
rts
|
|
|
|
house_bad:
|
|
jsr xmess
|
|
.byte cr
|
|
asc_hi "*** house code must be A-P"
|
|
.byte 13,0
|
|
jmp xerr
|
|
|
|
hCodes: .byte $60,$e0,$20,$a0,$10,$90,$50,$d0
|
|
.byte $70,$f0,$30,$b0,$00,$80,$40,$c0
|
|
;
|
|
; send header, $00, $x0
|
|
;
|
|
set_basehc:
|
|
jsr header
|
|
lda #0
|
|
jsr outchar
|
|
lda Housecode
|
|
jsr outchar
|
|
jsr wait_ack
|
|
jsr print_status
|
|
rts
|
|
;
|
|
; calc_hcode--ask the unit what the housecode is
|
|
;
|
|
calc_hcode:
|
|
jsr header
|
|
lda #4
|
|
jsr outchar
|
|
|
|
jsr inchar
|
|
jsr inchar
|
|
inSync: jsr inchar
|
|
cmp #$ff
|
|
beq inSync
|
|
sta Status
|
|
jsr inchar
|
|
sta Minutes
|
|
jsr inchar
|
|
sta Hours
|
|
jsr inchar
|
|
sta Day
|
|
jsr inchar
|
|
sta Housecode
|
|
jsr inchar ;checksum
|
|
rts
|
|
|
|
inchar: ldy refnum
|
|
ldx #mli_read-$80
|
|
jsr xprint_drvr
|
|
bcc gotCh
|
|
cmp #0
|
|
bne blark
|
|
lda $c061 ;%%%
|
|
bpl inchar
|
|
lda #der_abort
|
|
bne blark
|
|
gotCh:
|
|
pha
|
|
jsr debugByte
|
|
pla
|
|
rts
|
|
blark: jmp xProDOS_err
|
|
;
|
|
; wait_ack -- wait for ACK and return status:
|
|
; sec = error
|
|
;
|
|
wait_ack: jsr inchar
|
|
wait_ac2: jsr inchar
|
|
cmp #$ff
|
|
beq wait_ac2
|
|
cmp #1
|
|
rts
|
|
;
|
|
debugByte:
|
|
bit Debug
|
|
bpl dbbx
|
|
jsr prbyte
|
|
lda #_' '
|
|
jsr cout
|
|
dbbx: rts
|
|
;
|
|
print_status:
|
|
bcs stat1
|
|
jsr xmess
|
|
.byte cr
|
|
asc_hi "S=0"
|
|
.byte cr,0
|
|
rts
|
|
stat1: jsr xmess
|
|
.byte cr
|
|
asc_hi "S=1"
|
|
.byte cr,0
|
|
rts
|
|
;
|
|
; set controller's clock (Y=day)
|
|
;
|
|
set_clock:
|
|
lda day_bits,y
|
|
sta theDay
|
|
jsr header
|
|
lda #2
|
|
jsr outchar
|
|
lda $bf92 ;minute
|
|
jsr outchar
|
|
lda $bf93 ;hour
|
|
jsr outchar
|
|
lda theDay
|
|
jsr outchar ;day bitmap
|
|
clc
|
|
lda $bf92
|
|
adc $bf93
|
|
clc
|
|
adc theDay
|
|
jsr outchar
|
|
jsr wait_ack
|
|
jsr print_status
|
|
rts
|
|
|
|
theDay: .res 1
|
|
|
|
day_bits: .byte $00,$01,$02,$04,$08,$10,$20,$40
|
|
;
|
|
; show_info
|
|
;
|
|
show_info:
|
|
jsr calc_hcode
|
|
jsr xmess
|
|
asc_hi "Status = "
|
|
.byte 0
|
|
lda Status
|
|
jsr prbyte
|
|
jsr crout
|
|
jsr xmess
|
|
asc_hi "Time = "
|
|
.byte 0
|
|
lda Hours
|
|
ldy Minutes
|
|
jsr xpr_time_ay
|
|
lda Day
|
|
jsr ConvertDay
|
|
jsr PrintDay
|
|
jsr crout
|
|
jsr xmess
|
|
asc_hi "House code = "
|
|
.byte 0
|
|
lda Housecode
|
|
lsr a
|
|
lsr a
|
|
lsr a
|
|
lsr a
|
|
tay
|
|
lda codeLtrs,y
|
|
jsr cout
|
|
jsr crout
|
|
rts
|
|
|
|
codeLtrs:
|
|
asc_hi "MECKOGAINFDLPHBJ"
|
|
|
|
;
|
|
; ConvertDay-- $01, $02, $04, $08, $10, $20, $40, $xx
|
|
; v v v v v v v v
|
|
; 0 1 2 3 4 5 6 7
|
|
;
|
|
ConvertDay:
|
|
tax
|
|
beq oddDay
|
|
ldx #$ff
|
|
cd1: inx
|
|
lsr a
|
|
bcc cd1
|
|
tay
|
|
beq dayOK
|
|
oddDay: ldx #7
|
|
dayOK: txa
|
|
rts
|
|
;
|
|
; PrintDay--0..7 --> print Mon, Tue, ..., ???.
|
|
;
|
|
PrintDay:
|
|
asl a
|
|
asl a
|
|
tay
|
|
ldx #4
|
|
dn1: lda dayNames,y
|
|
jsr cout
|
|
iny
|
|
dex
|
|
bne dn1
|
|
rts
|
|
|
|
dayNames:
|
|
asc_hi " Mon Tue Wed Thu Fri Sat Sun ???"
|
|
|
|
;
|