37160 ;OUP/M BIOS WRITTEN BY SHAO,JIAN-XIONG 37170 ;ON JULY 1982 37180 ;ERROR NO. LISTING 37190 ;$20 INDEX HOLE FOUND WHILE WRITING 37200 ;$21 INDEX HOLE FOUND WHILE READING 37210 ;$22 DRIVE NOT READY 37220 ;$23 TRACK NOT MATCH 37230 ;$24 DISK WRITING PROTECTION 37240 ;$25 I/O DEVICE NOT DEFINED 37250 ;$40 BUFFER AND DISK NOT MATCH 37260 ;$80 PARITY ERROR 37270 *=$E41A ;OPBIOS START ADDR. 37280 START=$00 37290 IOBYTE=$03 ;I/0 BYTE 37300 COUNTER=$04 ;PAGE NO. COUNTER 37310 DEREG=$09 ;WORK STORAGES 37320 HLREG=$0B 37330 HLREG1=$00 37340 FLAG=$0F 37350 TEMP=$1F 37360 IOBFFG=$39 ;'FLUSH' FLAG 37370 CRTDSK=$3A ;CURRENT DISK NO. 37380 BLKNB1=$42 ;BLOCK# 37390 SECNB1=$43 ;SECTOR# 37400 TKNDER=$44 ;PREVIOUS TRACK# WHICH THEN 37410 ;CHANGE TO DESIRED TRACK# 37420 TRKDRC=$45 ;DESIRED TRACK# 37430 DMAREG=$46 ;DMA ADDRESS 37440 TRKCRN=$48 ;HEAD POSITION TRACK# 37450 TKTMAX=$49 ;MAX TIMES FOR MATCHING TRACK# 37460 ERORFG=$4A ;ERROR FLAG 37470 STATFG=$4B ;STATE FLAG 37480 IOBUFA=$4C 37490 PAGNUB=$4E ;PAGE COUNT 37500 ERTMAX=$4F ;R/W MAX TIMES 37510 DVACIA=$C010 ;DISK I/O PORT 37520 DVPIA1=$C000 ;DISK CONTROL 37530 DVPIA2=$C002 ;DISK CONTROL 37540 CLACIA=$FC00 ;CONSOLE I/O PORT 37550 PTACIA=$CF02 ;PRINTER I/O PORT 37560 SLACIA=$CF00 ;SERIAL COMMUNICATION I/O PORT 37570 USACI1=$FB03 ;USER USING I/O PORT 37580 USACI2=$F400 ;USER USING I/O PORT 37590 IOBUF=$B000 ;DISK I/O BUFFER ADDR. 37600 CCPSAT=$D000 ;CCP ENTRY NO. 1 37610 CCPST1=$D3F5 ;CCP ENTRY NO. 2 37620 BDOS=$D93F ;BDOS ENTRY 37630 WHBCOT .BYTE $28 37640 FRYCST .BYTE $62 37650 DKCONT .BYTE $40,$00 37660 DIKCRT .BYTE $00 37670 PAMTAB .WORD DIRBUF,MAPAR0,CHKAR0,$0000 ;DIAK PARA. 37680 .WORD HIRBUF,MAPAR1,CHKAR1,$0000 ;HEAD TABLE 37690 ; 37700 ; ***************************************************** 37710 ; * * 37720 ; * NUMBER 0 : INITIALIZE INPUT/OUTPUT PORT * 37730 ; * * 37740 ; ***************************************************** 37750 ; 37760 B00T=* 37770 ; 37780 LDA #$80 ;SET IOBYTE TO INDICATE SELECTING 37790 ;PRINTER IN LIST FIELD AND 37800 STA IOBYTE ;SELECTING CONSOLE IN CONSLE FIELD 37810 LDY #$00 ;SET DVPIA1+1 BIT 2 TO ZERO,INDICAT 37820 ;DVPIA1 IS DIRECTION REGISTER NOW. 37830 STA DVPIA1+1 37840 LDY #$40 ;SET DVPIA1 BIT 6 OUTPUT AND REST 37850 ;INPUT 37860 STY DVPIA1 37870 LDY #$04 ;SET BACK INDICATING DVPIA1 IS 37880 ;CONTROL GATE NOW 37890 STY DVPIA1+1 37900 LDA #$03 ;INITIAIZE CONSOLE PORT 37910 STA CLACIA 37920 LDY #$11 37930 STY CLACIA 37940 STA PTACIA ;INITIALIZE PRINTER PORT 37950 STY PTACIA 37960 STA SLACIA ;INITIALIZE SERIAL COMMUN. PORT 37970 STY SLACIA 37980 LDA USACI1+3 ;INITIALIZE USER PORT1 37990 LDX #$FF 38000 STX USACI1+2 38010 LDY #$00 ;INITIALIZE USER PORT2 38020 STY USACI2+1 38030 STY USACI2 38040 STY USACI2+3 38050 STX USACI2+2 38060 LDA #$04 38070 STA USACI2+1 38080 STA USACI2+3 38090 RTS 38100 ; 38110 ; ***************************************************** 38120 ; * * 38130 ; * NUMBER 1 : WARM BOOT * 38140 ; * * 38150 ; ***************************************************** 38160 ; 38170 WBOOT=* 38180 ; 38190 NOP 38200 LDA #CCPSAT ;SET STARTING ADDR, OF CCP FOR DMA 38210 LDX #CCPSAT/256 30220 JSR STDMA1 38230 LDA #$00 ;SELECT DRIVE A 38240 STA DIKCRT 38250 JSR DIKSEL 38260 LDA #$01 ;SELECT TRACK 1 38270 STA TRKDRC 38280 LDA #$00 ;SELECT SECTOR 00 38290 STA SECNB1 38300 LDA #$10 ;SET READ SECTOR FLAG 38310 STA FLAG 38320 W$OOT=* 38330 JSR RWDBS1 ;READ A SECTOR FROM DISK 38340 CLC 38350 LDA #$80 ;NO INCREASE DMAREG TO GET NEXT 38360 ;SECTOR 38370 ADC DMAREG 38380 STA DMAREG 38390 BCC WB$OT 38400 INC DMAREG+1 38410 WB$OT=* 38420 INC SECNB1 ;SET SECTOR NUMBER WITHIN ONE TRACK 38430 LDA SECNB1 38440 CMP #$1C ;ONE TRACK IS DONE? 38450 BNE W$OOT ;IF NOT,KEPT READING 38460 LDA #DFBUFA ;RECOVE DEFAULT BUFFER 38470 LDX #DFBUFA/256 38480 JSR STDMA1 38490 LDA #$4C 38500 STA START+5 ;SET JMP BDOS AT$05 38510 STA START ;SET JMP WBOOT AT $00 38520 LDA #WBOOT 38530 STA START+1 38540 LDA #WBOOT/256 38550 STA START+2 38560 LDA #BDOS 38570 STA START+6 38580 LDA #BDOS/256 38590 STA START+7 38600 LDA #$00 38610 STA IOBFFG 38620 JMP CCPSAT 38630 ; 38640 C0NTST=* ;CONSOLE TEST FOR RECEIVE READY 38650 ; 38660 LDA CLACIA ;TEST BIT 0 OF CLACIA FOR READY 38670 AND #$01 38680 BNE C$LTST 38690 RTS ;IF NOT READY,RETURN WITH A=$00 38700 C$LTST=* 38710 LDA #$FF ;IF READY,RETURN WITH A=$FF 33720 RTS 38730 ; 38740 CONIN=* ;READ A CHARACTER FROM CONSOLE 38750 ; 38760 JSR CONTST ;TEST FOR CONSOLE'S READY,IF NOT 38770 BEQ CONIN ;KEPT TESTING 38780 LDA CLACIA+1 ;IF READY,READ A CHARACTER 38790 AND #$7F ;MASK OFF IT'S BIT 7 38800 RTS 38810 ; 38820 CONTOT=* ;CONSOLE TEST FOR TRANSMIT READY 38830 ; 38840 LDA CLACIA ;TEST BIT1 OF CLACIA FOR READY 38850 AND #$02 38860 BNE C$NTOT 38870 RTS ;IF NOT READY,RETURN WITH A=$00 38880 C$NTOT=* 38890 LDA #$FF ;IF READY,RETURN WITH A=$FF 38900 RTS 38910 ; 38920 CONOUT=* ;OUTPUT A CHARACTER TO CONSOLE 38930 ; 38940 JSR CONTOT ;KEPT TESTING UNTIL IS READY 38950 BEQ CONOUT 38960 STX CLACIA+1 ;SENT A CHARACTER TO CONSOLE 38970 RTS 38980 ; 38990 PRTTST=* ;PRINTER TEST FOR TRANSMIT READY 39000 ; 39010 LDA PTACIA ;TEST BIT1 OF PTACIA FOR READY 39020 AND #$02 39030 BNE P$TTST 39040 RTS ;IF NOT READY,RETURN WITH A=$00 39050 P$TTST=* 39060 LDA #$FF ;IF READY, RETURN WITH A=$FF 39070 RTS 39080 ; 39090 PRTOUT=* ;PRINTER OUTPUT 39100 ; 39110 JSR PRTTST ;KEPT TESTING,UNTIL IS READY 39120 BEQ PRTOUT 39130 STX PTACIA+1 ;OUTPUT A CHARACTER 39140 LDA PTACIA ;TEST FOR RECEIVING READY 39150 AND #$01 39160 BNE P$TOUT 39170 RTS ;IF NOT,RETURN 39180 P$TOUT=* 39190 LDA PTACIA+1 ;IF READY,READ A CHARACTER 39200 CMP #$13 ;CONTROL-S 39210 BNE PR$OUT ;IF NOT CONTROL-S RETURN 39220 RTS 39230 PR$OUT=* 39240 LDA PTACIA ;IF CONTROL-S WAIT UNTL CONTROL-Q 39250 AND #$01 ;IS RECEIVED 39260 BEQ PR$OUT 39270 CMP #$11 39280 BNE PR$OUT 39290 RTS 39300 ; 39310 SRLTST=* ;SERIAL COMMUN. RECEIVE READY TEST 39320 ; 39330 LDA SLACIA ;THE BIT 0 OF SLACIA FOR READY 39340 AND #$01 39350 BNE S$LTST ;NOT,RETURN WITH A=$00 39340 RTS 39370 S$LTST=* 393S0 LDA #$FF ;READY,RETURN WITH A=$FF 39390 RTS 39400 ; 39410 SRLIN=* 39420 ; 39430 JSR SRLTST ;KEPT TESTING,UNTIL IS READY 39440 BEQ SRLIN 39450 LDA SLACIA+1 ;READ A CHARACTER 39460 AND #$7F ;MASK OFF IT'S BIT 7 39470 RTS 39480 ; 39490 SRLTOT=* ;SERIAL COMMUN. TRANSMIT READY TEST 39500 ; 39510 LDA SLACIA ;TEST BIT 1 OF SLACIA FOR READY 39520 AND #$02 39530 BNE S$LTOT 39540 RTS ;IF NOT,RETURN WITH A=$00 39550 S$LTOT=* 39560 LDA #$FF ;IF READY,RETURN WITH A=$FF 39570 RTS 39580 ; 39590 SRLOUT=* 39600 ; 39610 JSR SRLTOT ;KEPT TESTING,UNTIL SLACIA IS 39620 ;READY 39630 BEQ SRLOUT 39640 STX SLACIA+1 ;OUTPUT A CHARACTER 39650 RTS 39660 ; 39670 ; 39680 OUTBFF=* 39690 ; 39700 LDY #$00 39710 OU$BFF=* 39720 LDA (DEREG),Y 39730 CMP #$24 39740 BNE O$TBFF 39750 RTS 39760 O$TBFF=* 39770 TAX 39780 JSR CONOUT 39790 INY 39800 BNE OU$BFF 39810 ; 39820 ; 39830 ; 39840 ; ***************************************************** 39850 ; * * 39860 ; * NUMBER 2 : SAMPLE THE STATUS OF THE CURRENTLY * 39870 ; * ASSIGNED CONSOLE DEVICE * 39880 ; * * 39890 ; ***************************************************** 39900 ; * * 39910 ; * RETURNED VALUE : * 39920 ; * REGISTER A : $FF READY TO READ * 39930 ; * $00 NOT READY * 39940 ; * * 39950 ; ***************************************************** 39960 ; 39970 CSLTET=* 39980 ; 39990 LDA IOBYTE ;GET THE CONSLE FIELD OF IOBYTE 40000 AND #$03 40010 BNE C$LTET 40020 JMP CONTST ;IF #$00 TO CONSOLE TEST 40030 C$LTET=* 40040 CMP #$01 40050 BNE CS$TET 40060 JMP PRTTST ;IF #$01 TO PRINT TEST 40070 CS$TET=* 40080 CMP #$03 40090 BNE CSL$ET 40100 JMP USRTST ;IF #$03 TO USER TEST 40110 CSL$ET=* 40120 JMP SRLTST ;IF #$02 TO SERIAL TEST 40130 ; 40140 ; ***************************************************** 40150 ; * * 40160 ; * NUMBER 3 : READ FROM THE CURRENT ASSIGNED CONSLE * 40170 ; * DEVICE * 40180 ; * * 40190 ; ***************************************************** 40200 ; * * 40210 ; * RETURNED VALUE : * 40220 ; * REGISTER A : CHARACTER TO BE READ IN * 40230 ; * * 40240 ; ***************************************************** 40250 ; 40260 CLINN=* 40270 ; 40280 LDA IOBYTE ;GET THE CONSOLE FIELD OF IOBYTE 40290 AND #$03 40300 BNE C$INN 40310 CLIN$=* 40320 JMP CONIN ;IF #$00 TO CONSOLE IN 40330 C$INN=* 40340 CMP #$01 40350 BNE CL$NN 40360 JMP SRLIN ;IF #$01 TO SERIAL COMMUNICATOR IN 40370 CL$NN=* 40380 CMP #$03 40390 BNE CLIN$ ;IF #$02 TO CONSOLE IN 40400 JMP USRIN ;IF #$30 TO USERIN 40410 ; 40420 ; ***************************************************** 40430 ; * * 40440 ; * NUMBER 4 : OUTPUT CHARACTER TO THE CURRENTLY * 40450 ; * ASSIGNED CONSOLE DEVICES * 40460 ; * * 40470 ; ***************************************************** 40480 ; * * 40490 ; * ENTRY PARAMETERS 1 * 40500 ; * REGISTER A : CHARACTER TO BE OUTPUT * 40510 ; * * 40520 ; ***************************************************** 40530 ; 40540 CLOUTT=* 40550 ; 40560 TAX 40570 LDA IOBYTE ;GET CONSOLE FIELD OF IOBYTE 40580 AND #$03 40590 BNE C$OUTT 40600 CLOU$T=* 40610 JMP CONOUT ;IF #$00 TO CONSLE OUT 40620 C$OUTT=* 40630 CMP #$01 40640 BNE CL$UTT 40650 JMP SRLOUT ;IF #$01 TO SERIAL COMMUNICATON OUT 40660 CL$UTT=* 40670 CMP #$03 40680 BNE CLOU$T ;IF #$02 TO CONSOLE OUT 40690 JMP USROUT ;IF #$03 TO USER OUT 40700 ; 40710 ; ***************************************************** 40720 ; * * 40730 ; * NUMBER 5 : OUTPUT CHARACTER TO THE CURRENTLY * 40740 ; * ASSIGNED LIST DEVICE * 40750 ; * * 40760 ; ***************************************************** 40770 ; * * 40780 ; * ENTRY PARAMETERS : * 40790 ; * REGISTER A : CHARACTER TO BE OUTPUT * 40800 ; * * 40810 ; ***************************************************** 40820 ; 40830 LITOUT=* 40840 ; 40850 TAX 40860 LDA IOBYTE ;GET LIST FIELD OF IOBYTE 40870 AND #$C0 40880 BNE L$TOUT 40890 LITO$T=* 40900 JMP CONOUT ;IF #$00 TO CONSLE OUT 40910 L$T0UT=* 40920 CMP #$01 40930 BNE LI$OUT 40940 JMP SRLOUT ;IF #$01 TO SERIAL COMMUN. OUT 40950 LI$OUT=* 40960 CMP #$03 40970 BEQ LITO$T ;IF #$03 TO CONSOLE 40980 JMP PRTOUT ;IF #$02 TO PRINTER OUT 40990 ; 41000 ; ***************************************************** 41010 ; * * 41020 ; * NUMBER 6 : OUTPUT A CHARACTER TO THE CURRENTLY * 41030 ; * ASSIGNED PUNSH DEVICE * 41040 ; * * 41060 ; ***************************************************** 41050 ; * * 41070 ; * ENTRY PARAMETERS : * 41080 ; * REGISTER A : A CHARACTER TO BE OUTPUT * 41090 ; * * 41100 ; ***************************************************** 41110 ; 41120 PUHOUT=* ;RESERVE FOR FURTHER USE 41130 ; 41140 ; ***************************************************** 41150 ; * * 41160 ; * NUMBER 7 : READ A CHARACTER FROM THE CURRENTYLY * 41170 ; * ASSIGNED READER DEVICE * 41180 ; * * 41190 ; ***************************************************** 41200 ; * * 41210 ; * RETURNED VALUE : * 41220 ; * REGISTER A : A CHARACTER BE READ IN * 41230 ; * * 41240 ; ***************************************************** 41250 ; 41260 READIN=* ;RESERVE FOR FURTHER USE 41270 ; 41280 USRTST=* ;RESERVE FOR FURTHER USE 41290 USROUT=* ;AS ABOVE 41300 USRIN=* ;AS ABOVE 41310 LDA #$25 41320 JMP ERROR 41330 ; 41340 DELAYB=* ;DELAY ROUTINE 41350 ; 41360 INC DELYMR 41370 INC DELYMR 41380 INC DELYMR 41390 INC DELYMR 41400 RTS 41410 DELYMR*=*+1 41420 ; 41430 ; 41440 DELYMS=* ;DELAY 1 MS 41450 ; 41460 JSR DELAYB 41470 DEY 41480 BNE DELYMS 41490 RTS 41500 ; 41510 DLYMS1=* ;DELAY (X) MS 41520 ; 41530 LDX #$0C 41540 D$YMS1=* 41550 LDY FRYCST 41560 JSR DELYMS 41570 DEX 41580 BNE D$YMS1 41590 DL$MS1=* 41600 RTS 41610 ; 41620 DELYUS=* ;DELAY (X)*100 US 41630 ; 41640 LDA FRYCST 41650 D$LYUS=* 41660 BIT $00 41670 SEC 41680 SBC #$05 41690 BCS D$LYUS 41700 DEX 41710 BNE DELYUS 41720 RTS 41730 ; 41740 ; ***************************************************** 41750 ; * * 41760 ; * NUMBER 8 : POSITION HEAD TO TRACK 0 * 41770 ; * * 41780 ; ***************************************************** 41790 ; 41800 HOMEHD=* ;HOME HEAD TO ZERO 41810 ; 41820 JSR STPIN 41830 JSR DLYMS1 41840 STY TRKCRN 41850 STY TKNDER 41860 H$MEHD=* 41870 LDA #$02 41880 BIT DVPIA1 41890 BEQ DLYMS1 41900 JSR STPOUT 41910 BEQ H$MEHD 41920 ; 41930 ASLDS1= ;(A) * 2'S POWER OF (X) 41940 ; 41950 ASL A 41960 ROL TEMP 41970 DEX 41980 BNE ASLDS1 41990 RTS 42000 ; 42010 ADCOF1=* 42020 ; 42030 CLC 42040 ADC HLREG 42050 STA HLREG 42060 LDA TEMP 42070 ADC HLREG+1 42080 STA HLREG+1 42090 RTS 42100 ; 42110 ADCIOF=* 42120 ; 42130 LDX #IOBUF 42140 STX HLREG 42150 LDX #IOBUF/256 42160 STX HLREG+1 42170 JMP ADCOF1 42180 ; 42190 DIKSEL= ;GET DESIRED DISK PARAMETERS 42200 ; 42210 LDX DIKCRT 42220 LDA DKCONT,X 42230 STA DVPIA1 42240 LDA #$FF 42250 STA DVPIA2 42260 D$KSEL=* 42270 LDA #$10 42280 CPX #$01 42290 BEQ DI$SEL 42300 LDA #$01 42310 DI$SEL=* 42320 BIT DVPIA1 42330 RTS 42340 ; 42350 ; ***************************************************** 42360 ; * * 42370 ; * NUMBER 9 : SELECT DISK * 42380 ; * * 42390 ; ***************************************************** 42400 ; * * 42410 ; * ENTRY PARAMETERS : * 42420 ; * REGISTER A : DISK NUMBER * 42430 ; * * 42440 ; ***************************************************** 42450 ; 42460 DKSEL1=* 42470 ; 42480 STA DIKCRT ;STORE DESIRED DISK NO. 42490 LDX #$03 ;*8 TO GET OFFSET 42500 JSR ASLDS1 42510 LDX #PAMTAB 42520 STX HLREG 42530 LDX #PAMTAB/256 42540 STX HLREG+1 42550 LDX #$00 42560 STX TEMP 42570 JSR ADCOF1 ;GET DESIRED ENTRY ADDR. 42580 JSR DIKSEL ;GET PARA. & TEST DISK READY 42590 BNE D$SEL1 42600 JMP HOMEHD ;READY! HOME HEAD 42610 D$SEL1=* 42620 JMP TRKPS1 ;IF DISK NOT READY,ERR 42630 ; 42640 ; ***************************************************** 42650 ; * * 42660 ; * NUMBER 10 : SET TRACK NUMBER * 42670 ; * * 42680 ; ***************************************************** 42690 ; * * 42700 ; * ENTRY PARAMETERS : * 42710 ; * REGISTER A : TRACK NUMBER * 42720 ; * * 42730 ; ***************************************************** 42740 ; 42750 SETTR1=* 42760 ; 42770 STA TRKDRC 42780 RTS 42790 ; 42800 ; ***************************************************** 42810 ; * * 42820 ; * NUMBER 11 : SET SECTOR NUMBER * 42830 ; * * 42840 ; ***************************************************** 42850 ; * * 42860 ; * ENTRY PARAMETERS : * 42870 ; * REGISTER A : SECTOR NUMBER * 42880 ; * * 42890 ; ***************************************************** 42900 ; 42910 SETSC1=* 42920 ; 42930 STA SECNB1 42940 RTS 42950 ; 42960 ; ***************************************************** 42970 ; * * 42980 ; * NUMBER 12 : SET BLOCK NUMBER * 42990 ; * * 43000 ; ***************************************************** 43010 ; * * 43020 ; * ENTRY PARAMETERS : * 43030 ; * REGISTER A : BLOCK NUMBER * 43040 ; * * 43050 ; ***************************************************** 43060 ; 43070 SETBL1=* 43080 ; 43090 STA BLKNB1 43100 RTS 43110 ; 43120 ; ***************************************************** 43130 ; * * 43140 ; * NUMBER 13 : SET DMA * 43150 ; * * 43160 ; ***************************************************** 43170 ; * * 43180 ; * ENTRY PARAMETERS : * 43190 ; * REGISTER A,X : DMA ADDRESS * 43200 ; * * 43210 ; ***************************************************** 43220 ; 43230 STDMA1=* 43240 ; 43250 STA DMAREG 43260 STX DMAREG+1 43270 RTS 43280 ; 43290 SEKIHL=* ;SEEK INDEX HOLE 43300 ; 43310 LDA DVPIA1 43320 BMI SEKIHL 43330 S$KIHL=* 43340 LDA DVPIA1 43350 BPL S$KIHL 43360 RTS 43370 ; 43380 STPOUT=* ;STEP OUT ONE TRACK 43390 ; 43400 LDA DVPIA2 ;SET BIT 2 OF DVPIA2 43410 ORA #$04 43420 BNE STEP 43430 STPIN=* ;STEP IN ONE TRACK 43440 LDA #$FB 43450 AND DVPIA2 ;RESET BIT 2 OF DVPIA2 43460 STEP=* 43470 STA DVPIA2 ;STEP IN OR OUT ACCORDINGLY 43480 JSR DL$MS1 ;DELAY! 43490 AND #$F7 ;SENT A PULSE TO STEP HEAD 43500 STA DVPIA2 43510 JSR DL$MS1 43520 JSR DL$MS1 43530 ORA #$08 43540 STA DVPIA2 43550 JSR DL$MS1 ;DELAY! 43560 LDX #$08 43570 JMP D$YMS1 ;DELAY! 43580 ; 43590 SIHSDK=* ;SEEK HOLE ,SET ACIA 43600 ; 43610 JSR SEKIHL 43620 LDA #$03 43630 STA DVACIA 43640 LDA #$58 43650 STA DVACIA 43660 RTS 43670 ; 43680 LDHEAD=* ;LOAD HEAD 43690 ; 43700 LDA #$7F ;RESET BIT 7 OF DVPIA2 43710 AND DVPIA2 43720 L$HEAD=* 43730 STA DVPIA2 ;LOAD OR UNLOAD HEAD ACCORDINGLY 43740 LDX #$28 ;DELAY 43750 JMP D$YMS1 43760 ; 43770 UNLDHD=* ;UNLOAD HEAD 43780 LDA #$80 ;SET BIT 7 OF DVAPIA2 43790 ORA DVPIA2 43800 BNE L$HEAD 43810 ; 43820 WRTDIK=* ;WRITE A BYTE TO DISK 43830 ; 43840 LDA DVPIA1 ;INDEX HOLE FOUND? 43850 BPL W$TDIK 43860 LDA DVACIA ;READY? 43870 LSR A 43880 LSR A 43890 BCC WRTDIK ;IF NO,KEEP TESTING! 43900 STX DVACIA+1 ;WRITE A BYTE TO DISK 43910 RTS 43920 W$TDIK=* 43930 LDA #$20 ;IF INDEX HOLE FOUND, ERR! 43940 JMP ERROR 43950 ; 43960 REDDIK=* ;READ ABYTE FROM DISK 43970 ; 43980 LDA DVPIA1 ;INDEX HOLE FOUND? 43990 BPL R$DDIK ;FOUND, ERROR! 44000 LDA DVACIA ;READY? 44010 LSR A 44020 BCC REDDIK ;IF NO, KEEP TESTING 44030 LDA DVACIA+1 ;READ IN A CHAR. 44040 RTS 44050 R$DDIK=* 44060 LDA #$21 ;INDEX HOLE FOUND,ERROR! 44070 JMP ERROR 44080 ; 44090 TRKPSA=* ;PUT HEAD TO DESIRED TRACK 44100 ; 44110 LDX DIKCRT ;DESIRED DISK READY? 44120 JSR D$KSEL 44130 BEQ T$KPSA 44140 TRKPS1=* 44150 LDA #$22 ;NOT READY,ERROR! 44160 JMP ERROR 44170 T$KPSA=* 44180 LDA TKNDER ;CURRENT DESIRED TRACK = 44190 CMP TRKCRN ;CURRENT HEAD POSITION? 44200 BEG TR$PSA ;IF EQUAL, FINISH STEPIN6 44210 BCS TRK$SA ;IF GREATER,STEP IN ONE TRACK 44220 JSR STPOUT ;OIF LESS,STEP OUT ONE TARACK 44230 LDA #$99 ;AND SET 'A' TO 99 INDICATING 44240 BCC TRKP$A ;SUBTRACTING ONE TRACK 44250 TRK$SA=* 44260 JSR STPIN 44270 TXA 44280 TRKP$A=* 44290 SED 44300 ADC TRKCRN ;+ (OR -) ONE TO (OR FROM) 44310 STA TRKCRN ;CURRENT HEAD POSITION 44320 CLD 44330 JMP T$KPSA ;KEEP STEPIN6 UNTIL DONE 44340 TR$PSA=* 44350 CMP #$43 ;CHECK CURRENT TRACK RANGE 44360 LDA DVPIA2 ;IF IN NO.43-76, RESET BIT 7 44370 AND #$BF ;OF DVPIA2 TO ADJUST CURRENT 44380 LDY #$00 44390 NOP 44400 BCS TRKPS$ 44410 LDA #$40 ;IF IN NO.0-42, SET BIT 7 44420 ORA DVPIA2 ;OF DVACIA 44430 TRKPS$=* 44440 STA DVPIA2 44450 RTS 44460 ; 44470 TRKPSH=* 44480 ; 44490 JSR TRKPSA ;POSITION HEAD 44500 LDA #IOBUF ;SET DISK I/O BUFFER ADDR. 44510 STA IOBUFA 44520 LDA #IOBUF/256 44530 STA IOBUFA+1 44540 JMP LDHEAD ;LOAD HEAD 44550 ; 44560 TKNMTH=* ;MATCH TRACK# 44570 ; 44580 LDA #$05 ;SET MAX. TRACK READ TIMES 44590 STA TKTMAX 44600 TKNM$H=* 44610 JSR SIHSDK ;SEEK INDEX HOLE, SET DVACIA 44620 T$NMTH=* 44630 JSR REDDIK ;READ A BYTE INTO 'A' 44640 TK$MTH=* 44650 CMP #$43 ;FIND TRACK IDENTIFICATION 44660 BNE T$NMTH ;NO. $43 & $57 44670 JSR REDDIK 44680 CMP #$57 44690 BNE TK$MTH 44700 JSR REDDIK ;CHECK TRACK NO. 44710 CMP TKNDER 44720 BNE TKN$TH 44730 RTS ;IF MATCH,RETURN! 44740 TKN$TH=* ;IF NOT,HOME HEAD AND TRY AGAIN 44750 DEC TKTMAX ;MAX, TIME EXCEED? 44760 BEQ TKNMT$ 44770 LDA TKNDER ;NO? SAME CURRENT DESIRED NO. 44730 PHA 44790 JSR HOMEHD ;HOME HEAD! 44SOO PLA 44810 STA TKNDER ;RECOVE TRACK NO. 44820 JSR T$KPSA ;POSITION HEAD AGAIN 44830 JMP TKNM$H ;MATCHT THEM AGAIN! 44840 TKNMT$=* 44850 LDA #$23 ;MAX, EXHAUSTED, ERROR! 44860 JMP ERROR 44870 ; 44880 WRTTKS=* ;WRITE A TRACK TO DISK 44890 ; 44900 LDA #$20 ;INDEX HOLE FOUND! 44910 BIT DVPIA1 44920 BNE W$TTKS 44930 LDA #$24 ;IF FOUND, ERROR! 44940 JMP ERROR 44950 W$TTKS=* 44960 JSR TKNMTH ;CHECK IF TRACK NO, ARE MATCHED 44970 LDX #$04 ;DELAY! 44980 JSR DELYUS 44990 LDA #$FE ;ENABLE ERASING 45000 AND DVPIA2 45010 STA DVPIA2 45020 LDX #$02 ;DELAY! 45030 JSR DELYUS 45040 LDA #$FD ;ENABLE WRITING 45050 AND DVPIA2 45060 STA DVPIA2 45070 LDX #$08 ;DELAY! 45080 JSR DELYUS 45090 LDX #$76 ;WRITE START FLAG $76 45100 JSR WRTDIK 45110 LDX #$0E ;SET 14 PAGES 45120 STX PAGNUB 45130 LDY #$00 45140 WR$TKS=* 45150 LDA (IOBUFA),Y ;GET A BYTE FROM DISK I/O 45160 TAX ;BUFFER AND WRITE IT 45170 JSR WRTDIK ;TO THE DISK 45180 INY 45190 BNE WR$TKS 45200 INC IOBUFA+1 45210 DEC PAGNUB ;KEEP DOING UNTIL 14 PAGE DONE 45220 BNE WR$TKS 45230 LDX #$47 ;WRITE END FLAG 45240 JSR WRTDIK 45250 LDX #$53 45260 JSR WRTDIK 45270 LDA DVPIA2 ;DISABLE WRITING 45280 ORA #$01 45290 STA DVPIA2 45300 LDX #$05 ;DELAY! 45310 JSR DELYUS 45320 LDA DVPIA2 ;DISABLE ERASING 45330 ORA #$02 45340 STA DVPIA2 45350 LDA #I0BUF/256 45360 STA IOBUFA+ ;RECOVE I/O BUFFER ADDR,1 45370 RTS 45380 ; 45390 REDTKS=* ;READ A TRACK 45400 ; 45410 JSR TKNMTH ;MATCH TRACK NO. 45420 R$DTKS=* 45430 JSR REDDIK ;FIND DATA AREA START FLAG 45440 CMP #$76 45450 BNE R$DTKS 45460 LDX #$0E ;SET TOTAL PAGE NO. 14 45470 LDY #$00 45480 STY ERORFG ;INIT ERR FLAG 45490 LDA #$01 45500 RE$TKS=* 45510 BIT DVACIA ;READY? 45520 BEQ RE$TKS 45530 LDA DVACIA+ ;READ A BYTE 45540 BVC RED$KS ;PARITY ERR? 45550 LDA #$80 ;IF IS, SET ERR FLAG 45560 STA ERORFG 45570 R$$TKS=* 45580 CLC ;RESET CARRY TO INDICATE ERR 45590 RTS 45600 RED$KS=* 45610 BIT STATFG 45620 BPL REDTK$ 45630 CMP (IOBUFA),Y ;YES, COMPARE IT WITH THE ONE 45640 BEQ REDTK$ ;IN THE I/O BUFFER READ IN BEFORE 45650 LDA #$40 ;IF NOT, SET ERR FLAG 45660 STA ERORFG 45670 BNE R$$TKS 45680 REDTK$=* 45690 STA (IOBUFA),Y 45700 LDA #$01 45710 INY 45720 BNE RE$TKS ;ONE PAGE DONE? 45730 INC IOBUFA+ ;YES, INCREAMENT HIGH BYTE 45740 DEX 45750 BNE RE$TKS ;14 PAGE DONE? 45760 LDA #IOBUF/256 45770 STA IOBUFA+1 ;RECOVE I/O BUFFER ADDR. 45780 SEC ;SET CARRY INDICATING NO ERR 45790 RTS 45800 ; 45810 WRTTRK=* ;WRITE A TRACK UTILL NO ERROR 45S20 ; 45830 LDA #$A0 ;SET NO REREAD MODE 45840 STA STATFG 45850 JSR TRKPSH ;POSITION HEAD TO DESIRED TRACK 45860 LDA #$04 ;SET MAX. WRITE TIMES 45870 STA ERTMAX+1 45880 W$TTRK=* 45890 JSR WRTTKS ;WRITE A TRACK 45900 JMP RE$TRK ;GO TO REREAD MODE TO CHECK 45910 ; 45920 REDTRK=* ;;READ A TRACK UNTIL NO ERROR 45930 ; 45940 LDA #$40 ;SET NO REREAD MODE 45950 STA STATFG 45960 JSR TRKPSH ;POSITION HEAD TO DESIRED TRACK 45970 LDA #$04 45980 STA ERTMAX 45990 RE$TRK=* 46000 LDA #$06 46010 STA ERTMAX+2 46020 REDT$K=* 46030 JSR REDTKS ;READ A TRACK 46040 BCC REREAD ;IF ERR, GO TO ERR HANDLING 46050 BIT STATFG ;REREAD MODE/? 46060 BMI R$DTRK 46070 LDA #$80 ;IF NOT, SET FLAG TO INDICATE 46080 ORA STATFG ;NOW IS IN REREAD MODE 46090 STA STATFG 46100 BNE RE$TRK ;AND GO BACK TO REREAD! 46110 R$DTRK=* 46120 JMP UNLDHD ;IF IS REREAD,UNLOAD HEAD, FINISH 46130 NOP 46140 REREAD=* ;ERR HANDLING 46150 LDA #I0BUF/256 46160 STA IOBUFA+1 46170 DEC ERTMAX+2 46180 BNE REDT$K 46190 BIT ERORFG 46200 BMI RE$EAD 46210 BIT STATFG 46220 BV3 R$READ 46230 DEC ERTMAX+1 46240 BNE W$TTRK 46250 R$READ=* 46260 LDA ERORFG 46270 JMP ERROR 46280 RE$EAD=* 46290 DEC ERTMAX 46300 BEQ R$READ 46310 JSR STPOUT 46320 JSR DLYMS1 46330 JSR STPIN 46340 JSR DLYMS1 46350 BEQ RE$TRK 46360 RESV27*=*+5 46370 ; 46380 ; ***************************************************** 46390 ; * * 46400 ; * NUMBER 14 : READ/WRITE B/S FROM/TO DISK * 46410 ; * * 46420 ; ***************************************************** 46430 ; 46440 RWDBS1=* ;READ/WRITE B/S FROM/TO DISK 46450 ; 46460 LDA TKNDER ;TRACK 0? 46470 BEQ RWDB$$ 46480 CMP TRKDRC ;DESIRED TRACK = CURRENT TRACK? 46490 BEQ R$DBS1 ;YES, NO DISK I/O 46500 BIT IOBFFG ;'FLUSH' FLAG SET? 46510 BPL RWDB$$ ;IF NO, NO WRITING BACK 46520 JSR WRTTRK ;WRITE BACK TO CURRENT TRACK 46530 RWDB$$=* 46540 LDA TRKDRC ;STORE DESIRED NO, TO CURRENT NO. 46550 STA TKNDER 46560 JSR REDTRK ;READ THIS TRACK 46570 LDA #$00 ;FLUSH 'FLUSH' FLAG 46580 STA IOBFFG 46590 R$DBS1=* 46600 BIT FLAG ;WRITE OR READ? 46610 BVC RWD$$$ 46620 LDA #$80 ;IF WRITE? SET 'FLUSH' FLSA6 46630 STA IOBFFG 46640 RWD$$$=* 46650 NOP 46660 NOP 46670 NOP 46680 NOP 46690 NOP 46700 LDA DMAREG ;SENT DMA ADDR. TO HLREG1 46710 STA HLREG1 46720 LDA DMAREG+1 46730 STA HLREG1+1 46740 LDY #$00 46750 STY TEMP 46760 LDA #$10 ;SECTOR OPERATION? 46770 BIT FLAG 46780 BEQ RE$BS1 46790 LDA SECNB1 ;YES? READ OR WRITE A SECTOR 46800 LDX #$07 ;BETWEEN DISK I/O BUFFER AND DMA 46810 JSR ASLDS1 46820 JSR ADCIOF 46830 RED$S1=* 46840 BIT FLAG 46850 BVS REDBS$ 44360 LDA (HLREG),Y 46S70 STA (HLREG1),Y 46830 JMP R$$BS1 46890 REDBS$=* 46900 LDA (HLREG1),Y 46910 STA (HLREG),Y 46920 RIIBS1=* 46930 INY 46940 CPY #$80 46950 BNE RED$S1 46960 RTS 46970 RE$BS1=* 46980 LDA BLKNB1 ;IF IS BLOCK OPERATION, READ 46990 LDX #$09 ;OR WRITE A BLOCK BETWEEN 47000 JSR ASLDS1 ;DISK I/O BUFFER AND DMA 47010 JSR ADCIOF 47020 LDX #$02 47030 REDB$1=* 47040 BIT FLAG 47050 BVS RE$$S1 47060 LDA (HLREG),Y 47070 STA (HLREG1),Y 47080 JMP REB$$1 47090 RE$$S1=* 47100 LDA (HLREG1),Y 47110 STA (HLREG),Y 47120 REB$$1=* 47130 INY 47140 BNE REDB$1 47150 INC HLREG+1 47160 INC HLREG1+1 47170 DEX 47180 BNE REDB$1 47190 RTS 47200 RESV28*=*+5 47210 ; 47220 S$OBDK=* ;SENT I/O BUFFER BACK TO DISK 47230 ; 47240 BIT IOBFFG ;'FLUSH' FLAG SET? 47250 BPL S$OBDK 47260 JSR WRTTRK ;IF SET, WRITE BACK TO DISK 47270 LDA *$00 47280 STA IOBFFG 47290 S$OBDK=* 47300 RTS 47310 ; 47320 BCDASC=* ;CONVERT BCD TO TWO ASCII CODES 47330 ; 47340 PHA 47350 AND #$OF ;GET LOW NIBBLE 47360 CLC 47370 ADC #$30 ;CONVERT TO ASCII CODE 47380 TAY 47390 PLA 47400 LSR A 47410 LSR A 47420 LSR A 47430 LSR A 47440 AND #$0F ;GET HIGH NIBB1E 47450 CLC 47460 ADC #$30 ;CONVERT TO ASCII CODE 47470 RTS 47480 ; 47490 ; ***************************************************** 47500 ; * * 47510 ; * NUMBER 15 : ERROR HANDLING * 47520 ; * * 47530 ; ***************************************************** 47540 ; * * 47550 ; * ENTRY PARAMETERS : * 47560 ; * REGISTER A : ERROR NUMBER * 47570 ; * * 47530 ; ***************************************************** 47590 ; 47600 ERROR=* 47610 ; 47620 JSR BCDASC ;CONVERT ERR NO. TO 2 ASCII 47630 LDX #$0B ;AND INSERT THEM TO THE ERR 47640 STA EROR,X ;MESSA6E 47650 INX 47660 TYA 47670 STA EROR,X 47680 LDA CRTDSK ;CONVERT CURRENT DISK NO.TO 47690 CLC ;ASCII AND INSERT IT TO THE 47700 ADC #$41 ;ERR MESSAGE 47710 LDX #$16 47720 STA EROR,X 47730 LDA #EROR ;OUTPUT ERR MESSAGE 47740 STA DEREG 47750 LDA #EROR/256 47760 STA DEREG+1 47770 JSR OUTBFF 47780 JMP CCPST1 47790 EROR .BYTE ' OPST ERR ON DISK $' 47800 ; 47810 DFBUFA*=*+512 ;DEFAULT BUF 47820 DIRBUF*=*+512 ;DIRECTORY BUF 47830 MAPAR0*=*+64 ;MAP AREA OF DISK A 47840 MAPAR1*=*+64 ;MAP AREA OF DISK B 47850 CHKAR0*=*+14 ;CHECK AREA OF DISK A 47860 CHKAR1*=*+14 ;CHECK AREA OF DISK B 47870 FLCTBK*=*+35 ;FILE CONTROL BLOCK