Listing of file='DRWSYM.MAC;08' on disk='vmedia/asm_utility_routines-sideA-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; DRWSYM - DRAW A FIGURE ON THE SCREEN ; ; VALUES ON ENTRY: ; ; B,C = X,Y SCREEN CO-ORDS ; (COORDS ARE 0-63 FOR X AND 0-31 FOR Y, ; BUT OFF-SCREEN VALUES ARE HANDLED OK) ; DE => POINTER TO GRAPHICS FIGURE ; H,L = WIDTH (BYTES INC. COMPOSITE COLOR CODE), ; HEIGHT (NO. OF LINES) ; ; ALL REGISTERS DESTROYED ; ENTRY DRWSYM LPS EQU 32 ;LINES PER SCREEN CPL EQU 64 ;CHARACTERS PER LINE BPL EQU 128 ;BYTES PER LINE DRWSYM: MOV A,B ; ... STORE ALL THE NEEDED INFO STA XCOORD ; MOV A,H ; STA WIDTH ; MOV A,L STA HEIGHT XCHG SHLD GRPTR XCHG CALL XYADDR ;GET ADDRESS IN REFRESH RAM PUSH H SHLD CRTRAM LDA HEIGHT MOV L,A DRWS1: MOV A,C ;GO THROUGH EACH LINE OF THE FIGURE ORA A JP DRWS2 JMP DRWEND DRWS2: CPI LPS ;SEE IF OFF BOTTOM OF SCREEN JNC FIN ;AND RETURN IF TRUE LDA WIDTH ;OTHERWISE LOOK AT X-COORD RRC ;DIVIDE BY TWO ANI 7FH MOV H,A LDA XCOORD MOV B,A DRWS3: MOV A,B ;CHECK X-COORD FOR EACH CHARACTER ORA A JP DRWS6 DRWS4: XTHL ;OFF SCREEN TO LEFT, INCREMENT INX H INX H XTHL INX D INX D DRWS5: INR B ;UPDATE X-COORD DCR H ;SEE IF THIS LINE OF FIGURE FINISHED JNZ DRWS3 JMP DRWEND DRWS6: CPI CPL ;CHECK FOR OFF SCREEN TO RIGHT ... JNC DRWEND XTHL ;... IF NOT, MOVE BYTE TO REFRESH RAM. DRWS7: LDAX D MOV M,A ;MOVE THE CHARACTER INX D INX H LDAX D ;COMPOSITE COLOR CODE TOO MOV M,A DRWS8: INX D INX H XTHL JMP DRWS5 DRWEND: INR C ;GO TO NEXT LINE OF FIGURE DCR L JZ FIN ;RETURN IF NONE LEFT XTHL LHLD CRTRAM ;UPDATE REFRESH RAM ADDRESS PUSH D LXI D,BPL DAD D POP D SHLD CRTRAM XTHL PUSH H LHLD GRPTR ;UPDATE GRAPHICS POINTER LDA WIDTH MOV E,A MVI D,0 DAD D SHLD GRPTR XCHG POP H JMP DRWS1 ;REPEAT FOR THIS LINE FIN: POP H ;HL IS STARTING ADDRESS IN REFRESH RAM RET ; ; TEMPORARY STORAGE AREA ; XCOORD: DS 1 ;STARTING X-COORD OF FIGURE WIDTH: DS 1 ;NUMBER OF BYTES IN FIGURE HEIGHT: DS 1 ;NUMBER OF LINES IN FIGURE CRTRAM: DS 2 ;ADDRESS IN REFRESH RAM GRPTR: DS 2 ;POINTER TO GRAPHIC FOR FIGURE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; 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