Hello,
I want to display 2 pictures of maximum resolution (384x272 mode 1) and do a vertical scrolling to display the entire picture, so using the entire 64K of the video memory.
My code is placed in bank 7 at address #C000 (with out #7F00,#C1).
I do a rupture every line by setting CRTC reg4 to 0, and re-adressing vram for each line.
My code is calculated to run at 19986 µs for each frame.
By the way, the first picture is stored at address #0200, and the second at address #8000
But this seems to work only with CRTC type 0...
Any way to make this code running on all crtc ?
Here is my code :
ORG #C000,#4000
DI
LD BC,#7FC1
OUT (C),C
LD SP,#200
JP Start
Start:
LD B,#F5
Sync:
IN A,(C)
RRA
JR NC,Sync
LD HL,#C9FB
LD (#38),HL
EI
HALT
HALT
LD BC,#BC01
OUT (C),C
LD BC,#BD30
OUT (C),C
LD BC,#BC02
OUT (C),C
LD BC,#BD32
OUT (C),C
LD BC,#BC04
OUT (C),C
LD BC,#BD00
OUT (C),C
LD IY,TabActions
HALT
DI
;
; Boucle principale du programme
;
Prog:
LD B,10+4
Loop1:
CALL WaitLigne
DJNZ Loop1
LD A,39
Loop2:
DEC A
JR NZ,Loop2
LD BC,#BC07
OUT (C),C
LD BC,#BD00
OUT (C),C
LD B,21-4
Loop3:
CALL WaitLigne
DJNZ Loop3
CALL Ordonanceur
LD BC,#BC07
OUT (C),C
LD BC,#BDFF
OUT (C),C
LD E,34
StartRupt:
LD IX,AdrEcr
BclLigne:
CALL SetLigne
DEC E
JR NZ,BclLigne
JP Prog
WaitLigne:
LD A,12
WaitLigne1:
DEC A
JR NZ,WaitLigne1
ADD HL,BC ; = 3 Nops
RET
SetLigne:
LD BC,#BC0C
OUT (C),C
LD A,(IX+1)
INC B
OUT (C),A
DEC B
INC C
OUT (C),C
LD A,(IX+0)
INC B
OUT (C),A
INC IX
INC IX
LD A,#72
SetLigneWait:
DEC A
JR NZ,SetLigneWait
NOP
RET
Ordonanceur:
LD A,(IY+0)
AND A
JR NZ,Ordonanceur2
LD IY,RestartActions
LD A,(IY+0)
Ordonanceur3:
LD C,A
LD B,0
LD HL,CodeAction
ADD HL,BC
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
NOP
JP (HL)
Ordonanceur2:
LD B,(IY+2)
JR Ordonanceur3
Wait3:
LD A,106
Wait3_1:
DEC A
JR NZ,Wait3_1
Wait3_2:
LD A,0
INC A
CP 3
JR C,Wait3_4
XOR A
INC IY
Wait3_3:
LD (Wait3_2+1),A
RET
Wait3_4:
JR Wait3_3
Wait48:
LD A,106
Wait48_1:
DEC A
JR NZ,Wait48_1
Wait48_2:
LD A,0
INC A
CP 48
JR C,Wait48_4
XOR A
INC IY
Wait48_3:
LD (Wait48_2+1),A
RET
Wait48_4:
JR Wait48_3
ScrollUp:
LD HL,(StartRupt+2)
INC HL
INC HL
LD (StartRupt+2),HL
LD A,#69
ScrollUpWait:
DEC A
JR NZ,ScrollUpWait
INC HL ; 2 Nops
INC IY
RET
ScrollUpUp:
LD HL,(StartRupt+2)
LD BC,4
ADD HL,BC
LD (StartRupt+2),HL
LD A,#69
ScrollUpUpWait:
DEC A
JR NZ,ScrollUpUpWait
INC IY
RET
ScrollDn:
LD HL,(StartRupt+2) ; 5 Nops
DEC HL ; 2 Nops
DEC HL ; 2 Nops
LD (StartRupt+2),HL ; 5 Nops
LD A,#69
ScrollDnWait:
DEC A
JR NZ,ScrollDnWait
INC HL ; 2 Nops
INC IY
RET
ScrollDnDn:
LD HL,(StartRupt+2) ; 5 Nops
LD BC,-4 ; 3 Nops
ADD HL,BC ; 3 Nops
LD (StartRupt+2),HL ; 5 Nops
LD A,#69
ScrollDnDnWait:
DEC A
JR NZ,ScrollDnDnWait
INC IY
RET
ActWait3 EQU 0
ActWait48 EQU 2
ActScrUp EQU 4
ActScrDn EQU 6
ActScrUpUp EQU 8
ActScrDnDn EQU 10
; Relations entre Numéro action et fonction action
CodeAction
DW Wait3 ; Normalement pas d'action 0
DW Wait48 ; Action 1
DW ScrollUp ; Action 2
DW ScrollDn ; Action 3
DW ScrollUpUp
DW ScrollDnDn
TabActions:
DB ActWait48
RestartActions:
DB ActScrUpUp,ActScrUpUp,ActScrUpUp,ActScrUpUp
DB ActScrUpUp,ActScrUpUp,ActScrUpUp,ActScrUpUp
DB ActScrUpUp,ActScrUpUp,ActScrUpUp,ActScrUpUp
DB ActScrUp,ActScrUp,ActScrUp,ActScrUp
DB ActScrUp,ActScrUp,ActScrUp,ActScrUp
DB ActScrUp
DB ActScrUp
DB ActWait48
DB ActScrDnDn,ActScrDnDn,ActScrDnDn,ActScrDnDn
DB ActScrDnDn,ActScrDnDn,ActScrDnDn,ActScrDnDn
DB ActScrDnDn,ActScrDnDn,ActScrDnDn,ActScrDnDn
DB ActScrDn,ActScrDn,ActScrDn,ActScrDn
DB ActScrDn,ActScrDn,ActScrDn,ActScrDn
DB ActScrDn
DB ActScrDn
DB 0 ; Fin des actions
AdrEcr:
DW #0D00, #0D30, #0D60, #0D90, #0DC0, #0DF0, #0E20, #0E50
DW #0E80, #0EB0, #0EE0, #0F10, #0F40, #0F70, #0FA0, #0FD0
DW #1000, #1030, #1060, #1090, #10C0, #10F0, #1120, #1150
DW #1180, #11B0, #11E0, #1210, #1240, #1270, #12A0, #12D0
DW #1300, #1330
DW #2D00, #2D30, #2D60, #2D90, #2DC0, #2DF0, #2E20, #2E50
DW #2E80, #2EB0, #2EE0, #2F10, #2F40, #2F70, #2FA0, #2FD0
DW #3000, #3030, #3060, #3090, #30C0, #30F0, #3120, #3150
DW #3180, #31B0, #31E0, #3210, #3240, #3270, #32A0, #32D0
DW #3300, #3330