home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Programming Black Book (Special Edition)
/
BlackBook.bin
/
disk1
/
zenasmlg
/
zen_list.exe
/
LST13-23.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-02-15
|
2KB
|
79 lines
;
; *** Listing 13-23 ***
;
; Zeros the high-bit of each byte in a 100-byte array,
; using branched-to in-line code.
;
jmp Skip
;
MAXIMUM_ARRAY_LENGTH equ 200
ARRAY_LENGTH equ 100
ByteArray label byte
db ARRAY_LENGTH dup (80h)
;
; Clears the high bit of each byte in an array.
;
; Input:
; BX = pointer to the start of the array to clear
; CX = number of bytes to clear (no greater than
; MAXIMUM_ARRAY_LENGTH)
;
; Output: none
;
; Registers altered: AX, BX, CX
;
ClearHighBits:
;
; Calculate the offset in the in-line code to which to jump
; in order to get the desired number of repetitions.
;
mov al,InLineBitClearEnd-SingleRepetitionStart
;# of bytes per single
; repetition of
; AND [BX],AL/INC BX
mul cl ;# of code bytes in the # of
; repetitions desired
mov cx,offset InLineBitClearEnd
sub cx,ax ;point back just enough
; instruction bytes from
; the end of the in-line
; code to perform the
; desired # of repetitions
mov al,not 80h ;pattern to clear high bits
; with
jmp cx ;finally, branch to perform
; the desired # of
; repetitions
;
; In-line code to clear the high bits of up to the maximum #
; of bytes.
;
rept MAXIMUM_ARRAY_LENGTH-1
;maximum # of bytes to clear
; less 1
and [bx],al ;clear the high bit of this
; byte
inc bx ;point to the next byte
endm
SingleRepetitionStart: ;a single repetition of the
; loop code, so we can
; calculate the length of
; a single repetition
and [bx],dl ;clear the high bit of this
; byte
inc bx ;point to the next byte
InLineBitClearEnd:
ret
;
Skip:
call ZTimerOn
mov bx,offset ByteArray
;array in which to clear
; high bits
mov cx,ARRAY_LENGTH ;# of bytes to clear
; (always less than
; MAXIMUM_ARRAY_LENGTH)
call ClearHighBits ;clear the high bits of the
; bytes
call ZTimerOff