NEW AUTO 3,1 *-------------------------------------- idapple .EQ $0C model machine id idxl .EQ $10 general use 16 bit index pointer *-------------------------------------- auxsp .EQ $0101 *-------------------------------------- LDR.PBuf .EQ $0280 *-------------------------------------- .MA DEBUG :1 bit $C000 bpl :1 sta $C010 .EM *-------------------------------------- .MA DEBUGOA bit $C061 bpl :1 >DEBUG :1 .EQ * .EM *-------------------------------------- LDR.START jmp LDR.START8 jmp LDR.STARTATK jmp LDR.START8 *-------------------------------------- LDR.MSG.PRODOS .AT "PRODOS FX 0.95" 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" *-------------------------------------- LDR.START16 inc LDR.BootFlag set = 2 for GQuit rts LDR.STARTATK inc LDR.BootFlag set = 1 for appletalk rts LDR.START8 lda ZP.UNITNUM sta LDR.MLIOL.P+1 cld bit IO.RROMBNK2 sta IO.CLR80DISP sta IO.CLR80STORE jsr ROM.INIT jsr ROM.SETVID jsr ROM.SETKBD jsr ROM.HOME lda #32 ldx #39 .1 sta $400,x dex bpl .1 ldx #LDR.MSG.PRODOS jsr LDR.PrintX sec jsr ROM.IDROUTINE returns system info bcs .2 taken if not a //gs lda #$80 trb IO.GS.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 IO.SETALTZP stz auxsp lda auxsp bne LDR.UNSUPP.HW dec auxsp init aux sp to $FF lda auxsp beq LDR.UNSUPP.HW sta IO.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 ROM.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 ROM.ZIDBYTE //c ? bne .2 ldy IO.KBD //c, check for keypress cpy #$9B escape? (to disable accelerator) bne .11 sta IO.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 ROM.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 IO.GS.STATEREG to force off intcxrom ldx #PAKME.GP.ID ldy #GP lda /GP jsr X.Unpak.XatYA jsr LDR.LCBNK1 ldx #PAKME.XRW.ID ldy #XRW lda /XRW jsr X.Unpak.XatYAX ldx #0 .1 stz XDOS.FCBs,x stz XDOS.VCBs,x inx bne .1 ldx #PAKME.XDOS.ID ldy #XDOS lda /XDOS jsr X.Unpak.XatYAX ldx #XDOS.DATA.LEN .3 stz XDOS.DATA-1,x dex bne .3 ldx #PAKME.IRQ.ID ldy #IRQ lda /IRQ jsr X.Unpak.XatYAX LDR.IRQ lda IO.RROMWRAMBNK2 ldy irqv interrupt vector ldx irqv+1 x = high byte jsr LDR.LCBNK1 sta IO.SETALTZP sty irqv save irq vector in aux lc stx irqv+1 sta IO.CLRALTZP sty irqv stx irqv+1 save irq vector in main lc lda #XDOS.CallDisp sta GP.DISPATCH+1 P8 system death vector lda /XDOS.CallDisp sta GP.DISPATCH+2 .DO LOWERCASE=0 lda GP.KVER sta xdosver save current version for dir use .FIN lda idapple sta GP.MACHID lda LDR.cortland beq LDR.II branch if // family *-------------------------------------- LDR.IIGS sta XDOS.CortFlag lda #XDOS.CallDisp sta XDOS.CortDisp lda /XDOS.CallDisp sta XDOS.CortDisp+1 * lda IO.RROMWRAMBNK2 * stz ROM.MODE force setvid to reset cursor * jsr setvid reset output to screen * jsr LDR.LCBNK1 lda #'C' ldx #PAKME.CCLK.ID jsr LDR.SetupCLK .DO M.SEL * ldx #PAKME.SEL2.ID * ldy #$1000 * lda /$1000 * jsr X.Unpak.XatYAX ldx #PAKME.SEL2.ID jsr LDR.SetupSEL .FIN *-------------------------------------- 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 .DO M.SEL ldx #PAKME.SEL1.ID jsr LDR.SetupSEL .FIN jsr LDR.ClkDevScan *-------------------------------------- LDR.Common jsr LDR.BlkDevScan .DO M.RAM=1 jsr LDR.SetupRAM .FIN *-------------------------------------- lda LDR.MLIOL.P+1 Boot ZP.UNITNUM sta GP.DEVNUM ldx GP.DEVCNT .1 lda GP.DEVLST,x eor GP.DEVNUM and #$f0 beq .2 dex bpl .1 brk .2 lda GP.DEVLST,x pha .3 lda GP.DEVLST+1,x sta GP.DEVLST,x cpx GP.DEVCNT inx bcc .3 pla ldx GP.DEVCNT sta GP.DEVLST,x lda LDR.BootFlag get setup entry point flag beq LDR.SetPrefix taken if normal boot. bit IO.RROMBNK2 rts return to caller at setup entry point. *-------------------------------------- LDR.SetPrefix jsr MLI .DA #MLI.ONLINE .DA LDR.MLIOL.P bcs .9 lda LDR.PBuf+1 get volume name length. and #$0F strip SDDDxxxx beq .9 inc add 1 for leading '/' sta LDR.PBuf save prefix length. lda #'/' place leading '/' in prefix buffer sta LDR.PBuf+1 jsr MLI .DA #MLI.SETPREFIX .DA LDR.MLISETP.P bcs .9 jsr ROM.CROUT ldx #PAKME.ILDR.ID ldy #ILDR lda /ILDR jsr X.Unpak.XatYA jmp ILDR .9 ldx #LDR.MSG.PFXERR jsr LDR.PrintX bra * *-------------------------------------- LDR.SetupSEL bit IO.RRAMWRAMBNK2 read/write RAM bank 2 bit IO.RRAMWRAMBNK2 ldy #$D100 lda /$D100 jsr X.Unpak.XatYAX lda #$EE byte to distinguish LC bank 2 sta $D000 *-------------------------------------- LDR.LCBNK1 lda IO.RRAMWRAMBNK1 switch in LC bank 1 lda IO.RRAMWRAMBNK1 rts *-------------------------------------- DS121x.DATA1 .EQ idxl DS121x.DATA2 .EQ ZP.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.ID jmp LDR.SetupCLK .9 cld *-------------------------------------- NSC.IOBASE .EQ $C300 *-------------------------------------- LDR.ClkDevNCLK php sei lda IO.RDCXROM php sta IO.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 IO.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.ID 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.ID 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 IO.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.ID *-------------------------------------- LDR.SetupCLK sta LDR.MSG.CLK phx ldx #LDR.MSG.CLK jsr LDR.PrintX jsr LDR.LCBNK1 plx ldy #CLK lda /CLK jsr X.Unpak.XatYAX lda #$4C enable clock routine by putting a jmp sta GP.CLOCK in front of clock vector lda #MACHID.CLK tsb GP.MACHID LDR.SetupCLK.RTS rts *-------------------------------------- .DO M.RAM=1 LDR.SetupRAM lda GP.DEVCNT cmp #13 bcs LDR.SetupCLK.RTS jsr LDR.LCBNK1 ldx #PAKME.RAM.ID ldy #RAM lda /RAM jsr X.Unpak.XatYAX lda RAMX.PAK bne .1 sta IO.SETWRITEAUX ldx #PAKME.RAMX.ID ldy #RAMX lda /RAMX jsr X.Unpak.XatYA bra .7 .1 ldx #PAKME.RAMX.ID ldy #$0800 lda /$0800 jsr X.Unpak.XatYA sta IO.SETWRITEAUX ldx #$FE .2 lda $900,x sta RAMX+$100,x dex txa bne .2 .3 lda $800,x sta RAMX,x inx bne .3 .7 sta IO.CLRWRITEAUX lda #RAM put driver address into sta GP.DEVPTRS3D2 lda /RAM sta GP.DEVPTRS3D2+1 inc GP.DEVCNT count (-1) active devices ldx GP.DEVCNT lda #$BF unit num of /RAM sta GP.DEVLST,x ldx #LDR.MSG.RAM jmp LDR.PrintX .FIN *-------------------------------------- * find all disk devices in system slots and set up address * and device table in prodos global page. *-------------------------------------- LDR.BlkDevScan bit IO.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 sta LDR.driveradr lda /XRW 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 ZP.UNITNUM stz ZP.CMDNUM force a prodos status call stz ZP.BUFPTR dummy pointer lda #$10 sta ZP.BUFPTR+1 dummy pointer should be <> 0 stz ZP.BLKNUM # of bytes to transfer stz ZP.BLKNUM+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 GP.DEVCNT inx put device # into device list. sta GP.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 GP.DEVLST,x active device list. .1 stx GP.DEVCNT save updated device count. asl shift # of drives back into carry. lda LDR.driveradr get high address of device driver. sta GP.DEVPTRS,y device driver table 1. bcc .2 branch if single drive. sta GP.DEVPTRS+16,y device driver table 2. .2 lda LDR.driveradr+1 sta GP.DEVPTRS+1,y bcc .3 sta GP.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 GP.DEVPTRS,y device driver table 1 cmp #XDOS.NoDevice bne .10 lda GP.DEVPTRS+1,y cmp /XDOS.NoDevice bne .10 Drive 1 & 2 free jsr LDR.AddY2DEVLST Y = index in GP.DEVPTRS jsr .8 tya and #$F tay .4 jsr LDR.AddY2DEVLST Y = index in GP.DEVPTRS .8 phy ldy #$ff lda (idxl),y BLK entry point ply sta GP.DEVPTRS,y lda idxl+1 sta GP.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 IO.RROMBNK2 write protect lc ram. jsr LDR.AddY2DEVLST lda #XDOS.SPREMAP sta GP.DEVPTRS,y lda /XDOS.SPREMAP sta GP.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 IO.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 GP.SLTBYT 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 GP.DEVPTRS,y device driver table 1 cmp #XDOS.NoDevice bne .2 lda GP.DEVPTRS+1,y cmp /XDOS.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 GP.DEVCNT ldx GP.DEVCNT tya asl convert to DSSS0000 asl asl ora devid include device attributes sta GP.DEVLST,x in the active device list. rts *-------------------------------------- LDR.Scr80Init phx Save LDR.MSG jsr LDR.IsIIc bcs LDR.Scr80Init2 php sei sta IO.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 IO.CLRC3ROM .3 plp *-------------------------------------- LDR.Scr80Init2 lda #$8C Reset 80 col screen ($0C:HOME) jsr $C300 jsr ROM.SETNORM jsr ROM.HOME jsr ROM.SETINV .DO LOGO=1 lda #20 sta ZP.CV inc sta ZP.WNDTOP jsr ROM.TABV lda #LOGO.PAKED sta ZPInBufPtr lda /LOGO.PAKED sta ZPInBufPtr+1 stz ZPOutBufPtr lda #$A0 sta ZPOutBufPtr+1 jsr X.Unpak sta IO.CLRHIRES sta IO.SETMIXED bit IO.RDIOUDIS sta IO.SETIOUDIS sta IO.SETDHIRES bmi .10 sta IO.CLRIOUDIS .10 sta IO.CLRTEXT stz ZPPtr1 lda #$A0 sta ZPPtr1+1 lda #0 .1 pha jsr ROM.GBSCALC ldy #0 .2 lda (ZPPtr1),y pha and #$f tax lda PALETTE.AUX,x sta IO.SETPAGE2 sta (ZP.GBASL),y pla lsr lsr lsr lsr tax lda PALETTE.MAIN,x sta IO.CLRPAGE2 sta (ZP.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 IO.SETPAGE2 ora (ZP.GBASL),y sta (ZP.GBASL),y pla lsr lsr lsr lsr tax lda PALETTE.MAIN,x asl asl asl asl sta IO.CLRPAGE2 ora (ZP.GBASL),y sta (ZP.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 ROM.CLREOL jsr ROM.SETNORM ldx #LDR.MSG.PRODOS jsr LDR.PrintX plx get back LDR.MSG.machine type *-------------------------------------- LDR.PrintX bit IO.RROMBNK2 lda ZP.INVFLG pha jsr ROM.SETINV .1 lda $2000,x pha ora #$80 jsr ROM.COUT inx pla bpl .1 lda #$A0 jsr ROM.COUT pla sta ZP.INVFLG sta IO.CLRPAGE2 for screen holes proper access rts *-------------------------------------- LDR.IsIIc lda GP.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 ROM.BREAKV .DA ROM.OLDRST .DA #$5A powerup byte jmp ROM.OLDRST '&' vector jmp ROM.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 LDR.PBuf+1 LDR.MLISETP.P .DA #1 .DA LDR.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/pdos8m.s ASM