Größer sogar:
&2000-&3FFF: Flipscreen / Rastercode + Raster Table
&4000-&7FFF: Screen Data A
&C000-&FFFF: Screen Data B
-------------------------------------
Daraus werden 2 Dateien assembliert:
FILE.BIN -> 25KB
FILE.BI1 -> 17KB
(AMSDOS Größen)
Assemblercode: (Ohne die Screens und den Table)
;-----------------------------------------
; JavaCPC RasterPaint Assembly code
; Authors; Oliver M. Lenz, Markus Hohmann
;-----------------------------------------
org &2000 ; CALL &2000
nolist
; First: Let's detect if we have a Plus machine
ld bc,#F782
ld e,c
out (c),c
dec b
ld c,#0f
out (c),c
inc b
ld a,e
out (c),a
dec b
in a,(c)
cp c
jr z,Plus ; Plus found
or a
jr z,CpcOld ; Old CPC found
Plus
; ASIC Unlock routine
di
ld b,&bc
ld hl,sequence
ld e,17
seq
ld a,(hl)
out (c),a
inc hl
dec e
jr nz,seq
ei
hardwarescroll
ld bc,&7fb8 ; Jump into ASIC RAM
out (c),c
ld a,142 ; Do a hardware scroll to the left
ld (&6804),a
ld bc,&7fa0 ; Jump back into CPC RAM
out (c),c
CpcOld
CPCNew EQU 1 ; Set this to 0 for Older CPC Models.
TableData EQU &3700
di
ld A,0 ; Define Background Color
ld B,26
ld C,26
call &BC32
call &bd19
call &bd19
call &bd19
im 1
ei
newframe:
ld BC,&BC0C
out (C),C ; select CRTC register 12
inc B
ld A,(scradr)
out (C),A
cp &10
jr z,switchto30 ; was &10 (&4000)-> change to &30 (&C000)
ld A,&10 ; was &30 -> change to &10
jp saveA
.switchto30
ld A,&30
.saveA
ld (scradr),A
ld HL,(&0038)
ld (rstsave),HL
ld HL,&C9FB
ld (&0038),HL
ld B,&F5
.waitvsync
in A,(C)
rra
jp nc,waitvsync
halt
halt
di
ld DE,&1702
.waitforstart
dec D
jr nz,waitforstart
dec E
jr nz,waitforstart
IF CPCNew
nop
ENDIF
ld BC,&7F80
ld HL,TableData
ld DE,&0203
ld A,&01
out (C),A ; select pen 1
inc B
.nextline
repeat 200
outi ; 5
outi ; 5
outi ; 5
outi ; 5
outi ; 5
outi ; 5
outi ; 5
outi ; 5
; 40
out (C),D ; 4 ; pen 2
ld B,C ; 1
outi ; 5
out (C),E ; 4 ; pen 3
outi ; 5
out (C),A ; 4 ; pen 1
ld B,C ; 1
; --
; 64 microseconds
rend
ld HL,(rstsave)
ld (&0038),HL
ei
LD A,&45 ; from &40 to &49 with bdir/bc1=01
LD D,0
LD BC,&F782 ; PPI port A out /C out
OUT (C),C
LD BC,&F40E ; Select Ay reg 14 on ppi port A
OUT (C),C
LD BC,&F6C0 ; This value is an AY index (R14)
OUT (C),C
OUT (C),D ; Validate!! out (c),0
LD BC,&F792 ; PPI port A in/C out
OUT (C),C
DEC B
OUT (C),A ; Send KbdLine on reg 14 AY through ppi port A
LD B,&F4 ; Read ppi port A
IN A,(C) ; e.g. AY R14 (AY port A)
LD BC,&F782 ; PPI port A out / C out
OUT (C),C
DEC B ; Reset PPI Write
OUT (C),D ; out (c),0
bit 7,A
jp nz,newframe
ld BC,&BC0C ; Select CRTC Register 12
out (C),C
LD BC,&BD30 ; Return to screen offset #C000
OUT (C),C
ret
.rstsave
db 0,0
.scradr
db &10
.sequence
defb &ff,&00,&ff,&77,&b3,&51,&a8,&d4,&62,&39,&9c,&46,&2b,&15,&8a,&cd,&ee
;; ------------------------------------------------
DEFS 56
read "file_table.asm"
DEFS 304
read "file_screendata.asm"
read "file2_screendata.asm"
Neu dazu gekommen ist, dass geprüft wird, ob es sich um einen Plus handelt, da dieser im Vergleich zum alten CPC andere Raster-Timings hat.
Ich scrolle im Plus das Bild um 2 MODE 1 Pixel nach links, dann passt es dort auch
Eine Spalte in der Breite von einem MODE 2 Pixel bleibt leider, aber mit dem Ergebnis kann man sehr gut leben.
Der Plus hat hier einen ASIC Bug, der leider nicht erlaubt, halbe Pixel zu scrollen.
Bedeutet:
In MODE 1 *muss* man zwei MODE 2 Pixel scrollen, in MODE 0 dann sogar vier MODE 2 Pixel