home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_100
/
130_01
/
g81.asm
< prev
next >
Wrap
Assembly Source File
|
1985-03-10
|
9KB
|
253 lines
page 55
maclib bds
maclib cmac
direct
define fillb
define fill
define strrot
define hi
define lo
enddir
;
;********************************************************
;* *
;* BDS-C Supplementary Library *
;* release 2 *
;* *
;* Steve de Plater, Nov. 1980 *
;* 66 Priam St. *
;* Chester Hill, *
;* NSW, 2162 *
;* Australia *
;* Phone: (02) 644 4009 *
;* *
;* This file: G81.ASM release 1 *
;* *
;********************************************************
;
;
;=============================================================
;
; int fillb(a1,a2,c,mode)
; char c;
; int a1, a2, mode;
;
; if (mode==0)
; Fills memory from address a1 to address a2 (inclusive)
; with the byte c.
; else
; Fills memory from address a1 for a2 bytes with byte c.
;
prelude fillb
call arghak
push b
lda arg4 ;"from/to" or "from/count"
ora a ;"from/to" - jump
reloc jz,fillb2
lhld arg2 ;"COUNT" value
push h ;move it to
pop b ;BC
reloc jmp,fillb4 ;and jump
fillb2: lhld arg1 ;"FROM" address
mov a,l ;turn it
cma ;round
mov e,a ;into the DE pair
mov a,h
cma
mov d,a ;to form "1's comp"
inx d ;and now "2's comp"
lhld arg2 ;and now get "TO" addr
dad d ;ie "TO" - "FROM" = range
push h ;move it to
pop b ;BC (bytes to fill)
inx b ;include the end address too!
fillb4: lhld arg1 ;"FROM" address
lda arg3 ;byte to fill with
mov e,a ;just somewhere to put it!
fillb6: mov m,a ;and fill it in there!
inx h ;point to next fill address
dcx b ;one less to go!
mov a,b
ora c ;finished ?
reloc jz,fillb8 ;yes - jump
mov a,e ;get fill byte again
reloc jmp,fillb6 ;and fill with it
fillb8: pop b ;all over
ret
postlude fillb
;
;=============================================================
;
; char *fill(saddr,eaddr,string,opt)
; char *string;
;
; If (opt==0)
; Fills a contiguous block of RAM starting at saddr and
; ending at eaddr with the string pointed to by "string".
; else
; Fills a contiguous block of RAM starting at saddr of
; length eaddr bytes with the string pointed to.
;
; The string is reused until the fill is complete.
; Returns the address of the fill string.
;
prelude fill
call arghak
push b
lda arg4 ;"from/to" or "from/count"
ora a
reloc jz,fill02 ;"from/to" - jump
lhld arg2 ;get "COUNT"
push h ;and move to
pop b ;BC
reloc jmp,fill04 ;then jump
fill02: lhld arg1 ;"FROM" address
mov a,l ;turn it
cma ;round
mov e,a ;into the DE pair
mov a,h
cma
mov d,a ;to form "1's comp"
inx d ;and now "2's comp"
lhld arg2 ;and now get "TO" addr
dad d ;ie "TO" - "FROM" = range
push h ;move it to
pop b ;BC (bytes to fill)
inx b ;include the end address too!
fill04: lhld arg1 ;"FROM" address
xchg ;to DE
lhld arg3 ;pointer to the "fill string"
mov a,m ;get first char to fill with
ora a ;null string ?
reloc jz,fill08 ;if so then quit
fill06: stax d ;and fill it in there!
inx d ;point to next fill address
inx h ;and next "fill string" char
dcx b ;one less to go!
mov a,b
ora c ;finished ?
reloc jz,fill08 ;yes - jump
mov a,m ;get the next char to fill with
ora a ;is it a 0 (end of string)
reloc jnz,fill06 ;no - fill with it then
lhld arg3 ;back to the start of string
mov a,m ;get the first char
reloc jmp,fill06 ;and fill with it
fill08: lhld arg3 ;return addr of the fill str
pop b ;all over
ret
postlude fill
;
;==============================================================
;
; char *strrot(mode,s)
; char *s;
;
; Rotates the string (end around) pointed to by "s".
; If mode==0 then rotate LEFT, and
; if mode<>0 then rotate RIGHT.
; Returns the address of the string.
;
prelude strrot
call arghak
push b
lhld arg2 ;point to string
push h
pop d ;in DE as well
inx d ;and point ahead one
mvi c,0 ;a counter to zero!
lda arg1 ;get MODE switch
ora a ;rotate left ?
reloc jnz,strr06 ;no - jump
mov a,m ;get char to rotate
mov b,a ;and save it
strr02: ldax d ;get char
ora a ;have we reached end of str
reloc jz,strr04 ;yes - jump
mov m,a ;rotate the char
inx h ;next please
inx d
reloc jmp,strr02 ;and back for more
strr04: mov a,b ;"the first shall be last.."
mov m,a
reloc jmp,strr14
strr06: mov a,m ;first scan for end
inx h
inr c ;chars in string
ora a ;there yet ?
reloc jnz,strr06 ;no - back we go
dcx h ;point back to the null
dcx h ;and then to last char
dcr c ;we don't count the null
push h ;and copy
pop d ;to DE
dcx d ;back one more
mov a,m ;the end char to save
mov b,a ;in B
strr10: dcr c ;have we rotated enough ?
reloc jz,strr12 ;yes - jump
ldax d ;get char to rotate
mov m,a ;and rotate it!
dcx h ;back one more
dcx d
reloc jmp,strr10 ;next please
strr12: mov a,b ;".and the last shall be first"
mov m,a
strr14: lhld arg2 ;return string address
pop b
ret
postlude strrot
;
;
;=============================================================
;
; int hi(i)
; int i;
;
; Returns the high byte of i.
;
prelude hi
call ma1toh
mov l,h
mvi h,0
ret
postlude hi
;
;=============================================================
;
; int lo(i)
; int i;
;
; Returns the low byte of i.
;
prelude lo
call ma1toh
mvi h,0
ret
postlude lo
;
low byte of i.