From d96dd8765ef08c7fbbe7ce444f3f62235e7e3227 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 15 Jan 2016 04:28:19 -0800 Subject: [PATCH] Provided both algorithm and table --- Home.md | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 125 insertions(+), 10 deletions(-) diff --git a/Home.md b/Home.md index 78f48ac..1e47c8f 100644 --- a/Home.md +++ b/Home.md @@ -8,9 +8,9 @@ Welcome to the AppleWin wiki! Given: - y = abcd efgh + y = abcd efgh (Range 0 .. 191 = $00 .. $BF) -Address is then: +Address of the scanline is calculated via: ---- ---- abcd efgh INPUT: Y ---- ---- ---- -fgh &7 @@ -30,7 +30,7 @@ Address is then: ---- ---- ---a b--- y/64 * 8 + ---- ---- -aba b--- y/64*0x28 See Note for alt. * 0x28 - -PP- ---- 0000 0000 Graphics page, $20 or $40 + 0PP- ---- 0000 0000 Graphics page, $20 or $40 = 0PPf ghcd eaba b000 Address @@ -47,15 +47,130 @@ C code: 6502 code: ```assembly - ORG $900 - 0900: B9 00 10 Y2HGRADR LDA YHgrLo, Y - 0903: 85 26 STA GBASL - 0905: B9 00 11 LDA YHgrHi, Y - 0908: 44 E6 ORA $E6 - 090A: 85 27 STA GBASH - 090C: 60 RTS + GBASL EQU $26 + GBASH EQU $27 + HPAG EQU $E6 ; Used by Applesoft, 20 HGR1, 40 HGR2 + + ORG $F417 + ; Algorithm Y to HGR address + ; INPUT: A = row (0 .. 191) + ; The normal entry point is HPOSN $F411, A=row, Y,X=col + ; F411: STA $E2 + ; F413: STX $E3 + ; F415: STY $E1 +F417: Y2HGRAddr +F417: 48 PHA ; Y = abcdefgh +F418: 29 C0 AND #$C0 ; A = ab000000 +F41A: 85 26 STA GBASL ; +F41C: 4A LSR ; A = 0ab00000 +F41D: 4A LSR ; A = 00ab0000 +F41E: 05 26 ORA GBASL ; = abab0000 +F420: 85 26 STA GBASL +F422: 68 PLA ; C A GBASH GBASL +F423: 85 27 STA GBASH ; ? abcdefgh abcdefgh abab0000 +F425: 0A ASL ; a bcdefgh0 abcdefgh abab0000 +F426: 0A ASL ; b cdefgh00 abcdefgh abab0000 +F427: 0A ASL ; c defgh000 abcdefgh abab0000 +F428: 26 27 ROL GBASH ; a defgh000 bcdefghc abab0000 +F42A: 0A ASL ; d efgh0000 bcdefghc abab0000 +F42B: 26 27 ROL GBASH ; b efgh0000 cdefghcd abab0000 +F42D: 0A ASL ; e fgh00000 cdefghcd abab0000 +F42E: 66 26 ROR GBASL ; 0 fgh00000 cdefghcd eabab000 +F430: A5 27 LDA GBASH ; 0 cdefghcd cdefghcd eabab000 +F432: 29 1F AND #$1F ; 0 000fghcd cdefghcd eabab000 +F434: 05 E6 ORA HPAG ; 0 pppfghcd cdefghcd eabab000 +F436: 85 27 STA GBASH ; 0 pppfghcd pppfghcd eabab000 + + y2hgrL EQU $1000 + y2hgrH EQU $1100 + + ORG $0900 + ; Table Y to HGR address + ; INPUT: Y = row (0 .. 191) +0900: B9 00 10 Y2HGRADR LDA y2hgrL, Y +0903: 85 26 STA GBASL +0905: B9 00 11 LDA y2hgrH, Y +0908: 44 E6 ORA HPAG ; #$20 for HGR1, #$40 for HGR2 +090A: 85 27 STA GBASH +090C: 60 RTS + + ORG $1000 +1000: 00 00 00 00 00 00 00 00 +1008: 80 80 80 80 80 80 80 80 +1010: 00 00 00 00 00 00 00 00 +1018: 80 80 80 80 80 80 80 80 +1020: 00 00 00 00 00 00 00 00 +1028: 80 80 80 80 80 80 80 80 +1030: 00 00 00 00 00 00 00 00 +1038: 80 80 80 80 80 80 80 80 +1040: 28 28 28 28 28 28 28 28 +1048: A8 A8 A8 A8 A8 A8 A8 A8 +1050: 28 28 28 28 28 28 28 28 +1058: A8 A8 A8 A8 A8 A8 A8 A8 +1060: 28 28 28 28 28 28 28 28 +1068: A8 A8 A8 A8 A8 A8 A8 A8 +1070: 28 28 28 28 28 28 28 28 +1078: A8 A8 A8 A8 A8 A8 A8 A8 +1080: 50 50 50 50 50 50 50 50 +1088: D0 D0 D0 D0 D0 D0 D0 D0 +1090: 50 50 50 50 50 50 50 50 +1098: D0 D0 D0 D0 D0 D0 D0 D0 +10A0: 50 50 50 50 50 50 50 50 +10A8: D0 D0 D0 D0 D0 D0 D0 D0 +10B0: 50 50 50 50 50 50 50 50 +10B8: D0 D0 D0 D0 D0 D0 D0 D0 + + ORG $1100 +1100: 00 04 08 0C 10 14 18 1C +1108: 00 04 08 0C 10 14 18 1C +1110: 01 05 09 0D 11 15 19 1D +1118: 01 05 09 0D 11 15 19 1D +1120: 02 06 0A 0E 12 16 1A 1E +1128: 02 06 0A 0E 12 16 1A 1E +1130: 03 07 0B 0F 13 17 1B 1F +1138: 03 07 0B 0F 13 17 1B 1F +1140: 00 04 08 0C 10 14 18 1C +1148: 00 04 08 0C 10 14 18 1C +1150: 01 05 09 0D 11 15 19 1D +1158: 01 05 09 0D 11 15 19 1D +1160: 02 06 0A 0E 12 16 1A 1E +1168: 02 06 0A 0E 12 16 1A 1E +1170: 03 07 0B 0F 13 17 1B 1F +1178: 03 07 0B 0F 13 17 1B 1F +1180: 00 04 08 0C 10 14 18 1C +1188: 00 04 08 0C 10 14 18 1C +1190: 01 05 09 0D 11 15 19 1D +1198: 01 05 09 0D 11 15 19 1D +11A0: 02 06 0A 0E 12 16 1A 1E +11A8: 02 06 0A 0E 12 16 1A 1E +11B0: 03 07 0B 0F 13 17 1B 1F +11B8: 03 07 0B 0F 13 17 1B 1F ``` +## = Address to Y = + + 0PPfghcdeabab000 ab + PPfghcdeabab0000 << 1 + 11000000 & 0xC0 + + 0PPfghcdeabab000 cde + 0PPfghcdeaba >> 4 + 0111000 & 0x38 + + 0PPfghcdeabab000 fgh + 0PPfgh >> 10 + 0111 & 7 + +C code: + + y = ((address & 0x18) << 3) | ((address & 0x1c00) >> 10) | ((address & 0x380) >> 4); + +int HGR_address_to_y( int address ) { + return ((address << 1) & 0xC0) // ab + | ((address >> 4) & 0x38) // cde + | ((address >> 10) & 0x07);// fgh +} + # TEXT ## Row to Address