home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol075
/
g8m.csm
< prev
next >
Wrap
Text File
|
1984-04-29
|
9KB
|
437 lines
include bds.lib
include z80.lib
page 55
;
;********************************************************
;* *
;* BDS-C Supplementary Library *
;* release 3 *
;* *
;* Steve de Plater, May. 1982 *
;* 66 Priam St. *
;* Chester Hill, *
;* NSW, 2162 *
;* Australia *
;* Phone: (02) 644 4009 *
;* *
;********************************************************
;
; THE (IN)FAMOUS BDS-C SUPPLEMENTARY LIBRARY
; FOR THE EXIDY SORCERER COMPUTER SYSTEM
;
; int supp();
;
; Returns the release number of the SUPP.CRL file
; as a 16 bit number (heaven forbid)!
function supp
release equ 3 ;DATE INSTALLED: 28 May 82
;-------------------------
lxi h,release
ret
endfunc
;
;=============================================================
;
; 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.
;
function fillb
call arghak
push b
lda arg4 ;"from/to" or "from/count"
ora a ;"from/to" - jump
jz fillb2
lhld arg2 ;"COUNT" value
push h ;move it to
pop b ;BC
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 ?
jz fillb8 ;yes - jump
mov a,e ;get fill byte again
jmp fillb6 ;and fill with it
fillb8: pop b ;all over
ret
endfunc
;
;=============================================================
;
; 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.
;
function fill
call arghak
push b
lda arg4 ;"from/to" or "from/count"
ora a
jz fill02 ;"from/to" - jump
lhld arg2 ;get"COUNT"
push h ;and move to
pop b ;BC
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 ?
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 ?
jz fill08 ;yes - jump
mov a,m ;get the next char to fill with
ora a ;is it a 0 (end of string)
jnz fill06 ;no - fill with it then
lhld arg3 ;back to the start of string
mov a,m ;get the first char
jmp fill06 ;and fill with it
fill08: lhld arg3 ;return addr of the fill str
pop b ;all over
ret
endfunc
;
;==============================================================
;
; 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.
;
function 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 ?
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
jz strr04 ;yes - jump
mov m,a ;rotate the char
inx h ;next please
inx d
jmp strr02 ;and back for more
strr04: mov a,b ;"the first shall be last.."
mov m,a
jmp strr14
strr06: mov a,m ;first scan for end
inx h
inr c ;chars in string
ora a ;there yet ?
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 ?
jz strr12 ;yes - jump
ldax d ;get char to rotate
mov m,a ;and rotate it!
dcx h ;back one more
dcx d
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
endfunc
;
;
;=============================================================
;
; int hi(i)
; int i;
;
; Returns the high byte of i.
;
function hi
call ma1toh
mov l,h
mvi h,0
ret
endfunc
;
;=============================================================
;
; int lo(i)
; int i;
;
; Returns the low byte of i.
;
function lo
call ma1toh
mvi h,0
ret
endfunc
;
;============================================================
;
; int cursor(x,y);
;
; moves the cursor to position x (line), y (column) of
; the Sorcerer screen. (if possible)!
; Returns the offset from the beginning of the screen RAM
; of the new cursor position.
function cursor
call arghak ;get the arguements
push b ;we need it!
getiy equ 0e1a2h ;Exidy Monitor entry points
wcur equ 0e9cch ;write cursor
rec equ 0e9e8h ;remove the old one
ptrset equ 0e9d6h ;find the cursor address
lda arg2 ;get the column
ora a
jm curses ;you can't have a -ve column!
cpi 64
jnc curses ;or one > 63
lda arg1 ;get the line
ora a
jm curses ;you can't have a -ve line!
cpi 30
jnc curses ;or one > 29
lda arg1+1
ora a
jnz curses
lda arg2+1
ora a
jnz curses
call getiy
call rec
lda arg1
mov e,a ;and multiply it be 64
mvi d,0
mvi b,6
cur04: sla e
rl d
dcr b
jnz cur04
stiy e,68h ;and save it in the MWA
stiy d,69h ;(both bytes)
lda arg2 ;now get the column
stiy a,6ah ;and save it too
stiyi 0,6bh ;high byte is zero
call wcur ;and put the cursor there!
curses: call ptrset ;just in case we hadn't
pop b ;told you we'd need it
ret ;home we go
endfunc
pushix equ 0e5ddh
pushiy equ 0e5fdh
inxix equ 023ddh
scan equ 0e225h
;
;==============================================================
;
; int remcur()
;
; Removes the cursor from the screen.
; Returns the cursor address.
;
function remcur
push b
call getiy
call rec
pop b
ret
endfunc
;
;==============================================================
;
; int mwa();
;
; Returns the MWA address.
;
function mwa
call getiy
dw pushiy
pop h
ret
endfunc
;
;=============================================================
;
; int exycall();
;
; Calls the Exidy Standard Monitor
; using the monitor command found at MWA.
; Returns 0 if illegal command (or no command)
; or 1 if command successfully executed.
;
; WARNING: This function may not return AT ALL if you
; crash it in the Monitor itself! ;BE WARNED!
;
function exycall
push b ;just in case!
dw pushiy ;move IY
pop h ; to HL
call scan ;get delims
jz exyc5 ;NONE!
db 0ddh,021h,012h,0e3h
exyc1: push h
dw pushix
mvi b,2
exyc2: db 0ddh,07eh,00h
cmp m
jnz exyc4
inx h
dw inxix
dcr b
jnz exyc2
pop d
pop d
lxi b,exyc6
push b
exyc3: db 0ddh,06eh,00h
db 0ddh,066h,01h
pchl
exyc4: db 0ddh,0e1h
pop h
dw inxix
dw inxix
dw inxix
dw inxix
db 0ddh,07eh,00h
ora a
jnz exyc1
exyc5: lxi h,0
pop b
ret
exyc6: lxi h,1
pop b
ret
endfunc
;
;=============================================================
;
; int hidecur(c)
; char c;
;
; Hides the character passed under the cursor (so that
; when the cursor is moved then"all secrets will be
; made known" (or at least displayed on the screen))!
;
; Returns the cursor address.
;
function hidecur
call arghak
push b
call getiy ;we may not have it
lda arg1 ;the char to hide
stiy a,067h ;and hide it there!
call ptrset ;get cursor address
pop b
ret ;and return
endfunc