davex-mg-utils/poc/afp.cvtime.s

175 lines
5.1 KiB
ArmAsm

; %help
; afp.cvtime -- Test AppleTalk time/date conversion.
;
; syntax: afp.cvtime [-a int] [-s int] [-z]
;
; This program verifies unusual behavior in the AppleTalk card's handling
; of the ConvertTime call.
;
; The card "remembers" the seconds that were given to it by the last AFP
; to P8 time conversion, and uses them when converting from P8 to AFP.
;
; This program has a fixed time in it, use -a and -s to add and subtract
; seconds.
;
; Use -z to perform a conversion to Jan 1, 2000 12:00 AM between converting
; to and from, and note the difference in the converted forward vs converted
; back values.
; %hend
.pc02
.include "davex-mg.inc"
prbyte = $fdda
myptr = xczpage
DX_start $ae00 ; load address
DX_info $01,$12,dx_cc_iie_or_iigs,$00
DX_ptab
DX_parm 'a',t_int3 ; add
DX_parm 's',t_int3 ; subtract
DX_parm 'z',t_nil ; zero
DX_end_ptab
DX_desc "Display AppleTalk info."
DX_main
cli ; appletalk requires interrupt
; do this before error for testing
ldy #<From1
lda #>From1
jsr print4 ; print original From1
jsr mycr
ATcall inforeq
bcc :+
jmp noatalk
: lda #'a'|$80
jsr xgetparm_ch
bcs :+
sta toadd+1
stx toadd+2
sty toadd+3
: lda #'s'|$80
jsr xgetparm_ch
bcs :+
sta tosub+1
stx tosub+2
sty tosub+3
; big-endian add any specified # of seconds
: clc
ldx #$03
: lda From1,x
adc toadd,x
sta From1,x
dex
bpl :-
; big-endian subtract any specified # of seconds
sec
ldx #$03
: lda From1,x
sbc tosub,x
sta From1,x
dex
bpl :-
ldy #<From1
lda #>From1
jsr print4 ; print adjusted From1
jsr mycr
; Now perform network to P8 conversion
ATcall Net2P8
bcs cnverr
ldy #<To1
lda #>To1
jsr print4 ; display converted-to bytes
jsr mycr
; Display in human-readable format
ldy To1
lda To1+1
jsr xpr_date_ay
lda #' '|$80
jsr cout
ldy To1+2
lda To1+3
jsr xpr_time_ay
jsr mycr
lda #'z'|$80
jsr xgetparm_ch
bcs :+
; This should reset the saved seconds number
ATcall ResetSec
bcs cnverr
; Copy to reverse conversion
: ldx #$03
: lda To1,x
sta From2,x
dex
bpl :-
; Perform P8 to network conversion
ATcall P82Net
bcs cnverr
ldy #<To2
lda #>To2
jsr print4 ; display converted-back bytes
jsr mycr
rts
cnverr: lda #$01
jsr xredirect
jsr xmess
asc_hi "Conversion error!"
.byte $8d,$00
bra exiterr
noatalk: lda #$01
jsr xredirect
jsr xmess
asc_hi "AppleTalk offline!"
.byte $8d,$00
exiterr: lda #$ff
jsr xredirect
jmp xerr
;
.proc print4
sta myptr+1
sty myptr
ldy #$00
: lda (myptr),y
jsr prbyte
iny
cpy #$04
bne :-
ldy myptr
rts
.endproc
.proc mycr
lda #$8d
jmp cout
.endproc
;
toadd: .res 4,0 ; BIG ENDIAN
tosub: .res 4,0 ; BIG ENDIAN
;
inforeq: .byte 0,2 ; sync GetInfo
.word $0000 ; result code
.dword $00000000 ; completion address
thisnet: .word $0000 ; this network #
abridge: .byte $00 ; local bridge
hwid: .byte $00 ; hardware ID, IIgs only
romver: .word $00 ; ROM version, IIgs only
nodenum: .byte $00 ; node number
; Convert time parameters - network to P8
Net2P8: .byte 0,$34 ; sync ConvertTime
.word $0000 ; result
.byte $00 ; 0 = from AFP to ProDOS, 1 = reverse
From1: .byte $21,$90,$14,$cd ; BIG ENDIAN, 4-Nov-17 6:03:57 AM GMT
To1: .dword $00000000 ; P8 Time
; Convert time parameters - P8 to network
P82Net: .byte 0,$34 ; sync ConvertTime
.word $0000 ; result
.byte $01 ; 1 = ProDOS to AFP
From2: .dword $00000000 ; P8 Time
To2: .dword $00000000 ; BIG ENDIAN
ResetSec: .byte 0,$34 ; sync ConvertTime
.word $0000 ; result
.byte $00 ; 0 = from AFP to ProDOS, 1 = reverse
.dword $00000000 ; BIG ENDIAN, Jan 1, 2000 12:00 AM GMT
.dword $00000000 ; P8 Time
DX_end