TITLE 'MBASIC console output - printer redirection' ;**************************************************************** ;* * ;* R E D I R . A S M * ;* * ;**************************************************************** ; by ; Jack L. Owens ; ; Jack Owens Service Company ; 1626 Del Dayo Drive ; Carmichael, California ; 95608 ; ; (916)485-8995 ; ; March 7, 1984 ; ; For use with Microsoft Basic version 5.21 interpreter ; ; Patch to the base page of operating system to allow ; redirection of BASIC console output to the printer. ; ; Method: ; a) set up one of the RST locations with a jump ; to the BIOS print vector. ; ; b) set up another RST location with a call to ; the BIOS print vector and then a routine ; to jump to the CONOUT vector. ; ; c) poke an RST in place of the call instruction ; in BASIC then continue with BASIC program ; ; d) when all through, poke a instruction to return ; the CONOUT vector in BASIC to it's original ; condition. ; ; Note: You may find out where the base of the BIOS jump vector is ; by inspecting the pointer found in addresses 1 and 2 in ; a normal CP/M system. ; ; Set your program up with the following information: ; ;100 LIST% = 207' RST 1 ;110 BOTH% = 223' RST 3 ;120 CALLL% = 205' Replace RST instruction with CALL (CD) ;130 CONOUT% = &H41E4' Location in MBASIC 5.21 with call to CONOUT ; ; Then whenever you wish to redirect the console output to the printer ; only, do: ; ;1500 POKE CONOUT%,LIST% ; ; and all console output will go to the printer. If you want the ; console output to go to both printer and console, then do: ; ;1500 POKE CONOUT%,BOTH% ; ; and all console output goes to both printer and console. ; ; Whenever you want to return to normal operation, do: ; ;2500 POKE CONOUT%,CALLL% ; ; and the MBASIC interpreter returns to normal operation. ; ; Run the following program once after boot up. Then go ahead ; with normal operation. Only shutting the system down should ; destroy the routines in the RST locations. WARNING! some ; CP/M systems use these RST locations for their own purposes. ; If so, change to another set of RST locations not in use. My ; system uses the RST 2 location to keep track of the system ; clock time. ; BIOS equ 0EE00h ;start of BIOS jump table ; change to suit your system ; CONOUT equ BIOS+12 ;CONOUT jump vector LIST equ BIOS+15 ;LIST jump vector RESTART1 equ 8 ;location of RST 1 RESTART3 equ 18h ;location of RST 3 ; org 100h ; jmp START ;jump around code to be moved ; ; The following code up to start is moved with the code at START ; ;RST 1 routine CODE: jmp LIST ;redirect to printer ; ;RST 3 routine push B ;save the character for CONOUT call LIST ;go print a character pop B ;get the character back jmp CONOUT ;go print the character on the screen ; START: lxi h,CODE ;pointer to CODE to be moved lxi d,RESTART1 ;pointer to relocated code address mvi b,3 ;length of RESTART1 code call mover lxi d,RESTART3 ;pointer to RST 3 address mvi b,8 ;length of both console and printer code call mover jmp 0 ;reset the system ; Mover: mov a,m ;get a byte stax D ; and store it inx h ;And inx d ; bump dcr b ; Registers jnz mover ret ; end