PLOT16 ASM ;PLOT16.ASM f}r XY4140
;********************
;
;PLOTTER-TREIBER V1.D
;
;haftmann#software AD
;
;********************
;Programmadresse
BEGIN EQU 7000H;ROM-f{hig
;Arbeitszellenadresse
WS EQU 0 ;NICHT in IRM legen!
;Vereinbarungen
CTCStw EQU 0A7H ;hier Zeitgeber VT256
CTC EQU 08CH ;hier System-CTC0
PIO EQU 091H ;M021-PIO B (JOY+CEN)
Prol EQU 7F7FH;hier CAOS-Prolog
OS EQU 0F003H ;PV I
NULL EQU 0
STRUKB EQU 0FFH ;Modulstrukturbyte
;Arbeitszellen
;...mit Default
POSX EQU WS+0 ;X-Position
POSY EQU WS+2 ;Y-Position
MAXSOP EQU WS+4 ;MaxSpeed ohne Stift
MAXS EQU WS+5 ; " mit Stift
PANF EQU WS+6 ;Pufferanfang
PEND EQU WS+8 ;Pufferende
;...ohne Default
ZPOSX EQU WS+10;X-Zielposition
ZPOSY EQU WS+12;Y-Zielposition
PENNR EQU WS+14;Stift-Nr (0=kein Pen)
STATUS EQU WS+15;BUSY-Status 0=ready
DIRX EQU WS+16;X-Richtung (1,0,-1)
DIRY EQU WS+18;Y-Richtung (1,0,-1)
COUNT EQU WS+20;Punktez{hler
AKTSPD EQU WS+22;AktSpeed
MASTER EQU WS+23;Master-Flag (>0..Y)
ANSTIEG EQU WS+24;f}r Gerade
SLAVE EQU WS+26;zum Aufaddieren
MAXSPD EQU WS+28;MaxSpeed
PFST EQU WS+30;Pufferf}llstand
LASTPEN EQU WS+32;Letzte Stiftfarbe
WSE EQU WS+33;Workspace-Ende
ORG BEGIN
;Sprungtabelle f}r BASIC
JP BINIT
JP BCURSOR
JP LINE
JP PLTOT
JP HPGLI
;(Kanal #1 ge|ffnet)
;Inittabelle
INIEA DEFB 3 ;Kan{le
DEFB PIO
DEFB 1
DEFB 7FH
DEFB PIO+2
DEFB 4
DEFB 0FH ;Byte-Ausgabe
DEFB 0FFH ;Bit-E/A
DEFB 20H ;Bit 5=IN
DEFB 3 ;DI
DEFB CTC
DEFB 2
DEFB 3
DEFB 3 ;doppelt
SPDTAB ;Geschwindigkeitstabelle
DEFB 190
DEFB 120
DEFB 70
DEFB 46
DEFB 33
DEFB 26
DEFB 21
DEFB 17
DEFB 13
DEFB 11
DEFB 9
DEFB 8
DEFB 7
SPDTABE DEFB 6
;Defaultbelegung Workspace
DEFAULT DEFW NULL
DEFW NULL
DEFB SPDTABE-SPDTAB
DEFB SPDTABE-SPDTAB
DEFW PGME ;Pufferanf
DEFW 7800H ;Pufferende
DEFAULE
;Tabelle Zuordnung Taste-Routine
;f}r CURSOR (Aufbau: Byte/Adresse)
TASTT DEFB 8
DEFW CUL
DEFB 9
DEFW CUR
DEFB 10
DEFW CUD
DEFB 11
DEFW CUU
DEFB 11H
DEFW SCUU
DEFB 12H
DEFW SCUD
DEFB 18H
DEFW SCUR
DEFB 19H
DEFW SCUL
DEFB 'C'
DEFW CHECK
DEFB 'H'
DEFW PENUP
DEFB 'S'
DEFW PDOWN
DEFB '0'-20H
DEFW SNULL
DEFB 'I'
DEFW INIT
DEFB 'T'
DEFW PLTOT
DEFB 3
DEFW ENDCRLF
DEFB 0DH
DEFW ENDCRLF
DEFB 'R'
DEFW SRAND
NOP ;Abschlu~byte
;Programme
BINIT ;mit IRM-Switch
CALL 0F018H
CALL INIT
CALL CHECK
CALL SRAND
CLOS CALL 0F01BH
RET
BCURSOR CALL 0F018H
CALL CURSOR
JR CLOS
INIT ;IO-Modul suchen und einschalt.
LD BC,680H
INI1 INC B
JR Z,NGEF
IN A,(C)
CP STRUKB
JR NZ,INI1
LD A,1
OUT (C),A
LD H,0B8H
LD L,B
LD M,A
NGEF DI
LD HL,ISRCTC
LD (IX-8),L
LD (IX-7),H
EI
LD HL,DEFAULT
LD DE,WS
LD BC,DEFAULE-DEFAULT
LDIR ;WS-Grundbel.kopieren
LD HL,INIEA
LD D,M ;Anzahl
INC HL
CALL OS
DEFB 44H ;INIME
LD HL,(PANF)
LD (PFST),HL
XOR A
LD (STATUS),A
PUSH AF
JP INIT1
PLTOT ;Plotter hard-u. softwarem{~ig
;ausschalten
LD A,3
OUT CTC
LD A,4FH;Eingabe:hochohmig
OUT PIO+2
RET
DSTEPX ;DirectionStep
LD DE,(DIRX)
STEPX ;UP Tue 1 Schritt in X-Richtung
;DE=1 vorw{rts
;DE=-1 r}ckw{rts
;(DE=0 keinen Schritt)
;VR:-
PUSH AF
PUSH HL
LD HL,(POSX)
ADD HL,DE
LD (POSX),HL
POP HL
LD A,E
OR A
JR Z,STXN
INC A
JR Z,STXD
;Step X up
IN A,PIO
AND 0C0H
OR 1
OUT PIO
OR 4
OUT PIO
JR STXN
;Step X down
STXD IN A,PIO
AND 0C0H
OUT PIO
OR 4
OUT PIO
STXN POP AF
RET
DSTEPY LD DE,(DIRY)
STEPY ;UP Tue 1 Schritt in Y-Richtung
;Kommentare analog
PUSH AF
PUSH HL
LD HL,(POSY)
ADD HL,DE
LD (POSY),HL
POP HL
LD A,E
OR A
JR Z,STYN
INC A
JR Z,STYD
;Step Y up
IN A,PIO
AND 0C0H
OR 2
OUT PIO
OR 4
OUT PIO
JR STYN
STYD ;Step Y down
IN A,PIO
AND 0C0H
OR 3
OUT PIO
OR 4
OUT PIO
STYN POP AF
RET
DEFW Prol
DEFM 'PLCURS'
DEFB 1
CURSOR CALL OS
DEFB 23H
DEFW 0A0CH ;CLS
DEFM 'Steuerung des Plotters mit '
DEFM 'Cursortasten bzw. mit '
DEFM 'Shift+Cursortasten.'
DEFW 0D0AH
DEFM ' 0 Nullsetzen'
DEFW 0D0AH
DEFM ' C Checkup'
DEFW 0D0AH
DEFM ' I Initialisierung'
DEFW 0D0AH
DEFM ' T Totlegen'
DEFW 0D0AH
DEFM ' H Stift heben'
DEFW 0D0AH
DEFM ' S Stift senken'
DEFW 0D0AH
DEFM ' R R{nder absuchen'
DEFW 0D0AH
DEFM 'BRK Abbruch'
DEFW 0D0AH
NOP
PUSH AF
PUSH HL
PUSH DE
PUSH BC
CALL OS
DEFM '#Koordinaten (X,Y): '
NOP
PWRDOWN
SCHL LD HL,(POSX)
LD DE,(POSY)
LD BC,(0B7A0H)
CALL OS ;Pos. ausgeben
DEFB 1BH
LD (0B7A0H),BC
;
CALL OS
DEFB 16H
RES 5,A
LD C,A
LD HL,SCHL
PUSH HL ;R}ckkehradresse
LD HL,TASTT-2
SUCH INC HL
INC HL
LD A,M
INC HL
OR A
RET Z ;falsche Taste
CP C
JR NZ,SUCH
LD A,M
INC HL
LD H,M
LD L,A
JP (HL)
SNULL LD HL,NULL
LD (POSX),HL
LD (POSY),HL
RET
SCUL SET 0,(IX+8)
CUL LD DE,-1
JP STEPX
SCUR SET 0,(IX+8)
CUR LD DE,1
JP STEPX
SCUD SET 0,(IX+8)
CUD LD DE,-1
JP STEPY
SCUU SET 0,(IX+8)
CUU LD DE,1
JP STEPY
CHECK PUSH AF
CHEK1 IN A,PIO
RES 6,A
OUT PIO
SET 6,A
OUT PIO
IN A,PIO
BIT 5,A
JR Z,XLTRAG
CALL CUL
LD B,0
CHEK2 DJNZ CHEK2
JR CHEK1
XLTRAG LD HL,(POSX)
LD (ZPOSX),HL
POP AF
RET
ENDCRLF CALL OS
DEFB 2CH
POP HL;Return-Ebene }berjp
POP BC
POP DE
POP HL
POP AF
RET
PENUP PUSH AF
IN A,PIO
RES 7,A
OUT PIO
INIT1 LD A,(MAXSOP)
JR MAXSET
PDOWN PUSH AF
IN A,PIO
SET 7,A
OUT PIO
LD A,(MAXS)
MAXSET LD (MAXSPD),A
POP AF
RET
SRAND ;Suche Rand
PUSH AF
SRAN2 IN A,PIO
RES 6,A
OUT PIO
SET 6,A
OUT PIO
IN A,PIO
BIT 5,A
JR NZ,XRTRAG
CALL CUR
LD B,0 ;warten
SRAN1 DJNZ SRAN1
JR SRAN2
XRTRAG LD HL,(POSX)
LD (ZPOSY),HL
JR CHEK1
COMP ;Vergleiche HL,DE
PUSH HL
OR A
SBC HL,DE
POP HL
RET
DRAWTO1 ;HL=X-,DE=Y-Ziel
PUSH DE
LD DE,(POSX)
CALL COMP ;Vorzeichen?
LD BC,1
JP P,VORX
DEC C
DEC BC
EX DE,HL
VORX
LD (DIRX),BC
OR A
SBC HL,DE ;vzl
EX (SP),HL ;altes DE
LD DE,(POSY)
CALL COMP
LD BC,1
JP P,VORY
DEC C
DEC BC
EX DE,HL
VORY
LD (DIRY),BC
OR A
SBC HL,DE ;vzl
;HL=Y-Steps
POP DE ;x-Steps
PUSH HL
ADC HL,DE
POP HL
RET Z ;Null Punkte
EX DE,HL;DE=Steps in Y-Dir
CALL COMP
;Cy=1:DE>HL:Y=Master,(MASTER)=FF
;Z =1:DE=HL:Anstieg=FFFF
JR Z,W45
SBC A ;0 od.FF
LD (MASTER),A
JR C,MASTY
EX DE,HL
MASTY
LD (COUNT),DE
CALL DIVI ;IY:=HL/DE
PUSH IY
POP HL
JR NW45
W45
LD (COUNT),HL
LD HL,0FFFFH
NW45
LD (ANSTIEG),HL
SRL H
RR L
LD (SLAVE),HL
XOR A
INC A
RET ;PA:Z=1:keine Linie
DIVI ;16bit-Division IY:=HL/DE,HL<DE
LD B,16
DIV1 ADD HL,HL
JR C,DIV3
CALL COMP
JR NC,DIV3
ADD IY,IY
JR DIV2
DIV3 OR A
SBC HL,DE
ADD IY,IY
INC IY
DIV2 DJNZ DIV1
RET
ISRH EI
RETI
;***********************
ISRCTC
PUSH AF
LD A,3
OUT CTC ;STOP
CALL ISRH
PUSH HL
PUSH DE
PUSH BC
LD HL,(COUNT)
LD A,H
OR L
JR Z,DRAWRDY
DEC HL
LD (COUNT),HL
LD A,CTCStw
OUT CTC
LD A,(MAXSPD)
LD D,A
LD A,(AKTSPD)
CP D ;A>D?
JR NC,NINC ;ja
INC A
NINC
INC H
DEC H ;H=0?
JR NZ,NLOW
CP L ;A>L?
JR C,NLOW
LD A,L ;IF A>L THEN A:=L
NLOW
LD (AKTSPD),A
LD D,0
LD E,A
LD HL,SPDTAB
ADD HL,DE
LD A,M
OUT CTC
LD A,(MASTER)
OR A
CALL Z,DSTEPX
CALL NZ,DSTEPY
LD HL,(SLAVE)
LD DE,(ANSTIEG)
ADD HL,DE
LD (SLAVE),HL
JR NC,NSLAV
OR A
CALL Z,DSTEPY
CALL NZ,DSTEPX
NSLAV
POP BC
POP DE
POP HL
POP AF
RET
DRAWRDY LD HL,(PANF)
LD DE,(PFST)
CALL COMP
JR Z,BRKCTC
LD C,M
INC HL
LD B,M ;BC=ZPOSX
INC HL
LD E,M
INC HL
LD D,M ;DE=ZPOSY
INC HL
LD A,M ;A=PENNR
INC HL
PUSH DE
PUSH BC
EX DE,HL
LD HL,(PFST);L{nge Umladen
OR A
SBC HL,DE
LD B,H
LD C,L
LD HL,(PANF)
EX DE,HL
JR Z,NLDIR
LDIR
NLDIR
LD (PFST),DE
POP HL
POP DE
PUSH AF
DI
LD A,CTCStw
OUT CTC
LD A,256
OUT CTC
EI
POP AF
DEC A
CALL Z,PDOWN
CALL NZ,PENUP
PUSH IY
CALL DRAWTO1
POP IY
JP Z,DRAWRDY
JR NSLAV
BRKCTC XOR A
LD (STATUS),A
CALL PENUP
JR NSLAV
;Ende ISRCTC
;************************
DEFW Prol
DEFM 'PLDRAWTO'
DEFB 1
DRAWTO LD (ZPOSX),HL
LD (ZPOSY),DE
LD A,C
LD (PENNR),A
LINE ;PE:ZPOSX,ZPOSY,PENNR
PUSH AF
PUSH HL
PUSH DE
PUSH BC
FI1 LD DE,(PFST);Platz testen
INC DE ;5 Bytes
INC DE
INC DE
INC DE
INC DE
LD HL,(PEND)
CALL COMP
JR C,FI1 ;warten
;
DI
LD DE,(PFST)
LD HL,ZPOSX
LD BC,5
LDIR
LD (PFST),DE
LD A,(STATUS)
OR A
JR NZ,NPROG
LD A,CTCStw;CTC anwerfen
OUT CTC
LD A,255
OUT CTC
LD (STATUS),A
LD HL,0
LD (COUNT),HL
NPROG
EI
POP BC
POP DE
POP HL
POP AF
RET
DEFW Prol
DEFM 'PLTEST'
DEFB 1
LD HL,400H
LD DE,20H
LD C,1
CALL DRAWTO
LD HL,480H
LD DE,0FF00H
LD C,1
CALL DRAWTO
LD HL,380H
LD DE,0FD00H
LD C,1
CALL DRAWTO
LD HL,20H
LD DE,0FD00H
LD C,1
CALL DRAWTO
LD HL,0
LD DE,0
LD C,0
CALL DRAWTO
CALL OS
DEFB 23H
DEFB 0BH
NOP
RET
HPGLI ;HPGL-Interpreter (DISK!)
call inchr
loopi
call deli1
and 5fh
cp 'S'
jr nz,cmd1
call inchr
and 5fh
cp 'P'
JR nz,cmdx
call inval
LD H,A
LD A,L
OR A
RET Z ;ENDE
LD A,(LASTPEN)
OR A
JR Z,CMDX1
CP L
JR Z,CMDX1
LD A,L
LD (LASTPEN),A
call newpen
jr cmdx1
CMD1
cp 'P'
jr nz,cmdx
call inchr
and 5fh
cp 'U'
jr nz,cmd2
xor a
pnnrx ld (pennr),a
jr cmdY
cmd2 cp 'D'
jr nz,cmd3
ld a,1
jr pnnrx
cmd3 cp 'A'
jr nz,cmdx
CMDY
call inchr
CP ','
JR Z,CMDY
call deli1
call ntest
jr c,cmdx
call inval0
SRL H
RR L
SRL H
RR L
ld (zposx),hl
call inval
SRL H
RR L
SRL H
RR L
ld (zposy),hl
call line
call deli1
cp ','
jr z,cmdy
CMDX LD H,A
CMDX1 LD A,H
call semik
LD D,A
LD E,2AH
CALL 0F015H
LD A,D
jp nc,loopi
RET
;delim ;hinter Wei~raum fahren
; cp 21h
; jr nc,deli1
; call inchr
; jr delim
deli1 cp 21h
ret nc
call inchr
jr deli1
semik ;hinter Semikolon fahren
CP ';'
jr Z,SEMI1
call inchr
jr semik
semi1 CP ';'
ret NZ
call inchr
jr semi1
inchr ;Zeicheneingabe von #1
push hl
push de
ld de,37h
npx call 0f015h
pop de
pop hl
ret
ntest ;Test A auf Ziffer
;und ggf. numerisch wandeln
cp 30h
ret c
cp 3ah
ccf
ret c
sub 30h
ret
inval ;dez. Wert einlesen
invl1 call inchr
call ntest
jr c,invl1
inval0 ld hl,0
invl2 add hl,hl
ld d,h
ld e,l
add hl,hl
add hl,hl
add hl,de
ld d,0
ld e,a
add hl,de
call inchr
call ntest
jr nc,invl2
ret
newpen ;Neuer Stift
push hl
push de
ld hl,msgnp
push af
ld e,45h ;zkout
call 0f015h
ld e,1ch
pop af
call 0f015h ;ahex
ld e,16h
call 0f015h ;Tastatur
ld e,2ch ;Newline
jr npx
msgnp db 'Neuer Stift #',0
PGME
Éu
PGME:»u
MSGNP:¡u
NEWPEN:Žu
INVL2:‹u
INVAL0:ƒu
INVL1:ƒu
INVAL:yu
NTEST: ;Newline
jr npx
msgnp db 'Neuer Stift #',0
PGME
Éu
PGME:»u
MSGNP:¡u
NEWPEN:Žu
INVL2:‹u
INVAL0:ƒu
INVL1:ƒu
INVAL:yu
NTEST:
Detected encoding: ANSI (CP1252) | 4
|
|