PAGE 66,132 TITLE** PROGRAMMA di GESTIONE di programmi ASSEMBLER tipo COM (marzo 2003) SUBTTL ** TUTORIAL ASSEMBLY -- www.giobe2000.it -- by ing. Giorgio OBER ;/---------------------------------------------------------------------------\ ;| NOME : Printer2.ASM | ;| AUTORE : Giorgio OBER | ;| VERSIONE : marzo 2003 | ;| DESCRIZIONE : Controllo di una Stampante a basso livello al fine di garan-| ;| tire la corretta stampa delle stringhe ASCII. | ;| | ;| Il programma consente la verifica delle possibili tipologie| ;| di stampa provando tutte le possibili combinazioni garantite| ;| da qualunque comune STAMPANTE ad aghi; il numero di caratte-| ;| ri per pollice pu• esser facilmente cambiato scegliendo uno| ;| dei due tipi, PICA o ELITE, ma anche combinando con essi la| ;| caratteristica di "CONDENSATO" o "ALLARGATO"; combinando| ;| tra loro queste opzioni si possono ottenute fino a sette| ;| diverse densit… di caratteri per riga: | ;| 160 CARATTERI per RIGA con ELITE CONDENSATO | ;| 137 CARATTERI per RIGA con PICA CONDENSATO | ;| 96 CARATTERI per RIGA con ELITE | ;| 80 CARATTERI per RIGA con PICA=ELITE CONDENSATO ALLARGATO| ;| 68 CARATTERI per RIGA con PICA CONDENSATO ALLARGATO | ;| 48 CARATTERI per RIGA con ELITE ALLARGATO | ;| 40 CARATTERI per RIGA con PICA ALLARGATO | ;| | ;| Ognuna di queste impostazioni Š poi disponibile con quattro| ;| gradazioni di nero: | ;| NORMALE, RIBATTUTO, GRASSETTO e GRASSETTO+RIBATTITURA. | ;| /----------\ -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | bisogna prima installare il Driver Configura_LPT1; scaricalo | ;| | | a: http://www.giobe2000.it/consigli/Scarica_VediLPT_XP.htm | ;| *----------* -------------------------------------------------------------| ;| | | Se si lavora con i Sistemi Operativi Win2000, Win NT o WinXP | ;| | NB !! | la SHELL DOS deve essere a "Pieno Schermo" (l'esecuzione in | ;| | | "finestra DOS" non produce effetto sulla Stampante) | ;| *----------* -------------------------------------------------------------| ;| | | In ogni caso PRIMA DI OGNI SESSIONE DOS Š necessario eseguire| ;| | NB !! | il programma Config_LPT1.EXE in ambiente Windows per attivare| ;| | | la visibilit… dei driver installati con Configura_LPT1 !!!!! | ;| \----------/ -------------------------------------------------------------| ;\---------------------------------------------------------------------------/ ; COSTANTI DEFINITE PER IL PROGRAMMA: Kdelay EQU 1 ;Costante di ritardo ESC_ EQU 27 CR EQU 0DH LF EQU 0AH PRNdato EQU 378H ;Registro dei DATI ( USCITA ) PRNstat EQU 379H ;Registro di STATO (INGRESSO) PRNcomd EQU 37AH ;Registro di CONTROLLO ( USCITA ) ; MACRO UTILIZZATE DAL PROGRAMMA: include c:\arch-lab\bin\GIOBE.MAC ; LIBRERIA UTILIZZATA DAL PROGRAMMA [opzione WinASM altrimenti non necessaria] includelib c:\arch-lab\bin\GIOBE.LIB ;PROCEDURE ESTERNE UTILIZZATE dal PROGRAMMA [NEAR, dalla LIBRERIA ~GIOBE.LIB~] EXTRN CambiaCol:NEAR EXTRN SET_cur:NEAR EXTRN VIA_cur:NEAR EXTRN RIP_cur:NEAR EXTRN KEYwait:NEAR EXTRN STAsp:NEAR EXTRN Acapo:NEAR EXTRN BIOScls:NEAR EXTRN BIOchr1:NEAR EXTRN BIObeep:NEAR EXTRN BIOSmsg:NEAR EXTRN Delay:NEAR EXTRN RAMcls:NEAR EXTRN RAMchr:NEAR EXTRN RAMcur:NEAR EXTRN RAMmes:NEAR EXTRN RIEMPI:NEAR EXTRN RAMpiu:NEAR ; DICHIARAZIONI PER I PROGRAMMI ESTERNI: PUBLIC ATTRIB PUBLIC Printer2 ;DEFINIZIONE DEL SEGMENTO DEL CODICE ;----------------------------------------------------------------------------- _prog SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP Printer2 ;AREA DESTINATA AI DATI DEL PROGRAMMA ;----------------------------------------------------------------------------- ATTRIB DB 1FH TESTO1 DB " Stampa di dati a Basso Livello su porta parallela ",00H TESTO2 DB " TUTORIAL ASSEMBLY --- www.Giobe2000.it",00H TESTO3 DB "Quit",00H TESTO4 DB " La stampa del testo di prova Š terminata...",00H ;/-[Stringhe di controllo per STAMPANTE HEWLETT PACKARD LASERjetIID]-\ ;|NER_on= "(s3b" ;GRASSETTO attivata | ;|NER_of= "(s0b" ;GRASSETTO disattivata | ;|SOV_on= "(s1s" ;SOVRASTAMPA attivata | ;|SOV_of= "(s0s" ;SOVRASTAMPA disattivata | ;|ALL_on= "(s10.00h12.0v" ;ALLARGATO attivata | ;|ALL_of= "(s12.00h10.0v" ;ALLARGATO disattivata | ;|COND_on="(8U(s0p16.67h8.5v0s3T" ;CONDENSATO attivata | ;|COND_of="(8U(s0p12.00h10.0v0s3T" ;CONDENSATO disattivata | ;|ELIT= "(8U(s0p12.00h10.0v0s3T" ;ELITE | ;|PICA= "(8U(s0p12.00h10.ov0s3T" ;PICA | ;\-------------------------------------------------------------------/ TESTO LABEL word ;Identifica la locazione corrente "inizio del testo" ;/------[Stringhe di controllo per STAMPANTE NORMALE (tipo EPSON)]---\ ;| **************** STAMPA in CARATTERE "PICA" ******************** | ;\-------------------------------------------------------------------/ DB "P" ;scrittura in PICA (80 caratteri per riga) ;/-\ ;--------------------------------------------------;| | DB "" ;scrittura in CONDENSATO attivata (136 carat./PICA ;| | DB "TESTO in carattere PICA CONDENSATO NORMALE",CR,LF ;| | DB "G" ;scrittura in SOVRASTAMPA (RIBATTITURA) attivata ;| | DB "TESTO in carattere PICA CONDENSATO RIBATTUTO",CR,LF ;| | DB "H" ;scrittura in SOVRASTAMPA (SOVRASTAMPA) disattivata;| | DB "E" ;scrittura in GRASSETTO attivata ;| | DB "TESTO in carattere PICA CONDENSATO GRASSETTO ",CR,LF ;| | DB "F" ;scrittura in GRASSETTO disattivata ;| | DB "EG" ;scrittura in GRASSETTO e SOVRASTAMPA attivata ;| | DB "TESTO in carattere PICA CONDENSATO GRASSETTO+RIBATTITURA" ;| | DB CR,LF ;| | DB "FH" ;scrittura in GRASSETTO e SOVRASTAMPA disattivata ;| | DB "" ;scrittura in CONDENSATO disattivata ;\-/ DB CR,LF ;----------------------------------------------------- DB "TESTO in carattere PICA NORMALE",CR,LF ;| | DB "G" ;scrittura in SOVRASTAMPA (RIBATTITURA) attivata ;| | DB "TESTO in carattere PICA RIBATTUTO",CR,LF ;| | DB "H" ;scrittura in SOVRASTAMPA (SOVRASTAMPA) disattivata;| | DB "E" ;scrittura in GRASSETTO attivata ;| | DB "TESTO in carattere PICA GRASSETTO ",CR,LF ;| | DB "F" ;scrittura in GRASSETTO disattivata ;| | DB "EG" ;scrittura in GRASSETTO e SOVRASTAMPA attivata ;| | DB "TESTO in carattere PICA GRASSETTO+RIBATTITURA",CR,LF ;| | DB "FH" ;scrittura in GRASSETTO e SOVRASTAMPA disattivata ;\-/ DB CR,LF ;----------------------------------------------------- DB "W1" ;scrittura in ALLARGATO attivata ;/-\ DB "TESTO in PICA ALLARGATO NORMALE",CR,LF ;| | DB "G" ;scrittura in SOVRASTAMPA (RIBATTITURA) attivata ;| | DB "TESTO in PICA ALLARGATO RIBATTUTO",CR,LF ;| | DB "H" ;scrittura in SOVRASTAMPA (SOVRASTAMPA) disattivata;| | DB "E" ;scrittura in GRASSETTO attivata ;| | DB "TESTO in PICA ALLARGATO GRASSETTO ",CR,LF ;| | DB "F" ;scrittura in GRASSETTO disattivata ;| | DB "EG" ;scrittura in GRASSETTO e SOVRASTAMPA attivata ;| | DB "TESTO in PICA ALLARGATO GRASS.+RIBATT.",CR,LF ;| | DB "FH" ;scrittura in GRASSETTO e SOVRASTAMPA disattivata ;| | DB "W0" ;scrittura in ALLARGATO disattivata ;\-/ DB CR,LF ;------------------------------------------------------ DB "W1" ;scrittura in CONDENSATO e in ALLARGATO attivata ;/-\ DB "TESTO in carattere PICA CONDENSATO ALLARGATO NORMALE",CR,LF;| | DB "G" ;scrittura in SOVRASTAMPA (RIBATTITURA) attivata ;| | DB "TESTO in carattere PICA CONDENSATO ALLARGATO RIBATTUTO",CR,LF;| DB "H" ;scrittura in SOVRASTAMPA (SOVRASTAMPA) disattivata;| | DB "E" ;scrittura in GRASSETTO attivata ;| | DB "TESTO in carattere PICA CONDENSATO ALLARGATO GRASSETTO ",CR,LF; DB "F" ;scrittura in GRASSETTO disattivata ;| | DB "EG" ;scrittura in GRASSETTO e SOVRASTAMPA attivata ;| | DB "TESTO in carattere PICA CONDENSATO ALLARGATO GRASSETTO+" ;| | DB "RIBATTITURA",CR,LF ;| | DB "FH" ;scrittura in GRASSETTO e SOVRASTAMPA disattivata ;| | DB "W0" ;scrittura in CONDENSATO e in ALLARGATO disattivata;\-/ DB CR,LF ;--------------------------------------------------------- ;/------[Stringhe di controllo per STAMPANTE NORMALE (tipo EPSON)]---\ ;| **************** STAMPA in CARATTERE "ELITE" ******************** | ;\-------------------------------------------------------------------/ DB "M" ;scrittura in ELITE (96 caratteri per riga) ;/-\ ;--------------------------------------------------;| | DB "" ;scrittura in CONDENSATO attivata (160 carat./ELITE;| | DB "TESTO in carattere ELITE CONDENSATO NORMALE",CR,LF ;| | DB "G" ;scrittura in SOVRASTAMPA (RIBATTITURA) attivata ;| | DB "TESTO in carattere ELITE CONDENSATO RIBATTUTO",CR,LF ;| | DB "H" ;scrittura in SOVRASTAMPA (SOVRASTAMPA) disattivata;| | DB "E" ;scrittura in GRASSETTO attivata ;| | DB "TESTO in carattere ELITE CONDENSATO GRASSETTO ",CR,LF ;| | DB "F" ;scrittura in GRASSETTO disattivata ;| | DB "EG" ;scrittura in GRASSETTO e SOVRASTAMPA attivata ;| | DB "TESTO in carattere ELITE CONDENSATO GRASSETTO+RIBATTITURA" ;| | DB CR,LF ;| | DB "FH" ;scrittura in GRASSETTO e SOVRASTAMPA disattivata ;| | DB "" ;scrittura in CONDENSATO disattivata ;\-/ DB CR,LF ;----------------------------------------------------- DB "TESTO in carattere ELITE NORMALE",CR,LF ;| | DB "G" ;scrittura in SOVRASTAMPA (RIBATTITURA) attivata ;| | DB "TESTO in carattere ELITE RIBATTUTO",CR,LF ;| | DB "H" ;scrittura in SOVRASTAMPA (SOVRASTAMPA) disattivata;| | DB "E" ;scrittura in GRASSETTO attivata ;| | DB "TESTO in carattere ELITE GRASSETTO ",CR,LF ;| | DB "F" ;scrittura in GRASSETTO disattivata ;| | DB "EG" ;scrittura in GRASSETTO e SOVRASTAMPA attivata ;| | DB "TESTO in carattere ELITE GRASSETTO+RIBATTITURA",CR,LF ;| | DB "FH" ;scrittura in GRASSETTO e SOVRASTAMPA disattivata ;\-/ DB CR,LF ;----------------------------------------------------- DB "W1" ;scrittura in ALLARGATO attivata ;/-\ DB "TESTO in ELITE ALLARGATO NORMALE",CR,LF ;| | DB "G" ;scrittura in SOVRASTAMPA (RIBATTITURA) attivata ;| | DB "TESTO in ELITE ALLARGATO RIBATTUTO",CR,LF ;| | DB "H" ;scrittura in SOVRASTAMPA (SOVRASTAMPA) disattivata;| | DB "E" ;scrittura in GRASSETTO attivata ;| | DB "TESTO in ELITE ALLARGATO GRASSETTO ",CR,LF ;| | DB "F" ;scrittura in GRASSETTO disattivata ;| | DB "EG" ;scrittura in GRASSETTO e SOVRASTAMPA attivata ;| | DB "TESTO in ELITE ALLARGATO GRASS.+RIBATT.",CR,LF ;| | DB "FH" ;scrittura in GRASSETTO e SOVRASTAMPA disattivata ;| | DB "W0" ;scrittura in ALLARGATO disattivata ;\-/ DB CR,LF ;------------------------------------------------------ DB "W1" ;scrittura in CONDENSATO e in ALLARGATO attivata ;/-\ DB "TESTO in carattere ELITE CONDENSATO ALLARGATO NORMALE",CR,LF; | DB "G" ;scrittura in SOVRASTAMPA (RIBATTITURA) attivata ;| | DB "TESTO in carattere ELITE CONDENSATO ALLARGATO RIBATTUTO",CR,LF; DB "H" ;scrittura in SOVRASTAMPA (SOVRASTAMPA) disattivata;| | DB "E" ;scrittura in GRASSETTO attivata ;| | DB "TESTO in carattere ELITE CONDENSATO ALLARGATO GRASSETTO ",CR,LF; DB "F" ;scrittura in GRASSETTO disattivata ;| | DB "EG" ;scrittura in GRASSETTO e SOVRASTAMPA attivata ;| | DB "TESTO in carattere ELITE CONDENSATO ALLARGATO GRASSETTO+" ;| | DB "RIBATTITURA",CR,LF ;| | DB "FH" ;scrittura in GRASSETTO e SOVRASTAMPA disattivata ;| | DB "W0" ;scrittura in CONDENSATO e in ALLARGATO disattivata;\-/ DB CR,LF ;------------------------------------------------------- DB 00H ;Terminatore del TESTO in stampa ;AREA DESTINATA ALLE PROCEDURE DEL PROGRAMMA ;/---------------------------------------------------------------------------\ ;|PROCEDURA : DeskTop | ;|DESCRIZIONE: Procedura che inizializza completamente il piano di lavoro.| ;\---------------------------------------------------------------------------/ DeskTop:CALL RAMcls ;Pulisce lo schermo e inizializza il segmento ;dedicato alla RamVideo (ES=0B800H) CALL VIA_cur ; Rende il cursore invisibile M_COLOR 71H ; MOV AL,"°" ; CALL RIEMPI ; RAMrepC 80," ", 0, 0,30H; RAMrepC 80," ",24, 0,30H; RAMcol TESTO1, 0,15,3FH; Organizza il piano di presentazione RAMcol TESTO2,24, 0,3FH; RAMcol TESTO3,24,73,30H; RAM_cur 24,73 ; M_COLOR 3FH ; MOV AL,"Q" ; CALL RAMchr ; RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Chk_Busy | ;|DESCRIZIONE: Controlla se la Stampante Š disponibile a ricevere DATI dal| ;| computer, interrogando i bit7 del Registro di Stato 0379H. | ;| | ;| /-[0379H/0279H - PORTA d'INGRESSO dello STATO]-\ | ;| | /-7-*-6-*-5-*4--*-3-*-2-*-1-*-0-\ | | ;| | | ? | 1 | 1 | 1 | 0 | x | x | 0 | | | ;| | \---*---*---*---*---*---*---*---/ | | ;| | | | | | | | | \-TimeOut| | ;| |**BUSY**-/ | | | | \---*---non usati| | ;| |ACKNOWL. (ok)/ | | \-------nessun ERRORE| | ;| |PAPER EMPTY (ok)-/ \--------SELECT (ON-LINE)| | ;| \----------------------------------------------/ | ;\---------------------------------------------------------------------------/ Chk_Busy:MOV DX,PRNstat ; Controlla se la Stampante Š disponibile a Chk_01: IN AL,DX ; ricevere DATI dal computer: in questo caso la TEST AL,80H ; linea di BUSY (bit7) Š a "1" e si pu• JZ Chk_02 ; proseguire; in caso contrario (bit7="0") la RET ; stampante Š "occupata" (busy) Chk_02: MOV AH,01H ; Funzione BIOS INT 16H che consente di verifi- INT 16H ; care la eventuale pressione di tasti senza JZ Chk_01 ; fermarsi; se non si introduce questo controllo ; se la stampate non Š in linea non si esce pi—! ; (NB: ffZ="1" = nessuna pressione tasti (Z) ) CALL KEYwait ; AND AL,11011111B ; In ogni caso Š ammesa l'uscita solo dopo la CMP AL,'Q' ; pressione del tasto "Q" JNZ Chk_01 ; RET ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Out_Chr | ;|DESCRIZIONE: Colloca il carattere corrente sul Registro d'uscita Dati,| ;| 0378H, a disposizione della Stampante. | ;| | ;| /-[0378H/0278H - PORTA d'USCITA dei DATI]-----\ | ;| | /-7-*-6-*-5-*4--*-3-*-2-*-1-*-0-\ | | ;| | | D7| D6| D5| D4| D3| D2| D1| D0| | | ;| | \---*---*---*---*---*---*---*---/ | | ;| \----------------------------------------------/ | ;| Dopo la trasmissione crea da software il breve impulso di| ;| STROBE, a beneficio della Stampante, in sequenza il bit0 del| ;| Registro di Controllo prima a "1" [1=Dato Erogato] e poi a "0"| ;| [0=nessun Dato] | ;| | ;| /-[037AH/027AH - PORTA d'USCITA dei COMANDI ]-\ | ;| | /-7-*-6-*-5-*4--*-3-*-2-*-1-*-0-\ | /---------\| ;| | | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ? | | | || ;| | \---*---*---*---*---*---*---*---/ | | Úż || ;| |non usati*---*---/ | | | | \--STROBE| | ÄÄŮŔÄ÷Ä || ;| |ENABLE INT (disab)---/ | | \AUTOFEED(no)| | STROBE || ;| |SELECT IN (ok:on-line)---/ \--------INIT(ok)| \---------/| ;| \----------------------------------------------/ | ;\---------------------------------------------------------------------------/ Out_Chr:MOV DX,PRNdato ; Colloca carattere corrente dalla stringa sul OUT DX,AL ; Registro d'uscita Dati, a disposizione della ; Stampante MOV DX,PRNcomd ; IN AL,DX ; Crea da software il breve impul- /---------\ OR AL,01H ; so di "STROBE", a beneficio del- | | OUT DX,AL ; la Stampante: il bit0 del Regi- | Úż | CALL Delay__ ; stro "PRNcomd" viene forzato in | ÄÄŮŔÄ÷Ä | AND AL,0FEH ; sequenza prima a "1" e poi a "0" | STROBE | OUT DX,AL ; [1=Dato Erogato / 0=nessun Dato] \---------/ CALL Delay__ ; RET ; ;/---------------------------------------------------------------------------\ ;|PROCEDURA : Delay__ | ;|DESCRIZIONE : Il ritardo prodotto Š legato dalla velocit… del processore | ;| perch‚ utilizza le un ciclo di istruzioni.. Š di circa 1 ms | ;\---------------------------------------------------------------------------/ Delay__:PUSH CX MOV CX,0000H ;65536 del2_: PUSH AX PUSH BX PUSH CX PUSH DX POP DX POP CX POP BX POP AX LOOP del2_ POP CX RET ;***************************************************************************** ; ---------------------------------------------- Printer2 proc NEAR ; AREA DEDICATA AL MAIN PROGRAM ; ---------------------------------------------- ;----------------------------------------------------------------------------- ; --------------------------------------------- CALL DeskTop ; Organizza il piano di presentazione ; --------------------------------------------- LEA SI,TESTO ; Punta il testo da proporre sulla carta Prnt00: CALL Chk_Busy ; Controlla se la Stampante Š disponibile a ; ricevere DATI dal computer CMP AL,'Q' ; Se, durante l'attesa, Š stato premuto il tasto JZ _OUT ; "Q" si torna immediatamemte al DOS ; --------------------------------------------- ; FASE DI STAMPA DI UN CARATTERE ; --------------------------------------------- MOV AL,CS:[SI] ; Preleva il carattere corrente dalla stringa e CMP AL,00H ; verifica se si tratta del "terminatore"; se Š JZ Prnt01 ; cosŤ il servizio di stampa Š terminato ; Altrimenti lo colloca sul Registro d'uscita CALL Out_Chr ; Dati a disposizione della Stampante, lasciando INC SI ; aggiornato il puntatore alla stringa JMP SHORT Prnt00 ; Ritorna nel loop di stampa Prnt01:RAMcol TESTO4,12,18,0CFH;Messaggio di fine lavoro ;La stampa del testo di prova Š terminata... Prnt02: CALL KEYwait ; Rimane in attesa di tasti premuti e, quando AND AL,11011111B ; ci• Š vero, ne controlla il valore CMP AL,'Q' ; Se il tasto premuto Š "Q", viene imposto un JNZ Prnt02 ; ritorno immediato al sistema operativo _OUT: PUSH AX ; Torna al DOS con la memoria liberata e con la RAMrepC 80," ", 0,0,0FH; chiusura di tutti i file; cede il controllo RAMrepC 80," ",24,0,0FH; al processo padre (generalmente COMMAND.COM); CALL RIP_cur ; il valore posto eventualmente in AL prima di MOV DH,23 ; uscire pu• essere testato in uscita con la MOV DL,0 ; funzione 4DH o mediante la lettura della CALL SET_cur ; variabile DOS "ERRORLEVEL" POP AX ; MOV AH,4CH ; INT 21H Printer2 ENDP ; Chiusura della Procedura "Main Program" _prog ENDS ; Chiusura del Segmento di CODICE END INIZIO ; Indirizzo dell'ultima istruzione da compilare