home *** CD-ROM | disk | FTP | other *** search
- 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
-