Listing of file='XYADDR.MAC;01' on disk='vmedia/asm_utility_routines-sideA-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; XHGCHR - EXCHANGE A CHARACTER WITH ONE ON THE SCREEN ; ; VALUES ON ENTRY: ; B,C = X,Y SCREEN CO-ORDS ; D,E = CHARACTER AND CCI TO EXCHANGE ; ; RETURNS: ; D,E = CHARACTER AND CCI FROM THE SCREEN ; ; DESTROYS NOTHING ; ; NOTE: COORDS MUST BE ON THE SCREEN ; ENTRY XHGCHR XHGCHR: PUSH H PUSH B CALL XYADDR ;GET ADDRESS IN REFRESH RAM MOV B,M ;RETRIEVE CHR AND CCI INX H MOV C,M MOV M,E ;STORE NEW CHR AND CCI DCX H MOV M,D MOV D,B ;RETURN OLD CHR AND CCI MOV E,C POP B POP H RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; XYADDR - CONVERT SCREEN COORDS TO REFRESH RAM ADDR ; ; ; VALUES ON ENTRY: ; B,C = X,Y SCREEN CO-ORDS - TWO'S COMPLEMENT ; (COORDS: 0-63 FOR X, 0-31 FOR Y. ; MAY BE OFF SCREEN I.E. OUTSIDE THESE ; RANGES, AND WILL STILL RETURN A VALID ; ADDRESS OUTSIDE REFRESH RAM) ; ; RETURNS: ; HL = ADDRESS 'IN' REFRESH RAM (IF ON SCREEN) ; ; DESTROYS NOTHING ; ; NOTE: COORDS MAY BE OFF SCREEN. THIS IS DONE TO ALLOW ; FIGURES TO MOVE PARTIALLY OFF SCREEN. ; ENTRY XYADDR SCREEN EQU 7000H ;START OF REFRESH RAM XYADDR: PUSH D MOV L,C MVI H,0 XRA A ;SEE IF Y-COORD NEGATIVE ADD C JP MUL128 MVI H,0FFH ;MAKE ALL 16 BITS NEGATIVE MUL128: DAD H ; MULTIPLY BY 128 - X 2 DAD H ; X 4 DAD H ; X 8 DAD H ; X 16 DAD H ; X 32 DAD H ; X 64 DAD H ; X 128 LXI D,SCREEN DAD D MOV E,B MVI D,0 XRA A ;SEE IF X-COORD NEGATIVE ADD B JP ADD2 MVI D,0FFH ;AND EXTEND SIGN IF NECESSARY ADD2: DAD D DAD D POP D RET END