************************************ * SOFTWARE-BLITTER V1.02 * * PUT/GET fuer Graphik * (Byte-Aufloesung) * * Peter Finzel 1996 ************************************ * ZLAENGE EQU 40 Zeilenlaenge in BYTE * SAVMSC EQU $58 Zeiger auf Video-RAM * * Variable in der Zero-Page * ZEIGER EQU $D4 Pointer in Screen STRING EQU $D6 Pointer in String BZAEHL EQU $D8 Zaehler ORAND EQU $D9 Koordinaten: oberer Rand LRAND EQU $DA linker Rand URAND EQU $DB unterer Rand RRAND EQU $DC rechter Rand BLAENGE EQU $DD Laenge fuer Blitter MODUS EQU $DE Modus fuer PUT 0: Oder * 64:Exor 128: Pset * ORG $0600 * * Sprungleiste * JMP GET JMP PUT * * GET-Routine fuer Bildausschnitte * Aufruf: * A=USR(1536,X1,Y1,X2,Y2,ADR(A$)) * GET CLD PLA Anz. der Parameter PLA Linker Rand MSB PLA Linker Rand LSB STA LRAND PLA Oberer Rand MSB PLA Oberer Rand LSB STA ORAND PLA Rechter Rand MSB PLA Rechter Rand LSB STA RRAND PLA Unterer Rand MSB PLA Unterer Rand LSB STA URAND PLA Adresse des Strings STA STRING+1 PLA STA STRING * SEC Anz. der horizontalen LDA RRAND Bytes ermitteln SBC LRAND BCS LENOK ueberhaupt moeglich? RTS Linker > Rechter! * LENOK STA BLAENGE Laenge merken INC BLAENGE Laenge= R-L+l SEC Anzahl der Zeilen LDA URAND ermitteln SBC ORAND BCS HOEHOK moeglich? RTS Oben > Unten! * HOEHOK CLC Zeilenanzahl ADC #1 korrigieren STA URAND und in URAND eintragen JSR PUTSTR Hoehe und Breite des LDA BLAENGE Ausschnittes im JSR PUTSTR String eintragen * MSB1 JSR BERZEIG Zeiger in Video-Ram * * Soft-Blitter fuer GET * GETZEIL LDY LRAND linker Rand LDA BLAENGE Byte-Zaehler STA BZAEHL einrichten GETBYTE LDA (ZEIGER),Y Wert aus Video/RAM JSR PUTSTR in String ablegen INY naechstes Byte DEC BZAEHL schon ganze Zeile BNE GETBYTE nein -> CLC Zeiger auf naechste LDA ZEIGER Zeile im Video-RAM ADC #ZLAENGE richten (plus 40) STA ZEIGER BCC GET2 jetzt MSB INC ZEIGER+1 * GET2 DEC URAND schon alle Zeilen? BNE GETZEIL nein --> RTS * * PUT-ROUTINE fuer Bildausschnitte * Aufruf: * A=USR(1539,X,Y,Mod,Adr(A$)) * PUT CLD PLA Anz. der Parameter PLA Linker Rand MSB PLA Linker Rand LSB STA LRAND PLA Oberer Rand MSB PLA Oberer Rand LSB STA ORAND PLA Modus-Byte MSB PLA Modus-Byte LSB STA MODUS PLA Adresse des Strings STA STRING+1 PLA STA STRING * JSR GETSTR Anzahl d. Zeilen STA URAND des Ausschnittes JSR GETSTR Hor. Laenge des STA BLAENGE Ausschnittes * ERHZ2 JSR BERZEIG Zeiger in Video-RAM * * Soft-Blitter fuer PUT * PUTZEIL LDA BLAENGE STA BZAEHL Zaehler Zeilenlaenge LDY LRAND linker Rand PUTBYTE JSR GETSTR Zeichen aus String BIT MODUS welcher Modus? BMI PSET -> 'PSET' BVS EXOR > Ex-Oder ORA (ZEIGER),Y 'Oder' BVC PSET verzweigt immer EXOR EOR (ZEIGER),Y Exor-Verkn. PSET STA (ZEIGER),Y in Video-RAM INY naechst. Spalte DEC BZAEHL Zeile fertig? BNE PUTBYTE nein — > CLC naechste Zeile LDA ZEIGER Zeiger=Zeiger+40 ADC #ZLAENGE STA ZEIGER BCC PUT2 INC ZEIGER+1 MSB * PUT2 DEC URAND alle Zeilen fertig? BNE PUTZEIL nein — > RTS * * Zeiger auf erstes Byte berechnen * ZEIGER = ORAND * 40 * BERZEIG LDA ORAND LSB Zeiger=ORAND STA ZEIGER LDA #0 MSB Zeiger=0 STA ZEIGER+1 ASL ZEIGER Zeiger=Zeiger*2 ROL ZEIGER+1 ASL ZEIGER Zeiger=Zeiger*2 ROL ZEIGER+1 ergibt ORAND*4 CLC LDA ZEIGER Zeiger=Zeiger+ORAND ADC ORAND bisher berechnet: STA ZEIGER Zeiger=ORAND*5 BCC SCRADR1 INC ZEIGER+1 SCRADR1 ASL ZEIGER Zeiger=Zeiger*2 ROL ZEIGER+1 ASL ZEIGER Zeiger=Zeiger*2 ROL ZEIGER+1 ergibt ORAND*4 ASL ZEIGER Zeiger=Zeiger*2 ROL ZEIGER+1 damit: CLC ZEIGER=ORAND*40 LDA ZEIGER nun noch die ADC SAVMSC Basisadresse des STA ZEIGER Video-Rams addieren LDA ZEIGER+1 ADC SAVMSC+1 STA ZEIGER+1 RTS * * Routine zur String-Verwaltung * GETSTR LDX #0 Ein Byte aus LDA (STRING,X) dem String holen INC STRING und Stringzeiger BNE GS1 weiterschalten INC STRING+1 GS1 RTS * PUTSTR LDX #0 Ein Byte in STA (STRING,X) String eintragen INC STRING und Stringzeiger BNE PS1 weiterschalten INC STRING+1 PS1 RTS