CP/M MACRO ASSEM 2.0 #001 NORTH STAR BIOS FOR CODE 3955 1 MAY 85 TITLE 'NORTH STAR BIOS FOR CODE 3955 1 MAY 85' ;BIOS3955.ASM MAY 1 1985 ;CONFIGURED FOR 56K SYSTEM FOR CODE 3955 ;THIS USER AREA IS FOR A HORIZON COMPUTER ;AS USED IN A 56K LIFEBOAT CP/M2 ON NORTH STAR. ;CHANGE MSIZE TO THE MEMORY SIZE DESIRED. 0038 = MSIZE EQU 56 ;DISTRIBUTION SYSTEM ;THE FOLLOWING EQUATES ARE AUTOMATICALLY CHANGED BY MSIZE. D300 = BIOS EQU 5300H+(MSIZE-24)*1024 BD00 = CCP EQU BIOS-1600H C500 = BDOS EQU CCP+800H DA00 = USER EQU BIOS+700H ;FOR DOUBLE/QUAD DENSITY 4D00 = OFFSET EQU 2000H-BIOS ;TO OVERLAY SYSGEN IMAGE 0003 = IOBYT EQU 3 ;STORAGE LOCATION DA00 ORG USER ;ORIGIN OF THIS PROGRAM ;THE JUMP TABLE FOLLOWING MUST BE PRESENT AND ;THE SEQUENCE OF JUMPS MAY NOT BE CHANGED DA00 C303DB JMP CINIT ;INITIALIZE I/O PORTS DA03 C3FFDA JMP WINIT ;WARM BOOT INIT DA06 C321DA JMP CONST ;CONSOLE STATUS DA09 C32FDA JMP CONIN ;CONSOLE INPUT DA0C C33DDA JMP CONOUT ;CONSOLE OUTPUT DA0F C34BDA JMP LIST ;PRINTER OUTPUT DA12 C35BDA JMP PUNCH ;PUNCH OUTPUT DA15 C36DDA JMP READER ;READER INPUT DA18 C37DDA JMP LISTST ;PRINTER STATUS DA1B E101 DW UALEN ;LENGTH OF USER AREA DA1D 00 INIOBY: DB 0 ;INITIAL IOBYT VALUE DA1E 000000 DB 0,0,0 ;RESERVED ;YOU MAY MAKE ANY CHANGES DESIRED FROM THIS POINT ON. ;KEEP THE TOTAL USER AREA UNDER 512 BYTES. ; LOGICAL I/O ROUTINES ;EACH LOGICAL I/O ROUTINE LOADS THE IOBYT AT ADDRESS 3, ;ROTATES THE PROPER TWO BIT FIELD INTO BITS 0 AND 1, ;AND CALLS THE DSPCH ROUTINE WHICH SELECTS ONE ;OF THE FOUR PHYSICAL DRIVERS FROM THE TABLE FOLLOWING ;DEPENDING ON THE VALUE OF BITS 0 AND 1. ;THE LIST ROUTINE HAS BEEN FULLY COMMENTED TO AID YOU. CONST: ;SELECT CONSOLE STATUS ROUTINE. DA21 3A0300 LDA IOBYT DA24 CD7FDA CALL DSPCH ; ; CONSOLE STATUS DISPATCH TABLE ; CP/M MACRO ASSEM 2.0 #002 NORTH STAR BIOS FOR CODE 3955 1 MAY 85 DA27 8CDA DW LSERST ;LEFT SERIAL DA29 94DA DW RSERST ;RIGHT SERIAL DA2B 7DDA DW LISTST ;BATCH MODE DA2D 9CDA DW PARST ;PARALLEL PORT ; CONIN: ;SELECT CONSOLE INPUT ROUTINE. DA2F 3A0300 LDA IOBYT DA32 CD7FDA CALL DSPCH ; ; CONSOLE INPUT DISPATCH TABLE ; DA35 A4DA DW LSERIN ;LEFT SERIAL DA37 B0DA DW RSERIN ;RIGHT SERIAL DA39 6DDA DW READER ;BATCH MODE DA3B BCDA DW PARIN ;PARALLEL PORT ; CONOUT: ;SELECT CONSOLE OUTPUT ROUTINE. DA3D 3A0300 LDA IOBYT DA40 CD7FDA CALL DSPCH ; ; CONSOLE OUTPUT DISPATCH TABLE ; DA43 CEDA DW LSEROUT ;LEFT SERIAL DA45 D9DA DW RSEROUT ;RIGHT SERIAL DA47 4BDA DW LIST ;BATCH MODE DA49 E4DA DW PAROUT ;PARALLEL PORT ; LIST: ;SELECT A LIST DRIVER. DA4B 3A0300 LDA IOBYT ;LOAD IOBYT FROM ADDRESS 4. DA4E 07 RLC ;ROTATE LIST SELECTION BITS DA4F 07 RLC ;INTO BIT POSITION 0 AND 1. DA50 CD7FDA CALL DSPCH ;CALL DISPATCHER. ;THE DISPATCHER SELECTS A ROUTINE FROM THE TABLE ;FOLLOWING DEPENDING ON THE VALUE OF BITS 0-1. ;THE SELECTED ROUTINE WILL RETURN TO THE CALLER. ; DA53 E4DA DW PAROUT ;00B = PARALLEL PORT DA55 E4DA DW PAROUT ;01B = PARELLEL PORT DA57 D9DA DW RSEROUT ;10B = RIGHT SERIAL DA59 D9DA DW RSEROUT ;11B = RIGHT SERIAL ; PUNCH: ;SELECT AS PUNCH DRIVER. DA5B 3A0300 LDA IOBYT DA5E 0F RRC DA5F 0F RRC DA60 0F RRC DA61 0F RRC DA62 CD7FDA CALL DSPCH ; ; PUNCH DEVICE DISPATCH TABLE ; CP/M MACRO ASSEM 2.0 #003 NORTH STAR BIOS FOR CODE 3955 1 MAY 85 DA65 CEDA DW LSEROUT DA67 D9DA DW RSEROUT DA69 E4DA DW PAROUT DA6B E4DA DW PAROUT ; READER: ;SELECT A READER DRIVER. DA6D 3A0300 LDA IOBYT DA70 0F RRC DA71 0F RRC DA72 CD7FDA CALL DSPCH ; ; READER DEVICE DISPATCH TABLE ; DA75 A4DA DW LSERIN DA77 B0DA DW RSERIN DA79 BCDA DW PARIN DA7B BCDA DW PARIN ; LISTST: ;LIST STATUS NOT IMPLEMENTED. DA7D AF XRA A DA7E C9 RET ; DSPCH: ;SELECT ROUTINE FROM TABLE OF CALLER. DA7F E603 ANI 3 ;MASK IOBYT AND DA81 07 RLC ;MULT TIMES 2. DA82 5F MOV E,A ;PUT INDEX INTO DA83 1600 MVI D,0 ;DE REGISTER. DA85 E1 POP H ;GET ADDR OF TABLE DA86 19 DAD D ;AND ADD INDEX. DA87 5E MOV E,M ;GET ADDR OF ROUTINE DA88 23 INX H ;INTO DA89 56 MOV D,M ;DE FIRST, DA8A EB XCHG ;THEN PUT INTO HL DA8B E9 PCHL ;AND TRANSFER CONTROL. ; ; PHYSICAL STATUS ROUTINES ; LSERST: ;LEFT SERIAL PORT STATUS. DA8C DB03 IN 3 DA8E E602 ANI 2 DA90 C8 RZ ;NO KEY DA91 3EFF MVI A,0FFH DA93 C9 RET ;CHAR READY ; RSERST: ;RIGHT SERIAL PORT STATUS. DA94 DB05 IN 5 DA96 E602 ANI 2 DA98 C8 RZ ;NO KEY DA99 3EFF MVI A,0FFH DA9B C9 RET ;CHAR READY ; CP/M MACRO ASSEM 2.0 #004 NORTH STAR BIOS FOR CODE 3955 1 MAY 85 PARST: ;PARALLEL PORT STATUS. DA9C DB06 IN 6 DA9E E602 ANI 2 DAA0 C8 RZ DAA1 3EFF MVI A,0FFH DAA3 C9 RET ; ; PHYSICAL INPUT ROUTINES ; LSERIN: ;LEFT SERIAL PORT INPUT. DAA4 DB03 IN 3 DAA6 E602 ANI 2 DAA8 CAA4DA JZ LSERIN DAAB DB02 IN 2 DAAD E67F ANI 7FH DAAF C9 RET ; RSERIN: ;RIGHT SERIAL PORT INPUT. DAB0 DB05 IN 5 DAB2 E602 ANI 2 DAB4 CAB0DA JZ RSERIN DAB7 DB04 IN 4 DAB9 E67F ANI 7FH DABB C9 RET ; PARIN: ;PARALLEL PORT INPUT. DABC DB06 IN 6 ;MOTHERBOARD STATUS DABE E602 ANI 2 DAC0 CABCDA JZ PARIN DAC3 DB00 IN 0 ;READ KEYBOARD DAC5 F5 PUSH PSW ;SAVE CHAR DAC6 3E30 MVI A,30H DAC8 D306 OUT 6 ;RESET PI FLAG DACA F1 POP PSW DACB E67F ANI 7FH DACD C9 RET ; ; PHYSICAL OUTPUT ROUTINES ; LSEROUT: ;LEFT SERIAL PORT OUTPUT. DACE DB03 IN 3 DAD0 E601 ANI 1 DAD2 CACEDA JZ LSEROUT DAD5 79 MOV A,C DAD6 D302 OUT 2 DAD8 C9 RET ; RSEROUT: ;RIGHT SERIAL PORT OUTPUT. DAD9 DB05 IN 5 DADB E601 ANI 1 CP/M MACRO ASSEM 2.0 #005 NORTH STAR BIOS FOR CODE 3955 1 MAY 85 DADD CAD9DA JZ RSEROUT DAE0 79 MOV A,C DAE1 D304 OUT 4 DAE3 C9 RET ; PAROUT: ;PARALLEL PORT OUTPUT. DAE4 DB06 IN 6 ;MOTHERBOARD STATUS DAE6 E601 ANI 1 DAE8 CAE4DA JZ PAROUT DAEB 3E20 MVI A,20H ;RESET PO FLAG DAED D306 OUT 6 ;OUTPUT CHAR DAEF 79 MOV A,C ;LOAD ACCUMULATOR TIN1: DAF0 F680 ORI 80H ;SET STROBE FALSE DAF2 D300 OUT 0 ;AND SEND CHARACTER DAF4 EE80 XRI 80H ;TOGGLE STROBE DAF6 D300 OUT 0 ;OUTPUT DAF8 EE80 XRI 80H ;AND TOGGLE AGAIN DAFA D300 OUT 0 DAFC E67F ANI 7FH ;MASK TO ASCII DAFE C9 RET ; ; HORIZON HARDWARE INITIALIZATION ; WINIT: ;WARM BOOT INITIALIZATION. DAFF 000000 DB 0,0,0 ;MAY BE PATCHED DB02 C9 RET ; CINIT: ;COLD BOOT INITIALIZATION. DB03 3A1DDA LDA INIOBY ;GET INITIAL IOBYT DB06 320300 STA IOBYT ;AND STORE DB09 CD4EDB CALL USINIT ;USER INIT ROUTINE ; ;INIT MOTHERBOARD AND SET UP SERIAL PORTS. DB0C AF XRA A DB0D D306 OUT 6 DB0F D306 OUT 6 DB11 D306 OUT 6 DB13 D306 OUT 6 ;INIT LEFT SERIAL PORT (STANDARD CONSOLE). DB15 3ECE MVI A,0CEH ;SET 2 STOP BITS DB17 D303 OUT 3 ;TO FIRST SERIAL PORT DB19 3E37 MVI A,37H ;CMMD: RTS ER RXF DTR TXEN DB1B D303 OUT 3 ;TO FIRST PORT ;INIT RIGHT SERIAL PORT. DB1D 3ECE MVI A,0CEH ;SET 2 STOP BITS DB1F D305 OUT 5 ;TO SECOND SERIAL PORT DB21 3E37 MVI A,37H ;SAME COMMAND DB23 D305 OUT 5 ;TO SECOND PORT ;0CEH SETS 2 STOP, 8 DATA BITS, 16X CLOCK, NO PARITY. ;04EH SETS 1 STOP, 8 DATA BITS, 16X CLOCK, NO PARITY. ;PARITY INITIALIZATION. CP/M MACRO ASSEM 2.0 #006 NORTH STAR BIOS FOR CODE 3955 1 MAY 85 DB25 3E40 MVI A,40H ;DISARM PARITY LOGIC DB27 D3C0 OUT 0C0H DB29 210000 LXI H,0 DB2C 3EE0 MVI A,0E0H ;LOOP TO SET PARITY FOR FIRST 56K OF RAM. DB2E 46 TINCP: MOV B,M ;READ BYTE DB2F 70 MOV M,B ;PUT BACK WITH PARITY SET DB30 2C INR L ;NEXT MEMORY LOCATION DB31 C22EDB JNZ TINCP DB34 24 INR H ;NEXT 256 BYTE PAGE DB35 BC CMP H ;UP TO 0E0H DB36 C22EDB JNZ TINCP ;ENABLE PARITY LOGIC ON MEMORY BOARD. DB39 3E41 MVI A,41H DB3B D3C0 OUT 0C0H ;CLEAR INPUT BUFFERS ON SERIAL PORTS. DB3D DB02 IN 2 DB3F DB04 IN 4 ;INIT PARALLEL PORT. DB41 3E30 MVI A,30H DB43 D306 OUT 6 ;RESET PARALLEL PORT PI FLAG DB45 3E60 MVI A,60H ;CODE TO SET PO FLAG DB47 D306 OUT 6 DB49 3E0D MVI A,0DH ;OUTPUT A CARRIGE RETURN DB4B C3F0DA JMP TIN1 ;TO PARALLEL PORT ; ; SPECIAL INITIALIZATION FOR USER ; USINIT: ; ; CLEAR SCREEN ON TELEVIDEO 950 TERMINAL ; DB4E 3E1B MVI A,01BH ;ESCAPE CHARACTER DB50 CD3DDA CALL CONOUT ;SEND IT DB53 3E2A MVI A,02AH ;* CHARACTER DB55 CD3DDA CALL CONOUT ;SEND IT ; ; SEND PRINTER ROUTING MESSAGE TO SCREEN ; DB58 3E09 MVI A,9 ;FUNCTION 9 IS PRINT STRING DB5A 1161DB LXI D,MESSAGE ;POINT TO MESSAGE DB5D CD0500 CALL 005H ;CALL BDOS TO EXECUTE FUNCTION DB60 C9 RET ; ; MESSAGE AREA ; MESSAGE: DB61 0D0A0A0A DB 0DH,0AH,0AH,0AH ;SPACE DOWN 3 LINES DB65 2020202020 DB ' TO CHANGE PRINTERS, ENTER:' DB8B 0D0A DB 0DH,0AH DB8D 5355424D49 DB 'SUBMIT LASER (CHANGES TO LASER PRINTER)' DBB5 5355424D49 DB 'SUBMIT EPSON (CHANGES TO EPSON PRINTER)' DBDD 0D0A0A24 DB 0DH,0AH,0AH,'$' ; ; ;LASER.SUB IS: STAT LST:=LPT: CP/M MACRO ASSEM 2.0 #007 NORTH STAR BIOS FOR CODE 3955 1 MAY 85 ;EPSON.SUB IS: STAT LST:=TTY: ; 01E1 = UALEN EQU $-USER ;LENGTH ; DBE1 END