Provided both algorithm and table

Michael 2016-01-15 04:28:19 -08:00
parent 509bb3d28d
commit d96dd8765e
1 changed files with 125 additions and 10 deletions

135
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