!to "shasum.o", plain * = $6000 jmp main ;; clear addresses: ;; (http://apple2.org.za/gswv/a2zine/faqs/csa2pfaq.html#017) ;; 06-09 ;; EB-EF ;; FA-FD !addr SRC = $06 !addr DEST = $08 !addr INPUT = $eb !addr LENGTH = $ee !addr PRBYTE = $FDDA !addr COUT = $FDED h0: !32 0 ; return value (hash) h1: !32 0 h2: !32 0 h3: !32 0 h4: !32 0 ml: !32 0, 0 ; message length w: !fill 64, 0 w_next: !fill 64, 0 kh0: !be32 $67452301 ; initial values for h0..h4 kh1: !be32 $EFCDAB89 kh2: !be32 $98BADCFE kh3: !be32 $10325476 kh4: !be32 $C3D2E1F0 k1: !be32 $5A827999 ; k = constants k2: !be32 $6ED9EBA1 k3: !be32 $8F1BBCDC k4: !be32 $CA62C1D6 ;;; Print a string of bytes, as hex. ;;; Address in SRC, count in A. ;;; Burns Y, A. prbytes: ldy #0 - pha lda (SRC),y jsr PRBYTE iny pla adc #$ff bne - rts main: ;; Test PRBYTES ;; lda #kh0 ;; sta SRC+1 ;; lda #8 ;; jsr prbytes ;; LDA #$8D ;; jsr COUT ;; Test shasum lda #0 sta INPUT lda #$ff sta INPUT+1 lda #0 sta LENGTH+1 lda #$37 sta LENGTH jsr shasum rts shasum: ;; Initialize h0..h4 ldy #(ml-h0-1) - lda kh0,y sta h0,y dey bpl - ;; Initialize message length (ml) lda #0 ldy #4 - sta ml, y dey bpl - lda LENGTH sta ml+7 lda LENGTH+1 sta ml+6 ;; Message length is in bits ldy #3 - clc rol ml+7 rol ml+6 rol ml+5 dey bne - ;; Initialize chunk counter ;; ldy #0 ; already zero ;; Invert length so we can inc instead of dec lda LENGTH sec lda #0 sbc LENGTH sta LENGTH lda #0 sbc LENGTH+1 sta LENGTH+1 ora LENGTH beq .msgdone .loop lda (INPUT),y sta w,y iny cpy #$40 bne + ;; Call do_chunk jsr do_chunk ldy #0 clc lda INPUT adc #$40 sta INPUT bcc + inc INPUT+1 + inc LENGTH bne .loop inc LENGTH+1 bne .loop .msgdone: lda #$80 sta w,y iny cpy #$40 bne .zeros jsr do_chunk ldy #0 .zeros cpy #$38 beq .length lda #0 sta w,y iny cpy #$40 bne .zeros jsr do_chunk ldy #0 jmp .zeros .length ldy #7 - lda ml,y sta w+$38,y dey bpl - jsr do_chunk rts do_chunk: lda #w sta SRC+1 lda #$40 jsr prbytes lda #$8D jsr COUT rts !eof TODOs [X] Routine to print n hex bytes (address, length (byte)) [X] Routine to get the next 16 values (64 bytes) of input [ ] Routine to get w[i] one i at a time, and rebuild next 16 values Needed arithmetic routines for sha1sum: - [ ] add32 - [ ] and32 - [ ] or32 - [ ] xor32 - [ ] not32 - [ ] ROL1 - [ ] ROR1 - [ ] ROL5 --> ROL8, (ROR1,ROR1,ROR1) - [ ] ROL30 --> (ROR1,ROR1)