
PROGRAM LISTING: 89-07/MAKEBOOT.M65
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