From 834281c40b30d4336840b45d0c70ac517b7876be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Tue, 10 Sep 2019 17:46:56 +0200 Subject: [PATCH] Kernel 0.93+ --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes ProDOS.203/ProDOS.S.CCLK.txt | 113 ++- ProDOS.203/ProDOS.S.DiskII.txt | 1321 ++++++++++++++++--------------- ProDOS.203/ProDOS.S.GP.txt | 330 ++++---- ProDOS.203/ProDOS.S.IRQ.txt | 112 +-- ProDOS.203/ProDOS.S.LDR.txt | 72 +- ProDOS.203/ProDOS.S.RAM.txt | 144 ++-- ProDOS.203/ProDOS.S.RAMI.txt | 6 +- ProDOS.203/ProDOS.S.RAMX.txt | 93 ++- ProDOS.203/ProDOS.S.SEL0.txt | 36 +- ProDOS.203/ProDOS.S.SEL1.txt | 24 +- ProDOS.203/ProDOS.S.SEL2.txt | 731 ++++++++--------- ProDOS.203/ProDOS.S.TCLK.txt | 164 ++-- ProDOS.203/ProDOS.S.XDOS.txt | 228 +++--- ProDOS.203/prodos.S - Copie.txt | 225 ------ 15 files changed, 1692 insertions(+), 1907 deletions(-) delete mode 100644 ProDOS.203/prodos.S - Copie.txt diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 5c7fc28426264f05b9e43323b289f57a79cedb40..c99d56756f3f05031d34be4494c1bd8462e8cd2b 100644 GIT binary patch delta 32444 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

A$aw3CZO@%`j-VVac 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 diff --git a/ProDOS.203/ProDOS.S.CCLK.txt b/ProDOS.203/ProDOS.S.CCLK.txt index 7a9c16f8..fb0689dd 100644 --- a/ProDOS.203/ProDOS.S.CCLK.txt +++ b/ProDOS.203/ProDOS.S.CCLK.txt @@ -4,64 +4,63 @@ NEW * Cortland clock driver * $2F80-$2FFC moved to $D742 -ofsC .EQ cclock_0-tclk_in offset to Cortland clock org + .OP 65816 +ofsC .EQ cclock_0-tclk_in offset to Cortland clock org -cclock_0 SHORT I,M 8 bit mode. - lda statereg state register. - sta savestate save for restore after tool call. - and #$CF clear the read/write aux memory bits. - sta statereg make it real - clc set e = 0 to set native mode - xce - LONG I,M 16 bit mode. - lda #$0000 zero out result space. - pha push 4 words for hex time result - pha - pha - pha - _ReadTimeHex - SHORT M back to 8 bit to get results from stack - lda savestate restore state register - sta statereg - pla pull off seconds and ignore - pla - sta p8time minutes - pla - sta p8time+1 hours - pla year -H2FB1 cmp #100 out of range? - bcc H2FB9 no, go ahead and store - sbc #$64 else put back in range. - bra H2FB1 try again -H2FB9 sta p8date+1 year - pla - inc a increment day for Prodos 8 format. - sta p8date day - pla month - inc a increment month for Prodos 8 format. - asl a shift month as it sits in between - asl a the year and day values. - asl a - asl a - asl a - ora p8date put all but the top bit of month - sta p8date value in the day byte. - rol p8date+1 put hi bit of month in low bit of year - pla pull of unused byte - pla pull off day of week. stack now clean. - sec go back to emulation mode - xce to continue with Prodos 8 - rts -savestate .EQ *-ofsC - .DA #00' state of the state register - dc c'JIMJAYKERRY' - dc h'26' ampersand (Orca assembler doesn't like) - dc c'MIKE' - .DA #0000000000000000' pad 0's until length - .DA #0000000000000000' of driver = 125 bytes. - .DA #000000000000' -cclk_end .EQ * end of obj cclock_0. - dc h'000000' pad to page boundary +cclock_0 SHORT I,M 8 bit mode. + lda statereg state register. + sta savestate save for restore after tool call. + and #$CF clear the read/write aux memory bits. + sta statereg make it real + clc set e = 0 to set native mode + xce + LONG I,M 16 bit mode. + lda #$0000 zero out result space. + pha push 4 words for hex time result + pha + pha + pha + _ReadTimeHex + SHORT M back to 8 bit to get results from stack + lda savestate restore state register + sta statereg + pla pull off seconds and ignore + pla + sta p8time minutes + pla + sta p8time+1 hours + pla year +H2FB1 cmp #100 out of range? + bcc H2FB9 no, go ahead and store + sbc #$64 else put back in range. + bra H2FB1 try again +H2FB9 sta p8date+1 year + pla + inc a increment day for Prodos 8 format. + sta p8date day + pla month + inc a increment month for Prodos 8 format. + asl a shift month as it sits in between + asl a the year and day values. + asl a + asl a + asl a + ora p8date put all but the top bit of month + sta p8date value in the day byte. + rol p8date+1 put hi bit of month in low bit of year + pla pull of unused byte + pla pull off day of week. stack now clean. + sec go back to emulation mode + xce to continue with Prodos 8 + rts +savestate .EQ *-ofsC + .HS 00 state of the state register + .AS "JIMJAYKERRY&MIKE" + .HS 0000000000000000 pad 0's until length + .HS 0000000000000000 of driver = 125 bytes. + .HS 000000000000 +cclk_end .EQ * end of obj cclock_0. + .HS 000000 pad to page boundary LONGI OFF *-------------------------------------- MAN diff --git a/ProDOS.203/ProDOS.S.DiskII.txt b/ProDOS.203/ProDOS.S.DiskII.txt index 1d666498..dd450a0a 100644 --- a/ProDOS.203/ProDOS.S.DiskII.txt +++ b/ProDOS.203/ProDOS.S.DiskII.txt @@ -9,6 +9,7 @@ NEW * the cld at blockio must be present to determine bank of $D000 * $5300-5A00 moved to language card bank 1 at $D000 + .OP 6502 .OR $D000 blockio cld $D8 to flag language card bank 1 (main) @@ -67,7 +68,7 @@ regrwts ldy #$01 retry count cmp iobpdn same drive used before ? sta iobpdn save it for next time. php keep results of compare. - asl a get drive # into carry. + asl get drive # into carry. lda motoron,x turn on the drive. bcc L5362 branch if drive 1 selected. inx select drive 2. @@ -142,7 +143,7 @@ L53BE ldy track check track lda curtrk preserve destination track pha tya - asl a + asl L53CC jsr settrk pla jsr myseek @@ -160,42 +161,42 @@ L53D5 lda sect is this the right sector ? bcs L53A4 if bad read L53E7 lda #$00 - dc h'D0' bne branch never taken (skip 1 byte) -hndlerr sec - sta ibstat error # - ldx A2L slot offset - lda motoroff,x turn off - rts -L53F4 jsr write16 write nibbles -statdne .EQ *-ofsD - bcc L53E7 if no errors. - lda #$2B disk write protected. - bne hndlerr always -L53FD ldx A2L - lda q6h,x test for write protected - lda q7l,x - rol a write protect-->carry-->bit 0=1 - lda q6l,x keep in read mode - jmp statdne -myseek .EQ *-ofsD - asl a assume two phase stepper - sta track save destination track * 2 - jsr alloff turn all phases off to be sure. - jsr drvindx get index to previous track - lda iobpdn,x for current drive. - sta curtrk current position. - lda track where to go next. - sta iobpdn,x - jsr seek move head there -alloff .EQ *-ofsD - ldy #$03 turn off all phases before returning. -L5427 tya (send phase in acc) - jsr clrphase carry clear, phases should be turned off - dey - bpl L5427 - lsr curtrk divide back down - clc - rts + .HS D0 bne branch never taken (skip 1 byte) +hndlerr sec + sta ibstat error # + ldx A2L slot offset + lda motoroff,x turn off + rts +L53F4 jsr write16 write nibbles +statdne .EQ *-ofsD + bcc L53E7 if no errors. + lda #$2B disk write protected. + bne hndlerr always +L53FD ldx A2L + lda q6h,x test for write protected + lda q7l,x + rol write protect-->carry-->bit 0=1 + lda q6l,x keep in read mode + jmp statdne +myseek .EQ *-ofsD + asl a assume two phase stepper + sta track save destination track * 2 + jsr alloff turn all phases off to be sure. + jsr drvindx get index to previous track + lda iobpdn,x for current drive. + sta curtrk current position. + lda track where to go next. + sta iobpdn,x + jsr seek move head there +alloff .EQ *-ofsD + ldy #$03 turn off all phases before returning. +L5427 tya (send phase in acc) + jsr clrphase carry clear, phases should be turned off + dey + bpl L5427 + lsr curtrk divide back down + clc + rts * fast seek subroutine * @@ -214,52 +215,52 @@ L5427 tya (send phase in acc) * * variables used: curtrk, trkn, countn, prior, A2L, montimel, montimeh -seek .EQ *-ofsD - sta trkn save target track. - cmp curtrk on desired track ? - beq L5487 yes, energize phase and return - lda #$00 - sta trkcnt half track count. -L5440 lda curtrk save curtrk for delayed turnoff - sta prior - sec - sbc trkn delta-tracks. - beq L5483 branch if curtrk = destination - bcs mvout move out, not in. - eor #$FF calculate tracks to go. - inc curtrk increment current track (in). - bcc L545A always taken. -mvout adc #$FE calculate tracks to go. - dec curtrk decrement current track (out). -L545A cmp trkcnt - bcc L5462 and 'tracks moved' - lda trkcnt -L5462 cmp #$09 - bcs L5468 if trkcnt > 8 then leave y alone (y=8) - tay else set acceleration index in y - sec -L5468 jsr setphase - lda ontable,y for 'ontime' - jsr mswait (100us intervals) - lda prior - clc for phaseoff - jsr clrphase turn off prior phase - lda offtable,y then wait 'offtime' - jsr mswait (100us intervals) - inc trkcnt count of 'tracks moved' - bne L5440 always taken -L5483 jsr mswait settle 25 msec - clc set for phase off -setphase .EQ *-ofsD -L5487 lda curtrk get current track -clrphase .EQ *-ofsD - and #$03 mask for 1 of 4 phases - rol a double for phaseon/off index - ora A2L - tax - lda phaseoff,x turn on/off one phase - ldx A2L restore x reg - rts and return +seek .EQ *-ofsD + sta trkn save target track. + cmp curtrk on desired track ? + beq L5487 yes, energize phase and return + lda #$00 + sta trkcnt half track count. +L5440 lda curtrk save curtrk for delayed turnoff + sta prior + sec + sbc trkn delta-tracks. + beq L5483 branch if curtrk = destination + bcs mvout move out, not in. + eor #$FF calculate tracks to go. + inc curtrk increment current track (in). + bcc L545A always taken. +mvout adc #$FE calculate tracks to go. + dec curtrk decrement current track (out). +L545A cmp trkcnt + bcc L5462 and 'tracks moved' + lda trkcnt +L5462 cmp #$09 + bcs L5468 if trkcnt > 8 then leave y alone (y=8) + tay else set acceleration index in y + sec +L5468 jsr setphase + lda ontable,y for 'ontime' + jsr mswait (100us intervals) + lda prior + clc for phaseoff + jsr clrphase turn off prior phase + lda offtable,y then wait 'offtime' + jsr mswait (100us intervals) + inc trkcnt count of 'tracks moved' + bne L5440 always taken +L5483 jsr mswait settle 25 msec + clc set for phase off +setphase .EQ *-ofsD +L5487 lda curtrk get current track +clrphase .EQ *-ofsD + and #$03 mask for 1 of 4 phases + rol double for phaseon/off index + ora A2L + tax + lda phaseoff,x turn on/off one phase + ldx A2L restore x reg + rts and return * 7-bit to 6-bit 'deniblize' table (16-sector format) * @@ -269,29 +270,29 @@ clrphase .EQ *-ofsD * nibles in the ranges of $A0-$A3, $C0-$C7, $E0-$E3 are used for * other tables since no valid nibles are in these ranges. -dnibl .EQ *-ofsD aligned to page boundary minus $96 - .DA #0004FFFF080CFF10' - .DA #1418' -twobit3 .EQ *-ofsD used in fast prenib as lookup for - dc h'008040C0FFFF' 2-bit quantities. - .DA #1C20FFFFFF24282C' - .DA #3034FFFF383C4044' - .DA #484CFF5054585C60' - .DA #6468' -twobit2 .EQ *-ofsD used in fast prenib. - dc h'00201030' -endmrks .EQ *-ofsD table using 'unused' nibbles: - dc h'DEAAEBFF' ($C4,$C5,$C6,$C7) - .DA #FFFFFF6CFF70' - .DA #7478FFFFFF7CFFFF' - .DA #8084FF888C909498' - .DA #9CA0' -twobit1 .EQ *-ofsD used in fast prenib. - dc h'0008040CFFA4' - .DA #A8ACFFB0B4B8BCC0' - .DA #C4C8FFFFCCD0D4D8' - .DA #DCE0FFE4E8ECF0F4' - .DA #F8FC' +dnibl .EQ *-ofsD aligned to page boundary minus $96 + .HS 0004FFFF080CFF10 + .HS 1418 +twobit3 .EQ *-ofsD used in fast prenib as lookup for + .HS 008040C0FFFF 2-bit quantities. + .HS 1C20FFFFFF24282C + .HS 3034FFFF383C4044 + .HS 484CFF5054585C60 + .HS 6468 +twobit2 .EQ *-ofsD used in fast prenib. + .HS 00201030 +endmrks .EQ *-ofsD table using 'unused' nibbles: + .HS DEAAEBFF ($C4,$C5,$C6,$C7) + .HS FFFFFF6CFF70 + .HS 7478FFFFFF7CFFFF + .HS 8084FF888C909498 + .HS 9CA0 +twobit1 .EQ *-ofsD used in fast prenib. + .HS 0008040CFFA4 + .HS A8ACFFB0B4B8BCC0 + .HS C4C8FFFFCCD0D4D8 + .HS DCE0FFE4E8ECF0F4 + .HS F8FC * 6-bit to 2-bit conversion tables: * @@ -302,102 +303,102 @@ twobit1 .EQ *-ofsD used in fast prenib. * origin = $D200 (page boundary) * page align the following tables: -dnibl2 .EQ *-ofsD - dc h'00' -dnibl3 .EQ *-ofsD - dc h'00' -dnibl4 .EQ *-ofsD - dc h'00' +dnibl2 .EQ *-ofsD + .HS 00 +dnibl3 .EQ *-ofsD + .HS 00 +dnibl4 .EQ *-ofsD + .HS 00 * 6-bit to 7-bit nibl conversion table * * codes with more than one pair of adjacent zeroes * or with no adjacent ones (except B7) are excluded. -nibl .EQ *-ofsD - .DA #960200' - .DA #00970100009A0300' - .DA #009B0002009D0202' - .DA #009E0102009F0302' - .DA #00A6000100A70201' - .DA #00AB010100AC0301' - .DA #00AD000300AE0203' - .DA #00AF010300B20303' - .DA #00B3000002B40200' - .DA #02B5010002B60300' - .DA #02B7000202B90202' - .DA #02BA010202BB0302' - .DA #02BC000102BD0201' - .DA #02BE010102BF0301' - .DA #02CB000302CD0203' - .DA #02CE010302CF0303' - .DA #02D3000001D60200' - .DA #01D7010001D90300' - .DA #01DA000201DB0202' - .DA #01DC010201DD0302' - .DA #01DE000101DF0201' - .DA #01E5010101E60301' - .DA #01E7000301E90203' - .DA #01EA010301EB0303' - .DA #01EC000003ED0200' - .DA #03EE010003EF0300' - .DA #03F2000203F30202' - .DA #03F4010203F50302' - .DA #03F6000103F70201' - .DA #03F9010103FA0301' - .DA #03FB000303FC0203' - .DA #03FD010303FE0303' - .DA #03FF' +nibl .EQ *-ofsD + .HS 960200 + .HS 00970100009A0300 + .HS 009B0002009D0202 + .HS 009E0102009F0302 + .HS 00A6000100A70201 + .HS 00AB010100AC0301 + .HS 00AD000300AE0203 + .HS 00AF010300B20303 + .HS 00B3000002B40200 + .HS 02B5010002B60300 + .HS 02B7000202B90202 + .HS 02BA010202BB0302 + .HS 02BC000102BD0201 + .HS 02BE010102BF0301 + .HS 02CB000302CD0203 + .HS 02CE010302CF0303 + .HS 02D3000001D60200 + .HS 01D7010001D90300 + .HS 01DA000201DB0202 + .HS 01DC010201DD0302 + .HS 01DE000101DF0201 + .HS 01E5010101E60301 + .HS 01E7000301E90203 + .HS 01EA010301EB0303 + .HS 01EC000003ED0200 + .HS 03EE010003EF0300 + .HS 03F2000203F30202 + .HS 03F4010203F50302 + .HS 03F6000103F70201 + .HS 03F9010103FA0301 + .HS 03FB000303FC0203 + .HS 03FD010303FE0303 + .HS 03FF * nibl buffer 'nbuf2' must be on a page boundary !!! -nbuf2 .EQ *-ofsD nibl buffer for read/write of low - ds 86 2-bits of each byte. -ibtrk .EQ *-ofsD - .DA #00' -ibsect .EQ *-ofsD - dc h'00' -ibstat .EQ *-ofsD - dc h'00' -iobpdn .EQ *-ofsD - dc h'00' -curtrk .EQ *-ofsD - dc h'00' - dc h'00000000000000' for slots 1 thru 7 - .DA #00000000000000' drives 1 & 2 -retrycnt .EQ *-ofsD - dc h'00' -seekcnt .EQ *-ofsD - dc h'00' -trkcnt .EQ *-ofsD halftracks moved count. -countn .EQ *-ofsD 'must find' count. -last .EQ *-ofsD 'odd bit' nibls. - dc h'00' -csum .EQ *-ofsD used for address header cksum - dc h'00' -csstv .EQ *-ofsD - .DA #00' -sect .EQ *-ofsD - dc h'00' -track .EQ *-ofsD -montimel .EQ *-ofsD - dc h'00' -montimeh .EQ *-ofsD also 'volume' - dc h'00' -prior .EQ *-ofsD - dc h'00' -trkn .EQ *-ofsD - dc h'00' +nbuf2 .EQ *-ofsD nibl buffer for read/write of low + .BS 86 2-bits of each byte. +ibtrk .EQ *-ofsD + .HS 00 +ibsect .EQ *-ofsD + .HS 00 +ibstat .EQ *-ofsD + .HS 00 +iobpdn .EQ *-ofsD + .HS 00 +curtrk .EQ *-ofsD + .HS 00 + .HS 00000000000000 for slots 1 thru 7 + .HS 00000000000000 drives 1 & 2 +retrycnt .EQ *-ofsD + .HS 00 +seekcnt .EQ *-ofsD + .HS 00 +trkcnt .EQ *-ofsD halftracks moved count. +countn .EQ *-ofsD 'must find' count. +last .EQ *-ofsD 'odd bit' nibls. + .HS 00 +csum .EQ *-ofsD used for address header cksum + .HS 00 +csstv .EQ *-ofsD + .HS 00 +sect .EQ *-ofsD + .HS 00 +track .EQ *-ofsD +montimel .EQ *-ofsD + .HS 00 +montimeh .EQ *-ofsD also 'volume' + .HS 00 +prior .EQ *-ofsD + .HS 00 +trkn .EQ *-ofsD + .HS 00 * phase on, off time tables * in 100 usec intervals (seek) -ontable .EQ *-ofsD - dc h'013028' - .DA #24201E1D1C1C' -offtable .EQ *-ofsD - dc h'702C' - .DA #26221F1E1D1C1C' +ontable .EQ *-ofsD + .HS 013028 + .HS 24201E1D1C1C +offtable .EQ *-ofsD + .HS 702C + .HS 26221F1E1D1C1C * mswait subroutine * @@ -407,17 +408,17 @@ offtable .EQ *-ofsD * montimel, montimeh are incremented once per 100 usec interval * for motor on timing. -mswait .EQ *-ofsD -L5685 ldx #$11 delay 86 usec -L5687 dex - bne L5687 - inc montimel - bne L5692 - inc montimeh -L5692 sec - sbc #$01 - bne L5685 - rts +mswait .EQ *-ofsD +L5685 ldx #$11 delay 86 usec +L5687 dex + bne L5687 + inc montimel + bne L5692 + inc montimeh +L5692 sec + sbc #$01 + bne L5685 + rts * read address field subroutine (16-sector format) * @@ -430,56 +431,56 @@ L5692 sec * expects: original 10-sector normal density nibls (4-bit) odd bits then even. * observe 'no page cross' warnings on some branches !!! -rdadr16 .EQ *-ofsD - ldy #$FC - sty countn 'must find' count -L569D iny - bne L56A5 low order of count. - inc countn (2k nibles to find address mark - beq rderr else error) -L56A5 lda q6l,x read nibl - bpl L56A5 *** no page cross *** -L56AA cmp #$D5 address mark 1 ? - bne L569D - nop nibl delay -L56AF lda q6l,x - bpl L56AF *** no page cross *** - cmp #$AA address mark 2 ? - bne L56AA if not, is it address mark 1 ? - ldy #$03 index for 4 byte read -L56BA lda q6l,x - bpl L56BA *** no page cross *** - cmp #$96 address mark 3 ? - bne L56AA if not, is it address mark 1 - sei no interrupts until address is tested. - lda #$00 init checksum -L56C6 sta csum -L56C9 lda q6l,x read 'odd bit' nibl - bpl L56C9 *** no page cross *** - rol a align odd bits, '1' into lsb. - sta last save them. -L56D2 lda q6l,x read 'even bit' nibl - bpl L56D2 *** no page cross *** - and last merge odd and even bits. - sta csstv,y store data byte. - eor csum - dey - bpl L56C6 loop on 4 data bytes. - tay if final checksum non-zero, - bne rderr then error. -L56E6 lda q6l,x first bit-slip nibl - bpl L56E6 *** no page cross *** - cmp #$DE - bne rderr - nop delay -L56F0 lda q6l,x second bit-slip nible - bpl L56F0 *** no page cross *** - cmp #$AA - bne rderr - clc normal read ok - rts -rderr sec - rts +rdadr16 .EQ *-ofsD + ldy #$FC + sty countn 'must find' count +L569D iny + bne L56A5 low order of count. + inc countn (2k nibles to find address mark + beq rderr else error) +L56A5 lda q6l,x read nibl + bpl L56A5 *** no page cross *** +L56AA cmp #$D5 address mark 1 ? + bne L569D + nop nibl delay +L56AF lda q6l,x + bpl L56AF *** no page cross *** + cmp #$AA address mark 2 ? + bne L56AA if not, is it address mark 1 ? + ldy #$03 index for 4 byte read +L56BA lda q6l,x + bpl L56BA *** no page cross *** + cmp #$96 address mark 3 ? + bne L56AA if not, is it address mark 1 + sei no interrupts until address is tested. + lda #$00 init checksum +L56C6 sta csum +L56C9 lda q6l,x read 'odd bit' nibl + bpl L56C9 *** no page cross *** + rol align odd bits, '1' into lsb. + sta last save them. +L56D2 lda q6l,x read 'even bit' nibl + bpl L56D2 *** no page cross *** + and last merge odd and even bits. + sta csstv,y store data byte. + eor csum + dey + bpl L56C6 loop on 4 data bytes. + tay if final checksum non-zero, + bne rderr then error. +L56E6 lda q6l,x first bit-slip nibl + bpl L56E6 *** no page cross *** + cmp #$DE + bne rderr + nop delay +L56F0 lda q6l,x second bit-slip nible + bpl L56F0 *** no page cross *** + cmp #$AA + bne rderr + clc normal read ok + rts +rderr sec + rts * read subroutine (16-sector format) * @@ -490,155 +491,155 @@ rderr sec * acc=$AA, x=unchanged, y=0, carry clear. * observe 'no page cross' on some branches !! -read16 .EQ *-ofsD - txa get slot # - ora #$8C prepare mods to read routine. - sta rd4+1 warning: the read routine is - sta rd5+1 self modified !! - sta rd6+1 - sta rd7+1 - sta rd8+1 - lda buf modify storage addresses also - ldy buf+1 - sta ref3+1 - sty ref3+2 - sec - sbc #$54 - bcs L571F branch if no borrow - dey -L571F sta ref2+1 - sty ref2+2 - sec - sbc #$57 - bcs L572B branch if no borrow - dey -L572B sta ref1+1 - sty ref1+2 - ldy #$20 32 tries to find -L5733 dey - beq L576D branch if can't find data header marks -L5736 lda q6l,x - bpl L5736 -L573B eor #$D5 1st data mark - bne L5733 - nop delay -L5740 lda q6l,x - bpl L5740 - cmp #$AA 2nd data mark. - bne L573B if not, check for 1st again - nop -L574A lda q6l,x - bpl L574A - cmp #$AD 3rd data mark - bne L573B if not, check for data mark 1 again - ldy #$AA - lda #$00 -L5757 sta pcl use z-page for keeping checksum -rd4 .EQ *-ofsD -L5759 ldx q6l+$60 warning: self modified - bpl L5759 - lda dnibl-$96,x - sta nbuf2-$AA,y save the two-bit groups in nbuf. - eor pcl update checksum. - iny next position in nbuf. - bne L5757 loop for all $56 two-bit groups. - ldy #$AA now read directly into user buffer. - bne L5772 always taken. -L576D sec error - rts -ref1 .EQ *-ofsD -L576F sta $1000,y warning: self modified -rd5 .EQ *-ofsD -L5772 ldx q6l+$60 warning: self modified - bpl L5772 - eor dnibl-$96,x get actual 6-bit data from dnib table. - ldx nbuf2-$AA,y get associated two-bit pattern - eor dnibl2,x and combine to form whole byte. - iny - bne L576F loop for $56 bytes. - pha save for now, no time to store... - and #$FC strip low bits. - ldy #$AA prepare for next $56 bytes -rd6 .EQ *-ofsD -L5788 ldx q6l+$60 warning: self modified - bpl L5788 - eor dnibl-$96,x - ldx nbuf2-$AA,y - eor dnibl3,x -ref2 .EQ *-ofsD - sta $1000,y warning: self modified - iny - bne L5788 loop unil this group of $56 read -rd7 .EQ *-ofsD -L579C ldx q6l+$60 warning: self modified - bpl L579C - and #$FC - ldy #$AC last group is $54 long -L57A5 eor dnibl-$96,x - ldx nbuf2-$AC,y - eor dnibl4,x combine to form full byte -ref3 .EQ *-ofsD - sta $1000,y warning: self modified -rd8 .EQ *-ofsD -L57B1 ldx q6l+$60 warning: self modified - bpl L57B1 - iny - bne L57A5 - and #$FC - eor dnibl-$96,x checksum ok ? - bne L57CC error if not. - ldx A2L test end marks. -L57C2 lda q6l,x - bpl L57C2 - cmp #$DE - clc - beq L57CD branch if good trailer -L57CC sec -L57CD pla place last byte into user buffer - ldy #$55 - sta (buf),y - rts +read16 .EQ *-ofsD + txa get slot # + ora #$8C prepare mods to read routine. + sta rd4+1 warning: the read routine is + sta rd5+1 self modified !! + sta rd6+1 + sta rd7+1 + sta rd8+1 + lda buf modify storage addresses also + ldy buf+1 + sta ref3+1 + sty ref3+2 + sec + sbc #$54 + bcs L571F branch if no borrow + dey +L571F sta ref2+1 + sty ref2+2 + sec + sbc #$57 + bcs L572B branch if no borrow + dey +L572B sta ref1+1 + sty ref1+2 + ldy #$20 32 tries to find +L5733 dey + beq L576D branch if can't find data header marks +L5736 lda q6l,x + bpl L5736 +L573B eor #$D5 1st data mark + bne L5733 + nop delay +L5740 lda q6l,x + bpl L5740 + cmp #$AA 2nd data mark. + bne L573B if not, check for 1st again + nop +L574A lda q6l,x + bpl L574A + cmp #$AD 3rd data mark + bne L573B if not, check for data mark 1 again + ldy #$AA + lda #$00 +L5757 sta pcl use z-page for keeping checksum +rd4 .EQ *-ofsD +L5759 ldx q6l+$60 warning: self modified + bpl L5759 + lda dnibl-$96,x + sta nbuf2-$AA,y save the two-bit groups in nbuf. + eor pcl update checksum. + iny next position in nbuf. + bne L5757 loop for all $56 two-bit groups. + ldy #$AA now read directly into user buffer. + bne L5772 always taken. +L576D sec error + rts +ref1 .EQ *-ofsD +L576F sta $1000,y warning: self modified +rd5 .EQ *-ofsD +L5772 ldx q6l+$60 warning: self modified + bpl L5772 + eor dnibl-$96,x get actual 6-bit data from dnib table. + ldx nbuf2-$AA,y get associated two-bit pattern + eor dnibl2,x and combine to form whole byte. + iny + bne L576F loop for $56 bytes. + pha save for now, no time to store... + and #$FC strip low bits. + ldy #$AA prepare for next $56 bytes +rd6 .EQ *-ofsD +L5788 ldx q6l+$60 warning: self modified + bpl L5788 + eor dnibl-$96,x + ldx nbuf2-$AA,y + eor dnibl3,x +ref2 .EQ *-ofsD + sta $1000,y warning: self modified + iny + bne L5788 loop unil this group of $56 read +rd7 .EQ *-ofsD +L579C ldx q6l+$60 warning: self modified + bpl L579C + and #$FC + ldy #$AC last group is $54 long +L57A5 eor dnibl-$96,x + ldx nbuf2-$AC,y + eor dnibl4,x combine to form full byte +ref3 .EQ *-ofsD + sta $1000,y warning: self modified +rd8 .EQ *-ofsD +L57B1 ldx q6l+$60 warning: self modified + bpl L57B1 + iny + bne L57A5 + and #$FC + eor dnibl-$96,x checksum ok ? + bne L57CC error if not. + ldx A2L test end marks. +L57C2 lda q6l,x + bpl L57C2 + cmp #$DE + clc + beq L57CD branch if good trailer +L57CC sec +L57CD pla place last byte into user buffer + ldy #$55 + sta (buf),y + rts * set the slot dependent track location -settrk .EQ *-ofsD - jsr drvindx get index to drive # - sta iobpdn,x - rts +settrk .EQ *-ofsD + jsr drvindx get index to drive # + sta iobpdn,x + rts * determine if motor is stopped * * if stopped, controller's shift register will not be changing. * return y = 0 and zero flag set if it is stopped. -chkdrv .EQ *-ofsD - ldx A2L -chkdrv0 .EQ *-ofsD - ldy #$00 init loop counter. -L57DE lda q6l,x read the shift register. - jsr ckdrts delay - pha - pla more delay. - cmp q6l,x has shift reg changed ? - bne L57F0 yes, motor is moving. - lda #$28 anticipate error. - dey no, dec retry counter - bne L57DE and try 256 times. -ckdrts .EQ *-ofsD -L57F0 rts -drvindx .EQ *-ofsD - pha preserve acc across call - lda A4L+1 - lsr a - lsr a - lsr a - lsr a - cmp #$08 - and #$07 - rol a - tax index to table. - pla restore acc - rts +chkdrv .EQ *-ofsD + ldx A2L +chkdrv0 .EQ *-ofsD + ldy #$00 init loop counter. +L57DE lda q6l,x read the shift register. + jsr ckdrts delay + pha + pla more delay. + cmp q6l,x has shift reg changed ? + bne L57F0 yes, motor is moving. + lda #$28 anticipate error. + dey no, dec retry counter + bne L57DE and try 256 times. +ckdrts .EQ *-ofsD +L57F0 rts +drvindx .EQ *-ofsD + pha preserve acc across call + lda A4L+1 + lsr a + lsr a + lsr a + lsr a + cmp #$08 + and #$07 + rol a + tax index to table. + pla restore acc + rts * write subroutine (16 sector format) * @@ -650,150 +651,150 @@ drvindx .EQ *-ofsD * on exit: carry set if error (write protect violation). * if no error, acc=uncertain, x=unchanged, y=0, carry clear. -write16 .EQ *-ofsD - sec anticipate write protect error - lda q6h,x - lda q7l,x sense write protect flag - bpl L580C - jmp wexit exit if write protected +write16 .EQ *-ofsD + sec anticipate write protect error + lda q6h,x + lda q7l,x sense write protect flag + bpl L580C + jmp wexit exit if write protected * timing is critical. a one micro-second cycle time is assumed. * number in () is how many micro-seconds per instruction or subroutine -L580C lda nbuf2 - sta pcl - lda #$FF sync data. - sta q7h,x (5) goto write mode - ora q6l,x (4) - ldy #$04 (2) for five nibls - nop (2) - pha (3) - pla (4) -wsync pha (3) exact timing. - pla (4) exact timing. - jsr wnibl7 (13,9,6) write sync. - dey (2) - bne wsync (3-) must not cross page ! - lda #$D5 (2) 1st data mark - jsr wnibl9 (15,9,6) - lda #$AA (2) 2nd data mark - jsr wnibl9 (15,9,6) - lda #$AD (2) 3rd data mark - jsr wnibl9 (15,9,6) - tya (2) zero checksum - ldy #$56 (2) nbuf2 index - bne L583D (3) branch always +L580C lda nbuf2 + sta pcl + lda #$FF sync data. + sta q7h,x (5) goto write mode + ora q6l,x (4) + ldy #$04 (2) for five nibls + nop (2) + pha (3) + pla (4) +wsync pha (3) exact timing. + pla (4) exact timing. + jsr wnibl7 (13,9,6) write sync. + dey (2) + bne wsync (3-) must not cross page ! + lda #$D5 (2) 1st data mark + jsr wnibl9 (15,9,6) + lda #$AA (2) 2nd data mark + jsr wnibl9 (15,9,6) + lda #$AD (2) 3rd data mark + jsr wnibl9 (15,9,6) + tya (2) zero checksum + ldy #$56 (2) nbuf2 index + bne L583D (3) branch always * total time in this write byte loop must = 32us !!! -L583A lda nbuf2,y (4) prior 6-bit nibl -L583D eor nbuf2-1,y (5) xor with current - tax (2) index to 7-bit nibl - lda nibl,x (4) must not cross page boundary - ldx A2L (3) restore slot index - sta q6h,x (5) store encoded byte - lda q6l,x (4) handshake - dey (2) - bne L583A (3-) must not cross page boundary +L583A lda nbuf2,y (4) prior 6-bit nibl +L583D eor nbuf2-1,y (5) xor with current + tax (2) index to 7-bit nibl + lda nibl,x (4) must not cross page boundary + ldx A2L (3) restore slot index + sta q6h,x (5) store encoded byte + lda q6l,x (4) handshake + dey (2) + bne L583A (3-) must not cross page boundary * end of write byte loop - lda pcl (3) get prior nibl (from nbuf2) -wrefd1 .EQ *-ofsD - ldy #$00 (2) warning: load value modified by prenib. -wrefa1 .EQ *-ofsD -L5853 eor $1000,y (4) warning: address modified by prenib. - and #$FC (2) strip low 2 bits - tax (2) index to nibl table - lda nibl,x (4) -wrefd2 .EQ *-ofsD - ldx #$60 (2) warning: value modified by prenib. - sta q6h,x (5) write nibl - lda q6l,x (4) handshake -wrefa2 .EQ *-ofsD - lda $1000,y (4) prior nibl. warning: address modified by prenib. - iny (2) all done with this page ? - bne L5853 (3-) loop until page end. - lda pch (3) get next (precalculated & translated) nibl. - beq L58C0 (2+) branch if code written was page aligned. - lda A2H (3) get byte address of last byte to be written. - beq L58B3 (2+) branch if only 1 byte left to write. - lsr a (2) test for odd or even last byte (carry set/clear) - lda pch (3) restore nibl to acc. - sta q6h,x (5) - lda q6l,x (4) - lda A1L (3) = byte 0 of 2nd page xor'd with byte 1 if - nop (2) above test set carry. - iny (2) y=1 - bcs L5899 (2+) branch if last byte to be odd. -wrefa3 .EQ *-ofsD -L5881 eor $1100,y (4) warning: address modified by prenib. - and #$FC (2) strip low 2 bits. - tax (2) index to nibl table - lda nibl,x (4) get nibl -wrefd3 .EQ *-ofsD - ldx #$60 (2) restore slot index. warning: modified by prenib - sta q6h,x (5) - lda q6l,x (4) -wrefa4 .EQ *-ofsD - lda $1100,y (4) warning: modified by prenib - iny (2) got prior nibl, point to next -wrefa5 .EQ *-ofsD - eor $1100,y (4) warning: modified by prenib -L5899 cpy A2H (3) set carry if this is the last nibl - and #$FC (2) strip low 2 bits - tax (2) - lda nibl,x (4) -wrefd4 .EQ *-ofsD - ldx #$60 (2) restore slot. warning: modified by prenib - sta q6h,x (5) - lda q6l,x (4) -wrefa6 .EQ *-ofsD - lda $1100,y (4) get prior nibl. warning: modified by prenib - iny (2) - bcc L5881 (3-) branch if not the last. - bcs L58B1 (3) waste 3 cycles, branch always. -L58B1 bcs L58C0 (3) branch always. -L58B3 lda |pch (4) absolute reference to zero page - sta q6h,x (5) - lda q6l,x (4) - pha (3) waste 14 micro-seconds total - pla (4) - pha (3) - pla (4) -L58C0 ldx A1H (3) use last nibl (anded with $FC) for checksum - lda nibl,x (4) -wrefd5 .EQ *-ofsD - ldx #$60 (2) restore slot. warning: modified by prenib - sta q6h,x (5) - lda q6l,x (4) - ldy #$00 (2) set y = index end mark table. - pha (3) waste another 11 micro-seconds - pla (4) - nop (2) - nop (2) -L58D3 lda endmrks,y (4) dm4, dm5, dm6 and turn off byte. - jsr wnibl (15,6) write it - iny (2) - cpy #$04 (2) have all end marks been written ? - bne L58D3 (3) if not. - clc (2,9) -wexit .EQ *-ofsD - lda q7l,x out of write mode - lda q6l,x to read mode. - rts return from write. + lda pcl (3) get prior nibl (from nbuf2) +wrefd1 .EQ *-ofsD + ldy #$00 (2) warning: load value modified by prenib. +wrefa1 .EQ *-ofsD +L5853 eor $1000,y (4) warning: address modified by prenib. + and #$FC (2) strip low 2 bits + tax (2) index to nibl table + lda nibl,x (4) +wrefd2 .EQ *-ofsD + ldx #$60 (2) warning: value modified by prenib. + sta q6h,x (5) write nibl + lda q6l,x (4) handshake +wrefa2 .EQ *-ofsD + lda $1000,y (4) prior nibl. warning: address modified by prenib. + iny (2) all done with this page ? + bne L5853 (3-) loop until page end. + lda pch (3) get next (precalculated & translated) nibl. + beq L58C0 (2+) branch if code written was page aligned. + lda A2H (3) get byte address of last byte to be written. + beq L58B3 (2+) branch if only 1 byte left to write. + lsr a (2) test for odd or even last byte (carry set/clear) + lda pch (3) restore nibl to acc. + sta q6h,x (5) + lda q6l,x (4) + lda A1L (3) = byte 0 of 2nd page xor'd with byte 1 if + nop (2) above test set carry. + iny (2) y=1 + bcs L5899 (2+) branch if last byte to be odd. +wrefa3 .EQ *-ofsD +L5881 eor $1100,y (4) warning: address modified by prenib. + and #$FC (2) strip low 2 bits. + tax (2) index to nibl table + lda nibl,x (4) get nibl +wrefd3 .EQ *-ofsD + ldx #$60 (2) restore slot index. warning: modified by prenib + sta q6h,x (5) + lda q6l,x (4) +wrefa4 .EQ *-ofsD + lda $1100,y (4) warning: modified by prenib + iny (2) got prior nibl, point to next +wrefa5 .EQ *-ofsD + eor $1100,y (4) warning: modified by prenib +L5899 cpy A2H (3) set carry if this is the last nibl + and #$FC (2) strip low 2 bits + tax (2) + lda nibl,x (4) +wrefd4 .EQ *-ofsD + ldx #$60 (2) restore slot. warning: modified by prenib + sta q6h,x (5) + lda q6l,x (4) +wrefa6 .EQ *-ofsD + lda $1100,y (4) get prior nibl. warning: modified by prenib + iny (2) + bcc L5881 (3-) branch if not the last. + bcs L58B1 (3) waste 3 cycles, branch always. +L58B1 bcs L58C0 (3) branch always. +L58B3 lda |pch (4) absolute reference to zero page + sta q6h,x (5) + lda q6l,x (4) + pha (3) waste 14 micro-seconds total + pla (4) + pha (3) + pla (4) +L58C0 ldx A1H (3) use last nibl (anded with $FC) for checksum + lda nibl,x (4) +wrefd5 .EQ *-ofsD + ldx #$60 (2) restore slot. warning: modified by prenib + sta q6h,x (5) + lda q6l,x (4) + ldy #$00 (2) set y = index end mark table. + pha (3) waste another 11 micro-seconds + pla (4) + nop (2) + nop (2) +L58D3 lda endmrks,y (4) dm4, dm5, dm6 and turn off byte. + jsr wnibl (15,6) write it + iny (2) + cpy #$04 (2) have all end marks been written ? + bne L58D3 (3) if not. + clc (2,9) +wexit .EQ *-ofsD + lda q7l,x out of write mode + lda q6l,x to read mode. + rts return from write. * 7-bit nibl write subroutines -wnibl9 .EQ *-ofsD - clc (2) 9 cycles, then write. -wnibl7 .EQ *-ofsD - pha (3) 7 cycles, then write. - pla (4) -wnibl .EQ *-ofsD - sta q6h,x (5) nibl write - ora q6l,x (4) clobbers acc, not carry - rts (6) +wnibl9 .EQ *-ofsD + clc (2) 9 cycles, then write. +wnibl7 .EQ *-ofsD + pha (3) 7 cycles, then write. + pla (4) +wnibl .EQ *-ofsD + sta q6h,x (5) nibl write + ora q6l,x (4) clobbers acc, not carry + rts (6) * preniblize subroutine (16 sector format) * @@ -805,151 +806,151 @@ wnibl .EQ *-ofsD * on exit: a,x,y undefined. write routine modified to do direct conversion * of high 6 bits of user's buffer data. -prenib16 .EQ *-ofsD - lda buf self-modify the addresses because of - ldy buf+1 the fast timing required. - clc all offsets are minus $AA. - adc #$02 the highest set is buf+$AC. - bcc L58FA branch if no carry, - iny otherwise add carry to high address. -L58FA sta prn3+1 self mod 3 - sty prn3+2 - sec - sbc #$56 middle set is buf+$56. - bcs L5906 branch if no borrow, - dey otherwise deduct from high. -L5906 sta prn2+1 self mod 2 - sty prn2+2 - sec - sbc #$56 low set is exactly buf - bcs L5912 - dey -L5912 sta prn1+1 self mod 1 - sty prn1+2 - ldy #$AA count up to 0. -prn1 .EQ *-ofsD get byte from lowest group. -L591A lda $1000,y warning: self modified. - and #$03 strip high 6 bits. - tax index to 2 bit equivalent. - lda twobit1,x - pha save pattern -prn2 .EQ *-ofsD get byte from middle group. - lda $1056,y warning: self modified. - and #$03 - tax - pla restore pattern. - ora twobit2,x combine 2nd group with 1st. - pha save new pattern. -prn3 .EQ *-ofsD get byte from highest group. - lda $10AC,y warning: self modified. - and #$03 - tax - pla restore new pattern - ora twobit3,x and form final nibl. - pha - tya - eor #$FF - tax - pla - sta nbuf2,x save in nibl buffer. - iny inc to next set. - bne L591A loop until all $56 nibls formed. - ldy buf now prepare data bytes for write16 subr. - dey prepare end address. - sty A2H - lda buf - sta wrefd1+1 warning: the following storage addresses - beq L595F starting with 'wref' are refs into code - eor #$FF space, changed by this routine. - tay index to last byte of page in (buf). - lda (buf),y pre-niblize the last byte of the page - iny with the first byte of the next page. - eor (buf),y - and #$FC - tax - lda nibl,x get disk 7-bit nible equivalent. -L595F sta pch - beq L596F branch if data to be written is page - lda A2H aligned. check if last byte is even - lsr a or odd address. shift even/odd -> carry. - lda (buf),y if even, then leave intact. - bcc L596D branch if odd. - iny if even, then pre-xor with byte 1. - eor (buf),y -L596D sta A1L save result for write routine. -L596F ldy #$FF index to last byte of data to write. - lda (buf),y to be used as a checksum. - and #$FC strip extra bits - sta A1H and save it. - ldy buf+1 now modify address references to - sty wrefa1+2 user data. - sty wrefa2+2 - iny - sty wrefa3+2 - sty wrefa4+2 - sty wrefa5+2 - sty wrefa6+2 - ldx A2L and lastly, index references to - stx wrefd2+1 controller. - stx wrefd3+1 - stx wrefd4+1 - stx wrefd5+1 - rts -chkprev .EQ *-ofsD - eor iobpdn same slot as last ? - asl a - beq L59BD - lda #$01 - sta montimeh -L59A6 lda iobpdn - and #$70 - tax - beq L59BD branch if no previous ever (boot only). - jsr chkdrv0 check if previous drive running. - beq L59BD branch if stopped. - lda #$01 delay - jsr mswait - lda montimeh - bne L59A6 -L59BD rts -rsetphse .EQ *-ofsD - lda unitnum get unit number. - and #$7F mask off high bit. - tax +prenib16 .EQ *-ofsD + lda buf self-modify the addresses because of + ldy buf+1 the fast timing required. + clc all offsets are minus $AA. + adc #$02 the highest set is buf+$AC. + bcc L58FA branch if no carry, + iny otherwise add carry to high address. +L58FA sta prn3+1 self mod 3 + sty prn3+2 + sec + sbc #$56 middle set is buf+$56. + bcs L5906 branch if no borrow, + dey otherwise deduct from high. +L5906 sta prn2+1 self mod 2 + sty prn2+2 + sec + sbc #$56 low set is exactly buf + bcs L5912 + dey +L5912 sta prn1+1 self mod 1 + sty prn1+2 + ldy #$AA count up to 0. +prn1 .EQ *-ofsD get byte from lowest group. +L591A lda $1000,y warning: self modified. + and #$03 strip high 6 bits. + tax index to 2 bit equivalent. + lda twobit1,x + pha save pattern +prn2 .EQ *-ofsD get byte from middle group. + lda $1056,y warning: self modified. + and #$03 + tax + pla restore pattern. + ora twobit2,x combine 2nd group with 1st. + pha save new pattern. +prn3 .EQ *-ofsD get byte from highest group. + lda $10AC,y warning: self modified. + and #$03 + tax + pla restore new pattern + ora twobit3,x and form final nibl. + pha + tya + eor #$FF + tax + pla + sta nbuf2,x save in nibl buffer. + iny inc to next set. + bne L591A loop until all $56 nibls formed. + ldy buf now prepare data bytes for write16 subr. + dey prepare end address. + sty A2H + lda buf + sta wrefd1+1 warning: the following storage addresses + beq L595F starting with 'wref' are refs into code + eor #$FF space, changed by this routine. + tay index to last byte of page in (buf). + lda (buf),y pre-niblize the last byte of the page + iny with the first byte of the next page. + eor (buf),y + and #$FC + tax + lda nibl,x get disk 7-bit nible equivalent. +L595F sta pch + beq L596F branch if data to be written is page + lda A2H aligned. check if last byte is even + lsr a or odd address. shift even/odd -> carry. + lda (buf),y if even, then leave intact. + bcc L596D branch if odd. + iny if even, then pre-xor with byte 1. + eor (buf),y +L596D sta A1L save result for write routine. +L596F ldy #$FF index to last byte of data to write. + lda (buf),y to be used as a checksum. + and #$FC strip extra bits + sta A1H and save it. + ldy buf+1 now modify address references to + sty wrefa1+2 user data. + sty wrefa2+2 + iny + sty wrefa3+2 + sty wrefa4+2 + sty wrefa5+2 + sty wrefa6+2 + ldx A2L and lastly, index references to + stx wrefd2+1 controller. + stx wrefd3+1 + stx wrefd4+1 + stx wrefd5+1 + rts +chkprev .EQ *-ofsD + eor iobpdn same slot as last ? + asl a + beq L59BD + lda #$01 + sta montimeh +L59A6 lda iobpdn + and #$70 + tax + beq L59BD branch if no previous ever (boot only). + jsr chkdrv0 check if previous drive running. + beq L59BD branch if stopped. + lda #$01 delay + jsr mswait + lda montimeh + bne L59A6 +L59BD rts +rsetphse .EQ *-ofsD + lda unitnum get unit number. + and #$7F mask off high bit. + tax * clear all the phases and force read mode - lda phaseoff+0,x make sure all motor phases are off. - lda phaseoff+2,x - lda phaseoff+4,x - lda phaseoff+6,x - rts -docheck .EQ *-ofsD - lda A4L command #. - cmp #$04 is the command allowed ? - bcs L59E6 if not. - lda bloknml - ldx bloknml+1 - stx ibtrk calculate block's track and sector. - beq L59E8 branch if block # is in range, - dex else test further. - bne L59E6 taken if bad range. - cmp #$18 must be < $118 - bcc L59E8 then ok. -L59E6 sec error. - rts -L59E8 clc - rts end of obj xrw_0 + lda phaseoff+0,x make sure all motor phases are off. + lda phaseoff+2,x + lda phaseoff+4,x + lda phaseoff+6,x + rts +docheck .EQ *-ofsD + lda A4L command #. + cmp #$04 is the command allowed ? + bcs L59E6 if not. + lda bloknml + ldx bloknml+1 + stx ibtrk calculate block's track and sector. + beq L59E8 branch if block # is in range, + dex else test further. + bne L59E6 taken if bad range. + cmp #$18 must be < $118 + bcc L59E8 then ok. +L59E6 sec error. + rts +L59E8 clc + rts end of obj xrw_0 - .DA #0000' pad bytes to $D6EC (pathbuf-$14) + .HS 0000 pad bytes to $D6EC (pathbuf-$14) * variables used by mli for smartport interface -spstatlist .EQ *-ofsD ref pathbuf-$14 - dc h'00000000' smartport status list buffer -spunit .EQ *-ofsD ref pathbuf-$10 - .DA #0000000000000000' smartport unit numbers - .DA #0000000000000000' +spstatlist .EQ *-ofsD ref pathbuf-$14 + .HS 00000000 smartport status list buffer +spunit .EQ *-ofsD ref pathbuf-$10 + .HS 0000000000000000 smartport unit numbers + .HS 0000000000000000 * pathname buffer starts at this page boundary (pathbuf = $D700) *-------------------------------------- diff --git a/ProDOS.203/ProDOS.S.GP.txt b/ProDOS.203/ProDOS.S.GP.txt index 6cadc228..1697189e 100644 --- a/ProDOS.203/ProDOS.S.GP.txt +++ b/ProDOS.203/ProDOS.S.GP.txt @@ -3,186 +3,194 @@ NEW * object code = mli_1 * global page -ofsG .EQ H2E00-MLI offset to global org +ofsG .EQ H2E00-MLI offset to global org -H2E00 jmp mlient1 $2E00-2EFF moved to $BF00 -jspare .EQ *-ofsG - jmp jspare will be changed to point to dispatcher. -clockv .EQ *-ofsG P8 clock vector - rts changed to jmp ($4C) if clock present. - .DA tclk_in' clock routine entry address. -p8errv .EQ *-ofsG error reporting hook. - jmp syserr1 -sysdeath .EQ *-ofsG - jmp sysdeath1 system failure hook. -p8error .EQ *-ofsG P8 error code - .DA #00' -drivertbl1 .EQ *-ofsG device driver table 1 - dc i2'nodevice' slot 0 reserved - dc i2'nodevice' s1, d1 - dc i2'nodevice' s2, d1 - dc i2'nodevice' s3, d1 - dc i2'nodevice' s4, d1 - dc i2'nodevice' s5, d1 - dc i2'nodevice' s6, d1 - dc i2'nodevice' s7, d1 -drivertbl2 .EQ *-ofsG device driver table 2 - dc i2'nodevice' slot 0 reserved - dc i2'nodevice' s1, d2 - dc i2'nodevice' s2, d2 - dc i2'nodevice' s3, d2 - dc i2'nodevice' s4, d2 - dc i2'nodevice' s5, d2 - dc i2'nodevice' s6, d2 - dc i2'nodevice' s7, d2 -devnum .EQ *-ofsG most recent accessed device - .DA #00' -numdevs .EQ *-ofsG count (-1) active devices - dc h'FF' -devlist .EQ *-ofsG active device list - dc h'00000000000000' up to 14 units may be active - dc h'00000000000000' - .DA #00' - msb off - dc c'(C)APPLE ' -mlient1 .EQ *-ofsG - php - sei - jmp mlicont -aftirq .EQ *-ofsG irq returns here. - sta ramin read/write RAM bank 1 - jmp fix45 restore $45 after interrupt in LC -oldacc .EQ *-ofsG - .DA #00' -afbank .EQ *-ofsG - dc h'00' +H2E00 jmp mlient1 $2E00-2EFF moved to $BF00 +jspare .EQ *-ofsG + jmp jspare will be changed to point to dispatcher. +clockv .EQ *-ofsG P8 clock vector + rts changed to jmp ($4C) if clock present. + .DA tclk_in clock routine entry address. +p8errv .EQ *-ofsG error reporting hook. + jmp syserr1 +sysdeath .EQ *-ofsG + jmp sysdeath1 system failure hook. +p8error .EQ *-ofsG P8 error code + .DA #0 +drivertbl1 .EQ *-ofsG device driver table 1 + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice +drivertbl2 .EQ *-ofsG device driver table 2 + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice + .DA nodevice +devnum .EQ *-ofsG most recent accessed device + .DA #0 +numdevs .EQ *-ofsG count (-1) active devices + .DA #$ff +devlist .EQ *-ofsG active device list + .HS 00000000000000 up to 14 units may be active + .HS 00000000000000 + .DA #0 + + .AS "(C)APPLE " +mlient1 .EQ *-ofsG + php + sei + jmp mlicont +aftirq .EQ *-ofsG irq returns here. + sta ramin read/write RAM bank 1 + jmp fix45 restore $45 after interrupt in LC +oldacc .EQ *-ofsG + .DA #0 +afbank .EQ *-ofsG + .HS 0 * memory map of lower 48k. each bit represents 1 page. * protected pages = 1, unprotected = 0 -memmap .EQ *-ofsG P8 memory bitmap - dc h'C000000000000000' - dc h'0000000000000000' - .DA #0000000000000001' +memmap .EQ *-ofsG P8 memory bitmap + .HS C000000000000000 + .HS 0000000000000000 + .HS 0000000000000001 * table of buffer addresses for currently open files. * these can only be changed thru the mli call setbuf. -buftbl .EQ *-ofsG - dc h'0000' file #1 - dc h'0000' file #2 - dc h'0000' file #3 - dc h'0000' file #4 - .DA #0000' file #5 - dc h'0000' file #6 - dc h'0000' file #7 - dc h'0000' file #8 +buftbl .EQ *-ofsG + .HS 0000 file #1 + .HS 0000 file #2 + .HS 0000 file #3 + .HS 0000 file #4 + .HS 0000 file #5 + .HS 0000 file #6 + .HS 0000 file #7 + .HS 0000 file #8 * table of interrupt vectors. these can only be changed * by the mli call allocate_interrupt. values of the registers * at the time of the most recent interrupt are stored here along * with the address interrupted. -inttbl .EQ *-ofsG interrupt table - .DA #0000' int #1 - dc h'0000' int #2 - dc h'0000' int #3 - dc h'0000' int #4 -p8areg .EQ *-ofsG A register savearea - .DA #00' -p8xreg .EQ *-ofsG X register savearea - dc h'00' -p8yreg .EQ *-ofsG Y register savearea - dc h'00' -p8sreg .EQ *-ofsG S register savearea - dc h'00' -p8preg .EQ *-ofsG P register savearea - dc h'00' -bankid .EQ *-ofsG bank ID byte (ROM/RAM) - dc h'01' -intadr .EQ *-ofsG interrupt return address - dc h'0000' -p8date .EQ *-ofsG bits 15-9=yr, 8-5=mo, 4-0=day - dc h'0000' -p8time .EQ *-ofsG bits 12-8=hr, 5-0=min, low-hi format - dc h'0000' -flevel .EQ *-ofsG current file level - dc h'00' -bubit .EQ *-ofsG backup bit disable, setfileinfo only - dc h'00' -spare1 .EQ *-ofsG used to save acc - dc h'00' -newpfxptr .EQ *-ofsG appletalk alternate prefix ptr - dc h'00' -machid .EQ *-ofsG machine ID byte - dc h'00' -rommap .EQ *-ofsG slot ROM bit map - dc h'00' -preflag .EQ *-ofsG prefix active flag - dc h'00' -mliact .EQ *-ofsG MLI active flag - dc h'00' -mliretn .EQ *-ofsG last MLI call return address - dc h'0000' -mlix .EQ *-ofsG MLI X register savearea - dc h'00' -mliy .EQ *-ofsG MLI Y register savearea - dc h'00' +inttbl .EQ *-ofsG interrupt table + .HS 0000 int #1 + .HS 0000 int #2 + .HS 0000 int #3 + .HS 0000 int #4 +p8areg .EQ *-ofsG A register savearea + .DA #0 +p8xreg .EQ *-ofsG X register savearea + .DA #0 +p8yreg .EQ *-ofsG Y register savearea + .DA #0 +p8sreg .EQ *-ofsG S register savearea + .DA #0 +p8preg .EQ *-ofsG P register savearea + .DA #0 +bankid .EQ *-ofsG bank ID byte (ROM/RAM) + .DA #1 +intadr .EQ *-ofsG interrupt return address + .HS 0000 +p8date .EQ *-ofsG bits 15-9=yr, 8-5=mo, 4-0=day + .HS 0000 +p8time .EQ *-ofsG bits 12-8=hr, 5-0=min, low-hi format + .HS 0000 +flevel .EQ *-ofsG current file level + .DA #0 +bubit .EQ *-ofsG backup bit disable, setfileinfo only + .DA #0 +spare1 .EQ *-ofsG used to save acc + .DA #0 +newpfxptr .EQ *-ofsG appletalk alternate prefix ptr + .DA #0 +machid .EQ *-ofsG machine ID byte + .DA #0 +rommap .EQ *-ofsG slot ROM bit map + .DA #0 +preflag .EQ *-ofsG prefix active flag + .DA #0 +mliact .EQ *-ofsG MLI active flag + .DA #0 +mliretn .EQ *-ofsG last MLI call return address + .DA 0 +mlix .EQ *-ofsG MLI X register savearea + .DA #0 +mliy .EQ *-ofsG MLI Y register savearea + .DA #0 * language card bank switching routines which must reside at $BFA0 because * workstation software patches this area -HBFA0 .EQ *-ofsG - eor $E000 test for rom enable - beq L2EAA taken if ram enabled - sta romin read ROM - bne L2EB5 always -L2EAA lda bnkbyt2 for alternate ram - eor $D000 test - beq L2EB5 branch if not alternate ram - lda altram else enable alt $D000 -L2EB5 pla return code - rti re-enable interrupts and return -mlicont .EQ *-ofsG - sec - ror mliact notify interrupt routines MLI active. - lda $E000 preserve language card/rom orientation - sta bnkbyt1 for proper restoration when mli exits. - lda $D000 - sta bnkbyt2 - lda ramin force ram card on - lda ramin with write allowed - jmp xdosmli -irqexit .EQ *-ofsG - lda bankid determine state of ram card (ROM/RAM) -irqxit0 .EQ *-ofsG - beq L2EE2 branch if ram card enabled. - bmi L2EDF branch if alternate $D000 enabled. - lsr a determine if no ram card present. - bcc L2EE7 branch if rom only system. - lda romin1 enable rom - bcs L2EE7 always taken -L2EDF lda altram enable alternate $D000 -L2EE2 lda #$01 preset bankid for rom. - sta bankid (reset if ram card interrupt) -L2EE7 lda p8areg restore acc - rti exit -irqent .EQ *-ofsG this entry only used when rom - bit ramin was enabled at time of interrupt. - bit ramin - jmp irqrecev -bnkbyt1 .EQ *-ofsG - dc h'00' -bnkbyt2 .EQ *-ofsG - dc h'00' - dc h'00000000' pad to before $BFFA - dc h'04' gsos compatibility byte ($BFFA) - .DA #00' pad - dc h'00' reserved - dc h'00' version # of running interpreter - dc h'00' preserved for System Utilities -kversion .EQ *-ofsG kernal version - dc h'23' represents release 2.0.3 +HBFA0 .EQ *-ofsG + eor $E000 test for rom enable + beq .1 taken if ram enabled + sta romin read ROM + bne .2 always +.1 lda bnkbyt2 for alternate ram + eor $D000 test + beq .2 branch if not alternate ram + lda altram else enable alt $D000 +.2 pla return code + rti re-enable interrupts and return + +mlicont .EQ *-ofsG + sec + ror mliact notify interrupt routines MLI active. + lda $E000 preserve language card/rom orientation + sta bnkbyt1 for proper restoration when mli exits. + lda $D000 + sta bnkbyt2 + lda ramin force ram card on + lda ramin with write allowed + jmp xdosmli + +irqexit .EQ *-ofsG + lda bankid determine state of ram card (ROM/RAM) + +irqxit0 .EQ *-ofsG + beq .2 branch if ram card enabled. + bmi .1 branch if alternate $D000 enabled. + + lsr determine if no ram card present. + bcc .3 branch if rom only system. + + lda romin1 enable rom + bcs .3 always taken + +.1 lda altram enable alternate $D000 +.2 lda #$01 preset bankid for rom. + sta bankid (reset if ram card interrupt) +.3 lda p8areg restore acc + rti exit + +irqent .EQ *-ofsG this entry only used when rom + bit ramin was enabled at time of interrupt. + bit ramin + jmp irqrecev + +bnkbyt1 .EQ *-ofsG + .DA #0 +bnkbyt2 .EQ *-ofsG + .DA #0 + .HS 00000000 pad to before $BFFA + .DA #4 gsos compatibility byte ($BFFA) + .DA #0 pad + .DA #0 reserved + .DA #0 version # of running interpreter + .DA #0 preserved for System Utilities +kversion .EQ *-ofsG kernal version + .HS 23 represents release 2.0.3 * end of obj mli_1 *-------------------------------------- diff --git a/ProDOS.203/ProDOS.S.IRQ.txt b/ProDOS.203/ProDOS.S.IRQ.txt index 404d1164..465d894d 100644 --- a/ProDOS.203/ProDOS.S.IRQ.txt +++ b/ProDOS.203/ProDOS.S.IRQ.txt @@ -5,69 +5,69 @@ NEW * this routine handles interrupts and is coded to reach 'lreset' precisely at * address $FFCB (ROM rts opcode) for rom switching to function. -lanirq .EQ *-ofsR2 +lanirq .EQ *-ofsR2 -H2D9B pha $2D9B-2DFF moved to $FF9B-FFFF - lda accsav - sta oldacc - pla - sta accsav - pla get status register from stack - pha and put it back. - and #$10 is it a break or interrupt? - bne H2DC2 branch if break. - lda $D000 get ram bankid (LC1 = $D8, LC2=$EE) - eor #$D8 is the system active? ($D8) - beq sysactv branch if it is - lda #$FF -sysactv sta bankid - sta afbank - lda #>aftirq setup return address - pha - lda #romirq setup ROM re-entry - pha - lda #ramdest -gocard .EQ *-ofsR2 also used by 'mainwrt' - sta passit+1 - sec direction ram -> card - clv start with original zero page - jmp xfer transfer control -ioerr lda #$27 - bne H2D41 - lda #$2B write protect error. -H2D41 sec flags error - bcs H2D47 -noerr .EQ *-ofsR2 -stat lda #$00 - clc -H2D47 php save status - pha and error code. - ldx #$0B restore 13 byes of parms -H2D4B lda a1l1,x - sta A1L,x - dex - bpl H2D4B - lda sp1 restore xfer parms. - bit $6060 addr $FF58 must = rts ($60) as in ROM - sta passit - lda sp1+1 - sta passit+1 - pla restore error code - plp and status. - rts +format lda #ramdest card entry point + sta passit + lda /ramdest +gocard .EQ *-ofsR2 also used by 'mainwrt' + sta passit+1 + sec direction ram -> card + clv start with original zero page + jmp xfer transfer control +ioerr lda #$27 + bne H2D41 + lda #$2B write protect error. +H2D41 sec flags error + bcs H2D47 +noerr .EQ *-ofsR2 +stat lda #$00 + clc +H2D47 php save status + pha and error code. + ldx #$0B restore 13 byes of parms +H2D4B lda a1l1,x + sta A1L,x + dex + bpl H2D4B + lda sp1 restore xfer parms. + bit $6060 addr $FF58 must = rts ($60) as in ROM + sta passit + lda sp1+1 + sta passit+1 + pla restore error code + plp and status. + rts mainwrt .EQ *-ofsR2 transfer data to card. - sta wrcardram write to alt 48K - ldy #$00 -H2D6A lda (A1L),y pointers set in card by 'setptr' - sta (A4L),y - lda (A2L),y - sta (A3L),y - dey - bne H2D6A - sta wrmainram write to main 48K. - lda #donewrt - jmp gocard -sp1 .EQ *-ofsR2 - .DA #0000' -a1l1 .EQ *-ofsR2 13 bytes of storage + sta wrcardram write to alt 48K + ldy #$00 +H2D6A lda (A1L),y pointers set in card by 'setptr' + sta (A4L),y + lda (A2L),y + sta (A3L),y + dey + bne H2D6A + sta wrmainram write to main 48K. + lda #donewrt done writing card + sta passit + lda /donewrt + jmp gocard +sp1 .EQ *-ofsR2 + .HS 0000 +a1l1 .EQ *-ofsR2 13 bytes of storage * end of obj ram_2 -r2_end .EQ * - ds $D9B-(r2_end-H2000) fill to lanirq ($FF9B see note below) +r2_end .EQ * + .BS $D9B-(r2_end-H2000) fill to lanirq ($FF9B see note below) *-------------------------------------- MAN SAVE USR/SRC/PRODOS.203/PRODOS.S.RAM diff --git a/ProDOS.203/ProDOS.S.RAMI.txt b/ProDOS.203/ProDOS.S.RAMI.txt index 5317f93a..9a0d1e6d 100644 --- a/ProDOS.203/ProDOS.S.RAMI.txt +++ b/ProDOS.203/ProDOS.S.RAMI.txt @@ -35,9 +35,9 @@ RAM_1 .BS $2C80-* lda /lcdest sta drivertbl2+7 - inc numdevs count (-1) active devices - ldx numdevs - lda #$BF unit num of /RAM + inc numdevs count (-1) active devices + ldx numdevs + lda #$BF unit num of /RAM sta devlist,x rts end of obj ram_1 diff --git a/ProDOS.203/ProDOS.S.RAMX.txt b/ProDOS.203/ProDOS.S.RAMX.txt index 225410e7..226e6b9a 100644 --- a/ProDOS.203/ProDOS.S.RAMX.txt +++ b/ProDOS.203/ProDOS.S.RAMX.txt @@ -227,7 +227,7 @@ L525E cmp #$11 if <=17 then done sbc #$11 else block=block-17. inx iteration count. bpl L525E should branch always - .DA #00' otherwise crash !!! + .HS 00 otherwise crash !!! L5268 tay remainder in y * if remainder is 1 then it's an index block: @@ -287,58 +287,57 @@ L52B1 lda (A4L),y (pointer set by setptr) bpl L52B1 jmp exitcard -formatflg .EQ *-ofsR0 - .DA #00' not formatted yet -tcmd .EQ *-ofsR0 - dc h'00' command - dc h'00' unit (not used) -R2L .EQ *-ofsR0 - dc h'00' R2 = user buffer -R2H .EQ *-ofsR0 - dc h'00' -R01 .EQ *-ofsR0 - dc h'00' page requested -BITMAP .EQ *-ofsR0 - dc h'00FFFFFF' blocks 0-7 used - .DA #FFFFFFFF' - dc h'FFFFFFFF' - .DA #FFFFFFFE' -VDIR .EQ *-ofsR0 start of vdir. - dc h'F3' storage type = F, name length = 3 - msb off - dc c'RAM' -access .EQ *-ofsR0 - .DA #C3' destroy, rename, read enabled - dc h'27' entry length - dc h'0D' - dc h'0000' - dc h'0300' block 3 - dc h'7F' 128 blocks +formatflg .EQ *-ofsR0 + .HS 00 not formatted yet +tcmd .EQ *-ofsR0 + .HS 00 command + .HS 00 unit (not used) +R2L .EQ *-ofsR0 + .HS 00 R2 = user buffer +R2H .EQ *-ofsR0 + .HS 00 +R01 .EQ *-ofsR0 + .HS 00 page requested +BITMAP .EQ *-ofsR0 + .HS 00FFFFFF blocks 0-7 used + .HS FFFFFFFF + .HS FFFFFFFF + .HS FFFFFFFE +VDIR .EQ *-ofsR0 start of vdir. + .HS F3 storage type = F, name length = 3 + .AS "RAM" +access .EQ *-ofsR0 + .DA #C3 destroy, rename, read enabled + .HS 27 entry length + .HS 0D + .HS 0000 + .HS 0300 block 3 + .HS 7F 128 blocks -exitcard .EQ *-ofsR0 - lda ramin restore language card - lda ramin - pla get 80store - bpl L52EA 80store wasn't on - sta store80on enable 80store -L52EA jmp bypass jump around passit -passit .EQ *-ofsR0 - .DA #0000' -bypass .EQ *-ofsR0 - lda #noerr -ex1 .EQ *-ofsR0 - sta passit+1 also used by blockwrite - clc transfer card to main - clv use standard zeropage/stack - jmp xfer jmp back from language card. +exitcard .EQ *-ofsR0 + lda ramin restore language card + lda ramin + pla get 80store + bpl L52EA 80store wasn't on + sta store80on enable 80store +L52EA jmp bypass jump around passit +passit .EQ *-ofsR0 + .HS 0000 +bypass .EQ *-ofsR0 + lda #noerr set up return to noerr + sta passit + lda /noerr +ex1 .EQ *-ofsR0 + sta passit+1 also used by blockwrite + clc transfer card to main + clv use standard zeropage/stack + jmp xfer jmp back from language card. * NOTE: the previous section of code MUST NOT use $3FE or $3FF * since the interrupt vector must go there if aux interrupts * are to be used. no room for expansion here !! - .DA #0000' $3FE-$3FF + .HS 0000 $3FE-$3FF * end of obj ram_0 *-------------------------------------- diff --git a/ProDOS.203/ProDOS.S.SEL0.txt b/ProDOS.203/ProDOS.S.SEL0.txt index 9b10f7f5..8b202555 100644 --- a/ProDOS.203/ProDOS.S.SEL0.txt +++ b/ProDOS.203/ProDOS.S.SEL0.txt @@ -261,57 +261,57 @@ L5C0B jsr prntmsg dsp1msgs .EQ *-ofsS dsp1msg0 .EQ *-ofsS dc c'ENTER PREFIX (PRESS "RETURN" TO ACCEPT)' - .DA #00' + .HS 00 disp1msg .EQ *-ofsS dc c'ENTER PATHNAME OF NEXT APPLICATION' - .DA #00' + .HS 00 dsp1err1 .EQ *-ofsS .DA #87' dc c'NOT A TYPE "SYS" FILE' - .DA #00' + .HS 00 dsp1err2 .EQ *-ofsS .DA #87' dc c'I/O ERROR ' - .DA #00' + .HS 00 dsp1err3 .EQ *-ofsS .DA #87' dc c'FILE/PATH NOT FOUND ' - .DA #00' + .HS 00 dsp1info .EQ *-ofsS get file info parms .DA #0A' 10 parameters - dc i2'PrefixBuf' pathname buffer + .DA PrefixBuf' pathname buffer dsp1acess .EQ *-ofsS - dc h'00' access + .HS 00 access dsp1type .EQ *-ofsS - dc h'00' file type + .HS 00 file type ds 13 the rest are unimportant dsp1open .EQ *-ofsS open file parms dc h'03' 3 parameters for open - dc i2'PrefixBuf' pathname buffer - dc i2'fbuf' fcb buffer + .DA PrefixBuf' pathname buffer + .DA fbuf' fcb buffer dsp1refn .EQ *-ofsS - dc h'00' reference # + .HS 00 reference # dsp1cls .EQ *-ofsS close file parms .DA #01' 1 parameter for close dsp1cln .EQ *-ofsS - dc h'00' reference # + .HS 00 reference # dsp1read .EQ *-ofsS dc h'04' 4 parameters for read dsp1rdn .EQ *-ofsS - dc h'00' reference # - dc i2'sysentry' .SYS load address + .HS 00 reference # + .DA sysentry' .SYS load address dsp1cnt .EQ *-ofsS - dc h'0000' byte count - .DA #0000' + .HS 0000 byte count + .HS 0000 dsp1eof .EQ *-ofsS get eof parms dc h'02' 2 parameters dsp1eofn .EQ *-ofsS - dc h'00' reference # + .HS 00 reference # dsp1eofb .EQ *-ofsS dc h'000000' 3 byte eof dsp1pfx .EQ *-ofsS get/set prefix parms .DA #01' 1 parameter - dc i2'PrefixBuf' prefix buffer + .DA PrefixBuf' prefix buffer disp1end .EQ * ds $300-(disp1end-disp1obj) fill to page boundary diff --git a/ProDOS.203/ProDOS.S.SEL1.txt b/ProDOS.203/ProDOS.S.SEL1.txt index ef395909..6e858761 100644 --- a/ProDOS.203/ProDOS.S.SEL1.txt +++ b/ProDOS.203/ProDOS.S.SEL1.txt @@ -126,7 +126,7 @@ L5DD8 adc #$04 add 4 and put in jsr MLI call mli .DA #$CE' set mark .DA #smparms' parameters address = $0060 - dc h'00' + .HS 00 bcs L5DB3 error jsr doread bcs L5DB3 error. @@ -390,38 +390,38 @@ fldrmsg .EQ *-ofsB dc c'XY' folder characters dc h'18' disable mousetext dc h'0E' normal control code - dc h'00' + .HS 00 op_parms .EQ *-ofsB open parameters .DA #03' 3 parms - dc i2'PrefixBuf' pathname - dc i2'op_buf' file buffer + .DA PrefixBuf' pathname + .DA op_buf' file buffer op_refn .EQ *-ofsB - dc h'00' reference number + .HS 00 reference number cl_parms .EQ *-ofsB close parameters dc h'01' 1 parm - dc h'00' reference number. + .HS 00 reference number. ol_parms .EQ *-ofsB online parameters dc h'02' 2 parms ol_unit .EQ *-ofsB dc h'60' unit number, default = s6, d1 - dc i2'PrefixBuf+1' data buffer + .DA PrefixBuf+1' data buffer pf_parms .EQ *-ofsB set prefix parameters .DA #01' one parm - dc i2'PrefixBuf' pathname + .DA PrefixBuf' pathname rd_parms .EQ *-ofsB read parameters .DA #04' 4 parms rd_refn .EQ *-ofsB dc h'01' reference number - dc i2'sysentry' data buffer + .DA sysentry' data buffer * these last 2 parms (4 bytes) may extend past $300 length limit since * the request count is set prior to using the parm block and the transfer * count isn't used at all (except by prodos) -* dc h'0000' requested length -* dc h'0000' actual length +* .HS 0000 requested length +* .HS 0000 actual length dhdr_len .EQ *-ofsB directory header length - dc h'00' (actually uses 2 bytes) + .HS 00 (actually uses 2 bytes) * end of obj sel_1 *-------------------------------------- diff --git a/ProDOS.203/ProDOS.S.SEL2.txt b/ProDOS.203/ProDOS.S.SEL2.txt index a62ca080..f4b14290 100644 --- a/ProDOS.203/ProDOS.S.SEL2.txt +++ b/ProDOS.203/ProDOS.S.SEL2.txt @@ -13,15 +13,16 @@ NEW * (as other replacement quit code is supposed to do) because GQuit checks * this to see if this version of quit code is available. -ofsQ .EQ GQdisp-dispadr offset to GQuit dispatcher org + .OP 65816 - msb off -GQdisp lda ramin read/write LC bank 1 - clc - xce 16 bit native mode. - jmp >P8QUIT go to GQuit. - .DA #0000000000' offset to paragraph boundary. - dc c'GQ' id bytes so GQuit can identify this +ofsQ .EQ GQdisp-dispadr offset to GQuit dispatcher org + +GQdisp lda ramin read/write LC bank 1 + clc + xce 16 bit native mode. + jmp >P8QUIT go to GQuit. + .DA #0000000000 offset to paragraph boundary. + .AS "GQ" id bytes so GQuit can identify this * load application * @@ -40,125 +41,126 @@ GQdisp lda ramin read/write LC bank 1 * so in case of an error setting the P8 prefix, it can be displayed in the * error message. - SHORT M 8 bit accumulator - LONGI ON - pha save the switch status. - ldx #inbuf point to passed prefix. - jsr copyvol copy the name into the buffer. - pla retrieve the switch status + SHORT M 8 bit accumulator + LONGI ON + pha save the switch status. + ldx #inbuf point to passed prefix. + jsr copyvol copy the name into the buffer. + pla retrieve the switch status * go into emulation mode to load and run Prodos 8 application - sec - xce 8 bit emulation mode - ora #$00 switching from P16 to P8 ? - beq L602D no. + sec + xce 8 bit emulation mode + ora #$00 switching from P16 to P8 ? + beq L602D no. * switching from P16 to P8 so pass prefix 0 from P16 to the P8 prefix. the * prefix is passed at $00/0200 by GQuit. -L6020 jsr MLI set prefix - .DA #$C6' - .DA pfxparms' - bcc L602D if prefix ok. - jsr gqerror error handler. - bra L6020 try again +L6020 jsr MLI set prefix + .DA #$C6 + .DA pfxparms + bcc L602D if prefix ok. + jsr gqerror error handler. + bra L6020 try again * load application at $2000 -L602D xce native mode (carry clear) - LONG I 16 bit regs, 8 bit acc. - lda PrefixBuf+1 is the application name - cmp #$2F a complete pathname ? - bne L603D no, use prefix as volume name - ldx #PrefixBuf else use the application name. - jsr copyvol copy the volume name to buffer. -L603D sec back to emulation mode. - xce -L603F jsr MLI open the application file - .DA #$C8' - .DA opnparms' - bcc L604C if open ok. - jsr gqerror handle error. - bra L603F try again. -L604C lda oprefnum copy ref number to parameter lists - sta eofrefn - sta rdrefnum - sta closeref +L602D xce native mode (carry clear) + LONG I 16 bit regs, 8 bit acc. + lda PrefixBuf+1 is the application name + cmp #$2F a complete pathname ? + bne L603D no, use prefix as volume name + ldx #PrefixBuf else use the application name. + jsr copyvol copy the volume name to buffer. +L603D sec back to emulation mode. + xce +L603F jsr MLI open the application file + .DA #$C8 + .DA opnparms + bcc L604C if open ok. + jsr gqerror handle error. + bra L603F try again. +L604C lda oprefnum copy ref number to parameter lists + sta eofrefn + sta rdrefnum + sta closeref * do a geteof call for how many bytes to read -L6058 jsr MLI get eof - .DA #$D1' - .DA eofparms' - bcc L6065 eof ok. - jsr gqerror handle error. - bra L6058 try again. +L6058 jsr MLI get eof + .DA #$D1 + .DA eofparms + bcc L6065 eof ok. + jsr gqerror handle error. + bra L6058 try again. * store the size of the file in the read parameter list -L6065 lda eofval - sta rdcount - lda eofval+1 - sta rdcount+1 -L6071 jsr MLI read - .DA #$CA' - .DA readparm' - bcc L607E read ok - jsr gqerror - bra L6071 -L607E jsr MLI close - .DA #$CC' - .DA closeprm' - bcc L608B close ok - jsr gqerror - bra L607E -L608B jsr dolaunch check for possible 2nd pathname. - bne L6099 if none then run program - jsr ckfordrv else make sure the file is online. - bcc L6099 if so then run the program. - lda #$45 volume not found error. - bra L60AB -L6099 lda romin enable ROM - jmp sysentry execute the system application -gqerror .EQ *-ofsQ - clc - xce 16 bit native mode - LONG I,M - jsr mountvol mount volume. - bcs L60AB if error. - sec back to emulation mode. - xce - rts +L6065 lda eofval + sta rdcount + lda eofval+1 + sta rdcount+1 +L6071 jsr MLI read + .DA #$CA + .DA readparm + bcc L607E read ok + jsr gqerror + bra L6071 +L607E jsr MLI close + .DA #$CC + .DA closeprm + bcc L608B close ok + jsr gqerror + bra L607E +L608B jsr dolaunch check for possible 2nd pathname. + bne L6099 if none then run program + jsr ckfordrv else make sure the file is online. + bcc L6099 if so then run the program. + lda #$45 volume not found error. + bra L60AB +L6099 lda romin enable ROM + jmp sysentry execute the system application + +gqerror .EQ *-ofsQ + clc + xce 16 bit native mode + LONG I,M + jsr mountvol mount volume. + bcs L60AB if error. + sec back to emulation mode. + xce + rts * generate a fatal error while running under Prodos 8. * on input, acc = error code. this routine does not return. -L60AB clc native mode - xce - LONG I,M - and #$00FF mask off high byte of error code. - pha put on stack for IntMath tool call. - pea $0000 errval>>16 - pea errval push address of string buffer. - pea $0004 make string 4 digits long. - _Int2Hex convert value to hex string. - pha make space for return value. - pea $0000 quitstr1>>16 - pea quitstr1 push first error message address - pea $0000 quitstr2>>16 - pea quitstr2 push second error message address - pea $0000 button1>>16 - pea button1 push first button text address - pea $0000 quitbtn2>>16 - pea quitbtn2 push 2nd button text address (null) - _TLTextMountVolume make the dialog box - pla retrieve button press (not used) - sec emulation mode - xce - jsr MLI quit back to GQuit - .DA #$65' - .DA quitparms' +L60AB clc native mode + xce + LONG I,M + and #$00FF mask off high byte of error code. + pha put on stack for IntMath tool call. + pea $0000 errval>>16 + pea errval push address of string buffer. + pea $0004 make string 4 digits long. + _Int2Hex convert value to hex string. + pha make space for return value. + pea $0000 quitstr1>>16 + pea quitstr1 push first error message address + pea $0000 quitstr2>>16 + pea quitstr2 push second error message address + pea $0000 button1>>16 + pea button1 push first button text address + pea $0000 quitbtn2>>16 + pea quitbtn2 push 2nd button text address (null) + _TLTextMountVolume make the dialog box + pla retrieve button press (not used) + sec emulation mode + xce + jsr MLI quit back to GQuit + .DA #$65 + .DA quitparms * p8 mount volume * @@ -166,80 +168,81 @@ L60AB clc native mode * on exit: carry clear if mount volume displayed and 'return' was pressed. * carry set if no window displayed or if had window and 'esc' pressed. -mountvol .EQ *-ofsQ - ldy #$0000 volbuf>>16 - ldx #volbuf set up pointer to volume name. +mountvol .EQ *-ofsQ + ldy #$0000 volbuf>>16 + ldx #volbuf set up pointer to volume name. * if error is 'volume not found' or 'no disk in drive' then display the * Mount Volume window, otherwise return with carry set. - and #$00FF mask just in case. - cmp #$0045 volume not found ? - beq L6101 yes - cmp #$002F no disk in drive ? - beq L6101 yes - sec indicate error not handled. - rts return with error code still in acc. -L6101 pha save error code in case esc pressed. - phy pointer to volume name. - phx - tsc - phd save D reg. - tcd point D reg at stack. - lda [$01] get length byte and leading separator. - dec a don't count leading separator. - xba then swap the bytes so the volume name - sta [$01] doesn't cpntain the separator. - pha room for result. - pea $0000 mountmsg>>16 - pea mountmsg - phy hi word of pointer to volume name. - inx skip separator. - phx lo word of pointer to volume name. - pea $0000 button1>>16 - pea button1 'Return' - pea $0000 button2>>16 - pea button2 'Escape' - _TLTextMountVolume - lda [$01] restore first 2 bytes of vilume name - xba back to their original positions - inc a and values. - sta [$01] - pla which button: 1=Return 2=Escape. - pld restore D reg. - plx pull volume name pointer off stack - plx - cmp #$0001 which button was pressed ? - bne L613C if Escape pressed. - clc indicate Return was pressed. - pla pull original error code off stack. - rts return with carry clear. -L613C sec indicate Escape was pressed. - pla restore error code. - rts return with carry set. + and #$00FF mask just in case. + cmp #$0045 volume not found ? + beq L6101 yes + cmp #$002F no disk in drive ? + beq L6101 yes + sec indicate error not handled. + rts return with error code still in acc. + +L6101 pha save error code in case esc pressed. + phy pointer to volume name. + phx + tsc + phd save D reg. + tcd point D reg at stack. + lda [$01] get length byte and leading separator. + dec don't count leading separator. + xba then swap the bytes so the volume name + sta [$01] doesn't cpntain the separator. + pha room for result. + pea $0000 mountmsg>>16 + pea mountmsg + phy hi word of pointer to volume name. + inx skip separator. + phx lo word of pointer to volume name. + pea $0000 button1>>16 + pea button1 'Return' + pea $0000 button2>>16 + pea button2 'Escape' + _TLTextMountVolume + lda [$01] restore first 2 bytes of vilume name + xba back to their original positions + inc and values. + sta [$01] + pla which button: 1=Return 2=Escape. + pld restore D reg. + plx pull volume name pointer off stack + plx + cmp #$0001 which button was pressed ? + bne L613C if Escape pressed. + clc indicate Return was pressed. + pla pull original error code off stack. + rts return with carry clear. +L613C sec indicate Escape was pressed. + pla restore error code. + rts return with carry set. * copy the volume name from the given pathname to the volume name buffer. * * inputs: x = length byte of complete pathname containing volume name. * output: volume name is stored in volbuf. -copyvol .EQ *-ofsQ - lda |1,x get the first slash - sta volbuf+1 - ldy #$0002 initialize the length count. - LONGI OFF - LONGA OFF -L6148 lda |2,x now copy the volume name up to - cmp #$2F the separating slash. - beq L6156 - sta volbuf,y - inx - iny - bra L6148 -L6156 dey fix character count. - tya length. - sta volbuf store the resultant string length. - rts +copyvol .EQ *-ofsQ + lda |1,x get the first slash + sta volbuf+1 + ldy #$0002 initialize the length count. + LONGI OFF + LONGA OFF +L6148 lda |2,x now copy the volume name up to + cmp #$2F the separating slash. + beq L6156 + sta volbuf,y + inx + iny + bra L6148 +L6156 dey fix character count. + tya length. + sta volbuf store the resultant string length. + rts * translate a filename message from the message center to the currently * launching P8 application if it can accept a second filename. If found, @@ -247,109 +250,109 @@ L6156 dey fix character count. * on exit, the z-flag is set if a filename was correctly passed to the * application elst the z-flag is clear if it couldn't be done. -dolaunch .EQ *-ofsQ - lda sysentry does the app start with a jump ? - cmp #$4C - bne L616F no, doesn't follow the convention. - lda #$EE check for the signature bytes. - cmp sysentry+3 - bne L616F 1st one doesn't match, skip it. - cmp sysentry+4 - beq L6170 both match, go get a filename message. -L616F rts just return to launch the app. -L6170 lda #$FF put flag conditioning value on - pha the stack (assume error). - clc native 16-bit mode. - xce - LONG I,M - pha make room on stack for user id. - _MMStartUp start up the memory manager. - pla get the user id and - pha leave it on the stack. - pha - pha make room on stack for new handle. - pea $0000 - pea $000A get a 10 byte block of memory. - pha put user id on stack. - pea $0000 totally unrestricted block. - pha LocationPtr (not used) - pha - _NewHandle go get the block of memory. - pla get the handle from the stack. - plx - bcs L620A branch if error, no memory available. - phx leave the handle on the stack. - pha - pea $0002 'get' a message. - pea $0001 get a type 1 (filename) message. - phx put the message handle on the stack - pha (still in acc and x regs) - _MessageCenter - bcs L6203 branch if no message. - pha leave 4 bytes free on stack - pha (will be used as a direct page pointer) - tsc get the stack pointer. - phd save current direct register. - inc a point to new direct page space. - tcd make a new direct page. - lda [$04] de-reference the handle. - sta $00 - ldy #$0002 - lda [$04],y - sta $02 - ldy #$0006 get the message command. - lda [$00],y - bne bad_msg if print, then skip it. - lda $00 adjust pointer to filename string. - clc - adc #$0008 - sta $00 - bcc L61D1 - inc $02 -L61D1 lda [$00] get the length of the string. - and #$00FF mask off high (leaving just the length) - SHORT M 8 bit accumulator - cmp sysentry+5 check against length of app buffer. - beq L61DF if equal then continue with move. - bcs bad_msg if too long then bad message. -L61DF tay string length. -L61E0 lda [$00],y get a character. - sta sysentry+6,y store it in the app's filename buffer - sta inbuf,y and in prefix buffer. - dey - bpl L61E0 - lda #$00 change flag conditioning value on stack - sta $0D,s to indicate a filename is passed. -bad_msg LONG M 16-bit acc. - pld restore direct register. - pla fix stack because handle and userid - pla still on stack. - pea $0003 now delete the message (done with it). - pea $0001 message type 1. - pha garbage handle (not used). - pha - _MessageCenter go delete the message. -L6203 _DisposeHandle throw away message (handle is on stack) -L620A _MMShutDown shutdown the memory manager (userid is - sec on stack). - xce back to emulation mode. - LONGA OFF - pla condition z-flag with value on stack. - bne L6231 then done. - ldx inbuf get length of pathname. - lda #$2F look for slash. -L621B cmp inbuf,x - beq L6225 when found, set prefix. - dex - bne L621B - bra L6231 if no slash, just skip it. -L6225 dex don't include trailing slash. - stx inbuf set new length. - jsr MLI set the P8 prefix. - .DA #$C6' - .DA pfxparms' - lda #$00 set z-flag -L6231 rts and go launch the app. +dolaunch .EQ *-ofsQ + lda sysentry does the app start with a jump ? + cmp #$4C + bne L616F no, doesn't follow the convention. + lda #$EE check for the signature bytes. + cmp sysentry+3 + bne L616F 1st one doesn't match, skip it. + cmp sysentry+4 + beq L6170 both match, go get a filename message. +L616F rts just return to launch the app. +L6170 lda #$FF put flag conditioning value on + pha the stack (assume error). + clc native 16-bit mode. + xce + LONG I,M + pha make room on stack for user id. + _MMStartUp start up the memory manager. + pla get the user id and + pha leave it on the stack. + pha + pha make room on stack for new handle. + pea $0000 + pea $000A get a 10 byte block of memory. + pha put user id on stack. + pea $0000 totally unrestricted block. + pha LocationPtr (not used) + pha + _NewHandle go get the block of memory. + pla get the handle from the stack. + plx + bcs L620A branch if error, no memory available. + phx leave the handle on the stack. + pha + pea $0002 'get' a message. + pea $0001 get a type 1 (filename) message. + phx put the message handle on the stack + pha (still in acc and x regs) + _MessageCenter + bcs L6203 branch if no message. + pha leave 4 bytes free on stack + pha (will be used as a direct page pointer) + tsc get the stack pointer. + phd save current direct register. + inc a point to new direct page space. + tcd make a new direct page. + lda [$04] de-reference the handle. + sta $00 + ldy #$0002 + lda [$04],y + sta $02 + ldy #$0006 get the message command. + lda [$00],y + bne bad_msg if print, then skip it. + lda $00 adjust pointer to filename string. + clc + adc #$0008 + sta $00 + bcc L61D1 + inc $02 +L61D1 lda [$00] get the length of the string. + and #$00FF mask off high (leaving just the length) + SHORT M 8 bit accumulator + cmp sysentry+5 check against length of app buffer. + beq L61DF if equal then continue with move. + bcs bad_msg if too long then bad message. +L61DF tay string length. +L61E0 lda [$00],y get a character. + sta sysentry+6,y store it in the app's filename buffer + sta inbuf,y and in prefix buffer. + dey + bpl L61E0 + lda #$00 change flag conditioning value on stack + sta $0D,s to indicate a filename is passed. +bad_msg LONG M 16-bit acc. + pld restore direct register. + pla fix stack because handle and userid + pla still on stack. + pea $0003 now delete the message (done with it). + pea $0001 message type 1. + pha garbage handle (not used). + pha + _MessageCenter go delete the message. +L6203 _DisposeHandle throw away message (handle is on stack) +L620A _MMShutDown shutdown the memory manager (userid is + sec on stack). + xce back to emulation mode. + LONGA OFF + pla condition z-flag with value on stack. + bne L6231 then done. + ldx inbuf get length of pathname. + lda #$2F look for slash. +L621B cmp inbuf,x + beq L6225 when found, set prefix. + dex + bne L621B + bra L6231 if no slash, just skip it. +L6225 dex don't include trailing slash. + stx inbuf set new length. + jsr MLI set the P8 prefix. + .DA #$C6 + .DA pfxparms + lda #$00 set z-flag +L6231 rts and go launch the app. * check for disk volume * @@ -357,107 +360,107 @@ L6231 rts and go launch the app. * carry clear = disk was found * carry set = disk not found -ckfordrv .EQ *-ofsQ - clc native mode - xce - LONG I 16-bit regs, 8-bit acc. - ldx #sysentry+6 point to pathname buffer. - jsr copyvol copy volume name to pathname buffer. -L623C sec emulation mode. - xce - jsr MLI get info on the volume. - .DA #$C4' - .DA gfiparms' - bcc L6252 branch if volume found, - clc (native mode) - xce - LONG I,M - jsr mountvol else ask user to mount the volume. - bcc L623C if pressed, then try again. - sec emulation mode. - xce - sec disk not found. -L6252 rts +ckfordrv .EQ *-ofsQ + clc native mode + xce + LONG I 16-bit regs, 8-bit acc. + ldx #sysentry+6 point to pathname buffer. + jsr copyvol copy volume name to pathname buffer. +.1 sec emulation mode. + xce + jsr MLI get info on the volume. + .DA #$C4 + .DA gfiparms + bcc .2 branch if volume found, + clc (native mode) + xce + LONG I,M + jsr mountvol else ask user to mount the volume. + bcc .1 if pressed, then try again. + sec emulation mode. + xce + sec disk not found. +.2 rts * Prodos 8 parameter lists -pfxparms .EQ *-ofsQ set prefix parms. - .DA #01' one parm. - dc i2'inbuf' address of prefix. -opnparms .EQ *-ofsQ open parms. - dc h'03' 3 parms. - dc i2'PrefixBuf' pathname - dc i2'op_buf' i/o buffer -oprefnum .EQ *-ofsQ - dc h'00' reference # -eofparms .EQ *-ofsQ - .DA #02' 2 parms -eofrefn .EQ *-ofsQ - dc h'00' reference # -eofval .EQ *-ofsQ - dc h'000000' 3 byte eof value -readparm .EQ *-ofsQ - .DA #04' 4 parms -rdrefnum .EQ *-ofsQ - dc h'00' reference # - dc i2'sysentry' read into $2000 (bank 0). -rdcount .EQ *-ofsQ - dc h'0000' # of bytes to read. - dc h'0000' transfer count -closeprm .EQ *-ofsQ - dc h'01' 1 parm -closeref .EQ *-ofsQ - dc h'00' reference # -quitparms .EQ *-ofsQ - .DA #04' 4 parms. - dc h'00' quit back to launcher (GQuit) - dc h'0000' - dc h'00' - dc h'0000' -gfiparms .EQ *-ofsQ get file info parms. - .DA #0A' 10 parms - dc i2'volbuf' volume buffer - dc h'00' access - dc h'00' file type - dc h'0000' aux type - dc h'00' storage type - dc h'0000' blocks used - .DA #0000' modification date - dc h'0000' modification time - dc h'0000' creation date - .DA #0000' creation time +pfxparms .EQ *-ofsQ set prefix parms. + .DA #01 one parm. + .DA inbuf address of prefix. +opnparms .EQ *-ofsQ open parms. + .DA #3 3 parms. + .DA PrefixBuf pathname + .DA op_buf i/o buffer +oprefnum .EQ *-ofsQ + .HS 00 reference # +eofparms .EQ *-ofsQ + .DA #02 2 parms +eofrefn .EQ *-ofsQ + .HS 00 reference # +eofval .EQ *-ofsQ + .HS 000000 3 byte eof value +readparm .EQ *-ofsQ + .DA #04 4 parms +rdrefnum .EQ *-ofsQ + .HS 00 reference # + .DA sysentry read into $2000 (bank 0). +rdcount .EQ *-ofsQ + .HS 0000 # of bytes to read. + .HS 0000 transfer count +closeprm .EQ *-ofsQ + .DA #1 1 parm +closeref .EQ *-ofsQ + .HS 00 reference # +quitparms .EQ *-ofsQ + .DA #04 4 parms. + .HS 00 quit back to launcher (GQuit) + .HS 0000 + .HS 00 + .HS 0000 +gfiparms .EQ *-ofsQ get file info parms. + .DA #$0A 10 parms + .DA volbuf volume buffer + .DA #0 access + .DA #0 file type + .DA 0 aux type + .DA #0 storage type + .DA 0 blocks used + .DA 0 modification date + .DA 0 modification time + .DA 0 creation date + .DA 0 creation time * messages for P8 fatal error. maximum length of message is 35 characters. * the error code will be displayed immediately after the final character. -quitstr1 .EQ *-ofsQ - dc h'1B' - dc c'Can''t run next application.' -quitstr2 .EQ *-ofsQ - dc h'14' - dc c'ProDOS Error = $' -errval .EQ *-ofsQ hex error code gets stored here - dc c' ' -quitbtn2 .EQ *-ofsQ null string (no 2nd button) - dc h'00' +quitstr1 .EQ *-ofsQ + .DA #$1B + .AS "Can't run next application." +quitstr2 .EQ *-ofsQ + .DA #$14 + .AS "ProDOS Error = $" +errval .EQ *-ofsQ hex error code gets stored here + .AS " " +quitbtn2 .EQ *-ofsQ null string (no 2nd button) + .HS 00 * messages for P8 mount volume. maximum length of message is 35 characters. * the button labels must not be more than 16 characters. -mountmsg .EQ *-ofsQ - dc h'17' - dc c'Please insert the disk:' -button1 .EQ *-ofsQ - dc h'0D' - dc c'Accept: ' - .DA #1B' mousetext on - dc h'0F' inverse on - dc h'4D' mousetext return - dc h'0E' normal on - dc h'18' mousetext off -button2 .EQ *-ofsQ - dc h'0B' - dc c'Cancel: Esc' +mountmsg .EQ *-ofsQ + .DA #$17 + .AS "Please insert the disk:" +button1 .EQ *-ofsQ + .DA #$0D + .AS "Accept: " + .DA #$1B mousetext on + .DA #$0F inverse on + .DA #$4D mousetext return + .DA #$0E normal on + .DA #$18 mousetext off +button2 .EQ *-ofsQ + .DA #$0B + .AS "Cancel: Esc" * end of obj sel_2 (must be < GQdisp+$300) *-------------------------------------- diff --git a/ProDOS.203/ProDOS.S.TCLK.txt b/ProDOS.203/ProDOS.S.TCLK.txt index 90dd7626..ed09a5c0 100644 --- a/ProDOS.203/ProDOS.S.TCLK.txt +++ b/ProDOS.203/ProDOS.S.TCLK.txt @@ -6,83 +6,83 @@ NEW * $2F00-2F7C moved to $D742 -ofsT .EQ tclock_0-tclk_in offset to Thunderclock org +ofsT .EQ tclock_0-tclk_in offset to Thunderclock org -tclock_0 ldx clkslt clock slot = $C1. - lda clkmode,x save current mode - pha - lda #$A3 send numeric mode byte to Thunderclock - jsr wttcp -clkslt .EQ *-ofsT+2 points to $C1. - jsr rdtcp read month, day of week, day of month - clc and time into input buffer. - ldx #$04 index for 5 values. - ldy #$0C read minutes 1st, month last. -H2F14 lda inbuf,y convert values to binary. - and #$07 no value > 5 decimal. - sta pcl 'tens' place value - asl a multiply by 10 - asl a - adc pcl - asl a - adc inbuf+1,y add to ascii 'ones' place - sec and subtract out the ascii - sbc #$B0 - sta pcl,x save converted value. - dey index to next lowest value - dey - dey - dex are there more values? - bpl H2F14 if yes. - tay contains month - lsr a - ror a - ror a - ror a high bit of month held in carry - ora A1L - sta p8date save low value of date. - php save high bit of month. - and #$1F isolate day. - adc tdays-1,y (y = month) - bcc H2F42 branch if not Sept 13 thru 30th - adc #$03 adj for mod 7 when day > 256 -H2F42 sec -H2F43 sbc #$07 - bcs H2F43 loop until < 0. - adc #$07 make it in the range of 0-6. - sbc pch the delta provides years offset. - bcs H2F4F branch if positive - adc #$07 else make it positive again. -H2F4F tay - lda yradj,y look up year - plp and combine it with hi bit of month - rol a - sta p8date+1 P8 date - lda A1L+1 hour - sta p8time+1 P8 time - lda A2L minute - sta p8time - pla restore previous mode. - ldx clkslt clock slot = $C1 - sta clkmode,x -H2F69 rts +tclock_0 ldx clkslt clock slot = $C1. + lda clkmode,x save current mode + pha + lda #$A3 send numeric mode byte to Thunderclock + jsr wttcp +clkslt .EQ *-ofsT+2 points to $C1. + jsr rdtcp read month, day of week, day of month + clc and time into input buffer. + ldx #$04 index for 5 values. + ldy #$0C read minutes 1st, month last. +.1 lda inbuf,y convert values to binary. + and #$07 no value > 5 decimal. + sta pcl 'tens' place value + asl multiply by 10 + asl + adc pcl + asl + adc inbuf+1,y add to ascii 'ones' place + sec and subtract out the ascii + sbc #$B0 + sta pcl,x save converted value. + dey index to next lowest value + dey + dey + dex are there more values? + bpl .1 if yes. + tay contains month + lsr + ror + ror + ror high bit of month held in carry + ora A1L + sta p8date save low value of date. + php save high bit of month. + and #$1F isolate day. + adc tdays-1,y (y = month) + bcc .2 branch if not Sept 13 thru 30th + adc #$03 adj for mod 7 when day > 256 +.2 sec +.3 sbc #$07 + bcs .3 loop until < 0. + adc #$07 make it in the range of 0-6. + sbc pch the delta provides years offset. + bcs .4 branch if positive + adc #$07 else make it positive again. +.4 tay + lda yradj,y look up year + plp and combine it with hi bit of month + rol + sta p8date+1 P8 date + lda A1L+1 hour + sta p8time+1 P8 time + lda A2L minute + sta p8time + pla restore previous mode. + ldx clkslt clock slot = $C1 + sta clkmode,x +H2F69 rts * this table contains entries for the cumulative # of days in a year, * one entry for each month. the values are modulo 256. -tdays .EQ *-ofsT - .DA #00' January - dc h'1F' February - dc h'3B' March - dc h'5A' April - dc h'78' May - dc h'97' June - dc h'B5' July - dc h'D3' August - .DA #F2' September - dc h'14' October (MOD 256) - dc h'33' November - dc h'51' December +tdays .EQ *-ofsT + .DA #$00 January + .DA #$1F February + .DA #$3B March + .DA #$5A April + .DA #$78 May + .DA #$97 June + .DA #$B5 July + .DA #$D3 August + .DA #$F2 September + .DA #$14 October (MOD 256) + .DA #$33 November + .DA #$51 December * the following table is used to look up the current year, based on * the current month, day and day of week. The 1st entry corresponds @@ -90,16 +90,16 @@ tdays .EQ *-ofsT * is the year which January 1st is Sunday, and so on backwards thru * the days of the week. -yradj .EQ *-ofsT - dc h'60' Monday - dc h'5F' Sunday - dc h'5E' Saturday - dc h'5D' Friday - .DA #62' Thursday - dc h'61' Wednesday - dc h'60' Tuesday -tclk_end .EQ * end of obj tclock_0. - dc h'000000' pad +yradj .EQ *-ofsT + .DA #$60 Monday + .DA #$5F Sunday + .DA #$5E Saturday + .DA #$5D Friday + .DA #$62 Thursday + .DA #$61 Wednesday + .DA #$60 Tuesday +tclk_end .EQ * end of obj tclock_0. + .HS 000000 pad *-------------------------------------- MAN SAVE USR/SRC/PRODOS.203/PRODOS.S.TCLK diff --git a/ProDOS.203/ProDOS.S.XDOS.txt b/ProDOS.203/ProDOS.S.XDOS.txt index 7a2541df..70fbff6c 100644 --- a/ProDOS.203/ProDOS.S.XDOS.txt +++ b/ProDOS.203/ProDOS.S.XDOS.txt @@ -263,9 +263,9 @@ irqdev .EQ *-ofsX sta mslot slot being accessed. H31DD jmp irqexit do necessary bank switches and return. irqflag .EQ *-ofsX - .DA #00' 0 = old roms. 1 = new roms. + .HS 00 0 = old roms. 1 = new roms. irqcount .EQ *-ofsX - dc h'00' # of unclaimed interrupts. + .HS 00 # of unclaimed interrupts. svstack .EQ *-ofsX temporary save area from stack dc h'0000000000000000' .DA #0000000000000000' @@ -4022,8 +4022,8 @@ L4F3F lda buf-1,x from prodos parameters sp_vector .EQ *-ofsX smartport call jsr $0000 (entry address gets modified) cmdnum .EQ *-ofsX - dc h'00' command # - dc i2'statparms' + .HS 00 command # + .DA statparms' bcs L4F6E ldx cmdnum status call ? bne L4F6E no... @@ -4049,9 +4049,9 @@ spvecthi .EQ *-ofsX storage for high byte of smartport statparms .EQ *-ofsX # of parms (always 3 except format) dc h'03' sp_unitnum .EQ *-ofsX - .DA #00' unit number + .HS 00 unit number sp_bufptr .EQ *-ofsX - dc h'0000' data buffer + .HS 0000 data buffer dc h'000000' block number (3 bytes) * data tables @@ -4072,26 +4072,26 @@ pcntbl .EQ *-ofsX parameter counts for the calls * command table cmdtable .EQ *-ofsX - dc i2'create' create - dc i2'destroy' destroy + .DA create' create + .DA destroy' destroy .DA rename' rename - dc i2'setinfo' setinfo - dc i2'getinfo' getinfo - dc i2'online' online + .DA setinfo' setinfo + .DA getinfo' getinfo + .DA online' online .DA setprefx' set prefix - dc i2'getprefx' get prefix - dc i2'openf' open - dc i2'newline' newline + .DA getprefx' get prefix + .DA openf' open + .DA newline' newline .DA readf' read - dc i2'writef' write - dc i2'closef' close - dc i2'flushf' flush + .DA writef' write + .DA closef' close + .DA flushf' flush .DA setmark' set mark - dc i2'getmark' get mark - dc i2'seteof' seteof - dc i2'geteof' geteof + .DA getmark' get mark + .DA seteof' seteof + .DA geteof' geteof .DA setbuf' setbuf - dc i2'getbuf' getbuf + .DA getbuf' getbuf * corresponding command function bytes @@ -4109,7 +4109,7 @@ pass .EQ *-ofsX xdosver .EQ *-ofsX dc h'00' compat .EQ *-ofsX - dc h'00' + .HS 00 dc h'C3270D000000' rootstuf .EQ *-ofsX .DA #0F02000400000800' @@ -4132,63 +4132,63 @@ deathmsg .EQ *-ofsX * variables in the file control block and temporary directory. own_blk .EQ *-ofsX - .DA #0000' + .HS 0000 own_ent .EQ *-ofsX - dc h'00' + .HS 00 own_len .EQ *-ofsX - dc h'00' + .HS 00 h_credt .EQ *-ofsX - dc h'0000' directory creation date - dc h'0000' directory creation time - .DA #00' version under which this dir created - dc h'00' earliest version that it's compatible + .HS 0000 directory creation date + .HS 0000 directory creation time + .HS 00 version under which this dir created + .HS 00 earliest version that it's compatible h_attr .EQ *-ofsX attributes (protect bit, etc.) - dc h'00' + .HS 00 h_entln .EQ *-ofsX length of each entry in this directory - dc h'00' + .HS 00 h_maxent .EQ *-ofsX maximum number of entries per block - dc h'00' + .HS 00 h_fcnt .EQ *-ofsX current # of files in this directory - dc h'0000' + .HS 0000 h_bmap .EQ *-ofsX address of first allocation bitmap - .DA #0000' + .HS 0000 h_tblk .EQ *-ofsX total number of blocks on this unit - dc h'0000' + .HS 0000 d_dev .EQ *-ofsX device number of this directory entry - dc h'00' + .HS 00 d_head .EQ *-ofsX address of directory header - dc h'0000' + .HS 0000 d_entblk .EQ *-ofsX address of block which contains entry - dc h'0000' + .HS 0000 d_entnum .EQ *-ofsX entry number within block - .DA #00' + .HS 00 d_stor .EQ *-ofsX dc h'0000000000000000' file name dc h'0000000000000000' d_filid .EQ *-ofsX user's identification byte - .DA #00' + .HS 00 d_frst .EQ *-ofsX first block of file - dc h'0000' + .HS 0000 d_usage .EQ *-ofsX # of blocks allocated to this file - dc h'0000' + .HS 0000 d_eof .EQ *-ofsX current end of file marker dc h'000000' d_credt .EQ *-ofsX - .DA #0000' file creation date - dc h'0000' file creation time + .HS 0000 file creation date + .HS 0000 file creation time d_sosver .EQ *-ofsX sos version that created this file - dc h'00' + .HS 00 d_comp .EQ *-ofsX backward version compatibility - dc h'00' + .HS 00 d_attr .EQ *-ofsX attributes (protect, r/w, enable, etc.) - dc h'00' + .HS 00 d_auxid .EQ *-ofsX user auxilliary identification - .DA #0000' + .HS 0000 d_moddt .EQ *-ofsX - dc h'0000' file's last modification date - dc h'0000' file's last modification time + .HS 0000 file's last modification date + .HS 0000 file's last modification time d_dhdr .EQ *-ofsX file directory header block address - dc h'0000' + .HS 0000 scrtch .EQ *-ofsX scratch area for .DA #00000000' allocation address conversion. oldeof .EQ *-ofsX temp used in r/w @@ -4196,142 +4196,142 @@ oldeof .EQ *-ofsX temp used in r/w oldmark .EQ *-ofsX .DA #000000' xvcbptr .EQ *-ofsX used in 'cmpvcb' as a temp - dc h'00' + .HS 00 vcbptr .EQ *-ofsX - dc h'00' + .HS 00 fcbptr .EQ *-ofsX - dc h'00' + .HS 00 fcbflg .EQ *-ofsX - dc h'00' + .HS 00 reql .EQ *-ofsX - dc h'00' + .HS 00 reqh .EQ *-ofsX - dc h'00' + .HS 00 levels .EQ *-ofsX - .DA #00' + .HS 00 totent .EQ *-ofsX - dc h'00' + .HS 00 entcntl .EQ *-ofsX - dc h'00' + .HS 00 entcnth .EQ *-ofsX - dc h'00' + .HS 00 cntent .EQ *-ofsX - dc h'00' + .HS 00 nofree .EQ *-ofsX - dc h'00' + .HS 00 bmcnt .EQ *-ofsX - dc h'00' + .HS 00 saptr .EQ *-ofsX - dc h'00' + .HS 00 pathcnt .EQ *-ofsX - .DA #00' + .HS 00 p_dev .EQ *-ofsX - dc h'00' + .HS 00 p_blok .EQ *-ofsX - dc h'0000' + .HS 0000 bmptr .EQ *-ofsX - dc h'00' + .HS 00 basval .EQ *-ofsX - dc h'00' + .HS 00 half .EQ *-ofsX - dc h'00' + .HS 00 * bitmap info tables bmastat .EQ *-ofsX - dc h'00' + .HS 00 bmadev .EQ *-ofsX - .DA #00' + .HS 00 bmadadr .EQ *-ofsX - dc h'0000' + .HS 0000 bmacmap .EQ *-ofsX - dc h'00' + .HS 00 tposll .EQ *-ofsX - dc h'00' + .HS 00 tposlh .EQ *-ofsX - dc h'00' + .HS 00 tposhi .EQ *-ofsX - dc h'00' + .HS 00 rwreql .EQ *-ofsX - dc h'00' + .HS 00 rwreqh .EQ *-ofsX - .DA #00' + .HS 00 nlchar .EQ *-ofsX - dc h'00' + .HS 00 nlmask .EQ *-ofsX - dc h'00' + .HS 00 ioaccess .EQ *-ofsX has a call been made to - dc h'00' disk device handler ? + .HS 00 disk device handler ? cmdtemp .EQ *-ofsX - dc h'00' + .HS 00 bkbitflg .EQ *-ofsX used to set or clear backup bit - dc h'00' + .HS 00 duplflag .EQ *-ofsX - dc h'00' + .HS 00 vcbentry .EQ *-ofsX - dc h'00' + .HS 00 * xdos temporary variables namcnt .EQ *-ofsX - .DA #00' + .HS 00 rnptr .EQ *-ofsX - dc h'00' + .HS 00 namptr .EQ *-ofsX - dc h'00' + .HS 00 vnptr .EQ *-ofsX - dc h'00' + .HS 00 prfxflg .EQ *-ofsX - dc h'00' + .HS 00 cferr .EQ *-ofsX - dc h'00' + .HS 00 * deallocation temporary variables firstbl .EQ *-ofsX - dc h'00' + .HS 00 firstbh .EQ *-ofsX - dc h'00' + .HS 00 stortyp .EQ *-ofsX - .DA #00' + .HS 00 deblock .EQ *-ofsX - dc h'0000' + .HS 0000 dtree .EQ *-ofsX - dc h'00' + .HS 00 dsap .EQ *-ofsX - dc h'00' + .HS 00 dseed .EQ *-ofsX - dc h'0000' + .HS 0000 topdest .EQ *-ofsX - dc h'00' + .HS 00 dtmpx .EQ *-ofsX - dc h'00' + .HS 00 loklst .EQ *-ofsX look list of recognized device numbers dealbufl .EQ *-ofsX - dc h'0000000000000000' + .HS 0000000000000000 dealbufh .EQ *-ofsX - .DA #0000000000000000' + .HS 0000000000000000 cbytes .EQ *-ofsX - .DA #0000' - dc h'00' cbytes+2 must = 0 + .HS 0000 + .HS 00 cbytes+2 must = 0 bufaddrl .EQ *-ofsX - dc h'00' + .HS 00 bufaddrh .EQ *-ofsX - dc h'00' + .HS 00 goadr .EQ *-ofsX - dc h'0000' + .HS 0000 delflag .EQ *-ofsX used by 'detree' to know if called - .DA #00' from delete (destroy). + .HS 00 from delete (destroy). * zero fill to page boundary - 3 ($FEFD). so that cortland flag stays * within page boundary. - dc h'00000000000000' - dc h'0000000000' + .HS 00000000000000 + .HS 0000000000 - dc i2'calldisp' + .DA calldisp cortflag .EQ *-ofsX cortland flag. 1 = Cortland system - dc h'00' (must stay within page boundary) + .HS 00 (must stay within page boundary) * end of obj mli_2 *-------------------------------------- diff --git a/ProDOS.203/prodos.S - Copie.txt b/ProDOS.203/prodos.S - Copie.txt deleted file mode 100644 index 309e2934..00000000 --- a/ProDOS.203/prodos.S - Copie.txt +++ /dev/null @@ -1,225 +0,0 @@ - KEEP PRODOS - MCOPY PRODOS.MAC - -* disassembly of prodos version 2.0.3 -* can be compiled with the orca/m assembler -* which produces an output file PRODOS (type = EXE) -* address refs beginning with 'L' were generated by orca disassembler -* address refs beginning with 'H' were added manually - -* last edit: 01/24/13 - -* map of the object modules within prodos exe are as follows: - -* $2000 mli_0 mli loader/relocator -* $2C80 ram_1 installer for /RAM -* $2D00 ram_2 /RAM driver in main lc -* $2D9B mli_3 interrupts -* $2E00 mli_1 global page -* $2F00 tclock_0 Thunderclock driver -* $2F80 cclock_0 Cortland clock driver -* $3000 mli_2 xdos mli & block file manager -* $5100 ram_0 /RAM driver in aux mem -* $5300 xrw_0 disk core routines -* $5A00 sel_0 dispatcher -* $5D00 sel_1 enhanced quit code (Bird's Better Bye) -* $6000 sel_2 GQuit dispatcher support - -************************ IMPORTANT ************************ -* * -* 1. In the language card area, the $D000 areas overlay. To * -* determine which bank is active requires that the main bank * -* has a CLD ($D8) at $D000 and the alternate bank does not. * -* $D000 in ROM = $6F, LC bank1 = $D8, LC bank2 = $EE * -* * -* 2. Location $E000 is used to determine the state of ROM vs. * -* language card. Therefore, the value of $E000 in the MLI * -* and ROM must differ. * -* * -* 3. In the section MEMMGR, the routine CALLDISP must access * -* the other $D000 bank so it MUST reside ABOVE $E000 in the * -* language card area. * -* * -* 4. The Disk II routine xrwtot MUST reside on a page boundary * -* to distinguish it from a ram-based driver. * -* * -* 5. In the /RAM driver ram3, the byte at $FF58 MUST be an rts * -* ($60) so the routine JSR $FF58 to determine an I/O card's * -* slot still works when the language card is switched in. * -* * -***************************************************************** - -PRODOS START - -* Predefined labels: - -lookptr equ $0A -idapple equ $0C model machine id -idxl equ $10 general use 16 bit index pointer -devid equ $12 -src equ $12 -dst equ $14 -cnt equ $16 -cde equ $18 -ecde equ $1A -wndlft equ $20 -wndwdth equ $21 -wndtop equ $22 -wndbtm equ $23 -ch equ $24 cursor horizontal -cv equ $25 cursor vertical -invflg equ $32 inverse flag -pcl equ $3A -pch equ $3B -A1L equ $3C -A1H equ $3D -A2L equ $3E -A2H equ $3F -A3L equ $40 -A4L equ $42 -unitnum equ $43 -buf equ $44 2-byte data buffer pointer which -accsav equ $45 overlaps accsav (temp acc save byte) -bloknml equ $46 used mostly as 16 bit block # pointer -zpt equ $48 highly used zero page index pointer -datptr equ $4A ptr to data area of buffer. -sos equ $4C sos buffer pointer. -usrbuf equ $4E data ptr in user buffer. - -* zero page variables for Bird's Better Bye - -smparms equ $60 set mark parms -sm_refn equ $61 file reference number -fpos_lo equ $62 new file position (3 bytes) -fpos_mid equ $63 -fpos_hi equ $64 -lstpntr equ $65 device list pointer (16 bit) -valcnt equ $67 name counter -filecount equ $68 # of displayable files in directory -namelen equ $69 length of filename -gp_cnt equ $6A general purpose counter -dlevel equ $6B directory level -fnstore equ $6C filename storage pointer (16 bit) -entlen equ $6E directory entry length -entblk equ $6F directory entries/block -filecnt equ $70 directory file count (16 bit) -blkfl equ $72 block flag / file counter -topname equ $73 index # of top name in display -filetyps equ $74 128 byte table of filetypes - -errnum equ $DE -tst128 equ $0080 temp page 0 routine for memory test -auxsp equ $0101 -ramdest equ $0200 load address for aux bank /RAM driver -inbuf equ $0200 keyboard buffer -pbuf equ $0280 prefix buffer -p3vect equ $03F0 page 3 vectors (16 bytes) -softev equ $03F2 RESET vector -pwredup equ $03F4 power up byte -nmivect equ $03FB nmi handler -txtp2 equ $0400 test location for aux card -vline10 equ $04A8 line 10 of display -vmode equ $04FB video firmware operating mode -vline11 equ $0528 line 11 of display -clkmode equ $0538 clock mode -ch80col equ $057B 80 column ch position -vline12 equ $05A8 line 12 of display -vline5 equ $0600 line 5 of display -vline13 equ $0628 line 13 of display -vline14 equ $06A8 line 14 of display -vline23 equ $0750 line 23 of display -vline16 equ $07A8 line 16 of display -vline24 equ $07D0 line 24 of display -mslot equ $07F8 slot being accessed -lodintrp equ $0800 -dbuf equ $0C00 8 page directory buffer -vblock1 equ $0E00 ramdisk directory block -volbuf equ $0F00 volume buffer -dispadr equ $1000 system death dispatcher run address -iobuf equ $1400 i/o buffer -fbuf equ $1800 FCB buffer -op_buf equ $1C00 open file buffer (selector) -sysentry equ $2000 .SYS file load address -prodos8 equ $BF00 prodos MLI and global page -kbd equ $C000 keyboard latch (read) -store80off equ $C000 disable 80-col store (write) -store80on equ $C001 enable 80-col store -rdmainram equ $C002 read from main 48K -rdcardram equ $C003 read from alt 48K -wrmainram equ $C004 write to main 48K -wrcardram equ $C005 write to alt 48K -setstdzp equ $C008 use main zero page/stack -setaltzp equ $C009 use alt zero page/stack -int3rom equ $C00A enable internal slot 3 ROM -slot3rom equ $C00B enable external slot 3 ROM -clr80vid equ $C00C disable 80 col hardware -clraltchar equ $C00E normal LC, flashing UC -kbdstrobe equ $C010 turn off keypressed flag -rd80col equ $C018 if 80-column store -newvideo equ $C029 video mode select -spkr equ $C030 click speaker -txtset equ $C051 switch in text -txtpage1 equ $C054 switch in text page 1 -txtpage2 equ $C055 switch in text page 2 -statereg equ $C068 memory state register -phaseoff equ $C080 disk port -romin1 equ $C081 read ROM/write RAM bank 2 -romin equ $C082 read ROM -altram equ $C083 read/write RAM bank 2 -motoroff equ $C088 disk port -motoron equ $C089 disk port -drv0en equ $C08A disk port -ramin equ $C08B read/write RAM bank 1 -q6l equ $C08C disk port -q6h equ $C08D disk port -q7l equ $C08E disk port -q7h equ $C08F disk port -rdtcp equ $C108 Thunderclock read entry -wttcp equ $C10B Thunderclock write entry -init80 equ $C300 init 80 col card -slot3id1 equ $C305 slot 3 card id 1 -slot3id2 equ $C307 slot 3 card id 2 -slot3id3 equ $C30B slot 3 card id 3 -ext80col equ $C30C slot 3 80 col id -auxmove equ $C311 move (3C)-(3E) to (42) -xfer equ $C314 -slot3irq equ $C3FA slot 3 irq handler -clrrom equ $CFFF switch out $C8 ROMs -rwts equ $D000 disk ii driver in bank 1 -displc2 equ $D100 system death routine stored in bank 2 -pathbuf equ $D700 pathname buffer -tclk_in equ $D742 clock driver in bank 2 -fcbbuf equ $D800 fcb buffer -vcbbuf equ $D900 vcb buffer -bmbuf equ $DA00 512 byte bitmap buffer -gbuf equ $DC00 general purpose 512 byte block buffer -xdosorg equ $DE00 xdos MLI in aux memory -romirq equ $FA41 monitor irq entry -breakv equ $FA59 monitor break vector -resetv equ $FA62 monitor reset entry -HFB1E equ $FB1E version check byte -init equ $FB2F init text screen -settxt equ $FB39 set text mode -tabv equ $FB5B set vertical position -setpwrc equ $FB6F create power-up byte -version equ $FBB3 monitor ROM id byte -zidbyte equ $FBC0 monitor ROM id byte -bell1 equ $FBDD generate bell tone -home equ $FC58 home cursor and clear screen -clreol equ $FC9C clear to end of line -rdkey equ $FD0C input char with cursor -crout equ $FD8E issue carriage return -cout equ $FDED output character -idroutine equ $FE1F returns system info -setinv equ $FE80 set inverse text mode -setnorm equ $FE84 set normal text mode -setkbd equ $FE89 reset input to keyboard -setvid equ $FE93 reset output to screen -lcdest equ $FF00 load address -bell equ $FF3A output bell (ctl-G) -oldrst equ $FF59 monitor reset entry -* romrts equ $FFCB an rts location that must be in ROM -P8QUIT equ $E0D000 -GSOS equ $E100A8 -GSOS2 equ $E100B0 -OS_BOOT equ $E100BD indicates O/S initially booted