; ; graphics.s ; ; Created by Quinn Dunki on 9/10/16 ; Copyright (c) 2015 One Girl, One Laptop Productions. All rights reserved. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; EnableHires ; Trashes A ; EnableHires: lda TEXT lda HIRES1 lda HIRES2 rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; WritePage1 ; Trashes A ; WritePage1: lda #HGRROWS_H1 sta HIRES_PAGE_H rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; WritePage2 ; Trashes A ; WritePage2: lda #HGRROWS_H2 sta HIRES_PAGE_H rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PageFlip ; Trashes A ; PageFlip: lda RDPAGE2 bmi PageFlip_Show1 lda HIRESPAGE2 jmp WritePage1 PageFlip_Show1: lda HIRESPAGE1 jmp WritePage2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SaveBackground ; PARAM0: X pos ; PARAM1: Y pos ; PARAM2: Storage area (LSB) ; PARAM3: Storage area (MSB) ; ; Assumes 6-byte-wide, 8px-high sprites ; SaveBackground: SAVE_AXY ldy #0 lda #0 pha saveBackground_loop: clc pla pha adc PARAM1 ; Calculate Y line tax phy tay lda (HIRES_PAGE_L),y ; Compute hires row sta saveBackground_smc0+2 sta saveBackground_smc1+2 sta saveBackground_smc2+2 sta saveBackground_smc3+2 sta saveBackground_smc4+2 sta saveBackground_smc5+2 lda HGRROWS_L,y sta saveBackground_smc0+1 sta saveBackground_smc1+1 sta saveBackground_smc2+1 sta saveBackground_smc3+1 sta saveBackground_smc4+1 sta saveBackground_smc5+1 ply ldx PARAM0 ; Compute hires column lda DIV7_2,x tax saveBackground_smc0: lda $2000,x sta (PARAM2),y iny inx saveBackground_smc1: lda $2000,x sta (PARAM2),y iny inx saveBackground_smc2: lda $2000,x sta (PARAM2),y iny inx saveBackground_smc3: lda $2000,x sta (PARAM2),y iny inx saveBackground_smc4: lda $2000,x sta (PARAM2),y iny inx saveBackground_smc5: lda $2000,x sta (PARAM2),y iny pla inc pha cpy #48 bne saveBackground_loop pla RESTORE_AXY rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RestoreBackground ; PARAM0: X pos ; PARAM1: Y pos ; PARAM2: Storage area (LSB) ; PARAM3: Storage area (MSB) ; ; Assumes 4-byte-wide, 8px-high sprites ; RestoreBackground: SAVE_AXY ldy #0 lda #0 pha restoreBackground_loop: clc pla pha adc PARAM1 ; Calculate Y line tax phy tay lda (HIRES_PAGE_L),y ; Compute hires row sta restoreBackground_smc0+2 sta restoreBackground_smc1+2 sta restoreBackground_smc2+2 sta restoreBackground_smc3+2 sta restoreBackground_smc4+2 sta restoreBackground_smc5+2 lda HGRROWS_L,y sta restoreBackground_smc0+1 sta restoreBackground_smc1+1 sta restoreBackground_smc2+1 sta restoreBackground_smc3+1 sta restoreBackground_smc4+1 sta restoreBackground_smc5+1 ply ldx PARAM0 ; Compute hires column lda DIV7_2,x tax lda (PARAM2),y restoreBackground_smc0: sta $2000,x iny inx lda (PARAM2),y restoreBackground_smc1: sta $2000,x iny inx lda (PARAM2),y restoreBackground_smc2: sta $2000,x iny inx lda (PARAM2),y restoreBackground_smc3: sta $2000,x iny inx lda (PARAM2),y restoreBackground_smc4: sta $2000,x iny inx lda (PARAM2),y restoreBackground_smc5: sta $2000,x iny pla inc pha cpy #48 bne restoreBackground_loop pla RESTORE_AXY rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; LinearFill ; A: Byte value to fill ; Trashes all registers ; LinearFill: ldx #0 linearFill_outer: pha lda HGRROWS_H1,x sta linearFill_inner+2 lda HGRROWS_L,x sta linearFill_inner+1 pla ldy #39 linearFill_inner: sta $2000,y dey bpl linearFill_inner inx cpx #192 bne linearFill_outer rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; VenetianFill ; A: Byte value to fill ; Trashes all registers ; VenetianFill: ldx #$3f venetianFill_outer: stx venetianFill_inner+2 ldy #$00 venetianFill_inner: sta $2000,y ; Upper byte of address is self-modified iny bne venetianFill_inner dex cpx #$1f bne venetianFill_outer rts INBUF = $0200 DOSCMD = $be03 KBD = $c000 KBDSTRB = $c010 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; CommandLine ; ; PARAM0: Command line string (LSB) ; PARAM1: Command line string (MSB) ; CommandLine: SAVE_AXY ldx #0 ldy #0 CommandLine_loop: lda (PARAM0),y beq CommandLine_done sta $0200,x ; Keyboard input buffer inx iny bra CommandLine_loop CommandLine_done: lda #$8d ; Terminate with return and null sta $0200,x inx lda #0 sta $0200,x jsr $be03 ; ProDOS 8 entry point RESTORE_AXY rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; BloadHires ; ; PARAM0: Filename (LSB) ; PARAM1: Filename (MSB) ; ; Max filename length: 16 chars! ; BloadHires: SAVE_AXY ldx #0 ldy #0 BloadHires_loop: lda (PARAM0),y ; Copy filename into BLOAD buffer beq BloadHires_done sta BloadHires_buffer+6,x inx iny bra BloadHires_loop BloadHires_done: lda #BloadHires_buffer sta PARAM1 jsr CommandLine RESTORE_AXY rts BloadHires_buffer: .byte "BLOAD ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0