diff --git a/x16/include/vera.a02 b/x16/include/vera.a02 index 4d6ffd4..d6184ed 100644 --- a/x16/include/vera.a02 +++ b/x16/include/vera.a02 @@ -2,6 +2,14 @@ ; Requires External Functions NYBCAT, NYBCUT ; and Variables TEMP0 +;getadr() - Get Vera Address +;Args: A = Bank + Auto-Increment +; Y,X = Address +GETADR: LDX $9F20 ;Store Address LSB + LDY $9F21 ;Store Address MSB + LDA $9F22 ;Store Bank & Auto-Increment + RTS + ;getvid() - Get Video Output Mode ;Returns: A = Video Mode ; Y = Chroma Disabled @@ -32,7 +40,7 @@ GETBDR: LDA #$03 ;Set Register Offset to Border Color GETDCR: LDY #$00 ;Set MSB to Display Composer Page TAX ;Set LSB to Register Offset ;and Execute GETREG -;getreg(addr); +;getreg(&addr); ;Args: Y,X = Address ;Returns: A = Mode ; X = Current Data Port @@ -42,6 +50,194 @@ GETBYT: JSR SETADR ;Set Vera Address LDA $9F23,X ;Read LSB from Data Port RTS +;getmem(count, &addr) - Read Array From Vera Memory +;Args: A = Number of Bytes to Read +; Y,X = Address of Array to Read Into +;Requires: setadr() +;Sets: DSTLO,DSTHI = Address of Array +; TEMP0 = Number of Bytes to Read +;Affects: A +;Returns: Y = Number of Bytes Read +; X = Current Data Port +GETMEM: JSR SETDST ;Save Destination Address +GETMEA: STA TEMP0 ;Save Number of Bytes + LDY #0 ;Initialize Counter + LDX $9F25 ;Get Current Data Port +GETMEL: LDA $9F23,X ;Read Byte from Data Port + STA (DSTLO),Y ;Store in Memory + INY ;Increment Counter + CPY TEMP0 ;If Limit Not Reached + BNE GETMEL ; Loop + +;getmod() - Get Layer 0/1 Mode +;Args: A = Layer (0/1) +;Affects: Y +;Returns: A = Layer Mode +; X = Current Data Port +GETMOD: JSR GETLRC ;Read Register + LSR ;Shift Left Five Bits + LSR + LSR + LSR + RTS + +;getenb() - Get Layer 0/1 Enabled +;Args: A = Layer (0/1) +;Affects: Y +;Returns: A = $FF - Layer Enabled +; $00 - Layer Disabled +; X = Current Data Port +GETENB: JSR GETLRC ;Read Register + AND #$01 ;Isolate Bit 1 + BEQ GETENX ;If Set + LDA #$FF ; Return TRUE +GETENX: RTS ;Else Return FALSE + +;getlrc() - Get Layer 0/1 Control Register +;Args: A = Layer (0/1) +;Affects: Y +;Returns: A = Control Register Contents +; X = Current Data Port +GETLRC: LDX #0 ;Set Offset to Control Register + +;getlrr() - Get Layer 0/1 Register +;Args: A = Layer (0/1) +; X = Register Offset +;Affects: Y +;Returns: A = Contents of Register +; X = Current Data Port +GETLRR: JSR GETLRP ;Get Layer Page in Y + BNE GETREG ;and Read Register Contents + +;getlrp() - Get Layer 0/1 Register Page +;Args: A = Layer (0/1) +;Returns: A,Y = Layer Register Page +GETLRP: AND #$01 ;Isolate Bit 1 + ASL ;Move to Left Nybble + ASL + ASL + ASL + ORA #$20 ;And Add to 2 + TAY ;Return Page in Y + RTS + +;getchd(index, &array) - Read Character Data into Array +;Args: A = Character Index +; Y,X = Address of Array to Read into +;Destroys: TEMP0,TEMP1,TEMP2 +;Returns: A = Number of Bytes Read +GETCHD: JSR SETDST ;Store Address in Destination Pointer + STA TEMP1 ;Set Offset LSB to Index + LDA #0 ;Set Offset MSB to Zero + ASL TEMP1 ;Multiple Offset by 2 + ROL + STA TEMP2 ;and Store MSB + JSR GETLRI ;Get Tile Base + TXA ;Add Offset To Tile Base + CLC + ADC TEMP0 + STA TEMP0 + TYA + ADC TEMP1 + STA TEMP1 + LDA #0 + ADC #0 + JSR GETMBX ;Multiply by 4 + ORA #$10 ;Set Auto-Increment to 1 + JSR SETADR ;and Set Vera Address + LDA #8 ;Set Byte Count to 8 + BNE GETMEA ;and Read Bytes into Array + +;gettba() - Get Layer 0/1 Tile Base Address +;Args: A = Layer (0/1) +;Destroys: TEMP1,TEMP2 +;Returns: A = Tile Base Bank +; Y,X = Tile Base Address +GETTBA: LDX #4 ;Set Register Offset + .DC $2C ;Read Register Pair and Rotate + +;getmba() - Get Layer 0/1 Map Base Address +;Args: A = Layer (0/1) +;Destroys: TEMP1,TEMP2 +;Returns: A = Map Base Bank +; Y,X = Map Base Address +GETMBA: LDX #2 ;Set Register Offset + JSR GETLRI ;Read Register Pair as Integer + LDA #0 ;Initialize Page to 0 + JSR SAVRXY ;Save Integer in TEMP1,TEMP2 +GETMBX: LDX #2 ;Do Twice +GETMBL: ASL TEMP1 ; Rotate LSB + ROL TEMP2 ; MSB and + ROL ; Bank Left + DEX + BNE GETMBL + JMP RESRXY ;Load LSB, MSB and Return + +;getvsc() - Get Layer 0/1 Vertical Scroll +;Args: A = Layer (0/1) +;Returns: A,X = Vertical Scroll LSB +; Y = Vertical Scroll MSB +GETVSC: LDX #8 ;Set Register Offset + .DC $2C ;Skip to GETLRI (BIT Absolute) + +;gethsc() - Get Layer 0/1 Horizontal Scroll +;Args: A = Layer (0/1) +;Returns: A,X = Horizontal Scroll LSB +; Y = Horizontal Scroll MSB +GETHSC: LDX #6 ;Set Register Offset + .DC $2C ;Skip to GETLRI (BIT Absolute) + +;gettbs() - Get Layer 0/1 Tile Base +;Args: A = Layer (0/1) +;Returns: A,X = Tile Base LSB +; Y = Tile Base MSB +GETTBS: LDX #4 ;Set Register Offset + .DC $2C ;Skip to GETLRI (BIT Absolute) + +;getmbs() - Get Layer 0/1 Map Base +;Args: A = Layer (0/1) +;Returns: A,X = Map Base LSB +; Y = Map Base MSB +GETMBS: LDX #2 ;Set Register Offset + +;getlri() - Get Layer 0/1 Register Pair as Integer +;Args: A = Layer (0/1) +; X = Register Offset +;Returns: A,X = Integer LSB +; Y = Integer LSB +GETLRI: JSR GETLRP ;Get Layer Page in Y + BNE GETREI ;and Read Register Contents + + +;mapsiz() - Convert Map Size Specifier to Pixels +;Args: A = Map Size Specifier +;Affects: A +;Returns: Y,X Map Size in Pixels +MAPSIZ: TAX ;Copy Map Size Specifier to X + LDA MAPSIH,X ;Load Pixels MSB from Table + TAY ;and Return in Y + LDA MAPSIL,X ;Load Pixels LSB from Table + TAX ;and Return in X +MAPSIL: .DC $20,$40,$80,$00 +MAPSIH: .DC $00,$00,$00,$01 + +;tilsiz() - Convert Tile Size Specifier to Pixels +;Args: A = Tile Size Specifier +;Affects: A +;Returns: A Tile Size in Pixels +TILSIZ: TAX ;Copy Map Size Specifier to X + LDA TILSIT,X ;Load Pixels MSB from Table + RTS +TILSIT: .DC $08,$10 + +;gettsz() - Get Layer 0/1 Tile Size + +;getmsz() - Get Layer 0/1 Map Size +;Args: A = Layer (0/1) +;Affects: X +;Returns: A = Map Width Specifier +; Y = Map Height Specifier + ;getvsp() - Get Vertical Stop ;Affects: A ;Returns: Y,X = Vertical Stop @@ -99,13 +295,14 @@ GETHVS: JSR GETDCR ;Read LSB from Register ;getiql() - Get Interrupt Line ;Affects: A ;Returns: Y,X = Interrupt Line# -GETIQL: LDA #9 ;Set Register Offset to HSCALE,VSCALE +GETIQL: LDA #9 ;Set Register Offset to Interrupt Line .DC $2C ;Skip to SETDCX (BIT Absolute) ;getscl() - Get Horizontal and Vertical Scale ;Returns: A,X = Horizontal Scale ; Y = Vertical Scale GETSCL: LDA #1 ;Set Register Offset to HSCALE,VSCALE + .DC $2C ;Skip to SETDCI (BIT Absolute) ;getdci() - Get Display Composer Register Pair ;Args: A = Register Offset @@ -135,31 +332,64 @@ GETINT: ORA #$10 ;Set Auto-Increment to 1 TAX ;Copy LSB to X RTS -;sethsr() - Get Horizontal Start -;Affects: A -;Returns: Y,X = Horizontal Start -SETHSR: TYA ;Convert MSB to High Bits - AND #$03 +;setvsp() - Set Horizontal Stop +;Args: Y,X = Horizontal Stop +;Affects: A,X,Y +SETVSP: TYA ;Convert MSB to High Bit + AND #$01 ASL ASL - STA TEMP0 ;and Save + ASL + ASL + ASL + STA TEMP1 ;and Save TXA ;Copy LSB to Accumlator - LDX #5 ;Set Register Offset to Horizontal Start - JSR SETHVS ;Write LSB and Get High Bits - AND #$F3 ;Mask Start Stop High + LDX #7 ;Set Register Offset to Horizontal Start + LDY #$DF ;Set High Bits Mask JMP SETHST ;OR in High Bits and Write Back -;sethsr() - Get Horizontal Start -;Affects: A -;Returns: Y,X = Horizontal Start +;setvsr() - Set Horizontal Start +;Args: Y,X = Horizontal Start +;Affects: A,X,Y +SETVSR: TYA ;Convert MSB to High Bit + AND #$01 + ASL + ASL + ASL + ASL + STA TEMP1 ;and Save + TXA ;Copy LSB to Accumlator + LDX #6 ;Set Register Offset to Horizontal Start + LDY #$EF ;Set High Bits Mask + JMP SETHST ;OR in High Bits and Write Back + +;sethsp() - Set Horizontal Stop +;Args: Y,X = Horizontal Stop +;Affects: A,X,Y +SETHSP: TYA ;Convert MSB to High Bits + AND #$03 + ASL + ASL + STA TEMP1 ;and Save + TXA ;Copy LSB to Accumlator + LDX #5 ;Set Register Offset to Horizontal Start + LDY #$F3 ;Set High Bits Mask + JMP SETHST ;OR in High Bits and Write Back + +;sethsr() - Set Horizontal St7art +;Args: Y,X = Horizontal Start +;Destroys TEMP0,TEMP1,TEMP2 +;Affects: A,X,Y SETHSR: TYA ;Convert MSB to High Bits AND #$03 - STA TEMP0 ;and Save + STA TEMP1 ;and Save TXA ;Copy LSB to Accumlator LDX #4 ;Set Register Offset to Horizontal Start + LDY #$FC ;Set High Bits Mask +SETHST: STY TEMP2 ;Save JSR SETHVS ;Write LSB and Get High Bits - AND #$FC ;Mask Start Stop High -SETHST: ORA TEMP0 ;OR in High Bits + AND TEMP2 ;Mask Start Stop High + ORA TEMP1 ;OR in High Bits STA $9F23,X ;and Write back to Register RTS @@ -221,6 +451,48 @@ SETBYT: JSR SETADR ;Set Vera Address STA $9F23,X ;Write Value to Data Port RTS +;settbs() - Set Layer 0/1 Map Base +;Args: A = Layer (0/1) +; Y,X = Map Base +;Sets: TEMP1,TEMP2 = Map Base +;Affecta: A,Y,X +SETTBS: JSR SAVRXY ;Store Map Base in TEMP1,TEMP2 + LDX #4 ;Set Register Offset + BNE SETLRI ;Write to Layer Register + +;setmbs() - Set Layer 0/1 Map Base +;Args: A = Layer (0/1) +; Y,X = Map Base +;Sets: TEMP1,TEMP2 = Map Base +;Affecta: A,Y,X +SETMBS: JSR SAVRXY ;Store Map Base in TEMP1,TEMP2 + LDX #2 ;Set Register Offset + BNE SETLRI ;Write to Layer Register + +;setvsc() - Set Layer 0/1 Vertical Scroll +;Args: A = Layer (0/1) +; Y,X = Map Base +;Sets: TEMP1,TEMP2 = Vertical Scroll +;Affecta: A,Y,X +SETVSC: JSR SAVRXY ;Store Vertical Scroll in TEMP1,TEMP2 + LDX #8 ;Set Register Offset + BNE SETLRI ;Write to Layer Register + +;sethsc() - Set Layer 0/1 Horizontal Scroll +;Args: A = Layer (0/1) +; Y,X = Map Base +;Sets: TEMP1,TEMP2 = Horizontal Scroll +;Affecta: A,Y,X +SETHSC: JSR SAVRXY ;Store Horizontal Scroll in TEMP1,TEMP2 + LDX #6 ;Set Register Offset + +;setlri() - Write Integer to Get Layer 0/1 Register +;Args: A = Layer (0/1) +; X = Register Offset +;Uses: TEMP1,TEMP2 = Integer Value +;Affecta: A,Y,X +SETLRI: JSR GETLRP ;Get Layer Page in Y + BNE SETREI ;and Write Integer to Register ;setiql() - Set IRQ Line ;Args: Y,X = IRQ Line Number` @@ -267,6 +539,25 @@ SETINT: ORA #$10 ;Set Auto-Increment to 1 STA $9F23,X ;Write to Data Port RTS +;setmem(count, &addr) - Write Array to Vera Memory +;Args: A = Number of Bytes to Write +; Y,X = Address of Array to Write From +;Requires: setadr() +;Sets: SRCLO,SRCHI = Address of Array +; TEMP0 = Number of Bytes to Write +;Affects: A +;Returns: Y = Number of Bytes Written +; X = Current Data Port +SETMEM: STA TEMP0 ;Save Number of Bytes + JSR SETSRC ;Save Destination Address + LDX $9F25 ;Get Current Data Port + LDY #0 ;Initialize Counter +SETMEL: LDA (SRCLO),Y ;Read Byte from Array + STA $9F23,X ;Write Byte to Data Port + INY ;Increment Counter + CPY TEMP0 ;If Limit Not Reached + BNE SETMEL ; Loop + RTS ;rgbclr(r,g,b) - Convert RGB Values to Palette Color ;Args: A = Red Value (0-15) diff --git a/x16/include/vera.h02 b/x16/include/vera.h02 index 1cadea6..c0c81c8 100644 --- a/x16/include/vera.h02 +++ b/x16/include/vera.h02 @@ -2,30 +2,6 @@ * vera.h02 - Commander X16 Routines for Vera chip * ***************************************************/ -/* Convert Palette Color Value * - * to R, G, and B Values * - * Args: int c - Color Value * - * Returns: Red Value (0-15) * - * Green Value (0-15) * - * Blue Value (0-15) */ -char clrrgb(); - -/* Read Color Value from Palette * - * Args: char i - Palette Index * - * Returns: int c - Color Value */ -char getclr(); - -/* Read Display Controller Register * - * Args: char r - Register Offset * - * Returns: char v - Register Value */ -char getdcr(); - -/* Read Video Output Mode * - * Returns: m - Output Mode * - * c - Chroma Disabled * - * f - Current Field */ -char getvid(); - /* Convert R, G, and B Values * * to Palette Color Value * * Args: r - Red Value (0-15) * @@ -34,9 +10,11 @@ char getvid(); * Returns: int c - Color Value */ char rgbclr(); -/* Write Color Value to Palette * - * Args: i - Index into Palette * - * int c - Color Value * - * Returns: int d = Entry Address */ -char setclr(); +/* Convert Palette Color Value * + * to R, G, and B Values * + * Args: int c - Color Value * + * Returns: Red Value (0-15) * + * Green Value (0-15) * + * Blue Value (0-15) */ +char clrrgb(); diff --git a/x16/testvera.c02 b/x16/testvera.c02 index f722870..9b184eb 100644 --- a/x16/testvera.c02 +++ b/x16/testvera.c02 @@ -9,24 +9,52 @@ #include #include #include +#include #include #include "include/vera.h02" +const char abcdef = {1,2,3,4,5,6}; +char buffer[255]; //Buffer for getmem + char hscale,vscale; //Video Scaling +char hrzvrt[5]; //Horizontal and Vertical Register Contents char index; //Color Palette Index char mode,mono,field; //Video Output Mode, Monochrome Flag, Current Field char red,green,blue; //Color Components +char enabld; //Layer Enabled char i,j,k,l; -int c,d,s; +int color,colour; int hstart,hstop; //Horizontal Start and Stop int vstart,vstop; //Vertical Start and Stop int irqlin; //IRQ Line# + +/* Layer 0/1 */ + +char layer; //Layer Number +char layer0[9]; //Layer 0 Register Contents +char layer1[9]; //Layer 1 Register Contents +int mbase0,mbase1; //Map Base, Layer 0 and 1 +int tbase0,tbase1; //Tile Base, Layer 0 and 1 +int mbaddr,tbaddr; //Map and Tile Base Address +int hscrl0,hscrl1; //Horizontal Scroll, Layer 0 and 1 +int vscrl0,vscrl1; //Vertical Scroll, Layer 0 and 1 + char aa,xx,yy; +void failed() { + putln(" FAILED"); +} + void passed() { putln(" PASSED"); - newlin(); + //newlin(); +} + +void prtadr() { + aa, yy, xx = getadr(); + puts("ADDRESS="); + prbyte(aa); prbyte(yy); prbyte(xx); newlin(); } void prtayx(aa,yy,xx) {prhex(aa); prhex(yy); prhex(xx); putspc(); putspc();} @@ -72,7 +100,13 @@ void xerror() { main: newlin(); - putln("TESTING GETVID() AND SETVID()"); + puts("TESTING GETMEM() AND SETMEM()"); + setadr($20,&0); setmem(@abcdef,&abcdef); + setadr($20,&0); getmem(@abcdef,&buffer); + setdst(&abcdef); if (memcmp(@abcdef,&buffer)) xerror(); + passed(); + + puts("TESTING GETVID() AND SETVID()"); for (i=0;i<4;i++) { for (j=1;j:+;j--) { //inline $ff; @@ -84,7 +118,7 @@ main: } passed(); - putln("TESTING GETBDR() AND SETBDR()"); + puts("TESTING GETBDR() AND SETBDR()"); i = 0; do { setbdr(i); @@ -95,7 +129,7 @@ main: } while(i); passed(); - putln("TESTING GETSCL() AND SETSCL()"); + puts("TESTING GETSCL() AND SETSCL()"); i=1; do { j=1; @@ -110,15 +144,35 @@ main: } while (i); passed(); - putln("TESTING GETHSR(), GETHSP(), GETVSR(), GETVSP()"); - hstart = gethsr(); - hstop = gethsp(); - vstart = getvsr(); - vstop = getvsp(); - prthvs(); - newlin(); + //putln("SAVING START AND STOP REGISTERS"); + setadr($1F, &$0004); getmem(5, &hrzvrt); + //for (i=0;i<5;i++) printf(hrzvrt[i], "%h "); newlin(); + + puts("TESTING GETHSR() AND SETHSR()"); + sethsr(&$024C); + hstart = gethsr(); + //setdst(hstart);printf("HSTART=%w%n"); + if (>hstart<>$02 or $4C) xerror(); else passed(); - putln("TESTING GETIRL() AND SETIRL()"); + puts("TESTING GETHSP() AND SETHSP()"); + sethsp(&$025D); hstop = gethsp(); + //setdst(hstop);printf("HSTOP=%w%n"); + if (>hstop<>$02 or $5D) xerror(); else passed(); + + puts("TESTING GETVSR() AND SETVSR()"); + setvsr(&$016E); vstart = getvsr(); + //setdst(vstart);printf("VSTART=%w%n"); + if (>vstart<>$01 or $6E) xerror(); else passed(); + + puts("TESTING GETVSP() AND SETVSP()"); + setvsp(&$017F); vstop = getvsp(); + //setdst(vstop);printf("VSTOP=%w%n"); + if (>vstop<>$01 or $7F) xerror(); else passed(); + + //putln("RESTORING START AND STOP REGISTERS"); + setadr($1F, &$0004); setmem(5, &hrzvrt); + + puts("TESTING GETIRL() AND SETIRL()"); for (i=0;i<2;i++) { j=0; do { @@ -131,13 +185,13 @@ main: } passed(); - putln("TESTING RGBCLR() AND CLRRGB()"); + puts("TESTING RGBCLR() AND CLRRGB()"); for (red=0;red<16;red++) { for (green=0;green<16;green++) { for (blue=0;blue<16;blue++) { //prtayx(red,green,blue); - c = rgbclr(red,green,blue); - //putwrd(c); putspc(); + color = rgbclr(red,green,blue); + //putwrd(color); putspc(); i,j,k = clrrgb(); //prtayx(i,j,k); if (i<>red or j<>green or blue<>k) xerror(); @@ -147,30 +201,79 @@ main: } passed(); - putln("TESTING GETCLR()"); + puts("TESTING GETCLR() AND SETCLR()"); for (i=16; i<32; i++) { //puthex(i); putspc(); - c = getclr(i); - //putwrd(c); putspc(); - if (i&15<>>c or nybdup(i)<>>color or nybdup(i)<>d<>>c) xerror(); + color = rgbclr(red,green,blue); + setclr(i,color); + colour = getclr(i); + //putwrd(colour); putspc(); + if (colour<>>color) xerror(); //if (i&7==7) newlin(); } passed(); + //putln("SAVING LAYER REGISTERS"); + setadr($1F,&$2000); getmem(@layer0,&layer0); + setadr($1F,&$3000); getmem(@layer1,&layer1); + + printf(layer, "TESTING GETMBS() AND SETMBS()"); + setmbs(0,&$1234); mbase0 = getmbs(0); + setmbs(1,&$5678); mbase1 = getmbs(1); + //setdst(mbase0); printf("%nMBASE0=$%w, "); setdst(mbase1); printf("MBASE1=$%w%n"); + if (>mbase0<>$12 or $34) xerror(); + if (>mbase1<>$56 or $78) xerror(); + passed(); + + printf(layer, "TESTING GETTBS() AND SETTBS()"); + settbs(0,&$90AB); tbase0 = gettbs(0); + settbs(1,&$CDEF); tbase1 = gettbs(1); + //setdst(tbase0); printf("%nTBASE0=$%w, "); setdst(tbase1); printf("TBASE1=$%w%n"); + if (>tbase0<>$90 or $AB) xerror(); + if (>tbase1<>$CD or $EF) xerror(); + passed(); + + printf(layer, "TESTING GETMBA() AND GETTBA()"); + i,j,k = getmba(0); if (i<>$00 or j<>$48 or k<>$D0) xerror(); + i,j,k = getmba(1); if (i<>$01 or j<>$59 or k<>$E0) xerror(); + i,j,k = gettba(0); if (i<>$02 or j<>$42 or k<>$AC) xerror(); + i,j,k = gettba(1); if (i<>$03 or j<>$37 or k<>$BC) xerror(); + passed(); + + printf(layer, "TESTING GETHSC() AND SETHSC()"); + sethsc(0,&$1357); hscrl0 = gethsc(0); + sethsc(1,&$2468); hscrl1 = gethsc(1); + //setdst(hscrl0); printf("%nHSCRL0=$%w, "); setdst(hscrl1); printf("HSCRL1=$%w%n"); + if (>hscrl0<>$13 or $57) xerror(); + if (>hscrl1<>$24 or $68) xerror(); + passed(); + + printf(layer, "TESTING GETVSC() AND SETVSC()"); + setvsc(0,&$9BDF); vscrl0 = getvsc(0); + setvsc(1,&$0ACE); vscrl1 = getvsc(1); + //setdst(vscrl0); printf("%nVSCRL0=$%w, "); setdst(hscrl1); printf("VSCRL1=$%w%n"); + if (>vscrl0<>$9B or $DF) xerror(); + if (>vscrl1<>$0A or $CE) xerror(); + passed(); + + //putln("RESTORING LAYER REGISTERS"); + setadr($1F, &$2000); setmem(@layer0, &layer0); + setadr($1F, &$3000); setmem(@layer1, &layer1); + + goto exit; +