; CP/M CBIOS 1.4 WITH FOLLOWING I/O CONFIGURATION ; PORT 20 - TUART A ; PORT 30 - TUART B ; PORT 78 - SD SBC 100 ; ; VERSION 2.0 6/23/78 ; ; ; SYSTEM EQUATES ; ; SBC-100 SERIAL PORTS SER1S EQU 7DH SER1D EQU 7CH SER1B EQU 78H ; BAUD RATE SET ; ; CROMEMCO TUART EQUATES ; TUA EQU 20H TUB EQU 30H TURDA EQU 40H TUTBE EQU 80H ; MSIZE EQU 32 ; #K OF RAM IN SYSTEM ORGADR EQU (MSIZE*1024)-512 NBYTES EQU 128 ; BYTES PER SECTOR BIAS EQU 2900H ; BIAS TO START OF CCP CBASE EQU ((MSIZE-16)*1024) CPMB EQU CBASE+BIAS BDOS EQU CPMB+806H ; START OF BDOS CPML EQU ORGADR-CPMB ; SIZE OF WARM LOAD NSECTS EQU CPML/NBYTES ; # SECTORS IN WARM LOAD BIOS EQU 0F000H ; ADDRESS OF PROM BIOS LOADER EQU BIOS+2DH ; ADDRESS OF LOADER NREC EQU 45H ; NUMBER OF SECTORS TO LOAD ; ; CP/M LINKAGES TO BIOS ; ORG ORGADR CBIOS: JMP BOOT ; ENTER HERE FROM COLD BOOT WBOOTE: JMP WBOOT ; WARM BOOT JMP CONST ; CONSOLE JMP CI ; CONSOLE INPUT JMP CO ; CONSOLE OUTPUT JMP LST ; LIST OUTPUT JMP CO ; PUNCH OUTPUT JMP CI ; READER INPUT HOME: JMP BIOS+24 ; RESTORE DRIVE TO TRK00 SELDSK: JMP BIOS+27 ; SELECT DRIVE SETTRK: JMP BIOS+30 ; SET TRACK SETSEC: JMP BIOS+33 ; SET SECTOR SETDMA: JMP BIOS+36 ; SET DISK TRANSFER ADDRESS READ: JMP BIOS+39 ; READ A SECTOR WRITE: JMP BIOS+42 ; WRITE A SECTOR ; ; ;: SECTOR TRANSLATION TABLE FOR BDOS ; ; TRANS: DB 1,7,13,19 DB 25,5,11,17 DB 23,3,9,15 DB 21,2,8,14 DB 20,26,6,12 DB 18,24,4,10 DB 16,22,27,33 DB 39,45,51,31 DB 37,43,49,29 DB 35,41,47,28 DB 34,40,46,52 DB 32,38,44,50 DB 30,36,42,48 ; ; ; ; ; ENTER HERE AFTER COLD BOOT ; THIS OCCURS ONLY WHEN BOOTING ; FOLLOWING A SYSTEM RESET. ; ; BOOT: MVI A,1 OUT SER1S MVI A,40H OUT SER1S MVI A,4EH OUT SER1S MVI A,37H OUT SER1S MVI A,5 OUT SER1B MVI A,8 ; 1200 BAUD OUT SER1B ; ; NOW INITIALIZE TUART ; XRA A ; INITIALIZE INT PORTS OUT TUA+3 ; PORT A OUT TUB+3 ; PORT B OUT TUB+4 ; DISABLE A/B INVERT LOGIC INR A ; = 1 OUT TUA+2 ; RESET PORT A OUT TUB+2 ; RESET B MVI A,0C0H ; SET TO 9600 OUT TUA OUT TUB ; FOR BOTH PORTS ; LXI H,SMSG CALL PRMSG ; PRINT SIGN-ON MESSAGE XRA A STA 4 JMP GOCPM ;; ; ; ENTER HERE FOR WARM BOOT ; ; WBOOT LXI SP,80H LXI B,CPMB ; SET UP BOOT ADDRESS CALL SETDMA MVI A,NSECTS STA NREC ; SET UP # OF SECTORS TO BOOT MVI C,0 ; SET UP INITIAL DRIVE CALL SELDSK ; SELECT DRIVE A MVI C,0 CALL SETTRK ; SELECT TRACK 00 MVI C,2 CALL SETSEC ; SELECT SECTOR 2 CALL LOADER ; LOAD IN CP/M LESS CBIOS JNZ WERR ; IF ERROR, JUMP ; ; ; GOCPM: MVI A,0C3H ; SET UP CP/M SYSTEM LINKS STA 0 STA 5 LXI H,WBOOTE SHLD 1 ; WARM BOOT LINK LXI H,BDOS SHLD 6 LXI B,80H CALL SETDMA ; DEFAULT BUFFER ADDRESS LDA 4 ; LOAD PRESENT DRIVE # MOV C,A JMP CPMB ; JUMP TO CCP ; ; ; WERR: LXI H,ERMSG CALL PRMSG ; PRINT ERROR MESSAGE HALT ; ; ; PRMSG: MOV A,M ORA A RZ MOV C,A CALL CO INX H JMP PRMSG ; ; ; THIS TABLE IS USED DURING SIGN-ON MESSAGE ; ; ; SMSG: DB 0DH,0AH DB '32' DB 'K CP/M VERS 1.4D' DB 0DH,0AH,00 ERMSG: DB 'WARM BOOT ERROR, HALT' DB 0 ; ; TERMINAL/PRINTER I/O ROUTINES ; CONST: IN TUA ; PORT A STATUS ANI TURDA ; DATA READY BIT HIGH? RZ ; A=0? CMA ; DATA IS THERE (AA=FF) RET ; CI: IN TUA ; INPUT A CHARACTER ANI TURDA JZ CI IN TUA+1 ANI 7FH RET ; CO: IN TUA ; OUTPUT A CHARACTER IN C-REG ANI TUTBE ; TRANSMISSION BUFFER EMPTY? JZ CO MOV A,C ; PICK UP CHARACTER OUT TUA+1 ; AND OUTPUT IT RET ; LST: IN SER1S ; OUTPUT TO PRINTER FROM ANI 1 ; TBE? JZ LST MOV A,C ; PICK UP CHARACTER AND.. OUT SER1D ; OUTPUT THE CHARACTER RET END