NEW AUTO 3,1 *-------------------------------------- .MA DEBUG :1 bit $C000 bpl :1 sta $C010 .EM *-------------------------------------- .MA DEBUGOA bit $C061 bpl :1 >DEBUG :1 .EQ * .EM *-------------------------------------- H2000 jmp prostart jmp atalkset jmp p16start *-------------------------------------- LDR.MSG.PRODOS .AT "PRODOS FX 0.94" LDR.MSG.UNSUPP .AT "UNSUPPORTED HARDWARE" LDR.MSG.IIe .AT "//e" LDR.MSG.IIc .AT "//c" LDR.MSG.IIgs .AT "IIgs" LDR.MSG.Unknown .AT "Unknown" LDR.MSG.CLK .AT "?Clk" LDR.MSG.RAM .AT "/RAM" LDR.MSG.PFXERR .AT "ERR setting prefix" *-------------------------------------- p16start inc LDR.BootFlag set = 2 for GQuit rts atalkset inc LDR.BootFlag set = 1 for appletalk rts prostart lda unitnum sta LDR.MLIOL.P+1 cld bit RROMBNK2 sta CLR80DISP sta CLR80STORE jsr init jsr setvid jsr setkbd jsr home lda #32 ldx #39 .1 sta $400,x dex bpl .1 ldx #LDR.MSG.PRODOS jsr LDR.PrintX sec jsr idroutine returns system info bcs .2 taken if not a //gs lda #$80 trb newvideo video mode select * test for at least a 65c02 .2 sed lda #$99 clc adc #$01 cld bmi LDR.UNSUPP.HW stz auxsp sta SETALTZP stz auxsp lda auxsp bne LDR.UNSUPP.HW dec auxsp init aux sp to $FF lda auxsp beq LDR.UNSUPP.HW sta CLRALTZP lda auxsp bne LDR.UNSUPP.HW NO 128k LDR.CheckROM ldx #LDR.MSG.IIE lda #MACHID.T.IIe+MACHID.M.128+MACHID.COL80 ldy version check hardware id cpy #$06 apple //e? beq .1 if yes cpy #$EA apple //+ or ///? beq LDR.UNSUPP.HW ldx #LDR.MSG.UNKNOWN bra m128k machine is unknown, Assume //e Enh 128k .1 ldy zidbyte //c ? bne .2 ldy kbd //c, check for keypress cpy #$9B escape? (to disable accelerator) bne .11 sta KBDSTROBE clear keyboard .11 lda #MACHID.T.IIc+MACHID.M.128+MACHID.COL80 ldx #LDR.MSG.IIC bra m128k .2 cpy #$EA beq LDR.UNSUPP.HW //e UNenh.... cpy #$E0 beq .3 ldx #LDR.MSG.UNKNOWN bra m128k not a //e Enh.... .3 sec jsr idroutine //gs ???? bcs m128k no..... inc LDR.cortland ldx #LDR.MSG.IIGS lda #MACHID.T.IIe+MACHID.M.128+MACHID.COL80+MACHID.CLK bra m128k LDR.UNSUPP.HW ldx #LDR.MSG.UNSUPP jsr LDR.PrintX bne * no BRA !!! (6502) *-------------------------------------- m128k sta idapple Save MACHID in temp location lda #$20 "PRODOS" -> "ProDOS" tsb LDR.MSG.PRODOS+1 tsb LDR.MSG.PRODOS+2 jsr LDR.Scr80Init X = LDR.MSG.machine type ldx #$F .2 lda LDR.3F0,x sta $3F0,x dex bpl .2 lda #$01 patch for the gs rom trb statereg to force off intcxrom ldx #PAKME.GP-PAKME.Table ldy #MLI lda /MLI jsr X.Unpak.XatYA jsr LDR.LCBNK1 ldx #PAKME.XRW-PAKME.Table ldy #$D000 lda /$D000 jsr X.Unpak.XatYA ldx #0 .1 stz FCBs,x stz VCBs,x inx bne .1 ldx #PAKME.XDOS-PAKME.Table ldy #$DE00 lda /$DE00 jsr X.Unpak.XatYA ldx #XDOS.DATA.LEN .3 stz XDOS.DATA-1,x dex bne .3 ldx #PAKME.IRQ-PAKME.Table ldy #$FF9B lda /$FF9B jsr X.Unpak.XatYA LDR.IRQ lda RROMWRAMBNK2 ldy irqv interrupt vector ldx irqv+1 x = high byte jsr LDR.LCBNK1 sta SETALTZP sty irqv save irq vector in aux lc stx irqv+1 sta CLRALTZP sty irqv stx irqv+1 save irq vector in main lc lda #calldisp sta jspare+1 P8 system death vector lda /calldisp sta jspare+2 .DO LOWERCASE=0 lda kversion sta xdosver save current version for dir use .FIN lda idapple sta MACHID lda LDR.cortland beq LDR.II branch if // family *-------------------------------------- LDR.IIGS sta cortflag lda #calldisp sta cortdisp lda /calldisp sta cortdisp+1 * lda RROMWRAMBNK2 * stz vmode force setvid to reset cursor * jsr setvid reset output to screen * jsr LDR.LCBNK1 lda #'C' ldx PAKME.CCLK ldy PAKME.CCLK+1 jsr LDR.SetupCLK * ldx #PAKME.SEL2-PAKME.Table * ldy #$1000 * lda /$1000 * jsr X.Unpak.XatYA ldx #PAKME.SEL2-PAKME.Table jsr LDR.SetupQC *-------------------------------------- lda LDR.BootFlag bne .1 branch if prodos 8 alone * running from gs/os shell so zero out os_boot for appletalk sta OS_BOOT indicates O/S initially booted. jsr patch101 patch for gs/os - rev note #101 .1 bra LDR.Common *-------------------------------------- LDR.II ldx #PAKME.SEL1-PAKME.Table jsr LDR.SetupQC jsr LDR.ClkDevScan *-------------------------------------- LDR.Common jsr LDR.BlkDevScan jsr LDR.SetupRAM *-------------------------------------- lda LDR.MLIOL.P+1 Boot unitnum sta DEVNUM ldx DEVCNT .1 lda DEVLST,x eor DEVNUM and #$f0 beq .2 dex bpl .1 brk .2 lda DEVLST,x pha .3 lda DEVLST+1,x sta DEVLST,x cpx DEVCNT inx bcc .3 pla ldx DEVCNT sta DEVLST,x lda LDR.BootFlag get setup entry point flag beq LDR.SetPrefix taken if normal boot. bit RROMBNK2 rts return to caller at setup entry point. *-------------------------------------- LDR.SetPrefix jsr MLI .DA #MLIONLINE .DA LDR.MLIOL.P bcs .9 lda pbuf+1 get volume name length. and #$0F strip SDDDxxxx beq .9 inc add 1 for leading '/' sta pbuf save prefix length. lda #'/' place leading '/' in prefix buffer sta pbuf+1 jsr MLI .DA #MLISETPREFIX .DA LDR.MLISETP.P bcs .9 jsr CROUT ldx #PAKME.ILDR-PAKME.Table ldy #ILDR.START lda /ILDR.START jsr X.Unpak.XatYA jmp ILDR.START .9 ldx #LDR.MSG.PFXERR jsr LDR.PrintX bra * *-------------------------------------- LDR.SetupQC bit RRAMWRAMBNK2 read/write RAM bank 2 bit RRAMWRAMBNK2 ldy #$D100 lda /$D100 jsr X.Unpak.XatYA lda #$EE byte to distinguish LC bank 2 sta $D000 *-------------------------------------- LDR.LCBNK1 lda RRAMWRAMBNK1 switch in LC bank 1 lda RRAMWRAMBNK1 rts *-------------------------------------- DS121x.DATA1 .EQ idxl DS121x.DATA2 .EQ A1L *-------------------------------------- LDR.ClkDevScan jsr LDR.IsIIc bcc LDR.ClkDevNCLK //c only LDR.ClkDevDCLK php sei lda $CFFF lda $C400 ldx #8 stz $C0C0 stz $C0C1 stx $C0C2 lda $C0C3 pha .1 lda DS121x.SIG-1,x ldy #8 .2 sta $C0C3 stz $C0C0 lsr dey bne .2 dex bne .1 ldx #8 .4 ldy #8 stz $C0C0 .5 lda $C0C3 lsr ror DS121x.DATA1-1,x dey bne .5 dex bne .4 stz $C0C0 pla sta $C0C3 plp sed ldx #DS121x.ValidHI-DS121x.ValidLO .6 lda DS121x.DATA1-1,x cmp DS121x.ValidLO-1,x bcc .9 cmp DS121x.ValidHI-1,x bcc .7 bne .9 .7 dex bne .6 cld lda #'D' ldx PAKME.DCLK ldy PAKME.DCLK+1 jmp LDR.SetupCLK .9 cld *-------------------------------------- LDR.ClkDevNCLK php sei lda RDCXROM php sta SETCXROM sta NSC.IOBASE * lda $C00B Workaround for Ultrawarp bug ldx #8 .1 ldy #8 .2 lda NSC.IOBASE+4 lsr ror DS121x.DATA1-1,x dey bne .2 dex bne .1 *-------------------------------------- sta NSC.IOBASE * lda $C00B Workaround for Ultrawarp bug lda NSC.IOBASE+4 Reset DS1216E comparison register with READ A2=1 ldy #8 Read 8 bytes... .3 lda DS121x.SIG-1,y phy ldy #8 ....of 8 bits .4 ldx #0 lsr bcc .5 inx .5 bit NSC.IOBASE,x Write Pattern bit in A0, with A2=0 dey bne .4 ply dey bne .3 *-------------------------------------- ldx #8 .6 ldy #8 .7 lda NSC.IOBASE+4 lsr ror DS121x.DATA2-1,x dey bne .7 dex bne .6 plp bmi .8 sta CLRCXROM .8 plp *-------------------------------------- ldx #8 .9 lda DS121x.DATA1-1,x cmp DS121x.DATA2-1,x bne .90 dex bne .9 bra LDR.ClkDevTCLK .90 lda #'N' ldx PAKME.NCLK ldy PAKME.NCLK+1 bra LDR.SetupCLK *-------------------------------------- LDR.ClkDevTCLK jsr LDR.IsIIc bcs LDR.ClkDevXCLK stz idxl lda #$C1 sta idxl+1 lda #1 sta LDR.SlotIdx .1 jsr LDR.CheckTClkID bcs .7 stz $478,x stz $7f8,x lda idxl+1 asl asl asl asl tax stz $c080,x lda $c088,x lda $c080,x lda #'T' ldx PAKME.TCLK ldy PAKME.TCLK+1 jsr LDR.SetupCLK lda idxl+1 sta TCLK.Cx1+2 sta TCLK.Cx2+2 rts .7 inc LDR.SlotIdx inc idxl+1 lda idxl+1 cmp #$C8 bne .1 *-------------------------------------- LDR.ClkDevXCLK bit RROMBNK2 sta $C070 bit $FACA bit $FACA bit $FAFE lda $DFFE cmp #$4A bne .9 lda $DFFF cmp #$CD beq .1 .9 bit $F851 rts .1 bit $F851 lda #'X' ldx PAKME.XCLK ldy PAKME.XCLK+1 *-------------------------------------- LDR.SetupCLK stx ZPInBufPtr sty ZPInBufPtr+1 sta LDR.MSG.CLK ldx #LDR.MSG.CLK jsr LDR.PrintX jsr LDR.LCBNK1 lda #$D742 sta ZPOutBufPtr lda /$D742 sta ZPOutBufPtr+1 jsr X.Unpak lda #$4C enable clock routine by putting a jmp sta clockv in front of clock vector lda #MACHID.CLK tsb MACHID LDR.SetupCLK.RTS rts *-------------------------------------- LDR.SetupRAM lda DEVCNT cmp #13 bcs LDR.SetupCLK.RTS jsr LDR.LCBNK1 ldx #PAKME.RAM-PAKME.Table ldy #$FF00 lda /$FF00 jsr X.Unpak.XatYA lda RAMX.PAK bne .1 sta SETWRITEAUX ldx #PAKME.RAMX-PAKME.Table ldy #$0200 lda /$0200 jsr X.Unpak.XatYA bra .7 .1 ldx #PAKME.RAMX-PAKME.Table ldy #$0800 lda /$0800 jsr X.Unpak.XatYA sta SETWRITEAUX ldx #$FE .2 lda $900,x sta $300,x dex txa bne .2 .3 lda $800,x sta $200,x inx bne .3 .7 sta CLRWRITEAUX lda #RAMDRV put driver address into sta DEVPTRS3D2 lda /RAMDRV sta DEVPTRS3D2+1 inc DEVCNT count (-1) active devices ldx DEVCNT lda #$BF unit num of /RAM sta DEVLST,x ldx #LDR.MSG.RAM jmp LDR.PrintX *-------------------------------------- * find all disk devices in system slots and set up address * and device table in prodos global page. *-------------------------------------- LDR.BlkDevScan bit RROMBNK2 write protect lc ram. stz idxl lda #$C7 search slots from high to low sta idxl+1 lda #7 sta LDR.SlotIdx .1 ldx LDR.SlotIdx stz LDR.SlotDevType-1,x jsr LDR.CheckDiskID bcs .4 if no ProDOS device in this slot. ldy #$ff lda (idxl),y check last byte of $Cn rom (y = $ff) bne .2 branch if 16 sector disk II. sta devid =0 since disk ii's have null attributes lda #XRW.START sta LDR.driveradr lda /XRW.START sta LDR.driveradr+1 sec 2 devices jsr LDR.AddBlkDevs bra .4 .2 cmp #$FF if = $FF then 13 sector disk II. beq .4 ignore if 13 sector boot ROM ldy #$07 check for a smartport device. lda (idxl),y bne .3 no smartport jsr LDR.AddSPDevs bra .4 .3 ldy #$FE BLK device... lda (idxl),y get attributes. and #$03 verify it provides read and status calls. cmp #$03 bne .4 assume it's an off-brand disk jsr LDR.SetDevID and #$3 Device count minus 1 inc ldx LDR.SlotIdx sta LDR.SlotDevCnt-1,x dec LDR.SlotDevType-1,x set as BlockDeb tax iny $CnFF lda (idxl),y sta LDR.driveradr lda idxl+1 store hi entry addr (low already done) sta LDR.driveradr+1 cpx #2 CS if 2 devs or more jsr LDR.AddBlkDevs install 1 or 2 devices from this slot. .4 dec idxl+1 next lower slot. dec LDR.SlotIdx have all slots been checked ? bne .1 *-------------------------------------- * stz idxl lda #$C7 sta idxl+1 lda #7 sta LDR.SlotIdx .5 ldx LDR.SlotIdx lda LDR.SlotDevType-1,x beq .8 lda LDR.SlotDevCnt-1,x cmp #3 bcc .8 bit LDR.SlotDevType-1,x bpl .6 type = smartport jsr LDR.AddExtraBLKDevs bra .8 .6 jsr LDR.AddExtraSPDevs .8 dec idxl+1 dec LDR.SlotIdx bne .5 LDR.AddExtraDevs.RTS rts *-------------------------------------- LDR.AddSPDevs jsr LDR.SetDevID setup the devid byte from attributes iny #$ff lda (idxl),y sta LDR.driveradr sta .1+1 modify operand clc adc #$03 sta LDR.SPVect+1 lda idxl+1 sta LDR.driveradr+1 sta LDR.SPVect+2 sta .1+2 modify operand asl convert $Cn to $n0 asl asl asl sta unitnum unit number stz A4L force a prodos status call stz buf dummy pointer lda #$10 sta buf+1 dummy pointer should be <> 0 stz bloknml # of bytes to transfer stz bloknml+1 .1 jsr $0000 SELF MODIFIED ldy #$FB lda (idxl),y check device id and #$02 SCSI ? beq .2 no, no need to init Cocoon jsr LDR.SPStatusCall status of Cocoon : A = device = 2 for SCSI lda #0 set unit# = 0 .2 jsr LDR.SPStatusCall lda LDR.SPStatusBuf Device count beq LDR.AddExtraDevs.RTS no devices, so done. sta LDR.DevCnt ldx LDR.SlotIdx inc LDR.SlotDevType-1,x set as smartport .3 inc LDR.SPStatus.U jsr LDR.SPStatusCall.U call to get the device status bcs .7 lda LDR.SPStatusBuf bpl .7 not a block device ldx LDR.SlotIdx inc LDR.SlotDevCnt-1,x .7 dec LDR.DevCnt bne .3 ldx LDR.SlotIdx lda LDR.SlotDevCnt-1,x beq LDR.AddBlkDevs.RTS sta LDR.SlotDevCnt-1,x cmp #2 CC/CS, add 1 or 2 devs *-------------------------------------- LDR.AddBlkDevs php how many drives (carry). lda idxl+1 get index to global device table and #$07 for this slot... asl tay into y reg. asl asl now form device # = slot # asl in high nibble. ora devid combine with attributes. ldx DEVCNT inx put device # into device list. sta DEVLST,x asl now form drive 2 device number, if any. plp restore # of devices in carry. ror if 2 drives, then bit 7=1. bpl .1 branch if a 1 drive device (e.g. hard drive) inx else presume that 2nd drive is present. sta DEVLST,x active device list. .1 stx DEVCNT save updated device count. asl shift # of drives back into carry. lda LDR.driveradr get high address of device driver. sta DEVPTRS,y device driver table 1. bcc .2 branch if single drive. sta DEVPTRS+16,y device driver table 2. .2 lda LDR.driveradr+1 sta DEVPTRS+1,y bcc .3 sta DEVPTRS+17,y .3 LDR.AddBlkDevs.RTS rts *-------------------------------------- LDR.AddExtraBLKDevs dec dec sta LDR.DevCnt jsr LDR.SetDevID set up device attributes jsr LDR.FindFreeDevPtr bcs .9 .1 cpy #$10 bcc .2 must be Drive 1 .10 jsr LDR.FindFreeDevPtrNext bcc .1 rts .2 lda LDR.DevCnt dec beq .4 only one to add tya ora #$10 tay lda DEVPTRS,y device driver table 1 cmp #nodevice bne .10 lda DEVPTRS+1,y cmp /nodevice bne .10 Drive 1 & 2 free jsr LDR.AddY2DEVLST Y = index in DEVPTRS jsr .8 tya and #$F tay .4 jsr LDR.AddY2DEVLST Y = index in DEVPTRS .8 phy ldy #$ff lda (idxl),y BLK entry point ply sta DEVPTRS,y lda idxl+1 sta DEVPTRS+1,y * clc .9 rts *-------------------------------------- LDR.AddExtraSPDevs jsr LDR.SetDevID set up device attributes iny ldy #$fe from SetDevID * ldy #$FF lda (idxl),y clc adc #$03 add 3 for smartport call sta LDR.SPVect+1 lda idxl+1 sta LDR.SPVect+2 lda #0 jsr LDR.SPStatusCall do a status call on smartport itself lda LDR.SPStatusBuf # of devices on smartport cmp #$03 bcc .8 only 2 devices,skip to next one. dec dec sta LDR.DevCnt lda #3 sta LDR.SPStatus.U .1 jsr LDR.SPStatusCall.U do status call lda LDR.SPStatusBuf is this a block device? bpl .2 jsr LDR.FindFreeDevPtr bcs .8 jsr LDR.LCBNK1 tya divide index by 2 lsr tax lda LDR.SPStatus.U sta XDOS.SPUnit-1,x store the smartport unit # lda LDR.SPVect+1 and entry address. sta XDOS.SPVectLo-1,x lda LDR.SPVect+2 sta XDOS.SPVectHi-1,x bit RROMBNK2 write protect lc ram. jsr LDR.AddY2DEVLST lda #XDOS.SPREMAP sta DEVPTRS,y lda /XDOS.SPREMAP sta DEVPTRS+1,y .2 inc LDR.SPStatus.U dec LDR.DevCnt bne .1 .8 rts *-------------------------------------- LDR.SPStatusCall sta LDR.SPStatus.U LDR.SPStatusCall.U LDR.SPVect jsr $0000 self modifying .HS 00 .DA LDR.SPStatus.P rts *-------------------------------------- LDR.CheckTClkID ldy #6 .HS 2C BIT ABS LDR.CheckDiskID ldy #5 lda CLRC8ROM switch out $C8 ROMs .1 lda (idxl),y compare id bytes cmp dskid,y bne .3 dey dey bpl .1 loop until all 4 id bytes match. clc php .8 ldx LDR.SlotIdx lda sltbit-1,x tsb rommap mark bit to flag rom present .9 plp rts .3 sec php ldx #0 .4 cmp (idxl),y bne .9 inx bne .4 bra .8 *-------------------------------------- LDR.FindFreeDevPtr ldx #LDR.DEVPTRS.CNT-1 LDR.FindFreeDevPtrNext .1 ldy LDR.DEVPTRS.IDX,x lda DEVPTRS,y device driver table 1 cmp #nodevice bne .2 lda DEVPTRS+1,y cmp /nodevice beq .8 .2 dex bpl .1 sec rts .8 clc rts *-------------------------------------- LDR.SetDevID ldy #$FE check attributes byte. lda (idxl),y lsr move hi nibble to lo nibble for lsr device table entries. lsr lsr sta devid rts *-------------------------------------- LDR.AddY2DEVLST inc DEVCNT ldx DEVCNT tya asl convert to DSSS0000 asl asl ora devid include device attributes sta DEVLST,x in the active device list. rts *-------------------------------------- LDR.Scr80Init phx Save LDR.MSG jsr LDR.IsIIc bcs LDR.Scr80Init2 php sei sta SETC3ROM ldx #COL80IDX.Cnt-1 .1 ldy COL80IDX,x lda $C300,y cmp COL80VAL,x bne .2 dex bpl .1 lda $C30C is it an apple 80 col compatible card? and #$F0 cmp #$80 beq .3 .2 sta CLRC3ROM .3 plp *-------------------------------------- LDR.Scr80Init2 lda #$8C Reset 80 col screen ($0C:HOME) jsr $C300 jsr setnorm jsr home jsr SETINV .DO LOGO lda #20 sta CV inc sta WNDTOP jsr VTAB lda #LOGO.PAKED sta ZPInBufPtr lda /LOGO.PAKED sta ZPInBufPtr+1 stz ZPOutBufPtr lda #$A0 sta ZPOutBufPtr+1 jsr X.Unpak sta CLRHIRES sta SETMIXED bit RDIOUDIS sta SETIOUDIS sta SETDHIRES bmi .10 sta CLRIOUDIS .10 sta CLRTEXT stz ZPPtr1 lda #$A0 sta ZPPtr1+1 lda #0 .1 pha jsr GBSCALC ldy #0 .2 lda (ZPPtr1),y pha and #$f tax lda PALETTE.AUX,x sta SETPAGE2 sta (GBASL),y pla lsr lsr lsr lsr tax lda PALETTE.MAIN,x sta CLRPAGE2 sta (GBASL),y iny cpy #40 bne .2 lda ZPPtr1 clc adc #40 sta ZPPtr1 bcc .3 inc ZPPtr1+1 .3 ldy #0 .4 lda (ZPPtr1),y pha and #$f tax lda PALETTE.AUX,x asl asl asl asl sta SETPAGE2 ora (GBASL),y sta (GBASL),y pla lsr lsr lsr lsr tax lda PALETTE.MAIN,x asl asl asl asl sta CLRPAGE2 ora (GBASL),y sta (GBASL),y iny cpy #40 bne .4 lda ZPPtr1 clc adc #40 sta ZPPtr1 bcc .7 inc ZPPtr1+1 .7 pla inc cmp #20 bne .1 .FIN jsr CLREOL jsr setnorm ldx #LDR.MSG.PRODOS jsr LDR.PrintX plx get back LDR.MSG.machine type *-------------------------------------- LDR.PrintX bit RROMBNK2 lda INVFLG pha jsr SETINV .1 lda $2000,x pha ora #$80 jsr COUT inx pla bpl .1 lda #$A0 jsr COUT pla sta INVFLG sta CLRPAGE2 for screen holes proper access rts *-------------------------------------- LDR.IsIIc lda MACHID and #MACHID.T cmp #MACHID.T.IIc beq .9 clc .9 rts *-------------------------------------- PALETTE.MAIN .HS 00.02.04.06.08.0A.0C.0E .HS 01.03.05.07.09.0B.0D.0F PALETTE.AUX .HS 00.01.02.03.04.05.06.07 .HS 08.09.0A.0B.0C.0D.0E.0F *-------------------------------------- * 16 bytes moved to $03F0 vectors *-------------------------------------- LDR.3F0 .DA breakv .DA oldrst .DA #$5A powerup byte jmp oldrst '&' vector jmp oldrst ctrl-y vector .HS 004000 .DA GP.IRQV global page interrupt vector *-------------------------------------- * patch to gsos vectors so error is returned for os calls - rev note #101 *-------------------------------------- patch101 php sei disable interrupts clc xce full native mode >LONGMX phb save DBR pha pha pea $0000 length of patch pea $0010 0000/0010 = 16 bytes pea $3101 user id for prodos 8 pea $8018 attributes (locked/nospec/nocross) pha pha >IIGS NewHandle lda $01,s retrieve handle tax lda $03,s tay pea $0000 copy the code into the handle pea L2C4D phy phx pea $0000 length of patch = 0000/0010 pea $0010 >IIGS PtrToHand plx low word of handle plb set DBR to handle's bank lda >1,x get upper 16 bits of 24 bit address tay save in y lda >0,x get low 8 bits of address and ##$00FF clear high byte xba put address in high byte ora ##$005C include JML opcode sta GSOS2 store in gsos vectors clc adc ##$000B sta GSOS tya store upper 16 bits too sta GSOS2+2 adc ##$0000 adj for possible page crossing sta GSOS+2 plb remove garbage byte from stack plb restore DBR. sec xce back to emulation mode plp rts *-------------------------------------- * copy of the code that goes in the handle *-------------------------------------- L2C4D lda 1,s sta 7,s lda 2,s sta 8,s pla pla pla lda ##$00FF #NoOS sec rtl *-------------------------------------- DS121x.SIG .HS 5CA33AC55CA33AC5 Reverted 7->0 DS121x.ValidLO .HS 00010101 Y,M,D,DoW DS121x.ValidHI .HS 990C1F07 *-------------------------------------- * id bytes: evens for clock, odds for disk dskid .HS 08.20.28.00.58.03.70 sltbit .HS 02040810204080 *-------------------------------------- COL80IDX .HS 05070BFA + $C30C and $80 = $80 COL80IDX.Cnt .EQ *-COL80IDX COL80VAL .HS 3818012C *-------------------------------------- LDR.MLIOL.P .DA #2 .DA #$60 .DA pbuf+1 LDR.MLISETP.P .DA #1 .DA pbuf LDR.SPStatus.P .DA #$03 # of parms LDR.SPStatus.U .DA #$00 unit number (code for smartport stat) .DA LDR.SPStatusBuf .DA #00 status code (0 = general status) LDR.DEVPTRS.CNT .EQ 14 LDR.DEVPTRS.IDX .DA #$16 S3D2 /RAM .DA #$06 S3D1 .DA #$12 S1D2 .DA #$02 S1D1 .DA #$14 S2D2 .DA #$04 S2D1 .DA #$18 S4D2 .DA #$08 S4D1 .DA #$1A S5D2 .DA #$0A S5D1 .DA #$1C S6D2 .DA #$0C S6D1 .DA #$1E S7D2 .DA #$0E S7D1 *-------------------------------------- LDR.cortland .DA #0 cortland loader flag (1 = Cortland) LDR.BootFlag .DA #0 0 = normal boot, <>0 = return *-------------------------------------- LDR.SPStatusBuf .BS 8 8 bytes for smartport call LDR.driveradr .BS 2 LDR.SlotIdx .BS 1 LDR.DevCnt .BS 1 LDR.SlotDevType .BS 7 LDR.SlotDevCnt .BS 7 *-------------------------------------- MAN SAVE usr/src/prodos.fx/prodos.s.ldr LOAD usr/src/prodos.fx/prodos.s ASM