; overscan.as - overscan example in GRAPHIC 3 mode ; Copyright (C) 2000 ag0ny@ag0ny.com ; ********************* ; **** Definitions **** ; ********************* TAB_NAME equ 00800h ; GRAPHIC 3 pattern name table TAB_COLOR equ 02000h ; GRAPHIC 3 color table TAB_GENERATOR equ 00000h ; GRAPHIC 3 pattern generator table SPR_PATTERN equ 01800h ; sprite pattern table SPR_COLOR equ 01200h ; sprite color table SPR_ATTRIBUTE equ 01400h ; sprite attribute table BUF0BANK equ 2 BUF1BANK equ 3 BUF0ADDR equ 00400h*BUF0BANK BUF1ADDR equ 00400h*BUF1BANK STAGESIZE equ 32*4 ; ***************************************************** ; **** START of ag0ny standard routines and macros **** ; ***************************************************** ; ; v0.1/20001120: fillvram, sprsize8, sprsize16, sprnormalsize, ; sprexpanded added ; ; list of macros/functions: ; ; type name function ; ----- --------------- ----------------------------------------------------- ; macro pushstd push standard set of registers ; macro popstd pop standard set of registers ; macro pushall push all registers ; macro popall pop all registers ; macro vdp send value in A to VDP register ; macro rdvdp read VDP status register ; macro selvram select VRAM access from the VDP ; macro selexpram select expanded RAM access from the VDP ; macro r2v8 copy RAM block to VRAM (up to 256 bytes) ; macro r2v16 copy RAM block to VRAM (up to 65536 bytes) ; macro set192lines set 192 lines VDP display mode ; macro set212lines set 212 lines VDP display mode ; macro checkkdb check keyboard line ; macro spriteson turn ON V9938/V9958 sprites display ; macro spritesoff turn OFF V9938/V9958 sprites display ; macro setintline set scan line number for vertical scanning interrupt ; macro vblankon turn ON vblank interrupts ; macro vblankoff turn OFF vblank interrupts ; macro lineinton turn ON line interrupts ; macro lineintoff turn OFF line interrupts ; func freezesys chenge the hook in 0038h to point to our interrupt code ; func restoresys restore the original interrupt handler and interrupt ; state ; func graphic3 set GRAPHIC 3 mode ; func setvramaddr_w set VRAM address for read/write (low 64Kb) ; macro fillvram fill VRAM with a value ; macro sprsize8 set sprites size to 8x8 pixels ; macro sprsize16 set sprites size to 16x16 pixels ; macro sprnormalsize set normal sprites size ; macro sprexpanded set expanded sprites (double size) ; RAM copy of VDP registers. ; vdpregs0 -> R#0..R#7 ; vdpregs1 -> R#8..R#23 ; vdpregs0 equ 0f3dfh vdpregs1 equ 0ffe7h-8 ; VDP ports ; vdpport0 equ 098h ; VRAM read/write vdpport1 equ 099h ; VDP registers read/write vdpport2 equ 09ah ; Palette registers write vdpport3 equ 09bh ; Indirect register write ; i8255 ports ; i8255porta equ 0a8h ; slot selection i8255portb equ 0a9h ; keyboard column input i8255portc equ 0aah ; leds, motor, cassette, kbd line i8255mode equ 0abh ; mode select for i8255 ports A,B,C ; pushstd: push standard set of registers (not alternate) ; syntax: pushstd ; modifies: SP ; note: alternate registers (*') are not pushed; use pushall for that ; pushstd macro push hl push bc push de push af endm ; popstd: pop standard set of registers (not alternate) ; syntax: popstd ; modifies: SP ; note: alternate registers (*') are not popped; use popall for that ; popstd macro pop af pop de pop bc pop hl endm ; pushall: push all registers (including alternate) ; syntax: pushall ; modifies: SP ; note: slower than pushstd; use only if alternate registers must be ; preserved ; pushall macro pushstd push hl' push bc' push de' push af' endm ; popall: pop all registers (including alternate) ; syntax: popall ; modifies: SP ; popall macro pop af' pop de' pop bc' pop hl' popstd endm ; vdp: send value in A to VDP register ; syntax: vdp reg# ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; vdp macro reg out (vdpport1),a ld a,reg or 080h out (vdpport1),a endm ; rdvdp: read VDP status register ; syntax: rdvdp reg# ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; rdvdp macro reg ld a,reg ld (vdpregs1+15),a vdp 15 ; set VDP status register to read in a,(vdpport1) endm ; selvram: select VRAM access from the VDP ; syntax: selvram ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; selvram macro ld a,(vdpregs1+45) and 010111111b ld (vdpregs1+45),a vdp 45 endm ; selexpram: select expanded RAM access from the VDP ; syntax: selexpram ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; selexpram macro ld a,(vdpregs1+45) or 001000000b ld (vdpregs1+45),a vdp 45 endm ; r2v8: copy RAM block to VRAM (up to 256 bytes) (low 64Kb) ; syntax: r2v8 ,, ; modifies: AF,HL,BC,DE ; note: **** INTERRUPTS MUST BE DISABLED **** ; r2v8 macro ram,vram,num ld de,vram call setvramaddr_w ld hl,ram ld bc,num*256 + vdpport0 otir endm ; r2v16: copy RAM block to VRAM (up to 65536 bytes) (low 64Kb) ; syntax: r2v16 ,, ; modifies: AF,HL,DE,C ; note: **** INTERRUPTS MUST BE DISABLED **** ; r2v16 macro ram,vram,num ld de,vram call setvramaddr_w ld de,num ld hl,ram ld c,vdpport0 ld a,(hl) ; jr jumps here out (c),a inc hl dec de ld a,d or e jr nz,$-7 endm ; set192lines: set 192 lines VDP display mode ; syntax: set192lines ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; set192lines macro ld a,(vdpregs1+9) and 001111111b ld (vdpregs1+9),a vdp 9 endm ; set212lines: set 212 lines VDP display mode ; syntax: set212lines ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; set212lines macro ld a,(vdpregs1+9) or 010000000b ld (vdpregs1+9),a vdp 9 endm ; spriteson: turn ON V9938/V9958 sprites display ; syntax: spriteson ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; spriteson macro ld a,(vdpregs1+8) and 011111101b ld (vdpregs1+8),a vdp 8 endm ; spritesoff: turn OFF V9938/V9958 sprites display ; syntax: spritesoff ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; spritesoff macro ld a,(vdpregs1+8) or 000000010b ld (vdpregs1+8),a vdp 8 endm ; setintline: set line number for vertical scanning interrupt ; syntax: setintline line# ; modifies: AF,HL ; note: **** INTERRUPTS MUST BE DISABLED **** ; note: The status of VDP register #23 is read and the interrupt ; line is set accordingly, so the interrupt line specifies the ; interrupt line ON THE PHYSICAL SCREEN, not on the VDP space. ; setintline macro line ld hl,vdpregs1+23 ld a,line add a,(hl) ld (vdpregs1+19),a vdp 19 endm ; vblankon: turn ON vblank interrupts ; syntax: vblankon ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; vblankon macro ld a,(vdpregs0+1) or 000100000b ld (vdpregs0+1),a vdp 1 endm ; vblankoff: turn OFF vblank interrupts ; syntax: vblankoff ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; vblankoff macro ld a,(vdpregs0+1) and 011011111b ld (vdpregs0+1),a vdp 1 endm ; lineinton: turn ON line interrupts ; syntax: lineinton ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; lineinton macro ld a,(vdpregs0+0) or 000010000b ld (vdpregs0+0),a vdp 0 endm ; lineintoff: turn OFF line interrupts ; syntax: lineintoff ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; lineintoff macro ld a,(vdpregs0+0) and 011101111b ld (vdpregs0+0),a vdp 0 endm ; checkkbd: check keyboard line ; syntax: checkkbd ; modifies: AF ; checkkbd macro kbdline in a,(i8255portc) and 011110000b ; upper 4 bits contain info to preserve or kbdline out (i8255portc),a in a,(i8255portb) endm ; fillvram: fill VRAM with a value ; syntax: fillvram
,, ; modifies: AF,DE,BC ; note: **** INTERRUPTS MUST BE DISABLED **** ; fillvram macro address,count,value ld de,address call setvramaddr_w ld de,count ld bc,value*256 + vdpport0 out (c),b ; jr jumps here dec de ld a,d or e jr nz,$-5 endm ; sprsize8: set sprites size to 8x8 pixels ; syntax: sprsize8 ; modifies: AF ; note: **** INTERRUPTS MUST BE DISABLED **** ; sprsize8 macro ld a,(vdpregs0+1) and 011111101b ld (vdpregs0+1),a vdp 1 endm ; sprsize16: set sprites size to 16x16 pixels ; syntax: sprsize16 ; modifies: AF ; note: **** INTERRUPTS MUST BE DISABLED **** ; sprsize16 macro ld a,(vdpregs0+1) or 000000010b ld (vdpregs0+1),a vdp 1 endm ; sprnormalsize: set normal sprites size ; syntax: sprnormalsize ; modifies: AF ; note: **** INTERRUPTS MUST BE DISABLED **** ; sprnormalsize macro ld a,(vdpregs0+1) and 011111110b ld (vdpregs0+1),a vdp 1 endm ; sprexpanded: set expanded sprites (double size) ; syntax: sprexpanded ; modifies: AF ; note: **** INTERRUPTS MUST BE DISABLED **** ; sprexpanded macro ld a,(vdpregs0+1) or 000000001b ld (vdpregs0+1),a vdp 1 endm ; jump to entry point ; jp start ; change the hook in 0038h to point to our interrupt code ; input: none ; output: none ; modifies: HL ; note: the old jump address is stored in (OLDINT) ; freezesys: ld hl,(00039h) ld (OLDINT),hl ld hl,i200 ; install new interrupt jump ld (00039h),hl ld a,(vdpregs1+18) ; save SET ADJUST state ld (OLDADJUST),a ret ; restore the original interrupt handler and interrupt state ; restoresys: ld hl,(OLDINT) ld (00039h),hl ld hl,(OLDSTACK) ld sp,hl lineintoff vblankon rdvdp 1 ; read VDP status register #1 rdvdp 0 ; read VDP statsu register #0 ld a,(OLDADJUST) ld (vdpregs1+18),a vdp 18 ei ret ; set GRAPHIC 3 mode ; input: none ; output: none ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; graphic3: ; set VDP mode GRAPHIC 3 ld a,(vdpregs0+0) and 011110001b or 000000100b ld (vdpregs0+0),a ; R#0 -> xxxx010xb vdp 0 ld a,(vdpregs0+1) and 011100111b ld (vdpregs0+1),a ; R#1 -> xxx00xxxb vdp 1 ld a,2 ; Pattern name table in 00800h ld (vdpregs0+2),a vdp 2 ld a,080h or 01fh ; Pattern color table in 02000h ld (vdpregs0+3),a vdp 3 xor a ld (vdpregs1+10),a vdp 10 xor a ; Pattern generator table at 00000h ld (vdpregs0+4),a vdp 4 ld a,0 ; Sprite name table at 01800h ld (vdpregs0+6),a vdp 6 ; ld a,5 ; Sprite attribute table at 01400h, ld a,000101111b ld (vdpregs0+5),a ; and sprite color table at 01200h vdp 5 xor a ld (vdpregs1+11),a vdp 11 ret ; set VRAM address for read/write (low 64Kb) ; input: DE = VRAM address (bits A0-A15) ; modifies: A ; note: **** INTERRUPTS MUST BE DISABLED **** ; setvramaddr_w: ld a,d rlca rlca and 000000011b vdp 14 ; bits A16-A14 to VDP R#14 ld a,e out (vdpport1),a ; bits A7-A0 to VDP (low 16Kb) ld a,d and 000111111b or 001000000b out (vdpport1),a ; bits A13-A8 to VDP, bit 6 = 1 (W) ret ; *************************************************** ; **** END of ag0ny standard routines and macros **** ; *************************************************** ; copy four screen lines from RAM to VRAM (128 bytes) ; input: HL = RAM address (source) ; DE = VRAM address (destination) ; copyrow: call setvramaddr_w ld a,4 ld de,STAGESIZE-32 copyrow_buc: ld bc,32*256 + vdpport0 ; 32 bytes sent to VDP port #0 otir add hl,de ; hl points to next screen row dec a jr nz,copyrow_buc ret ; interrupt code ; i30: pushstd in a,(vdpport1) ld a,(ADJUST) ld (vdpregs1+18),a vdp 18 ld hl,i200 ld (00038h+1),hl setintline 200 popstd ei ret i200: pushstd in a,(vdpport1) ld hl,i236 ld (00038h+1),hl set192lines setintline 236 popstd ei ret ; this interrupt does all the NASTY work ; i236: pushstd in a,(vdpport1) ld a,070h ld (vdpregs1+18),a vdp 18 r2v8 SPRY,SPR_ATTRIBUTE,4 set212lines setintline 30 ld hl,JUMPTABLE ld d,0 ld a,(JUMPPOS) ld e,a inc a and 000001111b ld (JUMPPOS),a add hl,de add hl,de add hl,de jp (hl) i236_1: ld hl,i30 ld (00038h+1),hl ; checkkbd 8 ld e,a bit 7,e ; RIGHT pressed? jr nz,i236_2 ; no ld a,(SPRX) ; yes, increase X inc a ld (SPRX),a i236_2: bit 6,e ; DOWN pressed? jr nz,i236_3 ; no ld a,(SPRY) ; yes, increase Y inc a ld (SPRY),a i236_3: bit 5,e ; UP pressed? jr nz,i236_4 ; no ld a,(SPRY) ; yes, decrease Y dec a ld (SPRY),a i236_4: bit 4,e ; LEFT pressed? jr nz,i236_5 ; no, continue ld a,(SPRX) ; yes, decrease X dec a ld (SPRY),a ; i236_5: checkkbd 7 ; ESC is in keyboard line #7 and 000000100b ; bit 2 = ESC key jp z,restoresys popstd ei ret frame00: ld a,BUF0BANK ; make BUFFER0 visible vdp 2 ld a,0f8h ; adjust = (7,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ; source address (RAM) ld de,BUF1ADDR+128 ; destination address (VRAM) call copyrow jp i236_1 frame01: ld a,0f9h ; adjust = (6,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,128 add hl,de ld de,BUF1ADDR+256 call copyrow jp i236_1 frame02: ld a,0fah ; adjust = (5,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,256 add hl,de ld de,BUF1ADDR+384 call copyrow jp i236_1 frame03: ld a,0fbh ; adjust = (4,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,384 add hl,de ld de,BUF1ADDR+512 call copyrow jp i236_1 frame04: ld a,0fch ; adjust = (3,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,512 add hl,de ld de,BUF1ADDR+640 call copyrow jp i236_1 frame05: ld a,0fdh ; adjust = (2,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,640 add hl,de ld de,BUF1ADDR+768 call copyrow jp i236_1 frame06: ld a,0feh ; adjust = (1,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,768 add hl,de ld de,BUF1ADDR+896 call copyrow ld hl,(CURRAMPOS) ; increment RAM location (scroll) inc hl ld (CURRAMPOS),hl jp i236_1 frame07: ld a,0ffh ld (ADJUST),a ; adjust = (0,-7) jp i236_1 frame08: ld a,BUF1BANK ; make BUFFER1 visible vdp 2 ld a,0f8h ; adjust = (7,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,BUF0ADDR+128 call copyrow jp i236_1 frame09: ld a,0f9h ; adjust = (6,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,128 add hl,de ld de,BUF0ADDR+256 call copyrow jp i236_1 frame10: ld a,0fah ; adjust = (5,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,256 add hl,de ld de,BUF0ADDR+384 call copyrow jp i236_1 frame11: ld a,0fbh ; adjust = (4,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,384 add hl,de ld de,BUF0ADDR+512 call copyrow jp i236_1 frame12: ld a,0fch ; adjust = (3,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,512 add hl,de ld de,BUF0ADDR+640 call copyrow jp i236_1 frame13: ld a,0fdh ; adjust = (2,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,640 add hl,de ld de,BUF0ADDR+768 call copyrow jp i236_1 frame14: ld a,0feh ; adjust = (1,-7) ld (ADJUST),a ld hl,(CURRAMPOS) ld de,768 add hl,de ld de,BUF0ADDR+896 call copyrow ld hl,(CURRAMPOS) inc hl ld (CURRAMPOS),hl jp i236_1 frame15: ld a,0ffh ; adjust = (0,-7) ld (ADJUST),a jp i236_1 ; ***************************** ; **** Program starts here **** ; ***************************** start: di ld (OLDSTACK),sp vblankoff ; turn OFF vBlank interrupts lineinton ; turn ON line interrupts setintline 200 ; set interrupt at line 200 set212lines ; set 212 lines display spriteson sprexpanded sprsize16 fillvram 0,65535,0 xor a ld (vdpregs1+23),a vdp 23 xor a ld (vdpregs0+7),a vdp 7 ; set border color = 0 call graphic3 call freezesys r2v16 patterns,TAB_GENERATOR+(030h*8),80*8 r2v16 colors,TAB_COLOR+(030h*8),80*8 r2v8 SCOREBOARD,BUF0ADDR,128 r2v8 SCOREBOARD,BUF1ADDR,128 r2v16 patterns,SPR_PATTERN,80*8 r2v8 spritecol,SPR_COLOR,16 r2v8 SPRY,SPR_ATTRIBUTE,4 rdvdp 1 ei loop: jr loop ; ************** ; **** Data **** ; ************** ADJUST: defb 0 OLDINT: defs 2 OLDADJUST: defs 1 OLDSTACK: defs 2 SPRY: defb 96 SPRX: defb 127 SPRPAT: defb 16 defb 0 ; scroll variables SCRPNT: defw SCREEN0 CURRAMPOS: defw SCREEN0 CURVRAMPOS: defw BUF1ADDR+128 JUMPPOS: defb 0 ; 0-13, overflow at 14 JUMPTABLE: jp frame00 jp frame01 jp frame02 jp frame03 jp frame04 jp frame05 jp frame06 jp frame07 jp frame08 jp frame09 jp frame10 jp frame11 jp frame12 jp frame13 jp frame14 jp frame15 spritecol: defb 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,2 patterns: defb 038h,06ch,0c6h,0c6h,0c6h,06ch,038h,000h ; 0 defb 018h,038h,038h,018h,018h,018h,018h,000h ; 1 defb 07ch,0c6h,006h,03ch,060h,0c0h,0feh,000h ; 2 defb 07ch,0c6h,006h,03ch,006h,0c6h,07ch,000h ; 3 defb 01ch,03ch,06ch,0cch,0feh,00ch,00ch,000h ; 4 defb 0feh,0c0h,0fch,006h,006h,0c6h,07ch,000h ; 5 defb 03ch,060h,0c0h,0fch,0c6h,0c6h,07ch,000h ; 6 defb 0feh,086h,08ch,018h,030h,030h,030h,000h ; 7 defb 078h,0c4h,0e4h,078h,09eh,086h,07ch,000h ; 8 defb 07ch,0c6h,0c6h,07eh,006h,00ch,078h,000h ; 9 defb 000h,000h,000h,000h,000h,000h,000h,000h ; : defb 000h,000h,000h,000h,000h,000h,000h,000h ; ; defb 000h,000h,000h,000h,000h,060h,060h,000h ; . (<) defb 000h,000h,000h,000h,000h,000h,000h,000h ; = defb 000h,000h,000h,000h,000h,000h,000h,000h ; > defb 000h,000h,000h,000h,000h,000h,000h,000h ; ? defb 000h,000h,000h,000h,000h,000h,000h,000h ; SPACE (@) defb 038h,06ch,0c6h,0c6h,0feh,0c6h,0c6h,000h ; A defb 0fch,0c6h,0c6h,0fch,0c6h,0c6h,0fch,000h ; B defb 03ch,066h,0c0h,0c0h,0c0h,066h,03ch,000h ; C defb 0f8h,0cch,0c6h,0c6h,0c6h,0cch,0f8h,000h ; D defb 07eh,060h,060h,07ch,060h,060h,07eh,000h ; E defb 07eh,060h,060h,07ch,060h,060h,060h,000h ; F defb 03eh,060h,0c0h,0ceh,0c6h,066h,03eh,000h ; G defb 0c6h,0c6h,0c6h,0feh,0c6h,0c6h,0c6h,000h ; H defb 078h,030h,030h,030h,030h,030h,078h,000h ; I defb 00eh,00eh,00eh,00eh,00eh,08eh,07ch,000h ; J defb 0c6h,0cch,0d8h,0f0h,0f8h,0dch,0ceh,000h ; K defb 060h,060h,060h,060h,060h,060h,07eh,000h ; L defb 0c6h,0eeh,0feh,0d6h,0c6h,0c6h,0c6h,000h ; M defb 0c6h,0e6h,0f6h,0deh,0ceh,0c6h,0c6h,000h ; N defb 07ch,0c6h,0c6h,0c6h,0c6h,0c6h,07ch,000h ; O defb 0fch,0c6h,0c6h,0c6h,0fch,0c0h,0c0h,000h ; P defb 07ch,0c6h,0c6h,0c6h,0deh,0cch,07ah,000h ; Q defb 0fch,0c6h,0c6h,0cch,0f8h,0dch,0ceh,000h ; R defb 07ch,0c6h,0c0h,07ch,006h,0c6h,07ch,000h ; S defb 0fch,030h,030h,030h,030h,030h,030h,000h ; T defb 0c6h,0c6h,0c6h,0c6h,0c6h,0c6h,07ch,000h ; U defb 0c6h,0c6h,0c6h,0c6h,06ch,038h,010h,000h ; V defb 0d6h,0d6h,0feh,0feh,06ch,06ch,06ch,000h ; W defb 0c6h,0eeh,07ch,038h,07ch,0eeh,0c6h,000h ; X defb 066h,066h,066h,03ch,018h,018h,018h,000h ; Y defb 0feh,00eh,01ch,038h,070h,0e0h,0feh,000h ; Z defb 000h,000h,000h,000h,000h,000h,000h,000h ; [ defb 000h,000h,000h,000h,000h,000h,000h,000h ; \ defb 000h,000h,000h,000h,000h,000h,000h,000h ; ] defb 000h,000h,000h,000h,000h,000h,000h,000h ; ^ defb 000h,000h,000h,000h,000h,000h,000h,000h ; _ defb 000h,000h,000h,000h,000h,000h,000h,000h ; ' defb 038h,06ch,0c6h,0c6h,0feh,0c6h,0c6h,000h ; A defb 0fch,0c6h,0c6h,0fch,0c6h,0c6h,0fch,000h ; B defb 03ch,066h,0c0h,0c0h,0c0h,066h,03ch,000h ; C defb 0f8h,0cch,0c6h,0c6h,0c6h,0cch,0f8h,000h ; D defb 07eh,060h,060h,07ch,060h,060h,07eh,000h ; E defb 07eh,060h,060h,07ch,060h,060h,060h,000h ; F defb 03eh,060h,0c0h,0ceh,0c6h,066h,03eh,000h ; G defb 0c6h,0c6h,0c6h,0feh,0c6h,0c6h,0c6h,000h ; H defb 078h,030h,030h,030h,030h,030h,078h,000h ; I defb 00eh,00eh,00eh,00eh,00eh,08eh,07ch,000h ; J defb 0c6h,0cch,0d8h,0f0h,0f8h,0dch,0ceh,000h ; K defb 060h,060h,060h,060h,060h,060h,07eh,000h ; L defb 0c6h,0eeh,0feh,0d6h,0c6h,0c6h,0c6h,000h ; M defb 0c6h,0e6h,0f6h,0deh,0ceh,0c6h,0c6h,000h ; N defb 07ch,0c6h,0c6h,0c6h,0c6h,0c6h,07ch,000h ; O defb 0fch,0c6h,0c6h,0c6h,0fch,0c0h,0c0h,000h ; P defb 07ch,0c6h,0c6h,0c6h,0deh,0cch,07ah,000h ; Q defb 0fch,0c6h,0c6h,0cch,0f8h,0dch,0ceh,000h ; R defb 07ch,0c6h,0c0h,07ch,006h,0c6h,07ch,000h ; S defb 0fch,030h,030h,030h,030h,030h,030h,000h ; T defb 0c6h,0c6h,0c6h,0c6h,0c6h,0c6h,07ch,000h ; U defb 0c6h,0c6h,0c6h,0c6h,06ch,038h,010h,000h ; V defb 0d6h,0d6h,0feh,0feh,06ch,06ch,06ch,000h ; W defb 0c6h,0eeh,07ch,038h,07ch,0eeh,0c6h,000h ; X defb 066h,066h,066h,03ch,018h,018h,018h,000h ; Y defb 0feh,00eh,01ch,038h,070h,0e0h,0feh,000h ; Z colors: defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 0 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 1 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 2 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 3 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 4 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 5 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 6 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 7 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 8 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; 9 defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; : defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; ; defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; . (<) defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; = defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; > defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; ? defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; SPACE (@) defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; A defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; B defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; C defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; D defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; E defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; F defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; G defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; H defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; I defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; J defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; K defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; L defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; M defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; N defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; O defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; P defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; Q defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; R defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; S defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; T defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; U defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; V defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; W defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; X defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; Y defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; Z defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; [ defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; \ defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; ] defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; ^ defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; _ defb 0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h,0f0h ; ' defb 080h,080h,080h,080h,080h,080h,080h,080h ; a defb 080h,080h,080h,080h,080h,080h,080h,080h ; b defb 080h,080h,080h,080h,080h,080h,080h,080h ; c defb 080h,080h,080h,080h,080h,080h,080h,080h ; d defb 080h,080h,080h,080h,080h,080h,080h,080h ; e defb 080h,080h,080h,080h,080h,080h,080h,080h ; f defb 080h,080h,080h,080h,080h,080h,080h,080h ; g defb 080h,080h,080h,080h,080h,080h,080h,080h ; h defb 080h,080h,080h,080h,080h,080h,080h,080h ; i defb 080h,080h,080h,080h,080h,080h,080h,080h ; j defb 080h,080h,080h,080h,080h,080h,080h,080h ; k defb 080h,080h,080h,080h,080h,080h,080h,080h ; l defb 080h,080h,080h,080h,080h,080h,080h,080h ; m defb 080h,080h,080h,080h,080h,080h,080h,080h ; n defb 080h,080h,080h,080h,080h,080h,080h,080h ; o defb 080h,080h,080h,080h,080h,080h,080h,080h ; p defb 080h,080h,080h,080h,080h,080h,080h,080h ; q defb 080h,080h,080h,080h,080h,080h,080h,080h ; r defb 080h,080h,080h,080h,080h,080h,080h,080h ; s defb 080h,080h,080h,080h,080h,080h,080h,080h ; t defb 080h,080h,080h,080h,080h,080h,080h,080h ; u defb 080h,080h,080h,080h,080h,080h,080h,080h ; v defb 080h,080h,080h,080h,080h,080h,080h,080h ; w defb 080h,080h,080h,080h,080h,080h,080h,080h ; x defb 080h,080h,080h,080h,080h,080h,080h,080h ; y defb 080h,080h,080h,080h,080h,080h,080h,080h ; z SCOREBOARD: defb 'vdp@and@overscan@test@@@@@@@@@@@' defb 'THANKS@TO@MATRA@FOR@TECHNICAL@@@' defb 'DETAILS@ABOUT@OVERSCAN@TECHNIQUE' defb 'ag0ny@2000@@@@@@@@@@@@@@@@@@@@@@' SCREEN0: defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333' defb '00000000000000000000000000000000' defb '11111111111111111111111111111111' defb '22222222222222222222222222222222' defb '33333333333333333333333333333333'