INCLUDE "WRISTAPP.I" idx EQU $60 lidx EQU $61 src1 EQU $63 src2 EQU $64 dest EQU $65 i EQU $66 j EQU $67 opidx EQU $62 ; BYTES 60-67 are persisent RAM for our use ; BYTES 110-435 are copied in from the EEPROM when we run org $110 START EQU * ;0x110 The main entry point - WRIST_MAIN jmp main ;0x113 Called when we are suspended for any reason - WRIST_SUSPEND rts nop nop ;0x116 Called to handle any timers or time events - WRIST_DOTIC rts nop nop ;0x119 Called when the COMM app starts and we have timers pending - WRIST_INCOMM rts nop nop ;0x11c Called when the COMM app loads new data - WRIST_NEWDATA rts nop nop ;0x11f The state table get routine - WRIST_GETSTATE lda state_table0,X rts ;0x123 The state handler for state 0 jmp handle_st0_event ;0x126 Offset of state zero into the state table db state_table0 - state_table0 hello_string: timex6 "HELLO " ; state table state_table0: db 0 db EVT_ENTER, TIM_ONCE, 0 ; Initial state db EVT_RESUME, TIM_ONCE, 0 ; Resume from a nested app db EVT_DNNEXT, TIM_ONCE, 0 ; Next button db EVT_MODE, TIM_ONCE, $FF ; Mode button - quit db EVT_END ; ; (7) This is the main initialization routine which is called when we first get the app into memory ; main: lda #$c0 ; We want button beeps and to indicate that we have been loaded sta $96 rts handle_st0_event: bset 1,$8f ; Indicate that we can be suspended ; lda BTNSTATE ; Get the event jsr CLEARALL ; Clear the screen lda #hello_string-start jsr PUT6TOP lda #SYS8_MODE ; Get the system offset for the 'MODE' string jsr PUTMSGBOT ; and put it on the bottom line rts test: lda #0 sta lidx ; data starts off as all zeros ; fixme correct time here lda #$a6 sta DATA1+4 lda #$a7 sta DATA1+5 ; don't need to init H from IH already there jsr sha1_block inc lidx jsr sha1_block ; Copy H->DATA, IH->H ldx #20 test_l1: lda (H-1),x sta (DATA1-1),x lda (IH-1),x sta (H-1),x decx bne test_l1 lda #$80 sta DATA1+23 lda #$a0 sta DATA2 ; set KEYOR = 5c5c5c5c lda #$5c ldx #4 test_l2: sta (KEYOR-1),x decx bne test_l2 dec lidx jsr sha1_block inc lidx jsr sha1_block lda H+16 and #$F tax lda H+3,x and #$7F sta H+3,x txa add #(H-DATA_START) jsr copy4_to_t2 ldx #6 stx lidx test_l3: ldx #(AeT2div10-OPLIST_START) jsr op4_list lda VA ldx lidx sta VD-1,x dec lidx bne test_l3 end: bra end get_w32_015_to_t2: lda lidx cmp #0 bne get_w32_015_to_t2_l1 lda #(ZERO-DATA_START) sta T2eVxorKEYOR_src lda j cmp #3 bhs get_w32_015_to_t2_z1 lsla lsla add #(KEY-DATA_START) sta T2eVxorKEYOR_src get_w32_015_to_t2_z1: ldx #(T2eVxorKEYOR-OPLIST_START) jsr op4_list rts get_w32_015_to_t2_l1: lda j cmp #6 bhs get_w32_015_to_t2_l2 lsla lsla add #(DATA1-DATA_START) bra get_w32_015_to_t2_e get_w32_015_to_t2_l2: cmp #15 bne get_w32_015_to_t2_l3 lda #(DATA2-DATA_START) bra get_w32_015_to_t2_e get_w32_015_to_t2_l3: lda #(ZERO-DATA_START) get_w32_015_to_t2_e: jsr copy4_to_t2 rts get_w32_to_t2: lda idx cmp #16 bhs get_w32_to_t2_l0 sta j ; <16 use our function jsr get_w32_015_to_t2 rts get_w32_to_t2_l0: sub #15 ; store number of iterations needed in i sta i ; fill W lda #0 sta j get_w32_to_t2_l1: jsr get_w32_015_to_t2 lda j lsla lsla add #(WBUF-DATA_START) jsr copy4_from_t2 inc j lda j cmp #16 bne get_w32_to_t2_l1 get_w32_to_t2_l2: ldx #(T2eROT1ofW13xorW8xorW2xortW0-OPLIST_START) jsr op4_list ; for (x=0;x<14;++x) wbuf[x]=wbuf[x+1] ldx #((WBUF0 + $FF - 3 ) - WBUF14) get_w32_to_t2_l3: lda (WBUF15 + 3 - $FF),x sta (WBUF14 + 3 - $FF),x incx bne get_w32_to_t2_l3 lda #(WBUF15 - DATA_START) jsr copy4_from_t2 dec i bne get_w32_to_t2_l2 rts sha1_block: ldx #20 sha1_block_copy_h_to_ae_loop: lda (H-1),x sta (VA-1),x decx bne sha1_block_copy_h_to_ae_loop lda #0 sha1_block_loop: ; a contains idx sta idx cmp #20 bhs sha1_block_k2 lda #(K1-DATA_START) sta k ldx #(T2eNotBandD-OPLIST_START) jsr op4_list bra sha1_block_t2_or_bandc ; T1=T2 | (B&C) sha1_block_k2: cmp #40 bhs sha1_block_k3 lda #(K2-DATA_START) sta k bra sha1_block_k24 ; T1 = B ^ C ^ D sha1_block_k3: cmp #60 bhs sha1_block_k4 ; T1 = (B & C) | (B & D) | (C & D) lda #(K3-DATA_START) sta k ldx #(T2eCandDorBandD-OPLIST_START) jsr op4_list sha1_block_t2_or_bandc: ldx #(T1eT2orBandC-OPLIST_START) jsr op4_list bra sha1_block_shuffle sha1_block_k4: lda #(K4-DATA_START) sta k sha1_block_k24: ldx #(T1eBxorCxorD-OPLIST_START) jsr op4_list sha1_block_shuffle: jsr get_w32_to_t2 ; W[i]->T2 ldx #(shuffleop-OPLIST_START) jsr op4_list lda idx add #1 cmp #80 bhs sha1_block_done jmp sha1_block_loop sha1_block_done: ldx #0 sha1_block_add0: clc sha1_block_add1: lda VA,x adc H,x sta H,x incx txa and #3 bne sha1_block_add1 cpx #20 bne sha1_block_add0 rts1: rts copy4_to_t2: sta T2eV_src ldx #(T2eV-OPLIST_START) bra op4_list copy4_from_t2: sta VeT2_dest ldx #(VeT2-OPLIST_START) bra op4_list op4_list: lda OPLIST_START,x sta op4_src2 incx lda OPLIST_START,x sta src1 incx lda OPLIST_START,x sta src2 sta op_rotshift_op incx lda OPLIST_START,x sta dest incx stx opidx lda op4_src2 tsta beq rts1 bmi op4_list_l1 ldx dest deca beq op_rotshift_left ;shifts dest right src1 times op_shift_right: clc lda DATA_START+3,x rora sta DATA_START+3,x lda DATA_START+2,x rora sta DATA_START+2,x lda DATA_START+1,x rora sta DATA_START+1,x lda DATA_START,x rora sta DATA_START,x dec src1 bne op_shift_right bra op4_list_l2 ; rotates (or shifts) dest left src1 times op_rotshift_left: lda DATA_START,x rola lda DATA_START+1,x rola sta DATA_START+1,x lda DATA_START+2,x rola sta DATA_START+2,x lda DATA_START+3,x rola sta DATA_START+3,x op_rotshift_op: nop lda DATA_START,x rola sta DATA_START,x dec src1 bne op_rotshift_left bra op4_list_l2 op4_list_l1: jsr op4_binary op4_list_l2: ldx opidx bra op4_list op4_binary: ldx #0 lda #DATA_START & $ff add src2 sta op4_src2+2 txa adc #DATA_START>>8 sta op4_src2+1 lda #DATA_START & $ff add src1 sta op4_src1+2 txa adc #DATA_START>>8 sta op4_src1+1 lda #DATA_START & $ff add dest sta op4_dst+2 txa adc #DATA_START>>8 sta op4_dst+1 clc op4_1: op4_src1: lda $fffe,x op4_src2: adc $fffe,x op4_dst: sta $fffe,x incx txa and #3 bne op4_1 rts OPLIST_START: T2eV: db $d9 ;add T2eV_src: db 0 ;src1 db (ZERO-DATA_START) ;src2 db (T2-DATA_START) ;dst db 0 ;stop VeT2: db $d9 ;add db (T2-DATA_START) ;src1 db (ZERO-DATA_START) ;src2 VeT2_dest: db 0 ;dest db 0 ;stop T2eVxorKEYOR: DB $d8 ;eor T2eVxorKEYOR_src: DB 0 ;src1 DB (KEYOR-DATA_START) ;src2 DB (T2-DATA_START) ;dest DB 0 ;stop T2eROT1ofW13xorW8xorW2xortW0: DB $d8 ;eor DB (WBUF0-DATA_START) ;src1 DB (WBUF2-DATA_START) ;src2 DB (T2-DATA_START) ;dest DB $d8 ;eor DB (T2-DATA_START) ;src1 DB (WBUF8-DATA_START) ;src2 DB (T2-DATA_START) ;dest DB $d8 ;eor DB (T2-DATA_START) ;src1 DB (WBUF13-DATA_START) ;src2 DB (T2-DATA_START) ;dest DB $1 ;rot left DB 1 ;1 time DB $9d ;cyclic DB (T2-DATA_START) ;dest DB 0 ;stop T2eNotBandD: DB $d8 ;eor DB (VB-DATA_START) ;src1 DB (FFFFFFFF-DATA_START) ;src2 DB (T2-DATA_START) ;dest DB $d4 ;and DB (VD-DATA_START) ;src1 DB (T2-DATA_START) ;src2 DB (T2-DATA_START) ;dest DB 0 ;stop T2eCandDorBandD: ; T1 = C&D, T2=B&D, T2=T1|T2 DB $d4 ;and DB (VC-DATA_START) ;src1 DB (VD-DATA_START) ;src2 DB (T1-DATA_START) ;dest DB $d4 ;and DB (VB-DATA_START) ;src1 DB (VD-DATA_START) ;src2 DB (T2-DATA_START) ;dest DB $da ;or DB (T1-DATA_START) ;src1 DB (T2-DATA_START) ;src2 DB (T2-DATA_START) ;dest DB 0 ;stop T1eT2orBandC: ; T1=B&C; T1=T1|T2 DB $d4 ;and DB (VB-DATA_START) ;src1 DB (VC-DATA_START) ;src2 DB (T1-DATA_START) ;dest DB $da ;or DB (T1-DATA_START) ;src1 DB (T2-DATA_START) ;src2 DB (T1-DATA_START) ;dest DB 0 ;stop T1eBxorCxorD: DB $d8 ;xor DB (VB-DATA_START) ;src1 DB (VC-DATA_START) ;src2 DB (T1-DATA_START) ;dst DB $d8 ;xor DB (T1-DATA_START) ;src1 DB (VD-DATA_START) ;src2 DB (T1-DATA_START) ;dst DB 0 ;stop shuffleop: DB $d9 ;add DB (T1-DATA_START) ;src1 DB (VE-DATA_START) ;src2 DB (T1-DATA_START) ;dest DB $d9 ;add DB (T1-DATA_START) ;src1 k: DB 0 ;src2 DB (T1-DATA_START) ;dest DB $d9 ;add DB (T1-DATA_START) ;src1 DB (T2-DATA_START) ;src2 DB (T1-DATA_START) ;dest DB $d9 ;add DB (VD-DATA_START) ;src1 DB (ZERO-DATA_START) ;src2 DB (VE-DATA_START) ;dest DB $d9 ;add DB (VC-DATA_START) ;src1 DB (ZERO-DATA_START) ;src2 DB (VD-DATA_START) ;dest DB $d9 ;add DB (VB-DATA_START) ;src1 DB (ZERO-DATA_START) ;src2 DB (VC-DATA_START) ;dest DB $d9 ;add DB (VA-DATA_START) ;src1 DB (ZERO-DATA_START) ;src2 DB (VB-DATA_START) ;dest DB $1 ;rot left DB 30 ;30 times DB $9d ;cyclic DB (VC-DATA_START) ;dest DB $1 ;rot left DB 5 ;5 times DB $9d ;cyclic DB (VA-DATA_START) ;dest DB $d9 ;add DB (VA-DATA_START) ;src1 DB (T1-DATA_START) ;src2 DB (VA-DATA_START) ;dest DB $0 ; ;unsigned divu10(unsigned t2) { ; unsigned q, r; ; //q = (t2 >> 1) + (t2 >> 2); ; a=b=t2; ; a>>=1; b>>=2; ; b+=a; ; q = q + (q >> 4); ; a=b ; a>>=4 ; b+=a; ; q = q + (q >> 8); ; q = q + (q >> 16); ; q = q >> 3; ; r = t2 - (((q << 2) + q) << 1); ; return q + (r > 9); ;} ; AeT2div10: ;A=T2 DB $d9 ;add DB (T2-DATA_START) ;src1 DB (ZERO-DATA_START);src2 DB (VA-DATA_START) ;dest ;B=T2 DB $d9 ;add DB (T2-DATA_START) ;src1 DB (ZERO-DATA_START);src2 DB (VB-DATA_START) ;dest ;C=T2 DB $d9 ;add DB (T2-DATA_START) ;src1 DB (ZERO-DATA_START);src2 DB (VC-DATA_START) ;dest ;A>>=1 DB $2 ;shift right DB 1 ; DB 0 ;N/A DB (VA-DATA_START) ;B>>=1 DB $2 ;shift right DB 2 ; DB 0 ;N/A DB (VB-DATA_START) ;dest ;B+=A DB $d9 DB (VA-DATA_START) ;src1 DB (VB-DATA_START) ;src2 DB (VB-DATA_START) ;dest ;A=B DB $d9 DB (VB-DATA_START) ;src1 DB (ZERO-DATA_START) ;src2 DB (VA-DATA_START) ;dest ;A>>=4 DB $2 ;shift right DB 4 ; DB 0 ;N/A DB (VA-DATA_START) ;B+=A DB $d9 DB (VA-DATA_START) ;src1 DB (VB-DATA_START) ;src2 DB (VB-DATA_START) ;dest ;A=B DB $d9 DB (VB-DATA_START) ;src1 DB (ZERO-DATA_START) ;src2 DB (VA-DATA_START) ;dest ;A>>=8 DB $2 ;shift right DB 8 ; DB 0 ;N/A DB (VA-DATA_START) ;B+=A DB $d9 DB (VA-DATA_START) ;src1 DB (VB-DATA_START) ;src2 DB (VB-DATA_START) ;dest ;A=B DB $d9 DB (VB-DATA_START) ;src1 DB (ZERO-DATA_START) ;src2 DB (VA-DATA_START) ;dest ;A>>=8 DB $2 ;shift right DB 16 ; DB 0 ;N/A DB (VA-DATA_START) ;A+=B DB $d9 DB (VA-DATA_START) ;src1 DB (VB-DATA_START) ;src2 DB (VA-DATA_START) ;dest ;A>>=3 DB $2 ;shift right DB 3 ; DB 0 ;N/A DB (VA-DATA_START) ; ;B=A DB $d9 DB (VA-DATA_START) ;src1 DB (ZERO-DATA_START) ;src2 DB (VB-DATA_START) ;dest ;B<<=2 DB $1 ;shift left DB 2 ; DB $98 ;shift not cyclic DB (VB-DATA_START) ;dest ;B+=A DB $d9 DB (VA-DATA_START) ;src1 DB (VB-DATA_START) ;src2 DB (VB-DATA_START) ;dest ;B<<=1 DB $1 ;shift left DB 1 ; DB $98 ;shift not cyclic DB (VB-DATA_START) ;dest ;B=T2-B DB $d2 DB (T2-DATA_START) ;src1 DB (VB-DATA_START) ;src2 DB (VB-DATA_START) ;dest ;B>>=9 DB $2 ;shift right DB 9 ; DB 0 ;N/A DB (VB-DATA_START) ;dest ;T2=A+B DB $d9 DB (VA-DATA_START) ;src1 DB (VB-DATA_START) ;src2 DB (T2-DATA_START) ;dest ;A=T2+T2 DB $d9 DB (T2-DATA_START) ;src1 DB (T2-DATA_START) ;src2 DB (VA-DATA_START) ;dest ;A<<=2 DB $1 ;shift left DB 2 ; DB $98 ;shift not cyclic DB (VA-DATA_START) ;dest ;A+=T2 DB $d9 DB (T2-DATA_START) ;src1 DB (VA-DATA_START) ;src2 DB (VA-DATA_START) ;dest ;A+=T2 DB $d9 DB (T2-DATA_START) ;src1 DB (VA-DATA_START) ;src2 DB (VA-DATA_START) ;dest ;A=C-A DB $d2 DB (VC-DATA_START) ;src1 DB (VA-DATA_START) ;src2 DB (VA-DATA_START) ;dest ;stop DB 0 OPLIST_END: DATA_START: K1: DB $99 DB $79 DB $82 DB $5A K2: DB $A1 DB $EB DB $D9 DB $6E K3: DB $DC DB $BC DB $1B DB $8F K4: DB $D6 DB $C1 DB $62 DB $CA K5: DB $D0 DB $83 DB $8C DB $46 FFFFFFFF: DB $FF DB $FF DB $FF DB $FF IH: DB $01 DB $23 DB $45 DB $67 DB $89 DB $AB DB $CD DB $EF DB $FE DB $DC DB $BA DB $98 DB $76 DB $54 DB $32 DB $10 DB $F0 DB $E1 DB $D2 DB $C3 KEY: DB $89 DB $0e DB $38 DB $6e DB $bb DB $3c DB $cf DB $e9 DB $00 DB $00 DB $4f DB $e4 ONEMILLION: DB $40 DB $42 DB $F0 DB $0 RWDATA: H: DB $01 DB $23 DB $45 DB $67 DB $89 DB $AB DB $CD DB $EF DB $FE DB $DC DB $BA DB $98 DB $76 DB $54 DB $32 DB $10 DB $F0 DB $E1 DB $D2 DB $C3 KEYOR: DW $3636 DW $3636 DATA1: DW 0 DW 0 DW 0 DW 0 DB 0 DB 0 DB 0 DB $80 DW 0 DW 0 DW 0 DW 0 DW 0 DW 0 DATA2: DB $40 DB $02 DB 0 DB 0 bss: VA: DW 0 DW 0 VB: DW 0 DW 0 VC: DW 0 DW 0 VD: DW 0 DW 0 VE: DW 0 DW 0 T1: DW 0 DW 0 T2: DW 0 DW 0 ZERO: DW 0 DW 0 WBUF: WBUF0: DW 0 DW 0 WBUF1: DW 0 DW 0 WBUF2: DW 0 DW 0 WBUF3: DW 0 DW 0 WBUF4: DW 0 DW 0 WBUF5: DW 0 DW 0 WBUF6: DW 0 DW 0 WBUF7: DW 0 DW 0 WBUF8: DW 0 DW 0 WBUF9: DW 0 DW 0 WBUF10: DW 0 DW 0 WBUF11: DW 0 DW 0 WBUF12: DW 0 DW 0 WBUF13: DW 0 DW 0 WBUF14: DW 0 DW 0 WBUF15: DW 0 DW 0 DATA_END: