Hello to all USER'S MSX of the World,
I ask help for handle routine assembler for PAINT from BASIC,
unfortunately this routine does not work, because there is an
error in this part:
;---- WORK AREA ---- COL .DS 1 BORD .DS 1 Q.TOP .DS 2 Q.BTM .DS 2 Q.BUF .DS Q.LENGTH <-------- ERROR in compiler from CHAOS ASSEMBLER 3!
Here under there is all the complete routine for PAINT as from BASIC:
; ------------------------------------------- ; AGsoftware MSX Z80 source file. ; ; Prog: PAINT in ASSEMBLER ; Code: AG. Italy ; Date: 14/02/2021 ; ; INCLUDE ROUTINE: PSET+POINT ; ; Coded in TeddyWareZ' Chaos Assembler 3 ; ; ------------------------------------------- .org $C000 - 7 .db $fe .dw startProgram,endProgram,startProgram startProgram: ; EXTERNAL ROUTINE PSET ; EXTERNAL ROUTINE POINT Q.LEGTH .EQU 256*2*2 MAX.Y .EQU 211 RDVDP .EQU $06 ; POINT and PSET ROUTINE WRVDP .EQU $07 ; POINT and PSET ROUTINE ; ---- PAINT MAIN ROUTINE ---- PAINT: CALL POINT CP D RET Z CALL INIT.Q LD (COL),DE CALL PUT.Q LD A,(COL) LD E,A XOR A ; LOG I-OP: PSET CALL PSET PAINT0: CALL GET.Q RET C INC H CALL NZ,PAINT.SUB DEC H JP Z,PAINT1 PAINT1: DEC L LD A,-1 CP L CALL NZ,PAINT.SUB INC L INC L LD A,MAX.Y CP L CALL NC,PAINT.SUB ; ---- CHECK POINT AND PSET ---- PAINT.SUB: CALL POINT LD D,A LD A,(BORD) CP D RET Z LD A,(COL) CP D RET Z LD E,A XOR A ;CALL PSET CALL PUT.Q RET ; ---- INIT Q.BUFFER POINTER ---- INIT.Q: PUSH HL LD HL,Q.BUF LD (Q.TOP),HL LD (Q.BTM),HL POP HL RET ; ---- PUT, POINT TO Q.BUF (X:H, Y:L) ---- PUT.Q: EX DE,HL LD HL,(Q.TOP) LD BC,Q.BUF+Q.LENGTH+1 OR A ; CLEAR CARRY PUSH HL SBC HL,BC POP HL JP C,PUT.Q1 LD HL,Q.BUF PUT.Q1: LD (HL),D INC HL LD (HL),E INC HL LD (Q.TOP),HL EX DE,HL RET ; ---- TAKE POINT DATA TO D,E ---- ; RETURNS: NC H:x, L:y ; C BUFFER EMPTY GET.Q: LD HL,(Q.BTM) LD BC,(Q.TOP) OR A SBC HL,BC JP NZ,GET.Q0 SCF RET GET.Q0: LD HL,(Q.BTM) LD BC,Q.BUF+Q.LENGTH+1 OR A PUSH HL SBC HL,BC POP HL JP C,GET.Q1 LD HL,Q.BUF GET.Q1: LD D,(HL) INC HL LD E,(HL) INC HL LD (Q.BTM),HL OR A EX DE,HL RET ; ---- PUBLIC PSET ---- PSET: DI PUSH AF CALL WAIT.VDP LD BC,(WRVDP) INC C LD A,36 OUT (C),A LD A,$80+17 OUT (C),A PUSH BC INC C INC C OUT (C),H OUT (C),A OUT (C),L OUT (C),A POP BC LD A,44 OUT (C),A LD A,$80+17 OUT (C),A INC C INC C OUT (C),E XOR A OUT (C),A LD E,01010000B POP AF OR E OUT (C),A EI RET ; ---- PUBLIC POINT ---- POINT: DI CALL WAIT.VDP LD A,(WRVDP) LD C,A INC C LD A,32 OUT (C),A LD A,$80+17 OUT (C),A INC C INC C XOR A OUT (C),H OUT (C),A OUT (C),L OUT (C),A DEC C DEC C OUT (C),A LD A,$80+45 OUT (C),A LD A,01000000B OUT (C),A LD A,$80+46 OUT (C),A CALL WAIT.VDP LD A,7 CALL GET.STATUS PUSH AF XOR A CALL GET.STATUS POP AF EI RET GET.STATUS: PUSH BC LD BC,(WRVDP) INC C OUT (C),A LD A,$8F OUT (C),A LD BC,(RDVDP) INC C IN A,(C) POP BC RET WAIT.VDP: LD A,2 CALL GET.STATUS AND 1 JP NZ,WAIT.VDP XOR A CALL GET.STATUS RET ;---- WORK AREA ---- COL .DS 1 BORD .DS 1 Q.TOP .DS 2 Q.BTM .DS 2 Q.BUF .DS Q.LENGTH endProgram: .end
I hope some of you can help me solve this little programming problem in assembler.
Thanks in advance
Best Regards
(^_^)
AG.
Для того, чтобы оставить комментарий, необходимо регистрация или !login