0100 ; SCREEN DISPLAY SUBROUTINE 0110 ; OUTPUT GR.2 CHARACTERS IN GR.6 0120 ; 0130 ; COPYRIGHT (C) 1983 ROBERT FREEDMAN 0140 ; 0150 ; CALL WITH THE FOLLOWING FROM BASIC 0160 ; ASM=USR(ADR(D6$),ADR(LINE$),LEN(LINE$),PX,PY) 0170 ; PX= X DISPLACEMENT+1, PY=Y DISPLACEMENT+1 0180 ; 0190 *=$630 ; RELOCATABLE 0200 ADRSTR = $CB 0210 SCRMEM = $604 0220 SCRWRK = $CF 0230 LENGTH = $600 0240 XPOS = $601 0250 YPOS = $602 0260 TEMP = $603 0270 OFFSET = $CD 0280 ; 0290 PLA 0300 PLA 0310 STA ADRSTR+1 0320 PLA 0330 STA ADRSTR 0340 PLA 0350 PLA 0360 STA LENGTH 0370 PLA 0380 PLA 0390 STA XPOS 0400 DEC XPOS 0410 PLA 0420 PLA 0430 STA YPOS 0440 DEC YPOS 0450 LDA 560 ; DISPLAY LIST LO 0460 STA $CF ; TEMP ZPAGE LOC 0470 LDA 561 ; DL HI 0480 STA $D0 0490 LDY #4 ; OFFSET FOR SCREEN RAM 0500 LDA ($CF),Y ; GET SCREEN RAM LO 0510 STA SCRMEM ; TO PAGE 6 0520 INY 0530 LDA ($CF),Y ; GET SCREEN RAM HI 0540 STA SCRMEM+1 0550 ; 0560 ; FIND WHERE TO START OUTPUT 0570 ; 0580 LDY YPOS ; HOW FAR DOWN 0590 BEQ GOON ; 1ST LINE? 0600 LOOP CLC ; GET READY FOR ADD 0610 LDA SCRMEM ; BEGIN OF SCR RAM 0620 ADC #20 ; EACH LINE 20 LONG 0630 STA SCRMEM 0640 BCC NEXT ; CARRY? 0650 INC SCRMEM+1 ; YES 0660 NEXT DEY ; DECREMENT COUNTER 0670 BNE LOOP ; CONTINUE MULTIPLY 0680 GOON CLC ; 1 MORE ADD 0690 LDA SCRMEM ; CURRENTLY ON 1ST BYTE OF LINE 0700 ADC XPOS ; X OFFSET 0710 STA SCRMEM 0720 BCC N1 ; CARRY? 0730 INC SCRMEM+1 ; YES 0740 ; 0750 ; FIND BITMAP OF CHARACTER 0760 ; 0770 N1 LDA #00 ; CLEAR TEMP 0780 STA TEMP 0790 NEXT1 LDY TEMP ; COUNTER OF LETTERS OUTPUT 0800 CPY LENGTH ; END? 0810 BCS END ; YES (TEMP >= LENGTH) 0820 LDA #00 ; CLEAR HI OFFSET 0830 STA OFFSET+1 0840 LDA ($CB),Y ; GET LETTER 0850 SEC ; GET READY FOR SUBTRACTION 0860 SBC #32 ; CONVERT TO INTERNAL CODE 0870 STA OFFSET ; OFFSET INTO BIT-MAP TABLE 0880 CLC ; CLEAR FOR X8 MULTIPLACTION 0890 ASL OFFSET ; DO MULTIPLACTION - 16 BIT, X8 0900 ROL OFFSET+1 0910 ASL OFFSET 0920 ROL OFFSET+1 0930 ASL OFFSET 0940 ROL OFFSET+1 0950 LDA OFFSET+1 ; ADD $E000 TO OFFSET 0960 ORA #$E0 ; THIS IS AN ADD! 0970 STA OFFSET+1 0980 ; 0990 ; OUTPUT TO SCREEN 1000 ; 1010 LDA SCRMEM 1020 STA SCRWRK ; TEMP REG FOR OUTPUT 1030 LDA SCRMEM+1 1040 STA SCRWRK+1 ; TEMP REG HI 1050 LDY #00 ; CLEAR Y REG 1060 LDX #6 ; OUTPUT 8 CHAR 1070 OUTPUT LDA (OFFSET),Y ; BITMAP #1 1080 STA (SCRWRK),Y ; OUTPUT #1 1090 INC OFFSET ; NEXT BIT MAP 1100 BNE N2 ; CROSS PAGE BOUNDARY? 1110 INC OFFSET+1 ; YES 1120 N2 CLC ; CLEAR FOR ADD 1130 LDA SCRWRK ; CURRENT SCREEN LINE 1140 ADC #20 ; NEXT LINE 1150 STA SCRWRK 1160 BCC N3 ; CARRY? 1170 INC SCRWRK+1 ; YES 1180 N3 DEX ; ONE MORE DONE 1190 BPL OUTPUT ; ALL 8 OUTPUT? NO - 1200 ; 1210 ;NEXT LETTER 1220 ; 1230 INC TEMP ; NEXT LETTER 1240 INC SCRMEM ; NEXT SCREEN LOCATION 1250 BNE N4 ; PAGE BOUNDARY? 1260 INC SCRMEM+1 ; YES 1270 N4 SEC ; SET CARRY 1280 BCS NEXT1 ; MAKE CODE RELOCATABLE ( I COULD KILL FOR BAW (BRANCH ALWAYS)) 1290 END RTS ; THATS ALL FOLKS
Back to previous page