123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- TITLE crc_i86.asm
- NAME crc_i86
- ifndef USE_ZLIB
- ifndef CRC_TABLE_ONLY
- ifdef DEBUG
- VERBOSE_INFO EQU 1
- else
- ifdef _AS_MSG_
- VERBOSE_INFO EQU 1
- else
- VERBOSE_INFO EQU 0
- endif
- endif
- ifndef __SMALL__
- ifndef __COMPACT__
- ifndef __MEDIUM__
- ifndef __LARGE__
- ifndef __HUGE__
- endif
- endif
- endif
- endif
- endif
- ifdef __HUGE__
- ifndef @CodeSize
- @CodeSize EQU 1
- endif
- ifndef @DataSize
- @DataSize EQU 1
- endif
- Save_DS EQU 1
- if VERBOSE_INFO
- if1
- %out Assembling for C, Huge memory model
- endif
- endif
- else
- ifdef __LARGE__
- ifndef @CodeSize
- @CodeSize EQU 1
- endif
- ifndef @DataSize
- @DataSize EQU 1
- endif
- if VERBOSE_INFO
- if1
- %out Assembling for C, Large memory model
- endif
- endif
- else
- ifdef __COMPACT__
- ifndef @CodeSize
- @CodeSize EQU 0
- endif
- ifndef @DataSize
- @DataSize EQU 1
- endif
- if VERBOSE_INFO
- if1
- %out Assembling for C, Compact memory model
- endif
- endif
- else
- ifdef __MEDIUM__
- ifndef @CodeSize
- @CodeSize EQU 1
- endif
- ifndef @DataSize
- @DataSize EQU 0
- endif
- if VERBOSE_INFO
- if1
- %out Assembling for C, Medium memory model
- endif
- endif
- else
- ifndef @CodeSize
- @CodeSize EQU 0
- endif
- ifndef @DataSize
- @DataSize EQU 0
- endif
- if VERBOSE_INFO
- if1
- %out Assembling for C, Small memory model
- endif
- endif
- endif
- endif
- endif
- endif
- if @CodeSize
- LCOD_OFS EQU 2
- else
- LCOD_OFS EQU 0
- endif
- IF @DataSize
- LDAT_OFS EQU 2
- else
- LDAT_OFS EQU 0
- endif
- ifdef Save_DS
- SAVE_REGS EQU 6+(4+LCOD_OFS)
- else
- SAVE_REGS EQU 4+(4+LCOD_OFS)
- endif
- ifdef __686
- Use_286_code EQU 1
- Align_Size EQU 4
- Alig_PARA EQU 1
- else
- ifdef __586
- Use_286_code EQU 1
- Align_Size EQU 4
- Alig_PARA EQU 1
- else
- ifdef __486
- Use_286_code EQU 1
- Align_Size EQU 4
- Alig_PARA EQU 1
- else
- ifdef __386
- Use_286_code EQU 1
- Align_Size EQU 4
- Alig_PARA EQU 1
- else
- ifdef __286
- Use_286_code EQU 1
- Align_Size EQU 2
- Alig_PARA EQU 0
- else
- ifdef __186
- Use_186_code EQU 1
- Align_Size EQU 2
- Alig_PARA EQU 0
- else
- Align_Size EQU 2
- Alig_PARA EQU 0
- endif
- endif
- endif
- endif
- endif
- endif
- ifdef Use_286_code
- .286
- Have_80x86 EQU 1
- else
- ifdef Use_186_code
- .186
- Have_80x86 EQU 1
- else
- .8086
- Have_80x86 EQU 0
- endif
- endif
- if @CodeSize
- if Alig_PARA
- CRC32_TEXT SEGMENT PARA PUBLIC 'CODE'
- else
- CRC32_TEXT SEGMENT WORD PUBLIC 'CODE'
- endif
- CRC32_TEXT ENDS
- else
- if Alig_PARA
- _TEXT SEGMENT PARA PUBLIC 'CODE'
- else
- _TEXT SEGMENT WORD PUBLIC 'CODE'
- endif
- _TEXT ENDS
- endif
- _DATA SEGMENT WORD PUBLIC 'DATA'
- _DATA ENDS
- _BSS SEGMENT WORD PUBLIC 'BSS'
- _BSS ENDS
- DGROUP GROUP _BSS, _DATA
- if @DataSize
- ASSUME DS: nothing, SS: DGROUP
- else
- ASSUME DS: DGROUP, SS: DGROUP
- endif
- if @CodeSize
- EXTRN _get_crc_table:FAR
- else
- EXTRN _get_crc_table:NEAR
- endif
- Do_CRC MACRO
- mov bl,al
- sub bh,bh
- if Have_80x86
- shl bx,2
- else
- shl bx,1
- shl bx,1
- endif
- mov al,ah
- mov ah,dl
- mov dl,dh
- sub dh,dh
- xor ax,WORD PTR [bx][si]
- xor dx,WORD PTR [bx+2][si]
- ENDM
- Do_1 MACRO
- if @DataSize
- xor al,BYTE PTR es:[di]
- else
- xor al,BYTE PTR [di]
- endif
- inc di
- Do_CRC
- ENDM
- Do_2 MACRO
- ifndef NO_16_BIT_LOADS
- if @DataSize
- xor ax,WORD PTR es:[di]
- else
- xor ax,WORD PTR [di]
- endif
- add di,2
- Do_CRC
- Do_CRC
- else
- Do_1
- Do_1
- endif
- ENDM
- Do_4 MACRO
- Do_2
- Do_2
- ENDM
- IF @CodeSize
- CRC32_TEXT SEGMENT
- ASSUME CS: CRC32_TEXT
- else
- _TEXT SEGMENT
- ASSUME CS: _TEXT
- endif
- PUBLIC _crc32
- if @CodeSize
- _crc32 PROC FAR
- else
- _crc32 PROC NEAR
- endif
- if Have_80x86
- enter WORD PTR 0,0
- else
- push bp
- mov bp,sp
- endif
- push di
- push si
- if @DataSize
- else
- endif
- if @DataSize
- mov ax,WORD PTR [bp+8+LCOD_OFS]
- or ax,WORD PTR [bp+10+LCOD_OFS]
- else
- cmp WORD PTR [bp+8+LCOD_OFS],0
- endif
- jne crc_update
- sub ax,ax
- cwd
- ifndef NO_UNROLLED_LOOPS
- jmp fine
- else
- jmp SHORT fine
- endif
- crc_update:
- call _get_crc_table
- mov si,ax
- if @DataSize
- push ds
- mov ax,SEG DGROUP
- mov ds,ax
- ASSUME DS: DGROUP
- endif
- mov ax,WORD PTR [bp+4+LCOD_OFS]
- mov dx,WORD PTR [bp+6+LCOD_OFS]
- not ax
- not dx
- if @DataSize
- les di,DWORD PTR [bp+8+LCOD_OFS]
- mov cx,WORD PTR [bp+12+LCOD_OFS]
- else
- mov di,WORD PTR [bp+8+LCOD_OFS]
- mov cx,WORD PTR [bp+10+LCOD_OFS]
- endif
- ifndef NO_UNROLLED_LOOPS
- ifndef NO_16_BIT_LOADS
- test cx,cx
- jnz start
- jmp done
- start: test di,1
- jz is_wordaligned
- dec cx
- Do_1
- mov WORD PTR [bp+10+LDAT_OFS+LCOD_OFS],cx
- is_wordaligned:
- endif
- if Have_80x86
- shr cx,2
- else
- shr cx,1
- shr cx,1
- endif
- jz No_Fours
- align Align_Size
- Next_Four:
- Do_4
- ifndef OPTIMIZE_286_88
- dec cx
- jnz Next_Four
- else
- loop Next_Four
- endif
- No_Fours:
- if @DataSize
- mov cx,WORD PTR [bp+12+LCOD_OFS]
- else
- mov cx,WORD PTR [bp+10+LCOD_OFS]
- endif
- and cx,00003H
- endif
- jz done
- align Align_Size
- Next_Byte:
- Do_1
- ifndef OPTIMIZE_286_88
- dec cx
- jnz Next_Byte
- else
- loop Next_Four
- endif
- done:
- if @DataSize
- pop ds
- ASSUME DS: nothing
- endif
- not ax
- not dx
- fine:
- pop si
- pop di
- if Have_80x86
- leave
- else
- mov sp,bp
- pop bp
- endif
- ret
- _crc32 ENDP
- if @CodeSize
- CRC32_TEXT ENDS
- else
- _TEXT ENDS
- endif
- endif
- endif
- END
|