0100 ; MAKEBOOT (FOR OS/A+) 0110 ; BY BOB MARTIN 0120 ; (c)1989, ANTIC PUBLISHING INC. 0130 ; MAKE BOOT DISK FROM DOS FILE 0140 ; 0150 MEMTOP = $6A 0160 MEMLO = $02E7 0170 HATABS = $031A 0180 CH = $02FC 0190 CR = $00 0200 BUF1 = $0500 0210 BUF2 = $0600 0220 ; 0230 INBUFF = $F3 0240 CIX = $F2 0250 LBUFF = $0580 0260 FR0 = $D4 0270 FR1 = $E0 0280 ICBAL = $0344 0290 ICBLL = $0348 0300 ICAX1 = $034A 0310 ICAX2 = $034B 0320 CIOV = $E456 0330 ICCOM = $0342 0340 AFP = $D800 0350 FASC = $D8E6 0360 IFP = $D9AA 0370 FPI = $D9D2 0380 ; 0390 ; LOOK FOR AN EMPTY SPOT IN 0400 ; THE HANDLER ADDRESS TABLE 0410 ; 0420 *= $7000 0430 ; 0440 INSERT 0450 LDX #0 0460 NEXTPLACE 0470 LDA HATABS,X 0480 BEQ ESPOT 0490 INX 0500 INX 0510 INX 0520 BNE NEXTPLACE 0530 BEQ INSERT 0540 ; 0550 ; FOUND AN EMPTY SPOT 0560 ; 0570 ESPOT 0580 LDA #$42 0590 STA HATABS,X 0600 LDA #BTAB&$FF 0610 STA HATABS+1,X 0620 LDA #BTAB/$0100 0630 STA HATABS+2,X 0640 ; 0650 ; FIND THE E: HANDLER 0660 ; 0670 EFIND 0680 LDX #0 0690 ELOOP 0700 LDA HATABS,X 0710 CMP #'E 0720 BEQ EFND 0730 INX 0740 INX 0750 INX 0760 BNE ELOOP 0770 BEQ EFIND 0780 ; 0790 ; FOUND THE E: POINTER 0800 ; 0810 EFND 0820 LDA HATABS+1,X 0830 STA $D0 0840 LDA HATABS+2,X 0850 STA $D1 0860 LDY #4 0870 LDA ($D0),Y 0880 STA EGET+1 0890 INY 0900 LDA ($D0),Y 0910 STA EGET+2 0920 INY 0930 LDA ($D0),Y 0940 STA EPUT+1 0950 INY 0960 LDA ($D0),Y 0970 STA EPUT+2 0980 ; 0990 INC EGET+1 1000 BNE L013 1010 INC EGET+2 1020 L013 1030 INC EPUT+1 1040 BNE L012 1050 INC EPUT+2 1060 ; ----------------------------- 4000 ; OS/A+ VERSION 4010 ; 4020 L012 4030 ; 4040 ; SET THE LOMEM POINTER 4050 ; 4060 LMP 4070 LDA #LAST&$FF 4080 STA MEMLO 4090 LDA #LAST/$0100 4100 STA MEMLO+1 4110 ; 4120 LDA #IMSG&$FF 4130 LDY #IMSG/$0100 4140 JSR PRINTE 4150 ; 4160 CU20 RTS 4170 ; 4180 IMSG 4190 .BYTE CR,CR,"The device" 4200 .BYTE " Bn: is now" 4210 .BYTE " ready.",CR 4220 .BYTE "Use the copy command" 4230 .BYTE " to access.",CR 4240 .BYTE " (eg. COPY D:FILE," 4250 .BYTE "B2: ",')+128 4260 ; 4270 *= $2100 4990 ; ----------------------------- 5000 ; 5005 ; HANDLER AND HANDLER TABLE 5010 ; FOR "B:" (MAKEBOOT) 5015 ; HANDLER 5020 ; 5025 ;HANDLER TABLE 5030 ; 5035 BTAB 5040 .WORD BOPEN-1 5045 .WORD BCLOSE-1 5050 .WORD NOFNT-1 5055 .WORD BPUT-1 5060 .WORD STATUS-1 5065 JMP NOFNT 5070 ; 5075 ;HANDLER VARIABLES 5080 ; 5085 HEADER .BYTE $06 5090 HOLDA .BYTE $00 5095 HOLDX .BYTE $00 5100 STATS .BYTE $00 5105 SECNO .WORD $01 5110 BYTNO .BYTE $00 5115 MAXSEC .WORD $00 5120 INFOBY .BYTE $00 5125 MFLAG .BYTE $00 5130 RUNADR .WORD $00 ;INTADR must 5135 INTADR .WORD $00 ;follow RUNADR 5140 LOADAD .WORD $00 5145 CURMEM .WORD $00 ;LASTAD must 5150 LASTAD .WORD $00 ;follow CURMEM 5155 ; 5160 ;HANDLER OPEN FUNCTION 5165 ; 5170 BOPEN 5175 LDA #$00 ;clear variables 5180 STA BYTNO 5185 STA SECNO+1 5190 STA MAXSEC 5195 STA MAXSEC+1 5200 STA MFLAG 5205 STA RUNADR 5210 STA RUNADR+1 5215 STA INTADR 5220 STA INTADR+1 5225 LDA #$01 5230 STA SECNO 5235 STA STATS 5240 LDA #$06 5245 STA HEADER 5250 JSR CLEAR 5255 CLC 5260 LDA $21 ;disk # 5265 ADC #$30 ;make ASCII # 5270 STA MSG2A 5275 LDA #MSG2&$FF 5280 LDY #MSG2/$0100 5285 JSR PRINTE 5290 JSR YESNO ;Y/N? 5295 BNE L014 5300 LDA #$80 ;abort with 5305 STA STATS ;error = 128 5310 JMP EXIT 5315 L014 5320 LDA #MSG1&$FF ;clear secs? 5325 LDY #MSG1/$0100 5330 JSR PRINTE 5335 JSR GETNUM 5340 BCS L014 ;error? 5345 LDA FR0 5350 STA BUF2 5355 LDA FR0+1 5360 STA BUF2+1 5365 ORA BUF2 5370 BEQ BOP04 5375 BOP01 5380 JSR PUTSEC ;fill sectors 5385 INC SECNO ;with zeros 5390 BNE BOP02 5395 INC SECNO+1 5400 BOP02 5405 LDA BUF2 5410 BNE BOP03 5415 DEC BUF2+1 5420 BOP03 5425 DEC BUF2 5430 BIT BUF2+1 5435 BPL BOP01 5440 BOP04 5445 LDA #0 5450 STA SECNO+1 5455 STA MAXSEC 5460 STA MAXSEC+1 5465 LDA #1 5470 STA SECNO 5475 ; 5480 JMP EXIT 5485 ; 5490 ;HANDLER SUBROUTINES 5495 ; 5500 ; 1) Store load address and 5505 ; end of load address 5510 ; 5515 LODADR 5520 PHA ;calc index & 5525 TYA ;store load 5530 SEC ;address & 5535 SBC #3 ;end of load 5540 EOR #$FF 5545 TAY 5550 INY 5555 PLA 5560 STA CURMEM,Y 5565 RTS 5570 ; 5575 ; 2) Get two 2-byte 5580 ; load addresses 5585 ; 5590 LDINFO 5595 LDA INFOBY 5600 BNE L007 5605 LDA #4 5610 STA INFOBY 5615 L007 5620 DEC INFOBY 5625 LDY INFOBY 5630 LDA HOLDA 5635 JSR LODADR 5640 LDY INFOBY 5645 BEQ LD03 5650 CPY #2 5655 BNE LD02 5660 ; 5665 LDA CURMEM ;check for 5670 CMP CURMEM+1 ;appended file 5675 BNE LD02 5680 CMP #$FF 5685 BNE LD02 5690 LDA #4 5695 STA INFOBY 5700 LD02 5705 JMP EXIT 5710 LD03 5715 JSR INRUAD 5720 BEQ LD02 5725 BNE L008 5730 ; 5735 ; 3) Check for load file run 5740 ; or init. address 5745 ; If CURMEM & LASTAD 5750 ; are <$2E0 or >$2E3 5755 ; THEN Z=0 5760 ; ELSE Z=1 5765 ; 5770 INRUAD 5775 LDA CURMEM+1 5780 CMP LASTAD+1 5785 BNE IRA01 5790 IRA02 5795 CMP #2 5800 BNE IRA01 5805 LDA #$DF 5810 CMP CURMEM 5815 BCS IRA02 5820 CMP LASTAD 5825 BCS IRA02 5830 LDA #$E3 5835 CMP CURMEM 5840 BCC IRA02 5845 CMP LASTAD 5850 BCC IRA02 5855 LDA #0 5860 IRA01 5865 RTS 5870 ; 5875 ; 4) Check for load address 5880 ; less than initial 5885 ; 5890 L008 5895 LDA LOADAD+1 5900 CMP CURMEM+1 5905 BCC LF01 5910 BNE LF02 5915 LDA LOADAD 5920 CMP CURMEM 5925 BEQ LF01 5930 BCC LF01 5935 LF02 5940 LDA #MSG6&$FF ;LOADAD>CURMEM 5945 LDY #MSG6/$0100 5950 JSR PRINTE 5955 LDY #168 5960 STY STATS 5965 JMP EXIT 5970 ; 5975 ; 5) Calculate sector and byte 5980 ; for new load address 5985 ; 5990 LF01 5995 SEC ;Find offset 6000 LDA CURMEM 6005 SBC LOADAD 6010 STA BUF2 6015 LDA CURMEM+1 6020 SBC LOADAD+1 6025 STA BUF2+1 6030 LDA BUF2 ;calc byte 6035 AND #$7F 6040 STA BYTNO 6045 LDX #7 6050 L009 6055 CLC ;calc sector 6060 ROR BUF2+1 ;divide by 128 6065 ROR BUF2 6070 DEX 6075 BNE L009 6080 INC BUF2 6085 BNE LF11 6090 INC BUF2+1 6095 LF11 6100 LDA BUF2 ;Load sec if dif 6105 CMP SECNO 6110 BNE LDI1 6115 LDA BUF2+1 6120 CMP SECNO+1 6125 BEQ LDI2 6130 LDI1 6135 LDA BUF2 6140 STA SECNO 6145 LDA BUF2+1 6150 STA SECNO+1 6155 JMP GETSEC 6160 LDI2 6165 JMP EXIT 6170 ; 6175 ; 6) Save run and init. address 6180 ; 6185 STIRAD 6190 JSR INRUAD 6195 BNE IR01 6200 JSR CMPMEM 6205 BCC IR01 6210 LDA CURMEM 6215 AND #$0F 6220 TAY 6225 LDA HOLDA 6230 STA RUNADR,Y 6235 INC CURMEM 6240 JMP EXIT 6245 IR01 6250 JMP L005 6255 ; 6260 ; 7) Process header information 6265 ; for start of load file 6270 ; 6275 FSTSIX 6280 CPY #$04 6285 BEQ FSS1 6290 JMP FS01 6295 ; 6300 FSS1 6305 LDA #FM1&$FF ; specify 6310 LDY #FM1/$0100 ;load 6315 JSR PRINTE ; information 6320 JSR YESNO 6325 BNE FS02 6330 JMP FS01 6335 ; 6340 FS02 6345 LDA #FM2&$FF ; get sector 6350 LDY #FM2/$0100 ; count 6355 JSR PRINTE 6360 JSR GETNUM 6365 BCS FS02 6370 LDA FR0 6375 BEQ FS03 6380 STA BUF1+1 6385 ; 6390 FS03 6395 LDA #FM3&$FF ; get load 6400 LDY #FM3/$0100 ;address 6405 JSR PRINTE 6410 JSR GETNUM 6415 BCS FS03 6420 LDA FR0 6425 ORA FR0+1 6430 BEQ FS03 6435 LDA FR0 6440 STA BUF1+2 6445 STA LOADAD 6450 LDA FR0+1 6455 STA BUF1+3 6460 STA LOADAD+1 6465 ; 6470 FS04 6475 LDA #FI4&$FF ; get init 6480 LDY #FI4/$0100 ;address 6485 JSR PRINTE 6490 JSR GETNUM 6495 BCS FS04 6500 LDA FR0 6505 ORA FR0+1 6510 BEQ FS05 6515 LDA FR0 6520 STA BUF1+4 6525 LDA FR0+1 6530 STA BUF1+5 6535 ; 6540 FS05 6545 LDA #FM4&$FF ; get run 6550 LDY #FM4/$0100 ;address 6555 JSR PRINTE 6560 JSR GETNUM 6565 BCS FS05 6570 LDA FR0 6575 ORA FR0+1 6580 BEQ FS06 6585 LDA #$4C 6590 STA BUF1+6 6595 LDA FR0 6600 STA BUF1+7 6605 LDA FR0+1 6610 STA BUF1+8 6615 ; 6620 FS06 6625 LDA #0 6630 STA HEADER 6635 JSR PUTSEC 6640 JMP LDINFO 6645 ; 6650 FS01 6655 LDA HOLDA ; get load 6660 STA LOADAD+1 ; address 6665 LDA CURMEM ; from file 6670 STA LOADAD 6675 LDA HOLDA 6680 DEC HEADER 6685 LDY HEADER 6690 CPY #4 ;Y<4 6695 BCS FS07 ;no 6700 JSR LODADR 6705 JMP EXIT 6710 FS07 6715 CMP #$FF ;load file? 6720 BEQ EXIT 6725 LDA #MSG5&$FF 6730 LDY #MSG5/$0100 6735 JSR PRINTE 6740 LDY #168 ;error if not 6745 STY STATS ;load file 6750 ; 6755 ;GET STATUS AND EXIT HANDLER 6760 ; 6765 STATUS 6770 EXIT 6775 LDY STATS 6780 TYA ;Error in Y 6785 NOFNT RTS 6790 ; 6795 ; 8) Clear output buffer 6800 ; 6805 CLEAR 6810 LDX #$7F 6815 LDA #$00 6820 CLR1 6825 STA BUF1,X 6830 DEX 6835 BPL CLR1 6840 RTS 6845 ; 6850 ; 9) Check for end of load 6855 ; C=0 CURMEM > LASTAD 6860 ; C=1 CURMEM <= LASTAD 6865 ; 6870 CMPMEM 6875 LDA LASTAD+1 6880 CMP CURMEM+1 6885 BCC L003 6890 BNE L003 6895 LDA LASTAD 6900 CMP CURMEM 6905 L003 RTS 6910 ; 6915 ;HANDLER PUT BYTE FUNCTION 6920 ; 6925 BPUT 6930 STA HOLDA ;save byte 6935 LDY HEADER ;from CIO 6940 BEQ BP02 6945 JMP FSTSIX 6950 BP02 6955 LDA INFOBY 6960 BNE INF11 6965 JSR CMPMEM ;end of load? 6970 BCS BP01 ;no 6975 INF11 6980 JMP LDINFO 6985 BP01 6990 JMP STIRAD ;run or init? 6995 L005 7000 LDX BYTNO 7005 LDA HOLDA 7010 STA BUF1,X ;save in output 7015 INC CURMEM ;buffer 7020 BNE L004 7025 INC CURMEM+1 7030 L004 7035 INC BYTNO ;end of sector 7040 BPL L006 ;yes 7045 JSR PUTSEC ;save sector 7050 INC SECNO 7055 BNE LP04 7060 INC SECNO+1 7065 LP04 7070 JSR GETSEC 7075 LDA #0 7080 STA BYTNO 7085 BEQ EXIT 7090 ; 7095 L006 7100 JSR CMPMEM 7105 BCS EXIT 7110 JMP PUTSEC 7115 ; 7120 ;HANDLER CLOSE FUNCTION 7125 ; 7130 BCLOSE 7135 BIT STATS 7140 BPL BCL01 7145 JMP EXIT 7150 BCL01 7155 JSR PUTSEC 7160 ; 7165 LDA #1 7170 STA SECNO 7175 LDA #0 7180 STA SECNO+1 7185 JSR GETSEC 7190 ; 7195 LDA #MSG4&$FF ; sector 7200 LDY #MSG4/$0100 ; count 7205 JSR PRINTE 7210 LDA MAXSEC 7215 STA FR0 7220 LDA MAXSEC+1 7225 STA FR0+1 7230 JSR PNUM 7235 JSR BCLSUB 7240 BEQ BCL03 7245 LDA MAXSEC 7250 STA BUF1+1 7255 ; 7260 BCL03 7265 LDA INTADR ; init. 7270 ORA INTADR+1 ; address 7275 BEQ BCL04 7280 LDA #FM5&$FF 7285 LDY #FM5/$0100 7290 JSR PRINTE 7295 LDA INTADR 7300 STA FR0 7305 LDA INTADR+1 7310 STA FR0+1 7315 JSR PNUM 7320 JSR BCLSUB 7325 BEQ BCL04 7330 LDA INTADR 7335 STA BUF1+4 7340 LDA INTADR+1 7345 STA BUF1+5 7350 ; 7355 BCL04 7360 LDA RUNADR ; run 7365 ORA RUNADR+1 ; address 7370 BEQ BCL05 7375 LDA #FM6&$FF 7380 LDY #FM6/$0100 7385 JSR PRINTE 7390 LDA RUNADR 7395 STA FR0 7400 LDA RUNADR+1 7405 STA FR0+1 7410 JSR PNUM 7415 JSR BCLSUB 7420 BEQ BCL05 7425 LDA #$4C 7430 STA BUF1+6 7435 LDA RUNADR 7440 STA BUF1+7 7445 LDA RUNADR+1 7450 STA BUF1+8 7455 ; 7460 BCL05 7465 JMP PUTSEC 7470 ; 7475 BCLSUB 7480 LDA #FM7&$FF 7485 LDY #FM7/$0100 7490 JSR PRINTE 7495 JMP YESNO ;Y/N? 7500 ; 7505 ;I/O SUBROUTINES 7510 ; 7515 ; 1) Read and write to disk 7520 ; 7525 GETSEC 7530 LDY #$52 7535 LDA #$40 7540 BNE DISKIO 7545 PUTSEC 7550 LDA MAXSEC+1 ; Check for 7555 BEQ L010 ; too many 7560 LDA MFLAG ; load sectors 7565 BNE L010 7570 LDA #MSG3&$FF 7575 LDY #MSG3/$0100 7580 JSR PRINTE 7585 INC MFLAG 7590 L010 7595 LDA MAXSEC+1 7600 CMP SECNO+1 7605 BCC PU02 7610 BNE PU01 7615 LDA SECNO 7620 CMP MAXSEC 7625 BCC PU01 7630 PU02 7635 LDA SECNO 7640 STA MAXSEC 7645 LDA SECNO+1 7650 STA MAXSEC+1 7655 PU01 7660 LDY #$57 ; Use #$50 7665 LDA #$80 ; for no-verify 7670 DISKIO 7675 STY $0302 7680 STA $0303 7685 LDA #$31 7690 STA $0300 7695 LDA $21 7700 STA $0301 7705 LDA #$80 7710 STA $0308 7715 LDA #$0F 7720 STA $0306 7725 LDA #BUF1&$FF 7730 STA $0304 7735 LDA #0 7740 STA $0309 7745 LDA #BUF1/$0100 7750 STA $0305 7755 LDA SECNO 7760 STA $030A 7765 LDA SECNO+1 7770 STA $030B 7775 JSR $E459 7780 BMI ERROR 7785 RTS 7790 ERROR 7795 LDA $0303 7800 STA STATS 7805 TAY 7810 RTS 7815 ; 7820 ; 2) Y/N - Result in accumulator 7825 ; Y = 1 7830 ; N = 0 7835 ; 7840 YESNO 7845 LDA #$FF 7850 STA CH 7855 YN1 7860 LDA CH ;Get 1 character 7865 CMP #43 ;Y? 7870 BNE YN2 7875 LDA #1 7880 BNE YN4 7885 YN2 7890 CMP #35 ;N? 7895 BNE YN1 7900 LDA #0 7905 YN4 7910 PHA 7915 LDA #$FF 7920 STA CH 7925 PLA 7930 RTS 7935 ; 7940 ; 3) Print the integer in FR0 7945 ; 7950 PNUM 7955 JSR IFP 7960 JSR FASC 7965 LDA INBUFF 7970 LDY INBUFF+1 7975 JMP PRINTE 7980 ; 7985 ; 4) Get a number 7990 ; result in FR0 7995 ; 8000 GETNUM 8005 LDA #$30 8010 STA LBUFF 8015 LDX #1 8020 STX HOLDX 8025 NOTCR 8030 JSR EGET ;Get a number 8035 LDX HOLDX 8040 INC HOLDX 8045 STA LBUFF,X ;Store it at 8050 CMP #$9B ;$580 8055 BNE NOTCR 8060 LDA #LBUFF&$FF ;Point to 8065 STA INBUFF ; ASCII string 8070 LDA #LBUFF/$0100 8075 STA INBUFF+1 8080 LDA #0 8085 STA CIX 8090 JSR AFP ;ASCII to FP 8095 BCS GN01 ;error if C set 8100 JSR FPI ;FP to integer 8105 GN01 RTS 8110 ; 8115 ; 5) Print text to screen 8120 ; Low byte of text in 8125 ; accumulator, High byte 8130 ; of text in Y register 8135 ; 8140 PRINTE 8145 STA MSGN+1 8150 STY MSGN+2 8155 JMP MSGN 8160 EP02 8165 INC MSGN+1 8170 BNE MSGN 8175 INC MSGN+2 8180 MSGN 8185 LDA MSGN 8190 BEQ EP04 8195 BMI EP05 8200 JSR EPUT 8205 JMP EP02 8210 EP04 8215 JSR PNTCR 8220 JMP EP02 8225 ; 8230 EP05 8235 AND #$7F 8240 BEQ EP06 8245 JSR EPUT 8250 ; 8255 PNTCR 8260 LDA #$9B 8265 JSR EPUT 8270 EP06 RTS 8275 ; 8280 ;JUMP TO SCREEN EDITOR 8285 ; PUT BYTE ROUTINE 8290 ; 8295 EPUT JMP EPUT 8300 ; 8305 ;JUMP TO SCREEN EDITOR 8310 ; GET BYTE ROUTINE 8315 ; 8320 EGET JMP EGET 8325 ; 8330 ; 8335 FM1 .BYTE CR,"Do you wish to " 8340 .BYTE "specify the boot",CR 8345 .BYTE " sector information " 8350 .BYTE "(Y/N)",'?+128 8355 ; 8360 FM2 .BYTE CR,"Enter boot sector" 8365 .BYTE " count ",128 8370 ; 8375 FM3 .BYTE CR,"Enter load " 8380 .BYTE "address ",128 8385 ; 8390 FM4 .BYTE CR,"Enter run " 8395 .BYTE "address ",128 8400 ; 8405 FI4 .BYTE CR,"Enter " 8410 .BYTE "initialization " 8415 .BYTE "address ",128 8420 ; 8425 FM5 .BYTE CR,"Load file " 8430 .BYTE "initiation address " 8435 .BYTE "= ",128 8440 ; 8445 FM6 .BYTE CR,"Load file " 8450 .BYTE "run address " 8455 .BYTE "= ",128 8460 ; 8465 FM7 .BYTE CR,"Insert into " 8470 .BYTE "boot sector (Y/N)" 8475 .BYTE '?+128 8480 ; 8485 MSG1 .BYTE CR,"How many sectors" 8490 .BYTE " to clear",'?+128 8495 ; 8500 MSG2 .BYTE CR,"Make disk #" 8505 ; 8510 MSG2A .BYTE $31," into boot" 8515 .BYTE " disk (Y/N)",'?+128 8520 ; 8525 MSG3 .BYTE CR,"Sector count" 8530 .BYTE " exceeds 25",'5+128 8535 ; 8540 MSG4 .BYTE CR,"The boot sector" 8545 .BYTE " count is ",128 8550 ; 8555 MSG5 .BYTE CR,"Not a load" 8560 .BYTE " fil",'e+128 8565 ; 8570 MSG6 .BYTE CR,"Specified load" 8575 .BYTE " address is",CR 8580 .BYTE " is not lowest" 8585 .BYTE " addres of fil" 8590 .BYTE 'e+128 8595 ; 8600 LAST .END
Back to previous page