|
|
DataMuseum.dkPresents historical artifacts from the history of: MIKADOS |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about MIKADOS Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 7584 (0x1da0)
Notes: Mikados TextFile, Mikados_K
Names: »PRINX«
└─⟦378be2382⟧ Bits:30005272 Diverse hjælpeprogrammer: L, L1, L2, A, A1, A2, LINK, ASM, PRINX, WBACK
└─⟦this⟧ »PRINX«
;**********************************************************************
;
; MODUL PRINX:
;
; SUBDRIVER TIL SERIELLE X-ON, X-OFF STYREDE PRINTERE
; AA-10.06.1982
;
; COPYRIGHT (C) 1981 BY DANSK DATA ELEKTRONIK APS
;
; FULD REENTRANT KODE
;
;**********************************************************************
BRANCH ; SUBDRIVERNE PLACERES I GRENEN (MBANK)
COND
SYMB
PRINK
;
PRINX::
;
;****************************************************************************
; SUBDRIVER FOR SERIELLE X-ON,X-OFF PRINTERE
;****************************************************************************
;
;AT ENTRY: -> PRINTBUFFER ON STACK
PXXIN:: ; BUFFERLENGTH IN C
IF PXX
POP H
MOV A,M
CPI '<'
JNZ UDPR1 ;JUMP IF NO COMMANDS
CMLOP:
INX H ;IGNORE COMMANDS
DCR C
MOV A,M
CPI '>'
JNZ CMLOP
INX H
DCR C
UDPR1:
CALL PRNT ;PRINT
;TERMINATE WITH LF
LXI H,PRBUF
CALL GETRN
MVI M,LF
MVI C,1 ;BUFFERLENGTH
CALL PRNT
JMP FEJL0 ;EXIT
;****************************************************************************
; PRINT ROUTINE
;****************************************************************************
;
PRNT: ;C=BUFFERLENGTH, HL->BUFFERSTART
XCHG
LXI H,PBUFA
CALL PUTX ;STORE BUFFERADDRESS FOR INTERRUPT ROUTINE
XCHG
MVI B,0 ;BC:=BUFFERLENGTH
DCR C
DAD B ;HL->BUFFER END
INR C
RZ ;RETURN ON EMPTY BUFFER
MVI A,' '
PTSNÆ: ;SKIP TRAILING BLANKS
CMP M
JNZ PTSLU
DCX H
DCR C
RZ ;RETURN ON EMPTY BUFFER
JMP PTSNÆ
PTSLU: ;C=BUFFERLENGTH
LXI H,PBUFL
CALL GETRN
MOV M,C ;STORE BUFFERLENGTH FOR INTERRUPTROUTINE
CALL FÅINHØ ;GET MESSAGE FROM POOL - ANSWER SEMAPHORE = AUX. SEM.
PUSH D ;STACK -> BYTE -2
PUSH H ;STACK -> BYTE 2
LXI H,PMESG
CALL PUTX ;STORE MESSAGE ADDRESS FOR INTERRUPTROUTINE
POP H ;HL->BYTE 2
LXI D,#6000 ;WAIT FOR APP. 1 MINUTE *************
MOV M,E
INX H
MOV M,D
INX H
MVI M,1 ;STATUS:=1
CALL PIDENT ;REPORT PRINTER ACTIVE - A:=PRINTER NUMBER
POP D ;CLEAR STACK
RNZ ;UNKNOWN PRINTER
PUSH D
MOV B,A ;B:=PR. NUMBER
DI
LDA PINST
ORA B
STA PINST
MVI A,15
CALL POUTI ;OPEN TRANSMITTER AND RECEIVER
IF NOT+SPC1!PFLSE
LDA IMASK ;GIV PRINTEREN LOV TIL AT AFBRYDE
ORI 40 ;PÅ NIVEAU 60
STA IMASK
OUT INTRP
ENDIF
IF NOT+PFLSE&SPC1
RIM ;READ INTERRUPT MASK
ANI 6 ;TILLAD AFBRYDELSER PÅ NIVEAU 5.5 (BIT 0 = 0)
ORI 8
SIM ;SET INTERRUPT MASK
ENDIF
EI
LXI B,SLEEP ;SEND MESSAGE TO CLOCK
POP H
CALL SENDØ
PTSLU2:
CALL VENTH ;WAIT FOR MESSAGE FROM CLOCK
;DE->BYTE 0, HL->BYTE -2
DI
PUSH H
LXI D,6
DAD D ;HL->STATUS BYTE (4)
MOV A,M ;A:=STATUS
ORA A
POP H
PUSH PSW
LXI B,POOL ;RETURN MESSAGE
CALL SND2
POP PSW
JNZ PFMEX ;PRINTING DID NOT SUCCEED
EI ;PRINTING SUCCEEDED
LXI H,PFEJL
CALL GETRN
MOV A,M
ORA A
RZ ;NO ERROR MESSAGE TO ERASE
MVI M,0
LXI B,SLTLN ;ERASE ERROR MESSAGE
JMP FJLSK
PFMEX: ;WRITE ERROR MESSAGE
MVI A,10 ;DISABLE TRANSMITTER AND RECEIVER
CALL POUTI
EI ;YOU CAN ENABLE SINCE THIS PRINTER IS DEAD !!
;SEND NEW MESSAGE TO THE CLOCK
CALL FÅINHØ ;GET MESSAGE FROM POOL - ANSWER SEMAPHORE = AUX. SEM.
PUSH D ;STACK -> BYTE -2
PUSH H ;STACK -> BYTE 2
LXI H,PMESG
CALL PUTX ;STORE MESSAGE ADDRESS FOR INTERRUPTROUTINE
POP H ;HL->BYTE 2
LXI D,#6000 ;WAIT FOR 60 SEC *************************
MOV M,E
INX H
MOV M,D
INX H
MVI M,1 ;STATUS:=1
LXI B,SLEEP
POP H
CALL SENDØ
MVI A,14 ;ENABLE RECEIVER
CALL POUTI
LXI H,PFEJL
CALL GETRN
MOV A,M ; SE OM DER VAR EN FEJL OGSÅ SIDST
ORA A
JNZ PTSLU2 ; PRØV IGEN UDEN FEJLUDSKRIFT
MVI M,1 ; HUSK AT DER ER EN SKRIVERFEJL
LXI B,FJLMP ; BC->FEJLMEDDELELSE
CALL FJLSK ;
JMP PTSLU2
END