mirror of
https://github.com/option8/OUP-M.git
synced 2024-10-22 12:24:27 +00:00
1081 lines
29 KiB
ArmAsm
1081 lines
29 KiB
ArmAsm
|
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
|