home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG001.ARK
/
DIABLO.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
4KB
|
134 lines
;THIS IS A DRIVER TO MAKE A DIABLO/QUME PRINTER
;SIMULATE A SERIAL PRINTER. IT WAS CODED FOR
;A SET OF PARALLEL PORTS STARTING AT 20H, AND
;USES 10 PITCH CARRIAGE MOVES. THE ROUTINE
;ACCUMULATES CARRIAGE POSITION TO PERMIT CR, BUT
;A TAB MOD/8 ROUTINE WAS NOT INCORPORATED, AS THIS
;ALREADY EXISTED IN THE MAIN PRINT PROGRAM BY
;JEFF KRAVITZ.
;BASED ON A ORIGINAL BY DON IMBIMBO, MODIFIED
;BY A.R.G 6/77
;************************************************************
;(HINT - A.R.G)
;ROUTINE CAN BE CONSIDERABLY SPEEDED IF A SUBROUTINE
;WERE TO BE ADDED WHICH ACCUMULATES SPACES (AND LINE FEEDS)
;UNTIL A PRINTING CHARACTER WAS REQUIRED, AND THEN MOTION(S)
;FOR THE TOTAL DISPLACEMENT(S) CALLED.
;************************************************************
;MODIFIED FOR ROM AT 0E120H
;WITH 2 BYTES RAM NEEDED AT 47H & 48H
;9/28/77 - A.R.G
;
;QUME OR DIABLO TTY SIMULATOR.
;
;FOR NON-STANDARD
;MOVES, ENTER WITH BC EQUAL TO DISPLACEMENT IN
;APPROPRIATE LSB VALUE (SEE EQU'S BELOW). THEN
;CALL THE 'NON-STANDARD' MOVE ENTRY POINT.
;FORMAT FOR CALL IS AS FOLLOWS:
;CARRIAGE MOTION:
;D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0
;NU DIR. /--------------------DATA--------------------------/
;
;PRINT DATA:
;D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0
;NU NU NU NU NU NU /----------ASCII DATA----------/
;
;PAPER FEED:
;D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0
;NU NU DIR. /--------------------DATA---------------------/
;
;************************************************************
;EQUATES
STDSP EQU 12 ;IN 1/120 INCH
STDLF EQU 8 ;IN 1/48 INCH
CR EQU 0DH
LF EQU 0AH
SPACE EQU 20H
DEL EQU 7FH
LSB EQU 20H ;OUTPUT PORT # FOR LEAST SIGNIFICANT BITS OF DATA
MSB EQU 21H ;OUTPUT PORT # FOR MOST SIGNIFICANT BITS OF DATA
PSTAT EQU 20H ;INPUT PORT # FOR PRINTER STATUS
CHST EQU 22H ;OUTPUT PORT # FOR CHARACTER STROBE
CMST EQU 23H ;OUPUT PORT # FOR CARRIAGE MOTION STROBE
PFST EQU 24H ;OUTPUT PORT # FOR PAPER FEED STROBE
RESET EQU 25H ;OUTPUT PORT # FOR PRINTER RESET
CMACC EQU 47H ;USE 47H & 48H FOR RAM SPACE
;************************************************************
ORG 0E120H
;ROUTINE:
TTY:
PUSH PSW
PUSH B
PUSH H
MOV A,C ;GET CHARACTER FROM CPM HAND-OFF
CPI DEL ;DELETE?
JZ PDONE ;DISCARD IT
CPI LF ;TRAP LF
JZ STDPF
CPI CR ;TRAP CR
JZ PCRET
CPI SPACE ;TRAP SPACES
JZ STDCM
JC PDONE ;SOME OTHER CONTROL CHR. ?
;FOUND A CHARACTER
RLC
OUT LSB
PT1: IN PSTAT ;PRINTER READY?
ANI 1
JNZ PT1
OUT CHST ;YES. PRINT IT
JMP STDCM ;MOVE CARRIAGE ONE SPACE
;
STDCM: LXI B,STDSP ;STANDARD MOVE VALUE
;NON-STANDARD MOTION ENTRY
OUT1: MOV A,C ;LOAD UP DATA PORTS
OUT LSB
MOV A,B
OUT MSB
PT2: IN PSTAT ;PRINTER READY?
ANI 2
JNZ PT2
OUT CMST ;YES. OUT CARRIAGE MOTION STROBE
LHLD CMACC ;GET PRIOR CARRIAGE POSITION
MOV A,B
ANI 8 ;MASK DIRECTION BIT
JNZ LEFT ;MOVE LEFT IF SET
DAD B ;ADD MOVE TO CMACC
JMP STORE
;
LEFT: MOV A,B ;THIS IS A 16 BIT
ANI 7 ;SUBTRACT FOR LEFT
CMA ;MOVE FROM CMACC
MOV B,A
MOV A,C
CMA
MOV C,A
INX B
DAD B
STORE: SHLD CMACC ;AFTER SUB, SAVE
;
PDONE: POP H
POP B
POP PSW
RET
STDPF: LXI B,STDLF
OUT2: MOV A,C
RLC ;MOVE LEFT FOR
OUT LSB ;PRINTER ONE BIT
MOV A,B
RAL
OUT MSB
PT3: IN PSTAT ;PRINTER READY?
ANI 4
JNZ PT3
OUT PFST ;YES, OUT STROBE
JMP PDONE
;
PCRET: LHLD CMACC ;GET POSITION
MOV C,L ;MOVE LOW BYTE IN C
MOV A,H ;HIGH BYTE IN A
ORI 8 ;SET BIT 3
MOV B,A ;PUT INTO B
JMP OUT1