IMD 1.18: 5/11/2012 19:46:20 televideo systems ts802 ver 2.1 cbios                MAKESYS COMCPM62 COMF802FBIOSCOM802FCONSMAC= 802FDISKMAC> 802FSUBSMACt802FBIOSMAC802FBOOTMAC+# #.(!+\<72Ix2Gy2H\(͐!I5 \2Ix2Gy2H\ \ ͐8!I5 \2F:D_:GO͇:HO͟}O͋͗2E:F_:E(7!H4:J 6!G4:0_!0802FDATAMAC8 !802FEQU MAC+"#$TSFBOOT COM%TSFBOOT MAC)&'(6 #. (  ^#VMAKESYS Ver. 2.1 $Bootstrap Filename(Or RETURN To Skip) $BDOS Filename(Or RETURN To Skip) $BIOS Filename(Or RETURN To Skip) $MAKESYS Completed. $Destination Drive? $Invalid Drive (Try A,B,C or D). $File Not Found.$Unexpe,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, # 0MAKESYS 81182, COPYRIGHT TELEVIDEO SYSTEMS, INC.1_$͠2F:DO̓2J:FO̓6ͺ8( >+]ͺ8( >,Uͺ8( >>.+A802D:/!\$6#!] 6 #\!/N##~+: ~A8905<## ~.( (cted EOF Encountered.$Disk Write Error.$ $COM"7T&O&a& Ot7ͨ #@w ̰~Čw.>.:.6. 2. ..*.&."....!.$.' .*.-.0*+++"7T&O&a& Ot7ͨ #@w ̰~Čw.>.:.6. 2. ..*.&.".=!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m ʅ xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  w   #!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 35 CPM62.COM"$*|  CONSTRUCTING 62k CP/M vers 2.2$1y{0!B0}y|zx0y0{00܀\X COPYRIGHT (C) 1979, DIGITAL RESEARCH G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER"#!yO#< Ty#O 3߯21y_͸2y2ͽ:ܷ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧ&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :E B 2>: b# : y! 4 5~yy5 6y7 =_͌> ͒> Ò> Ò͘~#͌ì _2<ܯ2 ݇!2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x ހ ނ G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!FILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#N>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "޷"͌#>?͌͘ =_.:;<> Oޅo$>!Y2*O"ʉ@~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇADCOMf^: ! Â$$$ SUB"#"C{2!"E9"1A22!ty)K!G_^#V*C~E ,x: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!   O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^NÎ N#Fyʝ*}|\#u*#DM*6# x±**s#r͡*6#6^>:A#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# ì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6ÈӉxӊʈͷʪ°ڪ°ð j>:yۉ:{ۋ:xۈ~O#0o7o7M.UoFmUoF4 ?     "*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw*S:2E!~Яw>T D^6k-äPYy 5*{zBK52I|46;@RWF 62k CP/M vers 2.2 1>>~!T]6 b:22!3û1*{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"@4;,R|*":ڲ!4<2”>2!"2!"28!"9:O  !:wn&6!y2! ~2`i))))!qy2i`"`i#z n&Y!~w !w ͷ:>ƒyxz   MDJͻK(!r͈͇{H8 >2!"2!"!"222:8Ow{#"G>= w(!{( ( %>##>G: =>""$$(ͼ(y!(y (y 6: !d+| :!!> 2*~\ :| :g:!~5(S:!:O ~G:w>|>= CS">22 :  xG 22*[Kk(͈ *[K>g>2>2:A2!P: !!T:A!cw:_!oh:_!|h!:L!Mr\w#\w 007 uuɯB< 0w# Ͱ ð)+!8+͂+m<χm<χ#L" L TELEVIDEO SYSTEM TS-802 V2.1-]5]5 ʐ- ʐ-̈́5"9>5 >5> 4>5:9-*94.*9~-G+-~/_-~ .=G+~ ..-+<= .+.~>...?*9O #*96 2."9+D`E` Z.b8!x(8#W(y!~(8w!: >#G>>: 22!y2o&))))y2y2C`iɯ2>22>2F2y2 >2:2:2:r:Oˑ:8<2y2w(!=:2>2x2!!SA:!_6>|>~OͰ#N#F#8!~>Gy>y!~ >y>y!^}> >$(>2>2~#G:(O ^#Vs1*N#"N!MA 62k CP/M vers. 2.2 Bios Error: Boot Failure -- Hit any key to retry. Bios 6 > Error on : Track = 99, Sector = 99, FDC status = H READ WRITE Check the disk in drive "", and close the door. * HþkÈð% ×åûuÛÛÛÛÛMÛÛÛÛÛÛh(C) 1981, TELEVIDEO SYSTEMS INC.1:B222!P|G^ͅ!r5128ͥ!,2:(4=2:! ':! :! 4~H8 6:<222<22:2!~6(':! :! :!(4:(:2:2:2:( (22:g.<[: >2: 2>2:>!>!2"!6#~J`AJ` 3J$ ,J)8%S( ~1Y(~286L8 6L L{M6#~'w#~+#~+  (0!+###+!+++:!w+w!w+w!w+w+w+w2~~0O:=22?>&429*9~,b8,O+, ¶,x+~,è,:9*9~-b8,O+, ,x+~,,<*7 ͣ,=-G~# "- *-͗,-x͗,G‰,&‰, "7͝ V- V- \-͗,C-d 1-k-d 1-͗,e-͝ ;ʍ--]5͗, >5͝     ; TEST THE STATUS OF THE CONSOLE INPUT TO ; SEE IF A CHARACTER IS AVAILABLE. ; EXIT: A=0FFH -> CHARACTER AVAILABLE ; A=0 -> NO CHARACTER CONST: CALL IODISP ; DIRECT I/O TO PROPER DEVICE DEFB 0 ; CONSOLE POSITION IN IOBYTE DEFW TTYIST ; COILABLE? LD A,0 RET Z ; NO. A = 0 DEC A ; YES. A = FFH RET ; GRAB A CHARACTER FROM CONSOLE INPUT ; EXIT: A=RETURNED CHARACTER CONIN: CALL IODISP ; DIRECT I/O TO PROPER DEVICE DEFB 0 ; CONSOLE POSITION IN IOBYTE DEFW TTYIN ; C WHEN THERE IS NO INPUT ON CONSOLE CRTIN: CALL CRTST ; CHECK THE STATUS JR Z,CRTIN IN A,(SIOBD0) ; FETCH THE CHARACTER AND 7FH ; STRIP OFF PARITY BIT RET ; OUTPUT A CHARACTER TO THE CONSOLE ; ENTRY: C=CHARACTER TO BE OUTPUT CONOUT: CA ; RESET EXTRN/STATUS COMMAND OUT (SIOBC0),A IN A,(SIOBC0) ; JR CHKOST ; ********* DISABLE XON/XOFF FOR CRT ********* ; MASK BIT CRTMSK TXMT ; OLD 802: 4H 0 NO ; 4 YES ; NEW 8T: AND 00100100B ; CHECK TRANSMITT READY AND CTS CP 00100100B ; READY TO SEND JR Z,CHKOS1 ; YES, CODE FOR SET READY CONDITION NOTRDY: XOR A ; NO, SET NOT READY CONDITION RET ; OUTPUT ROUTINE FOR SERIAL EPSON AND TI ; PRINTER SIO CHANNEL A  ; TRANSFER THE CHARACTER OUT (SIOBD0),A ; OUTPUT THE CHARACTER TO SIO RET ; READER STATUS ROUTINE READST: CALL IODISP ; DIRECT I/O TO PROPER DEVICE DEFB 2 DEFW TTYIST ; STANDARD PRINTER DEVICE DEFW CRTST ; STANDARD CONSOLE DEVICE DEFWNSOLE PRINTER DEVICE DEFW CRTST ; CONSOLE CRT DEVICE DEFW READST ; CONSOLE READER DEVICE DEFW MODIST ; CONSOLE MODEM PORT DEVICE ; PRINTER PORT INPUT STATUS ROUTINE TTYIST: IN A,(SIOBC1) ; READ PRINTER PORT INPUT STATUS JR CHKIST ; MODONSOLE PRINTER DEVICE DEFW CRTIN ; CONSOLE CRT DEVICE DEFW READER ; CONSOLE CURRENT READER DEFW MODIN ; CONSOLE MODEM DEVICE ; INPUT FROM PRINTER PORT TTYIN: CALL TTYIST ; SEE IF CHAR AVAIL JR Z,TTYIN IN A,(SIOBD1) ; GET CHAR ANDLL IODISP ; DIRECT I/O TO PROPER DEVICE DEFB 0 ; CONSOLE POSITION IN IOBYTE DEFW TTYOUT ; CONSOLE PRINTER DEVICE DEFW CRTOUT ; CONSOLE CRT DEVICE DEFW LIST ; CONSOLE CURRENT LIST DEVICE DEFW MODOUT ; CONSOLE MODEM DEVICE ; PRINTER STATU02: 24H 0 NO ; 4 YES ; 24 NO LD B,A LD A,(CRTMSK) AND B CP 04H ; CHECK TRANSMIT READY JR NZ,NOTRDY ; ****************************************** TTYOUT: CALL TTYOST ; CHECK STATUS OF PRINTER JR Z,TTYOUT ; NOT READY, LOOP BACK LD A,C ; GET CHARACTER IN REG. C AND 7FH ; STRIP OFF PARITY OUT (SIOBD1),A ; SEND OUT RET ; OUTPUT ROUTINE FOR MODEM PORT MODOUT: CALL MODOST ; CHECK ST MODIST ; MODEM PORT DEVICE DEFW UR2RDR ; USER DEFINED READER #2 ; PAPER TAPE READER ROUTINE, ; MOSTLY UNUSED. READER: CALL IODISP ; DIRECT I/O TO PROPER DEVICE DEFB 2 ; POSITION OF READER IN IOBYTE DEFW TTYIN ; STANDARD TELETYPE DEVICEEM PORT INPUT STATUS ROUTINE MODIST: IN A,(SIOAC1) ; READ MODEM PORT STATUS JR CHKIST ; CONSOLE STATUS ROUTINE FOR STANDARD ; CRT TERMINAL DEVICE, SIO #0 CHANNEL B CRTST: IN A,(SIOBC0) ; READ SIO STATUS CHKIST: BIT RCVRDY,A ; CHARACTER AVA 7FH RET ; INPUT FROM MODEM PORT MODIN: CALL MODIST ; SEE IF CHAR AVAIL JR Z,MODIN IN A,(SIOAD1) ; GET CHAR RET ; CONSOLE INPUT ROUTINE FOR ; STANDARD CRT TERMINAL DEVICE. ; SIO CHANNEL B. ; MOTOR AND LIGHT OFF IN HALF A SECOND ; S ROUTINE FOR SERIAL ; INTERFACE WITH EPSON AND TI SIO ; #1 CHANNEL B TTYOST: LD A,00010000B ; RESET EXTRN/STATUS COMMAND OUT (SIOBC1),A ; SEN OUT IN A,(SIOBC1) ; READ SIO STATUS JR CHKOST ; CRT OUTPUT STATUS ROUTINE CRTOST: LD A,00010000B**** CHKOS1: XOR A DEC A ; A=FF, Z=0 (TXMT READY/ENABLE FOR CRT) RET ; MODEM OUTPUT STATUS ROUTINE FOR SERIAL OUTPUT MODOST: LD A,00010000B ; RESET EXTRN/STATUS COMMAND OUT (SIOAC1),A ; SEND IT OUT IN A,(SIOAC1) ; READ SIO STATUS CHKOSATUS OF PRINTER JR Z,MODOUT ; NOT READY WAIT LD A,C OUT (SIOAD1),A ; OUTPUT CHAR RET ; OUTPUT ROUTINE FOR STANDARD CRT ; TERMINAL DEVICE, SIO CHANNEL B CRTOUT: CALL CRTOST ; CHECK CHANNEL B TXMIT STATUS JR Z,CRTOUT ; NOT YET. LD A,C  DEFW CRTIN ; STANDARD CONSOLE DEVICE DEFW MODIN ; MODEM PORT DEVICE DEFW UR2RDR ; USER DEFINED READER #2 ; PAPER TAPE PUNCH ROUTINE, ; CURRENTLY DUMMIED OUT, ; PRETTY MUCH. PUNCH: CALL IODISP ; DIRECT I/O TO PROPER DEVICE DEFB    4 ; PUNCH POSITION IN IOBYTE DEFW TTYOUT ; TELETYPE OUTPUT DEFW CRTOUT ; CONSOLE OUTPUT DEFW MODOUT ; MODEM PORT OUTPUT DEFW UP2PUN ; USER DEFINED PUNCH #2 ; OUTPUT ROUTINE FOR LIST DEVICE LIST: CALL IODISP ; DIRECT I/O TO PROPER DENT ; CURRENT BUFFER COUNT INC (HL) ; BUMP IT. UL1L10: IN A,(SIOBC1) ; READ STATUS BIT RCVRDY,A ; DO WE HAVE AN INPUT CHARACTER? JR Z,UL1L20 ; NO. SEND CHARACTER. IN A,(SIOBD1) ; GRAB THE CHARACTER. AND 7FH ; STIP PARITY. CP ASCACK ; IS OW, WAIT FOR ACK. UL1L50: IN A,(SIOBC1) ; THIS IS THE REAL OUTPUT BIT TRXRDY,A ; ROUTINE AND EXIT JR Z,UL1L50 ; LOOP UNTIL TRANSMITTER READY. LD A,C ; CHARACTER HAS BEEN IN REG. C AND 7FH ; ALL THIS TIME. STRIP PARITY. OUT (SIOBD1),A ; SHIP STATUS OF TELETYPE DEVICE DEFW CRTOST ; STATUS OF CRT DEVICE DEFW MODOST ; STATUS OF MODEM PORT OUTPUT DEFW UL1LSS ; STATUS OF USER DEFINED PRINTING DEVICE ; CHECK THE STATUS OF SERIAL PRINTER, ; CP/M UL1 DEVICE UL1LSS: LD HL,UL1CNT ; COF. RET ; END OF 802FCONS.MAC  PAPER TAPE READER, PUNCH AND CONSOLE ; DUMMY ROUTINES. USER MAY FILL OUT LATER. UR2RDR: UP2PUN: LD A,1AH ; RETURN ENE ; ACCEPTS: C = DRIVE SELECT (WITH C=0 FOR SELECT DRIVE"A") ; RETURNS: HL = DPB POINTER OF DRIVE SELECT (IF C=VALID DRIVE NUMBER) ; HL = 0H IF (C=INVALID DRIVE NUMBER) SELDSK: LD HL,0 ; SET HL = ERROR RETURN CODE LD A,C LD (SEKDSK),A VICE DEFB 6 ; LIST POSITION IN IOBYTE DEFW TTYOUT ; OUTPUT TO TELETYPE DEVICE DEFW CRTOUT ; OUTPUT TO CRT DEVICE DEFW MODOUT ; MODEM PORT OUTPUT DEFW UL1LST ; USER DEFINED PRINTING DEVICE ; HERE IS THE SERIAL PRINTER DRIVER, WHICH EXPECIT ACK? JR Z,UL1L60 ; YES, PROCESS IT. UL1L20: LD A,E ; GET UL1SIZ/2 CP (HL) ; IS BUFFER HALF-FULL? JR NZ,UL1L40 ; NO, NO NEED FOR ETX. UL1L30: IN A,(SIOBC1) ; PREPARE FOR OUTPUT. BIT TRXRDY,A ; CAN WE OUTPUT? JR Z,UL1L30 ; NOT YET. LD A IT! RET ; ONLY EXIT POINT. UL1L60: LD A,(HL) ; DID WE EVER SEND AN ETX? SUB E ; I.E., IS BUFFER > = HALF FULL? JR Z,UL1L70 ; YES. JR C,UL1L50 ; NO, SPURIOUS ACK. UL1L70: LD (HL),A ; ADJUST THE BUFFER COUNT JR UL1L50 ; AND SEND THE CURRENT BUFFER COUNT LD A,(UL1SIZ) ; MAX COUNT. CP (HL) ; ROOM FOR MORE CHARACTER? LD A,0FFH ; ANTICIPATE AFFIRMATIVE. RET NZ ; LISTER IS READY. IN A,(SIOBC1) ; OTHERWISE SEE IF WE HAVE BIT RCVRDY,A ; AN INPUT CHARACTER READY. LD A,0FFH ; SAVE DRIVE NUMBER CP MAXDRV+1 ; CHECK FOR VALID DRIVE RET NC ; EXIT WITH HL = 0H ; DRIVE NUMBER IS IN PROPER RANGE LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ; MULTIPLY BY 16 LD DE,DPBASE ; BASE OF PARAMETER BLOCK ADTS ; THE DEVICE ON THE OTHER END TO SUPPORT AN ETX/ACK ; PROTOCOL. PORT USED IS SIO CHANNEL A. UL1LST: LD A,(UL1SIZ) ; SIZE OF PRINTER BUFFER. LD B,A ; FOR LATER. OR A ; CLEAR CARRY RRA ; DIVIDE BY 2 LD E,A ; E <- UL1SIZ/2 LD HL,UL1C,ASCETX ; SEND OFF THE END-OF- OUT (SIOBD1),A ; BLOCK CHARACTER. JR UL1L50 ; NOW OUTPUT THE CHARACTER UL1L40: LD A,B ; ORIGINAL BUFFER SIZE CP (HL) ; CHECK FOR FULL AND OVERFLOW. JR Z,UL1L30 ; FULL, SO SEND ANOTHER ETX JR C,UL1L10 ; OVERFLHARACTER. ; TEST THE STATUS OF THE PRINTER ; THEN RETURN NOT READY FLAG. ; EXIT: A=0 -> PRINTER IS NOT READY ; A=0FFH -> PRINTER IS READY LISTST: CALL IODISP ; DIRECT I/O TO PROPER DEVICE DEFB 6 ; LIST POSITION IN IOBYTE DEFW TTYOST ; ; ANTICIPATE AFFIRMATIVE AGAIN. RET NZ ; WE ARE ASSUMING CHAR. IS AN ACK. XOR A ; WE MUST NOT BE READY YET RET ; PAPER TAPE READER, PUNCH AND CONSOLE ; DUMMY ROUTINES. USER MAY FILL OUT LATER. UR2RDR: UP2PUN: LD A,1AH ; RETURN E ; HOME THE HEADS TO TRACK 0 HOME: LD A,(HSTWRT) ; CHECK WRITE PENDING DATA IN BUFFER OR A JR NZ,HOMED ; IF WRITE DATA PENDING THEN SKIP LD (HSTACT),A HOMED: XOR A LD (SEKTRK),A ; RESET SEEK TRACK TO ZERO RET ; DISK SELECT ENTRY ROUTID HL,DE ; HL=.DPB(CURDSK) RET ; SETTRK -- SET READ/WRITE TRACK ; ACCEPTS: C = TRACK NUMBER SETTRK: LD A,C LD (SEKTRK),A RET ; SETSEC -- SET READ/WRITE SECTOR ; ACCEPTS: C = SECTOR NUMBER SETSEC: LD A,C LD (SEKSEC),A RET ; SETDMA    -- SET READ/WRITE DMA BUFFER ADDRESS SETDMA: LD (DMAADR),BC RET ; SECTRAN -- TRANSLATE SECTOR ; ACCEPTS: BC = LOGICAL SECTOR ; DE = TRANSLATIN TABLE ADDRESS ; RETURNS: HL = PHYSICAL SECTOR SECTRN: LD H,B LD L,C RET ; READ CP/M SEC WRUAL ; WRITE UNALLOCATED? JR NZ,WRIT10 ; CHECK FOR UNALLOC ; WRITING TO AN UNALLOCATED BLOCK LD A,BLKSIZ/128 ; NUMBER OF SECTORS/BLOCK LD (UNACNT),A ; UNALLOCATED SECTORS REMAINING LD A,(SEKDSK) ; CP/M DRIVE. LD (UNADSK),A ; TO UNALLOCATE LD HL,UNATRK ; UNALLOCATED TRACK NO. CP (HL) ; SEEK.TRK = UNALL.TRK? JR NZ,WRIT30 ; SKIP IF NOT ; TRACKS ARE THE SAME LD A,(SEKSEC) ; GET SEEK SECTOR INTO A LD HL,UNASEC CP (HL) ; SEEK.SEC = UNALL.SEC? JR NZ,WRIT30 ; SKIP IF NOT ; LD (UNACNT),A ; RESET UNALLOC. COUNTER = 0 INC A LD (RSFLAG),A ; SET PRE-READ FLAG = YES. ; COMMON CODE FOR READ AND WRITE ROUTINE RDWTCM: XOR A LD (ERFLAG),A ; RESET ERROR FLAG LD A,(SEKSEC) ; CONVERT SEEEK SECTOR TO HOST SECTOR OR A ; CLHST) LD HL,HSTSEC CP (HL) JR Z,RDWT40 ; SKIP IF MATCH ; PROPER DISK, BUT NOT CORRECT SECTOR RDWT10: LD A,(HSTWRT) ; WRITE DATA PENDING IN BUFFER? OR A JR Z,RDWT20 ; NO NEED TO FLUSH BUFFER CALL WRITEHST ; IF YES, THEN WRITE DATA TO DISK INTO BUFFER LD (HSTWRT),A ; RESET PENDING WRITE FLAG ; COPY DATA TO OR FROM BUFFER RDWT40: LD A,(SEKSEC) ; COMPUTE RELATIVE HOST BUFFER ADDRESS AND SECMSK LD H,A LD L,0 SRL H RR L ; HL = ((SEKSEC)&SECMSK)*128 ; HL HAS RELATIVE HOST BUTOR ENTRY POINT ; THIS ROUTINE READ THE SELECTED CP/M SECTOR ; INTO SELECTED DMA BUFFER POINTER READ: XOR A LD (UNACNT),A LD A,1 LD (READOP),A ; SET READ OPERATION LD (RSFLAG),A ; MUST READ DATA LD A,WRUAL LD (WRTYPE),A ; TREAT AS UNALD DISK LD A,(SEKTRK) ; CP/M TRACK NO. LD (UNATRK),A LD A,(SEKSEC) ; CP/M SECTOR NO. LD (UNASEC),A ; CHECK FOR WRITE TO UNALLOCATED SECTOR WRIT10: LD A,(UNACNT) ; ANY UNALLOCATED SECTOR REMAIN? OR A JR Z,WRIT30 ; SKIP IF NOT ; MORE UNALMATCH, MOVE "UNASEC" TO NEXT SECTOR FOR FUTURE REF. INC (HL) ; UNASEC = UNASEC+1 LD A,(HL) CP CPMSPT ; CHECK END OF SECTOR IN CUR.TRACK? JR C,WRIT20 ; SKIP IF NO OVERFLOW ; OVERFLOW TO NEXT TRACK LD (HL),0 ; RESET SECTOR LD A,(UNATRK)EAR CARRY FLAG RRA LD (SEKHST),A ; TEMPORARY SECTOR NO. ; ACTIVE HOST SECTOR? LD HL,HSTACT LD A,(HL) LD (HL),1 ; ALWAY BECOMES 1 OR A JR Z,RDWT20 ; FILL BUFFER IN ACTIVE FLAG = 0 ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? LD A,(S JP NZ,RDWT60 ; ERROR IN WRITING TO DISK ; MAY HAVE TO PRE-READ DATA TO HOST BUFFER RDWT20: LD A,(SEKDSK) LD (HSTDSK),A LD A,(SEKTRK) LD (HSTTRK),A LD A,(SEKHST) LD (HSTSEC),A LD A,(RSFLAG) ; CHECK BUFFER REQUIRES PRE-READ OR A JR Z,RFFER ADDRESS LD DE,HSTBUF ADD HL,DE LD DE,(DMAADR) ; GET/PUT CP/M DATA BUFFER POINTER LD BC,128 ; SET BC = LENGTH TO MOVE LD A,(READOP) ; WHICH WAY? OR A JR NZ,RDWT50 ; SKIP IF READ OPERATION ; WRITE OPERATION, MARK AND SWITCH DIRECTIONLOC JP RDWTCM ; PERFORM THE READ ; WRITE ROUTINE ENTRY POINT ; THIS ROUTINE WRITE THE SELECTED DMA BUUFER POINTER ; INTO SELECTED CP/M SECTOR WRITE: XOR A LD (READOP),A ; SET OPERATION TO WRITE LD A,C ; SAVE WRITE TYPE LD (WRTYPE),A CPLOCATED SECTORS IN THIS BLOCK DEC A ; UNACNT = UNACNT-1 LD (UNACNT),A LD A,(SEKDSK) ; GET SEEK DISK INTO A LD HL,UNADSK CP (HL) ; SEEK.DSK = UNALL.DSK? JR NZ,WRIT30 ; SKIP IF NOT ; DISKS ARE THE SAME LD A,(SEKTRK) ; CP/M TRACK NO.  INC A LD (UNATRK),A ; UNATRK = UNATRK+1 ; MATCH FOUND, MARK AS UNNECESSARY READ WRIT20: XOR A LD (RSFLAG),A ; SET PRE-READ FLAG = NO JR RDWTCM ; PERFORM WRITE CP/M SECTOR ; NOT AN UNALLOCATED SECTOR, REQUIRES PRE-READ WRIT30: XOR A EKDSK) LD HL,HSTDSK CP (HL) ; SAME DISK? JR NZ,RDWT10 ; SKIP IF NOT MATCH ; SAME DISK, SAME TRACK? LD A,(SEKTRK) LD HL,HSTTRK CP (HL) ; SAME TRACK? JR NZ,RDWT10 ; SKIP IF NOT MATCH ; SAME DISK, SAME TRACK, SAME BUFFER? LD A,(SEKDWT30 ; NO PRE-READ REQUIRED CALL READHST ; IF YES, THEN READ DATA FROM DISK JR Z,RDWT30 ; IF NO ERROR, JUMP TO PROCEED XOR A LD (HSTACT),A ; INDICATE DATA IN BUFFER IS NO GOOD JP RDWT60 ; DISK FUNCTION COMPLETE WITH ERROR RDWT30: XOR A ;  LD A,1 LD (HSTWRT),A ; SET WRITE PENDING FLAG ON EX DE,HL ; SOURCE/DESTINATION POINTERS SWAP ; BC INITIALLY 128, DE DESTINATION, HL IS SOURCE POINTER RDWT50: LDIR ; DATA HAS BEEN MOVE TO/FROM HOST BUFFER LD A,(WRTYPE) ; CHECK WRITE T   YPE OPERATION CP WRDIR ; DIRECTORY WRITE? JR NZ,RDWT60 ; IF NOT A DIRECTORY WRITE THEN EXIT ; ALWAYS FLUSH A DIRECTORY BUFFER XOR A LD (HSTWRT),A ; RESET WRITE PENDING FLAG CALL WRITEHST RDWT60: LD A,FDTOUT LD (FDTIME),A LD A,(ERFLAG LD (HL),1 ; INDICATE FLOPPY DISK MOTOR IS ON OR A LD A,(FDDBYT) OUT (FDD),A ; NOW TURN ON FLOPPY JR NZ,RWHS02 ; JUMP IF MOTOR ALREADY ON ; WAIT 250 MS FOR MOTOR TO GET SPEED (38461 EXACT) LD HL,38500 RWHS01: DEC HL LD A,H OR L JRDC OUT (FDCCMD),A ; COMMAND REGISTER CALL WAIT ; WAIT FOR CONTROLLER NOT BUSY JR NZ,RWHS20 ; ERROR ON READ/WRITE LD A,(ERFLAG) ; RETURN CODE OR A ; SET/CLEAR Z FLAG RET ; DISK I/O SUCCESSFUL ; WE HAD AN ERROR ON READ/WRITE OPERATION R. LD A,SEECMD ; THIS IS THE SEEK COMMAND OUT (FDCCMD),A ; GIVE THE ORDER TO FDC ; NOW TEST FOR COMPLETION CALL WAIT ; WAIT UNTIL NOT BUSY AND SEEMSK ; AND OUT TRACK 0 BIT RET ; MAY HAVE FAILED ; THIS ROUTINE LOOPS UNTIL THE FDC IS ; E IT FOR LATER--3.25 BIT FDCRDY,A ; IS THE DEVICE NOT READY?--2.00 JR NZ,WAIT50 ; YES, THIS IS AN ERROR--1.25 PUSH AF ; SAVE REGISTERS--2.75 LD A,(JMPSW) ; GET MESSAGE FLAG--3.25 CP 0 ; MESSAGE ALREADY SENT OUT?--1.75 JR NZ,WAIT30 ; YES, SK) OR A RET ; HERE ARE THE SECTOR READ/WRITE FUNCTIONS. WE ; WANT TO READ/WRITE TO DISK USING THE PARAMETERS ; SECTOR, TRACK, DMA ADDRESS. READHST: LD A,RDSCMD ; FDC READ COMMAND LD HL,RDSTAB ; DMA INITIALIZATION TABLE JR RWHSEC ; CODE CO NZ,RWHS01 RWHS02: LD A,(HSTDSK) LD HL,DRIVE ; CURRENT DRIVE CP (HL) ; SAME DRIVE? CALL NZ,SELDRV ; NO, HARDWARE SELECT THE DRIVE CALL SELSID ; SELECT THE PROPER SIDE ; READY TO READ OR WRITE A PHYSICAL SECTOR LD A,NOTRYS ; NO. OF RETWHS20: CALL RESDMA ; RESET THE DMA ON ABORT LD A,(ERFLAG) ; IF DRIVE NOT READY, BIT FDCRDY,A ; DON'T BOTHER WITH RETRIES RET NZ ; RETURN ERROR FLAG IN A LD HL,RETRY ; MORE RETRIES LEFT? LD A,(HL) DEC (HL) ; BUMP DOWN COUNT OR A JR Z,RW ; THIS ROUTINE DOES THE ACTUAL SEEKING. SEEK: LD HL,TRKTAB ; CURRENT TRACK TABLE LD A,(HSTDSK) ; CURRENT DRIVE LD C,A ; MAKE IT AN INDEX INTO LD B,0 ; TRACK TABLE ADD HL,BC ; ADD IN INDEX LD A,(HL) ; PULL OUT THE TRACK FOR THIS DRIVE OIN A NON-BUSY STATE, OR UNTIL A NOT- ; READY CONDITION IS DETECTED. TIME-OUT ; FOR DRIVE BUSY OCCURS AT APPROX. ; 1.5 SECONDS AFTER COMMAND ; INITIATION. WAIT: LD A,15 ; WE MUST DELAY ABOUT WAIT10: DEC A ; 60 USECS. BEFORE READING JR NZ,WAIT1IP--1.75 DEC BC ; COUNT DOWN--1.50 LD A,B ; --2.25 OR C ; TIME OUT?--1.00 CALL Z,SIGMSG ; YES, PRINT MESSAGE--2.50 WAIT40: POP AF ; RESTORE REGISTERS--2.50 BIT FDCBSY,A ; ARE WE PROCESSING A COMMAND?--2.00 JR NZ,WAIT20 ; NO, RETURN ERRORMMON TO READ AND WRITE WRITEHST: LD A,WTSCMD ; FDC WRITE COMMAND LD HL,WTSTAB ; DMA INITIALIZATION TABLE FOR WRITE RWHSEC: LD (COMAND),A LD (DMATAB),HL LD HL,FDTIME LD (HL),0 ; DISABLE MOTOR INC HL LD A,(HL) ; CHECK FLOPPY DISK MOTORRIES LD (RETRY),A ; ON DISK I/O OPERATION RWHS10: LD HL,(DMATAB) ; GET DMA INITIALIZE PARAMETER POINTER CALL PRTINI ; DO DMA INITIALIZATION. CALL SEEK ; SEEK THE USER DEFINED TRACK JR NZ,RWHS20 ; ADJUST RETRY COUNTER LD A,(COMAND) ; SET UP FHS30 ; ALL DONE, WE FAILED. CALL RESTOR ; SEEK TRACK 0. JR RWHS10 ; LOOP BACK FOR ANOTHER SHOT. RWHS30: CALL ERRPRT ; PRINT DETAILED ERROR MESSAGE LD A,(ERFLAG) ; RETURN ERROR OR A ; SET/CLEAR Z FLAG. RET ; END OF 802FDISK.MAC UT (FDCTRK),A ; SEND IT TO THE CONTROLLER LD B,A ; SAVE FOR LATER LD A,(HSTTRK) ; GET THE SOUGHT-AFTER TRACK. LD (HL),A ; PLACE IT IN TRACK TABLE CP B ; SAME TRACK? RET Z ; YES, NO NEED TO SEEK OUT (FDCDAT),A ; AND GIVE IT TO THE CONTROLLER0 ; THE STATUS. LD (TEMPBC),BC ; SAVE REGISTERS LD (TEMPDE),DE LD (TEMPHL),HL LD BC,0C000H ; TIME OUT FOR 1.25 SECONDS LD A,0 LD (JMPSW),A ; RESET THE FLAG FOR MESSAGE WAIT20: IN A,(FDCCMD) ; READ THE FDC STATUS--2.75 LD (ERFLAG),A ; SAV CODE--3.00 LD (UNMSTA),A ; UNMASKED STATUS (FOR DEBUG) AND ERRMSK ; MASK OFF NON-ERROR BITS LD (ERFLAG),A ; SAVE STATUS FOR LATER WAIT50: LD HL,(TEMPHL) ; RESTORE REGISTERS LD DE,(TEMPDE) LD BC,(TEMPBC) RET WAIT30: CALL CONST ; CONSO   LE STATUS CP 0 ; AVAILABLE INPUT? JR Z,WAIT40 ; NO, SKIP CALL CONIN ; GET CHARACTER CP 03H ; CONTROL-C? JR NZ,WAIT40 ; NO, LOOP BACK POP AF ; RESTORE REGISTERS LD HL,(TEMPHL) LD DE,(TEMPDE) LD BC,(TEMPBC) LD A,FRCCMD ; FORCE TERL SECTOR NO. IN HSTSEC. ; GO AHEAD AND SET THE FDC SECTOR ; REGISTER. SELSID: LD A,(FDDBYT) ; GET THE DRIVE SELECT LATCH IN MEMORY LD C,A ; HOLD IT IN C FOR A BIT. RES 2,C ; CHOOSE SIDE 0, FOR NOW. LD A,(HSTSEC) ; GET THE LOGICAL HOST SECTOR E CURRENT DRIVE FOR LATER LD C,00010000B ; THIS IS THE MASK FOR DRIVE 0 SELD10: OR A ; HAVE WE GOT THE RIGHT MASK? JR Z,SELD20 ; YES. SLA C ; SHIFT DRIVE MASK OVER 1 BIT LEFT. DEC A ; DOWN THE COUNTER. JR SELD10 ; AND LOOP. SELD20: LD A OUT (FDD),A ; HARDWARE LATCH. LD B,MAXDRV ; INITIAL DRIVE NO. RESD10: LD A,B ; SELECT THE DRIVE LD (HSTDSK),A ; STORE IT IN HSTDSK LD HL,DRIVE CALL SELDRV CALL RESTOR ; RESTORE THE HEADS TO TRACK 0 DEC B ; DECREMENT DRIVE NO. JP P,RESFDCCMD),A ; SEND IT. CALL WAIT ; WAIT FOR COMPLETION RET ; RESET THE DMA SIX TIMES TOTAL RESDMA: PUSH BC ; DON'T DESTROY REGGIES LD B,6 ; COUNTER RDMA10: LD A,11000011B ; RESET THE DMA OUT (DMA),A ; SO THAT IT DOESN'T RUN ON. DJNZ RDMA ; GET THE COUNT INC HL ; POINT TO FIRST DATA BYTE OTIR ; BLOCK OUTPUT RET ; ADDITIONAL HARWARE SYSTEM ; HARDWARE INITIALIZATION ; COMES NEXT. HDWINI: CALL RESDSK ; RESET THE DISK SUBSYSTEM LD HL,SIOTAB ; INITIALIZE SIO #1 FOR SERIALMINATE OUT (FDCCMD),A OUT (FDCCMD),A CALL RESDMA ; RESET DMA LD A,0 LD (DEFDSK),A ; SET DEFAULT DRIVE TO A JP WBOOT ; WARM-BOOT ; THIS ROUTINE PRINTS DOOR MESSAGE WHEN THERE IS AN ACCESS TO ; A DRIVE WITH DOOR OPENED SIGMSG: LD A,1 ;  CP PSPT0 ; SECTOR >= THAN MAXIMUM SECTOR? JR C,SELS10 ; IF NOT THEN SELECT SIDE 0 SET 2,C ; CHOOSE SIDE 1. SUB PSPT0 ; DE-BIAS SECTOR NO. SELS10: INC A ; PHYSICAL SECTORS HAVE ORIGIN 1 OUT (FDCSEC),A ; SEND SECTOR TO CONTROLLER LD (TSEC),(FDDBYT) ; GET MEMORY IMAGE OF DRIVE LATCH AND 00001111B ; AND OFF CURRENT DRIVE SELECT BITS. OR C ; OUT WITH THE OLD, IN WITH THE NEW LD (FDDBYT),A ; RESTORE MEMORY IMAGE. OUT (FDD),A ; AND INFORM LATCH ABOUT NEW DRIVE. RET ; RESET THE DISD10 ; LOOP FOR NEXT DRIVE RET ; RESTORE THE HEADS ON THE CURRENTLY ; SELECTED DRIVE TO TRACK 0. THIS IS ; DONE AFTER EACH SEEK, READ, OR, WRITE ; FAILURE. ALSO AT WARM AND COLD BOOT. ; WE MUST RESET THE CURRENT TRACK FOR ; THIS DRIVE ALSO. RE10 ; LOOP FOR ANOTHER TIME POP BC ; RESTORE REGISTER PAIR RET ; ALL DONE ; MISCELANEOUS ROUTINES ; PRINT THE STRING POINTED TO BY HL ; AND TERMINATED BY NULL (0). PRTMSG: LD A,(HL) OR A RET Z ; ALL DONE LD C,A PUSH HL CALL CO PRINTER CALL PRTINI ; BAUD RATE IS SET UP IN PROM CODE ; BY READING THE DIP SWITCH ; INITIALIZE MODEM PORT LD C,CTCP0 ; CTC #0, FOR MODEM PORT LD A,CTCM0 ; CTC #0 CONTROL REGISTER OUT (C),A LD A,BAUD1 ; SET BAUD RATE (300) OUT (CSET FLAG LD (JMPSW),A LD A,(HSTDSK) ; CURRENT DRIVE ADD A,41H ; MAKE IT ASCII LD (VDRIVE),A ; SAVE FOR LATER LD HL,RDYMSG ; PRINT DOOR MESSAGE CALL PRTMSG RET ; SELECT THE PROPER SIDE OF THE ; DISKETTE TO SEEK, DEPENDING ON ; THE LOGICA,A ; SAVE FOR LATER LD A,C ; GET NEW SIDE. LD (FDDBYT),A ; RESTORE IT TO THE MEMORY IMAGE OUT (FDD),A ; AND LATCH RET ; ALL DONE. ; SELECT THE DRIVE IN HARDWARE. ; DRIVE TO BE SELECTED IS PASSED ; IN REGISTER A. SELDRV: LD (HL),A ; SAVK SUBSYSTEM BY RESTORING ; ALL THE HEADS TO TRACK 0. RESTORING ; DRIVES IN REVERSE ORDER ASSURES THAT ; DRIVE A WILL ALWAYS BE SELECTED UPON ; COMPLETION. RESDSK: LD A,00000010B ; INITIALIZE THE FDD LATCH, MOTOR ON LD (FDDBYT),A ; MEMORY IMAGE. STOR: LD A,(HSTDSK) ; GET THE CURRENT DRIVE LD HL,TRKTAB ; BASE ADDRESS OF CURRENT TRACK TABLE LD E,A LD D,0 ; MAKE DRIVE NO. AN INDEX. ADD HL,DE ; ADD IN INDEX. LD (HL),0 ; CLEAR CURRENT TRACK TO 0. LD A,RESCMD ; FDC RESTORE COMMAND OUT (NOUT ; OUTPUT IT POP HL INC HL JR PRTMSG ; AND LOOP BACK ; GENERAL PORT INITIALIZATION ROUTINE ; ENTRY: HL -> PORT ADDRESS ; BYTE COUNT ; DATA ; | ; | PRTINI: LD C,(HL) ; GET PORT ADDRESS INC HL PRTENT: LD B,(HL)),A LD HL,MODTAB ; INITIALIZE MODEM PORT CALL PRTINI ; INITIALIZE TIME AND DATE COUNTER LD C,CTCP3 LD A,10110101B ; INITIALIZE TIMER OUT (C),A LD A,156 ; PRESET TIMER COUNTER OUT (C),A LD HL,CTCI3 LD A,L AND 0FEH ; SET TIMER INTE   RRUPT VECTOR(LSB) OUT (CTCP0),A LD A,10H OUT (SIOBC0),A ; RESET EXT/STATUS LATCH COMMAND IN A,(SIOBC0) AND 20H ; CHECK CTS BIT LD A,24H ; CTS+TXMT READY JR Z,XMIT0 LD A,0FH ; ENABLE XON/XOFF TO CRT LD (SIGNON),A LD A,4 XMIT0: LD (CE? LD A,(IOBYTE) ; RETREIVE CURRENT IOBYTE JR Z,IODI20 ; NO SHIFTING NEEDED IODI10: RRA ; ROTATE BYTE UNTIL DEVICE BITS DJNZ IODI10 ; ARE LINED UP WITH BIT 0 IODI20: AND 03H ; MASK OFF DON'T CARE BITS RLA ; FORM WORD OFFSET LD C,A ;K ; SET STACK POINTER TO LOCAL PUSH AF PUSH HL LD HL,(MSECNT) INC HL LD (MSECNT),HL ; INCREMENT 16-BIT MS COUNTER ; ; LD A,10110111B ; INITIALIZE TIMER ; OUT (CTCP3),A ; LD A,156 ; PRESET TIMER COUNTER (1/100 SEC) ; OUT (CTCP3),A ; LDOUNT CP 029H ; CHECK DATE = 29 JR C,TEXIT ; SKIP IF DATE < 29 ; CALL NC,CHKM28 ; IF DATE >= 29 THEN CHECK MONTH = FEB JR Z,TCOUN3 ; SKIP IF FEB 29TH ; LD A,(HL) ; CHECK DATE = 31 CP 031H CALL NC,CHKM30 ; IF DATE >= 30 THEN CHECK MONTH=4,: LD (HL),0 ; RESET BCD TO 0 TCOUN2: INC HL TCOUN4: LD A,(HL) ; ADD 1 TO NEXT COUNT ADD A,1 DAA LD (HL),A RET ; ; CHECK MONTH = 2 ; RETURN Z = 1 IF YES, ELSE Z = 0 ; CHKM28: INC HL LD A,(HL) DEC HL CP 2 RET ; ; CHECK MONTOD: LD HL,MONTH CALL BCDASC ; CONVERT BCD TO ASCII AND SAVE INTO (DE) INC DE DEC HL ; ADDRESS DATE CALL BCDASC INC DE INC HL ; ADDRESS YEAR INC HL INC HL CALL BCDASC ; SAVE MSB OF YEAR DEC HL ; ADDRESS LSB OF YEAR CALL BCDASC CRTMSK),A ; CRTMSK = 4H(TXMT RDY) OR 24H(CTS+TXMT RDY) RET ; THIS ROUTINE TRANSFERS CONTROL TO ; THE I/O DRIVER INDICATED BY THE ; APPROPRIATE BITS IN IOBYTE (0003H). ; ENTRY: HL -> ; ; ; FORM 16 BITS, B ALREADY 0 ADD HL,BC ; ADD IN BASE ADDRESS LD E,(HL) ; TRANSFER DISPATCH ADDRESS INC HL ; TO REGISTERS DE LD D,(HL) EX DE,HL ; RESULT INTO HL POP DE ; RESTORE REGISTERS POP BC JP (HL) ; OFF WE GO, INTO THE WILD BLUE YO HL,CLOCK CALL TCOUN4 ; COUNT 1/100 SEC. JP NZ,TEXIT ; SKIP IF NOT OVERFLOW 99 (BCD) ; CALL FLOPOFF ; TURN OFF FLOPPY DISK? ; ; ELSE RESET PRECOUNTER AND ADD 1 TO SEC. ; CALL TCOUN1 CP 060H ; CHECK FOR SEC. OVERFLOW JP NZ,TEXIT ; SKIP IF6,9,11? JR Z,TCOUN3 ; SKIP IF MONTH = 4,6,9,11 ; LD A,(HL) CP 032H ; CHECK DATE = 32 JR C,TEXIT ; ; ADJUST MONTH AND RESET SET DATE = 1 ; TCOUN3: LD (HL),1 ; RESET DATE = 1 CALL TCOUN2 ; MONTH = MONTH + 1 CP 013H JR C,TEXIT ; SKIP H = 4,6,9 OR 11 ; RETURN Z = 1, ELSE Z = 0 ; CHKM30: INC HL LD A,(HL) DEC HL CP 4 RET Z CP 6 RET Z CP 9 RET Z CP 011H RET ; ; DATE AND TIME INTERFACE ROUTINE ; ENTRY: READ CURRENT DATE AND TIME ; C-REG = 0 AND DE = DATE; SAVE LSB OF YEAR ; INC DE ; SKIP FILLER LD HL,HOUR CALL BCDASC ; SAVE HOUR INC DE DEC HL CALL BCDASC ; SAVE MINUTE INC DE DEC HL CALL BCDASC ; SAVE SECOND INC DE DEC HL CALL BCDASC ; SAVE 1/100 SEC LD A,(TINITF) ; SET A =  ; IODISP: POP HL ; GET DISPATCH TABLE POINTER PUSH BC ; SAVE PERTINENT REGISTERS PUSH DE LD A,(HL) ; DEVICE TYPE INC HL ; ADVANCE POINTER LD B,A ; SAVE DEVICE TYPE FOR LATER OR A ; WHICH DEVINDER! ; ; TIMER INTERRUPT SERVICE ROUTINE ; Keeps time and date. ; Provides capability to set and read time and date. ; Shuts off floppy disk motor after 30 sec of no access. ; TCOUNT: DI LD (TUSTACK),SP ; SAVE USER STACK LD SP,LSTAC NOT ; CALL TCOUN1 ; ADD 1 TO MINUTE COUNT CP 060H JR NZ,TEXIT ; SKIP IF NOT OVERFLOW ; ; ELSE RESET MINUTE COUNT AND ADD 1 TO HOUR ; CALL TCOUN1 CP 024H ; CHECK OVERFLOW JR NZ,TEXIT ; CALL TCOUN1 ; RESET HOUR TO 0 AND ADD 1 TO DATE CIF MONTH < 13 LD (HL),1 ; RESET MONTH = 1 CALL TCOUN2 ; AND ADD 1 TO YEAR JR NZ,TEXIT ; SKIP IF LSB OF YEAR > 0 CALL TCOUN2 ; ELSE ADD 1 TO MSB OF YEAR COUNT TEXIT: POP HL POP AF LD SP,(TUSTACK) ; RESTORE USER STACK EI RETI TCOUN1 AND TIME BUFFER POINTER ; SET CURRENT DATE AND TIME ; C-REG = 1 AND DE = BUFFER POINTER ; RETURN: CURRENT DATE AND TIME IN USER BUFFER ; FORMAT: MM?DD?YYYY?HH?MM?SS?NN ; TOD: DEC C JR Z,SETOD ; SET CURRENT DATE AND TIME ; RDTINITIALIZE FLAG RET ; ; SET CURRENT DATE AND TIME ; SETOD: LD HL,MONTH CALL ASCBCD LD (HL),A ; SET MONTH INC DE DEC HL CALL ASCBCD LD (HL),A ; SET DATE INC DE LD HL,YEAR+1 CALL ASCBCD LD (HL),A ; SET YEAR MSB DEC HL CALL    ASCBCD ; SET YEAR LSB LD (HL),A ; INC DE LD HL,HOUR CALL ASCBCD LD (HL),A ; SET HOUR DEC HL INC DE CALL ASCBCD LD (HL),A ; SET MINUTE DEC HL INC DE CALL ASCBCD LD (HL),A ; SET SECOND DEC HL XOR A LD (HL),A ; RESET 1/10 OFF? ; FLOPOFF: LD A,(FDTIME) ; MOTOR OFF DISABLE OR A RET Z DEC A ; TIME = TIME - 1 LD (FDTIME),A RET NZ ; EXIT IF NOT TIMEOUT XOR A OUT (FDD),A ; ELSE RESET DRIVE SELECT AND TURN MOTOR OFF LD (MOTFLG),A ; SET MOTOR OFF INDICATION ,RMSG ; READ MESSAGE JR ERR10 WRMSG: LD HL,WMSG ; WRITE MESSAGE ERR10: LD DE,VCMD ; COMMAND MESSAGE ADDRESS IN TABLE LD BC,5 LDIR ; STORE IN TABLE LD A,(HSTDSK) ; CURRENT HOST DISK ADD A,41H ; MAKE IT ASCII LD HL,VDRV ; GET DRIVE TABLET THE TABLE FTAB: PUSH AF ; SAVE REGISTERS RRCA ; ROTATE RIGHT 4 TIMES RRCA RRCA RRCA CALL GHEX ; CONVERT HIGH ORDER 4 BITS TO ASCII LD (HL),A ; STORE INTO TABLE INC HL ; NEXT TABLE LOCATION POP AF ; RESTORE REGISTERS CALL GHEX  EXIT INC A ; OTHERWISE, ADD 1 TO RESULT JR CVDL CVDX: ADD HL,BC ; ADD BACK LAST VALUE EX DE,HL ; SWAP BACK DE AND HL ADD A,'0' ; CONVERT RESULT TO ASCII LD (HL),A ; STORE IT IN OUTPUT AREA INC HL ; BUMP OUTPUT POINTER RET ; CARRIAG0 SEC COUNT TO 0 LD (TINITF),A ; SET DATE AND TIME INITIALIZE FLAG RET ; ; CONVERT 1 BYTE BCD TO 2 BYTES ASCII ; AND SAVE IT INTO (DE) ; BCDASC: LD A,(HL) RRA RRA RRA RRA CALL BCDAS1 LD A,(HL) BCDAS1: AND 0FH OR '0' LD (DE),A  RET ; ; RETURN DE = ADDRESS OF INTERRUPT VECTOR TABLE ; FOR USER PROGRAM WANT TO USE 16-BIT COUNTER ; THAT INCREMENT AT EVERY 10 MS THEN ; DE-2 = LSB COUNT, DE-1 = MSB COUNT INTADD: LD DE,INTVEC ; SET DE=INTERRUPT TABLE ADDRESS RET ;  ADDRESS LD (HL),A LD A,(HSTTRK) ; GET CURRENT TRACK NUMBER LD E,A LD D,0 LD HL,VTRK ; GET TRACK TABLE ADDRESS CALL CVD2 ; CONVERT IT DECIMAL, STORE IN TABLE LD A,(HSTSEC) ; CURRENT SECTOR NUMBER LD E,A LD D,0 LD HL,VSEC CALL CVD LD (HL),A RET ; HEX INTO ASCII ROUTINE GHEX: AND 0FH ; STRIP HIGH 4 BITS CP 10 ; NUMERIC? JR NC,G10 ; YES, SKIP FOR ALPHA ADD A,'0' ; ADD 30 RET G10: ADD A,'A'-10 ; ADD 40 RET ; DECIMAL CONVERSION ROUTINE CVD2: LD BC,10 E RETURN, LINE FEED CRLF: LD C,0DH CALL CONOUT ; PRINT A CR LD C,0AH JP CONOUT ; PRINT A LF ; END OF 802FSUBS.MAC  INC DE RET ; ; CONVERT 2 BYTE ASCII DIGIT TO 1 BYTE BCD ; ASCBCD: LD A,(DE) RLA RLA RLA RLA AND 0F0H LD C,A ; SAVE MSN TO C-REG INC DE LD A,(DE) AND 0FH ; GET LSN OR C ; PACK IT INC DE RET ; ; TURN FLOPPY DRIVES MOTORTHIS ROUTINE FILLS OUT THE DETAILED ERROR MESSAGE TABLE ; OBTAINING VARIABLE VALUES FROM CURRENT STATE. ; THEN CALLS PRTMSG ROUTINE WITH THE TABLE ADDRESS IN HL ERRPRT: LD A,(COMAND) ; CURRENT COMMAND CP 80H ; READ? JR NZ,WRMSG ; NO, SKIP LD HL2 LD HL,VSTAT ; FDC STATUS TABLE ADDRESS LD A,(ERFLAG) ; GET STATUS CODE CALL FTAB ; CONVERT IT AS HEX ASCII, STORE IN TABLE LD HL,ERRMSG ; ERROR MESSAGE TABLE ADDRESS CALL PRTMSG RET ; THIS ROUTINE CONVERTS HEX CODE INTO ASCII AND FILL OU; 2 DIGIT CONVERSION CALL CVD CVD1: LD BC,1 ; 1 DIGIT CONVERSION CALL CVD RET CVD: XOR A EX DE,HL ; SWAP DE(DATA) FOR HL(OUTPUT POINTER) CVDL: OR A ; CLEAR CARRY FLAG SBC HL,BC ; HL(DATA)-BC(POWER OF 10) JP M,CVDX ; IF RESULT=NEG, THEN   UNG WOO LEE ; - ENHANCEMENT FOR V2.0 REV. B FROM V2.0 REV. A(RELEASE) ; -- DRIVE DOOR OPEN MESSAGE ; -- DETAILED ERROR MESSAGE ; -- DISK DRIVE MOTOR & LIGHT OFF WHEN UNUSED ; -- NO SEEK ON THE SAME TRACK ; -- NO SELECT DRIVE FOR THE SAME ; LOGICAL DEVICE ASSIGNMENT ; -- ADD AN ABILITY TO RECOVER FROM DISK SELECT ERROR ; WHEN LOGGING INTO NON-SUPPORTED DRIVE ; - INSTALL STANDARDIZED TIME AND DATE ROUTINE ; TeleVideo Systems Incorporated Proprietary Information. ; This listU $-BDOSLN ; BASE OF CP/M (CCP) BDOS EQU CPMBAS+CCPLEN+6 ; ADDRESS OF BDOS ENTRY SUBTTL 802FBOOT.MAC--COLD/WARM BOOT MODULE PAGE INCLUDE 802FBOOT.MAC SUBTTL 802FCONS.MAC--CONSOLE I/O MODULE PAGE INCLUDE 802FCONS.MAC SUBTTL 802FDISK.M -- PRINTER INTERFACE WITH EPSON SERIAL AS DEFAULT ; -- SIO #1 ADDED TO SERVE FOR PRINTER THROUGH CH. B ; 12-10-81 SUNG WOO LEE ; - REMOVED CTC CH #1 INITIALIZATION ROUTINE NOT TO CHANGE ; THE BAUD RATE SET UP BY PROM FOR PRINTER ; 8-16-82 ing is supplied under the terms of a license ; agreement with TeleVideo Systems Incorporated and may ; not be copied nor disclosed except in accordance with ; the terms of that agreement. PAGE TITLE 802FBIOS.MAC--TELEVIDEO SYSTEM TS-802 CBIOS -- AAC--DISK I/O MODULE PAGE INCLUDE 802FDISK.MAC SUBTTL 802FSUBS.MAC--SUBROUTINES MODULE PAGE INCLUDE 802FSUBS.MAC SUBTTL 802FEQU.MAC--EQUATES MODULE PAGE INCLUDE 802FEQU.MAC SUBTTL 802FDATA.MAC--DATA DEFINITION MODULE PAGE INCLUDE ; CBIOS FOR TELEVIDEO TS-802 SYSTEM ; COPYRIGHT (C) 1981 ; TELEVIDEO SYSTEMS INC. ; 1170 MORSE AVENUE ; SUNNYVALE, CA 94086 ; (408) 745-7760 ; VERSION V2.1 REV B (RELEASE) ; 7-24-81 SUNG WOO LEE ; - SIGN-ON MESSAGE CHANGE ; 8-25-81 S CHUNG MIN CHOI ; - OPTIMIZATION FOR V2.1 REV B FROM V2.0 REV.A ; -- REMOVE PARALLEL PORT I/O INTERFACE ; -- REFORMAT ERROR MESSAGE TO DISTINGUISH BETWEEN BDOS ; AND BIOS ERROR ; -- UPGRADE IOBYTE TO SUPPORT MODEM PORT FOR EACH ; UGUST 16, 1982 .Z80 CSEG .PHASE 0F200H ; BIOS ENTRY POINT ;******************************** ; THE FOLLOWING EQUATES ARE KEPT* ; ISOLATED FROM THE REST FOR * ; PURPOSES OF MOVCPM GENERATION.* ;******************************** CPMBAS EQ 802FDATA.MAC .DEPHASE END SUBTTL 802FEQU.MAC--EQUATES MODULE PAGE INCLUDE 802FEQU.MAC SUBTTL 802FDATA.MAC--DATA DEFINITION MODULE PAGE INCLUDE    ;********************************************************** ;* Bios Jump Table * ;* This is where CP/M calls whenever it needs to do any * ;* input/output operation. User program may also needs * ;* these  DEFS 11 ; RESERVED FOR NEW CP/M MSECNT: DEFB 0 ; LSB DEFB 0 ; MSB 16-BIT COUNTER INCREMENT EVERY 10 MS ; ; SYSTEM INTERRUPT VECTORS ; INTVEC: DMAI0: DEFW RETURN ; DMA INTERRUPT ON READY DMAI1: DEFW RETURN ; DMA INTERRUPT ON MATCH DOI03: DEFW RETURN ; CH B SPECIAL RECEIVE COND SIOI04: DEFW RETURN ; CH A TXMT BUFF EMPTY(RS-422) SIOI05: DEFW RETURN ; CH A EXT/STAT CHANGE SIOI06: DEFW RETURN ; CH A RECEIVE CHAR AVAIL SIOI07: DEFW RETURN ; CH A SPECRT #A INTERRUPT ;PIOI02: DEFW RETURN ; PIO PORT #B INTERRUPT ; NOT IMPLEMENTED INTERRUPTS RETURN: RETI ; AUX JUMP TABLE WTSERV: DEFB 0 JP UNUSED JP UNUSED JP UNUSED JP UNUSED JP UNUSED JP UNUSED JP TOD ; GET/SET TIME AND D,A ; SYSTEM INTERRUPT VECTOR MODE 2 LD HL,INTVEC LD A,H LD I,A IM 2 CALL HDWINI ; INITIALIZE SYSTEM HARDWARE EI LD HL,SIGNON ; PRINT SIGNON MESSAGE CALL PRTMSG JP GOCPM ; DO MORE INITIALIZATION ; WE JUMP TO HERE WHENEVESFER, IN SECTORS WBOO20: PUSH BC ; SAVE REGISTERS PUSH HL PUSH DE LD C,L ; MOVE TRANSFER ADDRESS TO BC LD B,H CALL SETDMA ; SET DATA TRANSFER ADDRESS LD C,D CALL SETTRK ; SET TRACK REGISTER TO D LD C,E CALL SETSEC ; SET SECTOR REGentry points, but note that the location of * ;* this vector changes with different memory size. * ;********************************************************** BIOS: JP BOOT JP WBOOT JP CONST JP CONIN JP CONOUT JP LIST JP PUNCH MAI2: DEFW RETURN ; DMA INTERRUPT ON END OF BLOCK DMAI3: DEFW RETURN ; DMA INTERRUPT ON MATCH & END OF BLOCK CTCI0: DEFW RETURN ; CTC CH #0 INTERRUPT (TIMER) CTCI1: DEFW RETURN ; CTC CH #1 INTERRUPT (TIMER) CTCI2: DEFW RETURN ; CTC CH #2 INTERRUIAL RECEIVE COND SIOI10: DEFW RETURN ; SIO #1 CH B TXMT BUFF EMPTY(RS-232 PORT2) SIOI11: DEFW RETURN ; CH B EXT/STAT CHANGE SIOI12: DEFW RETURN ; CH B RECEIVE CHAR AVAIL SIOI13: DEFW RETURN ; CH B SPECIAL RECEIVE COND SIOI14ATE JP INTADD ; GET INTERRUPT TABLE ADDRESS IN DE ; NOT USED JUMP VECTORS UNUSED: RET ; JUST RETURN ; COPYRIGHT STATEMENT DEFM '(C) 1981, TELEVIDEO SYSTEMS INC.' ; VERSION AND REVISION NUMBER VER: DEFB 2 REV: DEFB 1 ; COME HERER THE USER WANTS ; TO RESTART THE SYSTEM, I. E., REREAD CP/M ; WITHOUT MODIFYING THE BIOS WBOOT: LD SP,CPMBUF+80H ; INITIALIZE STACK POINTER XOR A ; PREVENT BUFFER FLUSH LD (HSTACT),A ; CONDITION ON WRITE ERROR WBOO10: CALL RESDSK ; RESETISTER TO E CALL READ ; READ A SECTOR JR Z,WBOO30 ; READ SUCCESSFUL POP DE ; ELSE RETORE REGISTERS POP HL POP BC LD HL,BOOMSG ; PRINT BOOT ERROR MESSAGE CALL PRTMSG CALL CONIN ; WAIT FOR INPUT FROM OPERATOR CALL CRLF JR WBOO11 WB JP READER JP HOME JP SELDSK JP SETTRK JP SETSEC JP SETDMA JP READ JP WRITE JP LISTST JP SECTRN JP UNUSED JP UNUSED JP UNUSED JP UNUSED JP UNUSED ; INITIIAL VALUE OF IOBYTE IODEF: DEFB 00010101B ; VALUE OF INITIAL IOBYTE PT (TIMER/FDC) CTCI3: DEFW TCOUNT ; CTC CH #3 INTERRUPT (TIMER/WDC) SIOI00: DEFW RETURN ; SIO #0 CH B TXMT BUFF EMPTY(INT TERMINAL) SIOI01: DEFW RETURN ; CH B EXT/STAT CHANGE SIOI02: DEFW RETURN ; CH B RECEIVE CHAR AVAIL SI: DEFW RETURN ; CH A TXMT BUFF EMPTY(RS-232 PORT2) SIOI15: DEFW RETURN ; CH A EXT/STAT CHANGE SIOI16: DEFW RETURN ; CH A RECEIVE CHAR AVAIL SIOI17: DEFW RETURN ; CH A SPECIAL RECEIVE COND ;PIOI01: DEFW RETURN ; PIO PO FROM COLDSTART LOADER BOOT: DI OUT (PROMSW),A ; SHUT PROM OFF (DEBUG) LD SP,CPMBUF+80H ; INITIALIZE STACK POINTER LD A,(IODEF) ; INITIALIZE IOBYTE LD (IOBYTE),A XOR A ; MAKE LOGGED DRIVE 0 LD (DRIVE),A ; SAVE IT FOR LATER LD (LOGDRV) DISK SUBSYSTEM ; INITIALIZE THE TRANSFER PARAMETERS WBOO11: LD C,0 ; SELECT DRIVE ZERO CALL SELDSK ; FROM WHICH TO BOOT LD HL,CPMBAS ; INITIAL DMA ADDRESS LD DE,0002H ; D=INITIAL TRACK, E=INITIAL SECTOR LD B,BDOSLN/RECLEN ; LENGTH OF TRANOO30: POP DE ; ADJUST TRACK AND SECTOR INC E ; BUMP SECTOR NO. LD A,E CP SPT0 ; END OF CURRENT TRACK? JR C,WBOO40 ; NO. LD E,0 ; CYCLE THE SECTOR NO. INC D ; AND INCREMENT THE TRACK WBOO40: POP HL ; RECALL THE TRANSFER ADDRESS LD BC,   RECLEN ; ADD IN A SECTOR ADD HL,BC POP BC ; RESTORE SECTOR COUNT DJNZ WBOO20 ; GO READ NEXT SECTOR. ; CODE SHARED BY BOTH WARM AND COLD STARTS GOCPM: LD BC,CPMBUF ; INITIALIZE DMA ADDRESS CALL SETDMA LD A,JP ; INITIALIZE LOW MEMORY LLECT DRIVE A: GOCPM1: LD C,A ; IN REG-C JP CPMBAS ; TO CCP ; END OF 802FBOOT.MAC (LOGDRV) ; PASS LOGGED DRIVE NO. CP MAXDRV+1 ; CHECK IF LOG DRIVE IS LEGAL JR C,GOCPM1 ; JUMP IF LEGAL XOR A ; IF NOT, SE ; DATA STORAGE ; TIME AND DATE STORAGE CLOCK: DEFB 0 ; 1/100 SEC COUNTER(BCD) 0 TO 59 SECOND: DEFB 0 ; SECOND (BCD) 0 TO 59 MINUTE: DEFB 0 ; MINUTE (BCD) 0 TO 59 HOUR: DEFB 0 ; HOUR (BCD) 1 TO 23 DATE: DEFB 1 ; DATE (BCD) 1 TO 31 MONTT THE DMA DEFB 01101101B ; PORT ADDRESS FOLLOWS DEFB FDCDAT ; FDC DATA PORT ADDRESS DEFW 0FFH ; DISK BUFFER - 1 DEFB 00111100B ; PORT A IS FIXED DEFB 00010000B ; PORT B IS MEMORY, INCREMENTS DEFB 11001101B ; PORT B MEMORY ADDRESS FOLLOWS DENTS DEFB 11001101B ; PORT B MEMORY ADDRESS FOLLOWS DEFW HSTBUF ; ADDRESS OF DISK BUFFER DEFB 10001010B ; READY ACTIVE HIGH, END OF BLOCK DEFB 11001111B ; LOAD REGISTERS DEFB 00000001B ; B -> A, TRANSFER MODE DEFB 11001111B ; LOAD REGISTERS ALIZATION TABLE MODTAB: DEFB SIOAC1 ; PORT ADDRESS DEFB 10 DEFB 11011000B ; RESET CHANNEL DEFB 11011000B ; ANOTHER FOR SAFETY DEFB 00010100B ; EXTRN STAT RESET, WR #4 DEFB 01001100B ; X16 CLOCK 2 STOP BITS DEFB 00010011B ; WRITE TO WR #3 D (0000H),A LD HL,BIOS+3 ; WARM BOOT JUMP ENTRY LD (0001H),HL ; STORE IT LD (0005H),A LD HL,BDOS ; BDOS ENTRY POINT LD (0006H),HL ; STORE IT LD HL,WTSERV LD (1BH),HL ; PROVIDE ENTRY FOR TIME AND DATE XOR A ; CLEAR SERIAL PRINTER BUFFER COH: DEFB 1 ; MONTH (BCD) 1 TO 12 YEAR: DEFB 0 ; YEAR (BCD) 0 TO 99 LSB DEFB 0 ; YEAR (BCD) 0 TO 99 MSB TINITF: DEFB 1 ; DATE AND TIME INITIALIZE FLAG FDTIME: DEFB FDTOUT ; FLOP DISK TIMER(0=DISABLE MOTOR TIMEOUT) MOTFLG: DEFB 0 ; MOTOR OEFW HSTBUF ; ADDRESS OF DISK BUFFER DEFB 10001010B ; READY ACTIVE HIGH, END OF BLOCK DEFB 11001111B ; LOAD REGISTERS DEFB 00000101B ; A -> B, TRANSFER MODE DEFB 11001111B ; LOAD REGISTERS DEFB 10000111B ; ARM THE DMA WTSTAB: DEFB DMA ; PORTDEFB 10000111B ; ARM THE DMA ; SIO INITIALIZATION TABLE FOR ; SERIAL PRINTER, 9600 BAUD, ; ETX/ACK PROTOCOL. SIOTAB: DEFB SIOBC1 ; PORT ADDRESS DEFB 8 ; TABLE SIZE DEFB 00011000B ; CHANNEL RESET DEFB 00011000B ; ANOTHER ONE DEFB 00010100BDEFB 11000001B ; 8 BITS RX, RX ENABLE DEFB 00010101B ; WRITE TO WR #5 DEFB 11101010B ; DTR, 8 BITS TX, RTS, TX ENABLE DEFB 00010001B ; WRITE TO WR #1 DEFB 00000000B ; DISABLE RCV INT ; MESSAGES, MESSAGES SIGNON: DEFB 0EH ; DISABLE XON/XOFF TUNT LD (UL1CNT),A ; ON COLD OR WARM START LD (UNACNT),A ; UNALLOCATED SECTOR COUNT LD (HSTACT),A ; BUFFER INACTIVE LD A,(LOGDRV) ; PASS LOGGED DRIVE NO. CP MAXDRV+1 ; CHECK IF LOG DRIVE IS LEGAL JR C,GOCPM1 ; JUMP IF LEGAL XOR A ; IF NOT, SEN/OFF FLAG (1=ON, 0=OFF) ; TIMER STACK AREA DEFS 8 LSTACK: DEFS 2 TUSTACK: DEFS 2 ; USER STACK ; DMA INITIALIZATION TABLES FOR READ ; AND WRITE OPERATIONS RDSTAB: DEFB DMA ; PORT ADDRESS DEFB 15 ; TABLE COUNT DEFB 11000011B ; RESE ADDRESS DEFB 15 ; TABLE COUNT DEFB 11000011B ; RESET THE DMA DEFB 01101101B ; PORT ADDRESS FOLLOWS DEFB FDCDAT ; FDC DATA PORT ADDRESS DEFW 0FFH ; DISK BUFFER - 1 DEFB 00111100B ; PORT A IS FIXED DEFB 00010000B ; PORT B IS MEMORY, INCREM ; EXTERNAL STATUS RESET, POINT TO WR4 DEFB 01001100B ; X16 CLOCK, 2 STOP BITS DEFB 00000011B ; POINT TO WR3 DEFB 11000001B ; 8 BITS RX, RX ENABLE DEFB 00000101B ; POINT TO WR5 DEFB 11101010B ; DTR, 8 BITS TX, RTS, TX ENABLE ; MODEM PORT INITIO CRT (^N) DEFB 0DH DEFB 0AH DEFB 0AH DEFB 'TELEVIDEO SYSTEM TS-802 V' DEFB REVNUM/10+'0' ; CBIOS REVISION NUMBER DEFB '.' DEFB (REVNUM MOD 10)+'0' DEFB 0DH DEFB 0AH DEFB SMSIZE/10+'0' ; CP/M MEMORY SIZE DEFB (SMSIZE MOD 10)+'0' DEF    B 'k CP/M vers. ' ; CP/M VERSION NUMBER DEFB CPMREV/10+'0' DEFB '.' DEFB (CPMREV MOD 10)+'0' DEFB 0DH DEFB 0AH DEFB 0 ; TERMINATION BOOMSG: DEFB 0DH DEFB 0AH DEFB 'Bios Error: Boot Failure -- ' ; ERROR ON WARM BOOT DEFB 'Hit any key tDEFB 0AH DEFM 'Check the disk in drive "' VDRIVE: DEFS 1 DEFM '", and close the door.' DEFB 0DH DEFB 0AH DEFB 0 ; TEMPORARY STORAGES FOR REGISTERS TEMPBC: DEFW 0 TEMPDE: DEFW 0 TEMPHL: DEFW 0 JMPSW: DEFB 0 ; FLAG FOR DOOR MESSAGE PRI ; DRIVE 1 DISK PARAMETER HEADER HEAD1: DEFW 0 ; ADDR. OF SECTOR TRANSLATE TABLE FOR DISK 1 DEFW 0 ; BDOS SCRATCH WORDS DEFW 0 ; THREE OF THEM DEFW 0 DEFW DIRBUF ; ADDR. OF DIRECTORY BUFFER FOR DISK DEFW DPRMB1 ; ADDR. OF DISK PARAMETECTORY CHECK VECTOR DEFW OFF0 ; NO. OF TRACKS RESERVED FOR SYSTEM ; MISCELLANEOUS INITIALIZED STORAGE UL1SIZ: DEFB 80H ; SIZE OF SERIAL PRINTER BUFFER ; UNALLOCATED STORAGE AREAS DIRBUF: DEFS 128 ; DIRECTORY BUFFER ; DRIVE 0 STORAGE ASEKDSK: DEFS 1 ; SEEK DISK NUMBER SEKTRK: DEFS 1 ; SEEK TRACK NUMBER SEKSEC: DEFS 1 ; SEEK SECTOR NUMBER HSTDSK: DEFS 1 ; HOST DISK NUMBER HSTTRK: DEFS 1 ; HOST TRACK NUMBER HSTSEC: DEFS 1 ; HOST SECTOR NUMBER SEKHST: DEFS 1 ; SEEK HOST SEUF: DEFS HSTSIZ ; HOST DISK I/O BUFFER AREA. UL1CNT: DEFB 0 ; SERIAL PRINTER BUFFER COUNT CRTMSK: DEFS 1 ; TRANSMIT OUT FLAG ; END OF 802FDATA.MAC o retry.' DEFB 0DH DEFB 0AH DEFB 0 ; DETAILED ERROR MESSAGE TABLE ERRMSG: DEFB 0DH DEFB 0AH DEFB 'Bios ' VCMD: DEFS 5 ; COMMAND DEFB ' Error on ' VDRV: DEFS 1 ; DRIVE DEFB ':' DEFB 0DH DEFB 0AH DEFB 'Track = ' VTRK: DEFB '99'NT DRIVE: DEFS 1 ; STORAGE FOR SAVING CURRENT DRIVE NO TSEC: DEFS 1 ; TARGET SECTOR ; HERE ARE THE VERSION 2 DISK PARAMETER TABLES DPBASE: ; DRIVE 0 DISK PARAMETER HEADER HEAD0: DEFW 0 ; ADDR. OF SECTOR TRANSLATE TABLE FOR DISK 0 DEFW 0 ER BLOCK 1 DEFW CHKSV1 ; ADDR. OF CHECK SCRATCHPAD DEFW ALOCV1 ; ADDR. OF DISK ALLOCATION SCRATCHPAD ; HERE ARE THE DISK PARAMETER BLOCKS DPRMB0: DPRMB1: DEFW SPT0 ; NO. OF SECTOR PER TRACK DEFB BSH0 ; BLOCK SHIFT FACTOR DEFB BLM0REA ALOCV0: DEFS (DSM0/8)+1 ; ALLOCATION VECTOR STORAGE CHKSV0: DEFS CKS0 ; CHECK VECTOR STORAGE ; DRIVE 1 STORAGE AREA ALOCV1: DEFS (DSM1/8)+1 ; ALLOCATION VECTOR STORAGE CHKSV1: DEFS CKS1 ; CHECK VECTOR STORAGE ; DISK I/O COMMAND PARAMETECTOR NUMBER HSTACT: DEFS 1 ; HOST ACTIVE FLAG HSTWRT: DEFS 1 ; HOST BUFFER WRITE PENDING FLAG UNACNT: DEFS 1 ; UNALLOATED SECTOR COUNT UNADSK: DEFS 1 ; UNALLOCATED DISK UNATRK: DEFS 1 ; UNALLOCATED TRACK UNASEC: DEFS 1 ; UNALOCATED SECTOR  ; TRACK NUMBER DEFB ', Sector = ' VSEC: DEFB '99' ; SECTOR NUMBER DEFB ', FDC status = ' VSTAT: DEFS 2 ; ERROR STATUS DEFB 'H' DEFB 0DH DEFB 0AH DEFB 0 RMSG: DEFB 'READ ' WMSG: DEFB 'WRITE' ; DOOR MESSAGE TABLE RDYMSG: DEFB 0DH  ; BDOS SCRATCH WORDS DEFW 0 ; THREE OF THEM DEFW 0 DEFW DIRBUF ; ADDR. OF DIRECTORY BUFFER FOR DISK DEFW DPRMB0 ; ADDR. OF DISK PARAMETER BLOCK 0 DEFW CHKSV0 ; ADDR. OF CHECK SCRATCHPAD DEFW ALOCV0 ; ADDR. OF DISK ALLOCATION SCRATCHPAD  ; BLOCK MASK DEFB EXM0 ; EXTENT MASK DEFW DSM0 ; DETERMINES TOTAL STORAGE CAPACITY DEFW DRM0 ; DETERMINES TOTAL NO. OF DIR. ENTRIES DEFB ALL0 ; BLOCK ALLOCATION FOR DIRECTORY DEFB ALH0 ; HIGH ORDER BYTE OF ABOVE DEFW CKS0 ; SIZE OF DIRRS COMAND: DEFS 1 ; CURRENT COMMAND FDDBYT: DEFS 1 ; DRIVE, SIDE, DENSITY, SELECT LATCH RETRY: DEFS 1 ; RETRY COUNT UNMSTA: DEFS 1 ; UNMASKED VERSION OF ABOVE DMATAB: DEFS 2 ; DMA INITIALIZE PARAMETER POINTER ; UNITIALIZED RAM DATA AREAS ERFLAG: DEFS 1 ; ERROR REPORTING RSFLAG: DEFS 1 ; PRE-READ SECTOR FLAG READOP: DEFS 1 ; 0 IF WRITE OPERATION; 1 IF READ OPER. WRTYPE: DEFS 1 ; WRITE OPERATION TYPE DMAADR: DEFS 2 ; LAST DMA ADDRESS TRKTAB: DEFS NODRVS ; CURRENT TRACK TABLE HSTB    E TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ; SIO #0 PORT DEFINITIONS ; CHANNEL B FOR CRT SIOAD0 EQU 0CH ; CHANNEL A DATA PORT FOR SIO 0 SIOAC0 EQU 0EH ; CHANNEL A CONTROL PORT SIOBD0 EQU 0DH ; CHANNEL B+1 ; RESERVED FOR TIMER ONLY CTCM0 EQU 01000111B ; CTC #0 CONTROL REGISTER BAUD1 EQU 80H ; BAUD RATE (300) FOR MODEM PORT ; SIO STATUS BIT DEFINITIONS RCVRDY EQU 0 ; RECEIVE CHARACTER AVAILABLE TRXRDY EQU 2 ; TRANSMITTER BUFFER EMPTY ; FR0 EQU 2 ; FDC TRACK 0 DETECTED FDCCRC EQU 3 ; FDC CRC ERROR ENCOUNTERED FDCSEE EQU 4 ; FDC SEEK ERROR ENCOUNTERED FDCHLD EQU 5 ; FDC HEAD LOAD ACK. FDCPRT EQU 6 ; FDC DISK IS WRITE PROTECTED FDCRDY EQU 7 ; FDC DISK NOT READY BIT ; FDC STATUSACMD EQU 11000000B ; READ SECTOR ADDRESS RDTCMD EQU 11100000B ; READ TRACK WTTCMD EQU 11110000B ; WRITE TRACK FRCCMD EQU 11010000B ; FORCE TERMINATION ; ASCII EQUATES ASCETX EQU 03H ; ASCII END OF TRANSMISSION ASCACK EQU 06H ; ASCII ACKNOWLEDGEO.S. TPD0 EQU 40 ; NUMBER OF TRACKS/DISK BPS0 EQU 256 ; NUMBER OF BYTES/SECTOR NSIDE0 EQU 2 ; NUMBER OF SIDE/DISK PSPT0 EQU 18 ; NUMBER OF PHYSICAL SECTOR/TRACK SPT0 EQU ((BPS0/128)*PSPT0)*NSIDE0 ;NUMBER OF CP/M SECTOR/TRACK SPD0 EQU SPT0*TPD0 ;  DATA PORT FOR SIO 0 SIOBC0 EQU 0FH ; CHANNEL B CONTROL PORT ; SIO #1 PORT DEFINITIONS ; CHANNEL B FOR PRINTER ; A FOR MODEM SIOAD1 EQU 20H ; CHANNEL A DATA PORT FOR SIO 1(MODEM) SIOAC1 EQU 22H ; CHANNEL A CONTROL PORT(MODEM) SIOBD1 DC EQUATES FDCCMD EQU 14H ; FDC STATUS AND COMMAND PORT FDCTRK EQU 15H ; FDC TRACK PORT FDCSEC EQU 16H ; FDC SECTOR PORT FDCDAT EQU 17H ; FDC DATA PORT ; FLOPPY DRIVE SELECT LATCH FDD EQU 18H ; DRIVE SELECT LATCH ; SYSTEM PROM SWITCH AD BYTE MASKS ERRMSK EQU 11011100B ; MASK OFF INSIGNIFICANT BITS SEEMSK EQU 10011000B ; CHECK THE NOT READY BIT DNRMSK EQU 10000000B ; DRIVE NOT READY MASK ; FDC COMMAND BYTES RESCMD EQU 00000000B ; HOME HEAD COMMAND, NO VERIFY SEECMD EQU 0001010MENT ; CP/M EQUATES CPMBUF EQU 80H ; DEFAULT CP/M DMA ADDRESS IOBYTE EQU 0003H LOGDRV EQU 0004H ; CURRENTLY LOGGED DRIVE ADDRESS JP EQU 0C3H ; JUMP OPCODE. RECLEN EQU 128 ; NO. OF BYTES IN CP/M RECORD (SECTOR). BDOSLN EQU 1600H ; LENGTH OF NUMBER OF SECTORS/DISK EPD0 EQU 64 ; NUMBER OF DIRECTORY ENTRIES BLS0 EQU 2048 ; BLOCK SIZE BSH0 EQU 4 ; BLOCK SHIFT FACTOR BLM0 EQU (BLS0/128)-1 ; BLOCK MASK EXM0 EQU 0 ; EXTENT MASK DSM0 EQU ((SPD0-(SPT0*OFF0))/(BLM0+1))-1 ;CP/M BLOCK PER DISK ; REVISION NUMBER AND SYSTEM MEMORY ; SIZE IN REFERENCE TO CP/M 2.2 CBIOS REVNUM EQU 21 ; CBIOS REVISION NUMBER CPMREV EQU 22 ; CP/M REVISION NUMBER SMSIZE EQU 62 ; SYSTEM MEMORY SIZE ; BDOS CONSTANTS ON ENTRY TO WRITE WRALL EQU 0 ;WRITEQU 21H ; CHANNEL B DATA PORT FOR SIO 1 SIOBC1 EQU 23H ; CHANNEL B CONTROL PORT ; CTC PORT DEFINITIONS CTCP0 EQU 08H ; RS-232 MODEM BAUD RATE GENERATOR CTCP1 EQU CTCP0+1 ; RS-232 PRINTER BAUD RATE GENERATOR CTCP2 EQU CTCP1+1 CTCP3 EQU CTCP2DRESS PROMSW EQU 04H ; SYSTEM PROM DISABLE ADDRESS DEFDSK EQU 04H ; DEFAULT DRIVE NUMBER ; DMA PORT ADDRESS DMA EQU 10H ; DMA PORT ADDRESS ; FDC STATUS BITS FDCBSY EQU 0 ; FDC BUSY IS BIT 0 FDCIND EQU 1 ; FDC INDEX HOLE DETECTED FDCT0B ; SEEK TRACK COMMAND HDSCMD EQU 00110100B ; HEAD STEP, PREVIOUS DIRECTION HSICMD EQU 01010100B ; HEAD STEP IN, TOWARD HUB. HSOCMD EQU 01110100B ; HEAD STEP OUT, TOWARD EDGE. RDSCMD EQU 10000000B ; READ SECTOR WTSCMD EQU 10100000B ; WRITE SECTOR RDBDOS, IN BYTES. CCPLEN EQU 800H ; LENGTH OF CCP, IN BYTES ; DISK PARAMETER BLOCKS. ; FIRST COME THE EQUATES ; FOR DISK PARAMETER BLOCKS BPDE EQU 32 ; BYTES/DIRECTORY ENTRY ; DRIVE 0 EQUATES OFF0 EQU 2 ; NUMBER OF TRACK RESERVED FOR CP/M  DRM0 EQU EPD0-1 ; DIRECTORY ENTRIES - 1 ALL0 EQU 10000000B ; DIRECTORY BLOCK BIT MAP LOW ALH0 EQU 0B ; DIRECTORY BLOCK BIT MAP HIGH CKS0 EQU (DRM0+1)/4 ; SIZE OF DIRECTORY CHECK VECTOR ; DRIVE 1 EQUATES OFF1 EQU 2 ; NUMBER OF TRACK RESERVED     FOR CP/M O.S. TPD1 EQU 40 ; NUMBER OF TRACKS/DISK BPS1 EQU 256 ; NUMBER OF BYTES/SECTOR NSIDE1 EQU 2 ; NUMBER OF DISK SIDE PSPT1 EQU 18 ; NUMBER OF PHYSICAL SECTOR/TRACK SPT1 EQU ((BPS1/128)*PSPT1)*NSIDE1 ; NUMBER OF CP/M SECTORS/TRACK SPD1 EQU SM ALLOCATION BLOCK SIZE HSTSIZ EQU BPS0 ; SYSTEM DISK SECTOR SIZE HSTSPT EQU PSPT0*NSIDE0 ; SYSTEM DISK SECTOR PER TRACK HSTBLK EQU HSTSIZ/128 ; CP/M SECTORS/HOST BUFFER CPMSPT EQU HSTBLK*HSTSPT ; CP/M SECTOR PER TRACK SECMSK EQU HSTBLK-1 ; SECTOR MAPT1*TPD1 ; NUMBER OF SECTORS/DISK EPD1 EQU 64 ; NUMBER OF DIRECTORY ENTRIES BLS1 EQU 2048 ; BLOCK SIZE BSH1 EQU 4 ; BLOCK SHIFT FACTOR BLM1 EQU (BLS1/128)-1 ; BLOCK MASK EXM1 EQU 0 ; EXTENT MASK DSM1 EQU ((SPD1-(SPT1*OFF1))/(BLM0+1))-1 ; CP/M BLOSK MAXDRV EQU 1 ; MAXIMUM DRIVE NO. NODRVS EQU MAXDRV+1 ; NO. OF DRIVES IN SYSTEM NOTRYS EQU 10 ; NO. OF RETRIES ON SEEK, READ, WRITE. ; EQUATE FOR FLOPPY MOTOR TIME OUT ; USER CAN MODIFY THE TIME FOR APPLICATION PROGRAM. FDTOUT EQU 5 ; FLOPPY; THIS IS THE CP/M BOOTSTRAP FOR THE SINGLE USER SYSTEM. ; I HAVE WRITTEN IT IN SUCH A WAY THAT IT IS INDEPENDENT ; OF THE PROM CODE, EVEN THOUGH THIS MEANS MORE PROGRAMMING ; OF THE DMA. OTHERWISE, WE WOULD BE FORCED TO MODIFY THE ; PROM CODE EVERY CK PER DISK DRM1 EQU EPD1-1 ; DIRECTORY ENTRIES-1 ALL1 EQU 10000000B ; DIRECTORY BLOCK BIT MAP LOW ALH1 EQU 0B ; DIRECTORY BLOCK BIT MAP HIGH CKS1 EQU (DRM1+1)/4 ; SIZE OF DIRECTORY CHECK VECTOR ; CP/M HOST DISK CONSTANTS BLKSIZ EQU BLS0 ; CP/ MOTOR TIME OUT = 5 SEC. ; END OF 802FEQU.MAC EAD, WRITE. ; EQUATE FOR FLOPPY MOTOR TIME OUT ; USER CAN MODIFY THE TIME FOR APPLICATION PROGRAM. FDTOUT EQU 5 ; FLOPPY1@>y>y!ia>y>>s@ .${%8,}>s@ }{8y>s@ >>>>= G @>y>y!ia>y>>s@ .${%8,}>s@ }{8y>s@ >>>>= G TIME WE WANTED TO MOVE CP/M AROUND IN ; RAM. THE BOOTSTRAP IS OTHERWISE STRAIGHTFORWARD AND ; REQUIRES NO SPECIAL EXPLANATION. IT IS DESIGNED TO BE ; LOADED AND EXECUTED AT 4000H, THE FIRST LOCATION OF NON- ; SWAPPABLE DYNAMIC RAM. ; 7-8-81 SUNG     WOO LEE ; MODIFIED BIOS LENGTH FROM 0600H TO 0D00H FOR INCREASED BIOS LOADING TITLE TSFBOOT.MAC--TELEVIDEO SYSTEM TS-802 BOOTSTRAP--JULY 1, 1981 .Z80 CSEG .PHASE 4000H BOOT: OUT (ENDRAM),A ; NO STACK OPERATIONS BEFORE HERE LD SP,BOOT ; IOOT10 ; SEEK ERROR, TRY AGAIN ; INITIAL VALUES FOR TRACK, SECTOR, AND SECTOR COUNT LD L,0 ; START ON TRACK 0 LD E,2 ; SECTOR 2 LD B,CPMSEC ; NO. OF SECTORS IN CP/M BOOT20: LD A,E CP SPCYL+1 ; TIME TO MOVE TO NEXT TRACK JR C,BOOT30 ; NO 1, (SECONDARY) SUB (SPCYL/2) BOOT40: OUT (FDCSEC),A LD A,C ; CHOOSE SIDE OUT (FDD),A ; WRITE TO FLOPPY SELECT LATCH LD A,RDSCMD ; READ SECTOR COMMAND OUT (FDCCMD),A CALL WAIT ; WAIT FOR COMPLETION JR NZ,BOOT10 ; READ ERROR, START OVER  WAIT20: IN A,(FDCCMD) ; READ THE FDC STATUS BIT FDCRDY,A ; IS THE DEVICE NOT READY? RET NZ ; YES, THIS IS AN ERROR BIT FDCBSY,A ; ARE WE PROCESSING A COMMAND? JR NZ,WAIT20 ; YES, LOOP UNTIL NOT BUSY AND ERRMSK ; MASK OFF NON-ERROR BITS RESEEK ERROR ENCOUNTERED FDCHLD EQU 5 ; FDC HEAD LOAD ACK. FDCPRT EQU 6 ; FDC DISK IS WRITE PROTECTED FDCRDY EQU 7 ; FDC DISK NOT READY BIT ; FDC STATUS BYTE MASKS ERRMSK EQU 11011100B ; MASK OFF INSIGNIFICANT BITS SEEMSK EQU 10011000B ; CHECK TACK FRCCMD EQU 11010000B ; FORCE TERMINATION ; DISK CONFIGURATION EQUATES NUMTRK EQU 40 ; NUMBER OF TRACKS ON DISKETTES MAXTRK EQU NUMTRK-1 ; NUMBER STARTS AT 0 MINTRK EQU 0 ; WHERE TO BEGIN SEEK TEST SPT EQU 18 ; SECTORS PER TRACK SPCYL EQU NITIALIZE THE STACK POINTER ; REPROGRAM THE DMA DESTINATION ADDRESS BOOT10: LD C,DMA ; PORT ADDRESS LD A,10000011B ; DISABLE COMMAND OUT (C),A LD A,11001101B ; BURST MODE, CHANGE B ADDRESS OUT (C),A LD HL,CPMBAS ; NEW TRANSFER ADDRESS OU. ; MOVE TO NEXT TRACK AND SEEK. INC L ; BUMP TRACK NO. LD E,1 ; RESET SECTOR NO. LD A,L OUT (FDCDAT),A ; WRITE TRACK TO DATA REGISTER LD A,SEECMD OUT (FDCCMD),A ; SEEK. CALL WAIT ; WAIT FOR COMPLETION AND SEEMSK ; STRIP OFF NON-SI INC E ; BUMP SECTOR NUMBER LD A,10000011B ; DISABLE THE DMA OUT (DMA),A LD A,11010011B ; CONTINUE OPERATION OUT (DMA),A ; SUBSTITUTE FOR LOAD LD A,10000111B ; ENABLE THE DMA OUT (DMA),A DJNZ BOOT20 ; LOOP ON NEXT SECTOR JP CPMBOO ; T .DEPHASE ; FDC EQUATES FDCCMD EQU 14H ; FDC STATUS AND COMMAND PORT FDCTRK EQU 15H ; FDC TRACK PORT FDCSEC EQU 16H ; FDC SECTOR PORT FDCDAT EQU 17H ; FDC DATA PORT ; DMA PORT ADDRESS DMA EQU 10H ; DMA PORT ADDRESS FDD EQU 18H ; FLHE NOT READY BIT DNRMSK EQU 10000000B ; DRIVE NOT READY MASK ; FDC COMMAND BYTES RESCMD EQU 00000111B ; HOME HEAD COMMAND SEECMD EQU 00010111B ; SEEK TRACK COMMAND HDSCMD EQU 00110111B ; HEAD STEP, PREVIOUS DIRECTION HSICMD EQU 01010111B ; HEAD SSPT*2 ; SECTORS PER CYLINDER BPSEC EQU 100H ; BYTE PER SECTOR ; ********************************************* ; * FOLLOWING CPMBAS(CCP ENTRY POINT ADDRESS) * ; * HAS TO BE CONSULTED WITH 802FBIOS.MAC FOR * ; * FUTURE MOVCPM GENERATION. T (C),L OUT (C),H LD A,11001111B ; LOAD DMA REGISTERS OUT (C),A LD A,10000111B ; ENABLE THE DMA OUT (DMA),A ; HOME THE HEAD TO TRACK 0 LD A,RESCMD ; RESTORE COMMAND OUT (FDCCMD),A CALL WAIT ; WAIT FOR COMPLETION AND SEEMSK JR NZ,BGNIFICANT BITS JR NZ,BOOT10 ; BOOT ERROR, TRY AGAIN BOOT30: LD A,L ; UPDATE TRACK REGISTER OUT (FDCTRK),A LD A,E ; UPDATE SECTOR REGISTER CP (SPCYL/2)+1 ; WHICH SIDE? LD C,00010010B JR C,BOOT40 ; SIDE 0, (PRIMARY) LD C,00010110B ; SIDEJUMP TO CBIOS BOOT ADDRESS ; THIS ROUTINE LOOPS UNTIL THE FDC IS ; IN A NON-BUSY STATE, OR UNTIL A NOT- ; READY CONDITION IS DETECTED. WAIT: LD A,15 ; WE MUST DELAY ABOUT WAIT10: DEC A ; 60 USECS BEFORE READING JR NZ,WAIT10 ; THE STATUS. OPPY SELECT LATCH ENDRAM EQU 04H ; PROM DISABLE PORT ; FDC STATUS BITS FDCBSY EQU 0 ; FDC BUSY IS BIT 0 FDCIND EQU 1 ; FDC INDEX HOLE DETECTED FDCTR0 EQU 2 ; FDC TRACK 0 DETECTED FDCCRC EQU 3 ; FDC CRC ERROR ENCOUNTERED FDCSEE EQU 4 ; FDC TEP IN, TOWARD HUB. HSOCMD EQU 01110111B ; HEAD STEP OUT, TOWARD EDGE. RDSCMD EQU 10000000B ; READ SECTOR WTSCMD EQU 10100000B ; WRITE SECTOR RDACMD EQU 11000000B ; READ SECTOR ADDRESS RDTCMD EQU 11100000B ; READ TRACK WTTCMD EQU 11110000B ; WRITE TR * ; ********************************************* CPMBAS EQU 0DC00H ; CCP ADDRESS FOR 62K SYSTEM CPMLN EQU 1600H ; CP/M SIZE = CCP + BDOS = 1600H BIOSLN EQU 0D00H ; CP/M BIOS SIZE (VARIES) CPMSEC EQU (0FFFFH-CPMBAS)/256+1 ; NUMBER OF SEC    TORS FOR TVI CP/M CPMBOO EQU CPMBAS+CPMLN ; CBIOS COLD START ENTRY POINT END  CP/M SIZE = CCP + BDOS = 1600H BIOSLN EQU 0D00H ; CP/M BIOS SIZE (VARIES) CPMSEC EQU (0FFFFH-CPMBAS)/256+1 ; NUMBER OF SEC                                                                                                                                        !   !   "   "   #   #   $   $   %   %   &   &   '   '