page 55 maclib bds maclib cmac maclib z80 direct define cursor define remcur define mwa define exycall define hidecur 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: GZ0.ASM release 1 * ;* * ;******************************************************** ; ;******************************************************** ;* * ;* THIS IS THE ONLY FILE WHICH IS SPECIFIC * ;* TO THE EXIDY SORCERER. * ;* IT IS ALSO THE ONLY FILE REQUIRING THE * ;* "Z80.LIB" MACRO LIBRARY. * ;* TO RECONFIGURE FOR YOUR OWN SYSTEM ALL THAT * ;* IS ESSENTIAL IS TO PROVIDE A "cursor(x,y)" * ;* FUNCTION WHICH CONFORMS TO THE FOLLOWING * ;* STANDARDS: * ;* (1) PLACES THE CURSOR AT POSITION (X,Y) * ;* ON THE VIDEO SCREEN (WHERE X IS THE * ;* ROW (DOWN) AND Y IS THE COLUMN (ACROSS))* ;* (2) IF (X,Y) IS NOT A VALID SCREEN POSITION * ;* (EG: -VE) THEN NO CURSOR MOVEMENT IS * ;* PERFORMED. * ;* (3) IN ALL CASES THE ADDRESS OF THE CURSOR * ;* (ON COMPLETION) IS RETURNED TO THE * ;* CALLING FUNCTION. * ;* * ;******************************************************** ; ;============================================================ ; ; 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. prelude 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 reloc jm,curses ;you can't have a -ve column! cpi 64 reloc jnc,curses ;or one > 63 lda arg1 ;get the line ora a reloc jm,curses ;you can't have a -ve line! cpi 30 reloc jnc,curses ;or one > 29 lda arg1+1 ora a reloc jnz,curses lda arg2+1 ora a reloc 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 djnz 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 postlude cursor ;generate relocation table getiy equ 0e1a2h pushix equ 0e5ddh pushiy equ 0e5fdh inxix equ 023ddh scan equ 0e225h ; ;============================================================== ; ; int remcur() ; ; Removes the cursor from the screen. ; Returns the cursor address. ; prelude remcur push b call getiy call rec pop b ret postlude remcur ; ;============================================================== ; ; int mwa(); ; ; Returns the MWA address. ; prelude mwa call getiy dw pushiy pop h ret postlude mwa ; ;============================================================= ; ; 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! ; prelude exycall push b ;just in case! dw pushiy ;move IY pop h ; to HL call scan ;get delims jr z,exyc5 ;NONE! db 0ddh,021h,012h,0e3h exyc1: push h dw pushix mvi b,2 exyc2: db 0ddh,07eh,00h cmp m jr nz,exyc4 inx h dw inxix djnz exyc2 pop d pop d reloc ,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 jr nz,exyc1 exyc5: lxi h,0 pop b ret exyc6: lxi h,1 pop b ret postlude exycall ; ;============================================================= ; ; 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. ; prelude 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 postlude hidecur