;Z80 VERSION OF 2650 GRAPHICS PACKAGE
;TRANSLATED BY S. K. PHILLIPS JAN. 1980.
;
TITLE DG640 GRAPHICS FOR Z80
;
;
ORG 100H
;
PAGE EQU 0E8H ;VDU START LOCATION
;
JP START ;GO TO START
;
;EXTRACT OP CODE FROM I/P INFORMATION
;NB. I/P INFO. IN H&L
;H=OP CODE + Y COORD. L=X COORD.
;
GRAP: LD A,0C0H ;MASK WORD
AND H
LD (OPER),A ;SAVE OP CODE
;
;ENTER HERE TO BYPASS OP CODE
SADD: LD A,H
LD (Y),A ;SAVE Y ADDRESS
LD A,L
LD (X),A ;SAVE X ADDRESS
;
;EXTRACT ADDRESS OF BYTE CONTAINING THIS BIT
;
RR L
RL H
RL L
RL L
RR H
RR H
RR H
RR H
RR L
RR H
RR L
LD A,H
AND 03H ;MASK TO GET 2 BITS OF POINTER
OR PAGE ;PAGE=VDU ADDRESS
LD (PTR+1),A ;SAVE HIGH ORDER
LD A,L
LD (PTR),A ;SAVE LOW ORDER
;
;SET UP INDEX TO BIT WITHIN THIS BYTE
;
LD L,01H
LD A,H
AND 70H ;MASK TO GET INDEX
JR Z,ND-$
LOP: RL L
SUB 10H ;THIS DECREMENTS THE INDEX BY 1
JR NZ,LOP-$
ND: LD A,L ;L NOW =8 BIT REPRESENTATION OF
;3 BIT INDEX
LD (INDX),A ;STORE THE 8 BITS
;
;SET/CLEAR/INVERT/TEST BIT
;
MOP: LD HL,(PTR) ;HL POINTS TO BYTE ON SCREEN
LD B,(HL) ;GET CONTENTS OF BYTE ON SCREEN
LD A,(OPER) ;GET OPERAND
AND A ;SET FLAGS
JR Z,TEST-$ ;JMP IF 00
CP 80H ;SEE IF 'CLEAR' CODE
LD A,(INDX) ;GET IX BYTE
JP M,SET ;IF LT MUST BE SET=01B
JR Z,REST-$ ;IF EQ MUST BE CLEAR=10B
JP P,INVT ;IF GT MUST BE INVERT=11B
REST: AND B ;RESET
INVT: XOR B ;INVERT
STORE: LD (HL),A ;STORE NEW CONTENTS
RET
SET: OR B ;OR IN NEW BIT
JR STORE-$
TEST: AND B
RET ;WILL RETURN WITH ZERO FLAG SET
;IF TEST FOR BIT AT THIS POINT
;SHOWS THERE WAS NOTHING
;
;GRAPHICS INITIALISATION ROUTINE
;
INIT: LD HL,0E800H ;VDU ADDRESS
LOOP1: LD (HL),00 ;CLEAR SCREEN CODE
INC HL
BIT 2,H ;DETECTS EC00 HEX
JR Z,LOOP1-$
LOOP2: LD (HL),02 ;CODE FOR GRAPHICS
INC HL
BIT 4,H ;DETECTS F000 HEX
JR Z,LOOP2-$
LD A,1
LD (INDX),A ;INIT INDEX
LD A,0
LD (X),A
LD (Y),A
LD (PTR),A ;INIT X, Y & PTR
LD A,0E8H
LD (PTR+1),A ;INIT MSB OF POINTER
;
;PICTURE WRITER ROUTINE
;ENTER HERE
;
START: LD SP,6000H
IN: CALL FIN ;FLASH AND GET CHARACT IN A
CP 0EH ;SEE IF CTL-N
JR Z,INIT-$ ;IF SO INIT GRAPHICS
;
;TEST IF END
;
CP 0DH ;SEE IF CR
JP Z,0000 ;WARM BOOT
PUSH AF ;SAVE A
AND 07
LD E,A ;SAVE IN E LAST 3 BITS
;E=DIRECTION NUMBER
POP AF ;RESTORE A
AND 70H ;MASK TO GET SIGNIFICANT
;ASCII DIGITS
;
;WORK OUT OP CODE
;
CP 40H ;SEE IF PLAIN LETTER
JR NZ,W1-$
LD A,40H ;LOAD WRITE CODE=01B
JR SETBIT-$
W1: JP P,MOVE ;LOWER CASE LETTER
CLEAR: LD A,80H ;MUST HAVE BEEN CTL
;THEREFORE CLEAR=10B
JR SETBIT-$
MOVE: LD A,00 ;LOWER CASE THEREFORE MOVE
; MOVE=00B
SETBIT: LD (OPER),A ;STORE NEW OPERAND
;
;PERFORM OPERATION
;
CALL MOP ;DO OP AT PRESENT LOCATION
;
;INCREMENT X COORDINATE
;
LD IX,DATA ;POINT TO DATA
LD D,00 ;NB. DIRECTION NUM. IS IN REG E
ADD IX,DE ;POINT TO APPROPRIATE PLACE IN TABLE
LD A,(X) ;GET X COORD.
ADD A,(IX) ;ADD ENTRY FROM TABLE
LD L,A ;SAVE IN L
;
;INCREMENT Y COORDINATE
;
LD A,(Y) ;GET Y COORD.
INC IX
INC IX ;POINT TO Y DATA
SUB (IX) ;SUB BECAUSE PAGE UPSIDE DOWN
AND 3FH ;SET OP CODE TO 00
LD H,A ;SAVE IN H
;
;PERFORM OPERATION
;
CALL GRAP ;CURSOR MOVES TO NEW LOCATION
JR IN-$
;FLASH UNTIL INPUT
;
FIN: LD A,0C0H ;SET CODE FOR INVERT
LD (OPER),A
FLSH: CALL MOP ;DO IT
LD C,2 ;DELAY CONSTANT
CALL DO ;DO DELAY
F0: IN A,(7DH) ;GET STATUS
AND 02 ;CHECK FOR RX BUFF READY
JR Z,F1-$ ;JUMP IF NO I/P
IN A,(7CH) ;GET I/P
AND 7FH ;MASK PARITY
RET
F1: CALL MOP ;INVERT AGAIN
LD C,8H ;DELAY CONST.
CALL DO ;4 TIMES DELAY
JR FLSH-$
;
;DELAY
;
DO: PUSH BC
PUSH DE
D1: LD B,10H ;B,D LOOP GIVES .1 SECS.
D2: LD D,00
D3: DEC D
JR NZ,D3-$
DEC B
JR NZ,D2-$
DEC C
JR NZ,D1-$
POP DE
POP BC
RET
;
;
DATA: DEFB 0,1,1,1,0
DEFB 0FFH,0FFH,0FFH,0,1
OPER: DEFS 1
INDX: DEFS 1
X: DEFS 1
Y: DEFS 1
PTR: DEFS 2
;
;
END
�F#��h!Cs!�^#V�������� ���#���#:���:����^#V#��þ*�^#V�������>�%���#x�����'�8_ �#*��;�#ø�#���#����>�%����><7�����������������"���T6 *�}�� �^!T4�2
�G� Ͱ *hMͽG��:�����ͮ��+G�G�W� ��+G�U�!ͩ>�̀+�! � @ !�!BH @ @A �BH B! "�BHI$$�BI$BI �$�� �HI �D$��