CP/M RMAC ASSEM 1.1 #001 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1 TITLE 'BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97' 2 ; This is a CP/M 3.0 bios for the North Star double density 3 ; controller in a non banked environment. 4 ; 5 ; The present plan is to boot CP/M 3 using an existing 6 ; version of CP/M 2.2 patched to autoload CPM3.COM on bootup. 7 ; 8 ; Later versions will incorporate a loaderbios version for 9 ; direct booting and the Morrow 8 inch disk board perhaps 10 ; using a 1.2 or 1.44 meg drive for IBM compatability. 11 ; 12 ; These routines copyright (c) 1980, 1981, 1982 by Steve Bogolub, 13 ; 2338 S. Scoville Ave., Berwyn, IL 60402. 14 ; (The Jade routines will be replaced with Morrow) 15 ; Jade Double D (tm) 16 ; disk handlers contributed to the public domain for use on Jade 17 ; equipment by special permission of Jade Computer Products. 18 ; This software may be used freely for non-commercial purposes 19 ; only, and may not be sold. 20 ; 21 ; THIS BIOS CONTAINS ROUTINES TO SUPPORT THE 22 ; FOLLOWING HARDWARE: 23 ; 24 ; DISK: NORTH STAR MDS-AD2 DOUBLE DENSITY 5.25" 25 ; FLOPPY DISK UNITS 1 AND 2 AS CP/M DRIVES 26 ; A: AND B: 27 ; 28 ; JADE DOUBLE D REV C 8" FLOPPY DISK UNITS 29 ; 0 AND 1 AS CP/M DRIVES C: AND D: 30 ; 31 ; SERIAL I/O: HORIZON LEFT (LOW) SERIAL I/O PORT AS 32 ; CP/M DEVICE CRT: 33 ; 34 ; 35 ; 36 ; THE GENNED-IN CONSOLE IS DETERMINED BY SOLICITING 37 ; A SPACE CODE (20H) FROM CRT:, TTY:, AND UC1:. IF 38 ; NO SPACE CODE IS RECEIVED AFTER ABOUT EIGHT SECONDS 39 ; (AT 4 MHZ), CRT: IS ASSUMED TO BE THE CONSOLE. IF 40 ; A SPACE IS READ FROM ONE OF THE DEVICES, THAT DEVICE 41 ; IS ASSUMED TO BE THE CONSOLE. 42 ; 43 ; SINCE THIS BIOS IS SO LARGE, MOVCPM SHOULD BE 44 ; RUN FOR TWO LESS THAN THE DESIRED SYSTEM SIZE 45 ; IN K, I.E. SPECIFY 30 FOR A 32K SYSTEM. 46 ; 47 ; *** IMPORTANT BOOTSTRAP INFO *** 48 ; 49 ; THIS BIOS IS INTENDED TO RUN IN THE LAST 50 ; 3.5K OF MEMORY. THE LAST .5K IS SET ASIDE 51 ; FOR A NORTH STAR SECTOR DEBLOCKING BUFFER. 52 ; THE FIRST 3K IS GENNED-IN BIOS CODE, AND 53 ; IS EXPECTED TO RESIDE ON TRACK 0 OF NORTH 54 ; STAR DISK UNIT 1 (A:) IN SECTORS 5-9, AND 55 ; 4. THE NORTH STAR BOOT PROM READS IN SECTOR 56 ; 4 INTO CONSECUTIVE PAGES OF MEMORY, STARTING CP/M RMAC ASSEM 1.1 #002 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 57 ; WITH THE PAGE NUMBER SPECIFIED BY THE FIRST 58 ; BYTE OF SECTOR DATA, THEN JUMPS TO THAT 59 ; ADDRESS + 10 (0AH). THIS BIOS IS SET UP TO 60 ; USE THAT METHOD TO COLD BOOT ITSELF. CODE 61 ; AT THAT ADDRESS READS THE LAST FIVE SECTORS 62 ; OF TRACK ZERO INTO MEMORY AT ADDRESS "BIOS", 63 ; THEN JUMPS TO THE BIOS COLD START ADDRESS. 64 ; THE BIOS COLD BOOT EXPECTS THE JADE DOUBLE D 65 ; CONTROL CODE ("NDCM") TO RESIDE ON SECTORS 66 ; ONE AND TWO OF TRACK ZERO, AND LOADS THOSE 67 ; SECTORS FROM THE DISK INTO THE JADE DD MEMORY, 68 ; THEN RESETS AND STARTS UP THE JADE DD RESIDENT 69 ; Z80. THE BIOS WARM BOOT EXPECTS THE CCP/BDOS 70 ; CODE TO RESIDE ON TRACKS 0-9 OF TRACK ONE 71 ; (IN OTHER WORDS, THE WHOLE TRACK), AND THE 72 ; LAST SECTOR IS EXPECTED TO BE ON TRACK ZERO, 73 ; SECTOR 3. TRACK ZERO, SECTOR ZERO IS RESERVED 74 ; FOR LIFEBOAT-COMPATIBLE ID INFO AND FUTURE 75 ; ADDITIONS. THE MODIFIED VERSION OF SYSGEN 76 ; NAMED "NSGEN" IS SET UP TO TRANSFER CP/M TO 77 ; AND FROM DISK IN THIS REQUIRED MANNER. 78 ; 79 ; WE USE THE Z80 INSTRUCTION "LD A,I" ON ENTRY 80 ; TO THE DISK READ AND WRITE ROUTINES TO GET 81 ; THE STATUS OF THE INTERRUPT FLIP/FLOP, SINCE 82 ; WE MUST DISABLE INTERRUPTS WHILE THE NORTH 83 ; STAR DISK READS OR WRITES ARE PERFORMED. 84 ; USING THE Z80 STATUS, WE CAN RE-ENABLE 85 ; INTERRUPTS AFTER WE LEAVE. THIS CHECK IS 86 ; DONE BY THE ROUTINES "INTDI" AND "INDEN", 87 ; AND CAN EASILY BE REMOVED IF WE EVER GO 88 ; TO A NON-Z80 CPU (NEVER, I HOPE). 89 ; 90 ; 91 ; 92 ; CONSOLE DEFINITIONS 93 ; 94 0000 = MOTHR EQU 000H ;HORIZON MOTHERBOARD BASE 95 0002 = CRT EQU MOTHR+2 ;HORIZON LEFT SERIAL BASE 96 ; 97 ; 98 ************************************************************* 99 * * 100 * BIOS AND LOADER BIOS FOR CP/M 3.0 (BETA V1.2) FOR DJ2D * 101 * CONTROLLER. * 102 * WRITTEN NOVEMBER 1982 BY DAVE HARDY AND KEN JACKSON * 103 * * 104 ************************************************************* 105 106 TITLE 'BIOS AND LOADER BIOS FOR CP/M 3.0' 107 108 ************************************************************* 109 * * 110 * TO INSTALL THIS BIOS INTO CP/M 3.0, PERFORM THE FOLLOWING * 111 * STEPS: * 112 * 1. CONSOLE AND PRINTER I/O ARE SET UP FOR A * CP/M RMAC ASSEM 1.1 #003 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 113 * NORTH STAR MOTHERBOARD * 114 * 2. ADD ANY INITIALIZATION THAT YOU NEED AT TINIT: * 115 * 3. SET THE LDRBIOS EQUATE IN THIS FILE TO TRUE * 116 * 4. RMAC SCB (ASSEMBLE SCB.ASM, SUPPLIED) * 117 * 5. RMAC BIOS3 (ASSEMBLE LDRBIOS) * 118 * 6. REN LDRBIOS.REL=BIOS3.REL * 119 * 7. SET THE LDRBIOS EQUATE IN THIS FILE FALSE * 120 * 8. RMAC BIOS3 (ASSEMBLE BIOS) * 121 * 9. LINK BIOS3[B]=BIOS3,SCB * 122 * 10. GENCPM * 123 * (ANSWER ALL QUESTIONS WITH A CARRIAGE RETURN * 124 * EXCEPT ANSSWER "N" AT "BANK SWITCHED MEMORY?" * 125 * QUESTION, AND ANSWER WITH YOUR TOP PAGE OF * 126 * MEMORY WHEN ASKED "TOP PAGE OF MEMORY?") * 127 * 11. LINK CPMLDR[L100]=CPMLDR,LDRBIOS * 128 * 12. CPMLDR (LOAD AND RUN CP/M 3.0) * 129 * * 130 ************************************************************* 131 132 0000 = FALSE EQU 0 ;DEFINE TRUE AND FALSE 133 FFFF = TRUE EQU NOT FALSE 134 135 ************************************************************* 136 * * 137 * THE FOLLOWING REVISION NUMBER IS IN REFERENCE TO THE CP/M * 138 * 3.0 CBIOS. * 139 * * 140 ************************************************************* 141 142 000A = REVNUM EQU 10 ;BIOS REVISION NUMBER 143 001E = CPMREV EQU 30 ;CP/M REVISION NUMBER 144 145 ************************************************************* 146 * * 147 * THESE ARE THE ROUTINES CALLED FROM THE DJ2D'S BUILT-IN * 148 * EPROM. (MODEL B ONLY) * 149 * * 150 ************************************************************* 151 152 E000 = ORIGIN EQU 0E000H ;EPROM ORIGIN OF YOUR DJ2D BOARD 153 E400 = DJRAM EQU ORIGIN+400H ;RAM ADDRESS 154 E409 = DJHOME EQU DJRAM+9H ;DJ2D TRACK ZERO SEEK 155 E40C = DJTRK EQU DJRAM+0CH ;DJ2D TRACK SEEK ROUTINE 156 E40F = DJSEC EQU DJRAM+0FH ;DJ2D SET SECTOR ROUTINE 157 E412 = DJDMA EQU DJRAM+012H ;SET DMA ADDRESS 158 E415 = DJREAD EQU DJRAM+15H ;READ ROUTINE 159 E418 = DJWRITE EQU DJRAM+18H ;WRITE ROUTINE 160 E41B = DJSEL EQU DJRAM+1BH ;DJ2D SELECT DRIVE ROUTINE 161 E427 = DJSTAT EQU DJRAM+27H ;STATUS ROUTINE 162 E430 = DJSIDE EQU DJRAM+30H ;SET SIDE ROUTINE 163 164 ************************************************************* 165 * * 166 * MISCELLANEOUS INTERNAL BIOS EQUATES. * 167 * WE'VE TRIED TO MAINTAIN COMPATIBILITY WITH THE MORROW'S * 168 * DJ2D BIOS. * CP/M RMAC ASSEM 1.1 #004 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 169 * * 170 ************************************************************* 171 172 0000 = LDRBIOS EQU FALSE ;TRUE IF YOU WANT TO ASSEMBLE AS LOADER BIOS 173 0004 = CDISK EQU 4 ;ADDRESS OF LAST LOGGED DISK 174 0080 = BUFF EQU 80H ;DEFAULT BUFFER ADDRESS 175 0100 = TPA EQU 100H ;TRANSIENT MEMORY 176 0005 = ENTRY EQU 5 ;BDOS ENTRY JUMP ADDRESS 177 000A = RETRIES EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR 178 000D = ACR EQU 0DH ;CARRIAGE RETURN 179 000A = ALF EQU 0AH ;A LINE FEED 180 0020 = SPACE EQU 20H ;ASCII SPACE 181 0004 = MAXDISK EQU 4 ;MAX OF DISK DRIVES 182 001A = CLEAR EQU 1AH ;CLEAR SCREEN CODE FOR LDRBIOS 183 184 57ED = LDAI EQU 057EDH ;Z80 "LD A,I" BYTE-SWAPPED 185 ; FOR "DW" USE 186 ; 187 ; DISK OPERATING SYSTEM ADDRESSES 188 ; 189 0034 = NKSYS EQU 52 ;SYS SIZE IN K BYTES 190 0400 = KBYTE EQU 1024 ;1K BYTE SIZE 191 D000 = CPMSZ EQU NKSYS*KBYTE ;TOP SYSTEM ADDRESS 192 7800 = CPMBS EQU CPMSZ-(22*KBYTE);CP/M BIAS VALUE 193 AC00 = CCP EQU CPMBS+3400H ;ADDRESS OF CCP 194 B400 = BDOS EQU CPMBS+3C00H ;ADDRESS OF BDOS 195 C200 = BIOS EQU CPMBS+4A00H ;ADDRESS OF BIOS 196 6180 = BIOSR EQU 1F80H-BIOS+400H ;DDT LOAD OFFSET 197 ;(LEAVES ROOM FOR NDCM) 198 0004 = DEFDSK EQU 0004H ;DEFAULT DISK FOR CCP 199 0080 = SECSZ EQU 128 ;BYTES PER SECTOR 200 0200 = HSTSIZ EQU 512 ;BYTES PER N* SECTOR 201 ; 202 ; BDOS CONSTANTS ON ENTRY TO WRITE 203 ; 204 0000 = WRALL EQU 0 ;WRITE TO ALLOCATED 205 0001 = WRDIR EQU 1 ;WRITE TO DIRECTORY 206 0002 = WRUAL EQU 2 ;WRITE TO UNALLOCATED 207 ; 208 ; NORTH STAR MEMORY MAPPED I/O ADDRESSES 209 ; 210 E800 = CBOOT EQU 0E800H ;COLD BOOT ROM ADDRESS 211 E900 = WDATA EQU 0E900H ;WRITE DATA. DATA IS 212 ; LOW 8 ADRESS BITS. 213 EA00 = CORDER EQU 0EA00H ;CONTROLLER ORDER 214 EB00 = CCMND EQU 0EB00H ;CONTROLLER COMMAND 215 216 ************************************************************* 217 * * 218 * PUBLIC AND EXTERNAL DECLARATIONS REQUIRED FOR CP/M PLUS. * 219 * * 220 ************************************************************* 221 222 CSEG 223 PUBLIC ?BOOT,?WBOOT,?CONST,?CONIN,?CONO,?LIST,?AUXO,?AUXI 224 PUBLIC ?HOME,?SLDSK,?STTRK,?STSEC,?STDMA,?READ,?WRITE CP/M RMAC ASSEM 1.1 #005 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 225 PUBLIC ?LISTS,?SCTRN 226 PUBLIC ?CONOS,?AUXIS,?AUXOS,?DVTAB,?DEVIN,?DRTBL,?MLTIO,?FLUSH 227 PUBLIC ?MOV,?TIM,?BNKSL,?STBNK,?XMOV 228 IF NOT LDRBIOS 229 L PUBLIC ?INIT,?LDCCP 230 EXTRN @CIVEC,@COVEC,@AIVEC,@AOVEC,@LOVEC,@MXTPA 231 ENDIF ;NOT LDRBIOS 232 233 ************************************************************* 234 * * 235 * THE BIOS JUMP TABLE * 236 * * 237 * THE JUMP TABLE BELOW MUST REMAIN IN THE SAME ORDER, THE * 238 * ROUTINES MAY BE CHANGED, BUT THE FUNCTION EXECUTED MUST BE* 239 * THE SAME. THERE ARE 33 JUMPS IN THE CP/M PLUS BIOS VECTOR* 240 * * 241 ************************************************************* 242 ; 243 0000 C300E8 ?BOOT: JMP CBOOT ;COLD START ENTRY POINT 244 WBOOTE: 245 0003 C3D407 ?WBOOT: JMP WBOOT ;WARM START ENTRY POINT 246 0006 C32904 ?CONST: JMP CONST ;CONSOLE STATUS A=FF=READY 247 0009 C31204 ?CONIN: JMP CONIN ;CONSOLE INPUT DATA IN A 248 COUT: 249 000C C31E04 ?CONO: JMP CONOUT ;CONSOLE OUTPUT DATA IN C 250 000F C37204 ?LIST: JMP LIST ;LIST DEVICE DATA IN C 251 0012 C34504 ?AUXO: JMP AUXOUT ;PUNCH DEVICE NONE 252 0015 C33904 ?AUXI: JMP AUXIN ; READER DEVICE NONE 253 0018 C3E703 ?HOME JMP HOME ;SEEK HOME TRACK 254 001B C30503 ?SLDSK: JMP SETDRV ;SELECT DISK DISK IN C 255 001E C3F303 ?STTRK: JMP SETTRK ;SEEK TRACK TRACK IN BC 256 0021 C3F803 ?STSEC: JMP SETSEC ;SET SECTOR SECTOR IN BC 257 0024 C3FD03 ?STDMA: JMP SETDMA ;SET DMA DMA IN BC 258 0027 C3B904 ?READ: JMP READ ;READ SECTOR 259 002A C3B004 ?WRITE: JMP WRITE ;WRITE SECTOR 260 002D C39304 ?LISTS: JMP LISTST ;RETURN LIST STATUS A=FF=READY 261 0030 C30304 ?SCTRN: JMP SECTRAN ;SECTOR TRANSLATE SECTOR IN BC 262 0033 C33104 ?CONOS: JMP CONOST ; OUTPUT STATUS OF CONSOLE 263 0036 C35004 ?AUXIS: JMP AUXIST ; INPUT STATUS OF AUX. PORT 264 0039 C35804 ?AUXOS: JMP AUXOST ; OUTPUT STATUS OF AUX. PORT 265 003C C36300 ?DVTAB: JMP DEVTBL ; ADDRESS OF CHAR. I/O TABLE 266 003F C36D00 ?DEVIN: JMP DEVINI ;INITIALIZE CHAR. I/O DEVICES 267 0042 C36900 ?DRTBL: JMP DRVTBL ; ADDRESS OF DISK DRIVE TABLE 268 0045 C36D00 ?MLTIO: JMP MULTIO ;SET NUMBER OF LOGICALLY CONSECUITIVE 269 ;SECTORS TO BE READ OR WRITTEN 270 0048 C36700 ?FLUSH: JMP FLUSH ;FORCE PHYSICAL BUFFER FLUSHING FOR 271 ;USER-SUPPORTED DEBLOCKING 272 004B C37100 ?MOV: JMP MOVE ;MEMORY MOVE FOR LARGE MEMORY COPY 273 004E C36D00 ?TIM: JMP ?TIME ;GET THE TIME 274 0051 C36D00 ?BNKSL: JMP SELMEM ;SELECT ALTERNATE BANK OF MEMORY 275 0054 C36D00 ?STBNK: JMP SETBNK ;SELECT BANK FOR DMA OPERATION 276 0057 C36D00 ?XMOV: JMP XMOVE ;SET BANK WHEN A BUFFER IS IN A BANK 277 ; THAN 0 OR 1 278 005A C31BE4 DJDRV JMP DJSEL ;HOOK FOR SINGLE.COM PROGRAM 279 ;RESERVED FOR SYSTEM IMPLEMENTOR 280 005D C36D00 JMP RESERV1 ;RESERVED FOR CP/M PLUS CP/M RMAC ASSEM 1.1 #006 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 281 0060 C36D00 JMP RESERV2 ;RESERVED FOR CP/M PLUS 282 283 ; 284 ; DEVICE TABLE IS NOT IMPLEMENTED, SO RETURN HL=0 285 0063 210000 DEVTBL: LXI H,0 286 0066 C9 RET 287 ; 288 ; FLUSH ROUTINE IS NOT IMPLEMENTED, SO RETURN A=0 289 0067 AF FLUSH: XRA A 290 0068 C9 RET 291 ; 292 ; DRIVE TABLE IS NOT USED, SO RETURN HL=0FFFEH 293 0069 21FEFF DRVTBL: LXI H,0FFFEH 294 006C C9 RET 295 ; 296 ; THE FOLLOWING JUMPS FROM THE BIOS JUMP VECTOR 297 ; ARE NOT IMPLEMENTED: 298 IF LDRBIOS 299 AUXIST: 300 AUXOUT: 301 AUXIN: 302 AUXOST: 303 LIST: 304 LISTST 305 ENDIF ;LDRBIOS 306 DEVINI: 307 MULTIO: 308 XMOVE: 309 SELMEM: 310 SETBNK: 311 RESERV1: 312 RESERV2: 313 ?TIME: 314 006D C9 RET 315 316 ************************************************************* 317 * * 318 * MOVER MOVES 128 BYTES OF DATA. SOURCE POINTER IN DE, DEST * 319 * POINTER IN HL. * 320 * * 321 ************************************************************* 322 323 006E 018000 MOVER LXI B,128 ;LENGTH OF TRANSFER 324 325 ************************************************************* 326 * * 327 * GENERAL PURPOSE MEMORY MOVE SUBROUTINE. * 328 * MOVES BC BYTES FROM DE TO HL * 329 * * 330 ************************************************************* 331 332 0071 1A MOVE: LDAX D 333 0072 77 MOV M,A 334 0073 13 INX D 335 0074 23 INX H 336 0075 0D DCR C CP/M RMAC ASSEM 1.1 #007 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 337 0076 C27100 JNZ MOVE 338 0079 78 MOV A,B 339 007A B1 ORA C 340 007B C8 RZ 341 007C 05 DCR B 342 007D C37100 JMP MOVE 343 ; 344 ; BLOCK - BLOCK MOVE (Z80 LDIR REGISTER USAGE) 345 ; 346 0080 7E BLOCK: MOV A,M ;GET BYTE 347 0081 12 STAX D ;STORE IT 348 0082 23 INX H ;BOP PTRS 349 0083 13 INX D 350 0084 0B DCX B ;COUNT OFF BYTE 351 0085 78 MOV A,B ;CHECK FOR DONE 352 0086 B1 ORA C 353 0087 C28000 JNZ BLOCK ;GO BACK IF NOT 354 008A C9 RET 355 ; 356 ;******************************************************** 357 ; NORTH STAR STUFF FROM HERE DOWN 358 ;******************************************************** 359 ; 360 ; INIT - COLD START ENTRY ** DIRECTORY BUFFER OVERLAY ** 361 ; 362 008B = DIRBUF EQU $ ;BUFFER BEGINNING 363 ; 364 ; SCRATCH RAM FOR BDOS OVERLAY 365 ; 366 010B = D0ALL EQU DIRBUF+SECSZ ;OVERLAY ALLOCATE AND CHECK 367 0122 = D0CHK EQU D0ALL+23 ; BUFFERS HERE TOO 368 0132 = D1ALL EQU D0CHK+16 369 0149 = D1CHK EQU D1ALL+23 370 0159 = D2ALL EQU D1CHK+16 ;NOTE THAT THE JADE DISKS 371 01EF = D2CHK EQU D2ALL+150 ; (C: AND D:) MAY NEED 372 022F = D3ALL EQU D2CHK+64 ; MUCH MORE ALLOC AND 373 02C5 = D3CHK EQU D3ALL+150 ; CHECK SPACE THAN N* 374 0305 = ENDOV EQU D3CHK+64 ;END OF OVERLAY AREA 375 ; 376 ; THE INIT ROUTINE IS ACTUALLY A CONTINUATION OF THE 377 ; COLD BOOT BEGUN DOWN AT "BOOT". 378 ; 379 008B 31F3CF INIT: LXI SP,HSTBUF+HSTSIZ ;SET SP TO SCRATCH AREA 380 008E 2100AC LXI H,CCP ;WHERE TO START CP/M 381 0091 E5 PUSH H 382 0092 AF XRA A ;INIT HORIZON MOTHERBOARD 383 0093 D306 OUT MOTHR+6 384 0095 3208CC STA COLDB ;BIOS NOW IN MEMORY 385 0098 CDC200 CALL DELAY ;DELAY FOR 8251'S 386 009B 3EAE MVI A,0AEH ;INIT SERIAL PORTS 387 009D D303 OUT CRT+1 ;OUTPUT DUMMY MODE TO INSURE 388 009F CDC200 CALL DELAY 389 00A2 3E40 MVI A,040H ; CMD EXPECTED, THEN OUTPUT 390 00A4 D303 OUT CRT+1 ; RESET CMD 391 00A6 CDC200 CALL DELAY 392 00A9 3E4E MVI A,04EH ;MODE: 1 STOP BIT, 16X CLK, CP/M RMAC ASSEM 1.1 #008 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 393 00AB D303 OUT CRT+1 ; 8 DATA BITS, NO PARITY 394 00AD CDC200 CALL DELAY 395 00B0 3E37 MVI A,037H ;CMD: RTS, ER, RXEN, DTR, TXEN 396 00B2 D303 OUT CRT+1 397 00B4 CDC200 CALL DELAY 398 00B7 DB02 IN CRT ;FLUSH RECEIVER INPUTS 399 00B9 21CC00 LXI H,MSGSO ;SIGN-ON MSG ADDRESS 400 00BC CD6A08 CALL MSGOT ;ISSUE MESSAGE 401 ; 402 ; 403 00BF C3F107 JMP CPMLD ;GO PERFORM WARM BOOT FUNCS 404 ; 405 ; THIS DELAY SUBROUTINE IS USED TO HELP US OUT ON 406 ; TIMING WHEN RESETTING THE 8251 CONSOLE SERIAL DEVICE. 407 ; 408 00C2 010006 DELAY: LXI B,600H 409 00C5 0B DEL5: DCX B 410 00C6 78 MOV A,B 411 00C7 B1 ORA C 412 00C8 C2C500 JNZ DEL5 413 00CB C9 RET 414 ; 415 00CC 0D0A4E6F72MSGSO: DB ACR,ALF,'North Star / ' 416 00DB 4469736B20 DB 'Disk Jockey 2D/B ' 417 00EC 3532 DB (NKSYS/10)+'0',(NKSYS MOD 10)+'0' 418 00EE 4B2043502F DB 'K CP/M 2.2 of 02/21/82',ACR,ALF+80H 419 ; 420 IF ($-ENDOV) SHR 15 421 0305 ORG ENDOV ;FILL OUT OVERLAY SIZE 422 ENDIF 423 ; 424 ; SELECT DRIVE - LOGON 425 ; 426 0305 210000 SETDRV: LXI H,0 ;ERROR RETURN CODE 427 0308 79 MOV A,C ;PUT DRIVE # IN A 428 0309 FE04 CPI MAXDISK ;CHECK IF LEGAL DRIVE 429 030B D0 RNC ;NO CARRY IF ILLEGAL 430 030C 32E709 STA SEKDSK ;STORE DRIVE NUMBER 431 030F 43 MOV B,E ;SAVE LOGON REQ REG 432 0310 69 MOV L,C ;L = DISK NUMBER 433 0311 2600 MVI H,0 ;ZERO H REG 434 0313 29 DAD H ; *2 435 0314 29 DAD H ; *4 436 0315 29 DAD H ; *8 437 0316 29 DAD H ; *16 (SIZE OF HEADER) 438 0317 119F09 LXI D,D0DPH ;DRIVE 0 DPH 439 031A 19 DAD D ;HL = DRIVE N DPH 440 031B 22ED09 SHLD DTPTR ;STORE DRIVE TBL PTR 441 ; 442 ; LOG-ON - SET DISK PARAMETER BLOCK 443 ; 444 ; -- CHECK IF LOG-ON REQUESTED 445 ; 446 031E AF XRA A 447 031F 32EF09 STA LOGFLG ;ASSUME NO JADE LOGON 448 0322 78 MOV A,B ;CHECK LOG REQUEST CP/M RMAC ASSEM 1.1 #009 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 449 0323 E601 ANI 001H ;LOG ON BIT TEST 450 0325 C27E03 JNZ NOLOG ;PASS IF NO REQUEST 451 U0328 CD0000 CALL HFLUSH ;MAKE SURE HOST BUF 452 U032B C20000 JNZ LOGERR ; AVAILABLE, OUT ON ERR 453 ; 454 ; SEE IF DISK IS JADE OR NORTH STAR. 455 ; 456 032E 3AE709 LDA SEKDSK ;GET DISK # 457 0331 FE02 CPI 2 458 U0333 D20000 JNC LOGDJ2D ;IF DISK JOCKEY, GO ELSEWHERE 459 ; 460 ; LOG ON NORTH STAR BY READING ID SECTOR, THEN DECIDE 461 ; WHICH TABLE TO USE BASED ON SINGLE OR DOUBLE DENSITY. 462 ; IF DOUBLE DENSITY, LOOK FOR LIFEBOAT 2.X FLAG BYTE 463 ; AT OFFSET 05CH IN THE SECTOR, AND USE LIFEBOAT 2.X 464 ; DPB IF THAT BYTE CONTAINS 0B0H. IF NOT, ASSUME OUR 465 ; NORMAL LIFEBOAT 1.4-COMPATIBLE DPB FOR DOUBLE DENSITY. 466 ; 467 0336 3203CC STA HSTDSK ;GOING TO ACCESS THIS DISK 468 0339 AF XRA A 469 033A 3204CC STA HSTTRK ;TRACK ZERO 470 033D 3205CC STA HSTSEC ;N* SECTOR ZERO 471 0340 CDCB04 CALL INTDI ;INTERRUPTS OFF 472 0343 CD35CC CALL READHST ;READ THE SECTOR 473 0346 CDBF04 CALL INTEN ;INTERRUPTS RESTORED 474 0349 3A06CC LDA ERFLAG ;CHECK FOR READ ERROR 475 034C B7 ORA A 476 U034D C20000 JNZ LOGERR ;LOG-ON ERROR IF SO 477 0350 3A2CCC LDA NSDENS ;IF OK, GET DENSITY FLAG 478 0353 010000 LXI B,TRAN5S ;ASSUME SINGLE DENSITY, 479 0356 112509 LXI D,DPBNSS ; EVEN THO USUALLY WRONG 480 0359 B7 ORA A ;CHECK 481 035A C26E03 JNZ LOGNSD ;GO ON IF RIGHT 482 035D 01DD08 LXI B,TRAN5D ;DOUBLE DENS, COMMON XLATE 483 0360 110509 LXI D,DPBNSD ; BUT ASSUME OUR 1.4 DPB 484 0363 3A4FCE LDA HSTBUF+05CH ;GET LIFEBOAT FLAG BYTE 485 0366 FEB0 CPI 0B0H ;IS IT LIFEBOAT 2.X FLAG? 486 0368 C26E03 JNZ LOGNSD ;KEEP OUR DPB IF NOT 487 036B 111509 LXI D,DPBNSL ;GO TO LIFEBOAT 2.X IF NOT 488 ; 489 036E 2AED09 LOGNSD: LHLD DTPTR ;LOAD DRIVE TBL PTR 490 0371 71 MOV M,C ;SET TRANSLATE TABLE ADDR 491 0372 23 INX H 492 0373 70 MOV M,B 493 0374 010900 LXI B,9 ;PT TO DPB ADDR 494 0377 09 DAD B 495 0378 73 MOV M,E ;SET DPB ADDR 496 0379 23 INX H 497 037A 72 MOV M,D 498 037B C37E03 JMP NOLOG ;GO COMPLETE LOGON NOW 499 ; 500 ; SET UP DEBLOCKING VARIABLES FROM DPB VALUES 501 ; 502 037E CDDC03 NOLOG: CALL DPBAD ;GET DPB ADDR 503 0381 EB XCHG ; IN HL 504 0382 7E MOV A,M ;SET UP DEBLOCK CP/M RMAC ASSEM 1.1 #010 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 505 0383 32F509 STA CPMSPT ; SECTORS PER TRACK 506 0386 23 INX H ;GET TO GROUP MASK 507 0387 23 INX H 508 0388 23 INX H 509 0389 7E MOV A,M ;GET IT 510 038A 3C INR A ;CALC # BLOCKS/GROUP 511 038B 32F409 STA UNAVAL ; AND SAVE THAT 512 038E 110C00 LXI D,12 513 0391 19 DAD D ;PT TO SECTOR SHIFT 514 0392 7E MOV A,M ; BIT FLAG 515 0393 B7 ORA A ;HAVE WE GOT ONE? 516 0394 CA9F03 JZ NOSHF ;PASS IF NOT 517 0397 06FF MVI B,0FFH ;INIT SHIFT COUNT 518 ; 519 0399 04 CALCSH: INR B ;COUNT UP A SHIFT 520 039A 1F RAR ;SEE IF DONE 521 039B D29903 JNC CALCSH ;GO BACK IF NOT YET 522 039E 78 MOV A,B ;SHIFT COUNT TO ACC 523 ; 524 039F 32F609 NOSHF: STA SECSHF ;STORE SHIFT COUNT 525 03A2 7E MOV A,M ;RELOAD BIT FLAG 526 03A3 3D DCR A ;FORM SECTOR MASK 527 03A4 32F709 STA SECMSK ; AND SET IT 528 03A7 2AED09 LHLD DTPTR ;RELOAD PTR 529 03AA 3AEF09 LDA LOGFLG ;WAS JADE LOGGED ON?++++++++++++++++++++ 530 03AD B7 ORA A ;FLAG NON-ZERO IF SO, 531 U03AE C20000 JNZ DSKOK ; GO HANDLE DCM MORE 532 03B1 C9 RET ;IF NOT, DONE, RET ZERO 533 ; 534 ; -- ASSUME 3740 DISKETTE 535 ; 536 03B2 CDC403 LG3740: CALL TR3740 ;SET SECTOR TRANSLATE 537 03B5 CDDC03 CALL DPBAD ;SET REGISTER DE 538 03B8 011000 LXI B,DPBSZ ;DPB SIZE IN BYTES 539 03BB 214F09 LXI H,DPB8 ;ADDRESS OF BLK IMAGE 540 03BE CD8000 CALL BLOCK ;MOVE INTO DPB 541 03C1 C37E03 JMP NOLOG ;GO SET UP (CLEAR) THE 542 ; DEBLOCK VARIABLES 543 ; 544 ; -- SET 3740 SECTOR TRANSLATION 545 ; 546 03C4 113509 TR3740: LXI D,TRAN8 ;SECTOR TRAN TBL ADDR 547 ; 548 03C7 2AED09 TRCOM: LHLD DTPTR ;ADDR DISK PARA HDER 549 03CA 73 MOV M,E 550 03CB 23 INX H 551 03CC 72 MOV M,D 552 03CD C9 RET 553 ; 554 ; -- SET 1024 BYTES/SECTOR TRANSLATION 555 ; 556 03CE 115F09 TR1024: LXI D,TRN124 ;SECTOR TRAN TBL ADDR 557 03D1 C3C703 JMP TRCOM ;GO SET IT 558 ; 559 ; -- SET NO SECTOR TRANSLATION 560 ; CP/M RMAC ASSEM 1.1 #011 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 561 03D4 AF TRNONE: XRA A ;ZERO A REG 562 03D5 2AED09 LHLD DTPTR 563 03D8 77 MOV M,A 564 03D9 23 INX H 565 03DA 77 MOV M,A 566 03DB C9 RET 567 ; 568 ; -- GET DRIVE PARA BLK ADDR 569 ; 570 03DC 2AED09 DPBAD: LHLD DTPTR ;ADDR DISK PARA HDED 571 03DF 110A00 LXI D,10 ;DPB TBL PNTR OFFSET 572 03E2 19 DAD D ;NOW AT DPB PNTR 573 03E3 5E MOV E,M ;LOAD INTO DE 574 03E4 23 INX H 575 03E5 56 MOV D,M 576 03E6 C9 RET ;RETURN TO LOG USER 577 578 ************************************************************* 579 * * 580 * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * 581 * * 582 ************************************************************* 583 584 03E7 0E00 HOME MVI C,0 ;TRACK TO SEEK TO 585 03E9 3AEC09 LDA HSTWRT ;CHECK FOR PENDING WRITE 586 03EC B7 ORA A 587 03ED C2F303 JNZ SETTRK 588 03F0 32EB09 STA HSTACT ;CLEAR HOST ACTIVE IF NOT 589 590 ************************************************************* 591 * * 592 * SETTRK SAVES THE TRACK # TO SEEK TO. NOTHING IS DONE AT * 593 * THIS POINT, EVERYTHING IS DEFFERED UNTIL A READ OR WRITE. * 594 * * 595 ************************************************************* 596 597 03F3 79 SETTRK MOV A,C ;A <- TRACK # 598 03F4 32F5CF STA CPMTRK ;CP/M TRACK # 599 03F7 C9 RET 600 601 ************************************************************* 602 * * 603 * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * 604 * ACTUAL READ OR WRITE IS ATTEMPTED. * 605 * * 606 ************************************************************* 607 608 03F8 79 SETSEC MOV A,C ;SAVE THE SECTOR NUMBER 609 03F9 32F3CF STA CPMSEC ;CP/M SECTOR # 610 03FC C9 RET 611 612 ************************************************************* 613 * * 614 * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * 615 * * 616 ************************************************************* CP/M RMAC ASSEM 1.1 #012 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 617 618 03FD 60 SETDMA MOV H,B ;HL <- BC 619 03FE 69 MOV L,C 620 03FF 223D07 SHLD CPMDMA ;CP/M DMA ADDRESS 621 0402 C9 RET 622 623 ; 624 ; SECTOR TRANSLATION+++++++++++++++++++++++++++++++++++++++++++++++++ 625 ; 626 0403 7B SECTRAN: MOV A,E ;IS THERE A TABLE? 627 0404 B2 ORA D 628 0405 CA0E04 JZ JTRAN ;JADE SPECIAL XLATE IF NOT 629 0408 EB XCHG ;MAP OFF TABLE IF SO 630 0409 09 DAD B 631 040A 6E MOV L,M 632 040B 2600 MVI H,0 633 040D C9 RET 634 ; 635 040E 60 JTRAN: MOV H,B ;JADE XLATE OFF BY ONE 636 040F 69 MOV L,C ; SO FIX FOR CALLER 637 0410 23 INX H 638 0411 C9 RET ; THEN DONE 639 ************************************************************* 640 * * 641 * TERMINAL DRIVER SUBROUTINES. IOBYTE IS NOT USED. * 642 * NOTE THAT THE CONSOLE DEVICE IS NOT THE DJ2D MEMORY * 643 * MAPPED SERIAL I/O PORT. THE NORTHSTAR SERIAL PORT IS * 644 * USED INSTEAD. * 645 * * 646 ************************************************************* 647 648 ;I/O ROUTINES FOR NORTHSTAR MOTHERBOARD 649 650 ************************************************************* 651 * * 652 * LEFT SERIAL PORT ROUTINES. CONSOLE I/O * 653 * * 654 ************************************************************* 655 ************************************************************* 656 * * 657 * LEFT SERIAL PORT ROUTINES. CONSOLE INPUT * 658 * * 659 ************************************************************* 660 661 CONIN: ;READ A CHARACTER 662 0412 DB03 IN 03H 663 0414 E602 ANI 02H 664 0416 CA1204 JZ CONIN ;WAIT TILL A CHARACTER IS 665 ; READY 666 0419 DB02 IN 02H ;GET THE CHARACTER 667 041B E67F ANI 7FH ;STRIP PARITY 668 041D C9 RET 669 670 ************************************************************* 671 * * 672 * LEFT SERIAL PORT ROUTINES. CONSOLE OUTPUT * CP/M RMAC ASSEM 1.1 #013 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 673 * * 674 ************************************************************* 675 676 CONOUT: ;WRITE A CHARACTER 677 041E DB03 IN 03H 678 0420 E601 ANI 01H 679 0422 CA1E04 JZ CONOUT ;WAIT TILL THE BUFFER IS 680 ; EMPTY 681 0425 79 MOV A,C ;WRITE THE CHARACTER 682 0426 D302 OUT 02H 683 0428 C9 RET 684 685 ************************************************************* 686 * * 687 * LEFT SERIAL PORT ROUTINES. CONSOLE INPUT STATUS * 688 * * 689 ************************************************************* 690 691 CONST: ;RETURN INPUT BUFFER STATUS 692 0429 DB03 IN 03H 693 042B E602 ANI 02H 694 042D C8 RZ ;RETURN NOT READY 695 042E 3EFF MVI A,0FFH 696 0430 C9 RET ;THERE IS A CHARACTER READY 697 698 ************************************************************* 699 * * 700 * LEFT SERIAL PORT ROUTINES. CONSOLE OUT STATUS * 701 * * 702 ************************************************************* 703 704 CONOST: ;RETURN OUTPUT BUFFER STATUS 705 0431 DB03 IN 03H 706 0433 E601 ANI 01H 707 0435 C8 RZ ;RETURN NOT READY 708 0436 3EFF MVI A,0FFH 709 0438 C9 RET ;RETURN READY 710 711 IF NOT LDRBIOS 712 ************************************************************* 713 * * 714 * RIGHT SERIAL PORT ROUTINES. RIGHT INPUT * 715 * * 716 ************************************************************* 717 718 AUXIN: ;READ A CHARACTER 719 0439 DB05 IN 05H 720 043B E602 ANI 02H 721 043D CA3904 JZ AUXIN ;WAIT TILL A CHARACTER IS 722 ; READY 723 0440 DB04 IN 04H ;GET THE CHARACTER 724 0442 E67F ANI 7FH ;STRIP PARITY 725 0444 C9 RET 726 727 ************************************************************* 728 * * CP/M RMAC ASSEM 1.1 #014 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 729 * RIGHT SERIAL PORT ROUTINES. RIGHT OUTPUT * 730 * * 731 ************************************************************* 732 733 AUXOUT: ;WRITE A CHARACTER 734 0445 DB05 IN 05H 735 0447 E601 ANI 01H 736 0449 CA4504 JZ AUXOUT ;WAIT TILL THE BUFFER IS 737 ; EMPTY 738 044C 79 MOV A,C ;WRITE THE CHARACTER 739 044D D304 OUT 04H 740 044F C9 RET 741 742 ************************************************************* 743 * * 744 * RIGHT SERIAL PORT ROUTINES. RIGHT INPUT STATUS * 745 * * 746 ************************************************************* 747 748 AUXIST: ;RETURN INPUT BUFFER STATUS 749 0450 DB05 IN 05H 750 0452 E602 ANI 02H 751 0454 C8 RZ ;RETURN NOT READY 752 0455 3EFF MVI A,0FFH 753 0457 C9 RET ;THERE IS A CHARACTER READY 754 755 ************************************************************* 756 * * 757 * RIGHT SERIAL PORT ROUTINES. RIGHT OUT STATUS * 758 * * 759 ************************************************************* 760 761 AUXOST: ;RETURN OUTPUT BUFFER STATUS 762 0458 DB05 IN 05H 763 045A E601 ANI 01H 764 045C C8 RZ ;RETURN NOT READY 765 045D 3EFF MVI A,0FFH 766 045F C9 RET ;RETURN READY 767 768 ************************************************************* 769 * * 770 * PARALLEL PORT ROUTINES. PARALLEL INPUT * 771 * * 772 ************************************************************* 773 774 PARIN: ;READ A CHARACTER 775 0460 DB06 IN 06H 776 0462 E601 ANI 01H 777 0464 CA6004 JZ PARIN ;WAIT TILL A CHARACTER IS 778 ; READY 779 0467 DB00 IN 00H ;GET THE CHARACTER 780 0469 F5 PUSH PSW 781 046A 3E30 MVI A,30H ;RESET THE PARALLEL INPUT 782 ; FLAG 783 046C D306 OUT 06H 784 046E F1 POP PSW CP/M RMAC ASSEM 1.1 #015 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 785 046F E67F ANI 7FH ;STRIP PARITY 786 0471 C9 RET 787 788 ************************************************************* 789 * * 790 * PARALLEL PORT ROUTINES. PRINTER OUTPUT * 791 * * 792 ************************************************************* 793 794 LIST: ;WRITE A CHARACTER 795 0472 DB06 IN 06H 796 0474 E602 ANI 02H 797 0476 CA7204 JZ LIST ;WAIT TILL THE BUFFER IS 798 ; EMPTY 799 0479 3E20 MVI A,20H ;RESET THE PARALLEL OUTPUT 800 ; FLAG 801 047B D306 OUT 06H 802 047D 79 MOV A,C ;WRITE THE CHARACTER, STROBE 803 ; BIT 7 804 047E F680 NSPOUT: ORI 80H 805 0480 D300 OUT 00H 806 0482 E67F ANI 7FH 807 0484 D300 OUT 00H 808 0486 F680 ORI 80H 809 0488 D300 OUT 00H 810 048A C9 RET 811 812 ************************************************************* 813 * * 814 * PARALLEL PORT ROUTINES. INPUT STATUS * 815 * * 816 ************************************************************* 817 818 PINPST: ;RETURN INPUT BUFFER STATUS 819 048B DB06 IN 06H 820 048D E601 ANI 01H 821 048F C8 RZ ;RETURN NOT READY 822 0490 3EFF MVI A,0FFH 823 0492 C9 RET ;RETURN READY 824 825 ************************************************************* 826 * * 827 * PARALLEL PORT ROUTINES. LIST DEVICE STATUS * 828 * * 829 ************************************************************* 830 831 LISTST: ;RETURN OUTPUT BUFFER STATUS 832 0493 DB06 IN 06H 833 0495 E602 ANI 02H 834 0497 C8 RZ ;RETURN NOT READY 835 0498 3EFF MVI A,0FFH 836 049A C9 RET ;RETURN READY 837 ENDIF ;NOT LDRBIOS 838 839 840 ; CP/M RMAC ASSEM 1.1 #016 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 841 ; HXBOT DISPLAYS HEXIDECIMAL EQUIV OF ACC CONTENTS. 842 ; 843 049B F5 HXBOT: PUSH PSW ;SAVE CHAR 844 049C 0F RRC ;SWAP NIBBLES 845 049D 0F RRC 846 049E 0F RRC 847 049F 0F RRC 848 04A0 CDA404 CALL HXNOT ;OUTPUT HIGH NIBBLE 849 04A3 F1 POP PSW ; THEN LOW NIBBLE 850 04A4 E60F HXNOT: ANI 0FH ;STRIP HIGH NIBBLE 851 04A6 C690 ADI 90H ;CVT TO ASCII DECIMAL 852 04A8 27 DAA 853 04A9 CE40 ACI 40H 854 04AB 27 DAA 855 04AC 4F MOV C,A ;CHAR TO C 856 04AD C31E04 JMP CONOUT ;THRU VECTOR TO CONOUT 857 ; 858 ; DEBLOCKING DISK WRITE 859 ; 860 04B0 CDCB04 WRITE: CALL INTDI ;MASK INTERRUPTS 861 04B3 CDFC04 CALL DSKWR ;DO THE WRITE 862 04B6 C3BF04 JMP INTEN ;GO RESTORE INTS 863 ; 864 ; DEBLOCKING DISK READ. NOTE THAT ON DEBLOCKING READ 865 ; AND WRITE, THE CALLER SECTOR NUMBERS RANGE FROM 1-XX 866 ; DECIMAL. THIS IS FOR COMPATIBILITY WITH 8" FORMATS 867 ; THAT ARE 1-ORIGIN. WE ADJUST FOR THIS THROUGHOUT THE 868 ; DEBLOCKING ROUTINES BY SUBTRACTING 1 FROM CPMSEC 869 ; BEFORE WE USE IT. VARIABLES TO CONTROL DEBLOCKING 870 ; ARE SET UP FOR US WHEN DISK IS SELECTED. 871 ; 872 04B9 CDCB04 READ: CALL INTDI ;DISABLE INTERRUPTS 873 04BC CDDA04 CALL DSKRD ;DO THE I/O 874 ; 875 04BF F5 INTEN: PUSH PSW ;SAVE DISK I/O ERROR CODE 876 04C0 2A33CC LHLD ENTPSW ;GET ENTRY PSW TO TEST 877 04C3 E5 PUSH H 878 04C4 F1 POP PSW 879 04C5 E2C904 JPO INTEN5 ;PASS IF INTS OFF WHEN ENTERED 880 04C8 FB EI ; ELSE RE-ENABLE INTS 881 ; 882 04C9 F1 INTEN5: POP PSW ;RESTORE DISK I/O ERROR CODE 883 04CA C9 RET ; THEN RETURN TO CALLER 884 ; 885 04CB 3E7F INTDI: MVI A,7FH ;CHECK FOR RUNNING ON 886 04CD 3C INR A ; 8080 OR Z80 887 04CE E2D804 JPO NOTZ80 ;CAN'T GET INT STATE ON 8080 888 04D1 ED57 DW LDAI ;GET INT STATE INTO 889 04D3 F5 PUSH PSW ; PARITY FLAG, THEN 890 04D4 E1 POP H ; SAVE PSW IN MEMORY 891 04D5 2233CC SHLD ENTPSW 892 ; 893 04D8 F3 NOTZ80: DI ;ALLOW NO INTERRUPTS 894 04D9 C9 RET ; DURING THE I/O XFER 895 ; 896 04DA 3AF609 DSKRD: LDA SECSHF ;SEE IF DEBLOCKING CP/M RMAC ASSEM 1.1 #017 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 897 04DD B7 ORA A 898 04DE CAF106 JZ DJRD ;MUST BE JADE IF NOT 899 04E1 3AE709 LDA SEKDSK ;IF SO, SEE IF JADE ANYWAY 900 04E4 FE02 CPI 2 901 04E6 DAF104 JC NOTJR ;PASS IF NOT, N* READ 902 04E9 3AF5CF LDA CPMTRK ;IF SO, IS TRACK 0 OR 1? 903 04EC FE02 CPI 2 904 04EE DAF106 JC DJRD ;NORMAL SECTOR SIZE IF SO 905 ; 906 04F1 3E02 NOTJR: MVI A,WRUAL 907 04F3 3232CC STA WRTYPE ;TREAT AS UNALLOC 908 04F6 3231CC STA READOP ;READ OPERATION 909 04F9 C37005 JMP ALLOC ;GO END UNALLOC SECTORS 910 ; AND FORCE READ 911 ; 912 04FC 3AF609 DSKWR: LDA SECSHF ;SEE IF DEBLOCKING 913 04FF B7 ORA A 914 0500 CAEA06 JZ DJWR ;MUST BE JADE IF NOT 915 0503 3AE709 LDA SEKDSK ;IF SO, SEE IF JADE ANYWAY 916 0506 FE02 CPI 2 917 0508 DA1305 JC NOTJW ;PASS IF NOT, N* WRITE 918 050B 3AF5CF LDA CPMTRK ;IF SO, IS TRACK 0 OR 1? 919 050E FE02 CPI 2 920 0510 DAEA06 JC DJWR ;NORMAL SECTOR SIZE IF SO 921 ; 922 0513 AF NOTJW: XRA A 923 0514 3231CC STA READOP ;NOT A READ OPERATION 924 0517 79 MOV A,C ;WRITE TYPE IN C 925 0518 3232CC STA WRTYPE 926 051B FE02 CPI WRUAL ;WRITE UNALLOCATED? 927 051D C23205 JNZ CHKUNA ;CHECK FOR UNALLOC 928 ; 929 ; WRITE TO UNALLOCATED, SET PARAMETERS 930 ; 931 0520 3AF409 LDA UNAVAL ;NEXT UNALLOC RECS 932 0523 32F009 STA UNACNT 933 0526 2AE709 LHLD SEKDSK ;PICK UP SEKDSK AND CPMTRK 934 0529 22F109 SHLD UNADSK ;UNADSK=SEKDSK, UNATRK=CPMTRK 935 052C 3AF3CF LDA CPMSEC 936 052F 32F309 STA UNASEC ;UNASEC = CPMSEC 937 ; 938 ; CHECK FOR WRITE TO UNALLOCATED SECTOR 939 ; 940 0532 3AF009 CHKUNA: LDA UNACNT ;ANY UNALLOC REMAIN? 941 0535 B7 ORA A 942 0536 CA7005 JZ ALLOC ;SKIP IF NOT 943 ; 944 ; MORE UNALLOCATED RECORDS REMAIN 945 ; 946 0539 3D DCR A ;UNACNT = UNACNT - 1 947 053A 32F009 STA UNACNT 948 053D 3AE709 LDA SEKDSK ;SAME DISK? 949 0540 21F109 LXI H,UNADSK 950 0543 BE CMP M ;SEKDSK = UNADSK? 951 0544 C27005 JNZ ALLOC ;SKIP IF NOT 952 ; CP/M RMAC ASSEM 1.1 #018 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 953 ; DISKS ARE THE SAME, CHECK TRACKS 954 ; 955 0547 3AF5CF LDA CPMTRK 956 054A 21F209 LXI H,UNATRK 957 054D BE CMP M ;CPMTRK = UNATRK? 958 054E C27005 JNZ ALLOC ;SKIP IF NOT 959 ; 960 ; TRACKS ARE THE SAME, CHECK SECTORS 961 ; 962 0551 3AF3CF LDA CPMSEC 963 0554 21F309 LXI H,UNASEC 964 0557 BE CMP M ;CPMSEC = UNASEC? 965 0558 C27005 JNZ ALLOC ;SKIP IF NOT 966 ; 967 ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF 968 ; 969 055B 34 INR M ;UNASEC = UNASEC+1 970 055C 3AF509 LDA CPMSPT ;CHECK FOR END OF TRACK 971 055F BE CMP M 972 0560 D26905 JNC NOOVF ;SKIP IF STILL ON TRACK 973 ; 974 ; OVERFLOW TO NEXT TRACK 975 ; 976 0563 3601 MVI M,1 ;UNASEC = 1 977 0565 21F209 LXI H,UNATRK 978 0568 34 INR M ;UNATRK = UNATRK+1 979 ; 980 ; MATCH FOUND, MARK AS UNNECESSARY READ 981 ; 982 0569 AF NOOVF: XRA A 983 056A 3230CC STA RSFLAG ;RSFLAG = 0 984 056D C37805 JMP RWOPER ;GO DO WRITE 985 ; 986 ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ 987 ; 988 0570 AF ALLOC: XRA A 989 0571 32F009 STA UNACNT ;UNACNT = 0 990 0574 3C INR A 991 0575 3230CC STA RSFLAG ;RSFLAG = 1 992 ; 993 ; COMMON CODE FOR READ AND WRITE FOLLOWS 994 ; 995 0578 AF RWOPER: XRA A 996 0579 3206CC STA ERFLAG ;NO ERRORS (YET) 997 057C 3AF609 LDA SECSHF ;GET SECTOR SHIFT COUNT 998 057F 47 MOV B,A ; IN COUNT REG 999 0580 3AF3CF LDA CPMSEC ;COMPUTE HOST SECTOR 1000 0583 3D DCR A ;ADJUST FOR 1-ORIGIN 1001 ; 1002 0584 B7 RWOPSH: ORA A ;CARRY = 0 1003 0585 1F RAR ;SHIFT RIGHT 1004 0586 05 DCR B ;COUNT OFF A SHIFT 1005 0587 C28405 JNZ RWOPSH ;LOOP IF MORE 1006 058A 32EA09 STA SEKHST ;HOST SECTOR TO SEEK 1007 ; 1008 ; ACTIVE HOST SECTOR? CP/M RMAC ASSEM 1.1 #019 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1009 ; 1010 058D 21EB09 LXI H,HSTACT ;HOST ACTIVE FLAG 1011 0590 7E MOV A,M 1012 0591 3601 MVI M,1 ;ALWAYS BECOMES 1 1013 0593 B7 ORA A ;WAS IT ALREADY? 1014 0594 CAC105 JZ FILHST ;FILL HOST IF NOT 1015 ; 1016 ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? 1017 ; 1018 0597 3AE709 LDA SEKDSK 1019 059A 2103CC LXI H,HSTDSK ;SAME DISK? 1020 059D BE CMP M ;SEKDSK = HSTDSK? 1021 059E C2B505 JNZ NOMATCH 1022 ; 1023 ; SAME DISK, CHECK TRACK 1024 ; 1025 05A1 3AF5CF LDA CPMTRK 1026 05A4 2104CC LXI H,HSTTRK 1027 05A7 BE CMP M ;CPMTRK = HSTTRK? 1028 05A8 C2B505 JNZ NOMATCH 1029 ; 1030 ; SAME DISK AND TRACK, CHECK SECTOR 1031 ; 1032 05AB 3AEA09 LDA SEKHST 1033 05AE 2105CC LXI H,HSTSEC 1034 05B1 BE CMP M ;SEKHST = HSTSEC? 1035 05B2 CA0606 JZ MATCH ;SKIP IF MATCH 1036 ; 1037 ; MUST FLUSH HOST BUFFER FOR NEW SECTOR 1038 ; 1039 05B5 3AEC09 NOMATCH: LDA HSTWRT ;HOST WRITTEN? 1040 05B8 B7 ORA A 1041 05B9 C45A06 CNZ WRITEHST ;CLEAR HOST BUFFER 1042 05BC 3A06CC LDA ERFLAG ;CHECK FOR ERROR 1043 05BF B7 ORA A 1044 05C0 C0 RNZ ;RETURN ERROR IF SO 1045 ; 1046 05C1 2AE709 FILHST: LHLD SEKDSK ;MAY HAVE TO FILL HOST BUFFER 1047 05C4 2203CC SHLD HSTDSK ;HSTDSK=SEKDSK,HSTTRK=CPMTRK 1048 05C7 3AEA09 LDA SEKHST 1049 05CA 3205CC STA HSTSEC 1050 05CD AF XRA A 1051 05CE 32EC09 STA HSTWRT ;NO PENDING WRITE 1052 05D1 3A30CC LDA RSFLAG ;NEED TO READ? 1053 05D4 B7 ORA A 1054 05D5 CA0606 JZ MATCH ;NO IF FLAG ZERO 1055 05D8 3A03CC LDA HSTDSK ;SEE WHICH DISK 1056 05DB FE02 CPI 2 ;IF C: OR D:, JADE 1057 05DD D2FE05 JNC NOTNSR ;BRANCH IF JADE 1058 05E0 CD35CC CALL READHST ;IF A: OR B:, READ N* 1059 05E3 3A06CC LDA ERFLAG ;CHECK FOR ERRORS 1060 05E6 B7 ORA A 1061 05E7 C0 RNZ ;NO MORE IF SO 1062 05E8 CDD506 CALL GNSDEN ;CHECK DENSITY 1063 05EB 212CCC LXI H,NSDENS 1064 05EE BE CMP M ;IS DENSITY RIGHT? CP/M RMAC ASSEM 1.1 #020 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1065 05EF CA0606 JZ MATCH ;OK IF SO 1066 05F2 218008 LXI H,SDEMSG ;ERROR IF NOT 1067 05F5 CDC1CD CALL DSKERR ;REPORT IT 1068 05F8 3E05 MVI A,5 1069 05FA 3206CC STA ERFLAG 1070 05FD C9 RET ;RET NZ ACC TO CALLER 1071 ; 1072 U05FE CD0000 NOTNSR: CALL JHREAD ;READ JADE DISK 1073 0601 3A06CC LDA ERFLAG ;READ ERROR? 1074 0604 B7 ORA A 1075 0605 C0 RNZ ;LEAVE BUF ALONE IF SO 1076 ; 1077 ; COPY DATA TO OR FROM BUFFER 1078 ; 1079 0606 3AF709 MATCH: LDA SECMSK ;GET MASK 1080 0609 67 MOV H,A ; INTO TEMP REG 1081 060A 3AF3CF LDA CPMSEC ;MASK SECTOR BUFFER NUMBER 1082 060D 3D DCR A ;ADJUST FOR 1-ORIGIN 1083 060E A4 ANA H ;LEAST SIGNIF BITS 1084 060F 1F RAR ;GET VALUE SHIFTED 1085 0610 67 MOV H,A ; LEFT 7 IN HL 1086 0611 3E00 MVI A,0 1087 0613 1F RAR 1088 0614 6F MOV L,A 1089 ; 1090 ; HL CONTAINS RELATIVE HOST BUFFER ADDRESS 1091 ; 1092 0615 11F3CD LXI D,HSTBUF ;ASSUME USING N* BUFFER 1093 0618 3A03CC LDA HSTDSK ;CHECK DISK SELECTED 1094 061B FE02 CPI 2 1095 061D DA2806 JC NJBUF ;RIGHT IF NOT JADE DISK 1096 U0620 3E00 MVI A,DCMB1 ;USING JADE BUFFER, 1097 U0622 D300 OUT DPORT ; SWITCH BANK ONE IN 1098 0624 EB XCHG ;PUT OFFSET IN DE NOW 1099 U0625 2A0000 LHLD DADDR ;PT HL AT BUFFER 1100 ; 1101 0628 19 NJBUF: DAD D ;HL = HOST ADDRESS 1102 0629 EB XCHG ;NOW IN DE 1103 062A 2A3D07 LHLD CPMDMA ;GET/PUT CP/M DATA 1104 062D 0E80 MVI C,SECSZ ;LENGTH OF MOVE 1105 062F 3A31CC LDA READOP ;WHICH WAY? 1106 0632 B7 ORA A 1107 0633 C23B06 JNZ RWMOVE ;SKIP IF READ 1108 ; 1109 ; WRITE OPERATION, MARK AND SWITCH DIRECTION 1110 ; 1111 0636 3C INR A ;ACC KNOWN ZERO ABOVE 1112 0637 32EC09 STA HSTWRT ;HSTWRT = 1 1113 063A EB XCHG ;SOURCE/DEST SWAP 1114 ; 1115 063B 1A RWMOVE: LDAX D ;SOURCE CHARACTER 1116 063C 13 INX D 1117 063D 77 MOV M,A ;TO DEST 1118 063E 23 INX H 1119 063F 0D DCR C ;LOOP 128 TIMES 1120 0640 C23B06 JNZ RWMOVE CP/M RMAC ASSEM 1.1 #021 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1121 0643 3A03CC LDA HSTDSK ;IS THIS JADE DISK? 1122 0646 FE02 CPI 2 1123 U0648 D40000 CNC DSKOUT ;FIX MEM STATUS IF SO 1124 ; 1125 ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER 1126 ; 1127 064B 3A32CC LDA WRTYPE ;WRITE TYPE 1128 064E FE01 CPI WRDIR ;TO DIRECTORY? 1129 0650 3E00 MVI A,0 ;NO ERROR AT THIS PT 1130 0652 C0 RNZ ;RET IF NOT DIR WRITE 1131 ; 1132 ; CLEAR HOST BUFFER FOR DIRECTORY WRITE 1133 ; 1134 0653 CD5A06 CALL WRITEHST 1135 0656 3A06CC LDA ERFLAG 1136 0659 C9 RET 1137 ; 1138 ; WRITEHST PERFORMS THE PHYSICAL WRITE TO THE 1139 ; NORTH STAR DISK. ON ENTRY, DRIVE IS IN HSTDSK, 1140 ; TRACK IS IN HSTTRK, SECTOR IS IN HSTSEC. ON 1141 ; EXIT, ERROR FLAG IS IN ERFLAG (ZERO IF NONE). 1142 ; 1143 ; IT IS ASSUMED INTERRUPTS ARE DISABLED AT 1144 ; THIS POINT. IF NOT, I/O MAY BE DISRUPTED. 1145 ; 1146 WRITEHST: ;WRITE HOST 1147 065A AF XRA A ;BUFFER WILL BE CLEARED 1148 065B 32EC09 STA HSTWRT 1149 065E 3A03CC LDA HSTDSK ;SEE IF N* DISK SELECTED 1150 0661 FE02 CPI 2 1151 U0663 D20000 JNC JHWRIT ;IF NOT, DO JADE WRITE 1152 0666 CDD506 CALL GNSDEN ;GET DENSITY BASED ON ID 1153 0669 322DCC STA NSCNT ;SET WRITE BYTE COUNT 1154 066C CDBACC CALL SETUP ;SELECT DRIVE AND 1155 ; SEEK TO TRACK 1156 066F 3A06CC LDA ERFLAG ;CHECK FOR ERRORS 1157 0672 B7 ORA A 1158 0673 C0 RNZ ;INDEX PULSE NOT FOUND IS FATAL 1159 0674 CD44CD CALL POSEC ;POSITION TO SECTOR 1160 0677 C289CC JNZ SNFERR ;OUT ON ERROR 1161 067A 3A20EB LDA CCMND+20H ;GET B-STATUS 1162 067D E602 ANI 02H ;IS DISK WRITE-PROTECTED? 1163 067F 3E06 MVI A,6 ;ASSUME SO, ERROR CODE 6 1164 0681 3206CC STA ERFLAG 1165 0684 C2CF06 JNZ WPERR ;WRITE ALWAYS FAILS IF SO 1166 0687 2A01CC LHLD HSTADR ;GET ADDRESS TO WRITE FROM 1167 068A 061F MVI B,31 ;ASSUME DOUBLE DENSITY 1168 068C 1E02 MVI E,2 1169 068E 3A2DCC LDA NSCNT ;CHECK 1170 0691 4F MOV C,A ;SAVE COUNT FOR LATER 1171 0692 B7 ORA A 1172 0693 CA9906 JZ WRIT5 ;GO ON IF COUNTS RIGHT 1173 0696 060F MVI B,15 ;CORRECT FOR SINGLE DENS 1174 0698 1D DCR E 1175 ; 1176 0699 3A16EB WRIT5: LDA CCMND+16H ;INITIATE SECTOR WRITE CP/M RMAC ASSEM 1.1 #022 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1177 ; 1178 069C 3A15EB WRIT10: LDA CCMND+15H ;KEEP MOTORS RUNNING, GET A-STAT 1179 069F E608 ANI 08H ;MUST LOOP UNTIL 96 USEC WINDOW 1180 06A1 C29C06 JNZ WRIT10 ; PAST, SO LOOP WHILE WI TRUE 1181 ; 1182 ; NOW WRITE THE 31 OR 15 BYTES OF LEADING ZEROES ON THE SECTOR 1183 ; 1184 06A4 3A00E9 WRIT15: LDA WDATA+00H ;WRITE A BYTE OF ZEROES 1185 06A7 00 NOP ;KILL TIME 1186 06A8 16E9 MVI D,WDATA SHR 8 ;KILL TIME BY LOADING D FOR LATER 1187 06AA 05 DCR B ;COUNT OFF A ZERO BYTE 1188 06AB C2A406 JNZ WRIT15 ;DO THEM ALL 1189 ; 1190 ; FOLLOW WITH ONE OR TWO SYNCH BYTES 1191 ; 1192 06AE 3AFBE9 WRIT17: LDA WDATA+0FBH ;WRITE A SYNCH BYTE 1193 06B1 1D DCR E ;CHECK FOR 2ND NEEDED 1194 06B2 C2AE06 JNZ WRIT17 ;GO BACK IF SO 1195 ; 1196 ; NOW WRITE OUT 256 OR 512 BYTES. DO THIS TWO AT A 1197 ; TIME SO WE CAN USE A SINGLE PRECISION COUNTER. B IS 1198 ; ZERO FROM ABOVE TO INIT THE CRC BYTE. 1199 ; 1200 06B5 7E WRIT20: MOV A,M ;GET NEXT BYTE TO OUTPUT 1201 06B6 5F MOV E,A ; IN OUTPUT REG 1202 06B7 A8 XRA B ;ADD INTO CHECKSUM 1203 06B8 07 RLC 1204 06B9 47 MOV B,A ;LEAVE CHECKSUM IN B 1205 06BA 1A LDAX D ;WRITE DATA BYTE TO DISK 1206 06BB 23 INX H ;BOP BUF PTR 1207 06BC 7E MOV A,M ;REPEAT FOR NEXT BYTE 1208 06BD 5F MOV E,A 1209 06BE A8 XRA B 1210 06BF 07 RLC 1211 06C0 47 MOV B,A 1212 06C1 1A LDAX D 1213 06C2 23 INX H 1214 06C3 0D DCR C ;COUNT OFF LAST PAIR OF BYTES 1215 06C4 C2B506 JNZ WRIT20 ;GO BACK IF MORE TO WRITE 1216 06C7 58 MOV E,B ;IF NOT, TIME TO WRITE CHECKSUM 1217 06C8 03 INX B ;KILL TIME 1218 06C9 1A LDAX D ; THEN WRITE THE BYTE 1219 06CA AF XRA A ;DONE, INDICATE NO ERROR 1220 06CB 3206CC STA ERFLAG 1221 06CE C9 RET ;RETURN TO CALLER 1222 ; 1223 06CF 217908 WPERR: LXI H,WPEMSG ;WRITE PROTECT ERROR 1224 06D2 C3C1CD JMP DSKERR ;TELL OPERATOR ON WAY OUT 1225 ; 1226 ; GNSDEN IS CALLED BY N* I/O ROUTINES TO DETERMINE THE 1227 ; DENSITY OF THE CURRENT BLOCK BASED ON THE DENSITY OF 1228 ; THE ID BLOCK. THAT IS DETERMINED BY TAKING ADVANTAGE 1229 ; OF THE FACT THAT THE HOST DISK HAS NO TRANSLATE TABLE 1230 ; IF SINGLE DENSITY. 1231 ; 1232 06D5 219F09 GNSDEN: LXI H,D0DPH ;ASSUME A: CP/M RMAC ASSEM 1.1 #023 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1233 06D8 3A03CC LDA HSTDSK ;NOW CHECK 1234 06DB B7 ORA A 1235 06DC CAE206 JZ GNSDA ;GO ON IF SO 1236 06DF 21AF09 LXI H,D1DPH ;B: IF NOT 1237 06E2 7E GNSDA: MOV A,M ;SEE IF GOT XLATE TABLE 1238 06E3 23 INX H 1239 06E4 B6 ORA M ;IF NOT, SINGLE DENSITY 1240 06E5 3E80 MVI A,80H ;ASSUME SINGLE 1241 06E7 C8 RZ ;DONE IF RIGHT 1242 06E8 AF XRA A ;CORRECT IF DOUBLE DENSITY 1243 06E9 C9 RET 1244 1245 ************************************************************* 1246 * * 1247 * DISK JOCKY 2D/B READ AND WRITE ROUTINES * 1248 * * 1249 * WRITE ROUTINE MOVES DATA FROM MEMORY INTO THE BUFFER. IF * 1250 * THE DESIRED CP/M SECTOR IS NOT CONTAINED IN THE DISK * 1251 * BUFFER, THE BUFFER IS FIRST FLUSHED TO THE DISK IF IT HAS * 1252 * EVER BEEN WRITTEN INTO, THEN A READ IS PERFORMED INTO THE * 1253 * BUFFER TO GET THE DESIRED SECTOR. ONCE THE CORRECT SECTOR * 1254 * IS IN MEMORY, THE BUFFER WRITTEN INDICATOR IS SET, SO THE * 1255 * BUFFER WILL BE FLUSHED, THEN THE DATA IS TRANSFERRED INTO * 1256 * THE BUFFER. * 1257 * * 1258 ************************************************************* 1259 1260 06EA 79 DJWR MOV A,C ;SAVE WRITE COMMAND TYPE 1261 06EB 325407 STA WRITTYP 1262 06EE 3E01 MVI A,1 ;SET WRITE COMMAND 1263 06F0 06 DB (MVI) OR (B*8) ;THIS "MVI B" INSTRUCTION 1264 ; CAUSES THE FOLLOWING 1265 ; "XRA A" TO BE SKIPPED OVER. 1266 1267 ************************************************************* 1268 * * 1269 * READ ROUTINE TO BUFFER DATA FROM THE DISK. IF THE SECTOR * 1270 * REQUESTED FROM CP/M IS IN THE BUFFER, THEN THE DATA IS * 1271 * SIMPLY TRANSFERRED FROM THE BUFFER TO THE DESIRED DMA * 1272 * ADDRESS. IF THE BUFFER DOES NOT CONTAIN THE DESIRED * 1273 * SECTOR, THE BUFFER IS FLUSHED TO THE DISK IF IT HAS EVER * 1274 * BEEN WRITTEN INTO, THEN FILLED WITH THE SECTOR FROM THE * 1275 * DISK THAT CONTAINS THE DESIRED CP/M SECTOR. * 1276 * * 1277 ************************************************************* 1278 1279 06F1 AF DJRD XRA A ;SET THE COMMAND TYPE TO READ 1280 06F2 324007 STA RDWR ;SAVE COMMAND TYPE 1281 1282 ************************************************************* 1283 * * 1284 * REDWRT CALCULATES THE PHYSICAL SECTOR ON THE DISK THAT * 1285 * CONTAINS THE DESIRED CP/M SECTOR, THEN CHECKS IF IT IS * 1286 * THE SECTOR CURRENTLY IN THE BUFFER. IF NO MATCH IS MADE, * 1287 * THE BUFFER IS FLUSHED IF NECESSARY AND THE CORRECT SECTOR * 1288 * READ FROM THE DISK. * CP/M RMAC ASSEM 1.1 #024 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1289 * * 1290 ************************************************************* 1291 1292 06F5 0600 REDWRT MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN 1293 06F6 = SECSIZ EQU $-1 ; THE LOG2 OF THE PHYSICAL 1294 ; SECTOR SIZE/128 ON THE 1295 ; CURRENTLY SELECTED DISK. 1296 06F7 3AF3CF LDA CPMSEC ;GET THE DESIRED CP/M SECTOR # 1297 06FA F5 PUSH PSW ;TEMPORARY SAVE 1298 06FB E680 ANI 80H ;SAVE ONLY THE SIDE BIT 1299 06FD 4F MOV C,A ;REMEMBER THE SIDE 1300 06FE F1 POP PSW ;GET THE SECTOR BACK 1301 06FF E67F ANI 7FH ;FORGET THE SIDE BIT 1302 0701 3D DCR A ;TEMPORARY ADJUSTMENT 1303 0702 05 DIVLOOP DCR B ;UPDATE REPEAT COUNT 1304 0703 CA0B07 JZ DIVDONE 1305 0706 B7 ORA A ;CLEAR THE CARRY FLAG 1306 0707 1F RAR ;DIVIDE THE CP/M SECTOR # BY 1307 ; THE SIZE OF THE PHYSICAL 1308 ; SECTORS 1309 0708 C30207 JMP DIVLOOP ; 1310 1311 070B 3C DIVDONE INR A 1312 070C B1 ORA C ;RESTORE THE SIDE BIT 1313 070D 32F6CF STA TRUESEC ;SAVE THE PHYSICAL SECTOR 1314 ; NUMBER 1315 0710 21F4CF LXI H,CPMDRV ;POINTER TO DESIRED DRIVE, 1316 ; AND SECTOR 1317 0713 11F7CF LXI D,BUFDRV ;POINTER TO BUFFER DRIVE, 1318 ; TRACK AND SECTOR 1319 0716 0604 MVI B,4 ;COUNT LOOP 1320 0718 05 DTSLOP DCR B ;TEST IF DONE WITH COMPARE 1321 0719 CA2707 JZ SECMOV ;YES, MATCH. GO MOVE THE DATA 1322 071C 1A LDAX D ;GET A BYTE TO COMPARE 1323 071D BE CMP M ;TEST FOR MATCH 1324 071E 23 INX H ;BUMP POINTERS TO NEXT DATA 1325 ; ITEM 1326 071F 13 INX D 1327 0720 CA1807 JZ DTSLOP ;MATCH, CONTINUE TESTING 1328 1329 ************************************************************* 1330 * * 1331 * IF DRIVE, TRACK, AND SECTOR DON'T MATCH, THEN FLUSH THE * 1332 * BUFFER IF NECESSARY AND THEN REFILL. * 1333 * * 1334 ************************************************************* 1335 1336 0723 CDA807 CALL FILL ;FILL THE BUFFER WITH CORRECT 1337 ; PHYSICAL SECTOR 1338 0726 D8 RC ;NO GOOD, RETURN WITH ERROR 1339 ; INDICATION 1340 ************************************************************* 1341 * * 1342 * SECMOV HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO * 1343 * OR OUT OF THE BUFFER. * 1344 * * CP/M RMAC ASSEM 1.1 #025 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1345 ************************************************************* 1346 1347 0727 3AF3CF SECMOV LDA CPMSEC ;GET THE CP/M SECTOR TO 1348 ; TRANSFER 1349 072A 3D DCR A ;ADJUST TO PROPER SECTOR IN 1350 ; BUFFER 1351 072B E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS 1352 072C = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO 1353 ; REPRESENT THE # OF 1354 ; CP/M SECTORS PER PHYSICAL 1355 ; SECTOR 1356 072D 6F MOV L,A ;PUT INTO HL 1357 072E 2600 MVI H,0 1358 0730 29 DAD H ;FORM OFFSET INTO BUFFER 1359 0731 29 DAD H 1360 0732 29 DAD H 1361 0733 29 DAD H 1362 0734 29 DAD H 1363 0735 29 DAD H 1364 0736 29 DAD H 1365 0737 11FACF LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER 1366 073A 19 DAD D ;FORM BEGINNING ADDRESS OF 1367 ; SECTOR TO TRANSFER 1368 073B EB XCHG ;DE = ADDRESS IN BUFFER 1369 073C 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS 1370 ; MODIFIED TO 1371 ; CONTAIN THE DMA ADDRESS 1372 073D = CPMDMA EQU $-2 1373 073F 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO 1374 ; CONTAIN A ZERO IF A READ, 1375 ; OR A 1 IF WRITE 1376 0740 = RDWR EQU $-1 1377 0741 A7 ANA A ;TEST WHICH KIND OF OPERATION 1378 0742 C24A07 JNZ INTO ;TRANSFER DATA INTO THE BUFFER 1379 0745 CD6E00 OUTOF CALL MOVER 1380 0748 AF XRA A 1381 0749 C9 RET 1382 1383 074A EB INTO XCHG ; 1384 074B CD6E00 CALL MOVER ;MOVE THE DATA, HL = DESTINATION 1385 ; DE = SOURCE 1386 074E 3E01 MVI A,1 1387 0750 325D07 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG 1388 0753 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE 1389 0754 = WRITTYP EQU $-1 1390 0755 3D DCR A 1391 0756 3E00 MVI A,0 1392 0758 325407 STA WRITTYP ;SET NO DIRECTORY WRITE 1393 075B C0 RNZ ;NO ERROR EXIT 1394 1395 ************************************************************* 1396 * * 1397 * FLUSHA WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK * 1398 * IF IT HAS EVER BEEN WRITTEN INTO. * 1399 * * 1400 ************************************************************* CP/M RMAC ASSEM 1.1 #026 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1401 1402 075C 3E00 FLUSHA MVI A,0 ;THE 0 IS MODIFIED TO REFLECT 1403 ; IF THE BUFFER HAS BEEN 1404 ; WRITTEN INTO 1405 075D = BUFWRTN EQU $-1 1406 075E A7 ANA A ;TEST IF WRITTEN INTO 1407 075F C8 RZ ;NOT WRITTEN, ALL DONE 1408 0760 2118E4 LXI H,DJWRITE ;WRITE OPERATION 1409 1410 ************************************************************* 1411 * * 1412 * PREP PREPARES TO READ/WRITE THE DISK. RETRIES ARE * 1413 * ATTEMPTED.UPON ENTRY, H&L MUST CONTAIN THE READ OR WRITE * 1414 * OPERATION ADDRESS. * 1415 * * 1416 ************************************************************* 1417 1418 0763 AF PREP XRA A ;RESET BUFFER WRITTEN FLAG 1419 0764 325D07 STA BUFWRTN 1420 0767 229A07 SHLD RETRYOP ;SET UP THE READ/WRITE 1421 ; OPERATION 1422 076A 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES 1423 ; TO ATTEMPT 1424 076C C5 RETRYLP PUSH B ;SAVE THE RETRY COUNT 1425 076D 3AF7CF LDA BUFDRV ;GET DRIVE NUMBER INVOLVED 1426 ; IN THE OPERATION 1427 0770 4F MOV C,A 1428 0771 CD5A00 CALL DJDRV ;SELECT THE DRIVE 1429 0774 3AF8CF LDA BUFTRK 1430 0777 A7 ANA A ;TEST FOR TRACK ZERO 1431 0778 4F MOV C,A 1432 0779 C5 PUSH B 1433 077A CC09E4 CZ DJHOME ;HOME THE DRIVE IF TRACK 0 1434 077D C1 POP B ;RESTORE TRACK # 1435 077E CD0CE4 CALL DJTRK ;SEEK TO PROPER TRACK 1436 0781 3AF9CF LDA BUFSEC ;GET SECTOR INVOLVED 1437 ; IN OPERATION 1438 0784 F5 PUSH PSW ;SAVE THE SECTOR # 1439 0785 07 RLC ;BIT 0 OF A EQUALS SIDE # 1440 0786 E601 ANI 1 ;STRIP OFF UNNECESSARY BITS 1441 0788 4F MOV C,A ;C <- SIDE # 1442 0789 CD30E4 CALL DJSIDE ;SELECT THE SIDE 1443 078C F1 POP PSW ;A <- SECTOR # 1444 078D E67F ANI 7FH ;STRIP OFF SIDE BIT 1445 078F 4F MOV C,A ;C <- SECTOR # 1446 0790 CD0FE4 CALL DJSEC ;SET THE SECTOR TO TRANSFER 1447 0793 01FACF LXI B,BUFFER ;SET THE DMA ADDRESS 1448 0796 CD12E4 CALL DJDMA 1449 0799 CD15E4 CALL DJREAD ;THE READ OPERATION IS 1450 ; MODIFIED TO WRITE 1451 079A = RETRYOP EQU $-2 1452 079C C1 POP B ;RESTORE THE RETRY COUNTER 1453 079D 3E00 MVI A,0 ;NO ERROR EXIT STATUS 1454 079F D0 RNC ;RETURN NO ERROR 1455 07A0 05 DCR B ;UPDATE THE RETRY COUNTER 1456 07A1 37 STC ;ASSUME RETRY COUNT EXPIRED CP/M RMAC ASSEM 1.1 #027 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1457 07A2 3EFF MVI A,0FFH ;ERROR RETURN 1458 07A4 C8 RZ 1459 07A5 C36C07 JMP RETRYLP ;TRY AGAIN 1460 1461 ************************************************************* 1462 * * 1463 * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * 1464 * * 1465 ************************************************************* 1466 1467 07A8 CD5C07 FILL CALL FLUSHA ;FLUSH BUFFER FIRST 1468 07AB D8 RC ;CHECK FOR ERROR 1469 07AC 11F4CF LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, 1470 ; AND SECTOR 1471 07AF 21F7CF LXI H,BUFDRV 1472 07B2 0603 MVI B,3 ;NUMBER OF BYTES TO MOVE 1473 U07B4 CD0000 CALL MOVLOP ;COPY THE DATA 1474 07B7 2115E4 LXI H,DJREAD 1475 07BA C36307 JMP PREP ;SELECT DRIVE, TRACK, AND 1476 ; SECTOR. THEN READ THE 1477 ; 1478 ; 1479 ; HERE TO REPORT DISK NOT READY. TELL CONSOLE WHICH 1480 ; DISK IT WAS, THEN SOLICIT REPLY. IF CTRL-C, WARM 1481 ; BOOT TO A:, ELSE RETURN TO CALLER. 1482 ; 1483 07BD 3AE709 NOTRDY: LDA SEKDSK ;STUFF DISK 1484 07C0 C641 ADI 'A' 1485 07C2 32BC08 STA NRD ; INTO MSG 1486 07C5 21B508 LXI H,NRDMSG 1487 07C8 CD6A08 CALL MSGOT ;REPORT TO OPERATOR 1488 07CB CD1204 CALL CONIN ;GET REPLY 1489 07CE D603 SUI 3 ;IS ANSWER CTRL-C? 1490 07D0 C0 RNZ ;RETURN TO CALLER IF NOT 1491 07D1 320400 STA DEFDSK ;SELECT A: IF SO, 1492 ; THEN WARM BOOT IT 1493 ; 1494 ; WARM BOOT ENTRY. LOAD CCP/BDOS AND INITIALIZE 1495 ; 1496 07D4 F3 WBOOT: DI ;NO PROCESSOR INTS DURING BOOT 1497 07D5 3A0400 LDA DEFDSK ;GET CURRENT DEFAULT DISK 1498 07D8 47 MOV B,A ;SAVE IT 1499 07D9 E6F0 ANI 0F0H ;GET USER # 1500 07DB 4F MOV C,A ;SAVE THAT 1501 07DC 78 MOV A,B 1502 07DD E60F ANI 00FH ;ISOLATE DISK # 1503 07DF FE04 CPI MAXDISK ;IS IT LEGAL? 1504 07E1 DAE607 JC WRMOK ;GO ON IF SO 1505 07E4 AF XRA A ;BACK TO DRIVE ZERO IF NOT 1506 07E5 4F MOV C,A ;USER # PROB BAD TOO 1507 07E6 B1 WRMOK: ORA C ;COMBINE WITH USER # 1508 07E7 32E309 STA DFIMG ;PUT TO BASE PAGE IMAGE 1509 07EA 31F3CF LXI SP,HSTBUF+HSTSIZ ;SET SP TO SCRATCH RAM 1510 07ED 2103AC LXI H,CCP+3 ;CP/M WARM START ADDR 1511 07F0 E5 PUSH H 1512 ; CP/M RMAC ASSEM 1.1 #028 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1513 ; MERGE HERE FROM COLD BOOT 1514 ; 1515 CPMLD: 1516 07F1 010800 LXI B,8 ;MOVE ZERO PAGE STUFF 1517 07F4 110000 LXI D,0 ; DOWN TO ZERO 1518 07F7 21DF09 LXI H,BSIMG 1519 07FA CD8000 CALL BLOCK 1520 07FD 215959 LXI H,05959H ;FORCE HOME OF N* DRIVES 1521 0800 222ECC SHLD NSTRK ; A, B 1522 0803 7C MOV A,H ;MAKE SURE NEW DISK SELECTED 1523 0804 3207CC STA CURDSK 1524 0807 AF XRA A ;DRIVE ZERO VALUE 1525 0808 3203CC STA HSTDSK 1526 080B 32EB09 STA HSTACT ;HOST BUFFER INACTIVE 1527 080E 32EC09 STA HSTWRT ;NO HOST WRITE PENDING 1528 0811 32F009 STA UNACNT ;CLEAR UNALLOC COUNT 1529 0814 2100AC LXI H,CCP ;CP/M CCP ADDRESS 1530 0817 2201CC SHLD HSTADR ;READ INTO THERE 1531 081A 3C INR A ;GET 1 IN ACC 1532 081B 3204CC STA HSTTRK ;READ FROM TRACK ONE 1533 081E CD5508 CALL WSETUP ;KICK MOTORS AND SEEK TRK 1534 0821 AF XRA A ;SECTOR ZERO 1535 ; 1536 ; READ ALL TEN SECTORS FROM TRACK ONE THEN ONE SECTOR 1537 ; FROM TRACK ZERO (SECTOR 3). 1538 ; 1539 0822 3205CC WREAD: STA HSTSEC ;SET CURRENT SECTOR TO READ 1540 0825 CD5B08 CALL WRMRD ;READ SECTOR AND CHK STATUS 1541 0828 110002 LXI D,HSTSIZ ;SECTOR SIZE 1542 082B 2A01CC LHLD HSTADR ;CALC NEW ADDRESS 1543 082E 19 DAD D 1544 082F 2201CC SHLD HSTADR 1545 0832 3A05CC LDA HSTSEC ;BOP SECTOR # 1546 0835 3C INR A 1547 0836 FE0A CPI 10 ;OFF END OF TRACK ONE? 1548 0838 C22208 JNZ WREAD ;GO GET NEXT SECTOR IF NOT 1549 083B AF XRA A ;TO TRACK ZERO, 1550 083C 3204CC STA HSTTRK 1551 083F CD5508 CALL WSETUP 1552 0842 3E03 MVI A,3 ; SECTOR 3 IF SO 1553 0844 3205CC STA HSTSEC 1554 0847 CD5B08 CALL WRMRD ;READ THE LAST SECTOR 1555 084A 21F3CD LXI H,HSTBUF ;NOW READ AND WRITE 1556 084D 2201CC SHLD HSTADR ; USING DEBLOCK BUFFER 1557 0850 3AE309 LDA DFIMG ;RETRIEVE LAST USED DRIVE 1558 0853 4F MOV C,A ; FOR BDOS 1559 0854 C9 RET ; THEN GO TO CP/M 1560 ; 1561 0855 CDBACC WSETUP: CALL SETUP ;KICK MOTORS AND SEEK TRK 1562 0858 C35E08 JMP WECHK 1563 ; 1564 085B CD42CC WRMRD: CALL READNS ;READ HOST SECTOR 1565 085E 3A06CC WECHK: LDA ERFLAG ;CHECK FOR ERROR 1566 0861 B7 ORA A 1567 0862 C8 RZ ;RETURN IF NONE 1568 0863 21CB08 LXI H,MSGLE ;GET ERROR MESSAGE CP/M RMAC ASSEM 1.1 #029 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1569 0866 CD6A08 CALL MSGOT ;TYPE IT 1570 0869 76 HLT ; THEN GIVE UP 1571 ; 1572 ; MSGOT DISPLAYS STRING OF CHARS PT'ED AT BY HL ON 1573 ; CONSOLE, UNTIL CHAR WITH PARITY BIT SET IS OUTPUT. 1574 ; 1575 086A F5 MSGOT: PUSH PSW ;SAVE CALLER FLAGS 1576 086B 4E MSGL: MOV C,M ;LOAD CHAR 1577 086C E5 PUSH H ;SAVE HL 1578 086D CD1E04 CALL CONOUT ;OUTPUT CHAR IN C 1579 0870 E1 POP H ;RESTORE HL 1580 0871 7E MOV A,M ;GET CHAR BACK TO LOOK AT 1581 0872 23 INX H ;LEAVE PTR ON NEXT CHAR 1582 0873 17 RAL ;IS HIGH BIT ON? 1583 0874 D26B08 JNC MSGL ;GO BACK IF NOT 1584 0877 F1 POP PSW ; ELSE RESTORE FLAGS 1585 0878 C9 RET ; AND RETURN 1586 ; 1587 ; DISK ERROR MESSAGES 1588 ; 1589 0879 50726F7465WPEMSG: DB 'Protec','t'+80H 1590 0880 44656E7369SDEMSG: DB 'Densit','y'+80H 1591 0887 414352C3 RERMSG: DB 'ACR','C'+80H 1592 088B 53796EE3 SYEMSG: DB 'Syn','c'+80H 1593 088F 496E6465F8NIPMSG: DB 'Inde','x'+80H 1594 0894 536563746FSNFMSG: DB 'Secto','r'+80H 1595 089A 0D0A4A6164JIOMSG: DB ACR,ALF,'Jade DD',' '+80H 1596 ; 1597 08A4 2065727220ERRMSG: DB ' err ' 1598 08A9 203A207472ASCDSK: DB ' : trk',' '+80H 1599 08B0 20736563A0SECMSG: DB ' sec',' '+80H 1600 08B5 0D0A446973NRDMSG: DB ACR,ALF,'Disk ' 1601 08BC 203A206E6FNRD: DB ' : not ready',' '+80H 1602 08C9 0D8A CRLF: DB ACR,ALF+80H 1603 ; 1604 08CB 0D0A426F6FMSGLE: DB ACR,ALF,'Boot er','r'+80H 1605 ; 1606 ; JADE ID LABEL DEFINITIONS 1607 ; 1608 08D5 4A61646520JADEID: DB 'Jade DD ' ;ID LABEL 1609 0008 = IDSZE EQU $-JADEID ;LABEL SIZE 1610 ; 1611 ; NORTH STAR DD SECTOR TRANSLATE TABLE. AFTER 1612 ; DEBLOCKING, WORKS OUT TO SKEW FACTOR OF 5. 1613 ; 1614 08DD 01020304 TRAN5D: DB 01,02,03,04 1615 08E1 15161718 DB 21,22,23,24 1616 08E5 05060708 DB 05,06,07,08 1617 08E9 191A1B1C DB 25,26,27,28 1618 08ED 090A0B0C DB 09,10,11,12 1619 08F1 1D1E1F20 DB 29,30,31,32 1620 08F5 0D0E0F10 DB 13,14,15,16 1621 08F9 21222324 DB 33,34,35,36 1622 08FD 11121314 DB 17,18,19,20 1623 0901 25262728 DB 37,38,39,40 1624 ; CP/M RMAC ASSEM 1.1 #030 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1625 ; NORTH STAR DD DISK PARAMETER BLOCK. THIS IS OUR 1626 ; NORMAL DPB, AND IS COMPATIBLE WITH LIFEBOAT CP/M 1.4 1627 ; DISKS. 1628 ; 1629 0905 2800 DPBNSD: DW 40 ;SECTORS PER TRACK 1630 0907 03 DB 3 ;BLOCK SHIFT FACTOR 1631 0908 07 DB 07H ;BLOCK MASK 1632 0909 00 DB 0 ;EXM MASK 1633 090A A400 DW 165-1 ;DISK SIZE - 1 1634 090C 3F00 DW 63 ;DIRECTORY MAX 1635 090E C0 DB 11000000B ;ALLOC 0 1636 090F 00 DB 0 ;ALLOC 1 1637 0910 1000 DW 16 ;CHECK SIZE 1638 0912 0200 DW 2 ;TRACK OFFSET 1639 ; 1640 ; THE NEXT BYTE IS ONE WE HAVE ADDED SPECIFICALLY 1641 ; FOR THIS BIOS TO CONVENIENCE OUR DEBLOCKING ROUTINES. 1642 ; IT IS A SECTOR SHIFT MASK, AND EACH DISK PARAMETER 1643 ; BLOCK HAS ONE IN THIS POSITION. THE ALLOWABLE VALUES 1644 ; ARE AS FOLLOWS: 1645 ; 1646 ; 1000B ;1024 BYTES/SECTOR 1647 ; 0100B ; 512 BYTES/SECTOR 1648 ; 0010B ; 256 BYTES/SECTOR 1649 ; 0000B ; 128 BYTES/SECTOR 1650 ; 1651 ; FOR THE NORTH STAR DD DISKS, 512 IS HARD-CODED. FOR 1652 ; THE NORTH STAR SD DISKS, 256 IS HARD-CODED. FOR 1653 ; JADE DISKS, THE VALUE IS READ IN FROM THE ID SECTOR. 1654 ; IF THE ID LOOKS BOGUS, THE STANDARD 8" DPB IS USED, 1655 ; WHICH HAS 128 CANNED-IN. 1656 ; 1657 0914 04 DB 0100B ;512 BYTES/SECTOR 1658 ; 1659 ; NORTH STAR DD DISK PARAMETER BLOCK, SET UP 1660 ; FOR COMPATIBILITY WITH LIFEBOAT CP/M 2.X 1661 ; FORMAT DISKS. 1662 ; 1663 0915 2800 DPBNSL: DW 40 ;SECTORS PER TRACK 1664 0917 04 DB 4 ;BLOCK SHIFT FACTOR 1665 0918 0F DB 0FH ;BLOCK MASK 1666 0919 01 DB 1 ;EXM MASK 1667 091A 5100 DW 82-1 ;DISK SIZE - 1 1668 091C 3F00 DW 63 ;DIRECTORY MAX 1669 091E 80 DB 10000000B ;ALLOC 0 1670 091F 00 DB 0 ;ALLOC 1 1671 0920 1000 DW 16 ;CHECK SIZE 1672 0922 0200 DW 2 ;TRACK OFFSET 1673 0924 04 DB 0100B ;512 BYTES/SECTOR 1674 ; 1675 ; THERE IS NO NORTH STAR SINGLE DENSITY TRANSLATE 1676 ; TABLE. 1677 ; 1678 0000 = TRAN5S: EQU 0 ;TELL SECTRAN TO JUST ADD 1 1679 ; 1680 ; NORTH STAR SD DISK PARAMETER BLOCK CP/M RMAC ASSEM 1.1 #031 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1681 ; 1682 0925 1400 DPBNSS: DW 20 ;SECTORS PER TRACK 1683 0927 03 DB 3 ;BLOCK SHIFT FACTOR 1684 0928 07 DB 07H ;BLOCK MASK 1685 0929 00 DB 0 ;EXM MASK 1686 092A 4F00 DW 80-1 ;DISK SIZE - 1 1687 092C 3F00 DW 63 ;DIRECTORY MAX 1688 092E C0 DB 11000000B ;ALLOC 0 1689 092F 00 DB 0 ;ALLOC 1 1690 0930 1000 DW 16 ;CHECK SIZE 1691 0932 0300 DW 3 ;TRACK OFFSET 1692 0934 02 DB 0010B ;256 BYTES/SECTOR 1693 ; 1694 ; STANDARD 8" SECTOR TRANSLATE TABLE 1695 ; 1696 0935 01070D1319TRAN8: DB 1,7,13,19,25,5,11,17,23 1697 093E 03090F1502 DB 3,9,15,21,2,8,14,20,26 1698 0947 060C121804 DB 6,12,18,24,4,10,16,22 1699 ; 1700 ; STANDARD 8" DISK PARAMETER BLOCK 1701 ; 1702 094F 1A00 DPB8: DW 26 1703 0951 03 DB 3 1704 0952 07 DB 7 1705 0953 00 DB 0 1706 0954 F200 DW 242 1707 0956 3F00 DW 63 1708 0958 C0 DB 0C0H 1709 0959 00 DB 0 1710 095A 1000 DW 16 1711 095C 0200 DW 2 1712 ; 1713 095E 00 DB 0000B ;128 BYTES/SECTOR 1714 ; 1715 ; 1024 BYTES/SECTOR TRANSLATE TABLE 1716 ; 1717 095F 0102030405TRN124: DB 1,2,3,4,5,6,7,8 1718 0967 191A1B1C1D DB 25,26,27,28,29,30,31,32 1719 096F 3132333435 DB 49,50,51,52,53,54,55,56 1720 0977 090A0B0C0D DB 9,10,11,12,13,14,15,16 1721 097F 2122232425 DB 33,34,35,36,37,38,39,40 1722 0987 393A3B3C3D DB 57,58,59,60,61,62,63,64 1723 098F 1112131415 DB 17,18,19,20,21,22,23,24 1724 0997 292A2B2C2D DB 41,42,43,44,45,46,47,48 1725 ; 1726 ; DRIVE PARAMETER HEADER AREA 1727 ; 1728 ; DRIVES A: AND B: ARE NORTH STAR 5" 1729 ; 1730 099F 0000 D0DPH: DW 0 ;SECTOR TRAN TBL SET BY SETDRV 1731 09A1 0000 DW 0 ;SCRATCH 1732 09A3 0000 DW 0 ;SCRATCH 1733 09A5 0000 DW 0 ;SCRATCH 1734 09A7 8B00 DW DIRBUF ;DIRECTORY BUFFER 1735 09A9 0000 DW 0 ;DRIVE PARAM BLK SET BY SETDRV 1736 09AB 2201 DW D0CHK ;DRIVE CHANGE BLK CP/M RMAC ASSEM 1.1 #032 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1737 09AD 0B01 DW D0ALL ;DRIVE ALLOCATION 1738 ; 1739 09AF 0000 D1DPH: DW 0 ;SECTOR TRAN TBL SET BY SETDRV 1740 09B1 0000 DW 0 ;SCRATCH 1741 09B3 0000 DW 0 ;SCRATCH 1742 09B5 0000 DW 0 ;SCRATCH 1743 09B7 8B00 DW DIRBUF ;DIRECTORY BUFFER 1744 09B9 0000 DW 0 ;DRIVE PARAM BLK SET BY SETDRV 1745 09BB 4901 DW D1CHK ;DRIVE CHANGE BLK 1746 09BD 3201 DW D1ALL ;DRIVE ALLOCATION 1747 ; 1748 ; 1749 ; DRIVES C: AND D: ARE JADE 8" SHUGART 1750 ; 1751 09BF 0000 D2DPH: DW 0 ;SECTOR TRAN TBL SET BY SETDRV 1752 09C1 0000 DW 0 ;SCRATCH 1753 09C3 0000 DW 0 ;SCRATCH 1754 09C5 0000 DW 0 ;SCRATCH 1755 09C7 8B00 DW DIRBUF ;DIRECTORY BUFFER 1756 09C9 F809 DW D2DPB ;DRIVE PARAM BLK SET BY SETDRV 1757 09CB EF01 DW D2CHK ;DRIVE CHANGE BLK 1758 09CD 5901 DW D2ALL ;DRIVE ALLOCATION 1759 ; 1760 ; 1761 09CF 0000 D3DPH: DW 0 ;SECTOR TRAN TBL SET BY SETDRV 1762 09D1 0000 DW 0 ;SCRATCH 1763 09D3 0000 DW 0 ;SCRATCH 1764 09D5 0000 DW 0 ;SCRATCH 1765 09D7 8B00 DW DIRBUF ;DIRECTORY BUFFER 1766 09D9 0ACC DW D3DPB ;DRIVE PARAM BLK SET BY SETDRV 1767 09DB C502 DW D3CHK ;DRIVE CHANGE BLK 1768 09DD 2F02 DW D3ALL ;DRIVE ALLOCATION 1769 ; 1770 ; 1771 ; ZERO PAGE IMAGE -- BLOCK MOVED TO BASE PAGE 1772 ; 1773 09DF C303C2 BSIMG: JMP BIOS+03H ;WARM BOOT VECTOR 1774 09E2 IOIMG: DS 1 ;IOBYTE NOT USED 1775 09E3 00 DFIMG: DB 0 ;DEFAULT DISK -- ZERO 1776 ; AFTER COLD BOOT 1777 09E4 C306B4 JMP BDOS+06H ;BDOS CALL VECTOR 1778 ; 1779 ; BIOS VARIABLE STORAGE 1780 ; 1781 09E7 00 SEKDSK: DB 0 ;DRIVE NUMBER 1782 P09E8 CPMTRK: DS 1 ;TRACK NUMBER (MUST IMM FOLLOW 1783 ; SEKDSK FOR LHLD) 1784 P09E8 CPMSEC: DS 1 ;SECTOR NUMBER 1785 P09E8 SEKHST: DS 1 ;SEEK SHR SECSHF 1786 P09E8 HSTACT: DS 1 ;HOST ACTIVE FLAG 1787 P09E8 HSTWRT: DS 1 ;HOST WRITTEN FLAG 1788 P09E8 0000 DTPTR: DW 0 ;DRIVE TABLE PTR 1789 P09EA 00 LOGFLG: DB 0 ;NON-ZERO IF SETDRV 1790 ; LOGGED ON JADE DISK 1791 ; 1792 P09EB UNACNT: DS 1 ;UNALLOC REC CNT CP/M RMAC ASSEM 1.1 #033 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1793 P09EB UNADSK: DS 1 ;LAST UNALLOC DISK 1794 P09EB UNATRK: DS 1 ;LAST UNALLOC TRACK (MUST IMM 1795 ; FOLLOW UNADSK FOR LHLD) 1796 P09EB UNASEC: DS 1 ;LAST UNALLOC SECTOR 1797 ; 1798 ; DEBLOCKING INFO ABOUT THE CURRENTLY-SELECTED DISK 1799 ; 1800 P09EB UNAVAL: DS 1 ;# UNALLOC RECS/GROUP 1801 P09EB CPMSPT: DS 1 ;# CP/M SECTORS/TRACK 1802 P09EB SECSHF: DS 1 ;SECTOR SHIFT COUNT, 1803 ; LOG2 (# CP/M SECTORS/HOST BLOCK) 1804 P09EB SECMSK: DS 1 ;SECTOR MASK, # CP/M 1805 ; SECTORS/HOST BLOCK - 1 1806 ; 1807 ; 1808 ; RESERVE DRIVE PARAMETER BLOCKS FOR JADE DRIVES 1809 ; 1810 0010 = DPBSZ EQU 16 ;SIZE IS 16 BYTES 1811 P09EB D2DPB: DS DPBSZ ;RESERVE 16 BYTES/DISK C-D 1812 ; 1813 ; EVERYTHING FROM THIS POINT FOR THE NEXT 1814 ; 512 BYTES IS READ INTO MEMORY BY THE NORTH 1815 ; STAR BOOT PROM. OUR GOAL HERE IS TO GET 1816 ; A REASONABLE AMOUNT OF NORMAL BIOS CODE IN, 1817 ; BUT AT THE SAME TIME WE NEED THE PORTIONS 1818 ; THAT CAN READ THE DISK. 1819 ; 1820 ; IF THIS SECTION OVERLAYS PREVIOUS BIOS CODE 1821 ; OR DATA SPACE, THE PRECEDING BIOS MUST BE 1822 ; TRIMMED DOWN. 1823 ; 1824 P09EB = PRVCHK EQU $ ;** MUST NOT EXCEED BOOTA ** 1825 ; 1826 CC00 ORG BIOS+(HSTSIZ*5) ;ORG TO COLD BOOT 1827 ; 1828 ECC00 00 BOOTA: DB BOOTA SHR 8 ;TELL PROM LOAD ADDR 1829 ; 1830 ; THE NEXT NINE LOCATIONS ARE SKIPPED OVER 1831 ; BY THE BOOT PROM, WHICH READS THIS SECTOR 1832 ; THEN JUMPS TO BOOTA+0AH, SO PUT USEFUL VARIABLES 1833 ; HERE. NOTE THAT ALL VARIABLES IN THIS SECTOR 1834 ; WITH GENNED-IN VALUES ARE SET UP FOR COLD 1835 ; BOOT LOADING OF BIOS. 1836 ; 1837 CC01 00C2 HSTADR: DW BIOS ;READ BIOS INTO HERE TO START, 1838 ; BUT NORMALLY PTS TO HSTBUF 1839 CC03 00 HSTDSK: DB 0 ;HOST DISK NUMBER 1840 CC04 00 HSTTRK: DB 0 ;HOST TRACK NUMBER (MUST IMM 1841 ; FOLLOW HSTDSK FOR LHLD) 1842 CC05 05 HSTSEC: DB 5 ;HOST SECTOR NUMBER 1843 CC06 00 ERFLAG: DB 0 ;ERROR REPORTING 1844 CC07 59 CURDSK: DB 059H ;CURRENT ACTIVE DISK, 1845 ; GENNED-IN FORCE SELECT 1846 CC08 01 COLDB: DB 1 ;COLD BOOT WHEN NON-ZERO 1847 CC09 ERSEC: DS 1 ;SECTOR IN ERROR 1848 ; CP/M RMAC ASSEM 1.1 #034 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1849 ; THIS IS THE SECTION OF THE COLD BOOT THAT 1850 ; READS IN THE REST OF BIOS. ON MORE CONVENTIONAL 1851 ; CP/M SYSTEMS, THIS WOULD BE THE BLOCK ZERO 1852 ; BOOT. READ BIOS INTO MEMORY, THEN JUMP TO 1853 ; IT TO FINISH COLD BOOTING. 1854 ; 1855 CC0A = D3DPB: EQU $ ;*** OVERLAY N* COLD BOOT *** 1856 ; 1857 CC0A F3 BOOT: DI ;ALLOW NO PROCESSOR INTERRUPTS 1858 CC0B 31F3CF LXI SP,HSTBUF+HSTSIZ ;SET SP TO SCRATCH RAM 1859 CC0E CDBACC CALL SETUP ;GIVE MOTORS EXTRA KICK 1860 ; AND SEEK TRK 0 1861 ; 1862 CC11 CD42CC BOOTL: CALL READNS ;READ NEXT SECTOR OF BIOS 1863 ;WITH COLDB NON-ZERO, NO 1864 ; RETURN IF I/O ERROR 1865 CC14 2105CC LXI H,HSTSEC ;IF OK, BOP SEC NUM 1866 CC17 34 INR M 1867 CC18 2A01CC LHLD HSTADR ; AND ADVANCE READ ADDR 1868 CC1B 110002 LXI D,HSTSIZ 1869 CC1E 19 DAD D 1870 CC1F 2201CC SHLD HSTADR 1871 ECC22 3E00 MVI A,BOOTA SHR 8 ;SEE IF READ ENUFF 1872 CC24 BC CMP H 1873 CC25 C211CC JNZ BOOTL ;LOOP IF NOT 1874 CC28 C38B00 JMP INIT ;GO START BIOS IF SO 1875 ; 1876 ; REMAINING NEEDED VARIABLES 1877 ; 1878 CC2B RTCNT: DS 1 ;ERROR RETRY COUNTER 1879 CC2C NSDENS: DS 1 ;DENSITY OF LAST NS DISK BLOCK 1880 ; READ, SD=128, DD=0 1881 CC2D 00 NSCNT: DB 00H ;COUNT AND DENSITY FLAG, SET 1882 ; BY WRITEHST TO MATCH ID SECTOR 1883 ; 1884 ; NORTH STAR CURRENT TRACK TABLE 1885 ; 1886 CC2E 59 NSTRK: DB 059H ;NO CURRENT TRACK YET 1887 CC2F 59 DB 059H ;EACH ENTRY CONTAINS 1888 ; DB 059H ; THE LAST TRACK POSITION 1889 ; DB 059H ; FOR THE UNIT 1-4 1890 ; 1891 ; OTHER VARIABLES HERE BECAUSE THERE IS SPACE, CAN 1892 ; BE MOVED IF NECESSARY 1893 ; 1894 CC30 RSFLAG: DS 1 ;READ SECTOR FLAG 1895 CC31 READOP: DS 1 ;1 IF READ OPERATION 1896 CC32 WRTYPE: DS 1 ;WRITE OPERATION TYPE 1897 ;;CPMDMA: DS 2 ;LAST DMA ADDRESS 1898 CC33 0000 ENTPSW: DW 0 ;ENTRY PSW AT DISK READ/WRITE 1899 ; 1900 ; READHST PERFORMS THE PHYSICAL READ FROM THE 1901 ; NORTH STAR DISK. ON ENTRY, DRIVE IS IN HSTDSK, 1902 ; TRACK IS IN HSTTRK, SECTOR IS IN HSTSEC. ON 1903 ; EXIT, ERROR FLAG IS IN ERFLAG (ZERO IF NONE). 1904 ; CP/M RMAC ASSEM 1.1 #035 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1905 ; *** INTERRUPTS MUST BE DISABLED HERE *** 1906 ; 1907 READHST: 1908 CC35 3E0A MVI A,10 ;RETRY COUNT ON ERROR 1909 CC37 322BCC STA RTCNT 1910 ; 1911 CC3A CDBACC READRT: CALL SETUP ;SELECT DRIVE AND 1912 ; SEEK TO TRACK 1913 CC3D 3A06CC LDA ERFLAG ;CHECK FOR ERRORS 1914 CC40 B7 ORA A 1915 CC41 C0 RNZ ;INDEX PULSE NOT FOUND IS FATAL 1916 ; 1917 ; HERE TO READ NORTH STAR WITHOUT TRACK SEEK FOR SPEED 1918 ; 1919 CC42 CD44CD READNS: CALL POSEC ;POSITION TO OUR SECTOR 1920 CC45 C289CC JNZ SNFERR ;ERROR IF NOT FOUND 1921 CC48 068C MVI B,08CH ;COUNT FOR SYNC CHAR LOOP 1922 CC4A 1140EB LXI D,CCMND+40H ;SET UP READ DATA REGS 1923 ; 1924 ; WAIT FOR RE SO WE CAN DO SECTOR READ, AND TEST 1925 ; THE DOUBLE DENSITY BIT. 1926 ; 1927 CC4D 3A10EB WAITRE: LDA CCMND+10H ;GET A-STATUS 1928 CC50 E604 ANI 04H ;CHECK RE 1929 CC52 CA4DCC JZ WAITRE ;LOOP UNTIL RE TRUE 1930 CC55 E3 XTHL ;KILL TIME TO GET INTO ZEROES 1931 CC56 E3 XTHL 1932 CC57 E3 XTHL 1933 CC58 E3 XTHL 1934 CC59 E3 XTHL 1935 CC5A E3 XTHL 1936 CC5B E3 XTHL 1937 CC5C E3 XTHL 1938 CC5D 3A10EB LDA CCMND+10H ;GET A-STATUS AGAIN 1939 CC60 E620 ANI 20H ;ARE WE READING DOUBLE DENS? 1940 CC62 17 RAL ;MAKE 80H IF NOT, ZERO IF SO 1941 CC63 17 RAL 1942 CC64 EE80 XRI 80H 1943 CC66 322CCC STA NSDENS ;SAVE DENSITY FOR CALLER 1944 ; 1945 ; NOW WAIT FOR SYNC CHAR DETECTED. ERROR IF WE HAVE TO 1946 ; WAIT TOO LONG. 1947 ; 1948 CC69 3A10EB READ5: LDA CCMND+10H ;WAIT FOR SYNC CHAR DETECTED 1949 CC6C 0F RRC ;CHECK BIT 1950 CC6D DA92CC JC READ15 ;OUT IF GOT IT 1951 CC70 05 DCR B ;COUNT DOWN IF NOT 1952 CC71 C269CC JNZ READ5 ;GO BACK IF STILL OK 1953 CC74 3E01 MVI A,1 ;SYNC ERROR IF WAITED TOO LONG 1954 CC76 218B08 LXI H,SYEMSG ;SYNC ERROR MESSAGE 1955 ; 1956 CC79 3206CC RERR: STA ERFLAG ;STORE ERROR CODE 1957 CC7C 3A2BCC LDA RTCNT ;COUNT OFF A RETRY 1958 CC7F 3D DCR A 1959 CC80 322BCC STA RTCNT 1960 CC83 C23ACC JNZ READRT ;IF COUNT LEFT, GO RETRY CP/M RMAC ASSEM 1.1 #036 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 1961 ; 1962 ; READ ERROR RETRIES FAILED. FLAG ERROR. 1963 ; 1964 CC86 C3C1CD JMP DSKERR ;TELL OPERATOR OF ERROR THEN OUT 1965 ; 1966 CC89 3206CC SNFERR: STA ERFLAG ;SET ERROR FLAG 1967 CC8C 219408 LXI H,SNFMSG 1968 CC8F C3C1CD JMP DSKERR ;REPORT ERROR ON WAY OUT 1969 ; 1970 ; READ THE DATA INTO HSTBUF 1971 ; 1972 CC92 2A01CC READ15: LHLD HSTADR ;READ INTO HERE 1973 CC95 0600 MVI B,0 ;INIT CHECKSUM BYTE 1974 CC97 3A2CCC LDA NSDENS ;GET # BYTES TO READ 1975 CC9A 4F MOV C,A ;PUT READ COUNT IN C-REG 1976 ; 1977 CC9B 1A READ20: LDAX D ;READ NEXT DATA BYTE 1978 CC9C 77 MOV M,A ; AND PUT IT IN BUFFER 1979 CC9D A8 XRA B ;ADD TO CHECKSUM 1980 CC9E 07 RLC 1981 CC9F 47 MOV B,A 1982 CCA0 23 INX H ;BOP BUFFER PTR 1983 CCA1 00 NOP ;KILL TIME 1984 CCA2 1A LDAX D ;GET NEXT BYTE 1985 CCA3 77 MOV M,A 1986 CCA4 A8 XRA B 1987 CCA5 07 RLC 1988 CCA6 47 MOV B,A 1989 CCA7 23 INX H 1990 CCA8 0D DCR C ;COUNT OFF LAST PAIR 1991 CCA9 C29BCC JNZ READ20 ;GO BACK IF MORE TO DO 1992 CCAC 1A LDAX D ; ELSE READ CRC BYTE 1993 CCAD A8 XRA B ; AND CHECK IT AGAINST OURS 1994 CCAE 3206CC STA ERFLAG ;IF OK, ZERO EFLAG 1995 CCB1 C8 RZ ; AND RETURN TO CALLER 1996 CCB2 3E02 MVI A,2 ; ELSE FLAG CHECKSUM ERROR 1997 CCB4 218708 LXI H,RERMSG ;MESSAGE IF NEEDED 1998 CCB7 C379CC JMP RERR ;GO MAYBE RETRY 1999 ; 2000 ; SETUP SELECTS THE UNIT CORRESPONDING TO HSTDSK, 2001 ; THEN SEEKS TO THE TRACK SPECIFIED BY HSTTRK. 2002 ; WRITE PRECOMPENSATION IS SET IF REQUIRED AS 2003 ; WELL. ON ERROR, ERFLAG CONTAINS A NON-ZERO 2004 ; VALUE ON RETURN. ONLY UNITS 1 AND 2 ARE SUPPORTED 2005 ; TO SAVE SPACE. 2006 ; 2007 CCBA 3A2DCC SETUP: LDA NSCNT ;GET DENSITY FLAG 2008 CCBD EE80 XRI 80H ;INVERT TO SET DD 2009 CCBF 4F MOV C,A ;SAVE MASK 2010 CCC0 3A03CC LDA HSTDSK ;WANT THIS DISK 2011 CCC3 3C INR A ;REMAP TO CONTROLLER MASK 2012 ; CPI 03H ;IF UNIT 1 OR 2, 2013 ; JC SET0 ; GOT CORRECT MASK 2014 ; RAL ;IF 3 OR 4, MUST MAP 2015 ; ANI 0CH ; TO 4 OR 8 RESPECTIVELY 2016 ;SET0: CP/M RMAC ASSEM 1.1 #037 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 2017 CCC4 B1 ORA C ;OR IN DENSITY MASK 2018 CCC5 4F MOV C,A ;SAVE IN REG C 2019 CCC6 CDADCD CALL WAIT1S ;WAIT A SECTOR TIME, GET A-STAT 2020 CCC9 E610 ANI 10H ;ARE MOTORS ALREADY ON? 2021 CCCB 3A15EB LDA CCMND+15H ;GIVE THEM EXTRA KICK ANYWAY 2022 CCCE C2D9CC JNZ SET5 ;BRANCH IF SO 2023 CCD1 1617 MVI D,17H ;WAIT FOR MOTORS TO 2024 CCD3 CDAFCD CALL SCWAIT ; COME UP TO SPEED IF NOT 2025 CCD6 C3E0CC JMP SET10 ; THEN GO SELECT DRIVE 2026 ; 2027 CCD9 3A07CC SET5: LDA CURDSK ;IS THIS THE CURRENT DISK? 2028 CCDC B9 CMP C 2029 CCDD CA10CD JZ SET20 ;GO SEEK TO TRACK IF SO 2030 ; 2031 ; MUST SELECT NEW DISK 2032 ; 2033 CCE0 79 SET10: MOV A,C 2034 CCE1 3207CC STA CURDSK ;NEW CURRENT DISK 2035 CCE4 06EA MVI B,CORDER SHR 8 ;SET UP FOR SELECT 2036 CCE6 0A LDAX B ; AND DO IT 2037 CCE7 1602 MVI D,2 ;WAIT TWO SECTOR TIMES 2038 CCE9 CDAFCD CALL SCWAIT ; BEFORE LOOKING FOR INDEX 2039 CCEC 060C MVI B,12 ;DON'T LOOK TOO LONG 2040 ; 2041 CCEE CDADCD SET15: CALL WAIT1S ;WAIT A SECTOR TIME, GET A-STAT 2042 CCF1 E640 ANI 40H ;INDEX HOLE SEEN? 2043 CCF3 C210CD JNZ SET20 ;CAN GO SEEK NOW IF SO 2044 CCF6 05 DCR B ;COUNT DOWN IF NOT 2045 CCF7 C2EECC JNZ SET15 ; AND MAYBE GO LOOK AGAIN 2046 ; 2047 ; INDEX HOLE NOT FOUND. DISK IS PROBABLY NOT LOADED. 2048 ; 2049 CCFA 3E04 MVI A,4 ;NO INDEX PULSE 2050 CCFC 3206CC STA ERFLAG 2051 CCFF 218F08 LXI H,NIPMSG 2052 CD02 CDC1CD CALL DSKERR ;TELL OPERATOR 2053 CD05 CDBD07 CALL NOTRDY ; AND CLAIM DISK NOT READY 2054 CD08 3E59 MVI A,059H ;FORCE RESELECT OF DISK 2055 CD0A 3207CC STA CURDSK 2056 CD0D C3BACC JMP SETUP ;TRY TO GET DISK AGAIN 2057 ; 2058 ; SEEK TO TRACK SPECIFIED BY HSTTRK NOW, AND SET 2059 ; WRITE PRECOMPENSATION IF APPROPRIATE. 2060 ; 2061 CD10 3A03CC SET20: LDA HSTDSK ;GET NSTRK INDEX 2062 CD13 4F MOV C,A 2063 CD14 0600 MVI B,0 2064 CD16 212ECC LXI H,NSTRK ;PT AT TABLE 2065 CD19 09 DAD B ; THEN AT CORRECT ENTRY 2066 CD1A 7E MOV A,M ;GET CURRENT TRACK 2067 CD1B E5 PUSH H ;SAVE NSTRK PTR 2068 CD1C EE59 XRI 59H ;DISK EVER ACCESSED? 2069 CD1E CC5DCD CZ SEEK ;IF NOT, HOME DRIVE 2070 CD21 E1 POP H ;RESTORE NSTRK PTR 2071 CD22 3A04CC LDA HSTTRK ;SEEK TO THIS TRACK 2072 CD25 F5 PUSH PSW ;SAVE OVER CALL CP/M RMAC ASSEM 1.1 #038 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 2073 CD26 CD5DCD CALL SEEK ;DO FINAL SEEK 2074 CD29 F1 POP PSW ;GET HSTTRK BACK 2075 CD2A FE15 CPI 14H+1 ;ARE WE BEYOND TRACK 14H? 2076 CD2C DA3FCD JC SET25 ;GO ON IF NOT 2077 CD2F 3A2DCC LDA NSCNT ;SEE IF DD OR SD 2078 CD32 B7 ORA A 2079 CD33 C23FCD JNZ SET25 ;NO PRECOMP IF SD 2080 CD36 3A07CC LDA CURDSK ;IF SO, GET CURRENT MASK 2081 CD39 F620 ORI 20H ; AND SET PRECOMP BIT 2082 CD3B 26EA MVI H,CORDER SHR 8 2083 CD3D 6F MOV L,A 2084 CD3E 7E MOV A,M ;SET BIT IN CONTROLLER 2085 ; 2086 CD3F AF SET25: XRA A 2087 CD40 3206CC STA ERFLAG ;NO ERRORS 2088 CD43 C9 RET 2089 ; 2090 ; POSEC IS CALLED TO POSITION TO HSTSEC WITHIN 2091 ; THE CURRENT TRACK. ERROR IS RETURNED BY NON-ZERO 2092 ; IF WE CAN'T FIND THE SECTOR AFTER 30 TRIES. 2093 ; 2094 CD44 3A05CC POSEC: LDA HSTSEC ;GET TARGET SECTOR 2095 CD47 4F MOV C,A ;IN C 2096 CD48 3209CC STA ERSEC ;SET UP FOR POSSIBLE ERROR 2097 CD4B 061E MVI B,30 ;LOOK AT THIS MANY SECTORS 2098 ; 2099 CD4D CDADCD POSC5: CALL WAIT1S ;WAIT FOR NEXT SECTOR 2100 CD50 3A35EB LDA CCMND+35H ;KICK MOTORS AND GET SECNUM 2101 CD53 E60F ANI 0FH ;STRIP NON-SECTOR BITS 2102 CD55 91 SUB C ;IS THIS THE TARGET SECTOR? 2103 CD56 C8 RZ ;OUT IF GOT IT 2104 CD57 05 DCR B ;COUNT OFF IF DIDN'T 2105 CD58 C24DCD JNZ POSC5 ;GO BACK IF NOT GIVING UP 2106 CD5B 04 INR B ;SET NON-ZERO IF NOT FOUND 2107 CD5C C9 RET 2108 ; 2109 ; SEEK TO TRACK SPECIFIED BY ACC. CURRENT PTR INTO 2110 ; NSTRK TABLE IS GIVEN BY HL. IF TRACK SPECIFIED IS 2111 ; ZERO, SEEK WILL BE DONE UNTIL TRACK ZERO FLAG IS 2112 ; SEEN, REGARDLESS OF CURRENT POSITION, UNLESS 2113 ; WE ARE ALREADY THERE, SINCE NO SEEK IS DONE 2114 ; IF ALREADY AT THE DESIRED TRACK. 2115 ; 2116 CD5D 47 SEEK: MOV B,A ;SAVE TARGET TRK # 2117 CD5E 96 SUB M ;SEE HOW FAR AWAY WE ARE 2118 ; FROM TARGET TRACK 2119 CD5F 70 MOV M,B ; BUT ALWAYS SET NEW TRACK 2120 CD60 C8 RZ ;IF THERE, DONE 2121 CD61 2130EA LXI H,CORDER+30H ;ASSUME STEPPING IN 2122 CD64 4F MOV C,A ;SAVE STEP COUNT 2123 CD65 F273CD JP STEPIN ;BRANCH IF RIGHT 2124 CD68 2F CMA ;IF WRONG, NEGATE COUNT 2125 CD69 3C INR A 2126 CD6A 4F MOV C,A ; THEN SAVE THAT 2127 CD6B 3A20EB LDA CCMND+20H ;GET B-STATUS 2128 CD6E E601 ANI 01H ;ARE WE ON TRACK ZERO? CP/M RMAC ASSEM 1.1 #039 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 2129 CD70 C0 RNZ ;MUST BE DONE IF SO 2130 CD71 2E10 MVI L,10H ;IF NOT, STEPPING OUT 2131 ; 2132 CD73 3A07CC STEPIN: LDA CURDSK ;GET CURRENT UNIT MASK 2133 CD76 B5 ORA L ;FORM FINAL CORDER VALUE 2134 CD77 6F MOV L,A 2135 CD78 56 MOV D,M ;SET THE STEP FLIP-FLOP 2136 CD79 F610 ORI 10H 2137 CD7B 6F MOV L,A 2138 CD7C 56 MOV D,M ;SET IT AGAIN FOR SOME REASON 2139 CD7D EE10 XRI 10H 2140 CD7F 6F MOV L,A 2141 CD80 56 MOV D,M ;NOW RESET THE STEP FLIP-FLOP 2142 ; 2143 ; WAIT WHILE HEAD STARTS MOVING 2144 ; 2145 CD81 3E14 MVI A,14H 2146 CD83 1638 STEPW1: MVI D,38H 2147 CD85 15 STEPW2: DCR D ;KILL TIME 2148 CD86 C285CD JNZ STEPW2 2149 CD89 3D DCR A 2150 CD8A C283CD JNZ STEPW1 2151 ; 2152 ; THE STEP RATE DETERMINES HOW LONG TO WAIT. ONE SECTOR 2153 ; TIME IS 20 MSEC. A SLOW SHUGART SA400 MAY REQUIRE 40 2154 ; MSEC, OR TWO SECTOR TIMES. MOST TYPICAL SA400'S WILL 2155 ; WORK WITH 20 MSEC, SO THAT'S WHAT WE'LL USE HERE. WE 2156 ; WILL CALL SCWAIT INSTEAD OF WAIT1S IN CASE WE NEED TO 2157 ; PATCH THIS VALUE. 2158 ; 2159 CD8D 1601 MVI D,1 ;NOW WAIT 20 MSEC 2160 ; MVI D,2 ;NOW WAIT 40 MSEC 2161 CD8F CDAFCD CALL SCWAIT 2162 CD92 3A25EB LDA CCMND+25H ;GET B-STATUS AND KICK MOTORS 2163 CD95 E601 ANI 01H ;ARE WE AT TRACK ZERO? 2164 CD97 C2ADCD JNZ WAIT1S ;DONE STEPPING IF SO 2165 CD9A 0D DCR C ; ELSE COUNT OFF LAST TRACK 2166 CD9B C273CD JNZ STEPIN ;GO BACK IF MORE TO DO 2167 CD9E CDADCD CALL WAIT1S ;WAIT ONE MORE SECTOR TIME 2168 ; TO MAKE SURE DONE STEPPING 2169 CDA1 04 INR B ;SEEK TO TRACK ZERO? 2170 CDA2 05 DCR B 2171 CDA3 C0 RNZ ;DONE IF NOT 2172 CDA4 3A25EB LDA CCMND+25H ;MUST HAVE TRK ZERO FLAG IF SO 2173 CDA7 E601 ANI 01H 2174 CDA9 C0 RNZ ;OK IF SO 2175 CDAA C373CD JMP STEPIN ;GO STEP MORE IF NOT 2176 ; 2177 ; SECTOR WAIT. ON ENTRY, # SECTORS TO WAIT IS IN D. 2178 ; ON EXIT, D=0 AND ACC=A-STATUS. CALL WAIT1S TO WAIT 2179 ; ONE SECTOR TIME. 2180 ; 2181 CDAD 1601 WAIT1S: MVI D,1 ;WAIT ONE SECTOR TIME 2182 ; 2183 CDAF 3A11EB SCWAIT: LDA CCMND+11H ;RESET SECTOR FLAG 2184 CDB2 3A10EB SCW5: LDA CCMND+10H ;GET A-STATUS CP/M RMAC ASSEM 1.1 #040 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 2185 CDB5 B7 ORA A ;CHECK SECTOR FLAG 2186 CDB6 F2B2CD JP SCW5 ;WAIT FOR IT IF NOT UP 2187 CDB9 3A11EB LDA CCMND+11H ; ELSE RESET SECTOR FLAG 2188 CDBC 15 DCR D ;COUNT DOWN WAIT COUNTER 2189 CDBD C2B2CD JNZ SCW5 ;GO BACK IF MORE TO DO 2190 CDC0 C9 RET ; ELSE RETURN A-STATUS IN ACC 2191 ; 2192 ; DISK ERRORS REPORTED HERE, BECAUSE STUPID BDOS GIVES 2193 ; NO USEFUL INFORMATION. 2194 ; 2195 CDC1 3A08CC DSKERR: LDA COLDB ;IN COLD BOOT? 2196 CDC4 B7 ORA A ;IF SO, CONOUT NOT IN MEM YET 2197 CDC5 C200E8 JNZ CBOOT ;BACK TO N* BOOT ROM ON SAME 2198 CDC8 E5 PUSH H ;SAVE BODY ADDRESS 2199 CDC9 21C908 LXI H,CRLF ;EJECT LINE 2200 CDCC CD6A08 CALL MSGOT 2201 CDCF E1 POP H 2202 CDD0 CD6A08 CALL MSGOT ;REPORT BODY 2203 CDD3 3A03CC LDA HSTDSK ;THIS DISK 2204 ; 2205 ; ENTER HERE AFTER JADE DD I/O ERROR 2206 ; 2207 CDD6 C641 JAERR: ADI 'A' 2208 CDD8 32A908 STA ASCDSK 2209 CDDB 21A408 LXI H,ERRMSG 2210 CDDE CD6A08 CALL MSGOT 2211 CDE1 3A04CC LDA HSTTRK ;THIS TRACK 2212 CDE4 CD9B04 CALL HXBOT 2213 CDE7 21B008 LXI H,SECMSG 2214 CDEA CD6A08 CALL MSGOT 2215 CDED 3A09CC LDA ERSEC ;THIS SECTOR 2216 CDF0 C39B04 JMP HXBOT ;OFF TO HXBOT TO FINISH 2217 ; 2218 CDF2 = EBOOT EQU $-1 ;LAST USED COLD BOOT BYTE 2219 ; 2220 ; 2221 ; NORTH STAR HOST SECTOR BUFFER 2222 ; 2223 CDF3 HSTBUF: DS HSTSIZ ;HOST BUFFER 2224 ; 2225 ************************************************************* 2226 * * 2227 * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * 2228 * * 2229 ************************************************************* 2230 2231 CFF3 00 CPMSEC DB 0 ;CP/M SECTOR # 2232 CFF4 00 CPMDRV DB 0 ;CP/M DRIVE # 2233 CFF5 00 CPMTRK DB 0 ;CP/M TRACK # 2234 CFF6 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT 2235 ; CONTAINS CP/M SECTOR 2236 2237 CFF7 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO 2238 CFF8 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO 2239 CFF9 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO 2240 CP/M RMAC ASSEM 1.1 #041 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 2241 CFFA BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K 2242 ; SECTOR 2243 ; 2244 D3F9 = LAST EQU $-1 ;LAST USED BYTE IN MEM 2245 ; 2246 D3FA END CP/M RMAC ASSEM 1.1 #042 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ACR 000D 178# 415 418 1595 1600 1602 1604 ALF 000A 179# 415 418 1595 1600 1602 1604 ALLOC 0570 909 942 951 958 965 988# ASCDSK 08A9 1598# 2208 AUXIN 0439 252 301# 718# 721 AUXIST 0450 263 299# 748# AUXOST 0458 264 302# 761# AUXOUT 0445 251 300# 733# 736 BDOS B400 194# 1777 BIOS C200 100# 100 110 120 166 168 195# 196 235 239 1773 1826 1837 BIOSR 6180 196# BLOCK 0080 346# 353 540 1519 BOOT CC0A 1857# BOOTA CC00 1828# 1828 1871 BOOTL CC11 1862# 1873 BSIMG 09DF 1518 1773# BUFDRV CFF7 1317 1425 1471 2237# BUFF 0080 174# BUFFER CFFA 1249 1251# 1251 1253# 1254 1255# 1256 1269 1270 1271 1272 1273 1286 1287 1332# 1343 1365 1397 1447 1463 2241# BUFSEC CFF9 1436 2239# BUFTRK CFF8 1429 2238# BUFWRTN 075D 1387 1405# 1419 CALCSH 0399 519# 521 CBOOT E800 210# 243 2197 CCMND EB00 214# 1161 1176 1178 1922 1927 1938 1948 2021 2100 2127 2162 2172 2183 2184 2187 CCP AC00 193# 380 1510 1529 CDISK 0004 173# CHKUNA 0532 927 940# CLEAR 001A 182# COLDB CC08 384 1846# 2195 CONIN 0412 247 661# 664 1488 CONOST 0431 262 704# CONOUT 041E 249 676# 679 856 1578 CONST 0429 246 691# CORDER EA00 213# 2035 2082 2121 COUT 000C 248# CPMBS 7800 192# 193 194 195 CPMDMA 073D 620 1103 1372# CPMDRV CFF4 1315 1469 2232# CPMLD 07F1 403 1515# CPMREV 001E 143# CPMSEC CFF3 609 935 962 999 1081 1296 1347 1784# 2231# CPMSPT 09F5 505 970 1801# CPMSZ D000 191# 192 CPMTRK CFF5 598 902 918 955 1025 1782# 2233# CRLF 08C9 1602# 2199 CRT 0002 95# 387 390 393 396 398 CURDSK CC07 1523 1844# 2027 2034 2055 2080 2132 D0ALL 010B 366# 367 1737 D0CHK 0122 367# 368 1736 D0DPH 099F 438 1232 1730# D1ALL 0132 368# 369 1746 CP/M RMAC ASSEM 1.1 #043 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 D1CHK 0149 369# 370 1745 D1DPH 09AF 1236 1739# D2ALL 0159 370# 371 1758 D2CHK 01EF 371# 372 1757 D2DPB 09F8 1756 1811# D2DPH 09BF 1751# D3ALL 022F 372# 373 1768 D3CHK 02C5 373# 374 1767 D3DPB CC0A 1766 1855# D3DPH 09CF 1761# DEFDSK 0004 198# 1491 1497 DEL5 00C5 409# 412 DELAY 00C2 385 388 391 394 397 408# DEVINI 006D 266 306# DEVTBL 0063 265 285# DFIMG 09E3 1508 1557 1775# DIRBUF 008B 362# 366 1734 1743 1755 1765 DIVDONE 070B 1304 1311# DIVLOOP 0702 1303# 1309 DJDMA E412 157# 1448 DJDRV 005A 278# 1428 DJHOME E409 154# 1433 DJRAM E400 153# 154 155 156 157 158 159 160 161 162 DJRD 06F1 898 904 1279# DJREAD E415 158# 1449 1474 DJSEC E40F 156# 1446 DJSEL E41B 160# 278 DJSIDE E430 162# 1442 DJSTAT E427 161# DJTRK E40C 155# 1435 DJWR 06EA 914 920 1260# DJWRITE E418 159# 1408 DPB8 094F 539 1702# DPBAD 03DC 502 537 570# DPBNSD 0905 483 1629# DPBNSL 0915 487 1663# DPBNSS 0925 479 1682# DPBSZ 0010 538 1810# 1811 DRVTBL 0069 267 293# DSKERR CDC1 1067 1224 1964 1968 2052 2195# DSKRD 04DA 873 896# DSKWR 04FC 861 912# DTPTR 09ED 440 489 528 548 562 570 1788# DTSLOP 0718 1320# 1327 EBOOT CDF2 2218# ENDOV 0305 374# 420 421 ENTPSW CC33 876 891 1898# ENTRY 0005 176# 1413 ERFLAG CC06 474 996 1042 1059 1069 1073 1135 1156 1164 1220 1565 1843# 1913 1956 1966 1994 2050 2087 ERRMSG 08A4 1597# 2209 ERSEC CC09 1847# 2096 2215 FALSE 0000 119 132# 133 172 FILHST 05C1 1014 1046# FILL 07A8 1336 1463# 1467# FLUSH 0067 270 289# CP/M RMAC ASSEM 1.1 #044 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 FLUSHA 075C 1397# 1402# 1467 GNSDA 06E2 1235 1237# GNSDEN 06D5 1062 1152 1232# HOME 03E7 253 580# 584# HSTACT 09EB 588 1010 1526 1786# HSTADR CC01 1166 1530 1542 1544 1556 1837# 1867 1870 1972 HSTBUF CDF3 379 484 1092 1509 1555 1858 2223# HSTDSK CC03 467 1019 1047 1055 1093 1121 1149 1233 1525 1839# 2010 2061 2203 HSTSEC CC05 470 1033 1049 1539 1545 1553 1842# 1865 2094 HSTSIZ 0200 200# 379 1509 1541 1826 1858 1868 2223 HSTTRK CC04 469 1026 1532 1550 1840# 2071 2211 HSTWRT 09EC 585 1039 1051 1112 1148 1527 1787# HXBOT 049B 843# 2212 2216 HXNOT 04A4 848 850# IDSZE 0008 1609# INIT 008B 379# 1874 INTDI 04CB 471 860 872 885# INTEN 04BF 473 862 875# INTEN5 04C9 879 882# INTO 074A 110 580 1249 1252 1252 1255 1274 1342 1378 1383# 1398 IOIMG 09E2 1774# JADEID 08D5 1608# 1609 JAERR CDD6 2207# JIOMSG 089A 1595# JTRAN 040E 628 635# KBYTE 0400 190# 191 192 LAST D3F9 2244# LDAI 57ED 184# 888 LDRBIOS 0000 115 117 118 119 127 172# 228 298 711 LG3740 03B2 536# LIST 0472 250 303# 794# 797 827 LISTST 0493 260 304# 831# LOGFLG 09EF 447 529 1789# LOGNSD 036E 481 486 489# MATCH 0606 1035 1054 1065 1079# 1286 MAXDISK 0004 181# 428 1503 MOTHR 0000 94# 95 383 MOVE 0071 272 327 332# 337 342 MOVER 006E 318# 323# 1379 1384 MSGL 086B 1576# 1583 MSGLE 08CB 1568 1604# MSGOT 086A 400 1487 1569 1575# 2200 2202 2210 2214 MSGSO 00CC 399 415# MULTIO 006D 268 307# NIPMSG 088F 1593# 2051 NJBUF 0628 1095 1101# NKSYS 0034 189# 191 417 417 NOLOG 037E 450 498 502# 541 NOMATCH 05B5 1021 1028 1039# NOOVF 0569 972 982# NOSHF 039F 516 524# NOTJR 04F1 901 906# NOTJW 0513 917 922# NOTNSR 05FE 1057 1072# CP/M RMAC ASSEM 1.1 #045 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 NOTRDY 07BD 1483# 2053 NOTZ80 04D8 887 893# NRD 08BC 1485 1601# NRDMSG 08B5 1486 1600# NSCNT CC2D 1153 1169 1881# 2007 2077 NSDENS CC2C 477 1063 1879# 1943 1974 NSPOUT 047E 804# NSTRK CC2E 1521 1886# 2064 ORIGIN E000 152# 153 OUTOF 0745 1379# PARIN 0460 774# 777 PINPST 048B 818# POSC5 CD4D 2099# 2105 POSEC CD44 1159 1919 2094# PREP 0763 1412# 1418# 1475 PRVCHK 0A08 1824# RDWR 0740 1280 1376# READ 04B9 258 593 604 872# 1247 1252 1269# 1288# 1412 1413 READ15 CC92 1950 1972# READ20 CC9B 1977# 1991 READ5 CC69 1948# 1952 READHST CC35 472 1058 1907# READNS CC42 1564 1862 1919# READOP CC31 908 923 1105 1895# READRT CC3A 1911# 1960 REDWRT 06F5 1284# 1292# RERMSG 0887 1591# 1997 RERR CC79 1956# 1998 RESERV1 006D 280 311# RESERV2 006D 281 312# RETRIES 000A 177# 1412 1422 RETRYLP 076C 1424# 1459 RETRYOP 079A 1420 1451# REVNUM 000A 142# RSFLAG CC30 983 991 1052 1894# RTCNT CC2B 1878# 1909 1957 1959 RWMOVE 063B 1107 1115# 1120 RWOPER 0578 984 995# RWOPSH 0584 1002# 1005 SCW5 CDB2 2184# 2186 2189 SCWAIT CDAF 2024 2038 2161 2183# SDEMSG 0880 1066 1590# SECMOV 0727 1321 1342# 1347# SECMSG 08B0 1599# 2213 SECMSK 09F7 527 1079 1804# SECPSEC 072C 1352# SECSHF 09F6 524 896 912 997 1802# SECSIZ 06F6 1293# SECSZ 0080 199# 366 1104 SECTRAN 0403 261 626# SEEK CD5D 580 592 603 2069 2073 2116# SEKDSK 09E7 430 456 899 915 933 948 1018 1046 1483 1781# SEKHST 09EA 1006 1032 1048 1785# SELMEM 006D 274 309# SET10 CCE0 2025 2033# SET15 CCEE 2041# 2045 CP/M RMAC ASSEM 1.1 #046 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 SET20 CD10 2029 2043 2061# SET25 CD3F 2076 2079 2086# SET5 CCD9 2022 2027# SETBNK 006D 275 310# SETDMA 03FD 257 614# 618# SETDRV 0305 254 426# SETSEC 03F8 256 603# 608# SETTRK 03F3 255 587 592# 597# SETUP CCBA 1154 1561 1859 1911 2007# 2056 SNFERR CC89 1160 1920 1966# SNFMSG 0894 1594# 1967 SPACE 0020 180# STEPIN CD73 2123 2132# 2166 2175 STEPW1 CD83 2146# 2150 STEPW2 CD85 2147# 2148 SYEMSG 088B 1592# 1954 TPA 0100 175# TR1024 03CE 556# TR3740 03C4 536 546# TRAN5D 08DD 482 1614# TRAN5S 0000 478 1678# TRAN8 0935 546 1696# TRCOM 03C7 548# 557 TRN124 095F 556 1717# TRNONE 03D4 561# TRUE FFFF 115 133# TRUESEC CFF6 1313 2234# UNACNT 09F0 932 940 947 989 1528 1792# UNADSK 09F1 934 949 1793# UNASEC 09F3 936 963 1796# UNATRK 09F2 956 977 1794# UNAVAL 09F4 511 931 1800# WAIT1S CDAD 2019 2041 2099 2164 2167 2181# WAITRE CC4D 1927# 1929 WBOOT 07D4 245 1496# WBOOTE 0003 244# WDATA E900 211# 1184 1186 1192 WECHK 085E 1562 1565# WPEMSG 0879 1223 1589# WPERR 06CF 1165 1223# WRALL 0000 204# WRDIR 0001 205# 1128 WREAD 0822 1539# 1548 WRIT10 069C 1178# 1180 WRIT15 06A4 1184# 1188 WRIT17 06AE 1192# 1194 WRIT20 06B5 1200# 1215 WRIT5 0699 1172 1176# WRITE 04B0 259 593 604 860# 1247 1249# 1412 1413 WRITEHST 065A 1041 1134 1146# WRITTYP 0754 1261 1389# 1392 WRMOK 07E6 1504 1507# WRMRD 085B 1540 1554 1564# WRTYPE CC32 907 925 1127 1896# WRUAL 0002 206# 906 926 WSETUP 0855 1533 1551 1561# CP/M RMAC ASSEM 1.1 #047 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 XMOVE 006D 276 308# ?AUXI 0015 223 252# ?AUXIS 0036 226 263# ?AUXO 0012 223 251# ?AUXOS 0039 226 264# ?BNKSL 0051 227 274# ?BOOT 0000 223 243# ?CONIN 0009 223 247# ?CONO 000C 223 249# ?CONOS 0033 226 262# ?CONST 0006 223 246# ?DEVIN 003F 226 266# ?DRTBL 0042 226 267# ?DVTAB 003C 226 265# ?FLUSH 0048 226 270# ?HOME 0018 224 253# ?LIST 000F 223 250# ?LISTS 002D 225 260# ?MLTIO 0045 226 268# ?MOV 004B 227 272# ?READ 0027 224 258# ?SCTRN 0030 225 261# ?SLDSK 001B 224 254# ?STBNK 0054 227 275# ?STDMA 0024 224 257# ?STSEC 0021 224 256# ?STTRK 001E 224 255# ?TIM 004E 227 273# ?TIME 006D 273 313# ?WBOOT 0003 223 245# ?WRITE 002A 224 259# ?XMOV 0057 227 276# @AIVEC 0000 230 @AOVEC 0000 230 @CIVEC 0000 230 @COVEC 0000 230 @LOVEC 0000 230 @MXTPA 0000 230