diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 5c7fc284..c99d5675 100644 Binary files a/.Floppies/A2OSX.BUILD.po and b/.Floppies/A2OSX.BUILD.po differ 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